in deb_packages/tools/update_deb_packages/src/update_deb_packages.go [455:550]
func updateWorkspaceRule(workspaceContents []byte, rule string) string {
arch := getStringField("arch", "-", rule, workspaceContents)
distroType := getStringField("distro_type", "-", rule, workspaceContents)
distro := getStringField("distro", "-", rule, workspaceContents)
mirrors := getListField("mirrors", "-", rule, workspaceContents)
components := getListField("components", "-", rule, workspaceContents)
packages := getMapField("packages", "-", rule, workspaceContents)
packagesSha256 := getMapField("packages_sha256", "-", rule, workspaceContents)
pgpKeyRuleName := getStringField("pgp_key", "-", rule, workspaceContents)
packageNames := make([]string, 0, len(packages))
for p := range packages {
packageNames = append(packageNames, p)
}
sort.Strings(packageNames)
packageShaNames := make([]string, 0, len(packagesSha256))
for p := range packages {
packageShaNames = append(packageShaNames, p)
}
sort.Strings(packageShaNames)
if reflect.DeepEqual(packageNames, packageShaNames) == false {
log.Fatalf("Mismatch between package names in packages and packages_sha256 in rule %s.\npackages: %s\npackages_sha256: %s", rule, packageNames, packageShaNames)
}
wd, err := os.Getwd()
projectName := path.Base(wd)
pgpKeyname := path.Join("bazel-"+projectName, "external", pgpKeyRuleName, "file", "downloaded")
allPackages := getPackages(arch, distroType, distro, mirrors, components, pgpKeyname)
newPackages := make(map[string]string)
newPackagesSha256 := make(map[string]string)
for _, pack := range packageNames {
packlist := strings.Split(pack, "=")
var packname string
var packversion string
var targetVersion version.Version
if len(packlist) > 1 && packlist[1] != "latest" {
packname = packlist[0]
packversion = packlist[1]
var err error
targetVersion, err = version.NewVersion(packlist[1])
logFatalErr(err)
} else {
packname = packlist[0]
packversion = "latest"
var err error
targetVersion, err = version.NewVersion("0")
logFatalErr(err)
}
done := false
for _, pkg := range allPackages {
if pkg["Package"] == packname {
currentVersion, err := version.NewVersion(pkg["Version"])
logFatalErr(err)
if packversion == "latest" {
// iterate over all packages and keep the highest version
if targetVersion.LessThan(currentVersion) {
newPackages[pack] = pkg["Filename"]
newPackagesSha256[pack] = pkg["SHA256"]
targetVersion = currentVersion
done = true
}
} else {
// version is fixed, break once found
if targetVersion.Equal(currentVersion) {
newPackages[pack] = pkg["Filename"]
newPackagesSha256[pack] = pkg["SHA256"]
done = true
break
}
}
}
}
if done == false {
log.Fatalf("Package %s isn't available in %s (rule: %s)", pack, distro, rule)
}
}
pkgstring, err := json.Marshal(newPackages)
logFatalErr(err)
pkgshastring, err := json.Marshal(newPackagesSha256)
logFatalErr(err)
// set packages
workspaceContents = []byte(setStringField("packages", string(pkgstring), "-", rule, workspaceContents, &FORCE_PACKAGE_IDENT))
// set packages_sha256
workspaceContents = []byte(setStringField("packages_sha256", string(pkgshastring), "-", rule, workspaceContents, nil))
// final run that just replaces a known value with itself to make sure the output is prettyfied
workspaceContents = []byte(setStringField("distro", "\""+distro+"\"", "-", rule, workspaceContents, nil))
return string(workspaceContents)
}