diff --git a/pkg/compiler/compiler.go b/pkg/compiler/compiler.go index 6952a540..174ef88c 100644 --- a/pkg/compiler/compiler.go +++ b/pkg/compiler/compiler.go @@ -354,7 +354,6 @@ func (cs *LuetCompiler) ComputeDepTree(p CompilationSpec) (solver.PackagesAssert for _, assertion := range dependencies { //highly dependent on the order if assertion.Value { - nthsolution, err := s.Install([]pkg.Package{assertion.Package}) if err != nil { return nil, errors.Wrap(err, "While computing a solution for "+p.GetPackage().GetName()) diff --git a/pkg/package/database_mem.go b/pkg/package/database_mem.go index ff89f2dc..b8ba2bd4 100644 --- a/pkg/package/database_mem.go +++ b/pkg/package/database_mem.go @@ -94,7 +94,13 @@ func (db *InMemoryDatabase) GetPackage(ID string) (Package, error) { p := &DefaultPackage{} - if err := json.Unmarshal(enc, &p); err != nil { + rawIn := json.RawMessage(enc) + bytes, err := rawIn.MarshalJSON() + if err != nil { + return &DefaultPackage{}, err + } + + if err := json.Unmarshal(bytes, &p); err != nil { return nil, err } return p, nil @@ -120,7 +126,7 @@ func (db *InMemoryDatabase) CreatePackage(p Package) (string, error) { return "", errors.New("InMemoryDatabase suports only DefaultPackage") } - res, err := json.Marshal(pd) + res, err := pd.JSON() if err != nil { return "", err } @@ -138,7 +144,7 @@ func (db *InMemoryDatabase) encodePackage(p Package) (string, string, error) { return "", "", errors.New("InMemoryDatabase suports only DefaultPackage") } - res, err := json.Marshal(pd) + res, err := pd.JSON() if err != nil { return "", "", err } diff --git a/pkg/package/package.go b/pkg/package/package.go index 1f47900a..042a9cfd 100644 --- a/pkg/package/package.go +++ b/pkg/package/package.go @@ -77,13 +77,33 @@ type Tree interface { // >> Unmarshallers // DefaultPackageFromYaml decodes a package from yaml bytes -func DefaultPackageFromYaml(source []byte) (DefaultPackage, error) { - var pkg DefaultPackage - err := yaml.Unmarshal(source, &pkg) +func DefaultPackageFromYaml(yml []byte) (DefaultPackage, error) { + + var unescaped DefaultPackage + source, err := yaml.YAMLToJSON(yml) if err != nil { - return pkg, err + return DefaultPackage{}, err } - return pkg, nil + + rawIn := json.RawMessage(source) + bytes, err := rawIn.MarshalJSON() + if err != nil { + return DefaultPackage{}, err + } + err = json.Unmarshal(bytes, &unescaped) + if err != nil { + return DefaultPackage{}, err + } + return unescaped, nil +} + +// Major and minor gets escaped when marshalling in JSON, making compiler fails recognizing selectors for expansion +func (t *DefaultPackage) JSON() ([]byte, error) { + buffer := &bytes.Buffer{} + encoder := json.NewEncoder(buffer) + encoder.SetEscapeHTML(false) + err := encoder.Encode(t) + return buffer.Bytes(), err } // DefaultPackage represent a standard package definition @@ -113,7 +133,7 @@ func NewPackage(name, version string, requires []*DefaultPackage, conflicts []*D } func (p *DefaultPackage) String() string { - b, err := json.Marshal(p) + b, err := p.JSON() if err != nil { return fmt.Sprintf("{ id: \"%d\", name: \"%s\" }", p.ID, p.Name) } @@ -167,7 +187,12 @@ func (p *DefaultPackage) Encode(db PackageDatabase) (string, error) { } func (p *DefaultPackage) Yaml() ([]byte, error) { - y, err := yaml.Marshal(p) + j, err := p.JSON() + if err != nil { + + return []byte{}, err + } + y, err := yaml.JSONToYAML(j) if err != nil { return []byte{}, err @@ -281,11 +306,19 @@ func (pack *DefaultPackage) RequiresContains(definitiondb PackageDatabase, s Pac p = pack //relax things //return false, errors.Wrap(err, "Package not found in definition db") } + + w := definitiondb.World() for _, re := range p.GetRequires() { if re.Matches(s) { return true, nil } + packages, _ := re.Expand(&w) + for _, pa := range packages { + if pa.Matches(s) { + return true, nil + } + } if contains, err := re.RequiresContains(definitiondb, s); err == nil && contains { return true, nil } @@ -341,12 +374,14 @@ func (pack *DefaultPackage) BuildFormula(definitiondb PackageDatabase, db Packag if err != nil { // return nil, errors.Wrap(err, "Couldn't find required package in db definition") packages, err := requiredDef.Expand(&w) + // Info("Expanded", packages, err) if err != nil || len(packages) == 0 { required = requiredDef } else { required = Best(packages) } + //required = &DefaultPackage{Name: "test"} } encodedB, err := required.Encode(db)