[PATCH 5/6] Create a new function to create the splitSRPM dirs Use this function to create split SRPM dirs on the fly

Jesse Keating jkeating at redhat.com
Mon May 18 22:40:56 UTC 2009


---
 src/pypungi/splittree.py |   54 +++++++++++++++++++++++++++++++--------------
 1 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/src/pypungi/splittree.py b/src/pypungi/splittree.py
index d75cc4b..7cb3d75 100644
--- a/src/pypungi/splittree.py
+++ b/src/pypungi/splittree.py
@@ -292,6 +292,15 @@ self.reserve_size : Additional size needed to be reserved on the first disc.
 
 
 
+    def createSRPMSplitDir(self):
+        """Create a new SRPM split dir to overflow into, linking common files"""
+
+        i = self.src_list[-1]
+        os.makedirs("%s-disc%d/SRPMS" % (self.dist_dir, i))
+        self.linkFiles(self.dist_dir, "%s-disc%d" %(self.dist_dir, i), self.common_files)
+
+
+
     def splitRPMS(self, reportSize = 1):
         """Creates links in the split dirs for the RPMs"""
         
@@ -398,12 +407,11 @@ self.reserve_size : Additional size needed to be reserved on the first disc.
 
     def splitSRPMS(self):
         """Puts the srpms onto the SRPM split discs. The packages are
-        ordered by size, and placed one by one on the disc with the
-        most space available"""
+        ordered by size, and placed one by one on the disc with
+        space available"""
 
         srpm_list = []
 
-        srpm_disc_list = self.src_list
         # create a list of [[size, srpm]]
         for srpm in os.listdir("%s" % self.src_dir):
             if not srpm.endswith('.rpm'):
@@ -414,24 +422,36 @@ self.reserve_size : Additional size needed to be reserved on the first disc.
         srpm_list.sort()
         srpm_list.reverse()
 
+        # Make the first src disc dir
+        self.src_list = [1]
+        self.createSRPMSplitDir()
+        # Create a dict of src discs to current size.
+        src_dict = {1: 0}
+
         for i in range(0, len(srpm_list)):
             # make sure that the src disc is within the size limits,
-            # if it isn't, pull it out of the list. If there's only
-            # one disk make loud noises over the overflow
-            for disc in self.src_list:
-                if self.getIsoSize("%s-disc%s" % (self.dist_dir, disc)) > self.target_size:
-                    if len(self.src_list) < 2:
-                        self.logfile.append("Overflowing %s on disc%d" % (srpm_list[i][1], disc))
-                        break
-                    else:
-                        discsize = self.getIsoSize("%s-disc%d" % (self.dist_dir, disc))
-                        self.logfile.append("%s-disc%d size: %s" % (self.arch, disc, discsize))
-                        self.src_list.pop(self.src_list.index(disc))
+            # if it isn't, make a new one.
+            srpmsize = srpm_list[i][0]
+            fit = None
+
+            for disc in src_dict.keys():
+                if src_dict[disc] + srpmsize < self.target_size:
+                    fit = disc
+                    continue
+
+            if not fit:
+                # We couldn't find a disc to fit on, make a new one
+                self.src_list.append(self.src_list[-1] + 1)
+                self.createSRPMSplitDir()
+                fit = src_list[-1]
+
+            # now link the srpm to the disc we found (or created) that had room
             os.link("%s/%s" % (self.src_dir, srpm_list[i][1]),
-                    "%s-disc%d/SRPMS/%s" % (self.dist_dir, self.getLeastUsedTree()[1], srpm_list[i][1]))
+                    "%s-disc%d/SRPMS/%s" % (self.dist_dir, fit, srpm_list[i][1]))
+            src_dict[fit] = src_dict.setdefault(fit, 0) + srpmsize
         
-        for i in range(0, len(srpm_disc_list)):
-            self.reportSizes(srpm_disc_list[i])
+        for i in range(0, len(src_list)):
+            self.reportSizes(src_list[i])
 
 
     def main(self):
-- 
1.6.2.2



More information about the rel-eng mailing list