git-svn: teach find-rev to find near matches
authorJohn Keeping <john@keeping.me.uk>
Thu, 17 Jan 2013 22:19:33 +0000 (17 22:19 +0000)
committerEric Wong <normalperson@yhbt.net>
Thu, 17 Jan 2013 23:28:12 +0000 (17 23:28 +0000)
When a single SVN repository is split into multiple Git repositories
many SVN revisions will exist in only one of the Git repositories
created.  For some projects the only way to build a working artifact is
to check out corresponding versions of various repositories, with no
indication of what those are in the Git world - in the SVN world the
revision numbers are sufficient.

By adding "--before" to "git-svn find-rev" we can say "tell me what this
repository looked like when that other repository looked like this":

    git svn find-rev --before \
        r$(git --git-dir=/over/there.git svn find-rev HEAD)

Signed-off-by: John Keeping <john@keeping.me.uk>
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Documentation/git-svn.txt
git-svn.perl

index 69decb1..34d438b 100644 (file)
@@ -346,6 +346,16 @@ Any other arguments are passed directly to 'git log'
        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.
++
+--before;;
+       Don't require an exact match if given an SVN revision, instead find
+       the commit corresponding to the state of the SVN repository (on the
+       current branch) at the specified revision.
++
+--after;;
+       Don't require an exact match if given an SVN revision; if there is
+       not an exact match return the closest match searching forward in the
+       history.
 
 'set-tree'::
        You should consider using 'dcommit' instead of this command.
index bd5266c..d086694 100755 (executable)
@@ -114,6 +114,7 @@ my ($_stdin, $_help, $_edit,
        $_message, $_file, $_branch_dest,
        $_template, $_shared,
        $_version, $_fetch_all, $_no_rebase, $_fetch_parent,
+       $_before, $_after,
        $_merge, $_strategy, $_preserve_merges, $_dry_run, $_local,
        $_prefix, $_no_checkout, $_url, $_verbose,
        $_commit_url, $_tag, $_merge_info, $_interactive);
@@ -258,7 +259,8 @@ my %cmd = (
                        } ],
        'find-rev' => [ \&cmd_find_rev,
                        "Translate between SVN revision numbers and tree-ish",
-                       {} ],
+                       { 'before' => \$_before,
+                         'after' => \$_after } ],
        'rebase' => [ \&cmd_rebase, "Fetch and rebase your working directory",
                        { 'merge|m|M' => \$_merge,
                          'verbose|v' => \$_verbose,
@@ -1191,7 +1193,13 @@ sub cmd_find_rev {
                            "$head history\n";
                }
                my $desired_revision = substr($revision_or_hash, 1);
-               $result = $gs->rev_map_get($desired_revision, $uuid);
+               if ($_before) {
+                       $result = $gs->find_rev_before($desired_revision, 1);
+               } elsif ($_after) {
+                       $result = $gs->find_rev_after($desired_revision, 1);
+               } else {
+                       $result = $gs->rev_map_get($desired_revision, $uuid);
+               }
        } else {
                my (undef, $rev, undef) = cmt_metadata($revision_or_hash);
                $result = $rev;