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

Side by Side Diff: git_cl.py

Issue 1777693002: Enable git-cl-land for git-cache checkouts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: set git_cache.Mirror.cachepath 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 # Copyright (C) 2008 Evan Martin <martine@danga.com> 6 # Copyright (C) 2008 Evan Martin <martine@danga.com>
7 7
8 """A git-command for integrating reviews on Rietveld.""" 8 """A git-command for integrating reviews on Rietveld."""
9 9
10 from distutils.version import LooseVersion 10 from distutils.version import LooseVersion
(...skipping 29 matching lines...) Expand all
40 from third_party import colorama 40 from third_party import colorama
41 from third_party import httplib2 41 from third_party import httplib2
42 from third_party import upload 42 from third_party import upload
43 import auth 43 import auth
44 from luci_hacks import trigger_luci_job as luci_trigger 44 from luci_hacks import trigger_luci_job as luci_trigger
45 import clang_format 45 import clang_format
46 import commit_queue 46 import commit_queue
47 import dart_format 47 import dart_format
48 import fix_encoding 48 import fix_encoding
49 import gclient_utils 49 import gclient_utils
50 import git_cache
50 import git_common 51 import git_common
51 import git_footers 52 import git_footers
52 import owners 53 import owners
53 import owners_finder 54 import owners_finder
54 import presubmit_support 55 import presubmit_support
55 import rietveld 56 import rietveld
56 import scm 57 import scm
57 import subcommand 58 import subcommand
58 import subprocess2 59 import subprocess2
59 import watchlists 60 import watchlists
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 622
622 @staticmethod 623 @staticmethod
623 def GetRelativeRoot(): 624 def GetRelativeRoot():
624 return RunGit(['rev-parse', '--show-cdup']).strip() 625 return RunGit(['rev-parse', '--show-cdup']).strip()
625 626
626 def GetRoot(self): 627 def GetRoot(self):
627 if self.root is None: 628 if self.root is None:
628 self.root = os.path.abspath(self.GetRelativeRoot()) 629 self.root = os.path.abspath(self.GetRelativeRoot())
629 return self.root 630 return self.root
630 631
632 def GetGitMirror(self, remote='origin'):
633 """If this checkout is from a local git mirror, return a Mirror object."""
634 local_url = RunGit(['remote', 'get-url', remote]).strip()
smut 2016/03/09 22:17:31 "git remote get-url" is not available in all versi
635 if not os.path.isdir(local_url):
636 return None
637 git_cache.Mirror.SetCachePath(os.path.dirname(local_url))
638 remote_url = git_cache.Mirror.CacheDirToUrl(local_url)
639 # Use the /dev/null print_func to avoid terminal spew in WaitForRealCommit.
640 mirror = git_cache.Mirror(remote_url, print_func = lambda *args: None)
641 if mirror.exists():
642 return mirror
643 return None
644
631 def GetIsGitSvn(self): 645 def GetIsGitSvn(self):
632 """Return true if this repo looks like it's using git-svn.""" 646 """Return true if this repo looks like it's using git-svn."""
633 if self.is_git_svn is None: 647 if self.is_git_svn is None:
634 if self.GetPendingRefPrefix(): 648 if self.GetPendingRefPrefix():
635 # If PENDING_REF_PREFIX is set then it's a pure git repo no matter what. 649 # If PENDING_REF_PREFIX is set then it's a pure git repo no matter what.
636 self.is_git_svn = False 650 self.is_git_svn = False
637 else: 651 else:
638 # If you have any "svn-remote.*" config keys, we think you're using svn. 652 # If you have any "svn-remote.*" config keys, we think you're using svn.
639 self.is_git_svn = RunGitWithCode( 653 self.is_git_svn = RunGitWithCode(
640 ['config', '--local', '--get-regexp', r'^svn-remote\.'])[0] == 0 654 ['config', '--local', '--get-regexp', r'^svn-remote\.'])[0] == 0
(...skipping 2217 matching lines...) Expand 10 before | Expand all | Expand 10 after
2858 ]) 2872 ])
2859 else: 2873 else:
2860 RunGit(['commit', '-m', commit_desc.description]) 2874 RunGit(['commit', '-m', commit_desc.description])
2861 if base_has_submodules: 2875 if base_has_submodules:
2862 cherry_pick_commit = RunGit(['rev-list', 'HEAD^!']).rstrip() 2876 cherry_pick_commit = RunGit(['rev-list', 'HEAD^!']).rstrip()
2863 RunGit(['branch', CHERRY_PICK_BRANCH, svn_head]) 2877 RunGit(['branch', CHERRY_PICK_BRANCH, svn_head])
2864 RunGit(['checkout', CHERRY_PICK_BRANCH]) 2878 RunGit(['checkout', CHERRY_PICK_BRANCH])
2865 RunGit(['cherry-pick', cherry_pick_commit]) 2879 RunGit(['cherry-pick', cherry_pick_commit])
2866 if cmd == 'land': 2880 if cmd == 'land':
2867 remote, branch = cl.FetchUpstreamTuple(cl.GetBranch()) 2881 remote, branch = cl.FetchUpstreamTuple(cl.GetBranch())
2882 mirror = settings.GetGitMirror(remote)
2883 pushurl = mirror.url if mirror else remote
2868 pending_prefix = settings.GetPendingRefPrefix() 2884 pending_prefix = settings.GetPendingRefPrefix()
2869 if not pending_prefix or branch.startswith(pending_prefix): 2885 if not pending_prefix or branch.startswith(pending_prefix):
2870 # If not using refs/pending/heads/* at all, or target ref is already set 2886 # If not using refs/pending/heads/* at all, or target ref is already set
2871 # to pending, then push to the target ref directly. 2887 # to pending, then push to the target ref directly.
2872 retcode, output = RunGitWithCode( 2888 retcode, output = RunGitWithCode(
2873 ['push', '--porcelain', remote, 'HEAD:%s' % branch]) 2889 ['push', '--porcelain', pushurl, 'HEAD:%s' % branch])
2874 pushed_to_pending = pending_prefix and branch.startswith(pending_prefix) 2890 pushed_to_pending = pending_prefix and branch.startswith(pending_prefix)
2875 else: 2891 else:
2876 # Cherry-pick the change on top of pending ref and then push it. 2892 # Cherry-pick the change on top of pending ref and then push it.
2877 assert branch.startswith('refs/'), branch 2893 assert branch.startswith('refs/'), branch
2878 assert pending_prefix[-1] == '/', pending_prefix 2894 assert pending_prefix[-1] == '/', pending_prefix
2879 pending_ref = pending_prefix + branch[len('refs/'):] 2895 pending_ref = pending_prefix + branch[len('refs/'):]
2880 retcode, output = PushToGitPending(remote, pending_ref, branch) 2896 retcode, output = PushToGitPending(pushurl, pending_ref, branch)
2881 pushed_to_pending = (retcode == 0) 2897 pushed_to_pending = (retcode == 0)
2882 if retcode == 0: 2898 if retcode == 0:
2883 revision = RunGit(['rev-parse', 'HEAD']).strip() 2899 revision = RunGit(['rev-parse', 'HEAD']).strip()
2884 else: 2900 else:
2885 # dcommit the merge branch. 2901 # dcommit the merge branch.
2886 cmd_args = [ 2902 cmd_args = [
2887 'svn', 'dcommit', 2903 'svn', 'dcommit',
2888 '-C%s' % options.similarity, 2904 '-C%s' % options.similarity,
2889 '--no-rebase', '--rmdir', 2905 '--no-rebase', '--rmdir',
2890 ] 2906 ]
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2958 2974
2959 return 1 if killed else 0 2975 return 1 if killed else 0
2960 2976
2961 2977
2962 def WaitForRealCommit(remote, pushed_commit, local_base_ref, real_ref): 2978 def WaitForRealCommit(remote, pushed_commit, local_base_ref, real_ref):
2963 print 2979 print
2964 print 'Waiting for commit to be landed on %s...' % real_ref 2980 print 'Waiting for commit to be landed on %s...' % real_ref
2965 print '(If you are impatient, you may Ctrl-C once without harm)' 2981 print '(If you are impatient, you may Ctrl-C once without harm)'
2966 target_tree = RunGit(['rev-parse', '%s:' % pushed_commit]).strip() 2982 target_tree = RunGit(['rev-parse', '%s:' % pushed_commit]).strip()
2967 current_rev = RunGit(['rev-parse', local_base_ref]).strip() 2983 current_rev = RunGit(['rev-parse', local_base_ref]).strip()
2984 mirror = settings.GetGitMirror(remote)
2968 2985
2969 loop = 0 2986 loop = 0
2970 while True: 2987 while True:
2971 sys.stdout.write('fetching (%d)... \r' % loop) 2988 sys.stdout.write('fetching (%d)... \r' % loop)
2972 sys.stdout.flush() 2989 sys.stdout.flush()
2973 loop += 1 2990 loop += 1
2974 2991
2992 if mirror:
2993 mirror.populate()
2975 RunGit(['retry', 'fetch', remote, real_ref], stderr=subprocess2.VOID) 2994 RunGit(['retry', 'fetch', remote, real_ref], stderr=subprocess2.VOID)
2976 to_rev = RunGit(['rev-parse', 'FETCH_HEAD']).strip() 2995 to_rev = RunGit(['rev-parse', 'FETCH_HEAD']).strip()
2977 commits = RunGit(['rev-list', '%s..%s' % (current_rev, to_rev)]) 2996 commits = RunGit(['rev-list', '%s..%s' % (current_rev, to_rev)])
2978 for commit in commits.splitlines(): 2997 for commit in commits.splitlines():
2979 if RunGit(['rev-parse', '%s:' % commit]).strip() == target_tree: 2998 if RunGit(['rev-parse', '%s:' % commit]).strip() == target_tree:
2980 print 'Found commit on %s' % real_ref 2999 print 'Found commit on %s' % real_ref
2981 return commit 3000 return commit
2982 3001
2983 current_rev = to_rev 3002 current_rev = to_rev
2984 3003
(...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after
3964 if __name__ == '__main__': 3983 if __name__ == '__main__':
3965 # These affect sys.stdout so do it outside of main() to simplify mocks in 3984 # These affect sys.stdout so do it outside of main() to simplify mocks in
3966 # unit testing. 3985 # unit testing.
3967 fix_encoding.fix_encoding() 3986 fix_encoding.fix_encoding()
3968 colorama.init() 3987 colorama.init()
3969 try: 3988 try:
3970 sys.exit(main(sys.argv[1:])) 3989 sys.exit(main(sys.argv[1:]))
3971 except KeyboardInterrupt: 3990 except KeyboardInterrupt:
3972 sys.stderr.write('interrupted\n') 3991 sys.stderr.write('interrupted\n')
3973 sys.exit(1) 3992 sys.exit(1)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698