Skip to content

Commit

Permalink
feat: rework bootstrapping to fix #90
Browse files Browse the repository at this point in the history
  • Loading branch information
janosmiko committed Jan 9, 2025
1 parent 3e62348 commit e439492
Show file tree
Hide file tree
Showing 10 changed files with 809 additions and 700 deletions.
2 changes: 1 addition & 1 deletion cmd/bootstrap/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func NewBootstrapCmd(conf *config.Config) *cmdpkg.Command {

// --magento-version
cmd.Flags().String(
"magento-version", version.Must(conf.MagentoVersion()).String(), "magento version",
"magento-version", conf.MagentoVersionFromConfig().String(), "magento version",
)
_ = cmd.Config.BindPFlag(fmt.Sprintf("%s_magento_version", conf.AppName()),
cmd.Flags().Lookup("magento-version"))
Expand Down
8 changes: 0 additions & 8 deletions cmd/sync/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,6 @@ func NewCmdSync(conf *config.Config) *cmdpkg.Command {
PreRun: func(syncCheckCmd *cobra.Command, args []string) {},
Args: cobra.ExactArgs(0),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
// TODO; Check if this is needed
// err := reward.SyncCheck()
// if err != nil {
// return err
// }
//
// reward.SetSyncSettings()

return nil
},
Run: func(cmd *cobra.Command, args []string) {
Expand Down
141 changes: 72 additions & 69 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"os"
"path"
"path/filepath"
"regexp"
"runtime"
"strings"

Expand All @@ -28,11 +27,6 @@ import (
"github.com/rewardenv/reward/pkg/util"
)

const (
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
SemverRegexp = `^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$`
)

var (
// ErrEnvNameIsInvalid occurs when the environment name is invalid. It should be a valid hostname.
ErrEnvNameIsInvalid = errors.New("environment name is invalid, it should match RFC1178")
Expand All @@ -55,6 +49,9 @@ var (

// ErrUnknownEnvType occurs when an unknown environment type is specified.
ErrUnknownEnvType = errors.New("unknown env type")

ErrMagentoVersionIsNotSemver = errors.New("version string is not semver")
ErrMagentoVersionIsInvalid = errors.New("version string is invalid")
)

// FS is the implementation of Afero Filesystem. It's a filesystem wrapper and used for testing.
Expand Down Expand Up @@ -872,93 +869,99 @@ func (c *Config) ShopwareMode() string {
return c.GetString(fmt.Sprintf("%s_shopware_mode", c.AppName()))
}

// MagentoVersion returns a *version.Version object which contains the Magento version.
func (c *Config) MagentoVersion() (*version.Version, error) {
log.Debugln("Looking up Magento version...")

magentoVersion := new(version.Version)

type ComposerJSON struct {
func (c *Config) MagentoVersionFromComposerJSON() (*version.Version, error) {
var composerJSON struct {
Name string `json:"name"`
Version string `json:"version"`
Require map[string]string `json:"require"`
}

var composerJSON ComposerJSON
data, err := FS.ReadFile("composer.json")
if err != nil {
log.Debugln("...cannot read composer.json. Using .env settings.")

if util.FileExists("composer.json") {
data, err := FS.ReadFile("composer.json")
if err != nil {
log.Debugln("...cannot read composer.json. Using .env settings.")
return c.MagentoVersionFromConfig(), nil
}

magentoVersion = c.MagentoVersionFromConfig()
}
if err := json.Unmarshal(data, &composerJSON); err != nil {
log.Debugln("...cannot unmarshal composer.json. Using .env settings.")

return c.MagentoVersionFromConfig(), nil
}

if err := json.Unmarshal(data, &composerJSON); err != nil {
log.Debugln("...cannot unmarshal composer.json. Using .env settings.")
// Search for old format of Magento package name.
if util.CheckRegexInString(`^magento/magento2(ce|ee)$`, composerJSON.Name) &&
composerJSON.Version != "" {
log.Debugf(
"...using magento/magento2(ce|ee) package version from composer.json. Found version: %s.",
composerJSON.Version,
)

magentoVersion = c.MagentoVersionFromConfig()
magentoVersion, err := version.NewVersion(composerJSON.Version)
if err != nil {
return nil, ErrMagentoVersionIsNotSemver
}

if util.CheckRegexInString(
`^magento/magento2(ce|ee)$`,
composerJSON.Name,
) && composerJSON.Version != "" {
re := regexp.MustCompile(SemverRegexp)
ver := re.Find([]byte(composerJSON.Version))
return magentoVersion, nil
}

// Search for new format of Magento package name.
for key, val := range composerJSON.Require {
if util.CheckRegexInString(`^magento/product-(enterprise|community)-edition$`, key) {
log.Debugf(
"...using magento/product-(enterprise-community)-edition "+
"package version from composer.json. Found version: %s.",
val,
)

magentoVersion, err := version.NewVersion(val)
if err != nil {
return nil, ErrMagentoVersionIsNotSemver
}

return magentoVersion, nil
}

if util.CheckRegexInString(`^magento/magento-cloud-metapackage$`, key) {
log.Debugf(
"...using magento/magento2(ce|ee) package version from composer.json. Found version: %s.",
ver,
"...using magento/magento-cloud-metapackage package version from composer.json. Found version: %s.",
val,
)

magentoVersion, err = version.NewVersion(string(ver))
magentoVersion, err := version.NewVersion(val)
if err != nil {
return nil, errors.Wrap(err, "cannot parse Magento version from composer.json")
return nil, ErrMagentoVersionIsNotSemver
}

return magentoVersion, nil
}
}

if magentoVersion.String() == "" {
for key, val := range composerJSON.Require {
if util.CheckRegexInString(`^magento/product-(enterprise|community)-edition$`, key) {
re := regexp.MustCompile(SemverRegexp)
ver := re.Find([]byte(val))

log.Debugf(
"...using magento/product-(enterprise-community)-edition "+
"package version from composer.json. Found version: %s.",
ver,
)

magentoVersion, err = version.NewVersion(string(ver))
if err != nil {
return nil, errors.Wrap(
err, "cannot parse Magento version from composer.json",
)
}
} else if util.CheckRegexInString(`^magento/magento-cloud-metapackage$`, key) {
re := regexp.MustCompile(SemverRegexp)
ver := re.Find([]byte(val))

log.Debugf(
"...using magento/magento-cloud-metapackage package version from composer.json. Found version: %s.",
ver,
)

magentoVersion, err = version.NewVersion(string(ver))
if err != nil {
return nil, errors.Wrap(
err, "cannot parse Magento version from composer.json",
)
}
}
return nil, ErrMagentoVersionIsInvalid
}

// MagentoVersion returns a *version.Version object which contains the Magento version.
func (c *Config) MagentoVersion() (*version.Version, error) {
log.Debugln("Looking up Magento version...")

if util.FileExists("composer.json") {
magentoVersion, err := c.MagentoVersionFromComposerJSON()
if err != nil {
if errors.Is(err, ErrMagentoVersionIsNotSemver) {
log.Debugln("Cannot parse exact Magento version from composer.json.")

return version.Must(version.NewVersion("0.0.0+undefined")), nil
}

return nil, errors.Wrap(err, "getting Magento version from composer.json")
}

log.Debugf("...found Magento version in composer.json. Version: %s.", magentoVersion.String())

return magentoVersion, nil
}

magentoVersion = c.MagentoVersionFromConfig()
magentoVersion := c.MagentoVersionFromConfig()

log.Debugf(
"...cannot find Magento version in composer.json, using .env settings. Version: %s.",
Expand Down Expand Up @@ -1209,7 +1212,7 @@ func (c *Config) ElasticsearchVersion() *version.Version {
return version.Must(version.NewVersion(c.GetString("elasticsearch_version")))
}

return version.Must(version.NewVersion("0.0"))
return version.Must(version.NewVersion("0.0.0+undefined"))
}

// ServiceEnabled returns true if service is enabled in Config settings.
Expand Down
Loading

0 comments on commit e439492

Please sign in to comment.