git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tobias Schulte <tobias.schulte@gliderpilot.de>
To: git@vger.kernel.org
Cc: Eric Wong <normalperson@yhbt.net>,
	Tobias Schulte <tobias.schulte@gliderpilot.de>
Subject: [PATCH] git-svn: introduce --parents parameter for commands branch and tag
Date: Mon, 13 May 2013 22:22:29 +0200	[thread overview]
Message-ID: <1368476549-17886-1-git-send-email-tobias.schulte@gliderpilot.de> (raw)

This parameter is equivalent to the parameter --parents on svn cp commands
and is useful for non-standard repository layouts.

Signed-off-by: Tobias Schulte <tobias.schulte@gliderpilot.de>
---
 Documentation/git-svn.txt                |    5 ++++
 git-svn.perl                             |   22 +++++++++++++-
 t/t9167-git-svn-cmd-branch-subproject.sh |   46 ++++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+), 1 deletion(-)
 create mode 100755 t/t9167-git-svn-cmd-branch-subproject.sh

diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index 58b6d54..4f2141d 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -298,6 +298,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'.
diff --git a/git-svn.perl b/git-svn.perl
index ccabe06..204313d 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -113,7 +113,7 @@ my ($_stdin, $_help, $_edit,
 	$_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);
 
@@ -203,6 +203,7 @@ my %cmd = (
 	            { '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 } ],
@@ -211,6 +212,7 @@ my %cmd = (
 	         { '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,
@@ -1172,6 +1174,10 @@ 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;
@@ -1179,6 +1185,20 @@ sub cmd_branch {
 	$gs->fetch_all;
 }
 
+sub mk_parent_dirs {
+	my $ctx = shift;
+	my $parent = shift;
+	$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";
diff --git a/t/t9167-git-svn-cmd-branch-subproject.sh b/t/t9167-git-svn-cmd-branch-subproject.sh
new file mode 100755
index 0000000..9cb891b
--- /dev/null
+++ b/t/t9167-git-svn-cmd-branch-subproject.sh
@@ -0,0 +1,46 @@
+#!/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
-- 
1.7.9.5

             reply	other threads:[~2013-05-13 20:22 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-13 20:22 Tobias Schulte [this message]
2013-05-15  2:35 ` [PATCH] git-svn: introduce --parents parameter for commands branch and tag Eric Wong
2013-05-15 19:51   ` Tobias Schulte
2013-05-15 20:14 ` [PATCH v2] " Tobias Schulte
2013-05-20 22:13   ` Eric Wong
2013-05-20 22:37     ` Junio C Hamano
2013-05-20 22:46       ` Eric Wong
2013-05-20 23:10         ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1368476549-17886-1-git-send-email-tobias.schulte@gliderpilot.de \
    --to=tobias.schulte@gliderpilot.de \
    --cc=git@vger.kernel.org \
    --cc=normalperson@yhbt.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).