summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2edb9c5)
raw | patch | inline | side by side (parent: 2edb9c5)
author | Eric Wong <normalperson@yhbt.net> | |
Tue, 13 Feb 2007 22:22:11 +0000 (14:22 -0800) | ||
committer | Eric Wong <normalperson@yhbt.net> | |
Fri, 23 Feb 2007 08:57:12 +0000 (00:57 -0800) |
* dcommit no longer requires the correct -i/GIT_SVN_ID option
passed to it. Since you're committing from HEAD (or another
commit that is a parent of HEAD), you'll be able to find
a commit with metadata information containing the SVN URL
that your HEAD was descended from anyways.
* I don't think dcommit ever worked for people using the
noMetadata option; so I don't think relying on metadata
is an issue.
* useSvmProps users shouldn't commit to SVN::Mirror created
repositories anyways, right?
* Users of globbing should automatically be able to commit
to paths that are not explicitly set in .git/config
Signed-off-by: Eric Wong <normalperson@yhbt.net>
passed to it. Since you're committing from HEAD (or another
commit that is a parent of HEAD), you'll be able to find
a commit with metadata information containing the SVN URL
that your HEAD was descended from anyways.
* I don't think dcommit ever worked for people using the
noMetadata option; so I don't think relying on metadata
is an issue.
* useSvmProps users shouldn't commit to SVN::Mirror created
repositories anyways, right?
* Users of globbing should automatically be able to commit
to paths that are not explicitly set in .git/config
Signed-off-by: Eric Wong <normalperson@yhbt.net>
git-svn.perl | patch | blob | history |
diff --git a/git-svn.perl b/git-svn.perl
index d55691216cca8f0070bd97898da6e0e8b134103f..09c0aba8ea65f250277c9238c7f74994a77fa551 100755 (executable)
--- a/git-svn.perl
+++ b/git-svn.perl
sub cmd_dcommit {
my $head = shift;
- my $gs = Git::SVN->new;
$head ||= 'HEAD';
- my @refs = command(qw/rev-list --no-merges/, $gs->refname."..$head");
+ my ($url, $rev, $uuid);
+ my ($fh, $ctx) = command_output_pipe(qw/rev-list --no-merges/, $head);
+ my @refs;
+ my $c;
+ while (<$fh>) {
+ $c = $_;
+ chomp $c;
+ ($url, $rev, $uuid) = cmt_metadata($c);
+ last if (defined $url && defined $rev && defined $uuid);
+ unshift @refs, $c;
+ }
+ close $fh; # most likely breaking the pipe
+ unless (defined $url && defined $rev && defined $uuid) {
+ die "Unable to determine upstream SVN information from ",
+ "$head history:\n $ctx\n";
+ }
+ my $gs = Git::SVN->find_by_url($url) or
+ die "Can't determine fetch information for $url\n";
my $last_rev;
- foreach my $d (reverse @refs) {
+ foreach my $d (@refs) {
if (!verify_ref("$d~1")) {
fatal "Commit $d\n",
"has no parent commit, and therefore ",
} else {
my %ed_opts = ( r => $last_rev,
log => get_commit_entry($d)->{log},
- ra => $gs->ra,
+ ra => Git::SVN::Ra->new($url),
tree_a => "$d~1",
tree_b => $d,
editor_cb => sub {
print "Committed r$_[0]\n";
$last_rev = $_[0]; },
- svn_path => $gs->{path} );
+ svn_path => '');
if (!SVN::Git::Editor->new(\%ed_opts)->apply_diff) {
print "No changes\n$d~1 == $d\n";
}
$self->{url} = $url;
}
+sub find_by_url { # repos_root and, path are optional
+ my ($class, $full_url, $repos_root, $path) = @_;
+ my $remotes = read_all_remotes();
+ if (defined $full_url && defined $repos_root && !defined $path) {
+ $path = $full_url;
+ $path =~ s#^\Q$repos_root\E(?:/|$)##;
+ }
+ foreach my $repo_id (keys %$remotes) {
+ my $u = $remotes->{$repo_id}->{url} or next;
+ next if defined $repos_root && $repos_root ne $u;
+
+ my $fetch = $remotes->{$repo_id}->{fetch} || {};
+ foreach (qw/branches tags/) {
+ resolve_local_globs($u, $fetch,
+ $remotes->{$repo_id}->{$_});
+ }
+ my $p = $path;
+ unless (defined $p) {
+ $p = $full_url;
+ $p =~ s#^\Q$u\E(?:/|$)## or next;
+ }
+ foreach my $f (keys %$fetch) {
+ next if $f ne $p;
+ return Git::SVN->new($fetch->{$f}, $repo_id, $f);
+ }
+ }
+ undef;
+}
+
sub init {
my ($class, $url, $path, $repo_id, $ref_id, $no_write) = @_;
my $self = _new($class, $repo_id, $ref_id, $path);
print STDERR "Found possible branch point: ",
"$new_url => ", $self->full_url, ", $r\n";
$branch_from =~ s#^/##;
- my $remotes = read_all_remotes();
- my $gs;
- foreach my $repo_id (keys %$remotes) {
- my $u = $remotes->{$repo_id}->{url} or next;
- next if $url ne $u;
- my $fetch = $remotes->{$repo_id}->{fetch};
- foreach (qw/branches tags/) {
- resolve_local_globs($url, $fetch,
- $remotes->{$repo_id}->{$_});
- }
- foreach my $f (keys %$fetch) {
- next if $f ne $branch_from;
- $gs = Git::SVN->new($fetch->{$f}, $repo_id, $f);
- last;
- }
- last if $gs;
- }
+ my $gs = Git::SVN->find_by_url($new_url, $repos_root, $branch_from);
unless ($gs) {
my $ref_id = $self->{ref_id};
$ref_id =~ s/\@\d+$//;