git-svn: Add 'find-rev' command
PATCH 1/1 git-svn: Add 'find-rev' command
This patch adds a new 'find-rev' command to git-svn that lets you easily translate between SVN revision numbers and git tree-ish.
---
This is an updated version of my previous patch that takes Eric and Junio's comments into account.
Documentation/git-svn.txt | 6 ++++++ git-svn.perl | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 0 deletions(-)
Documentation/git-svn.txt +6 -0
@@ -159,6 +159,12 @@ New features: Any other arguments are passed directly to `git log' -- +'find-rev':: + When given an SVN revision number of the form 'rN', returns the + corresponding git commit hash (this can optionally be followed by a + tree-ish to specify which branch should be searched). When given a + tree-ish, returns the corresponding SVN revision number. + 'set-tree':: You should consider using 'dcommit' instead of this command. Commit specified commit or tree objects to SVN. This relies on
git-svn.perl +23 -0
@@ -141,6 +141,8 @@ my %cmd = ( 'color' => \$Git::SVN::Log::color, 'pager=s' => \$Git::SVN::Log::pager, } ], + 'find-rev' => [ \&cmd_find_rev, "Translate between SVN revision numbers and tree-ish", + { } ], 'rebase' => [ \&cmd_rebase, "Fetch and rebase your working directory", { 'merge|m|M' => \$_merge, 'verbose|v' => \$_verbose,
@@ -428,6 +430,27 @@ sub cmd_dcommit { command_noisy(@finish, $gs->refname); } +sub cmd_find_rev { + my $revision_or_hash = shift; + my $result; + if ($revision_or_hash =~ /^r\d+$/) { + my $head = shift; + $head ||= 'HEAD'; + my @refs; + my (undef, undef, undef, $gs) = working_head_info($head, \@refs); + unless ($gs) { + die "Unable to determine upstream SVN information from ", + "$head history\n"; + } + my $desired_revision = substr($revision_or_hash, 1); + $result = $gs->rev_db_get($desired_revision); + } else { + my (undef, $rev, undef) = cmt_metadata($revision_or_hash); + $result = $rev; + } + print "$result\n" if $result; +} + sub cmd_rebase { command_noisy(qw/update-index --refresh/); my ($url, $rev, $uuid, $gs) = working_head_info('HEAD');
Signature · 1 line
1.5.2.rc0.75.g959b-dirty
Quoted 2 lines · Adam Roben
This patch adds a new 'find-rev' command to git-svn that lets you easily translate between SVN revision numbers and git tree-ish.
Also, if you have time, can you get this (and 'log') to understand revision numbers even if they're not from the working HEAD? Thanks.
Quoted 67 lines
Signed-off-by Adam Roben <[email protected]>---
This is an updated version of my previous patch that takes Eric and Junio's comments into account.Documentation/git-svn.txt | 6 ++++++ git-svn.perl | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 0 deletions(-)Documentation/git-svn.txt +6
-0@@ -159,6 +159,12 @@ New features: Any other arguments are passed directly to `git log' -- +'find-rev':: + When given an SVN revision number of the form 'rN', returns the + corresponding git commit hash (this can optionally be followed by a + tree-ish to specify which branch should be searched). When given a + tree-ish, returns the corresponding SVN revision number. + 'set-tree':: You should consider using 'dcommit' instead of this command. Commit specified commit or tree objects to SVN. This relies ongit-svn.perl +23
-0@@ -141,6 +141,8 @@ my %cmd = ( 'color' => \$Git::SVN::Log::color, 'pager=s' => \$Git::SVN::Log::pager, } ], + 'find-rev' => [ \&cmd_find_rev, "Translate between SVN revision numbers and tree-ish", + { } ], 'rebase' => [ \&cmd_rebase, "Fetch and rebase your working directory", { 'merge|m|M' => \$_merge, 'verbose|v' => \$_verbose,@@ -428,6 +430,27 @@ sub cmd_dcommit { command_noisy(@finish, $gs->refname); } +sub cmd_find_rev { + my $revision_or_hash = shift; + my $result; + if ($revision_or_hash =~ /^r\d+$/) { + my $head = shift; + $head ||= 'HEAD'; + my @refs; + my (undef, undef, undef, $gs) = working_head_info($head, \@refs); + unless ($gs) { + die "Unable to determine upstream SVN information from ", + "$head history\n"; + } + my $desired_revision = substr($revision_or_hash, 1); + $result = $gs->rev_db_get($desired_revision); + } else { + my (undef, $rev, undef) = cmt_metadata($revision_or_hash); + $result = $rev; + } + print "$result\n" if $result; +} + sub cmd_rebase { command_noisy(qw/update-index --refresh/); my ($url, $rev, $uuid, $gs) = working_head_info('HEAD');
Signature · 1 line
Eric Wong
Quoted 2 lines · Eric Wong
Also, if you have time, can you get this (and 'log') to understand revision numbers even if they're not from the working HEAD? Thanks.
Won't the following code accomplish that for find-rev? Perhaps I
misunderstand you.
Quoted 9 lines
git-svn.perl sub cmd_dcommit { · line 440
Quoted 9 lines
git-svn.perl +8
-0+sub cmd_find_rev { + my $revision_or_hash = shift; + my $result; + if ($revision_or_hash =~ /^r\d+$/) { + my $head = shift; + $head ||= 'HEAD'; + my @refs; + my (undef, undef, undef, $gs) = working_head_info($head, \@refs);
-Adam
Quoted 7 lines · Adam Roben
Quoted 2 lines · Eric Wong
Also, if you have time, can you get this (and 'log') to understand revision numbers even if they're not from the working HEAD? Thanks.
Won't the following code accomplish that for find-rev? Perhaps I
misunderstand you.
working_head_info() only calls rev-list for a given head.
You should probably iterate through (like fetch_all does) each remote and do rev_db_get via the Git::SVN object.
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
git-svn.perl +8
-0+sub cmd_find_rev { + my $revision_or_hash = shift; + my $result; + if ($revision_or_hash =~ /^r\d+$/) { + my $head = shift; + $head ||= 'HEAD'; + my @refs; + my (undef, undef, undef, $gs) = working_head_info($head,\@refs);
Signature · 1 line
Eric Wong