X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=dgit;h=a75a0711a2dcb48a0a3ac8a7f8f4468e1ea0b86b;hb=3940b368db5ffb18b61b6857c22498b46094fca1;hp=497687ac2b7932d34a4eb5f893a0bdb647339b81;hpb=f2a1ab46505797714043bb64897135972f9ffe09;p=dgit.git diff --git a/dgit b/dgit index 497687ac..a75a0711 100755 --- a/dgit +++ b/dgit @@ -45,6 +45,7 @@ our $ignoredirty = 0; our $noquilt = 0; our $existing_package = 'dpkg'; our $cleanmode = 'dpkg-source'; +our $changes_since_version; our $we_are_responder; our $initiator_tempdir; @@ -113,8 +114,6 @@ sub dscfn ($) { return "${package}_".(stripepoch $vsn).".dsc"; } -sub changesopts () { return @changesopts[1..$#changesopts]; } - our $us = 'dgit'; our $debugprefix = ''; @@ -313,7 +312,8 @@ sub shellquote { local $_; foreach my $a (@_) { $_ = $a; - if (s{['\\]}{\\$&}g || m{\s} || m{[^-_./0-9a-z]}i) { + if (m{[^-=_./0-9a-z]}i) { + s{['\\]}{'\\$&'}g; push @out, "'$_'"; } else { push @out, $_; @@ -450,9 +450,8 @@ our %defcfg = ('dgit.default.distro' => 'debian', 'dgit-distro.debian.git-path' => '/git/dgit-repos/repos', 'dgit-distro.debian.git-check' => 'ssh-cmd', 'dgit-distro.debian.git-create' => 'ssh-cmd', - 'dgit-distro.debian.sshdakls-host' => 'coccia.debian.org', - 'dgit-distro.debian.sshdakls-dir' => - '/srv/ftp-master.debian.org/ftp/dists', + '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/'); @@ -572,9 +571,9 @@ sub archive_query ($) { if (!defined $query) { my $distro = access_distro(); if ($distro eq 'debian') { - $query = "sshdakls:". - access_someuserhost('sshdakls').':'. - access_cfg('sshdakls-dir'); + $query = "sshpsql:". + access_someuserhost('sshpsql').':'. + access_cfg('sshpsql-dbname'); } else { $query = "madison:$distro"; } @@ -585,6 +584,12 @@ sub archive_query ($) { { no strict qw(refs); &{"${method}_${proto}"}($proto,$data); } } +sub pool_dsc_subpath ($$) { + my ($vsn,$component) = @_; # $package is implict arg + my $prefix = substr($package, 0, $package =~ m/^l/ ? 4 : 1); + return "/pool/$component/$prefix/$package/".dscfn($vsn); +} + sub archive_query_madison ($$) { my ($proto,$data) = @_; die unless $proto eq 'madison'; @@ -594,28 +599,6 @@ sub archive_query_madison ($$) { return madison_parse($rmad); } -sub archive_query_sshdakls ($$) { - my ($proto,$data) = @_; - $data =~ s/:.*// or badcfg "invalid sshdakls method string \`$data'"; - my $dakls = cmdoutput - access_cfg_ssh, $data, qw(dak ls -asource),"-s$isuite",$package; - return madison_parse($dakls); -} - -sub canonicalise_suite_sshdakls ($$) { - my ($proto,$data) = @_; - $data =~ m/:/ or badcfg "invalid sshdakls method string \`$data'"; - my @cmd = - (access_cfg_ssh, $`, - "set -e; cd $';". - " if test -h $isuite; then readlink $isuite; exit 0; fi;". - " if test -d $isuite; then echo $isuite; exit 0; fi;". - " exit 1"); - my $dakls = cmdoutput @cmd; - failedcmd @cmd unless $dakls =~ m/^\w/; - return $dakls; -} - sub madison_parse ($) { my ($rmad) = @_; my @out; @@ -634,14 +617,13 @@ sub madison_parse ($) { $component = access_cfg('archive-query-default-component'); } $5 eq 'source' or die "$rmad ?"; - my $prefix = substr($package, 0, $package =~ m/^l/ ? 4 : 1); - my $subpath = "/pool/$component/$prefix/$package/".dscfn($vsn); - push @out, [$vsn,$subpath,$newsuite]; + push @out, [$vsn,pool_dsc_subpath($vsn,$component),$newsuite]; } return sort { -version_compare_string($a->[0],$b->[0]); } @out; } sub canonicalise_suite_madison ($$) { + # madison canonicalises for us my @r = archive_query_madison($_[0],$_[1]); @r or fail "unable to canonicalise suite using package $package". @@ -650,12 +632,77 @@ sub canonicalise_suite_madison ($$) { return $r[0][2]; } +sub sshpsql ($$) { + my ($data,$sql) = @_; + $data =~ m/:/ or badcfg "invalid sshpsql method string \`$data'"; + my ($userhost,$dbname) = ($`,$'); #'; + my @rows; + my @cmd = (access_cfg_ssh, $userhost, + shellquote qw(psql -A), $dbname, qw(-c), $sql); + printcmd(\*DEBUG,$debugprefix."|",@cmd) if $debug>0; + open P, "-|", @cmd or die $!; + while (
) {
+ chomp or die;
+ printdebug("$debugprefix>|$_|\n");
+ push @rows, $_;
+ }
+ $!=0; $?=0; close P or die "$! $?";
+ @rows or die;
+ my $nrows = pop @rows;
+ $nrows =~ s/^\((\d+) rows?\)$/$1/ or die "$nrows ?";
+ @rows == $nrows+1 or die "$nrows ".(scalar @rows)." ?";
+ @rows = map { [ split /\|/, $_ ] } @rows;
+ my $ncols = scalar @{ shift @rows };
+ die if grep { scalar @$_ != $ncols } @rows;
+ return @rows;
+}
+
+sub sql_injection_check {
+ foreach (@_) { die "$_ $& ?" if m/[']/; }
+}
+
+sub archive_query_sshpsql ($$) {
+ my ($proto,$data) = @_;
+ sql_injection_check $isuite, $package;
+ my @rows = sshpsql($data, <