Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Unified Diff: recipe_engine/package.py

Issue 1849903002: Perform Git operations without changing CWD. (Closed) Base URL: https://github.com/luci/recipes-py@master
Patch Set: Cleaner. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | unittests/package_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: recipe_engine/package.py
diff --git a/recipe_engine/package.py b/recipe_engine/package.py
index 57f279070e0a20621d11a7d1a1da650df2b24542..1c0e63fe7cfe0ead8c6f9dc43ddd9f5568204ff0 100644
--- a/recipe_engine/package.py
+++ b/recipe_engine/package.py
@@ -196,21 +196,30 @@ class GitRepoSpec(RepoSpec):
'branch="%(branch)s", revision="%(revision)s", '
'path="%(path)s"}' % self.__dict__)
+ def run_git(self, context, *args):
+ cmd = [self._git]
+ if context is not None:
+ cmd += ['--git-dir', os.path.join(self._dep_dir(context), '.git')]
+ cmd += list(args)
+
+ logging.info('Running: %s', cmd)
+ return subprocess.check_output(cmd)
+
def checkout(self, context):
dep_dir = self._dep_dir(context)
- logging.info('Freshening repository %s' % dep_dir)
+ logging.info('Freshening repository %s', dep_dir)
if not os.path.isdir(dep_dir):
- _run_cmd([self._git, 'clone', self.repo, dep_dir])
+ self.run_git(None, 'clone', self.repo, dep_dir)
elif not os.path.isdir(os.path.join(dep_dir, '.git')):
raise UncleanFilesystemError('%s exists but is not a git repo' % dep_dir)
try:
- subprocess.check_output([self._git, 'rev-parse', '-q', '--verify',
- '%s^{commit}' % self.revision], cwd=dep_dir)
+ self.run_git(context, 'rev-parse', '-q', '--verify',
+ '%s^{commit}' % self.revision)
except subprocess.CalledProcessError:
- _run_cmd([self._git, 'fetch'], cwd=dep_dir)
- _run_cmd([self._git, 'reset', '-q', '--hard', self.revision], cwd=dep_dir)
+ self.run_git(context, 'fetch')
+ self.run_git(context, 'reset', '-q', '--hard', self.revision)
def check_checkout(self, context):
dep_dir = self._dep_dir(context)
@@ -221,9 +230,7 @@ class GitRepoSpec(RepoSpec):
raise UncleanFilesystemError('Dependency %s is not a git repo' %
dep_dir)
- git_status_command = [self._git, 'status', '--porcelain']
- logging.info('%s', git_status_command)
- output = subprocess.check_output(git_status_command, cwd=dep_dir)
+ output = self.run_git(context, 'status', '--porcelain')
if output:
raise UncleanFilesystemError('Dependency %s is unclean:\n%s' %
(dep_dir, output))
@@ -259,25 +266,18 @@ class GitRepoSpec(RepoSpec):
def _raw_updates(self, context, subdir):
self.checkout(context)
- _run_cmd([self._git, 'fetch'], cwd=self._dep_dir(context))
- args = [self._git, 'rev-list', '--reverse',
+ self.run_git(context, 'fetch')
+ args = ['rev-list', '--reverse',
'%s..origin/%s' % (self.revision, self.branch)]
if subdir:
# We add proto_file to the list of paths to check because it might contain
# other upstream rolls, which we want.
args.extend(['--', subdir + os.path.sep, self.proto_file(context).path])
- git = subprocess.Popen(
- args, stdout=subprocess.PIPE, cwd=self._dep_dir(context))
- (stdout, _) = git.communicate()
- return stdout
+ return self.run_git(context, *args)
def _get_commit_info(self, rev, context):
- author = subprocess.check_output(
- [self._git, 'show', '-s', '--pretty=%aE', rev],
- cwd=self._dep_dir(context)).strip()
- message = subprocess.check_output(
- [self._git, 'show', '-s', '--pretty=%B', rev],
- cwd=self._dep_dir(context)).strip()
+ author = self.run_git(context, 'show', '-s', '--pretty=%aE', rev).strip()
+ message = self.run_git(context, 'show', '-s', '--pretty=%B', rev).strip()
return CommitInfo(author, message, self.project_id, rev)
def _dep_dir(self, context):
@@ -657,12 +657,6 @@ class PackageDeps(object):
return os.path.join(self._context.repo_root, 'recipes.py')
-def _run_cmd(cmd, cwd=None):
- cwd_str = ' (in %s)' % cwd if cwd else ''
- logging.info('%s%s', cmd, cwd_str)
- subprocess.check_call(cmd, cwd=cwd)
-
-
def _merge2(xs, ys, compare=lambda x, y: x <= y):
"""Merges two sorted iterables, preserving sort order.
« no previous file with comments | « no previous file | unittests/package_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698