Split out a portage_update.grab_updates() function so that it can be reused.
authorZac Medico <zmedico@gentoo.org>
Tue, 28 Feb 2006 06:40:44 +0000 (06:40 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 28 Feb 2006 06:40:44 +0000 (06:40 -0000)
svn path=/main/trunk/; revision=2801

pym/portage.py
pym/portage_update.py

index c2e11358083f4f4a51f21bf2b94067f7792bb155..5f81dd55b0a1e8eea859b0b12db0b95bac649f4c 100644 (file)
@@ -106,7 +106,7 @@ try:
        from portage_checksum import perform_md5,perform_checksum,prelink_capable
        import eclass_cache
        from portage_localization import _
-       from portage_update import fixdbentries, update_dbentries
+       from portage_update import fixdbentries, update_dbentries, grab_updates
 
        # Need these functions directly in portage namespace to not break every external tool in existence
        from portage_versions import ververify,vercmp,catsplit,catpkgsplit,pkgsplit,pkgcmp
@@ -6734,7 +6734,7 @@ for x in mtimedb.keys():
 #,"porttree":portagetree(root,virts),"bintree":binarytree(root,virts)}
 features=settings["FEATURES"].split()
 
-def do_upgrade(mykey):
+def do_upgrade(mykey, mycontent):
        """Valid updates are returned as a list of split update commands."""
        writemsg("\n\n")
        writemsg(green("Performing Global Updates: ")+bold(mykey)+"\n")
@@ -6742,7 +6742,7 @@ def do_upgrade(mykey):
        writemsg("  "+bold(".")+"='update pass'  "+bold("*")+"='binary update'  "+bold("@")+"='/var/db move'\n"+"  "+bold("s")+"='/var/db SLOT move' "+bold("S")+"='binary SLOT move' "+bold("p")+"='update /etc/portage/package.*'\n")
        processed=1
        myupd = []
-       mylines = grabfile(mykey)
+       mylines = mycontent.splitlines()
        for myline in mylines:
                mysplit = myline.split()
                if len(mysplit) == 0:
@@ -6870,37 +6870,24 @@ def update_config_files(update_iter):
 
 def global_updates():
        updpath = os.path.join(settings["PORTDIR"], "profiles", "updates")
-       mylist = listdir(updpath, EmptyOnError=1)
-       # validate the file name (filter out CVS directory, etc...)
-       mylist = [myfile for myfile in mylist if len(myfile) == 7 and myfile[1:3] == "Q-"]
-       if len(mylist) > 0:
-               # resort the list
-               mylist = [myfile[3:]+"-"+myfile[:2] for myfile in mylist]
-               mylist.sort()
-               mylist = [myfile[5:]+"-"+myfile[:4] for myfile in mylist]
-
-               if not mtimedb.has_key("updates"):
-                       mtimedb["updates"] = {}
-
-               didupdate = 0
+       if not mtimedb.has_key("updates"):
+               mtimedb["updates"] = {}
+       if settings["PORTAGE_CALLER"] == "fixpackages":
+               update_data = grab_updates(updpath)
+       else:
+               update_data = grab_updates(updpath, mtimedb["updates"])
+       if len(update_data) > 0:
+               didupdate = 1
                do_upgrade_packagesmessage = 0
                myupd = []
                timestamps = {}
-               for myfile in mylist:
-                       mykey = os.path.join(updpath, myfile)
-                       mystat = os.stat(mykey)
-                       if not stat.S_ISREG(mystat.st_mode):
-                               continue
-                       if mykey not in mtimedb["updates"] or \
-                       mtimedb["updates"][mykey] != mystat.st_mtime or \
-                       settings["PORTAGE_CALLER"] == "fixpackages":
-                               didupdate = 1
-                               valid_updates, no_errors = do_upgrade(mykey)
-                               myupd.extend(valid_updates)
-                               if no_errors:
-                                       # Update our internal mtime since we
-                                       # processed all of our directives.
-                                       timestamps[mykey] = mystat.st_mtime
+               for mykey, mystat, mycontent in update_data:
+                       valid_updates, no_errors = do_upgrade(mykey, mycontent)
+                       myupd.extend(valid_updates)
+                       if no_errors:
+                               # Update our internal mtime since we
+                               # processed all of our directives.
+                               timestamps[mykey] = mystat.st_mtime
                update_config_files(myupd)
 
                db["/"]["bintree"] = binarytree("/", settings["PKGDIR"], virts)
index 0aadae1b3f88bf1f64673c2d18da9fc1b8d360a0..a33bc918826c60cb90317d4681b6795423f741b3 100644 (file)
@@ -44,3 +44,32 @@ def fixdbentries(update_iter, dbdir):
                file_path = os.path.join(dbdir, myfile)
                write_atomic(file_path, mycontent)
        return len(updated_items) > 0
+
+def grab_updates(updpath, prev_mtimes=None):
+       """Returns all the updates from the given directory as a sorted list of
+       tuples, each containing (file_path, statobj, content).  If prev_mtimes is
+       given then only updates with differing mtimes are considered."""
+       mylist = os.listdir(updpath)
+       if prev_mtimes is None:
+               prev_mtimes = {}
+       # validate the file name (filter out CVS directory, etc...)
+       mylist = [myfile for myfile in mylist if len(myfile) == 7 and myfile[1:3] == "Q-"]
+       if len(mylist) == 0:
+               return []
+       
+       # update names are mangled to make them sort properly
+       mylist = [myfile[3:]+"-"+myfile[:2] for myfile in mylist]
+       mylist.sort()
+       mylist = [myfile[5:]+"-"+myfile[:4] for myfile in mylist]
+
+       update_data = []
+       for myfile in mylist:
+               file_path = os.path.join(updpath, myfile)
+               mystat = os.stat(file_path)
+               if file_path not in prev_mtimes or \
+               prev_mtimes[file_path] != mystat.st_mtime:
+                       f = open(file_path)
+                       content = f.read()
+                       f.close()
+                       update_data.append((file_path, mystat, content))
+       return update_data