Index: git_auto_svn.py |
diff --git a/git_auto_svn.py b/git_auto_svn.py |
index 88d970b3692de049e90eb1a3ae62245cfc70e4c3..ed7062a85d931a8f8f0e4ba02b30e1408619667f 100755 |
--- a/git_auto_svn.py |
+++ b/git_auto_svn.py |
@@ -22,7 +22,8 @@ import subprocess2 |
from git_common import run as run_git |
from git_common import run_stream_with_retcode as run_git_stream_with_retcode |
-from git_common import set_config, root, ROOT |
+from git_common import set_config, root, ROOT, current_branch |
+from git_common import upstream as get_upstream |
from git_footers import get_footer_svn_id |
@@ -57,7 +58,24 @@ def main(argv): |
description='Automatically set up git-svn for a repo mirrored from svn.') |
parser.parse_args(argv) |
- upstream = root() |
+ upstreams = [] |
+ # Always configure the upstream trunk. |
+ upstreams.append(root()) |
+ # Optionally configure whatever upstream branch might be currently checked |
+ # out. This is needed for work on svn-based branches, otherwise git-svn gets |
+ # very confused and tries to relate branch commits back to trunk, making a big |
+ # mess of the codereview patches, and generating all kinds of spurious errors |
+ # about the repo being in some sort of bad state. |
+ curr_upstream = get_upstream(current_branch()) |
+ # There will be no upstream if the checkout is in detached HEAD. |
+ if curr_upstream: |
+ upstreams.append(curr_upstream) |
+ for upstream in upstreams: |
+ config_svn(upstream) |
+ return 0 |
+ |
+ |
+def config_svn(upstream): |
svn_id = get_footer_svn_id(upstream) |
assert svn_id, 'No valid git-svn-id footer found on %s.' % upstream |
print 'Found git-svn-id footer %s on %s' % (svn_id, upstream) |
@@ -86,14 +104,14 @@ def main(argv): |
assert svn_repo is not None, 'Unable to find svn repo for %s' % svn_id |
print 'Found upstream svn repo %s and path %s' % (svn_repo, svn_path) |
- set_config('svn-remote.svn.url', svn_repo) |
- set_config('svn-remote.svn.fetch', |
- '%s:refs/remotes/%s' % (svn_path, upstream)) |
+ run_git('config', '--local', '--replace-all', 'svn-remote.svn.url', svn_repo) |
+ run_git('config', '--local', '--replace-all', 'svn-remote.svn.fetch', |
+ '%s:refs/remotes/%s' % (svn_path, upstream), |
+ 'refs/remotes/%s$' % upstream) |
print 'Configured metadata, running "git svn fetch". This may take some time.' |
with run_git_stream_with_retcode('svn', 'fetch') as stdout: |
for line in stdout.xreadlines(): |
print line.strip() |
- return 0 |
if __name__ == '__main__': |