git-svn: allow UUID to be manually remapped via rewriteUUID
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>
This commit is contained in:
parent
c79f1189bc
commit
3e18ce1ac3
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
33
git-svn.perl
33
git-svn.perl
@ -115,6 +115,7 @@ my %init_opts = ( 'template=s' => \$_template, 'shared:s' => \$_shared,
|
||||
'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,
|
||||
@ -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:
|
||||
@ -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}) .
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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)$} ) {
|
||||
|
25
t/t9153-git-svn-rewrite-uuid.sh
Executable file
25
t/t9153-git-svn-rewrite-uuid.sh
Executable file
@ -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
t/t9153/svn.dump
Normal file
75
t/t9153/svn.dump
Normal file
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user