cvsimport: keep one index per branch during import
With this patch we have a speedup and much lower IO when importing trees with many branches. Instead of forcing index re-population for each branch switch, we keep many index files around, one per branch. Signed-off-by: Martin Langhoff <martin@catalyst.net.nz> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
2f57c69792
commit
8f732649bc
31
git-cvsimport.perl
Executable file → Normal file
31
git-cvsimport.perl
Executable file → Normal file
@ -465,10 +465,15 @@ $git_dir = getwd()."/".$git_dir unless $git_dir =~ m#^/#;
|
|||||||
$ENV{"GIT_DIR"} = $git_dir;
|
$ENV{"GIT_DIR"} = $git_dir;
|
||||||
my $orig_git_index;
|
my $orig_git_index;
|
||||||
$orig_git_index = $ENV{GIT_INDEX_FILE} if exists $ENV{GIT_INDEX_FILE};
|
$orig_git_index = $ENV{GIT_INDEX_FILE} if exists $ENV{GIT_INDEX_FILE};
|
||||||
my ($git_ih, $git_index) = tempfile('gitXXXXXX', SUFFIX => '.idx',
|
|
||||||
|
my %index; # holds filenames of one index per branch
|
||||||
|
{ # init with an index for origin
|
||||||
|
my ($fh, $fn) = tempfile('gitXXXXXX', SUFFIX => '.idx',
|
||||||
DIR => File::Spec->tmpdir());
|
DIR => File::Spec->tmpdir());
|
||||||
close ($git_ih);
|
close ($fh);
|
||||||
$ENV{GIT_INDEX_FILE} = $git_index;
|
$index{$opt_o} = $fn;
|
||||||
|
}
|
||||||
|
$ENV{GIT_INDEX_FILE} = $index{$opt_o};
|
||||||
unless(-d $git_dir) {
|
unless(-d $git_dir) {
|
||||||
system("git-init-db");
|
system("git-init-db");
|
||||||
die "Cannot init the GIT db at $git_tree: $?\n" if $?;
|
die "Cannot init the GIT db at $git_tree: $?\n" if $?;
|
||||||
@ -496,6 +501,13 @@ unless(-d $git_dir) {
|
|||||||
$tip_at_start = `git-rev-parse --verify HEAD`;
|
$tip_at_start = `git-rev-parse --verify HEAD`;
|
||||||
|
|
||||||
# populate index
|
# populate index
|
||||||
|
unless ($index{$last_branch}) {
|
||||||
|
my ($fh, $fn) = tempfile('gitXXXXXX', SUFFIX => '.idx',
|
||||||
|
DIR => File::Spec->tmpdir());
|
||||||
|
close ($fh);
|
||||||
|
$index{$last_branch} = $fn;
|
||||||
|
}
|
||||||
|
$ENV{GIT_INDEX_FILE} = $index{$last_branch};
|
||||||
system('git-read-tree', $last_branch);
|
system('git-read-tree', $last_branch);
|
||||||
die "read-tree failed: $?\n" if $?;
|
die "read-tree failed: $?\n" if $?;
|
||||||
|
|
||||||
@ -805,8 +817,17 @@ while(<CVS>) {
|
|||||||
}
|
}
|
||||||
if(($ancestor || $branch) ne $last_branch) {
|
if(($ancestor || $branch) ne $last_branch) {
|
||||||
print "Switching from $last_branch to $branch\n" if $opt_v;
|
print "Switching from $last_branch to $branch\n" if $opt_v;
|
||||||
|
unless ($index{$branch}) {
|
||||||
|
my ($fh, $fn) = tempfile('gitXXXXXX', SUFFIX => '.idx',
|
||||||
|
DIR => File::Spec->tmpdir());
|
||||||
|
close ($fh);
|
||||||
|
$index{$branch} = $fn;
|
||||||
|
$ENV{GIT_INDEX_FILE} = $index{$branch};
|
||||||
system("git-read-tree", $branch);
|
system("git-read-tree", $branch);
|
||||||
die "read-tree failed: $?\n" if $?;
|
die "read-tree failed: $?\n" if $?;
|
||||||
|
} else {
|
||||||
|
$ENV{GIT_INDEX_FILE} = $index{$branch};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$last_branch = $branch if $branch ne $last_branch;
|
$last_branch = $branch if $branch ne $last_branch;
|
||||||
$state = 9;
|
$state = 9;
|
||||||
@ -870,7 +891,9 @@ while(<CVS>) {
|
|||||||
}
|
}
|
||||||
commit() if $branch and $state != 11;
|
commit() if $branch and $state != 11;
|
||||||
|
|
||||||
unlink($git_index);
|
foreach my $git_index (values %index) {
|
||||||
|
unlink($git_index);
|
||||||
|
}
|
||||||
|
|
||||||
if (defined $orig_git_index) {
|
if (defined $orig_git_index) {
|
||||||
$ENV{GIT_INDEX_FILE} = $orig_git_index;
|
$ENV{GIT_INDEX_FILE} = $orig_git_index;
|
||||||
|
Loading…
Reference in New Issue
Block a user