]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/git.py
Add compat.items() and use it
[bup.git] / lib / bup / git.py
index 9eca25d9cc7f039750e099dc4d3f7dfe9c5d2fa7..8150f7c0c593ef3a1795b0866ee16b8a1b3282f7 100644 (file)
@@ -14,7 +14,7 @@ from bup.helpers import (Sha1, add_error, chunkyreader, debug1, debug2,
                          hostname, localtime, log, merge_iter,
                          mmap_read, mmap_readwrite,
                          parse_num,
-                         progress, qprogress, stat_if_exists,
+                         progress, qprogress, shstr, stat_if_exists,
                          unlink, username, userfullname,
                          utc_offset_str)
 
@@ -36,7 +36,7 @@ class GitError(Exception):
 def _git_wait(cmd, p):
     rv = p.wait()
     if rv != 0:
-        raise GitError('%s returned %d' % (cmd, rv))
+        raise GitError('%s returned %d' % (shstr(cmd), rv))
 
 def _git_capture(argv):
     p = subprocess.Popen(argv, stdout=subprocess.PIPE, preexec_fn = _gitenv())
@@ -552,7 +552,7 @@ class PackIdxList:
             if self.bloom is None and os.path.exists(bfull):
                 self.bloom = bloom.ShaBloom(bfull)
             self.packs = list(set(d.values()))
-            self.packs.sort(lambda x,y: -cmp(len(x),len(y)))
+            self.packs.sort(reverse=True, key=lambda x: len(x))
             if self.bloom and self.bloom.valid() and len(self.bloom) >= len(self):
                 self.do_bloom = True
             else:
@@ -923,16 +923,7 @@ def read_ref(refname, repo_dir = None):
         return None
 
 
-def rev_list(ref_or_refs, count=None, parse=None, format=None, repo_dir=None):
-    """Yield information about commits as per "git rev-list".  If a format
-    is not provided, yield one hex hash at a time.  If a format is
-    provided, pass it to rev-list and call parse(git_stdout) for each
-    commit with the stream positioned just after the rev-list "commit
-    HASH" header line.  When a format is provided yield (oidx,
-    parse(git_stdout)) for each commit.
-
-    """
-    assert bool(parse) == bool(format)
+def rev_list_invocation(ref_or_refs, count=None, format=None):
     if isinstance(ref_or_refs, compat.str_type):
         refs = (ref_or_refs,)
     else:
@@ -940,15 +931,30 @@ def rev_list(ref_or_refs, count=None, parse=None, format=None, repo_dir=None):
     argv = ['git', 'rev-list']
     if isinstance(count, Integral):
         argv.extend(['-n', str(count)])
-    else:
-        assert not count
+    elif count:
+        raise ValueError('unexpected count argument %r' % count)
+
     if format:
         argv.append('--pretty=format:' + format)
     for ref in refs:
         assert not ref.startswith('-')
         argv.append(ref)
     argv.append('--')
-    p = subprocess.Popen(argv,
+    return argv
+
+
+def rev_list(ref_or_refs, count=None, parse=None, format=None, repo_dir=None):
+    """Yield information about commits as per "git rev-list".  If a format
+    is not provided, yield one hex hash at a time.  If a format is
+    provided, pass it to rev-list and call parse(git_stdout) for each
+    commit with the stream positioned just after the rev-list "commit
+    HASH" header line.  When a format is provided yield (oidx,
+    parse(git_stdout)) for each commit.
+
+    """
+    assert bool(parse) == bool(format)
+    p = subprocess.Popen(rev_list_invocation(ref_or_refs, count=count,
+                                             format=format),
                          preexec_fn = _gitenv(repo_dir),
                          stdout = subprocess.PIPE)
     if not format: