X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=blobdiff_plain;f=yarrg%2FCommods.pm;h=b7b18a615a2384e0b2dd51b5e0bc3d58fcde916e;hp=d9e9d34e48214fc3bfb5bb5168dff3e3572dc76b;hb=bb95133fcfbd4698daa59debdbaa73a4d1e6252a;hpb=9140d5a3e99e6b98d3f792cb1f82e4d7a0e116d7 diff --git a/yarrg/Commods.pm b/yarrg/Commods.pm index d9e9d34..b7b18a6 100644 --- a/yarrg/Commods.pm +++ b/yarrg/Commods.pm @@ -22,6 +22,7 @@ package Commods; use IO::File; +use IO::Pipe; use HTTP::Request::Common (); use POSIX; use LWP::UserAgent; @@ -36,16 +37,17 @@ BEGIN { @ISA = qw(Exporter); @EXPORT = qw(&parse_info_clientside &fetch_with_rsync &parse_info_serverside &parse_info_serverside_ocean - %oceans %commods %clients + %oceans %commods %clients %commodclasses %vessels %shotname2damage &parse_pctb_commodmap %pctb_commodmap @pctb_commodmap - &get_our_version &check_tsv_line + &get_our_version &check_tsv_line &errsan &pipethrough_prep &pipethrough_run &pipethrough_run_along &pipethrough_run_finish &pipethrough_run_gzip &http_useragent &version_core &http_useragent_string_map &cgipostform &yarrgpostform &cgi_get_caller - &set_ctype_utf8 $masterinfoversion); + &set_ctype_utf8 $masterinfoversion + &source_tarball); %EXPORT_TAGS = ( ); @EXPORT_OK = qw(); @@ -192,6 +194,7 @@ sub parse_info1 ($$$) { %commods= (); my $ca; + my $lnoix=0; $ca= sub { my ($s,$ss,$ordbase) = @_; #print STDERR "ca($s,,".(defined $ordbase ? $ordbase : '?').")\n"; @@ -214,8 +217,9 @@ sub parse_info1 ($$$) { $c->{Class}= $1; die "$1" unless exists $commodclasses{$1}; $ordclassval= 1e7 + $commodclasses{$1} * 1e7; - } elsif ($prop =~ m/^\@(\d+)$/) { + } elsif ($prop =~ m/^\@(\d+\+?)$/) { $ordval= $1; + $ordval =~ s/^(\d+)\+$/ $1 + $lnoix * 10 /e; } else { die "unknown property $prop for $ucname"; } @@ -239,7 +243,7 @@ sub parse_info1 ($$$) { ? $ordbase+$ordcolour : undef); } }; - foreach (@rawcm) { &$ca($_,$src,0); } + foreach (@rawcm) { $lnoix++; &$ca($_,$src,0); } } sub parse_info_clientside () { @@ -266,6 +270,7 @@ sub fetch_with_rsync ($) { sub parse_info_serverside () { parse_info1('source-info.txt','s',0); + parse_info1('tree-info.txt','t',1); } sub parse_info_serverside_ocean ($) { my ($oceanname) = @_; @@ -401,6 +406,12 @@ sub cgipostform ($$$) { our %check_tsv_done; +sub errsan ($) { + my ($value) = @_; + $value =~ s/[^-+\'. A-Za-z0-9]/ sprintf "\\x%02x",ord $& /ge; + return "\"$value\""; +} + sub check_tsv_line ($$) { my ($l, $bad_data_callback) = @_; my $bad_data= sub { &$bad_data_callback("bad data: line $.: $_[0]"); }; @@ -414,15 +425,19 @@ sub check_tsv_line ($$) { !keys %commods or defined $commods{$commod} or - &$bad_data("unknown commodity \`$commod'"); + &$bad_data("unknown commodity ".errsan($commod)); - $stall =~ m/^\p{IsUpper}|^[0-9]/ or &$bad_data("stall not capitalised"); - !exists $check_tsv_done{$commod,$stall} or &$bad_data("repeated data"); + $stall =~ m/^\p{IsUpper}|^[0-9]/ or + &$bad_data("stall not capitalised ".errsan($stall)); + !exists $check_tsv_done{$commod,$stall} or + &$bad_data("repeated data ".errsan($commod).",".errsan($stall)); $check_tsv_done{$commod,$stall}= 1; foreach my $i (2..5) { my $f= $v[$i]; - $f =~ m/^(|0|[1-9][0-9]{0,5}|\>1000)$/ or &$bad_data("bad field $i"); - ($i % 2) or ($f !~ m/\>/) or &$bad_data("> in field $i price"); + $f =~ m/^(|0|[1-9][0-9]{0,5}|\>1000)$/ or + &$bad_data("bad field $i ".errsan($f)); + ($i % 2) or ($f !~ m/\>/) or + &$bad_data("> in field $i price ".errsan($f)); } foreach my $i (2,4) { @@ -470,4 +485,38 @@ sub http_useragent ($) { return $ua; } +sub source_tarball ($$) { + my ($sourcebasedir,$spitoutfn) = @_; + + my $pipe= new IO::Pipe or die $!; + my $pid= fork(); defined $pid or die $!; + if (!$pid) { + $ENV{'YPPSC_YARRG_SRCBASE'}= $sourcebasedir; + $pipe->writer(); + exec '/bin/sh','-c',' + cd -P "$YPPSC_YARRG_SRCBASE" + ( + git-ls-files -z; + git-ls-files -z --others --exclude-from=.gitignore; + if test -d .git; then find .git -print0; fi + ) | ( + cpio -Hustar -o --quiet -0 -R 1000:1000 || \ + cpio -Hustar -o --quiet -0 + ) | gzip + '; + die $!; + } + $pipe->reader(); + + my ($d, $l); + while ($l= read $pipe, $d, 65536) { + $spitoutfn->($d); + } + waitpid $pid,0; + defined $l or die "read pipe $!"; + $pipe->error and die "pipe error $!"; + close $pipe; + # deliberately ignore errors +} + 1;