chiark / gitweb /
Use ftpasterapi archive query method for tests
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 2e67eb5be574b26115d412101be1956c314d9bfb..e5c8eab9a30cc69292cf912252df615549c236ca 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -518,7 +518,7 @@ our %defcfg = ('dgit.default.distro' => 'debian',
               'dgit.default.ssh' => 'ssh',
               'dgit.default.archive-query' => 'madison:',
               'dgit.default.sshpsql-dbname' => 'service=projectb',
-              'dgit-distro.debian.archive-query' => 'sshpsql:',
+              'dgit-distro.debian.archive-query' => 'ftpmasterapi:',
               'dgit-distro.debian.git-host' => 'dgit-git.debian.net',
               'dgit-distro.debian.git-user-force' => 'dgit',
               'dgit-distro.debian.git-proto' => 'git+ssh://',
@@ -533,7 +533,6 @@ our %defcfg = ('dgit.default.distro' => 'debian',
               'dgit-distro.debian/alioth.git-proto' => 'git+ssh://',
               'dgit-distro.debian/alioth.git-path' => '/git/dgit-repos/repos',
               'dgit-distro.debian/alioth.git-create' => 'ssh-cmd',
-              'dgit-distro.debian.sshpsql-host' => 'mirror.ftp-master.debian.org',
               'dgit-distro.debian.upload-host' => 'ftp-master', # for dput
               'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/',
  'dgit-distro.debian.backports-quirk' => '(squeeze)-backports*',
@@ -547,7 +546,8 @@ our %defcfg = ('dgit.default.distro' => 'debian',
               '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.archive-query' => "ftpmasterapi:",
+              'dgit-distro.test-dummy.archive-query-url' => "file://$td/aq/",
               'dgit-distro.test-dummy.mirror' => "file://$td/mirror/",
               'dgit-distro.test-dummy.upload-host' => 'test-dummy',
                );
@@ -790,7 +790,7 @@ sub pool_dsc_subpath ($$) {
     return "/pool/$component/$prefix/$package/".dscfn($vsn);
 }
 
-#---------- `ftpmaster-api' archive query method (nascent) ----------
+#---------- `ftpmasterapi' archive query method (nascent) ----------
 
 sub archive_api_query_cmd ($) {
     my ($subpath) = @_;
@@ -813,6 +813,67 @@ sub archive_api_query_cmd ($) {
     return @cmd;
 }
 
+sub api_query ($$) {
+    use JSON;
+    my ($data, $subpath) = @_;
+    badcfg "ftpmasterapi archive query method takes no data part"
+       if length $data;
+    my @cmd = archive_api_query_cmd($subpath);
+    my $json = cmdoutput @cmd;
+    return decode_json($json);
+}
+
+sub canonicalise_suite_ftpmasterapi () {
+    my ($proto,$data) = @_;
+    my $suites = api_query($data, 'suites');
+    my @matched;
+    foreach my $entry (@$suites) {
+       next unless grep { 
+           my $v = $entry->{$_};
+           defined $v && $v eq $isuite;
+       } qw(codename name);
+       push @matched, $entry;
+    }
+    fail "unknown suite $isuite" unless @matched;
+    my $cn;
+    eval {
+       @matched==1 or die "multiple matches for suite $isuite\n";
+       $cn = "$matched[0]{codename}";
+       defined $cn or die "suite $isuite info has no codename\n";
+       $cn =~ m/^$suite_re$/ or die "suite $isuite maps to bad codename\n";
+    };
+    die "bad ftpmaster api response: $@\n".Dumper(\@matched)
+       if length $@;
+    return $cn;
+}
+
+sub archive_query_ftpmasterapi () {
+    my ($proto,$data) = @_;
+    my $info = api_query($data, "dsc_in_suite/$isuite/$package");
+    my @rows;
+    my $digester = Digest::SHA->new(256);
+    foreach my $entry (@$info) {
+       eval {
+           my $vsn = "$entry->{version}";
+           my ($ok,$msg) = version_check $vsn;
+           die "bad version: $msg\n" unless $ok;
+           my $component = "$entry->{component}";
+           $component =~ m/^$component_re$/ or die "bad component";
+           my $filename = "$entry->{filename}";
+           $filename && $filename !~ m#[^-+:._~0-9a-zA-Z/]|^[/.]|/[/.]#
+               or die "bad filename";
+           my $sha256sum = "$entry->{sha256sum}";
+           $sha256sum =~ m/^[0-9a-f]+$/ or die "bad sha256sum";
+           push @rows, [ $vsn, "/pool/$component/$filename",
+                         $digester, $sha256sum ];
+       };
+       die "bad ftpmaster api response: $@\n".Dumper($entry)
+           if length $@;
+    }
+    @rows = sort { -version_compare($a->[0],$b->[0]) } @rows;
+    return @rows;
+}
+
 #---------- `madison' archive query method ----------
 
 sub archive_query_madison {
@@ -1355,8 +1416,8 @@ $later_warning_msg
 END
            $hash = $lastpush_hash;
        } else {
-           fail "archive's .dsc refers to ".$dsc_hash.
-               " but this is an ancestor of ".$lastpush_hash;
+           fail "git head (".lrref()."=$lastpush_hash) is not a ".
+               "descendant of archive's .dsc hash ($dsc_hash)";
        }
     } elsif ($dsc) {
        $hash = generate_commit_from_dsc();