Index: gclient_scm.py |
diff --git a/gclient_scm.py b/gclient_scm.py |
index f92e4f83104ef6207c86771a8afeba273af5330a..b6ee8a08ac6e3798b6177e77133a2eba3b0be17c 100644 |
--- a/gclient_scm.py |
+++ b/gclient_scm.py |
@@ -127,8 +127,8 @@ class GitWrapper(SCMWrapper): |
""" |
def diff(self, options, args, file_list): |
- merge_base = self._Run(['merge-base', 'HEAD', 'origin']) |
- self._Run(['diff', merge_base], redirect_stdout=False) |
+ merge_base = self._Capture(['merge-base', 'HEAD', 'origin']) |
+ self._Run(['diff', merge_base]) |
def export(self, options, args, file_list): |
"""Export a clean directory tree into the given path. |
@@ -140,8 +140,7 @@ class GitWrapper(SCMWrapper): |
export_path = os.path.abspath(os.path.join(args[0], self.relpath)) |
if not os.path.exists(export_path): |
os.makedirs(export_path) |
- self._Run(['checkout-index', '-a', '--prefix=%s/' % export_path], |
- redirect_stdout=False) |
+ self._Run(['checkout-index', '-a', '--prefix=%s/' % export_path]) |
def pack(self, options, args, file_list): |
"""Generates a patch file which can be applied to the root of the |
@@ -150,7 +149,7 @@ class GitWrapper(SCMWrapper): |
The patch file is generated from a diff of the merge base of HEAD and |
its upstream branch. |
""" |
- merge_base = self._Run(['merge-base', 'HEAD', 'origin']) |
+ merge_base = self._Capture(['merge-base', 'HEAD', 'origin']) |
gclient_utils.CheckCallAndFilter( |
['git', 'diff', merge_base], |
cwd=self.checkout_path, |
@@ -202,7 +201,7 @@ class GitWrapper(SCMWrapper): |
if not os.path.exists(self.checkout_path): |
self._Clone(revision, url, options) |
- files = self._Run(['ls-files']).split() |
+ files = self._Capture(['ls-files']).split() |
file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
if not verbose: |
# Make the output a little prettier. It's nice to have some whitespace |
@@ -283,13 +282,13 @@ class GitWrapper(SCMWrapper): |
# This is a big hammer, debatable if it should even be here... |
if options.force or options.reset: |
- self._Run(['reset', '--hard', 'HEAD'], redirect_stdout=False) |
+ self._Run(['reset', '--hard', 'HEAD']) |
if current_type == 'detached': |
# case 0 |
self._CheckClean(rev_str) |
self._CheckDetachedHead(rev_str, options) |
- self._Run(['checkout', '--quiet', '%s^0' % revision]) |
+ self._Capture(['checkout', '--quiet', '%s^0' % revision]) |
if not printed_path: |
options.stdout.write('\n_____ %s%s\n' % (self.relpath, rev_str)) |
elif current_type == 'hash': |
@@ -327,7 +326,7 @@ class GitWrapper(SCMWrapper): |
raise gclient_utils.Error(switch_error) |
else: |
# case 3 - the default case |
- files = self._Run(['diff', upstream_branch, '--name-only']).split() |
+ files = self._Capture(['diff', upstream_branch, '--name-only']).split() |
if verbose: |
options.stdout.write('Trying fast-forward merge to branch : %s\n' % |
upstream_branch) |
@@ -426,13 +425,13 @@ class GitWrapper(SCMWrapper): |
if deps_revision.startswith('refs/heads/'): |
deps_revision = deps_revision.replace('refs/heads/', 'origin/') |
- files = self._Run(['diff', deps_revision, '--name-only']).split() |
- self._Run(['reset', '--hard', deps_revision], redirect_stdout=False) |
+ files = self._Capture(['diff', deps_revision, '--name-only']).split() |
+ self._Run(['reset', '--hard', deps_revision]) |
file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
def revinfo(self, options, args, file_list): |
- """Display revision""" |
- return self._Run(['rev-parse', 'HEAD']) |
+ """Returns revision""" |
+ return self._Capture(['rev-parse', 'HEAD']) |
def runhooks(self, options, args, file_list): |
self.status(options, args, file_list) |
@@ -444,9 +443,9 @@ class GitWrapper(SCMWrapper): |
('\n________ couldn\'t run status in %s:\nThe directory ' |
'does not exist.\n') % self.checkout_path) |
else: |
- merge_base = self._Run(['merge-base', 'HEAD', 'origin']) |
- self._Run(['diff', '--name-status', merge_base], redirect_stdout=False) |
- files = self._Run(['diff', '--name-only', merge_base]).split() |
+ merge_base = self._Capture(['merge-base', 'HEAD', 'origin']) |
+ self._Run(['diff', '--name-status', merge_base]) |
+ files = self._Capture(['diff', '--name-only', merge_base]).split() |
file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
def FullUrlForRelativeUrl(self, url): |
@@ -481,7 +480,7 @@ class GitWrapper(SCMWrapper): |
for _ in range(3): |
try: |
- self._Run(clone_cmd, cwd=self._root_dir, redirect_stdout=False) |
+ self._Run(clone_cmd, cwd=self._root_dir) |
break |
except gclient_utils.Error, e: |
# TODO(maruel): Hackish, should be fixed by moving _Run() to |
@@ -498,7 +497,7 @@ class GitWrapper(SCMWrapper): |
if detach_head: |
# Squelch git's very verbose detached HEAD warning and use our own |
- self._Run(['checkout', '--quiet', '%s^0' % revision]) |
+ self._Capture(['checkout', '--quiet', '%s^0' % revision]) |
options.stdout.write( |
('Checked out %s to a detached HEAD. Before making any commits\n' |
'in this repo, you should use \'git checkout <branch>\' to switch to\n' |
@@ -508,7 +507,7 @@ class GitWrapper(SCMWrapper): |
def _AttemptRebase(self, upstream, files, options, newbase=None, |
branch=None, printed_path=False): |
"""Attempt to rebase onto either upstream or, if specified, newbase.""" |
- files.extend(self._Run(['diff', upstream, '--name-only']).split()) |
+ files.extend(self._Capture(['diff', upstream, '--name-only']).split()) |
revision = upstream |
if newbase: |
revision = newbase |
@@ -545,7 +544,7 @@ class GitWrapper(SCMWrapper): |
"work in your current branch!" |
" (y)es / (q)uit / (s)how : ")) |
if re.match(r'yes|y', rebase_action, re.I): |
- self._Run(['reset', '--hard', 'HEAD'], redirect_stdout=False) |
+ self._Run(['reset', '--hard', 'HEAD']) |
# Should this be recursive? |
rebase_output, rebase_err = scm.GIT.Capture(rebase_cmd, |
self.checkout_path) |
@@ -638,41 +637,31 @@ class GitWrapper(SCMWrapper): |
'\tSee man git-rebase for details.\n' |
% (self.relpath, rev_str)) |
# Let's just save off the commit so we can proceed. |
- name = "saved-by-gclient-" + self._Run(["rev-parse", "--short", "HEAD"]) |
- self._Run(["branch", name]) |
+ name = ('saved-by-gclient-' + |
+ self._Capture(['rev-parse', '--short', 'HEAD'])) |
+ self._Capture(['branch', name]) |
options.stdout.write( |
'\n_____ found an unreferenced commit and saved it as \'%s\'\n' % |
name) |
def _GetCurrentBranch(self): |
# Returns name of current branch or None for detached HEAD |
- branch = self._Run(['rev-parse', '--abbrev-ref=strict', 'HEAD']) |
+ branch = self._Capture(['rev-parse', '--abbrev-ref=strict', 'HEAD']) |
if branch == 'HEAD': |
return None |
return branch |
- def _Run(self, args, cwd=None, redirect_stdout=True): |
- # TODO(maruel): Merge with Capture or better gclient_utils.CheckCall(). |
- if cwd is None: |
- cwd = self.checkout_path |
- stdout = None |
- if redirect_stdout: |
- stdout = subprocess.PIPE |
- if cwd == None: |
- cwd = self.checkout_path |
- cmd = ['git'] + args |
- logging.debug(cmd) |
+ def _Capture(self, args): |
+ return gclient_utils.CheckCall(['git'] + args, |
+ cwd=self.checkout_path)[0].strip() |
+ |
+ def _Run(self, args, **kwargs): |
+ kwargs.setdefault('cwd', self.checkout_path) |
try: |
- sp = gclient_utils.Popen(cmd, cwd=cwd, stdout=stdout) |
- output = sp.communicate()[0] |
+ gclient_utils.Popen(['git'] + args, **kwargs).communicate() |
except OSError: |
raise gclient_utils.Error("git command '%s' failed to run." % |
' '.join(cmd) + "\nCheck that you have git installed.") |
- if sp.returncode: |
- raise gclient_utils.Error('git command %s returned %d' % |
- (args[0], sp.returncode)) |
- if output is not None: |
- return output.strip() |
class SVNWrapper(SCMWrapper): |