| Index: checkout.py
|
| diff --git a/checkout.py b/checkout.py
|
| index fcdea220a2373df292ff5502e035738789fc5e9c..ab449b4dad5346f75fac99ccbcbce315cc084290 100644
|
| --- a/checkout.py
|
| +++ b/checkout.py
|
| @@ -80,11 +80,16 @@ class CheckoutBase(object):
|
| """
|
| raise NotImplementedError()
|
|
|
| - def apply_patch(self, patches):
|
| + def apply_patch(self, patches, post_processor=None):
|
| """Applies a patch and returns the list of modified files.
|
|
|
| This function should throw patch.UnsupportedPatchFormat or
|
| PatchApplicationFailed when relevant.
|
| +
|
| + Args:
|
| + patches: patch.PatchSet object.
|
| + post_processor: list of lambda(checkout, patches) to call on each of the
|
| + modified files.
|
| """
|
| raise NotImplementedError()
|
|
|
| @@ -102,7 +107,9 @@ class RawCheckout(CheckoutBase):
|
| """Stubbed out."""
|
| pass
|
|
|
| - def apply_patch(self, patches):
|
| + def apply_patch(self, patches, post_processor=None):
|
| + """Ignores svn properties."""
|
| + post_processor = post_processor or []
|
| for p in patches:
|
| try:
|
| stdout = ''
|
| @@ -122,7 +129,8 @@ class RawCheckout(CheckoutBase):
|
| ['patch', '-p%s' % p.patchlevel],
|
| stdin=p.get(),
|
| cwd=self.project_path)
|
| - # Ignore p.svn_properties.
|
| + for post in post_processor:
|
| + post(self, p)
|
| except OSError, e:
|
| raise PatchApplicationFailed(p.filename, '%s%s' % (stdout, e))
|
| except subprocess.CalledProcessError, e:
|
| @@ -223,7 +231,6 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
|
| assert self.svn_url
|
|
|
| def prepare(self):
|
| - """Creates the initial checkouts for the repo."""
|
| # Will checkout if the directory is not present.
|
| if not os.path.isdir(self.project_path):
|
| logging.info('Checking out %s in %s' %
|
| @@ -234,8 +241,8 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
|
| self._last_seen_revision = revision
|
| return revision
|
|
|
| - def apply_patch(self, patches):
|
| - """Applies a patch."""
|
| + def apply_patch(self, patches, post_processor=None):
|
| + post_processor = post_processor or []
|
| for p in patches:
|
| try:
|
| stdout = ''
|
| @@ -274,6 +281,8 @@ class SvnCheckout(CheckoutBase, SvnMixIn):
|
| if fnmatch.fnmatch(p.filename, prop):
|
| stdout += self._check_output_svn(
|
| ['propset'] + value.split('=', 1) + [p.filename])
|
| + for post in post_processor:
|
| + post(self, p)
|
| except OSError, e:
|
| raise PatchApplicationFailed(p.filename, '%s%s' % (stdout, e))
|
| except subprocess.CalledProcessError, e:
|
| @@ -352,13 +361,19 @@ class GitCheckoutBase(CheckoutBase):
|
| 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."""
|
| + def apply_patch(self, patches, post_processor=None):
|
| + """Applies a patch on 'working_branch' and switch to it.
|
| +
|
| + Also commits the changes on the local branch.
|
| +
|
| + Ignores svn properties and raise an exception on unexpected ones.
|
| + """
|
| + post_processor = post_processor or []
|
| # It this throws, the checkout is corrupted. Maybe worth deleting it and
|
| # trying again?
|
| self._check_call_git(
|
| ['checkout', '-b', self.working_branch,
|
| - '%s/%s' % (self.remote, self.remote_branch)])
|
| + '%s/%s' % (self.remote, self.remote_branch), '--quiet'])
|
| for p in patches:
|
| try:
|
| stdout = ''
|
| @@ -387,6 +402,8 @@ class GitCheckoutBase(CheckoutBase):
|
| p.filename,
|
| 'Cannot apply svn property %s to file %s.' % (
|
| prop[0], p.filename))
|
| + for post in post_processor:
|
| + post(self, p)
|
| except OSError, e:
|
| raise PatchApplicationFailed(p.filename, '%s%s' % (stdout, e))
|
| except subprocess.CalledProcessError, e:
|
| @@ -492,6 +509,7 @@ class GitSvnCheckoutBase(GitCheckoutBase, SvnMixIn):
|
| kwargs = {}
|
| if self.commit_pwd:
|
| kwargs['stdin'] = self.commit_pwd + '\n'
|
| + kwargs['stderr'] = subprocess2.STDOUT
|
| self._check_call_git_svn(
|
| ['dcommit', '--rmdir', '--find-copies-harder',
|
| '--username', self.commit_user],
|
| @@ -547,8 +565,9 @@ class GitSvnPremadeCheckout(GitSvnCheckoutBase):
|
| assert self.remote == 'origin'
|
| # self.project_path doesn't exist yet.
|
| self._check_call_git(
|
| - ['clone', self.git_url, self.project_name],
|
| - cwd=self.root_dir)
|
| + ['clone', self.git_url, self.project_name, '--quiet'],
|
| + cwd=self.root_dir,
|
| + stderr=subprocess2.STDOUT)
|
| try:
|
| configured_svn_url = self._check_output_git(
|
| ['config', 'svn-remote.svn.url']).strip()
|
| @@ -591,8 +610,10 @@ class GitSvnCheckout(GitSvnCheckoutBase):
|
| ['clone',
|
| '--prefix', self.remote + '/',
|
| '-T', self.trunk,
|
| - self.svn_url, self.project_path],
|
| - cwd=self.root_dir)
|
| + self.svn_url, self.project_path,
|
| + '--quiet'],
|
| + cwd=self.root_dir,
|
| + stderr=subprocess2.STDOUT)
|
| super(GitSvnCheckout, self).prepare()
|
| return self._get_revision()
|
|
|
| @@ -608,8 +629,8 @@ class ReadOnlyCheckout(object):
|
| def get_settings(self, key):
|
| return self.checkout.get_settings(key)
|
|
|
| - def apply_patch(self, patches):
|
| - return self.checkout.apply_patch(patches)
|
| + def apply_patch(self, patches, post_processor=None):
|
| + return self.checkout.apply_patch(patches, post_processor)
|
|
|
| def commit(self, message, user): # pylint: disable=R0201
|
| logging.info('Would have committed for %s with message: %s' % (
|
|
|