chiark / gitweb /
construct import commits differently (merge separate from contents)
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 279d92de1bb7a81a5351a1b6d20bd71a0e596cb4..819ea55801dc82e2c5a8a62de2f82e9d7a6817cd 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -336,6 +336,11 @@ sub is_orig_file ($) {
     m/\.orig(?:-\w+)?\.tar\.\w+$/;
 }
 
+sub make_commit ($) {
+    my ($file) = @_;
+    return cmdoutput @git, qw(hash-object -w -t commit), $file;
+}
+
 sub generate_commit_from_dsc () {
     prep_ud();
     chdir $ud or die $!;
@@ -362,9 +367,8 @@ sub generate_commit_from_dsc () {
     my $authline = "$author $date";
     $authline =~ m/^[^<>]+ \<\S+\> \d+ [-+]\d+$/ or die $authline;
     open C, ">../commit.tmp" or die $!;
-    print C "tree $tree\n" or die $!;
-    print C "parent $upload_hash\n" or die $! if $upload_hash;
     print C <<END or die $!;
+tree $tree
 author $authline
 committer $authline
 
@@ -373,10 +377,23 @@ $clogp->{Changes}
 # imported from the archive
 END
     close C or die $!;
-    my $commithash = cmdoutput @git, qw(hash-object -w -t commit ../commit.tmp);
+    my $commithash = make_commit qw(../commit.tmp);
+    if ($upload_hash) {
+       open C, ">../commit2.tmp" or die $!;
+       print C <<END or die $!;
+tree $tree
+parent $upload_hash
+parent $commithash
+author $authline
+committer $authline
+
+Record $package ($clogp->{Version}) in archive suite $suite
+END
+        $commithash = make_commit qw(../commit2.tmp);
+    }
     print "synthesised git commit from .dsc $clogp->{Version}\n";
     chdir '../../../..' or die $!;
-    cmdoutput @git, qw(update-ref -m),"dgit synthesise $clogp->{Version}",
+    cmdoutput @git, qw(update-ref -m),"dgit fetch import $clogp->{Version}",
               'DGIT_ARCHIVE', $commithash;
     cmdoutput @git, qw(log -n2), $commithash;
     # ... gives git a chance to complain if our commit is malformed
@@ -454,15 +471,17 @@ sub fetch_from_archive () {
        print "last upload to archive has NO git hash\n";
     }
 
-    $!=0; $upload_hash =
-       cmdoutput_errok @git, qw(show-ref --heads), lrref();
-    if ($?==0) {
-       die unless chomp $upload_hash;
-    } elsif ($?==256) {
+    my $lrref_fn = ".git/".lrref();
+    if (open H, $lrref_fn) {
+       $upload_hash = <H>;
+       chomp $upload_hash;
+       die "$lrref_fn $upload_hash ?" unless $upload_hash =~ m/^\w+$/;
+    } elsif ($! == &ENOENT) {
        $upload_hash = '';
     } else {
-       die $?;
+       die "$lrref_fn $!";
     }
+    print DEBUG "last upload hash $upload_hash\n";
     my $hash;
     if (defined $dsc_hash) {
        die "missing git history even though dsc has hash"