git-svn: minor cleanups, extra error-checking
While we're at it, read_repo_config has been added and expanded to handle case where command-line arguments are optional to Getopt::Long Signed-off-by: Eric Wong <normalperson@yhbt.net>
This commit is contained in:
@ -77,39 +77,15 @@ for (my $i = 0; $i < @ARGV; $i++) {
|
|||||||
|
|
||||||
my %opts = %{$cmd{$cmd}->[2]} if (defined $cmd);
|
my %opts = %{$cmd{$cmd}->[2]} if (defined $cmd);
|
||||||
|
|
||||||
# convert GetOpt::Long specs for use by git-repo-config
|
read_repo_config(\%opts);
|
||||||
foreach my $o (keys %opts) {
|
|
||||||
my $v = $opts{$o};
|
|
||||||
my ($key) = ($o =~ /^([a-z\-]+)/);
|
|
||||||
$key =~ s/-//g;
|
|
||||||
my $arg = 'git-repo-config';
|
|
||||||
$arg .= ' --int' if ($o =~ /=i$/);
|
|
||||||
$arg .= ' --bool' if ($o !~ /=[sfi]$/);
|
|
||||||
if (ref $v eq 'ARRAY') {
|
|
||||||
chomp(my @tmp = `$arg --get-all svn.$key`);
|
|
||||||
@$v = @tmp if @tmp;
|
|
||||||
} else {
|
|
||||||
chomp(my $tmp = `$arg --get svn.$key`);
|
|
||||||
if ($tmp && !($arg =~ / --bool / && $tmp eq 'false')) {
|
|
||||||
$$v = $tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GetOptions(%opts, 'help|H|h' => \$_help,
|
GetOptions(%opts, 'help|H|h' => \$_help,
|
||||||
'version|V' => \$_version,
|
'version|V' => \$_version,
|
||||||
'id|i=s' => \$GIT_SVN) or exit 1;
|
'id|i=s' => \$GIT_SVN) or exit 1;
|
||||||
|
|
||||||
$GIT_SVN ||= $ENV{GIT_SVN_ID} || 'git-svn';
|
|
||||||
$GIT_SVN_DIR = "$GIT_DIR/svn/$GIT_SVN";
|
|
||||||
$GIT_SVN_INDEX = "$GIT_SVN_DIR/index";
|
|
||||||
$SVN_URL = undef;
|
|
||||||
$REV_DIR = "$GIT_SVN_DIR/revs";
|
|
||||||
$SVN_WC = "$GIT_SVN_DIR/tree";
|
|
||||||
|
|
||||||
usage(0) if $_help;
|
usage(0) if $_help;
|
||||||
version() if $_version;
|
version() if $_version;
|
||||||
usage(1) unless defined $cmd;
|
usage(1) unless defined $cmd;
|
||||||
|
init_vars();
|
||||||
load_authors() if $_authors;
|
load_authors() if $_authors;
|
||||||
load_all_refs() if $_branch_all_refs;
|
load_all_refs() if $_branch_all_refs;
|
||||||
svn_compat_check();
|
svn_compat_check();
|
||||||
@ -132,7 +108,7 @@ Usage: $0 <command> [options] [arguments]\n
|
|||||||
print $fd ' ',pack('A13',$_),$cmd{$_}->[1],"\n";
|
print $fd ' ',pack('A13',$_),$cmd{$_}->[1],"\n";
|
||||||
foreach (keys %{$cmd{$_}->[2]}) {
|
foreach (keys %{$cmd{$_}->[2]}) {
|
||||||
# prints out arguments as they should be passed:
|
# prints out arguments as they should be passed:
|
||||||
my $x = s#=s$## ? '<arg>' : s#=i$## ? '<num>' : '';
|
my $x = s#[:=]s$## ? '<arg>' : s#[:=]i$## ? '<num>' : '';
|
||||||
print $fd ' ' x 17, join(', ', map { length $_ > 1 ?
|
print $fd ' ' x 17, join(', ', map { length $_ > 1 ?
|
||||||
"--$_" : "-$_" }
|
"--$_" : "-$_" }
|
||||||
split /\|/,$_)," $x\n";
|
split /\|/,$_)," $x\n";
|
||||||
@ -220,9 +196,10 @@ sub rebuild {
|
|||||||
sys(@svn_up,"-r$newest_rev");
|
sys(@svn_up,"-r$newest_rev");
|
||||||
$ENV{GIT_INDEX_FILE} = $GIT_SVN_INDEX;
|
$ENV{GIT_INDEX_FILE} = $GIT_SVN_INDEX;
|
||||||
index_changes();
|
index_changes();
|
||||||
exec('git-write-tree');
|
exec('git-write-tree') or croak $!;
|
||||||
}
|
}
|
||||||
waitpid $pid, 0;
|
waitpid $pid, 0;
|
||||||
|
croak $? if $?;
|
||||||
|
|
||||||
if ($_upgrade) {
|
if ($_upgrade) {
|
||||||
print STDERR <<"";
|
print STDERR <<"";
|
||||||
@ -295,6 +272,7 @@ sub fetch {
|
|||||||
unless (-e "$GIT_DIR/refs/heads/master") {
|
unless (-e "$GIT_DIR/refs/heads/master") {
|
||||||
sys(qw(git-update-ref refs/heads/master),$last_commit);
|
sys(qw(git-update-ref refs/heads/master),$last_commit);
|
||||||
}
|
}
|
||||||
|
close $svn_log->{fh};
|
||||||
return $last;
|
return $last;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -830,7 +808,7 @@ sub svn_log_raw {
|
|||||||
exec (qw(svn log), @log_args) or croak $!
|
exec (qw(svn log), @log_args) or croak $!
|
||||||
}
|
}
|
||||||
waitpid $pid, 0;
|
waitpid $pid, 0;
|
||||||
croak if $?;
|
croak $? if $?;
|
||||||
seek $log_fh, 0, 0 or croak $!;
|
seek $log_fh, 0, 0 or croak $!;
|
||||||
return { state => 'sep', fh => $log_fh };
|
return { state => 'sep', fh => $log_fh };
|
||||||
}
|
}
|
||||||
@ -1090,7 +1068,7 @@ sub git_commit {
|
|||||||
$ENV{GIT_INDEX_FILE} = $GIT_SVN_INDEX;
|
$ENV{GIT_INDEX_FILE} = $GIT_SVN_INDEX;
|
||||||
index_changes();
|
index_changes();
|
||||||
chomp(my $tree = `git-write-tree`);
|
chomp(my $tree = `git-write-tree`);
|
||||||
croak if $?;
|
croak $? if $?;
|
||||||
if (exists $tree_map{$tree}) {
|
if (exists $tree_map{$tree}) {
|
||||||
my %seen_parent = map { $_ => 1 } @exec_parents;
|
my %seen_parent = map { $_ => 1 } @exec_parents;
|
||||||
foreach (@{$tree_map{$tree}}) {
|
foreach (@{$tree_map{$tree}}) {
|
||||||
@ -1118,7 +1096,7 @@ sub git_commit {
|
|||||||
exec @exec or croak $!;
|
exec @exec or croak $!;
|
||||||
}
|
}
|
||||||
waitpid($pid,0);
|
waitpid($pid,0);
|
||||||
croak if $?;
|
croak $? if $?;
|
||||||
|
|
||||||
$out_fh->flush == 0 or croak $!;
|
$out_fh->flush == 0 or croak $!;
|
||||||
seek $out_fh, 0, 0 or croak $!;
|
seek $out_fh, 0, 0 or croak $!;
|
||||||
@ -1134,7 +1112,7 @@ sub git_commit {
|
|||||||
close STDERR;
|
close STDERR;
|
||||||
close STDOUT;
|
close STDOUT;
|
||||||
exec 'git-rev-parse','--verify',
|
exec 'git-rev-parse','--verify',
|
||||||
"refs/remotes/$GIT_SVN^0";
|
"refs/remotes/$GIT_SVN^0" or croak $!;
|
||||||
}
|
}
|
||||||
waitpid $pid, 0;
|
waitpid $pid, 0;
|
||||||
push @update_ref, $primary_parent unless $?;
|
push @update_ref, $primary_parent unless $?;
|
||||||
@ -1190,7 +1168,7 @@ sub blob_to_file {
|
|||||||
|
|
||||||
if ($pid == 0) {
|
if ($pid == 0) {
|
||||||
open STDOUT, '>&', $blob_fh or croak $!;
|
open STDOUT, '>&', $blob_fh or croak $!;
|
||||||
exec('git-cat-file','blob',$blob);
|
exec('git-cat-file','blob',$blob) or croak $!;
|
||||||
}
|
}
|
||||||
waitpid $pid, 0;
|
waitpid $pid, 0;
|
||||||
croak $? if $?;
|
croak $? if $?;
|
||||||
@ -1202,7 +1180,7 @@ sub safe_qx {
|
|||||||
my $pid = open my $child, '-|';
|
my $pid = open my $child, '-|';
|
||||||
defined $pid or croak $!;
|
defined $pid or croak $!;
|
||||||
if ($pid == 0) {
|
if ($pid == 0) {
|
||||||
exec(@_) or croak $?;
|
exec(@_) or croak $!;
|
||||||
}
|
}
|
||||||
my @ret = (<$child>);
|
my @ret = (<$child>);
|
||||||
close $child or croak $?;
|
close $child or croak $?;
|
||||||
@ -1252,7 +1230,7 @@ sub check_upgrade_needed {
|
|||||||
defined $pid or croak $!;
|
defined $pid or croak $!;
|
||||||
if ($pid == 0) {
|
if ($pid == 0) {
|
||||||
close STDERR;
|
close STDERR;
|
||||||
exec('git-rev-parse',"$GIT_SVN-HEAD") or croak $?;
|
exec('git-rev-parse',"$GIT_SVN-HEAD") or croak $!;
|
||||||
}
|
}
|
||||||
my @ret = (<$child>);
|
my @ret = (<$child>);
|
||||||
close $child or croak $?;
|
close $child or croak $?;
|
||||||
@ -1276,7 +1254,7 @@ sub map_tree_joins {
|
|||||||
defined $pid or croak $!;
|
defined $pid or croak $!;
|
||||||
if ($pid == 0) {
|
if ($pid == 0) {
|
||||||
exec(qw(git-rev-list --topo-order --pretty=raw), $br)
|
exec(qw(git-rev-list --topo-order --pretty=raw), $br)
|
||||||
or croak $?;
|
or croak $!;
|
||||||
}
|
}
|
||||||
while (<$pipe>) {
|
while (<$pipe>) {
|
||||||
if (/^commit ($sha1)$/o) {
|
if (/^commit ($sha1)$/o) {
|
||||||
@ -1352,6 +1330,38 @@ sub migration_check {
|
|||||||
print "Done upgrading.\n";
|
print "Done upgrading.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub init_vars {
|
||||||
|
$GIT_SVN ||= $ENV{GIT_SVN_ID} || 'git-svn';
|
||||||
|
$GIT_SVN_DIR = "$GIT_DIR/svn/$GIT_SVN";
|
||||||
|
$GIT_SVN_INDEX = "$GIT_SVN_DIR/index";
|
||||||
|
$SVN_URL = undef;
|
||||||
|
$REV_DIR = "$GIT_SVN_DIR/revs";
|
||||||
|
$SVN_WC = "$GIT_SVN_DIR/tree";
|
||||||
|
}
|
||||||
|
|
||||||
|
# convert GetOpt::Long specs for use by git-repo-config
|
||||||
|
sub read_repo_config {
|
||||||
|
return unless -d $GIT_DIR;
|
||||||
|
my $opts = shift;
|
||||||
|
foreach my $o (keys %$opts) {
|
||||||
|
my $v = $opts->{$o};
|
||||||
|
my ($key) = ($o =~ /^([a-z\-]+)/);
|
||||||
|
$key =~ s/-//g;
|
||||||
|
my $arg = 'git-repo-config';
|
||||||
|
$arg .= ' --int' if ($o =~ /[:=]i$/);
|
||||||
|
$arg .= ' --bool' if ($o !~ /[:=][sfi]$/);
|
||||||
|
if (ref $v eq 'ARRAY') {
|
||||||
|
chomp(my @tmp = `$arg --get-all svn.$key`);
|
||||||
|
@$v = @tmp if @tmp;
|
||||||
|
} else {
|
||||||
|
chomp(my $tmp = `$arg --get svn.$key`);
|
||||||
|
if ($tmp && !($arg =~ / --bool / && $tmp eq 'false')) {
|
||||||
|
$$v = $tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
Data structures:
|
Data structures:
|
||||||
|
Reference in New Issue
Block a user