Skip to contentSkip to conversation

git-svn: Add 'find-rev' command

PATCH In review Adam Roben 2 participants 4 messages Jun 15, 2016 Documentation

lore
Share & tools
lore

Adam Roben

author
#0 lore raw

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
index a0d34e0..482c862 100644
@@ -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
index 7b5f8ab..30e4a41 100755
@@ -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
Acked-by on v1 1/1
#1 lore raw
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

---
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
index a0d34e0..482c862 100644
@@ -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
index 7b5f8ab..30e4a41 100755
@@ -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
author
#2 lore raw
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

#3 lore raw
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