| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Gclient-specific SCM-specific operations.""" | 5 """Gclient-specific SCM-specific operations.""" |
| 6 | 6 |
| 7 from __future__ import print_function | 7 from __future__ import print_function |
| 8 | 8 |
| 9 import errno | 9 import errno |
| 10 import logging | 10 import logging |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 cwd=self.checkout_path, | 293 cwd=self.checkout_path, |
| 294 filter_fn=GitDiffFilterer(self.relpath).Filter, print_func=self.Print) | 294 filter_fn=GitDiffFilterer(self.relpath).Filter, print_func=self.Print) |
| 295 | 295 |
| 296 def _FetchAndReset(self, revision, file_list, options): | 296 def _FetchAndReset(self, revision, file_list, options): |
| 297 """Equivalent to git fetch; git reset.""" | 297 """Equivalent to git fetch; git reset.""" |
| 298 quiet = [] | 298 quiet = [] |
| 299 if not options.verbose: | 299 if not options.verbose: |
| 300 quiet = ['--quiet'] | 300 quiet = ['--quiet'] |
| 301 self._UpdateBranchHeads(options, fetch=False) | 301 self._UpdateBranchHeads(options, fetch=False) |
| 302 | 302 |
| 303 cfg = gclient_utils.DefaultIndexPackConfig(self.url) | 303 self._Fetch(options, prune=True, quiet=options.verbose) |
| 304 fetch_cmd = cfg + ['fetch', self.remote, '--prune'] | |
| 305 self._Run(fetch_cmd + quiet, options, retry=True) | |
| 306 self._Run(['reset', '--hard', revision] + quiet, options) | 304 self._Run(['reset', '--hard', revision] + quiet, options) |
| 307 if file_list is not None: | 305 if file_list is not None: |
| 308 files = self._Capture(['ls-files']).splitlines() | 306 files = self._Capture(['ls-files']).splitlines() |
| 309 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) | 307 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
| 310 | 308 |
| 311 def _DisableHooks(self): | 309 def _DisableHooks(self): |
| 312 hook_dir = os.path.join(self.checkout_path, '.git', 'hooks') | 310 hook_dir = os.path.join(self.checkout_path, '.git', 'hooks') |
| 313 if not os.path.isdir(hook_dir): | 311 if not os.path.isdir(hook_dir): |
| 314 return | 312 return |
| 315 for f in os.listdir(hook_dir): | 313 for f in os.listdir(hook_dir): |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 elif rev.isdigit() and len(rev) < 7: | 713 elif rev.isdigit() and len(rev) < 7: |
| 716 # Handles an SVN rev. As an optimization, only verify an SVN revision as | 714 # Handles an SVN rev. As an optimization, only verify an SVN revision as |
| 717 # [0-9]{1,6} for now to avoid making a network request. | 715 # [0-9]{1,6} for now to avoid making a network request. |
| 718 if scm.GIT.IsGitSvn(cwd=self.checkout_path): | 716 if scm.GIT.IsGitSvn(cwd=self.checkout_path): |
| 719 local_head = scm.GIT.GetGitSvnHeadRev(cwd=self.checkout_path) | 717 local_head = scm.GIT.GetGitSvnHeadRev(cwd=self.checkout_path) |
| 720 if not local_head or local_head < int(rev): | 718 if not local_head or local_head < int(rev): |
| 721 try: | 719 try: |
| 722 logging.debug('Looking for git-svn configuration optimizations.') | 720 logging.debug('Looking for git-svn configuration optimizations.') |
| 723 if scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'], | 721 if scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'], |
| 724 cwd=self.checkout_path): | 722 cwd=self.checkout_path): |
| 725 scm.GIT.Capture(['fetch'], cwd=self.checkout_path) | 723 self._Fetch(options) |
| 726 except subprocess2.CalledProcessError: | 724 except subprocess2.CalledProcessError: |
| 727 logging.debug('git config --get svn-remote.svn.fetch failed, ' | 725 logging.debug('git config --get svn-remote.svn.fetch failed, ' |
| 728 'ignoring possible optimization.') | 726 'ignoring possible optimization.') |
| 729 if options.verbose: | 727 if options.verbose: |
| 730 self.Print('Running git svn fetch. This might take a while.\n') | 728 self.Print('Running git svn fetch. This might take a while.\n') |
| 731 scm.GIT.Capture(['svn', 'fetch'], cwd=self.checkout_path) | 729 scm.GIT.Capture(['svn', 'fetch'], cwd=self.checkout_path) |
| 732 try: | 730 try: |
| 733 sha1 = scm.GIT.GetBlessedSha1ForSvnRev( | 731 sha1 = scm.GIT.GetBlessedSha1ForSvnRev( |
| 734 cwd=self.checkout_path, rev=rev) | 732 cwd=self.checkout_path, rev=rev) |
| 735 except gclient_utils.Error, e: | 733 except gclient_utils.Error, e: |
| 736 sha1 = e.message | 734 sha1 = e.message |
| 737 self.Print('Warning: Could not find a git revision with accurate\n' | 735 self.Print('Warning: Could not find a git revision with accurate\n' |
| 738 '.DEPS.git that maps to SVN revision %s. Sync-ing to\n' | 736 '.DEPS.git that maps to SVN revision %s. Sync-ing to\n' |
| 739 'the closest sane git revision, which is:\n' | 737 'the closest sane git revision, which is:\n' |
| 740 ' %s\n' % (rev, e.message)) | 738 ' %s\n' % (rev, e.message)) |
| 741 if not sha1: | 739 if not sha1: |
| 742 raise gclient_utils.Error( | 740 raise gclient_utils.Error( |
| 743 ( 'It appears that either your git-svn remote is incorrectly\n' | 741 ( 'It appears that either your git-svn remote is incorrectly\n' |
| 744 'configured or the revision in your safesync_url is\n' | 742 'configured or the revision in your safesync_url is\n' |
| 745 'higher than git-svn remote\'s HEAD as we couldn\'t find a\n' | 743 'higher than git-svn remote\'s HEAD as we couldn\'t find a\n' |
| 746 'corresponding git hash for SVN rev %s.' ) % rev) | 744 'corresponding git hash for SVN rev %s.' ) % rev) |
| 747 else: | 745 else: |
| 748 if scm.GIT.IsValidRevision(cwd=self.checkout_path, rev=rev): | 746 if scm.GIT.IsValidRevision(cwd=self.checkout_path, rev=rev): |
| 749 sha1 = rev | 747 sha1 = rev |
| 750 else: | 748 else: |
| 751 # May exist in origin, but we don't have it yet, so fetch and look | 749 # May exist in origin, but we don't have it yet, so fetch and look |
| 752 # again. | 750 # again. |
| 753 scm.GIT.Capture(['fetch', self.remote], cwd=self.checkout_path) | 751 self._Fetch(options) |
| 754 if scm.GIT.IsValidRevision(cwd=self.checkout_path, rev=rev): | 752 if scm.GIT.IsValidRevision(cwd=self.checkout_path, rev=rev): |
| 755 sha1 = rev | 753 sha1 = rev |
| 756 | 754 |
| 757 if not sha1: | 755 if not sha1: |
| 758 raise gclient_utils.Error( | 756 raise gclient_utils.Error( |
| 759 ( 'We could not find a valid hash for safesync_url response "%s".\n' | 757 ( 'We could not find a valid hash for safesync_url response "%s".\n' |
| 760 'Safesync URLs with a git checkout currently require a git-svn\n' | 758 'Safesync URLs with a git checkout currently require a git-svn\n' |
| 761 'remote or a safesync_url that provides git sha1s. Please add a\n' | 759 'remote or a safesync_url that provides git sha1s. Please add a\n' |
| 762 'git-svn remote or change your safesync_url. For more info, see:\n' | 760 'git-svn remote or change your safesync_url. For more info, see:\n' |
| 763 'http://code.google.com/p/chromium/wiki/UsingNewGit' | 761 'http://code.google.com/p/chromium/wiki/UsingNewGit' |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1030 if quiet is None: | 1028 if quiet is None: |
| 1031 quiet = (not options.verbose) | 1029 quiet = (not options.verbose) |
| 1032 checkout_args = ['checkout'] | 1030 checkout_args = ['checkout'] |
| 1033 if force: | 1031 if force: |
| 1034 checkout_args.append('--force') | 1032 checkout_args.append('--force') |
| 1035 if quiet: | 1033 if quiet: |
| 1036 checkout_args.append('--quiet') | 1034 checkout_args.append('--quiet') |
| 1037 checkout_args.append(ref) | 1035 checkout_args.append(ref) |
| 1038 return self._Capture(checkout_args) | 1036 return self._Capture(checkout_args) |
| 1039 | 1037 |
| 1038 def _Fetch(self, options, remote=None, prune=False, quiet=False): |
| 1039 cfg = gclient_utils.DefaultIndexPackConfig(self.url) |
| 1040 fetch_cmd = cfg + [ |
| 1041 'fetch', |
| 1042 remote or self.remote, |
| 1043 ] |
| 1044 |
| 1045 if prune: |
| 1046 fetch_cmd.append('--prune') |
| 1047 if options.verbose: |
| 1048 fetch_cmd.append('--verbose') |
| 1049 elif quiet: |
| 1050 fetch_cmd.append('--quiet') |
| 1051 self._Run(fetch_cmd, options, show_header=options.verbose, retry=True) |
| 1052 |
| 1053 # Return the revision that was fetched; this will be stored in 'FETCH_HEAD' |
| 1054 return self._Capture(['rev-parse', '--verify', 'FETCH_HEAD']) |
| 1055 |
| 1040 def _UpdateBranchHeads(self, options, fetch=False): | 1056 def _UpdateBranchHeads(self, options, fetch=False): |
| 1041 """Adds, and optionally fetches, "branch-heads" refspecs if requested.""" | 1057 """Adds, and optionally fetches, "branch-heads" refspecs if requested.""" |
| 1042 if hasattr(options, 'with_branch_heads') and options.with_branch_heads: | 1058 if hasattr(options, 'with_branch_heads') and options.with_branch_heads: |
| 1043 config_cmd = ['config', 'remote.%s.fetch' % self.remote, | 1059 config_cmd = ['config', 'remote.%s.fetch' % self.remote, |
| 1044 '+refs/branch-heads/*:refs/remotes/branch-heads/*', | 1060 '+refs/branch-heads/*:refs/remotes/branch-heads/*', |
| 1045 '^\\+refs/branch-heads/\\*:.*$'] | 1061 '^\\+refs/branch-heads/\\*:.*$'] |
| 1046 self._Run(config_cmd, options) | 1062 self._Run(config_cmd, options) |
| 1047 if fetch: | 1063 if fetch: |
| 1048 cfg = gclient_utils.DefaultIndexPackConfig(self.url) | 1064 self._Fetch(options) |
| 1049 fetch_cmd = cfg + ['fetch', self.remote] | |
| 1050 if options.verbose: | |
| 1051 fetch_cmd.append('--verbose') | |
| 1052 self._Run(fetch_cmd, options, retry=True) | |
| 1053 | 1065 |
| 1054 def _Run(self, args, options, **kwargs): | 1066 def _Run(self, args, options, show_header=True, **kwargs): |
| 1067 # Disable 'unused options' warning | pylint: disable=W0613 |
| 1055 cwd = kwargs.setdefault('cwd', self.checkout_path) | 1068 cwd = kwargs.setdefault('cwd', self.checkout_path) |
| 1056 kwargs.setdefault('stdout', self.out_fh) | 1069 kwargs.setdefault('stdout', self.out_fh) |
| 1057 kwargs['filter_fn'] = self.filter | 1070 kwargs['filter_fn'] = self.filter |
| 1058 kwargs.setdefault('print_stdout', False) | 1071 kwargs.setdefault('print_stdout', False) |
| 1059 env = scm.GIT.ApplyEnvVars(kwargs) | 1072 env = scm.GIT.ApplyEnvVars(kwargs) |
| 1060 cmd = ['git'] + args | 1073 cmd = ['git'] + args |
| 1061 header = "running '%s' in '%s'" % (' '.join(cmd), cwd) | 1074 if show_header: |
| 1062 self.filter(header) | 1075 header = "running '%s' in '%s'" % (' '.join(cmd), cwd) |
| 1076 self.filter(header) |
| 1063 return gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs) | 1077 return gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs) |
| 1064 | 1078 |
| 1065 | 1079 |
| 1066 class SVNWrapper(SCMWrapper): | 1080 class SVNWrapper(SCMWrapper): |
| 1067 """ Wrapper for SVN """ | 1081 """ Wrapper for SVN """ |
| 1068 name = 'svn' | 1082 name = 'svn' |
| 1069 | 1083 |
| 1070 @staticmethod | 1084 @staticmethod |
| 1071 def BinaryExists(): | 1085 def BinaryExists(): |
| 1072 """Returns true if the command exists.""" | 1086 """Returns true if the command exists.""" |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1525 new_command.append('--force') | 1539 new_command.append('--force') |
| 1526 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1540 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
| 1527 new_command.extend(('--accept', 'theirs-conflict')) | 1541 new_command.extend(('--accept', 'theirs-conflict')) |
| 1528 elif options.manually_grab_svn_rev: | 1542 elif options.manually_grab_svn_rev: |
| 1529 new_command.append('--force') | 1543 new_command.append('--force') |
| 1530 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1544 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
| 1531 new_command.extend(('--accept', 'postpone')) | 1545 new_command.extend(('--accept', 'postpone')) |
| 1532 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1546 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
| 1533 new_command.extend(('--accept', 'postpone')) | 1547 new_command.extend(('--accept', 'postpone')) |
| 1534 return new_command | 1548 return new_command |
| OLD | NEW |