Merge git://git.bogomips.org/git-svn

* git://git.bogomips.org/git-svn:
  git-svn: introduce --parents parameter for commands branch and tag
  git-svn: clarify explanation of --destination argument
  git-svn: multiple fetch/branches/tags keys are supported
This commit is contained in:
Junio C Hamano 2013-05-20 16:06:48 -07:00
commit 9134a460e3
3 changed files with 97 additions and 6 deletions

View File

@ -271,13 +271,15 @@ first have already been pushed into SVN.
Create a tag by using the tags_subdir instead of the branches_subdir Create a tag by using the tags_subdir instead of the branches_subdir
specified during git svn init. specified during git svn init.
-d;; -d<path>;;
--destination;; --destination=<path>;;
If more than one --branches (or --tags) option was given to the 'init' If more than one --branches (or --tags) option was given to the 'init'
or 'clone' command, you must provide the location of the branch (or or 'clone' command, you must provide the location of the branch (or
tag) you wish to create in the SVN repository. The value of this tag) you wish to create in the SVN repository. <path> specifies which
option must match one of the paths specified by a --branches (or path to use to create the branch or tag and should match the pattern
--tags) option. You can see these paths with the commands on the left-hand side of one of the configured branches or tags
refspecs. You can see these refspecs with the commands
+ +
git config --get-all svn-remote.<name>.branches git config --get-all svn-remote.<name>.branches
git config --get-all svn-remote.<name>.tags git config --get-all svn-remote.<name>.tags
@ -298,6 +300,11 @@ where <name> is the name of the SVN repository as specified by the -R option to
git config --get-all svn-remote.<name>.commiturl git config --get-all svn-remote.<name>.commiturl
+ +
--parents;;
Create parent folders. This parameter is equivalent to the parameter
--parents on svn cp commands and is useful for non-standard repository
layouts.
'tag':: 'tag'::
Create a tag in the SVN repository. This is a shorthand for Create a tag in the SVN repository. This is a shorthand for
'branch -t'. 'branch -t'.
@ -1032,6 +1039,25 @@ comma-separated list of names within braces. For example:
tags = tags/{1.0,2.0}/src:refs/remotes/tags/* tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
------------------------------------------------------------------------ ------------------------------------------------------------------------
Multiple fetch, branches, and tags keys are supported:
------------------------------------------------------------------------
[svn-remote "messy-repo"]
url = http://server.org/svn
fetch = trunk/project-a:refs/remotes/project-a/trunk
fetch = branches/demos/june-project-a-demo:refs/remotes/project-a/demos/june-demo
branches = branches/server/*:refs/remotes/project-a/branches/*
branches = branches/demos/2011/*:refs/remotes/project-a/2011-demos/*
tags = tags/server/*:refs/remotes/project-a/tags/*
------------------------------------------------------------------------
Creating a branch in such a configuration requires disambiguating which
location to use using the -d or --destination flag:
------------------------------------------------------------------------
$ git svn branch -d branches/server release-2-3-0
------------------------------------------------------------------------
Note that git-svn keeps track of the highest revision in which a branch Note that git-svn keeps track of the highest revision in which a branch
or tag has appeared. If the subset of branches or tags is changed after or tag has appeared. If the subset of branches or tags is changed after
fetching, then .git/svn/.metadata must be manually edited to remove (or fetching, then .git/svn/.metadata must be manually edited to remove (or

View File

@ -113,7 +113,7 @@ my ($_stdin, $_help, $_edit,
$_template, $_shared, $_template, $_shared,
$_version, $_fetch_all, $_no_rebase, $_fetch_parent, $_version, $_fetch_all, $_no_rebase, $_fetch_parent,
$_before, $_after, $_before, $_after,
$_merge, $_strategy, $_preserve_merges, $_dry_run, $_local, $_merge, $_strategy, $_preserve_merges, $_dry_run, $_parents, $_local,
$_prefix, $_no_checkout, $_url, $_verbose, $_prefix, $_no_checkout, $_url, $_verbose,
$_commit_url, $_tag, $_merge_info, $_interactive); $_commit_url, $_tag, $_merge_info, $_interactive);
@ -203,6 +203,7 @@ my %cmd = (
{ 'message|m=s' => \$_message, { 'message|m=s' => \$_message,
'destination|d=s' => \$_branch_dest, 'destination|d=s' => \$_branch_dest,
'dry-run|n' => \$_dry_run, 'dry-run|n' => \$_dry_run,
'parents' => \$_parents,
'tag|t' => \$_tag, 'tag|t' => \$_tag,
'username=s' => \$Git::SVN::Prompt::_username, 'username=s' => \$Git::SVN::Prompt::_username,
'commit-url=s' => \$_commit_url } ], 'commit-url=s' => \$_commit_url } ],
@ -211,6 +212,7 @@ my %cmd = (
{ 'message|m=s' => \$_message, { 'message|m=s' => \$_message,
'destination|d=s' => \$_branch_dest, 'destination|d=s' => \$_branch_dest,
'dry-run|n' => \$_dry_run, 'dry-run|n' => \$_dry_run,
'parents' => \$_parents,
'username=s' => \$Git::SVN::Prompt::_username, 'username=s' => \$Git::SVN::Prompt::_username,
'commit-url=s' => \$_commit_url } ], 'commit-url=s' => \$_commit_url } ],
'set-tree' => [ \&cmd_set_tree, 'set-tree' => [ \&cmd_set_tree,
@ -1172,6 +1174,10 @@ sub cmd_branch {
$ctx->ls($dst, 'HEAD', 0); $ctx->ls($dst, 'HEAD', 0);
} and die "branch ${branch_name} already exists\n"; } and die "branch ${branch_name} already exists\n";
if ($_parents) {
mk_parent_dirs($ctx, $dst);
}
print "Copying ${src} at r${rev} to ${dst}...\n"; print "Copying ${src} at r${rev} to ${dst}...\n";
$ctx->copy($src, $rev, $dst) $ctx->copy($src, $rev, $dst)
unless $_dry_run; unless $_dry_run;
@ -1179,6 +1185,17 @@ sub cmd_branch {
$gs->fetch_all; $gs->fetch_all;
} }
sub mk_parent_dirs {
my ($ctx, $parent) = @_;
$parent =~ s{/[^/]*$}{};
if (!eval{$ctx->ls($parent, 'HEAD', 0)}) {
mk_parent_dirs($ctx, $parent);
print "Creating parent folder ${parent} ...\n";
$ctx->mkdir($parent) unless $_dry_run;
}
}
sub cmd_find_rev { sub cmd_find_rev {
my $revision_or_hash = shift or die "SVN or git revision required ", my $revision_or_hash = shift or die "SVN or git revision required ",
"as a command-line argument\n"; "as a command-line argument\n";

View File

@ -0,0 +1,48 @@
#!/bin/sh
#
# Copyright (c) 2013 Tobias Schulte
#
test_description='git svn branch for subproject clones'
. ./lib-git-svn.sh
test_expect_success 'initialize svnrepo' '
mkdir import &&
(
cd import &&
mkdir -p trunk/project branches tags &&
(
cd trunk/project &&
echo foo > foo
) &&
svn_cmd import -m "import for git-svn" . "$svnrepo" >/dev/null
) &&
rm -rf import &&
svn_cmd co "$svnrepo"/trunk/project trunk/project &&
(
cd trunk/project &&
echo bar >> foo &&
svn_cmd ci -m "updated trunk"
) &&
rm -rf trunk
'
test_expect_success 'import into git' '
git svn init --trunk=trunk/project --branches=branches/*/project \
--tags=tags/*/project "$svnrepo" &&
git svn fetch &&
git checkout remotes/trunk
'
test_expect_success 'git svn branch tests' '
test_must_fail git svn branch a &&
git svn branch --parents a &&
test_must_fail git svn branch -t tag1 &&
git svn branch --parents -t tag1 &&
test_must_fail git svn branch --tag tag2 &&
git svn branch --parents --tag tag2 &&
test_must_fail git svn tag tag3 &&
git svn tag --parents tag3
'
test_done