egencache --update-changelogs: write if needed
authorMichał Górny <mgorny@gentoo.org>
Sun, 3 Oct 2010 18:28:11 +0000 (20:28 +0200)
committerZac Medico <zmedico@gentoo.org>
Sun, 3 Oct 2010 19:18:05 +0000 (12:18 -0700)
Compare the last commit timestamp with the ChangeLog file timestamp to
guess whether a particular ChangeLog needs updating.

bin/egencache

index 06df4f820d513be1cd8291115215154a4a4eb4a1..b2f208fcea35047c66ef2168c17321384d160571 100755 (executable)
@@ -473,6 +473,12 @@ class GenChangeLogs(object):
                                subsequent_indent = '  '
                        )
 
+       @staticmethod
+       def grab(cmd):
+               p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+               return _unicode_decode(p.communicate()[0],
+                               encoding=_encodings['stdio'], errors='strict')
+
        def generate_changelog(self, cp):
                try:
                        output = codecs.open('ChangeLog',
@@ -492,13 +498,8 @@ class GenChangeLogs(object):
 
 ''' % (cp, time.strftime('%Y'))).lstrip())
 
-               def grab(cmd):
-                       p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-                       return _unicode_decode(p.communicate()[0],
-                                       encoding=_encodings['stdio'], errors='strict')
-
                # now grab all the commits
-               commits = grab(['git', 'rev-list', 'HEAD', '--', '.']).split()
+               commits = self.grab(['git', 'rev-list', 'HEAD', '--', '.']).split()
 
                for c in commits:
                        # Explaining the arguments:
@@ -510,7 +511,7 @@ class GenChangeLogs(object):
                        # -r (recursive) to get per-file changes
                        # then the commit-id and path.
 
-                       cinfo = grab(['git', 'diff-tree', '--name-status', '--no-renames',
+                       cinfo = self.grab(['git', 'diff-tree', '--name-status', '--no-renames',
                                        '--format=%ct %cN <%cE>%n%B', '--root', '--relative', '-r',
                                        c, '--', '.']).rstrip('\n').split('\n')
 
@@ -600,8 +601,16 @@ class GenChangeLogs(object):
 
                for cp in self._portdb.cp_all():
                        os.chdir(os.path.join(repo_path, cp))
-                       # XXX: support checking somehow whether the ChangeLog is up-to-date.
-                       if 1:
+
+                       # Determine whether ChangeLog is up-to-date by comparing
+                       # the newest commit timestamp with the ChangeLog timestamp.
+                       lmod = self.grab(['git', 'log', '--format=%ct', '-1', '.'])
+                       try:
+                               cmod = os.stat('ChangeLog').st_mtime
+                       except OSError:
+                               cmod = 0
+
+                       if float(cmod) < float(lmod):
                                self.generate_changelog(cp)
 
 def egencache_main(args):