chiark / gitweb /
autopkgtests: reorganise t-refs-same et al.
[dgit.git] / dgit
diff --git a/dgit b/dgit
index b8922dae0c76c9970446eb59fa4ea98deaf01420..9b895b0350a7bc0cbf8b635b6c60779e648a1b24 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -441,6 +441,8 @@ sub cmd_help () {
     exit 0;
 }
 
+our $td = $ENV{DGIT_TEST_DUMMY_DIR} || "DGIT_TEST_DUMMY_DIR-unset";
+
 our %defcfg = ('dgit.default.distro' => 'debian',
               'dgit.default.username' => '',
               'dgit.default.archive-query-default-component' => 'main',
@@ -453,7 +455,18 @@ our %defcfg = ('dgit.default.distro' => 'debian',
               'dgit-distro.debian.sshpsql-host' => 'coccia.debian.org',
               'dgit-distro.debian.sshpsql-dbname' => 'service=projectb',
               'dgit-distro.debian.upload-host' => 'ftp-master', # for dput
-              'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/');
+              'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/',
+              'dgit-distro.test-dummy.ssh' => "$td/ssh",
+              'dgit-distro.test-dummy.username' => "alice",
+              'dgit-distro.test-dummy.git-check' => "ssh-cmd",
+              'dgit-distro.test-dummy.git-create' => "ssh-cmd",
+              'dgit-distro.test-dummy.git-url' => "$td/git",
+              'dgit-distro.test-dummy.git-host' => "git",
+              'dgit-distro.test-dummy.git-path' => "$td/git",
+              'dgit-distro.test-dummy.archive-query' => "dummycat:$td/aq",
+              'dgit-distro.test-dummy.mirror' => "file://$td/mirror/",
+              'dgit-distro.test-dummy.upload-host' => 'test-dummy',
+               );
 
 sub cfg {
     foreach my $c (@_) {
@@ -563,6 +576,23 @@ sub parsechangelog {
     return $c;
 }
 
+sub git_get_ref ($) {
+    my ($refname) = @_;
+    my $got = cmdoutput_errok @git, qw(show-ref --), $refname;
+    if (!defined $got) {
+       $?==256 or fail "git show-ref failed (status $?)";
+       printdebug "ref $refname= [show-ref exited 1]\n";
+       return '';
+    }
+    if ($got =~ m/^(\w+) \Q$refname\E$/m) {
+       printdebug "ref $refname=$1\n";
+       return $1;
+    } else {
+       printdebug "ref $refname= [no match]\n";
+       return '';
+    }
+}
+
 our %rmad;
 
 sub archive_query ($) {
@@ -638,7 +668,7 @@ sub sshpsql ($$) {
     my ($userhost,$dbname) = ($`,$'); #';
     my @rows;
     my @cmd = (access_cfg_ssh, $userhost,
-              shellquote qw(psql -A), $dbname, qw(-c), $sql);
+              "export LANG=C; ".shellquote qw(psql -A), $dbname, qw(-c), $sql);
     printcmd(\*DEBUG,$debugprefix."|",@cmd) if $debug>0;
     open P, "-|", @cmd or die $!;
     while (<P>) {
@@ -698,6 +728,45 @@ END
     return $rows[0];
 }
 
+sub canonicalise_suite_dummycat ($$) {
+    my ($proto,$data) = @_;
+    my $dpath = "$data/suite.$isuite";
+    if (!open C, "<", $dpath) {
+       $!==ENOENT or die "$dpath: $!";
+       printdebug "dummycat canonicalise_suite $isuite $dpath ENOENT\n";
+       return $isuite;
+    }
+    $!=0; $_ = <C>;
+    chomp or die "$dpath: $!";
+    close C;
+    printdebug "dummycat canonicalise_suite $isuite $dpath = $_\n";
+    return $_;
+}
+
+sub archive_query_dummycat ($$) {
+    my ($proto,$data) = @_;
+    canonicalise_suite();
+    my $dpath = "$data/package.$csuite.$package";
+    if (!open C, "<", $dpath) {
+       $!==ENOENT or die "$dpath: $!";
+       printdebug "dummycat query $csuite $package $dpath ENOENT\n";
+       return ();
+    }
+    my @rows;
+    while (<C>) {
+       next if m/^\#/;
+       next unless m/\S/;
+       die unless chomp;
+       printdebug "dummycat query $csuite $package $dpath | $_\n";
+       my @row = split /\s+/, $_;
+       @row==2 or die "$dpath: $_ ?";
+       push @rows, \@row;
+    }
+    C->error and die "$dpath: $!";
+    close C;
+    return sort { -version_compare_string($a->[0],$b->[0]); } @rows;
+}
+
 sub canonicalise_suite () {
     return if defined $csuite;
     fail "cannot operate on $isuite suite" if $isuite eq 'UNRELEASED';
@@ -983,22 +1052,13 @@ sub fetch_from_archive () {
        progress "no version available from the archive";
     }
 
-    my $lrref_fn = ".git/".lrref();
-    if (open H, $lrref_fn) {
-       $lastpush_hash = <H>;
-       chomp $lastpush_hash;
-       die "$lrref_fn $lastpush_hash ?" unless $lastpush_hash =~ m/^\w+$/;
-    } elsif ($! == &ENOENT) {
-       $lastpush_hash = '';
-    } else {
-       die "$lrref_fn $!";
-    }
+    $lastpush_hash = git_get_ref(lrref());
     printdebug "previous reference hash=$lastpush_hash\n";
     my $hash;
     if (defined $dsc_hash) {
-       fail "missing git history even though dsc has hash -".
-           " could not find commit $dsc_hash".
-           " (should be in ".access_giturl()."#".rrref().")"
+       fail "missing remote git history even though dsc has hash -".
+           " could not find ref ".lrref().
+           " (should have been fetched from ".access_giturl()."#".rrref().")"
            unless $lastpush_hash;
        $hash = $dsc_hash;
        ensure_we_have_orig();
@@ -1888,12 +1948,12 @@ sub parseopts () {
            } elsif (m/^--since-version=([^_]+|_)$/) {
                push @ropts, $_;
                $changes_since_version = $1;
-           } elsif (m/^--(\w+)=(.*)/s &&
+           } elsif (m/^--([-0-9a-z]+)=(.*)/s &&
                     ($om = $opts_opt_map{$1}) &&
                     length $om->[0]) {
                push @ropts, $_;
                $om->[0] = $2;
-           } elsif (m/^--(\w+):(.*)/s &&
+           } elsif (m/^--([-0-9a-z]+):(.*)/s &&
                     !$opts_opt_cmdonly{$1} &&
                     ($om = $opts_opt_map{$1})) {
                push @ropts, $_;