my ($_stdin, $_help, $_edit,
$_message, $_file,
$_template, $_shared,
- $_version,
+ $_version, $_fetch_all,
$_merge, $_strategy, $_dry_run,
$_prefix);
$Git::SVN::_follow_parent = 1;
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 ],
'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
}
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 "'<rev>=<commit>' 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());
}
}
########################### 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#/+$##;
}
}
+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};
push @gs, $gs;
}
}
+
+ ($base, $head) = parse_revision_argument($base, $head);
$ra->gs_fetch_loop_common($base, $head, \@gs, \@globs);
}
}
sub git_svn_log_cmd {
- my ($r_min, $r_max) = @_;
- my $gs = Git::SVN->_new;
+ my ($r_min, $r_max, @args) = @_;
+ my $head = 'HEAD';
+ foreach my $x (@args) {
+ last if $x eq '--';
+ next unless ::verify_ref("$x^0");
+ $head = $x;
+ last;
+ }
+
+ my $url;
+ my ($fh, $ctx) = command_output_pipe('rev-list', $head);
+ while (<$fh>) {
+ chomp;
+ $url = (::cmt_metadata($_))[0];
+ last if defined $url;
+ }
+ close $fh; # break the pipe
+
+ my $gs = Git::SVN->find_by_url($url) || Git::SVN->_new;
my @cmd = (qw/log --abbrev-commit --pretty=raw --default/,
$gs->refname);
push @cmd, '-r' unless $non_recursive;
}
config_pager();
- @args = (git_svn_log_cmd($r_min, $r_max), @args);
+ @args = (git_svn_log_cmd($r_min, $r_max, @args), @args);
my $log = command_output_pipe(@args);
run_pager();
my (@k, $c, $d);