Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # git-cl -- a git-command for integrating reviews on Rietveld | 2 # git-cl -- a git-command for integrating reviews on Rietveld |
| 3 # Copyright (C) 2008 Evan Martin <martine@danga.com> | 3 # Copyright (C) 2008 Evan Martin <martine@danga.com> |
| 4 | 4 |
| 5 import errno | 5 import errno |
| 6 import logging | 6 import logging |
| 7 import optparse | 7 import optparse |
| 8 import os | 8 import os |
| 9 import re | 9 import re |
| 10 import subprocess | 10 import subprocess |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 | 91 |
| 92 def FixUrl(server): | 92 def FixUrl(server): |
| 93 """Fix a server url to defaults protocol to http:// if none is specified.""" | 93 """Fix a server url to defaults protocol to http:// if none is specified.""" |
| 94 if not server: | 94 if not server: |
| 95 return server | 95 return server |
| 96 if not re.match(r'[a-z]+\://.*', server): | 96 if not re.match(r'[a-z]+\://.*', server): |
| 97 return 'http://' + server | 97 return 'http://' + server |
| 98 return server | 98 return server |
| 99 | 99 |
| 100 | 100 |
| 101 def MatchSvnGlob(url, base_url, glob_spec, allow_wildcards): | |
| 102 """Return the corresponding git ref if |base_url| together with |glob_spec| | |
| 103 matches the full |url|. | |
| 104 | |
| 105 If |allow_wildcards| is true, |glob_spec| can contain wildcards (see below). | |
| 106 """ | |
| 107 glob_spec = glob_spec.split(':') | |
|
M-A Ruel
2011/03/08 18:42:51
Do you mind putting something like:
fetch_suburl,
Bernhard Bauer
2011/03/08 18:47:45
Nice! Done.
| |
| 108 if allow_wildcards: | |
| 109 glob_match = re.match('(.+/)?(\*|{[^/]*})(/.+)?', glob_spec[0]) | |
| 110 if glob_match: | |
| 111 # Parse specs like "branches/*/src:refs/remotes/svn/*" or | |
| 112 # "branches/{472,597,648}/src:refs/remotes/svn/*". | |
| 113 branch_re = re.escape(base_url) | |
| 114 if glob_match.group(1): | |
| 115 branch_re += '/' + re.escape(glob_match.group(1)) | |
| 116 wildcard = glob_match.group(2) | |
| 117 if wildcard == '*': | |
| 118 branch_re += '([^/]*)' | |
| 119 else: | |
| 120 # Escape and replace surrounding braces with parentheses and commas | |
| 121 # with pipe symbols. | |
| 122 wildcard = re.escape(wildcard) | |
| 123 wildcard = re.sub('^\\\\{', '(', wildcard) | |
| 124 wildcard = re.sub('\\\\,', '|', wildcard) | |
| 125 wildcard = re.sub('\\\\}$', ')', wildcard) | |
| 126 branch_re += wildcard | |
| 127 if glob_match.group(3): | |
| 128 branch_re += re.escape(glob_match.group(3)) | |
| 129 match = re.match(branch_re, url) | |
| 130 if match: | |
| 131 return re.sub('\*$', match.group(1), glob_spec[1]) | |
| 132 | |
| 133 # Parse specs like "trunk/src:refs/remotes/origin/trunk". | |
| 134 if glob_spec[0]: | |
| 135 full_url = base_url + '/' + glob_spec[0] | |
| 136 else: | |
| 137 full_url = base_url | |
| 138 if full_url == url: | |
| 139 return glob_spec[1] | |
| 140 return None | |
| 141 | |
| 101 class Settings(object): | 142 class Settings(object): |
| 102 def __init__(self): | 143 def __init__(self): |
| 103 self.default_server = None | 144 self.default_server = None |
| 104 self.cc = None | 145 self.cc = None |
| 105 self.root = None | 146 self.root = None |
| 106 self.is_git_svn = None | 147 self.is_git_svn = None |
| 107 self.svn_branch = None | 148 self.svn_branch = None |
| 108 self.tree_status_url = None | 149 self.tree_status_url = None |
| 109 self.viewvc_url = None | 150 self.viewvc_url = None |
| 110 self.updated = False | 151 self.updated = False |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 183 if url: | 224 if url: |
| 184 svn_remote_re = re.compile(r'^svn-remote\.([^.]+)\.url (.*)$') | 225 svn_remote_re = re.compile(r'^svn-remote\.([^.]+)\.url (.*)$') |
| 185 remotes = RunGit(['config', '--get-regexp', | 226 remotes = RunGit(['config', '--get-regexp', |
| 186 r'^svn-remote\..*\.url']).splitlines() | 227 r'^svn-remote\..*\.url']).splitlines() |
| 187 for remote in remotes: | 228 for remote in remotes: |
| 188 match = svn_remote_re.match(remote) | 229 match = svn_remote_re.match(remote) |
| 189 if match: | 230 if match: |
| 190 remote = match.group(1) | 231 remote = match.group(1) |
| 191 base_url = match.group(2) | 232 base_url = match.group(2) |
| 192 fetch_spec = RunGit( | 233 fetch_spec = RunGit( |
| 193 ['config', 'svn-remote.'+remote+'.fetch']).strip().split(':') | 234 ['config', 'svn-remote.%s.fetch' % remote], |
| 194 if fetch_spec[0]: | 235 error_ok=True).strip() |
| 195 full_url = base_url + '/' + fetch_spec[0] | 236 if fetch_spec: |
| 196 else: | 237 self.svn_branch = MatchSvnGlob(url, base_url, fetch_spec, False) |
| 197 full_url = base_url | 238 if self.svn_branch: |
| 198 if full_url == url: | 239 break |
| 199 self.svn_branch = fetch_spec[1] | 240 branch_spec = RunGit( |
| 200 break | 241 ['config', 'svn-remote.%s.branches' % remote], |
| 242 error_ok=True).strip() | |
| 243 if branch_spec: | |
| 244 self.svn_branch = MatchSvnGlob(url, base_url, branch_spec, True) | |
| 245 if self.svn_branch: | |
| 246 break | |
| 247 tag_spec = RunGit( | |
| 248 ['config', 'svn-remote.%s.tags' % remote], | |
| 249 error_ok=True).strip() | |
| 250 if tag_spec: | |
| 251 self.svn_branch = MatchSvnGlob(url, base_url, tag_spec, True) | |
| 252 if self.svn_branch: | |
| 253 break | |
| 201 | 254 |
| 202 if not self.svn_branch: | 255 if not self.svn_branch: |
| 203 DieWithError('Can\'t guess svn branch -- try specifying it on the ' | 256 DieWithError('Can\'t guess svn branch -- try specifying it on the ' |
| 204 'command line') | 257 'command line') |
| 205 | 258 |
| 206 return self.svn_branch | 259 return self.svn_branch |
| 207 | 260 |
| 208 def GetTreeStatusUrl(self, error_ok=False): | 261 def GetTreeStatusUrl(self, error_ok=False): |
| 209 if not self.tree_status_url: | 262 if not self.tree_status_url: |
| 210 error_message = ('You must configure your tree status URL by running ' | 263 error_message = ('You must configure your tree status URL by running ' |
| (...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1279 ('AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' | 1332 ('AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' |
| 1280 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))) | 1333 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))) |
| 1281 | 1334 |
| 1282 # Not a known command. Default to help. | 1335 # Not a known command. Default to help. |
| 1283 GenUsage(parser, 'help') | 1336 GenUsage(parser, 'help') |
| 1284 return CMDhelp(parser, argv) | 1337 return CMDhelp(parser, argv) |
| 1285 | 1338 |
| 1286 | 1339 |
| 1287 if __name__ == '__main__': | 1340 if __name__ == '__main__': |
| 1288 sys.exit(main(sys.argv[1:])) | 1341 sys.exit(main(sys.argv[1:])) |
| OLD | NEW |