| OLD | NEW |
| 1 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2006-2009 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 """SCM-specific utility classes.""" | 5 """SCM-specific utility classes.""" |
| 6 | 6 |
| 7 import glob | 7 import glob |
| 8 import os | 8 import os |
| 9 import re | 9 import re |
| 10 import shutil | 10 import shutil |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 if url in svn_refs: | 195 if url in svn_refs: |
| 196 svn_branch = svn_refs[url] | 196 svn_branch = svn_refs[url] |
| 197 proc.stdout.close() # Cut pipe. | 197 proc.stdout.close() # Cut pipe. |
| 198 break | 198 break |
| 199 return svn_branch | 199 return svn_branch |
| 200 | 200 |
| 201 @staticmethod | 201 @staticmethod |
| 202 def FetchUpstreamTuple(cwd): | 202 def FetchUpstreamTuple(cwd): |
| 203 """Returns a tuple containg remote and remote ref, | 203 """Returns a tuple containg remote and remote ref, |
| 204 e.g. 'origin', 'refs/heads/master' | 204 e.g. 'origin', 'refs/heads/master' |
| 205 Tries to be intelligent and understand git-svn. |
| 205 """ | 206 """ |
| 206 remote = '.' | 207 remote = '.' |
| 207 branch = GIT.GetBranch(cwd) | 208 branch = GIT.GetBranch(cwd) |
| 208 upstream_branch = None | 209 upstream_branch = None |
| 209 upstream_branch = GIT.Capture( | 210 upstream_branch = GIT.Capture( |
| 210 ['config', 'branch.%s.merge' % branch], in_directory=cwd, | 211 ['config', 'branch.%s.merge' % branch], in_directory=cwd, |
| 211 error_ok=True)[0].strip() | 212 error_ok=True)[0].strip() |
| 212 if upstream_branch: | 213 if upstream_branch: |
| 213 remote = GIT.Capture( | 214 remote = GIT.Capture( |
| 214 ['config', 'branch.%s.remote' % branch], | 215 ['config', 'branch.%s.remote' % branch], |
| 215 in_directory=cwd, error_ok=True)[0].strip() | 216 in_directory=cwd, error_ok=True)[0].strip() |
| 216 else: | 217 else: |
| 217 # Fall back on trying a git-svn upstream branch. | 218 # Fall back on trying a git-svn upstream branch. |
| 218 if GIT.IsGitSvn(cwd): | 219 if GIT.IsGitSvn(cwd): |
| 219 upstream_branch = GIT.GetSVNBranch(cwd) | 220 upstream_branch = GIT.GetSVNBranch(cwd) |
| 221 # Fall back on origin/master if it exits. |
| 222 elif GIT.Capture(['branch', '-r'], in_directory=cwd |
| 223 )[0].split().count('origin/master'): |
| 224 remote = 'origin' |
| 225 upstream_branch = 'refs/heads/master' |
| 226 else: |
| 227 remote = None |
| 228 upstream_branch = None |
| 220 return remote, upstream_branch | 229 return remote, upstream_branch |
| 221 | 230 |
| 222 @staticmethod | 231 @staticmethod |
| 223 def GetUpstream(cwd): | 232 def GetUpstreamBranch(cwd): |
| 224 """Gets the current branch's upstream branch.""" | 233 """Gets the current branch's upstream branch.""" |
| 225 remote, upstream_branch = GIT.FetchUpstreamTuple(cwd) | 234 remote, upstream_branch = GIT.FetchUpstreamTuple(cwd) |
| 226 if remote != '.': | 235 if remote != '.': |
| 227 upstream_branch = upstream_branch.replace('heads', 'remotes/' + remote) | 236 upstream_branch = upstream_branch.replace('heads', 'remotes/' + remote) |
| 228 return upstream_branch | 237 return upstream_branch |
| 229 | 238 |
| 230 @staticmethod | 239 @staticmethod |
| 231 def GenerateDiff(cwd, branch=None, branch_head='HEAD', full_move=False, | 240 def GenerateDiff(cwd, branch=None, branch_head='HEAD', full_move=False, |
| 232 files=None): | 241 files=None): |
| 233 """Diffs against the upstream branch or optionally another branch. | 242 """Diffs against the upstream branch or optionally another branch. |
| 234 | 243 |
| 235 full_move means that move or copy operations should completely recreate the | 244 full_move means that move or copy operations should completely recreate the |
| 236 files, usually in the prospect to apply the patch for a try job.""" | 245 files, usually in the prospect to apply the patch for a try job.""" |
| 237 if not branch: | 246 if not branch: |
| 238 branch = GIT.GetUpstream(cwd) | 247 branch = GIT.GetUpstreamBranch(cwd) |
| 239 command = ['diff', '-p', '--no-prefix', branch + "..." + branch_head] | 248 command = ['diff', '-p', '--no-prefix', branch + "..." + branch_head] |
| 240 if not full_move: | 249 if not full_move: |
| 241 command.append('-C') | 250 command.append('-C') |
| 242 # TODO(maruel): --binary support. | 251 # TODO(maruel): --binary support. |
| 243 if files: | 252 if files: |
| 244 command.append('--') | 253 command.append('--') |
| 245 command.extend(files) | 254 command.extend(files) |
| 246 diff = GIT.Capture(command, cwd)[0].splitlines(True) | 255 diff = GIT.Capture(command, cwd)[0].splitlines(True) |
| 247 for i in range(len(diff)): | 256 for i in range(len(diff)): |
| 248 # In the case of added files, replace /dev/null with the path to the | 257 # In the case of added files, replace /dev/null with the path to the |
| 249 # file being added. | 258 # file being added. |
| 250 if diff[i].startswith('--- /dev/null'): | 259 if diff[i].startswith('--- /dev/null'): |
| 251 diff[i] = '--- %s' % diff[i+1][4:] | 260 diff[i] = '--- %s' % diff[i+1][4:] |
| 252 return ''.join(diff) | 261 return ''.join(diff) |
| 253 | 262 |
| 254 @staticmethod | 263 @staticmethod |
| 255 def GetDifferentFiles(cwd, branch=None, branch_head='HEAD'): | 264 def GetDifferentFiles(cwd, branch=None, branch_head='HEAD'): |
| 256 """Returns the list of modified files between two branches.""" | 265 """Returns the list of modified files between two branches.""" |
| 257 if not branch: | 266 if not branch: |
| 258 branch = GIT.GetUpstream(cwd) | 267 branch = GIT.GetUpstreamBranch(cwd) |
| 259 command = ['diff', '--name-only', branch + "..." + branch_head] | 268 command = ['diff', '--name-only', branch + "..." + branch_head] |
| 260 return GIT.Capture(command, cwd)[0].splitlines(False) | 269 return GIT.Capture(command, cwd)[0].splitlines(False) |
| 261 | 270 |
| 262 @staticmethod | 271 @staticmethod |
| 263 def GetPatchName(cwd): | 272 def GetPatchName(cwd): |
| 264 """Constructs a name for this patch.""" | 273 """Constructs a name for this patch.""" |
| 265 short_sha = GIT.Capture(['rev-parse', '--short=4', 'HEAD'], cwd)[0].strip() | 274 short_sha = GIT.Capture(['rev-parse', '--short=4', 'HEAD'], cwd)[0].strip() |
| 266 return "%s-%s" % (GIT.GetBranch(cwd), short_sha) | 275 return "%s-%s" % (GIT.GetBranch(cwd), short_sha) |
| 267 | 276 |
| 268 @staticmethod | 277 @staticmethod |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 if not SVN.current_version: | 787 if not SVN.current_version: |
| 779 SVN.current_version = SVN.Capture(['--version']).split()[2] | 788 SVN.current_version = SVN.Capture(['--version']).split()[2] |
| 780 current_version_list = map(only_int, SVN.current_version.split('.')) | 789 current_version_list = map(only_int, SVN.current_version.split('.')) |
| 781 for min_ver in map(int, min_version.split('.')): | 790 for min_ver in map(int, min_version.split('.')): |
| 782 ver = current_version_list.pop(0) | 791 ver = current_version_list.pop(0) |
| 783 if ver < min_ver: | 792 if ver < min_ver: |
| 784 return (False, SVN.current_version) | 793 return (False, SVN.current_version) |
| 785 elif ver > min_ver: | 794 elif ver > min_ver: |
| 786 return (True, SVN.current_version) | 795 return (True, SVN.current_version) |
| 787 return (True, SVN.current_version) | 796 return (True, SVN.current_version) |
| OLD | NEW |