]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/git.py
git.repo: don't unintentionally set global repodir
[bup.git] / lib / bup / git.py
index 9eca25d9cc7f039750e099dc4d3f7dfe9c5d2fa7..be9672210ee92e1e04d686b190040a774730c2f7 100644 (file)
@@ -3,6 +3,7 @@ bup repositories are in Git format. This library allows us to
 interact with the Git data structures.
 """
 
+from __future__ import absolute_import
 import errno, os, sys, zlib, time, subprocess, struct, stat, re, tempfile, glob
 from collections import namedtuple
 from itertools import islice
@@ -14,7 +15,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 +37,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())
@@ -133,7 +134,6 @@ def _git_date_str(epoch_sec, tz_offset_sec):
 
 def repo(sub = '', repo_dir=None):
     """Get the path to the git repository or one of its subdirectories."""
-    global repodir
     repo_dir = repo_dir or repodir
     if not repo_dir:
         raise GitError('You should call check_repo_or_die()')
@@ -141,7 +141,7 @@ def repo(sub = '', repo_dir=None):
     # If there's a .git subdirectory, then the actual repo is in there.
     gd = os.path.join(repo_dir, '.git')
     if os.path.exists(gd):
-        repodir = gd
+        repo_dir = gd
 
     return os.path.join(repo_dir, sub)
 
@@ -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: