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
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)
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())
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()')
# 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)
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:
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:
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: