diff --git a/ent/dbpackage/dbpackage.go b/ent/dbpackage/dbpackage.go index 33e48e2..065ccca 100644 --- a/ent/dbpackage/dbpackage.go +++ b/ent/dbpackage/dbpackage.go @@ -137,8 +137,9 @@ type Repository string // Repository values. const ( - RepositoryExtra Repository = "extra" - RepositoryCore Repository = "core" + RepositoryExtra Repository = "extra" + RepositoryCore Repository = "core" + RepositoryMultilib Repository = "multilib" ) func (r Repository) String() string { @@ -148,7 +149,7 @@ func (r Repository) String() string { // RepositoryValidator is a validator for the "repository" field enum values. It is called by the builders before save. func RepositoryValidator(r Repository) error { switch r { - case RepositoryExtra, RepositoryCore: + case RepositoryExtra, RepositoryCore, RepositoryMultilib: return nil default: return fmt.Errorf("dbpackage: invalid enum value for repository field: %q", r) diff --git a/ent/migrate/schema.go b/ent/migrate/schema.go index 162221a..6b714cf 100644 --- a/ent/migrate/schema.go +++ b/ent/migrate/schema.go @@ -15,7 +15,7 @@ var ( {Name: "packages", Type: field.TypeJSON, Nullable: true}, {Name: "status", Type: field.TypeEnum, Nullable: true, Enums: []string{"skipped", "failed", "build", "queued", "delayed", "building", "latest", "signing", "unknown"}, Default: "unknown"}, {Name: "skip_reason", Type: field.TypeString, Nullable: true}, - {Name: "repository", Type: field.TypeEnum, Enums: []string{"extra", "core"}}, + {Name: "repository", Type: field.TypeEnum, Enums: []string{"extra", "core", "multilib"}}, {Name: "march", Type: field.TypeString}, {Name: "version", Type: field.TypeString, Nullable: true}, {Name: "repo_version", Type: field.TypeString, Nullable: true}, diff --git a/ent/schema/dbpackage.go b/ent/schema/dbpackage.go index 9d97cf5..4088ee5 100644 --- a/ent/schema/dbpackage.go +++ b/ent/schema/dbpackage.go @@ -18,7 +18,7 @@ func (DBPackage) Fields() []ent.Field { field.Enum("status").Values("skipped", "failed", "build", "queued", "delayed", "building", "latest", "signing", "unknown").Default("unknown").Optional(), field.String("skip_reason").Optional(), - field.Enum("repository").Values("extra", "core"), + field.Enum("repository").Values("extra", "core", "multilib"), field.String("march").NotEmpty().Immutable(), field.String("version").Optional(), field.String("repo_version").Optional(), diff --git a/go.sum b/go.sum index 21fc813..690f58e 100644 --- a/go.sum +++ b/go.sum @@ -43,7 +43,6 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/hcl/v2 v2.16.2 h1:mpkHZh/Tv+xet3sy3F9Ld4FyI2tUpWe9x3XtPx9f1a0= github.com/hashicorp/hcl/v2 v2.16.2/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -64,7 +63,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= diff --git a/housekeeping.go b/housekeeping.go index b1d48eb..748a2b4 100644 --- a/housekeeping.go +++ b/housekeeping.go @@ -107,7 +107,7 @@ func housekeeping(repo, march string, wg *sync.WaitGroup) error { return err } - log.Debugf("[HK/%s] checking %d existing package-files", fullRepo, len(dbPackages)) + log.Debugf("[HK/%s] checking %d packages from database", fullRepo, len(dbPackages)) for _, dbPkg := range dbPackages { pkg := &ProtoPackage{ diff --git a/proto_package.go b/proto_package.go index 07e3cb5..cd3b307 100644 --- a/proto_package.go +++ b/proto_package.go @@ -454,7 +454,6 @@ func (p *ProtoPackage) isAvailable(h *alpm.Handle) bool { cmd := exec.Command("unbuffer", "pacsift", "--exact", "--base="+p.Pkgbase, "--repo="+p.Repo.String()) var res []byte res, err = cmd.CombinedOutput() - log.Debug(string(res)) if err != nil { log.Warningf("error getting packages from pacsift for %s: %v", p.Pkgbase, err) buildManager.alpmMutex.Unlock() @@ -465,8 +464,17 @@ func (p *ProtoPackage) isAvailable(h *alpm.Handle) bool { } if len(strings.Split(strings.TrimSpace(string(res)), "\n")) > 0 { - splitOut := strings.Split(strings.Split(strings.TrimSpace(string(res)), "\n")[0], "/") - pkg, err = dbs.FindSatisfier(splitOut[1]) + pacsiftLines := strings.Split(strings.TrimSpace(string(res)), "\n") + + var splitPkgs []string + for _, line := range pacsiftLines { + splitPkgs = append(splitPkgs, strings.Split(line, "/")[1]) + } + + if p.DBPackage != nil { + p.DBPackage = p.DBPackage.Update().SetPackages(splitPkgs).SaveX(context.Background()) + } + pkg, err = dbs.FindSatisfier(splitPkgs[0]) } else { log.Warningf("error getting packages from pacsift for %s", p.Pkgbase) buildManager.alpmMutex.Unlock() diff --git a/utils.go b/utils.go index c7ce3ed..3f03829 100644 --- a/utils.go +++ b/utils.go @@ -20,7 +20,7 @@ import ( ) const ( - pacmanConf = "/usr/share/devtools/pacman.conf.d/extra.conf" + pacmanConf = "/usr/share/devtools/pacman.conf.d/multilib.conf" makepkgConf = "/usr/share/devtools/makepkg.conf.d/x86_64.conf" logDir = "logs" pristineChroot = "root" @@ -317,12 +317,12 @@ func initALPM(root, dbpath string) (*alpm.Handle, error) { return nil, err } - PacmanConfig, _, err := paconf.ParseFile(filepath.Join(root, "/etc/pacman.conf")) + pacmanConfig, _, err := paconf.ParseFile(pacmanConf) if err != nil { return nil, err } - for _, repo := range PacmanConfig.Repos { + for _, repo := range pacmanConfig.Repos { db, err := h.RegisterSyncDB(repo.Name, 0) if err != nil { return nil, err @@ -355,7 +355,7 @@ func setupChroot() error { _, err := os.Stat(filepath.Join(conf.Basedir.Work, chrootDir, pristineChroot)) switch { case err == nil: - cmd := exec.Command("arch-nspawn", filepath.Join(conf.Basedir.Work, chrootDir, pristineChroot), //nolint:gosec + cmd := exec.Command("arch-nspawn", "-C", pacmanConf, filepath.Join(conf.Basedir.Work, chrootDir, pristineChroot), //nolint:gosec "pacman", "-Syuu", "--noconfirm") res, err := cmd.CombinedOutput() log.Debug(string(res)) @@ -367,13 +367,20 @@ func setupChroot() error { if err != nil { return err } - cmd := exec.Command("mkarchroot", "-C", pacmanConf, //nolint:gosec - filepath.Join(conf.Basedir.Work, chrootDir, pristineChroot), "base-devel") + cmd := exec.Command("mkarchroot", "-C", pacmanConf, "-M", makepkgConf, //nolint:gosec + filepath.Join(conf.Basedir.Work, chrootDir, pristineChroot), "base-devel", "multilib-devel") res, err := cmd.CombinedOutput() log.Debug(string(res)) if err != nil { return fmt.Errorf("error creating chroot: %w\n%s", err, string(res)) } + + cmd = exec.Command("sudo", "cp", pacmanConf, filepath.Join(conf.Basedir.Work, chrootDir, pristineChroot, "etc/pacman.conf")) //nolint:gosec + res, err = cmd.CombinedOutput() + log.Debug(string(res)) + if err != nil { + return fmt.Errorf("error copying pacman.conf to chroot: %w\n%s", err, string(res)) + } default: return err } @@ -406,7 +413,7 @@ func syncMarchs() error { for _, march := range conf.March { err := setupMakepkg(march, flagCfg) if err != nil { - log.Fatalf("Can't generate makepkg for %s: %v", march, err) + log.Fatalf("error generating makepkg for %s: %v", march, err) } for _, repo := range conf.Repos { @@ -417,7 +424,7 @@ func syncMarchs() error { go buildManager.repoWorker(fRepo) if _, err := os.Stat(filepath.Join(conf.Basedir.Repo, fRepo, "os", conf.Arch)); os.IsNotExist(err) { - log.Debugf("Creating path %s", filepath.Join(conf.Basedir.Repo, fRepo, "os", conf.Arch)) + log.Debugf("creating path %s", filepath.Join(conf.Basedir.Repo, fRepo, "os", conf.Arch)) err = os.MkdirAll(filepath.Join(conf.Basedir.Repo, fRepo, "os", conf.Arch), 0o755) if err != nil { return err @@ -430,10 +437,10 @@ func syncMarchs() error { } } - log.Infof("Repos: %s", repos) + log.Infof("repos: %s", repos) for _, repo := range eRepos { - log.Infof("Removing old repo %s", repo) + log.Infof("removing old repo %s", repo) err = os.RemoveAll(filepath.Join(conf.Basedir.Repo, repo)) if err != nil { return err