extras-buildsys/utils extras-push-new,1.46,1.47
Ville Skytta (scop)
fedora-extras-commits at redhat.com
Wed Jul 26 21:04:41 UTC 2006
Author: scop
Update of /cvs/fedora/extras-buildsys/utils
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv7959
Modified Files:
extras-push-new
Log Message:
Autodetect when repos need rebuilding eg. due to manual package removals.
Index: extras-push-new
===================================================================
RCS file: /cvs/fedora/extras-buildsys/utils/extras-push-new,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- extras-push-new 16 Jul 2006 20:51:03 -0000 1.46
+++ extras-push-new 26 Jul 2006 21:04:38 -0000 1.47
@@ -193,6 +193,34 @@
srcrpms.append(os.path.join(root,f))
return srcrpms
+def is_repo_changed(repodir):
+ """Checks if the repository has changed and needs to be reindexed"""
+ ref_file = os.path.join(repodir, 'repodata', 'repomd.xml')
+ if not os.path.exists(ref_file):
+ return True
+ ref_mtime = os.path.getmtime(ref_file)
+ if os.path.getmtime(repodir) > ref_mtime:
+ return True
+ ignored_dirs = (
+ os.path.join(repodir, 'repodata'),
+ os.path.join(repodir, 'debug'),
+ )
+ for root, dirs, files in os.walk(repodir):
+ next = False
+ for ignored in ignored_dirs:
+ if (root + "/").find(ignored + "/") == 0:
+ next = True
+ if next:
+ continue
+ for d in map(lambda x: os.path.join(root, x), dirs):
+ if d in ignored_dirs:
+ continue
+ elif os.path.getmtime(d) > ref_mtime:
+ return True
+ for f in fnmatch.filter(files, '*.rpm'):
+ if os.path.getmtime(os.path.join(root, f)) > ref_mtime:
+ return True
+ return False
def mark_pkg_pushed(pkgrelroot):
fname = os.path.join(pkgrelroot,'PUSHED')
@@ -415,6 +443,9 @@
def copy_sign_move(dist):
+ """Copies, signs and moves packages for the given dist.
+ Returns (errcode, changed) where errcode is an error code and changed
+ is a boolean indicating whether the target repo was changed."""
runfilename = getrunfilename(dist)
try:
rundirfile = open(runfilename,'a')
@@ -425,12 +456,23 @@
distdir = '%s-%s-%s' % (distro, dist, project)
needsign = os.path.join(stagesdir, distdir)
destdir = os.path.join(treedir, dist)
- if not os.path.exists(destdir):
- for arch in archdict[dist]:
- if not DEBUG:
- os.makedirs(destdir + '/' + arch + '/debug')
- if not DEBUG:
- os.makedirs(destdir + '/' + 'SRPMS')
+ changed = False
+
+ repodirs = [os.path.join(destdir, 'SRPMS')]
+ for arch in archdict[dist]:
+ repodirs.append(os.path.join(destdir, arch))
+ repodirs.append(os.path.join(destdir, arch, 'debug'))
+ for repodir in repodirs:
+ # We check for changes already here in case the repo has changed
+ # due to external activities such as removing files etc, and will
+ # recheck it again later if needed when we're done with this sign
+ # batch.
+ if not changed:
+ changed = is_repo_changed(repodir)
+ if changed:
+ print "Dist %s (%s) was externally changed" % (dist, repodir)
+ if not DEBUG and not os.path.exists(repodir):
+ os.makedirs(repodir)
repolockname = os.path.join(needsign,REPO_LOCKFILE_NAME)
repolock = LockFile(name=repolockname,blocking=True)
@@ -451,7 +493,7 @@
rpms = files['rpm'] + files['srpm'] + files['debuginfo']
print 'Packages found: %d' % len(rpms)
if len(rpms) == 0:
- return 0
+ return 0, changed
rpms.sort()
for item in rpms:
print ' %s' % os.path.basename(item)
@@ -463,7 +505,7 @@
if signtmpdir == treedir: # paranoid, should never happen
raise Exception
except:
- return errno.EIO
+ return errno.EIO, changed
else:
signtmpdir = os.path.join(treedir,'.push.tmp')
relocrpms = [] # just the list of target files for gpg signing
@@ -497,7 +539,7 @@
debugprint('Removing tmp tree %s' % signtmpdir)
if not DEBUG:
shutil.rmtree(signtmpdir)
- return result
+ return result, changed
print "Copying packages into place:"
infolist = [] # list of src.rpm NEVR for build report
@@ -611,7 +653,16 @@
debugprint('Removing tmp tree %s' % signtmpdir)
if not DEBUG:
shutil.rmtree(signtmpdir)
- return(0)
+
+ # All done, now check if something changed unless we already know it did:
+ if not changed:
+ for repodir in repodirs:
+ changed = is_repo_changed(repodir)
+ if changed:
+ debugprint("Dist %s (%s) was changed" % (dist, repodir))
+ break
+
+ return 0, changed
# ====================================================================
@@ -713,47 +764,46 @@
print 'ERROR: script locked via lockfile %s - it seems to be running already' % lockfile
sys.exit(errno.EPERM)
- changecount = {} # released build requests per dist
+ changed = [] # dists with changes in them
totalchanges = 0
for dist in diststopush:
- result = copy_sign_move(dist)
+ result, repochanged = copy_sign_move(dist)
if result:
sys.exit(result)
# len(getlinesfromrunfile(dist)) is the number of packages
# per dist which have been pushed.
- changecount[dist] = len( getlinesfromrunfile(dist) )
- totalchanges += changecount[dist]
+ totalchanges += len( getlinesfromrunfile(dist) )
+ if repochanged:
+ changed.append(dist)
print 'Total number of pushed build jobs to complete: %d' % totalchanges
# Option -f re-runs repobuild/repoview for all dists, even if
# no new packages have been pushed for a dist.
- changed = diststopush
if opts.force:
changed = alldists
- for dist in changed:
- if opts.force or changecount[dist]:
+ if changed:
+
+ for dist in changed:
run_and_check('extras-repobuild.py %s' % dist)
- if opts.doublesync and totalchanges:
- run_and_check('extras-sync')
+ if opts.doublesync:
+ run_and_check('extras-sync')
- for dist in changed:
- if opts.force or changecount[dist]:
- if opts.repoview:
+ if opts.repoview:
+ for dist in changed:
run_and_check('extras-repoview.py %s' % dist)
- if opts.force or totalchanges:
run_and_check('extras-sync')
- if opts.mail:
- email_list( diststopush )
+ if opts.mail:
+ email_list(changed)
- if opts.upgradecheck and (opts.force or totalchanges):
- run_and_check('upgradecheck.py -c %s' % upgradecheck_conf)
+ if opts.upgradecheck:
+ run_and_check('upgradecheck.py -c %s' % upgradecheck_conf)
- if opts.repoclosure and (opts.force or totalchanges):
- run_and_check('nohup rc-run-all.py &')
+ if opts.repoclosure:
+ run_and_check('nohup rc-run-all.py &')
lock.unlock()
sys.exit(0)
More information about the fedora-extras-commits
mailing list