sped up housekeeping so no interval is needed

This commit is contained in:
2021-11-20 00:02:53 +01:00
parent 3e8f4711f0
commit 7baccce64b
3 changed files with 69 additions and 79 deletions

View File

@@ -21,9 +21,6 @@ basedir:
march: march:
- x86-64-v3 - x86-64-v3
housekeeping:
interval: 12h
blacklist: blacklist:
packages: packages:
- tensorflow - tensorflow

91
main.go
View File

@@ -40,7 +40,6 @@ var (
db *ent.Client db *ent.Client
journalLog = flag.Bool("journal", false, "Log to systemd journal instead of stdout") journalLog = flag.Bool("journal", false, "Log to systemd journal instead of stdout")
checkInterval = flag.Int("interval", 5, "How often svn2git should be checked in minutes (default: 5)") checkInterval = flag.Int("interval", 5, "How often svn2git should be checked in minutes (default: 5)")
lastHKRun time.Time
) )
func (b *BuildManager) buildWorker(id int) { func (b *BuildManager) buildWorker(id int) {
@@ -63,8 +62,8 @@ func (b *BuildManager) buildWorker(id int) {
log.Infof("[%s/%s] Build starting", pkg.FullRepo, pkg.Pkgbase) log.Infof("[%s/%s] Build starting", pkg.FullRepo, pkg.Pkgbase)
dbPkg := pkg.toDbPackage(true) pkg.toDbPackage(true)
dbPkg = dbPkg.Update().SetStatus(dbpackage.StatusBuilding).ClearSkipReason().SaveX(context.Background()) pkg.DbPackage = pkg.DbPackage.Update().SetStatus(dbpackage.StatusBuilding).ClearSkipReason().SaveX(context.Background())
err := importKeys(pkg) err := importKeys(pkg)
if err != nil { if err != nil {
@@ -86,7 +85,7 @@ func (b *BuildManager) buildWorker(id int) {
// use non-lto makepkg.conf if LTO is blacklisted for this package // use non-lto makepkg.conf if LTO is blacklisted for this package
makepkgFile = "makepkg-%s.conf" makepkgFile = "makepkg-%s.conf"
ltoDisabled = true ltoDisabled = true
dbPkg.Update().SetLto(dbpackage.LtoDisabled).ExecX(context.Background()) pkg.DbPackage.Update().SetLto(dbpackage.LtoDisabled).ExecX(context.Background())
} }
cmd := exec.Command("sh", "-c", cmd := exec.Command("sh", "-c",
"cd "+filepath.Dir(pkg.Pkgbuild)+"&&makechrootpkg -c -D "+conf.Basedir.Makepkg+" -l worker-"+strconv.Itoa(id)+" -r "+conf.Basedir.Chroot+" -- "+ "cd "+filepath.Dir(pkg.Pkgbuild)+"&&makechrootpkg -c -D "+conf.Basedir.Makepkg+" -l worker-"+strconv.Itoa(id)+" -r "+conf.Basedir.Chroot+" -- "+
@@ -123,7 +122,7 @@ func (b *BuildManager) buildWorker(id int) {
check(os.MkdirAll(filepath.Join(conf.Basedir.Repo, "logs"), 0755)) check(os.MkdirAll(filepath.Join(conf.Basedir.Repo, "logs"), 0755))
check(os.WriteFile(filepath.Join(conf.Basedir.Repo, "logs", pkg.Pkgbase+".log"), out.Bytes(), 0644)) check(os.WriteFile(filepath.Join(conf.Basedir.Repo, "logs", pkg.Pkgbase+".log"), out.Bytes(), 0644))
dbPkg.Update().SetStatus(dbpackage.StatusFailed).ClearSkipReason().SetBuildTimeStart(start).SetBuildTimeEnd(time.Now().UTC()).SetHash(pkg.Hash).ExecX(context.Background()) pkg.DbPackage.Update().SetStatus(dbpackage.StatusFailed).ClearSkipReason().SetBuildTimeStart(start).SetBuildTimeEnd(time.Now().UTC()).SetHash(pkg.Hash).ExecX(context.Background())
// purge failed package from repo // purge failed package from repo
b.repoPurge[pkg.FullRepo] <- pkg b.repoPurge[pkg.FullRepo] <- pkg
@@ -176,9 +175,9 @@ func (b *BuildManager) buildWorker(id int) {
} }
if !ltoDisabled { if !ltoDisabled {
dbPkg.Update().SetStatus(dbpackage.StatusBuild).SetLto(dbpackage.LtoEnabled).SetBuildTimeStart(start).SetBuildTimeEnd(time.Now().UTC()).ExecX(context.Background()) pkg.DbPackage.Update().SetStatus(dbpackage.StatusBuild).SetLto(dbpackage.LtoEnabled).SetBuildTimeStart(start).SetBuildTimeEnd(time.Now().UTC()).ExecX(context.Background())
} else { } else {
dbPkg.Update().SetStatus(dbpackage.StatusBuild).SetLto(dbpackage.LtoDisabled).SetBuildTimeStart(start).SetBuildTimeEnd(time.Now().UTC()).ExecX(context.Background()) pkg.DbPackage.Update().SetStatus(dbpackage.StatusBuild).SetLto(dbpackage.LtoDisabled).SetBuildTimeStart(start).SetBuildTimeEnd(time.Now().UTC()).ExecX(context.Background())
} }
log.Infof("[%s/%s] Build successful (%s)", pkg.FullRepo, pkg.Pkgbase, time.Now().Sub(start)) log.Infof("[%s/%s] Build successful (%s)", pkg.FullRepo, pkg.Pkgbase, time.Now().Sub(start))
@@ -203,47 +202,49 @@ func (b *BuildManager) parseWorker() {
} }
pkg.Version = constructVersion(pkg.Srcinfo.Pkgver, pkg.Srcinfo.Pkgrel, pkg.Srcinfo.Epoch) pkg.Version = constructVersion(pkg.Srcinfo.Pkgver, pkg.Srcinfo.Pkgrel, pkg.Srcinfo.Epoch)
dbPkg := pkg.toDbPackage(true) pkg.toDbPackage(true)
skipping := false skipping := false
if contains(pkg.Srcinfo.Arch, "any") { if contains(pkg.Srcinfo.Arch, "any") {
log.Debugf("Skipped %s: any-Package", pkg.Srcinfo.Pkgbase) log.Debugf("Skipped %s: any-Package", pkg.Srcinfo.Pkgbase)
dbPkg.SkipReason = "arch = any" pkg.DbPackage.SkipReason = "arch = any"
dbPkg.Status = dbpackage.StatusSkipped pkg.DbPackage.Status = dbpackage.StatusSkipped
skipping = true skipping = true
} else if contains(conf.Blacklist.Packages, pkg.Srcinfo.Pkgbase) { } else if contains(conf.Blacklist.Packages, pkg.Srcinfo.Pkgbase) {
log.Debugf("Skipped %s: blacklisted package", pkg.Srcinfo.Pkgbase) log.Debugf("Skipped %s: blacklisted package", pkg.Srcinfo.Pkgbase)
dbPkg.SkipReason = "blacklisted" pkg.DbPackage.SkipReason = "blacklisted"
dbPkg.Status = dbpackage.StatusSkipped pkg.DbPackage.Status = dbpackage.StatusSkipped
skipping = true skipping = true
} else if contains(pkg.Srcinfo.MakeDepends, "ghc") || contains(pkg.Srcinfo.MakeDepends, "haskell-ghc") || contains(pkg.Srcinfo.Depends, "ghc") || contains(pkg.Srcinfo.Depends, "haskell-ghc") { } else if contains(pkg.Srcinfo.MakeDepends, "ghc") || contains(pkg.Srcinfo.MakeDepends, "haskell-ghc") || contains(pkg.Srcinfo.Depends, "ghc") || contains(pkg.Srcinfo.Depends, "haskell-ghc") {
// Skip Haskell packages for now, as we are facing linking problems with them, // Skip Haskell packages for now, as we are facing linking problems with them,
// most likely caused by not having a dependency check implemented yet and building at random. // most likely caused by not having a dependency check implemented yet and building at random.
// https://git.harting.dev/anonfunc/ALHP.GO/issues/11 // https://git.harting.dev/anonfunc/ALHP.GO/issues/11
log.Debugf("Skipped %s: haskell package", pkg.Srcinfo.Pkgbase) log.Debugf("Skipped %s: haskell package", pkg.Srcinfo.Pkgbase)
dbPkg.SkipReason = "blacklisted (haskell)" pkg.DbPackage.SkipReason = "blacklisted (haskell)"
dbPkg.Status = dbpackage.StatusSkipped pkg.DbPackage.Status = dbpackage.StatusSkipped
skipping = true skipping = true
} else if isPkgFailed(pkg, dbPkg) { } else if isPkgFailed(pkg) {
log.Debugf("Skipped %s: failed build", pkg.Srcinfo.Pkgbase) log.Debugf("Skipped %s: failed build", pkg.Srcinfo.Pkgbase)
skipping = true skipping = true
} }
if skipping { if skipping {
dbPkg.Update().SetUpdated(time.Now()).SetVersion(pkg.Version).SetPackages(packages2slice(pkg.Srcinfo.Packages)).SetStatus(dbPkg.Status).SetSkipReason(dbPkg.SkipReason).SetHash(pkg.Hash).ExecX(context.Background()) pkg.DbPackage.Update().SetUpdated(time.Now()).SetVersion(pkg.Version).
SetPackages(packages2slice(pkg.Srcinfo.Packages)).SetStatus(pkg.DbPackage.Status).
SetSkipReason(pkg.DbPackage.SkipReason).SetHash(pkg.Hash).ExecX(context.Background())
b.repoPurge[pkg.FullRepo] <- pkg b.repoPurge[pkg.FullRepo] <- pkg
b.parseWG.Done() b.parseWG.Done()
continue continue
} else { } else {
dbPkg = dbPkg.Update().SetUpdated(time.Now()).SetPackages(packages2slice(pkg.Srcinfo.Packages)).SetVersion(pkg.Version).SaveX(context.Background()) pkg.DbPackage = pkg.DbPackage.Update().SetUpdated(time.Now()).SetPackages(packages2slice(pkg.Srcinfo.Packages)).SetVersion(pkg.Version).SaveX(context.Background())
} }
repoVer, err := pkg.repoVersion() repoVer, err := pkg.repoVersion()
if err != nil { if err != nil {
dbPkg = dbPkg.Update().ClearRepoVersion().SaveX(context.Background()) pkg.DbPackage = pkg.DbPackage.Update().ClearRepoVersion().SaveX(context.Background())
} else if err == nil && alpm.VerCmp(repoVer, pkg.Version) > 0 { } else if err == nil && alpm.VerCmp(repoVer, pkg.Version) > 0 {
log.Debugf("Skipped %s: Version in repo higher than in PKGBUILD (%s < %s)", pkg.Srcinfo.Pkgbase, pkg.Version, repoVer) log.Debugf("Skipped %s: Version in repo higher than in PKGBUILD (%s < %s)", pkg.Srcinfo.Pkgbase, pkg.Version, repoVer)
dbPkg = dbPkg.Update().SetStatus(dbpackage.StatusLatest).ClearSkipReason().SetHash(pkg.Hash).SaveX(context.Background()) pkg.DbPackage = pkg.DbPackage.Update().SetStatus(dbpackage.StatusLatest).ClearSkipReason().SetHash(pkg.Hash).SaveX(context.Background())
b.parseWG.Done() b.parseWG.Done()
continue continue
} }
@@ -255,28 +256,28 @@ func (b *BuildManager) parseWorker() {
log.Warningf("[%s/%s] Problem solving dependencies: %v", pkg.FullRepo, pkg.Srcinfo.Pkgbase, err) log.Warningf("[%s/%s] Problem solving dependencies: %v", pkg.FullRepo, pkg.Srcinfo.Pkgbase, err)
case MultiplePKGBUILDError: case MultiplePKGBUILDError:
log.Infof("Skipped %s: Multiple PKGBUILDs for dependency found: %v", pkg.Srcinfo.Pkgbase, err) log.Infof("Skipped %s: Multiple PKGBUILDs for dependency found: %v", pkg.Srcinfo.Pkgbase, err)
dbPkg = dbPkg.Update().SetStatus(dbpackage.StatusSkipped).SetSkipReason("multiple PKGBUILD for dep. found").SaveX(context.Background()) pkg.DbPackage = pkg.DbPackage.Update().SetStatus(dbpackage.StatusSkipped).SetSkipReason("multiple PKGBUILD for dep. found").SaveX(context.Background())
b.repoPurge[pkg.FullRepo] <- pkg b.repoPurge[pkg.FullRepo] <- pkg
b.parseWG.Done() b.parseWG.Done()
continue continue
case UnableToSatisfyError: case UnableToSatisfyError:
log.Infof("Skipped %s: unable to resolve dependencies: %v", pkg.Srcinfo.Pkgbase, err) log.Infof("Skipped %s: unable to resolve dependencies: %v", pkg.Srcinfo.Pkgbase, err)
dbPkg = dbPkg.Update().SetStatus(dbpackage.StatusSkipped).SetSkipReason("unable to resolve dependencies").SaveX(context.Background()) pkg.DbPackage = pkg.DbPackage.Update().SetStatus(dbpackage.StatusSkipped).SetSkipReason("unable to resolve dependencies").SaveX(context.Background())
b.repoPurge[pkg.FullRepo] <- pkg b.repoPurge[pkg.FullRepo] <- pkg
b.parseWG.Done() b.parseWG.Done()
continue continue
} }
} }
dbPkg = dbPkg.Update().SetStatus(dbpackage.StatusQueued).SaveX(context.Background()) pkg.DbPackage = pkg.DbPackage.Update().SetStatus(dbpackage.StatusQueued).SaveX(context.Background())
if !isLatest { if !isLatest {
if local != nil { if local != nil {
log.Infof("Delayed %s: not all dependencies are up to date (local: %s==%s, sync: %s==%s)", pkg.Srcinfo.Pkgbase, local.Name(), local.Version(), local.Name(), syncVersion) log.Infof("Delayed %s: not all dependencies are up to date (local: %s==%s, sync: %s==%s)", pkg.Srcinfo.Pkgbase, local.Name(), local.Version(), local.Name(), syncVersion)
dbPkg.Update().SetSkipReason(fmt.Sprintf("waiting for %s==%s", local.Name(), syncVersion)).ExecX(context.Background()) pkg.DbPackage.Update().SetSkipReason(fmt.Sprintf("waiting for %s==%s", local.Name(), syncVersion)).ExecX(context.Background())
} else { } else {
log.Infof("Delayed %s: not all dependencies are up to date or resolvable", pkg.Srcinfo.Pkgbase) log.Infof("Delayed %s: not all dependencies are up to date or resolvable", pkg.Srcinfo.Pkgbase)
dbPkg.Update().SetSkipReason("waiting for mirror").ExecX(context.Background()) pkg.DbPackage.Update().SetSkipReason("waiting for mirror").ExecX(context.Background())
} }
// Purge delayed packages in case delay is caused by inconsistencies in svn2git. // Purge delayed packages in case delay is caused by inconsistencies in svn2git.
@@ -413,8 +414,8 @@ func (b *BuildManager) repoWorker(repo string) {
log.Panicf("%s while repo-add: %v", string(res), err) log.Panicf("%s while repo-add: %v", string(res), err)
} }
dbPkg := pkg.toDbPackage(true) pkg.toDbPackage(true)
dbPkg = dbPkg.Update().SetStatus(dbpackage.StatusLatest).ClearSkipReason().SetRepoVersion(pkg.Version).SetHash(pkg.Hash).SaveX(context.Background()) pkg.DbPackage = pkg.DbPackage.Update().SetStatus(dbpackage.StatusLatest).ClearSkipReason().SetRepoVersion(pkg.Version).SetHash(pkg.Hash).SaveX(context.Background())
cmd = exec.Command("paccache", cmd = exec.Command("paccache",
"-rc", filepath.Join(conf.Basedir.Repo, pkg.FullRepo, "os", conf.Arch), "-rc", filepath.Join(conf.Basedir.Repo, pkg.FullRepo, "os", conf.Arch),
@@ -456,9 +457,8 @@ func (b *BuildManager) repoWorker(repo string) {
continue continue
} }
dbPkg := pkg.toDbPackage(false) if pkg.DbPackage != nil {
if dbPkg != nil { pkg.DbPackage = pkg.DbPackage.Update().ClearRepoVersion().SaveX(context.Background())
dbPkg = dbPkg.Update().ClearRepoVersion().SaveX(context.Background())
} }
for _, file := range pkg.PkgFiles { for _, file := range pkg.PkgFiles {
@@ -514,32 +514,23 @@ func (b *BuildManager) syncWorker() {
} }
// housekeeping // housekeeping
hkDur, err := time.ParseDuration(conf.Housekeeping.Interval) wg := new(sync.WaitGroup)
if err != nil { for _, repo := range repos {
log.Warningf("Unable to parse housekeeping duration %s: %v", conf.Housekeeping.Interval, err) wg.Add(1)
hkDur, _ = time.ParseDuration("12h") repo := repo
} go func() {
err := housekeeping(repo, wg)
if time.Since(lastHKRun) > hkDur { if err != nil {
lastHKRun = time.Now() log.Warningf("[%s] housekeeping failed: %v", repo, err)
wg := new(sync.WaitGroup) }
for _, repo := range repos { }()
wg.Add(1)
repo := repo
go func() {
err := housekeeping(repo, wg)
if err != nil {
log.Warningf("[%s] housekeeping failed: %v", repo, err)
}
}()
}
wg.Wait()
} }
wg.Wait()
// fetch updates between sync runs // fetch updates between sync runs
b.alpmMutex.Lock() b.alpmMutex.Lock()
check(alpmHandle.Release()) check(alpmHandle.Release())
err = setupChroot() err := setupChroot()
for err != nil { for err != nil {
log.Warningf("Unable to upgrade chroot, trying again later.") log.Warningf("Unable to upgrade chroot, trying again later.")
time.Sleep(time.Minute) time.Sleep(time.Minute)

View File

@@ -31,15 +31,16 @@ const (
) )
type BuildPackage struct { type BuildPackage struct {
Pkgbase string Pkgbase string
Pkgbuild string Pkgbuild string
Srcinfo *srcinfo.Srcinfo Srcinfo *srcinfo.Srcinfo
PkgFiles []string PkgFiles []string
Repo dbpackage.Repository Repo dbpackage.Repository
March string March string
FullRepo string FullRepo string
Version string Version string
Hash string Hash string
DbPackage *ent.DbPackage
} }
type BuildManager struct { type BuildManager struct {
@@ -371,8 +372,8 @@ func (p *BuildPackage) SVN2GITVersion(h *alpm.Handle) (string, error) {
return constructVersion(info.Pkgver, info.Pkgrel, info.Epoch), nil return constructVersion(info.Pkgver, info.Pkgrel, info.Epoch), nil
} }
func isPkgFailed(pkg *BuildPackage, dbPkg *ent.DbPackage) bool { func isPkgFailed(pkg *BuildPackage) bool {
if dbPkg.Version == "" { if pkg.DbPackage.Version == "" {
return false return false
} }
@@ -384,10 +385,10 @@ func isPkgFailed(pkg *BuildPackage, dbPkg *ent.DbPackage) bool {
pkg.Version = constructVersion(pkg.Srcinfo.Pkgver, pkg.Srcinfo.Pkgrel, pkg.Srcinfo.Epoch) pkg.Version = constructVersion(pkg.Srcinfo.Pkgver, pkg.Srcinfo.Pkgrel, pkg.Srcinfo.Epoch)
} }
if alpm.VerCmp(dbPkg.Version, pkg.Version) < 0 { if alpm.VerCmp(pkg.DbPackage.Version, pkg.Version) < 0 {
return false return false
} else { } else {
return dbPkg.Status == dbpackage.StatusFailed return pkg.DbPackage.Status == dbpackage.StatusFailed
} }
} }
@@ -495,19 +496,20 @@ func housekeeping(repo string, wg *sync.WaitGroup) error {
} }
pkg := &BuildPackage{ pkg := &BuildPackage{
Pkgbase: dbPkg.Pkgbase, Pkgbase: dbPkg.Pkgbase,
Repo: dbPkg.Repository, Repo: dbPkg.Repository,
FullRepo: dbPkg.Repository.String() + "-" + dbPkg.March, FullRepo: dbPkg.Repository.String() + "-" + dbPkg.March,
DbPackage: dbPkg,
} }
var upstream string var upstream string
switch dbPkg.Repository { switch pkg.DbPackage.Repository {
case dbpackage.RepositoryCore, dbpackage.RepositoryExtra: case dbpackage.RepositoryCore, dbpackage.RepositoryExtra:
upstream = "upstream-core-extra" upstream = "upstream-core-extra"
case dbpackage.RepositoryCommunity: case dbpackage.RepositoryCommunity:
upstream = "upstream-community" upstream = "upstream-community"
} }
pkg.Pkgbuild = filepath.Join(conf.Basedir.Upstream, upstream, dbPkg.Pkgbase, "repos", dbPkg.Repository.String()+"-"+conf.Arch, "PKGBUILD") pkg.Pkgbuild = filepath.Join(conf.Basedir.Upstream, upstream, dbPkg.Pkgbase, "repos", pkg.DbPackage.Repository.String()+"-"+conf.Arch, "PKGBUILD")
// check if pkg signature is valid // check if pkg signature is valid
valid, err := pkgfile.isSignatureValid() valid, err := pkgfile.isSignatureValid()
@@ -525,13 +527,13 @@ func housekeeping(repo string, wg *sync.WaitGroup) error {
if err != nil { if err != nil {
log.Infof("[HK/%s/%s] package not present on disk", pkg.FullRepo, pkg.Pkgbase) log.Infof("[HK/%s/%s] package not present on disk", pkg.FullRepo, pkg.Pkgbase)
// error means package was not found -> delete version & hash from db so rebuild can happen // error means package was not found -> delete version & hash from db so rebuild can happen
err := dbPkg.Update().ClearHash().ClearRepoVersion().Exec(context.Background()) err := pkg.DbPackage.Update().ClearHash().ClearRepoVersion().Exec(context.Background())
if err != nil { if err != nil {
return err return err
} }
} else if alpm.VerCmp(repoVer, dbPkg.RepoVersion) != 0 { } else if alpm.VerCmp(repoVer, dbPkg.RepoVersion) != 0 {
log.Infof("[HK/%s/%s] update %s->%s in db", pkg.FullRepo, pkg.Pkgbase, dbPkg.RepoVersion, repoVer) log.Infof("[HK/%s/%s] update %s->%s in db", pkg.FullRepo, pkg.Pkgbase, dbPkg.RepoVersion, repoVer)
dbPkg, err = dbPkg.Update().SetRepoVersion(repoVer).Save(context.Background()) pkg.DbPackage, err = pkg.DbPackage.Update().SetRepoVersion(repoVer).Save(context.Background())
if err != nil { if err != nil {
return err return err
} }
@@ -545,11 +547,11 @@ func housekeeping(repo string, wg *sync.WaitGroup) error {
return err return err
} }
pkgResolved, err := dbs.FindSatisfier(dbPkg.Packages[0]) pkgResolved, err := dbs.FindSatisfier(dbPkg.Packages[0])
if err != nil || pkgResolved.DB().Name() != dbPkg.Repository.String() { if err != nil || pkgResolved.DB().Name() != pkg.DbPackage.Repository.String() {
// package not found on mirror/db -> not part of any repo anymore // package not found on mirror/db -> not part of any repo anymore
log.Infof("[HK/%s/%s] not part of repo", pkg.FullRepo, pkg.Pkgbase) log.Infof("[HK/%s/%s] not part of repo", pkg.FullRepo, pkg.Pkgbase)
buildManager.repoPurge[pkg.FullRepo] <- pkg buildManager.repoPurge[pkg.FullRepo] <- pkg
err = db.DbPackage.DeleteOne(dbPkg).Exec(context.Background()) err = db.DbPackage.DeleteOne(pkg.DbPackage).Exec(context.Background())
if err != nil { if err != nil {
return err return err
} }
@@ -567,8 +569,8 @@ func (p *BuildPackage) findPkgFiles() error {
} }
var realPkgs []string var realPkgs []string
for _, realPkg := range p.Srcinfo.Packages { for _, realPkg := range p.DbPackage.Packages {
realPkgs = append(realPkgs, realPkg.Pkgname) realPkgs = append(realPkgs, realPkg)
} }
var fPkg []string var fPkg []string
@@ -586,13 +588,13 @@ func (p *BuildPackage) findPkgFiles() error {
return nil return nil
} }
func (p *BuildPackage) toDbPackage(create bool) *ent.DbPackage { func (p *BuildPackage) toDbPackage(create bool) {
dbPkg, err := db.DbPackage.Query().Where(dbpackage.Pkgbase(p.Pkgbase)).Only(context.Background()) dbPkg, err := db.DbPackage.Query().Where(dbpackage.Pkgbase(p.Pkgbase)).Only(context.Background())
if err != nil && create { if err != nil && create {
dbPkg = db.DbPackage.Create().SetPkgbase(p.Pkgbase).SetMarch(p.March).SetPackages(packages2slice(p.Srcinfo.Packages)).SetRepository(p.Repo).SaveX(context.Background()) dbPkg = db.DbPackage.Create().SetPkgbase(p.Pkgbase).SetMarch(p.March).SetPackages(packages2slice(p.Srcinfo.Packages)).SetRepository(p.Repo).SaveX(context.Background())
} }
return dbPkg p.DbPackage = dbPkg
} }
func syncMarchs() { func syncMarchs() {