func toPackages(criteria criteria) []*database.Package { // There are duplicates in Red Hat .xml files. // This map is for deduplication. packagesParameters := make(map[string]*database.Package) possibilities := getPossibilities(criteria) for _, criterions := range possibilities { var ( pkg database.Package osVersion int err error ) // Attempt to parse package data from trees of criterions. for _, c := range criterions { if strings.Contains(c.Comment, " is installed") { const prefixLen = len("Red Hat Enterprise Linux ") osVersion, err = strconv.Atoi(strings.TrimSpace(c.Comment[prefixLen : prefixLen+strings.Index(c.Comment[prefixLen:], " ")])) if err != nil { log.Warningf("could not parse Red Hat release version from: '%s'.", c.Comment) } } else if strings.Contains(c.Comment, " is earlier than ") { const prefixLen = len(" is earlier than ") pkg.Name = strings.TrimSpace(c.Comment[:strings.Index(c.Comment, " is earlier than ")]) pkg.Version, err = types.NewVersion(c.Comment[strings.Index(c.Comment, " is earlier than ")+prefixLen:]) if err != nil { log.Warningf("could not parse package version '%s': %s. skipping", c.Comment[strings.Index(c.Comment, " is earlier than ")+prefixLen:], err.Error()) } } } if osVersion > firstConsideredRHEL { pkg.OS = "centos" + ":" + strconv.Itoa(osVersion) } else { continue } if pkg.OS != "" && pkg.Name != "" && pkg.Version.String() != "" { packagesParameters[pkg.Key()] = &pkg } else { log.Warningf("could not determine a valid package from criterions: %v", criterions) } } // Convert the map to slice. var packagesParametersArray []*database.Package for _, p := range packagesParameters { packagesParametersArray = append(packagesParametersArray, p) } return packagesParametersArray }