зеркало из https://github.com/microsoft/git.git
[PATCH] archimport autodetects import status, supports incremental imports
If there is no GIT directory, archimport will assume it is an initial import. It now also supports incremental imports, skipping "seen" commits. You can now run it repeatedly to pull new commits from the Arch repository. Signed-off-by: Martin Langhoff <martin@catalyst.net.nz> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
ce726ec8d8
Коммит
3292ae4794
|
@ -49,12 +49,12 @@ $SIG{'PIPE'}="IGNORE";
|
||||||
$ENV{'TZ'}="UTC";
|
$ENV{'TZ'}="UTC";
|
||||||
|
|
||||||
our($opt_h,$opt_v, $opt_T,
|
our($opt_h,$opt_v, $opt_T,
|
||||||
$opt_C,$opt_t, $opt_i);
|
$opt_C,$opt_t);
|
||||||
|
|
||||||
sub usage() {
|
sub usage() {
|
||||||
print STDERR <<END;
|
print STDERR <<END;
|
||||||
Usage: ${\basename $0} # fetch/update GIT from Arch
|
Usage: ${\basename $0} # fetch/update GIT from Arch
|
||||||
[ -h ] [ -v ] [ -i ] [ -T ]
|
[ -h ] [ -v ] [ -T ]
|
||||||
[ -C GIT_repository ] [ -t tempdir ]
|
[ -C GIT_repository ] [ -t tempdir ]
|
||||||
repository/arch-branch [ repository/arch-branch] ...
|
repository/arch-branch [ repository/arch-branch] ...
|
||||||
END
|
END
|
||||||
|
@ -173,21 +173,19 @@ foreach my $root (@arch_roots) {
|
||||||
## TODO cleanup irrelevant patches
|
## TODO cleanup irrelevant patches
|
||||||
## and put an initial import
|
## and put an initial import
|
||||||
## or a full tag
|
## or a full tag
|
||||||
|
my $import = 0;
|
||||||
if ($opt_i) { # initial import
|
unless (-d '.git') { # initial import
|
||||||
if ($psets[0]{type} eq 'i' || $psets[0]{type} eq 't') {
|
if ($psets[0]{type} eq 'i' || $psets[0]{type} eq 't') {
|
||||||
print "Starting import from $psets[0]{id}\n";
|
print "Starting import from $psets[0]{id}\n";
|
||||||
|
`git-init-db`;
|
||||||
|
die $! if $?;
|
||||||
|
$import = 1;
|
||||||
} else {
|
} else {
|
||||||
die "Need to start from an import or a tag -- cannot use $psets[0]{id}";
|
die "Need to start from an import or a tag -- cannot use $psets[0]{id}";
|
||||||
}
|
}
|
||||||
`git-init-db`;
|
|
||||||
die $! if $?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# process
|
# process patchsets
|
||||||
my $lastbranch = branchname($psets[0]{id}); # only good for initial import
|
|
||||||
my $importseen = $opt_i ? 0 : 1; # start at 1 if opt_i
|
|
||||||
|
|
||||||
foreach my $ps (@psets) {
|
foreach my $ps (@psets) {
|
||||||
|
|
||||||
$ps->{branch} = branchname($ps->{id});
|
$ps->{branch} = branchname($ps->{id});
|
||||||
|
@ -201,14 +199,22 @@ foreach my $ps (@psets) {
|
||||||
}
|
}
|
||||||
die $! if $?;
|
die $! if $?;
|
||||||
|
|
||||||
|
#
|
||||||
|
# skip commits already in repo
|
||||||
|
#
|
||||||
|
if (ptag($ps->{id})) {
|
||||||
|
$opt_v && print "Skipping already imported: $ps->{id}\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# create the branch if needed
|
# create the branch if needed
|
||||||
#
|
#
|
||||||
if ($ps->{type} eq 'i' && $importseen) {
|
if ($ps->{type} eq 'i' && !$import) {
|
||||||
die "Should not have more than one 'Initial import' per GIT import";
|
die "Should not have more than one 'Initial import' per GIT import: $ps->{id}";
|
||||||
}
|
}
|
||||||
|
|
||||||
unless ($opt_i && !$importseen) { # skip for first commit
|
unless ($import) { # skip for import
|
||||||
if ( -e ".git/refs/heads/$ps->{branch}") {
|
if ( -e ".git/refs/heads/$ps->{branch}") {
|
||||||
# we know about this branch
|
# we know about this branch
|
||||||
`git checkout $ps->{branch}`;
|
`git checkout $ps->{branch}`;
|
||||||
|
@ -225,13 +231,12 @@ foreach my $ps (@psets) {
|
||||||
die $! if $?;
|
die $! if $?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Apply the import/changeset/merge into the working tree
|
# Apply the import/changeset/merge into the working tree
|
||||||
#
|
#
|
||||||
if ($ps->{type} eq 'i' || $ps->{type} eq 't') {
|
if ($ps->{type} eq 'i' || $ps->{type} eq 't') {
|
||||||
$importseen = 1;
|
|
||||||
apply_import($ps) or die $!;
|
apply_import($ps) or die $!;
|
||||||
|
$import=0;
|
||||||
} elsif ($ps->{type} eq 's') {
|
} elsif ($ps->{type} eq 's') {
|
||||||
apply_cset($ps);
|
apply_cset($ps);
|
||||||
}
|
}
|
||||||
|
@ -577,8 +582,6 @@ sub ptag {
|
||||||
} else { # read
|
} else { # read
|
||||||
# if the tag isn't there, return 0
|
# if the tag isn't there, return 0
|
||||||
unless ( -s ".git/archimport/tags/$tag") {
|
unless ( -s ".git/archimport/tags/$tag") {
|
||||||
warn "Could not find tag $tag -- perhaps it isn't in the repos we have?\n"
|
|
||||||
if $opt_v;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
open(C,"<.git/archimport/tags/$tag")
|
open(C,"<.git/archimport/tags/$tag")
|
||||||
|
|
Загрузка…
Ссылка в новой задаче