Skip to content

Commit

Permalink
git-svn: allow UUID to be manually remapped via rewriteUUID
Browse files Browse the repository at this point in the history
In certain situations it may be necessary to manually remap an svn
repostitory UUID. For example:

                  o--- [git-svn clone]
                 /
[origin svn repo]
                 \
                  o--- [svnsync clone]

Imagine that only "git-svn clone" and "svnsync clone" are made available
to external users. Furthur, "git-svn clone" contains only trunk, and for
reasons unknown, "svnsync clone" is missing the revision properties that
normally provide the origin svn repo's UUID.

A git user who has cloned the "git-svn clone" repo now wishes to use
git-svn to pull in the missing branches from the "synsync clone" repo.
In order for git-svn to get the history correct for those branches,
it needs to know the origin svn repo's UUID. Hence rewriteUUID.

Signed-off-by: Jay Soffian <jaysoffian@gmail.com>
Acked-by: Eric Wong <normalperson@yhbt.net>
  • Loading branch information
jaysoffian authored and Eric Wong committed Jan 23, 2010
1 parent c79f118 commit 3e18ce1
Show file tree
Hide file tree
Showing 4 changed files with 140 additions and 8 deletions.
15 changes: 12 additions & 3 deletions Documentation/git-svn.txt
Expand Up @@ -62,6 +62,8 @@ COMMANDS
Set the 'useSvnsyncProps' option in the [svn-remote] config.
--rewrite-root=<URL>;;
Set the 'rewriteRoot' option in the [svn-remote] config.
--rewrite-uuid=<UUID>;;
Set the 'rewriteUUID' option in the [svn-remote] config.
--username=<USER>;;
For transports that SVN handles authentication for (http,
https, and plain svn), specify the username. For other
Expand Down Expand Up @@ -629,6 +631,12 @@ svn-remote.<name>.rewriteRoot::
the repository with a public http:// or svn:// URL in the
metadata so users of it will see the public URL.

svn-remote.<name>.rewriteUUID::
Similar to the useSvmProps option; this is for users who need
to remap the UUID manually. This may be useful in situations
where the original UUID is not available via either useSvmProps
or useSvnsyncProps.

svn.brokenSymlinkWorkaround::
This disables potentially expensive checks to workaround
broken symlinks checked into SVN by broken clients. Set this
Expand All @@ -638,13 +646,14 @@ svn.brokenSymlinkWorkaround::
revision fetched. If unset, 'git svn' assumes this option to
be "true".

Since the noMetadata, rewriteRoot, useSvnsyncProps and useSvmProps
Since the noMetadata, rewriteRoot, rewriteUUID, useSvnsyncProps and useSvmProps
options all affect the metadata generated and used by 'git svn'; they
*must* be set in the configuration file before any history is imported
and these settings should never be changed once they are set.

Additionally, only one of these four options can be used per-svn-remote
section because they affect the 'git-svn-id:' metadata line.
Additionally, only one of these options can be used per svn-remote
section because they affect the 'git-svn-id:' metadata line, except
for rewriteRoot and rewriteUUID which can be used together.


