Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
Junio C Hamano committed Nov 17, 2005
2 parents f30c95d + fee3365 commit a575603
Showing 1 changed file with 103 additions and 42 deletions.
145 changes: 103 additions & 42 deletions git-archimport.perl
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,24 @@ =head1 Devel tricks
Add print in front of the shell commands invoked via backticks.
=head1 Devel Notes
There are several places where Arch and git terminology are intermixed
and potentially confused.
The notion of a "branch" in git is approximately equivalent to
a "archive/category--branch--version" in Arch. Also, it should be noted
that the "--branch" portion of "archive/category--branch--version" is really
optional in Arch although not many people (nor tools!) seem to know this.
This means that "archive/category--version" is also a valid "branch"
in git terms.
We always refer to Arch names by their fully qualified variant (which
means the "archive" name is prefixed.
For people unfamiliar with Arch, an "archive" is the term for "repository",
and can contain multiple, unrelated branches.
=cut

use strict;
Expand All @@ -52,14 +70,14 @@ =head1 Devel tricks

my $git_dir = $ENV{"GIT_DIR"} || ".git";
$ENV{"GIT_DIR"} = $git_dir;
my $ptag_dir = "$git_dir/archimport/tags";

our($opt_h,$opt_v, $opt_T,
$opt_C,$opt_t);
our($opt_h,$opt_v, $opt_T,$opt_t,$opt_o);

sub usage() {
print STDERR <<END;
Usage: ${\basename $0} # fetch/update GIT from Arch
[ -h ] [ -v ] [ -T ] [ -t tempdir ]
[ -o ] [ -h ] [ -v ] [ -T ] [ -t tempdir ]
repository/arch-branch [ repository/arch-branch] ...
END
exit(1);
Expand Down Expand Up @@ -195,25 +213,68 @@ END
opendir(DIR, "$git_dir/archimport/tags")
|| die "can't opendir: $!";
while (my $file = readdir(DIR)) {
# skip non-interesting-files
next unless -f "$git_dir/archimport/tags/$file";
next if $file =~ m/--base-0$/; # don't care for base-0
# skip non-interesting-files
next unless -f "$ptag_dir/$file";

# convert first '--' to '/' from old git-archimport to use
# as an archivename/c--b--v private tag
if ($file !~ m!,!) {
my $oldfile = $file;
$file =~ s!--!,!;
print STDERR "converting old tag $oldfile to $file\n";
rename("$ptag_dir/$oldfile", "$ptag_dir/$file") or die $!;
}
my $sha = ptag($file);
chomp $sha;
# reconvert the 3rd '--' sequence from the end
# into a slash
# $file = reverse $file;
# $file =~ s!^(.+?--.+?--.+?--.+?)--(.+)$!$1/$2!;
# $file = reverse $file;
$rptags{$sha} = $file;
}
closedir DIR;
}

# process patchsets
foreach my $ps (@psets) {
# extract the Arch repository name (Arch "archive" in Arch-speak)
sub extract_reponame {
my $fq_cvbr = shift; # archivename/[[[[category]branch]version]revision]
return (split(/\//, $fq_cvbr))[0];
}

sub extract_versionname {
my $name = shift;
$name =~ s/--(?:patch|version(?:fix)?|base)-\d+$//;
return $name;
}

# convert a fully-qualified revision or version to a unique dirname:
# normalperson@yhbt.net-05/mpd--uclinux--1--patch-2
# becomes: normalperson@yhbt.net-05,mpd--uclinux--1
#
# the git notion of a branch is closer to
# archive/category--branch--version than archive/category--branch, so we
# use this to convert to git branch names.
# Also, keep archive names but replace '/' with ',' since it won't require
# subdirectories, and is safer than swapping '--' which could confuse
# reverse-mapping when dealing with bastard branches that
# are just archive/category--version (no --branch)
sub tree_dirname {
my $revision = shift;
my $name = extract_versionname($revision);
$name =~ s#/#,#;
return $name;
}

$ps->{branch} = branchname($ps->{id});
# old versions of git-archimport just use the <category--branch> part:
sub old_style_branchname {
my $id = shift;
my $ret = safe_pipe_capture($TLA,'parse-package-name','-p',$id);
chomp $ret;
return $ret;
}

*git_branchname = $opt_o ? *old_style_branchname : *tree_dirname;

# process patchsets
foreach my $ps (@psets) {
$ps->{branch} = git_branchname($ps->{id});

#
# ensure we have a clean state
Expand Down Expand Up @@ -424,16 +485,9 @@ END
$opt_v && print " + parents: $par \n";
}

sub branchname {
my $id = shift;
$id =~ s#^.+?/##;
my @parts = split(m/--/, $id);
return join('--', @parts[0..1]);
}

sub apply_import {
my $ps = shift;
my $bname = branchname($ps->{id});
my $bname = git_branchname($ps->{id});

`mkdir -p $tmp`;

Expand Down Expand Up @@ -581,19 +635,24 @@ sub parselog {
# write/read a tag
sub tag {
my ($tag, $commit) = @_;
$tag =~ s|/|--|g;
$tag = shell_quote($tag);

if ($opt_o) {
$tag =~ s|/|--|g;
} else {
# don't use subdirs for tags yet, it could screw up other porcelains
$tag =~ s|/|,|g;
}

if ($commit) {
open(C,">$git_dir/refs/tags/$tag")
open(C,">","$git_dir/refs/tags/$tag")
or die "Cannot create tag $tag: $!\n";
print C "$commit\n"
or die "Cannot write tag $tag: $!\n";
close(C)
or die "Cannot write tag $tag: $!\n";
print " * Created tag ' $tag' on '$commit'\n" if $opt_v;
print " * Created tag '$tag' on '$commit'\n" if $opt_v;
} else { # read
open(C,"<$git_dir/refs/tags/$tag")
open(C,"<","$git_dir/refs/tags/$tag")
or die "Cannot read tag $tag: $!\n";
$commit = <C>;
chomp $commit;
Expand All @@ -608,15 +667,16 @@ sub tag {
# reads fail softly if the tag isn't there
sub ptag {
my ($tag, $commit) = @_;
$tag =~ s|/|--|g;
$tag = shell_quote($tag);

# don't use subdirs for tags yet, it could screw up other porcelains
$tag =~ s|/|,|g;

unless (-d "$git_dir/archimport/tags") {
mkpath("$git_dir/archimport/tags");
}
my $tag_file = "$ptag_dir/$tag";
my $tag_branch_dir = dirname($tag_file);
mkpath($tag_branch_dir) unless (-d $tag_branch_dir);

if ($commit) { # write
open(C,">$git_dir/archimport/tags/$tag")
open(C,">",$tag_file)
or die "Cannot create tag $tag: $!\n";
print C "$commit\n"
or die "Cannot write tag $tag: $!\n";
Expand All @@ -626,10 +686,10 @@ sub ptag {
unless $tag =~ m/--base-0$/;
} else { # read
# if the tag isn't there, return 0
unless ( -s "$git_dir/archimport/tags/$tag") {
unless ( -s $tag_file) {
return 0;
}
open(C,"<$git_dir/archimport/tags/$tag")
open(C,"<",$tag_file)
or die "Cannot read tag $tag: $!\n";
$commit = <C>;
chomp $commit;
Expand Down Expand Up @@ -662,7 +722,7 @@ sub find_parents {
# simple loop to split the merges
# per branch
foreach my $merge (@{$ps->{merges}}) {
my $branch = branchname($merge);
my $branch = git_branchname($merge);
unless (defined $branches{$branch} ){
$branches{$branch} = [];
}
Expand All @@ -686,7 +746,13 @@ sub find_parents {
next unless -e "$git_dir/refs/heads/$branch";

my $mergebase = `git-merge-base $branch $ps->{branch}`;
die "Cannot find merge base for $branch and $ps->{branch}" if $?;
if ($?) {
# Don't die here, Arch supports one-way cherry-picking
# between branches with no common base (or any relationship
# at all beforehand)
warn "Cannot find merge base for $branch and $ps->{branch}";
next;
}
chomp $mergebase;

# now walk up to the mergepoint collecting what patches we have
Expand Down Expand Up @@ -779,12 +845,7 @@ sub commitid2pset {
chomp $commitid;
my $name = $rptags{$commitid}
|| die "Cannot find reverse tag mapping for $commitid";
# the keys in %rptag are slightly munged; unmunge
# reconvert the 3rd '--' sequence from the end
# into a slash
$name = reverse $name;
$name =~ s!^(.+?--.+?--.+?--.+?)--(.+)$!$1/$2!;
$name = reverse $name;
$name =~ s|,|/|;
my $ps = $psets{$name}
|| (print Dumper(sort keys %psets)) && die "Cannot find patchset for $name";
return $ps;
Expand Down

0 comments on commit a575603

Please sign in to comment.