[PATCH] Update the xml "packages" attr on failures. BZ 1022001

Zdenek Pavlas <[email protected]> Tue, 22 Oct 2013 17:29:50 +0200
Newsgroups gmane.linux.rpm.metadata
Message-ID <[email protected]>
When some rpms were not processed, this updates the xml
attribute in the root tag, and recompresses the data.
Ugly, but at least the no-errors case is for free.
---
 createrepo/__init__.py | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/createrepo/__init__.py b/createrepo/__init__.py
index dfdc8ab..cf6bd6b 100644
--- a/createrepo/__init__.py
+++ b/createrepo/__init__.py
@@ -670,6 +670,9 @@ class MetaDataGenerator:
                         return # EOF, EOF
                     if stream is job.stdout:
                         if line.startswith('*** '):
+                            if line == '*** \n':
+                                # rpm not found
+                                return True
                             # get data, save to local files
                             for out, size in zip(files, line[4:].split()):
                                 out.write(stream.read(int(size)))
@@ -678,12 +681,14 @@ class MetaDataGenerator:
                     else:
                         self.callback.errorlog('Worker %s: %s' % (num, line.rstrip()))
 
+            err = 0
             for i, pkg in enumerate(pkgfiles):
                 # insert cached packages
                 save_keptpkgs(pkg)
 
                 # save output to local files
-                log_messages(i % self.conf.workers)
+                if log_messages(i % self.conf.workers):
+                    err += 1
 
             for (num, job) in worker_jobs.items():
                 # process remaining messages on stderr
@@ -697,6 +702,35 @@ class MetaDataGenerator:
             if not self.conf.quiet:
                 self.callback.log("Workers Finished")
                     
+            if err:
+                # need to decrement the package counts
+                hdr_end = ' packages="%s">' % self.pkgcount
+                self.pkgcount -= err
+                self.callback.log(_('Recompressing primary metadata'))
+                for md in 'primary', 'filelists', 'other':
+                    # flfile instead of filelistsfile
+                    attr = (md == 'filelists' and 'fl' or md) + 'file'
+
+                    # close, rename and reopen
+                    getattr(self, attr).close()
+                    fpz = getattr(self.conf, md + 'file') + '.' + 'gz'
+                    fpz = os.path.join(self.conf.outputdir, self.conf.tempdir, fpz)
+                    os.rename(fpz, fpz + '.old')
+                    src = compressOpen(fpz + '.old')
+
+                    # set up new xml headers
+                    dst = getattr(self, '_setup' + md.capitalize())()
+                    setattr(self, attr, dst)
+
+                    # append old data
+                    buf = src.read(0x10000).split(hdr_end, 1)[1]
+                    while buf:
+                        dst.write(buf)
+                        buf = src.read(0x10000)
+
+                    # unlink the old file
+                    os.unlink(fpz + '.old')
+
             for pkgfile in pkgfiles:
                 if self.conf.deltas:
                     try:
-- 
1.7.11.7