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