From: Eric Wong Date: Wed, 14 Feb 2007 10:21:19 +0000 (-0800) Subject: git-svn: hopefully make 'fetch' more user-friendly X-Git-Tag: v1.5.1-rc1~167 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=e98671e5c2067a39759c8f08b79c260a9f0b2771;p=git.git git-svn: hopefully make 'fetch' more user-friendly multi-fetch is deprecated, "fetch -a" is easier to type By default, fetch will fetch everything from its default [svn-remote]; if fetch [--all|-a] is specified, then it will fetch from all svn remotes. Refspecs on the command-line (like git-fetch) are not supported. Also, enable -r/--revision arguments for fetch so users can shoot themselves in the foot^W^W^W^W^W skip some history and do the equivalent of a shallow clone/fetch they're not interested in. Signed-off-by: Eric Wong --- diff --git a/git-svn.perl b/git-svn.perl index fb2c864a3..3eed62fc0 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -53,7 +53,7 @@ $sha1_short = qr/[a-f\d]{4,40}/; my ($_stdin, $_help, $_edit, $_message, $_file, $_template, $_shared, - $_version, + $_version, $_fetch_all, $_merge, $_strategy, $_dry_run, $_prefix); $Git::SVN::_follow_parent = 1; @@ -84,7 +84,9 @@ my %cmt_opts = ( 'edit|e' => \$_edit, my %cmd = ( fetch => [ \&cmd_fetch, "Download new revisions from SVN", - { 'revision|r=s' => \$_revision, %fc_opts } ], + { 'revision|r=s' => \$_revision, + 'all|a' => \$_fetch_all, + %fc_opts } ], init => [ \&cmd_init, "Initialize a repo for tracking" . " (requires URL argument)", \%init_opts ], @@ -106,8 +108,8 @@ my %cmd = ( 'prefix=s' => \$_prefix, } ], 'multi-fetch' => [ \&cmd_multi_fetch, - 'Fetch multiple trees (like git-svnimport)', - \%fc_opts ], + "Deprecated alias for $0 fetch --all", + { 'revision|r=s' => \$_revision, %fc_opts } ], 'migrate' => [ sub { }, # no-op, we automatically run this anyways, 'Migrate configuration/metadata/layout from @@ -226,16 +228,19 @@ sub cmd_init { } sub cmd_fetch { - if (@_) { - die "Additional fetch arguments are no longer supported.\n", - "Use --follow-parent if you have moved/copied directories - instead.\n"; + if (grep /^\d+=./, @_) { + die "'=' fetch arguments are ", + "no longer supported.\n"; } - my $gs = Git::SVN->new; - $gs->fetch(parse_revision_argument()); - if ($gs->{last_commit} && !verify_ref('refs/heads/master^0')) { - command_noisy(qw(update-ref refs/heads/master), - $gs->{last_commit}); + my ($remote) = @_; + if (@_ > 1) { + die "Usage: $0 fetch [--all|-a] [svn-remote]\n"; + } + $remote ||= $Git::SVN::default_repo_id; + if ($_fetch_all) { + cmd_multi_fetch(); + } else { + Git::SVN::fetch_all($remote, Git::SVN::read_all_remotes()); } } @@ -440,18 +445,6 @@ sub cmd_commit_diff { ########################### utility functions ######################### -sub parse_revision_argument { - if (!defined $_revision || $_revision eq 'BASE:HEAD') { - return (undef, undef); - } - return ($1, $2) if ($_revision =~ /^(\d+):(\d+)$/); - return ($_revision, $_revision) if ($_revision =~ /^\d+$/); - return (undef, $1) if ($_revision =~ /^BASE:(\d+)$/); - return ($1, undef) if ($_revision =~ /^(\d+):HEAD$/); - die "revision argument: $_revision not understood by git-svn\n", - "Try using the command-line svn client instead\n"; -} - sub complete_svn_url { my ($url, $path) = @_; $path =~ s#/+$##; @@ -755,6 +748,19 @@ sub resolve_local_globs { } } +sub parse_revision_argument { + my ($base, $head) = @_; + if (!defined $::_revision || $::_revision eq 'BASE:HEAD') { + return ($base, $head); + } + return ($1, $2) if ($::_revision =~ /^(\d+):(\d+)$/); + return ($::_revision, $::_revision) if ($::_revision =~ /^\d+$/); + return ($head, $head) if ($::_revision eq 'HEAD'); + return ($base, $1) if ($::_revision =~ /^BASE:(\d+)$/); + return ($1, $head) if ($::_revision =~ /^(\d+):HEAD$/); + die "revision argument: $::_revision not understood by git-svn\n"; +} + sub fetch_all { my ($repo_id, $remotes) = @_; my $remote = $remotes->{$repo_id}; @@ -787,6 +793,8 @@ sub fetch_all { push @gs, $gs; } } + + ($base, $head) = parse_revision_argument($base, $head); $ra->gs_fetch_loop_common($base, $head, \@gs, \@globs); }