Skip to content

Commit

Permalink
Merge git://git.bogomips.org/git-svn
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
Junio C Hamano committed May 20, 2013
2 parents 5dbe064 + f4f4c7f commit 9134a46
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 6 deletions.
36 changes: 31 additions & 5 deletions Documentation/git-svn.txt
Original file line number Diff line number Diff line change
Expand Up @@ -271,13 +271,15 @@ first have already been pushed into SVN.
Create a tag by using the tags_subdir instead of the branches_subdir
specified during git svn init.

-d;;
--destination;;
-d<path>;;
--destination=<path>;;

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
tag) you wish to create in the SVN repository. The value of this
option must match one of the paths specified by a --branches (or
--tags) option. You can see these paths with the commands
tag) you wish to create in the SVN repository. <path> specifies which
path to use to create the branch or tag and should match the pattern
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>.tags
Expand All @@ -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
+

--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'::
Create a tag in the SVN repository. This is a shorthand for
'branch -t'.
Expand Down Expand Up @@ -1032,6 +1039,25 @@ comma-separated list of names within braces. For example:
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
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
Expand Down
19 changes: 18 additions & 1 deletion git-svn.perl
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ sub _req_svn {
$_template, $_shared,
$_version, $_fetch_all, $_no_rebase, $_fetch_parent,
$_before, $_after,
$_merge, $_strategy, $_preserve_merges, $_dry_run, $_local,
$_merge, $_strategy, $_preserve_merges, $_dry_run, $_parents, $_local,
$_prefix, $_no_checkout, $_url, $_verbose,
$_commit_url, $_tag, $_merge_info, $_interactive);

Expand Down Expand Up @@ -203,6 +203,7 @@ sub _req_svn {
{ 'message|m=s' => \$_message,
'destination|d=s' => \$_branch_dest,
'dry-run|n' => \$_dry_run,
'parents' => \$_parents,
'tag|t' => \$_tag,
'username=s' => \$Git::SVN::Prompt::_username,
'commit-url=s' => \$_commit_url } ],
Expand All @@ -211,6 +212,7 @@ sub _req_svn {
{ 'message|m=s' => \$_message,
'destination|d=s' => \$_branch_dest,
'dry-run|n' => \$_dry_run,
'parents' => \$_parents,
'username=s' => \$Git::SVN::Prompt::_username,
'commit-url=s' => \$_commit_url } ],
'set-tree' => [ \&cmd_set_tree,
Expand Down Expand Up @@ -1172,13 +1174,28 @@ sub cmd_branch {
$ctx->ls($dst, 'HEAD', 0);
} and die "branch ${branch_name} already exists\n";

if ($_parents) {
mk_parent_dirs($ctx, $dst);
}

print "Copying ${src} at r${rev} to ${dst}...\n";
$ctx->copy($src, $rev, $dst)
unless $_dry_run;

$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 {
my $revision_or_hash = shift or die "SVN or git revision required ",
"as a command-line argument\n";
Expand Down
48 changes: 48 additions & 0 deletions t/t9167-git-svn-cmd-branch-subproject.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 9134a46

Please sign in to comment.