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

Unified Diff: checkout.py

Issue 6995115: Make prepare() accept a revision argument. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Created 9 years, 6 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 | tests/checkout_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: checkout.py
diff --git a/checkout.py b/checkout.py
index 9f21acc906d4c6ff19146db67e677169c75d73ca..3531b91340112796aec2afaba88ae830f7612c15 100644
--- a/checkout.py
+++ b/checkout.py
@@ -80,11 +80,14 @@ class CheckoutBase(object):
def get_settings(self, key):
return get_code_review_setting(self.project_path, key)
- def prepare(self):
+ def prepare(self, revision):
"""Checks out a clean copy of the tree and removes any local modification.
This function shouldn't throw unless the remote repository is inaccessible,
there is no free disk space or hard issues like that.
+
+ Args:
+ revision: The revision it should sync to, SCM specific.
"""
raise NotImplementedError()
@@ -109,7 +112,7 @@ class RawCheckout(CheckoutBase):
To be used by the try server.
"""
- def prepare(self):
+ def prepare(self, revision):
"""Stubbed out."""
pass
@@ -244,17 +247,13 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
self.svn_url = svn_url
assert bool(self.commit_user) >= bool(self.commit_pwd)
- def prepare(self):
+ def prepare(self, revision):
# Will checkout if the directory is not present.
assert self.svn_url
if not os.path.isdir(self.project_path):
logging.info('Checking out %s in %s' %
(self.project_name, self.project_path))
- revision = self._revert()
- if revision != self._last_seen_revision:
- logging.info('Updated at revision %d' % revision)
- self._last_seen_revision = revision
- return revision
+ return self._revert(revision)
def apply_patch(self, patches):
for p in patches:
@@ -351,11 +350,13 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
'Couldn\'t make sense out of svn commit message:\n' + out)
return int(match.group(1))
- def _revert(self):
+ def _revert(self, revision):
"""Reverts local modifications or checks out if the directory is not
present. Use depot_tools's functionality to do this.
"""
flags = ['--ignore-externals']
+ if revision:
+ flags.extend(['--revision', str(revision)])
if not os.path.isdir(self.project_path):
logging.info(
'Directory %s is not present, checking it out.' % self.project_path)
@@ -365,9 +366,15 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
scm.SVN.Revert(self.project_path)
# Revive files that were deleted in scm.SVN.Revert().
self._check_call_svn(['update', '--force'] + flags)
+ return self._get_revision()
+ def _get_revision(self):
out = self._check_output_svn(['info', '.'])
- return int(self._parse_svn_info(out, 'revision'))
+ revision = int(self._parse_svn_info(out, 'revision'))
+ if revision != self._last_seen_revision:
+ logging.info('Updated at revision %d' % revision)
Dirk Pranke 2011/06/10 21:07:45 Nit: "Updated to revision" ?
+ self._last_seen_revision = revision
+ return revision
class GitCheckoutBase(CheckoutBase):
@@ -381,7 +388,7 @@ class GitCheckoutBase(CheckoutBase):
self.remote_branch = remote_branch
self.working_branch = 'working_branch'
- def prepare(self):
+ def prepare(self, revision):
"""Resets the git repository in a clean state.
Checks it out if not present and deletes the working branch.
@@ -389,12 +396,21 @@ class GitCheckoutBase(CheckoutBase):
assert self.remote_branch
assert os.path.isdir(self.project_path)
self._check_call_git(['reset', '--hard', '--quiet'])
- branches, active = self._branches()
- if active != 'master':
- self._check_call_git(['checkout', 'master', '--force', '--quiet'])
- self._check_call_git(['pull', self.remote, self.remote_branch, '--quiet'])
- if self.working_branch in branches:
- self._call_git(['branch', '-D', self.working_branch])
+ if revision:
+ try:
+ revision = self._check_output_git(['rev-parse', revision])
+ except subprocess.CalledProcessError:
+ self._check_call_git(
+ ['fetch', self.remote, self.remote_branch, '--quiet'])
+ revision = self._check_output_git(['rev-parse', revision])
+ self._check_call_git(['checkout', '--force', '--quiet', revision])
+ else:
+ branches, active = self._branches()
+ if active != 'master':
+ self._check_call_git(['checkout', '--force', '--quiet', 'master'])
+ self._check_call_git(['pull', self.remote, self.remote_branch, '--quiet'])
+ if self.working_branch in branches:
+ self._call_git(['branch', '-D', self.working_branch])
def apply_patch(self, patches):
"""Applies a patch on 'working_branch' and switch to it.
@@ -510,25 +526,37 @@ class GitSvnCheckoutBase(GitCheckoutBase, SvnMixIn):
assert self.trunk
self._cache_svn_auth()
- def prepare(self):
+ def prepare(self, revision):
"""Resets the git repository in a clean state."""
self._check_call_git(['reset', '--hard', '--quiet'])
- branches, active = self._branches()
- if active != 'master':
- if not 'master' in branches:
+ if revision:
+ try:
+ revision = self._check_output_git(
+ ['svn', 'find-rev', 'r%d' % revision])
+ except subprocess.CalledProcessError:
self._check_call_git(
- ['checkout', '--quiet', '-b', 'master',
- '%s/%s' % (self.remote, self.remote_branch)])
- else:
- self._check_call_git(['checkout', 'master', '--force', '--quiet'])
- # git svn rebase --quiet --quiet doesn't work, use two steps to silence it.
- self._check_call_git_svn(['fetch', '--quiet', '--quiet'])
- self._check_call_git(
- ['rebase', '--quiet', '--quiet',
- '%s/%s' % (self.remote, self.remote_branch)])
- if self.working_branch in branches:
- self._call_git(['branch', '-D', self.working_branch])
- return int(self._git_svn_info('revision'))
+ ['fetch', self.remote, self.remote_branch, '--quiet'])
+ revision = self._check_output_git(
+ ['svn', 'find-rev', 'r%d' % revision])
+ super(GitSvnCheckoutBase, self).prepare(revision)
+ else:
+ branches, active = self._branches()
+ if active != 'master':
+ if not 'master' in branches:
+ self._check_call_git(
+ ['checkout', '--quiet', '-b', 'master',
+ '%s/%s' % (self.remote, self.remote_branch)])
+ else:
+ self._check_call_git(['checkout', 'master', '--force', '--quiet'])
+ # git svn rebase --quiet --quiet doesn't work, use two steps to silence
+ # it.
+ self._check_call_git_svn(['fetch', '--quiet', '--quiet'])
+ self._check_call_git(
+ ['rebase', '--quiet', '--quiet',
+ '%s/%s' % (self.remote, self.remote_branch)])
+ if self.working_branch in branches:
+ self._call_git(['branch', '-D', self.working_branch])
+ return self._get_revision()
def _git_svn_info(self, key):
"""Calls git svn info. This doesn't support nor need --config-dir."""
@@ -595,7 +623,7 @@ class GitSvnPremadeCheckout(GitSvnCheckoutBase):
self.git_url = git_url
assert self.git_url
- def prepare(self):
+ def prepare(self, revision):
"""Creates the initial checkout for the repo."""
if not os.path.isdir(self.project_path):
logging.info('Checking out %s in %s' %
@@ -619,8 +647,7 @@ class GitSvnPremadeCheckout(GitSvnCheckoutBase):
'-T', self.trunk,
self.svn_url])
self._check_call_git_svn(['fetch'])
- super(GitSvnPremadeCheckout, self).prepare()
- return self._get_revision()
+ return super(GitSvnPremadeCheckout, self).prepare(revision)
class GitSvnCheckout(GitSvnCheckoutBase):
@@ -637,8 +664,9 @@ class GitSvnCheckout(GitSvnCheckoutBase):
commit_user, commit_pwd,
svn_url, trunk, post_processors)
- def prepare(self):
+ def prepare(self, revision):
"""Creates the initial checkout for the repo."""
+ assert not revision, 'Implement revision if necessary'
if not os.path.isdir(self.project_path):
logging.info('Checking out %s in %s' %
(self.project_name, self.project_path))
@@ -652,8 +680,7 @@ class GitSvnCheckout(GitSvnCheckoutBase):
'--quiet'],
cwd=self.root_dir,
stderr=subprocess2.STDOUT)
- super(GitSvnCheckout, self).prepare()
- return self._get_revision()
+ return super(GitSvnCheckout, self).prepare(revision)
class ReadOnlyCheckout(object):
@@ -661,8 +688,8 @@ class ReadOnlyCheckout(object):
def __init__(self, checkout):
self.checkout = checkout
- def prepare(self):
- return self.checkout.prepare()
+ def prepare(self, revision):
+ return self.checkout.prepare(revision)
def get_settings(self, key):
return self.checkout.get_settings(key)
« no previous file with comments | « no previous file | tests/checkout_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698