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 import collections | 7 import collections |
8 import logging | 8 import logging |
9 import os | 9 import os |
10 import posixpath | 10 import posixpath |
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
794 gclient_utils.safe_makedirs(self.cache_dir) | 794 gclient_utils.safe_makedirs(self.cache_dir) |
795 if not os.path.exists(os.path.join(folder, 'config')): | 795 if not os.path.exists(os.path.join(folder, 'config')): |
796 gclient_utils.rmtree(folder) | 796 gclient_utils.rmtree(folder) |
797 cmd = ['clone'] + v + ['-c', 'core.deltaBaseCacheLimit=2g', | 797 cmd = ['clone'] + v + ['-c', 'core.deltaBaseCacheLimit=2g', |
798 '--progress', '--mirror'] | 798 '--progress', '--mirror'] |
799 | 799 |
800 if use_reference: | 800 if use_reference: |
801 cmd += ['--reference', os.path.abspath(self.checkout_path)] | 801 cmd += ['--reference', os.path.abspath(self.checkout_path)] |
802 | 802 |
803 self._Run(cmd + [url, folder], | 803 self._Run(cmd + [url, folder], |
804 options, git_filter=True, filter_fn=filter_fn, | 804 options, filter_fn=filter_fn, cwd=self.cache_dir, retry=True) |
805 cwd=self.cache_dir, retry=True) | |
806 else: | 805 else: |
807 # For now, assert that host/path/to/repo.git is identical. We may want | 806 # For now, assert that host/path/to/repo.git is identical. We may want |
808 # to relax this restriction in the future to allow for smarter cache | 807 # to relax this restriction in the future to allow for smarter cache |
809 # repo update schemes (such as pulling the same repo, but from a | 808 # repo update schemes (such as pulling the same repo, but from a |
810 # different host). | 809 # different host). |
811 existing_url = self._Capture(['config', 'remote.origin.url'], | 810 existing_url = self._Capture(['config', 'remote.origin.url'], |
812 cwd=folder) | 811 cwd=folder) |
813 assert self._NormalizeGitURL(existing_url) == self._NormalizeGitURL(url) | 812 assert self._NormalizeGitURL(existing_url) == self._NormalizeGitURL(url) |
814 | 813 |
815 if use_reference: | 814 if use_reference: |
816 with open(altfile, 'w') as f: | 815 with open(altfile, 'w') as f: |
817 f.write(os.path.abspath(checkout_objects)) | 816 f.write(os.path.abspath(checkout_objects)) |
818 | 817 |
819 # Would normally use `git remote update`, but it doesn't support | 818 # Would normally use `git remote update`, but it doesn't support |
820 # --progress, so use fetch instead. | 819 # --progress, so use fetch instead. |
821 self._Run(['fetch'] + v + ['--multiple', '--progress', '--all'], | 820 self._Run(['fetch'] + v + ['--multiple', '--progress', '--all'], |
822 options, git_filter=True, filter_fn=filter_fn, cwd=folder, | 821 options, filter_fn=filter_fn, cwd=folder, retry=True) |
823 retry=True) | |
824 | 822 |
825 # If the clone has an object dependency on the existing repo, break it | 823 # If the clone has an object dependency on the existing repo, break it |
826 # with repack and remove the linkage. | 824 # with repack and remove the linkage. |
827 if os.path.exists(altfile): | 825 if os.path.exists(altfile): |
828 self._Run(['repack', '-a'], options, cwd=folder) | 826 self._Run(['repack', '-a'], options, cwd=folder) |
829 os.remove(altfile) | 827 os.remove(altfile) |
830 return folder | 828 return folder |
831 | 829 |
832 def _Clone(self, revision, url, options): | 830 def _Clone(self, revision, url, options): |
833 """Clone a git repository from the given URL. | 831 """Clone a git repository from the given URL. |
(...skipping 18 matching lines...) Expand all Loading... | |
852 clone_cmd.append(url) | 850 clone_cmd.append(url) |
853 # If the parent directory does not exist, Git clone on Windows will not | 851 # If the parent directory does not exist, Git clone on Windows will not |
854 # create it, so we need to do it manually. | 852 # create it, so we need to do it manually. |
855 parent_dir = os.path.dirname(self.checkout_path) | 853 parent_dir = os.path.dirname(self.checkout_path) |
856 gclient_utils.safe_makedirs(parent_dir) | 854 gclient_utils.safe_makedirs(parent_dir) |
857 tmp_dir = tempfile.mkdtemp( | 855 tmp_dir = tempfile.mkdtemp( |
858 prefix='_gclient_%s_' % os.path.basename(self.checkout_path), | 856 prefix='_gclient_%s_' % os.path.basename(self.checkout_path), |
859 dir=parent_dir) | 857 dir=parent_dir) |
860 try: | 858 try: |
861 clone_cmd.append(tmp_dir) | 859 clone_cmd.append(tmp_dir) |
862 self._Run(clone_cmd, options, cwd=self._root_dir, git_filter=True, | 860 self._Run(clone_cmd, options, cwd=self._root_dir, retry=True) |
863 retry=True) | |
864 gclient_utils.safe_makedirs(self.checkout_path) | 861 gclient_utils.safe_makedirs(self.checkout_path) |
865 gclient_utils.safe_rename(os.path.join(tmp_dir, '.git'), | 862 gclient_utils.safe_rename(os.path.join(tmp_dir, '.git'), |
866 os.path.join(self.checkout_path, '.git')) | 863 os.path.join(self.checkout_path, '.git')) |
867 finally: | 864 finally: |
868 if os.listdir(tmp_dir): | 865 if os.listdir(tmp_dir): |
869 print('\n_____ removing non-empty tmp dir %s' % tmp_dir) | 866 print('\n_____ removing non-empty tmp dir %s' % tmp_dir) |
870 gclient_utils.rmtree(tmp_dir) | 867 gclient_utils.rmtree(tmp_dir) |
871 if revision.startswith('refs/heads/'): | 868 if revision.startswith('refs/heads/'): |
872 self._Run( | 869 self._Run( |
873 ['checkout', '--quiet', revision.replace('refs/heads/', '')], options) | 870 ['checkout', '--quiet', revision.replace('refs/heads/', '')], options) |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1030 config_cmd = ['config', 'remote.origin.fetch', | 1027 config_cmd = ['config', 'remote.origin.fetch', |
1031 '+refs/branch-heads/*:refs/remotes/branch-heads/*', | 1028 '+refs/branch-heads/*:refs/remotes/branch-heads/*', |
1032 '^\\+refs/branch-heads/\\*:.*$'] | 1029 '^\\+refs/branch-heads/\\*:.*$'] |
1033 self._Run(config_cmd, options) | 1030 self._Run(config_cmd, options) |
1034 if fetch: | 1031 if fetch: |
1035 fetch_cmd = ['-c', 'core.deltaBaseCacheLimit=2g', 'fetch', 'origin'] | 1032 fetch_cmd = ['-c', 'core.deltaBaseCacheLimit=2g', 'fetch', 'origin'] |
1036 if options.verbose: | 1033 if options.verbose: |
1037 fetch_cmd.append('--verbose') | 1034 fetch_cmd.append('--verbose') |
1038 self._Run(fetch_cmd, options, retry=True) | 1035 self._Run(fetch_cmd, options, retry=True) |
1039 | 1036 |
1040 def _Run(self, args, _options, git_filter=False, **kwargs): | 1037 def _Run(self, args, options, **kwargs): |
1041 kwargs.setdefault('cwd', self.checkout_path) | 1038 kwargs.setdefault('cwd', self.checkout_path) |
1039 git_filter = not options.verbose | |
1042 if git_filter: | 1040 if git_filter: |
iannucci
2013/10/25 18:54:43
I'd combine this, but I'm pretty indifferent.
| |
1043 kwargs['filter_fn'] = GitFilter(kwargs.get('filter_fn')) | 1041 kwargs['filter_fn'] = GitFilter(kwargs.get('filter_fn')) |
1044 kwargs.setdefault('print_stdout', False) | 1042 kwargs.setdefault('print_stdout', False) |
1045 # Don't prompt for passwords; just fail quickly and noisily. | 1043 # Don't prompt for passwords; just fail quickly and noisily. |
1046 # By default, git will use an interactive terminal prompt when a username/ | 1044 # By default, git will use an interactive terminal prompt when a username/ |
1047 # password is needed. That shouldn't happen in the chromium workflow, | 1045 # password is needed. That shouldn't happen in the chromium workflow, |
1048 # and if it does, then gclient may hide the prompt in the midst of a flood | 1046 # and if it does, then gclient may hide the prompt in the midst of a flood |
1049 # of terminal spew. The only indication that something has gone wrong | 1047 # of terminal spew. The only indication that something has gone wrong |
1050 # will be when gclient hangs unresponsively. Instead, we disable the | 1048 # will be when gclient hangs unresponsively. Instead, we disable the |
1051 # password prompt and simply allow git to fail noisily. The error | 1049 # password prompt and simply allow git to fail noisily. The error |
1052 # message produced by git will be copied to gclient's output. | 1050 # message produced by git will be copied to gclient's output. |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1452 new_command.append('--force') | 1450 new_command.append('--force') |
1453 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1451 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
1454 new_command.extend(('--accept', 'theirs-conflict')) | 1452 new_command.extend(('--accept', 'theirs-conflict')) |
1455 elif options.manually_grab_svn_rev: | 1453 elif options.manually_grab_svn_rev: |
1456 new_command.append('--force') | 1454 new_command.append('--force') |
1457 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1455 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
1458 new_command.extend(('--accept', 'postpone')) | 1456 new_command.extend(('--accept', 'postpone')) |
1459 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1457 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
1460 new_command.extend(('--accept', 'postpone')) | 1458 new_command.extend(('--accept', 'postpone')) |
1461 return new_command | 1459 return new_command |
OLD | NEW |