BASIC EXAMPLES
Expand Down
33 changes: 28 additions & 5 deletions git-svn.perl
Expand Up @@ -115,6 +115,7 @@ BEGIN
'use-svm-props' => sub { $icv{useSvmProps} = 1 },
'use-svnsync-props' => sub { $icv{useSvnsyncProps} = 1 },
'rewrite-root=s' => sub { $icv{rewriteRoot} = $_[1] },
'rewrite-uuid=s' => sub { $icv{rewriteUUID} = $_[1] },
%remote_opts );
my %cmt_opts = ( 'edit|e' => \$_edit,
'rmdir' => \$SVN::Git::Editor::_rmdir,
Expand Down Expand Up @@ -2207,6 +2208,10 @@ sub svnsync {
die "Can't have both 'useSvnsyncProps' and 'rewriteRoot' ",
"options set!\n";
}
if ($self->rewrite_uuid) {
die "Can't have both 'useSvnsyncProps' and 'rewriteUUID' ",
"options set!\n";
}

my $svnsync;
# see if we have it in our config, first:
Expand Down Expand Up @@ -2488,6 +2493,20 @@ sub rewrite_root {
$self->{-rewrite_root} = $rwr;
}

sub rewrite_uuid {
my ($self) = @_;
return $self->{-rewrite_uuid} if exists $self->{-rewrite_uuid};
my $k = "svn-remote.$self->{repo_id}.rewriteUUID";
my $rwid = eval { command_oneline(qw/config --get/, $k) };
if ($rwid) {
$rwid =~ s#/+$##;
if ($rwid !~ m#^[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12}$#) {
die "$rwid is not a valid UUID (key: $k)\n";
}
}
$self->{-rewrite_uuid} = $rwid;
}

sub metadata_url {
my ($self) = @_;
($self->rewrite_root || $self->{url}) .
Expand Down Expand Up @@ -3306,6 +3325,10 @@ sub make_log_entry {
die "Can't have both 'useSvmProps' and 'rewriteRoot' ",
"options set!\n";
}
if ($self->rewrite_uuid) {
die "Can't have both 'useSvmProps' and 'rewriteUUID' ",
"options set!\n";
}
my ($uuid, $r) = $headrev =~ m{^([a-f\d\-]{30,}):(\d+)$}i;
# we don't want "SVM: initializing mirror for junk" ...
return undef if $r == 0;
Expand Down Expand Up @@ -3336,10 +3359,10 @@ sub make_log_entry {
} else {
my $url = $self->metadata_url;
remove_username($url);
$log_entry{metadata} = "$url\@$rev " .
$self->ra->get_uuid;
$email ||= "$author\@" . $self->ra->get_uuid;
$commit_email ||= "$author\@" . $self->ra->get_uuid;
my $uuid = $self->rewrite_uuid || $self->ra->get_uuid;
$log_entry{metadata} = "$url\@$rev " . $uuid;
$email ||= "$author\@" . $uuid;
$commit_email ||= "$author\@" . $uuid;
}
$log_entry{name} = $name;
$log_entry{email} = $email;
Expand Down Expand Up @@ -3421,7 +3444,7 @@ sub rebuild {
'--');
my $metadata_url = $self->metadata_url;
remove_username($metadata_url);
my $svn_uuid = $self->ra_uuid;
my $svn_uuid = $self->rewrite_uuid || $self->ra_uuid;
my $c;
while (<$log>) {
if ( m{^commit ($::sha1)$} ) {
Expand Down
25 changes: 25 additions & 0 deletions t/t9153-git-svn-rewrite-uuid.sh
@@ -0,0 +1,25 @@
#!/bin/sh
#
# Copyright (c) 2010 Jay Soffian
#

test_description='git svn --rewrite-uuid test'

. ./lib-git-svn.sh

uuid=6cc8ada4-5932-4b4a-8242-3534ed8a3232

test_expect_success 'load svn repo' "
svnadmin load -q '$rawsvnrepo' < '$TEST_DIRECTORY/t9153/svn.dump' &&
git svn init --minimize-url --rewrite-uuid='$uuid' '$svnrepo' &&
git svn fetch
"

test_expect_success 'verify uuid' "
git cat-file commit refs/remotes/git-svn~0 | \
grep '^${git_svn_id}: .*@2 $uuid$' &&
git cat-file commit refs/remotes/git-svn~1 | \
grep '^${git_svn_id}: .*@1 $uuid$'
"

test_done
75 changes: 75 additions & 0 deletions t/t9153/svn.dump
@@ -0,0 +1,75 @@
SVN-fs-dump-format-version: 2

UUID: b4885626-c94f-4a6c-b179-00c030fc68e8

Revision-number: 0
Prop-content-length: 56
Content-length: 56

K 8
svn:date
V 27
2010-01-23T06:41:03.908576Z
PROPS-END

Revision-number: 1
Prop-content-length: 109
Content-length: 109

K 7
svn:log
V 11
initial foo
K 10
svn:author
V 3
jay
K 8
svn:date
V 27
2010-01-23T06:41:48.353776Z
PROPS-END

Node-path: foo
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 4
Text-content-md5: d3b07384d113edec49eaa6238ad5ff00
Text-content-sha1: f1d2d2f924e986ac86fdf7b36c94bcdf32beec15
Content-length: 14

PROPS-END
foo


Revision-number: 2
Prop-content-length: 110
Content-length: 110

K 7
svn:log
V 12
now with bar
K 10
svn:author
V 3
jay
K 8
svn:date
V 27
2010-01-23T06:42:14.214640Z
PROPS-END

Node-path: foo
Node-kind: file
Node-action: change
Text-content-length: 8
Text-content-md5: f47c75614087a8dd938ba4acff252494
Text-content-sha1: 4e48e2c9a3d2ca8a708cb0cc545700544efb5021
Content-length: 8

foo
bar


0 comments on commit 3e18ce1

Please sign in to comment.