X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=Debian%2FDgit.pm;h=3d97848ff2df75b96491a8fc2ac2d6bd5224a86a;hb=be85ba38f1d9099179b6b6cc7cafac769ccf11da;hp=ba1c28801aba0acb77fced48bb8966a878dc8973;hpb=6dbc82e06ae1e6840dfa2ef2cc6b496561e6f333;p=dgit.git diff --git a/Debian/Dgit.pm b/Debian/Dgit.pm index ba1c2880..3d97848f 100644 --- a/Debian/Dgit.pm +++ b/Debian/Dgit.pm @@ -29,6 +29,7 @@ use Config; use Digest::SHA; use Data::Dumper; use IPC::Open2; +use File::Path; BEGIN { use Exporter (); @@ -45,17 +46,20 @@ BEGIN { fail ensuredir executable_on_path waitstatusmsg failedcmd_waitstatus failedcmd_report_cmd failedcmd - cmdoutput cmdoutput_errok + runcmd cmdoutput cmdoutput_errok git_rev_parse git_cat_file git_get_ref git_for_each_ref git_for_each_tag_referring is_fast_fwd $package_re $component_re $deliberately_re - $distro_re $versiontag_re + $distro_re $versiontag_re $series_filename_re $branchprefix initdebug enabledebug enabledebuglevel printdebug debugcmd $debugprefix *debuglevel *DEBUG - shellquote printcmd messagequote); + shellquote printcmd messagequote + $negate_harmful_gitattrs + git_slurp_config_src + workarea_setup); # implicitly uses $main::us %EXPORT_TAGS = ( policyflags => [qw(NOFFCHECK FRESHREPO NOCOMMITCHECK)] ); @EXPORT_OK = @{ $EXPORT_TAGS{policyflags} }; @@ -69,6 +73,7 @@ our $deliberately_re = "(?:TEST-)?$package_re"; our $distro_re = $component_re; our $versiontag_re = qr{[-+.\%_0-9a-zA-Z/]+}; our $branchprefix = 'dgit'; +our $series_filename_re = qr{(?:^|\.)series(?!\n)$}s; # policy hook exit status bits # see dgit-repos-server head comment for documentation @@ -81,6 +86,8 @@ sub NOCOMMITCHECK () { return 0x8; } our $debugprefix; our $debuglevel = 0; +our $negate_harmful_gitattrs = "-text -eol -crlf -ident -filter"; + our $forkcheck_mainprocess; sub forkcheck_setup () { @@ -275,6 +282,12 @@ sub failedcmd { fail failedcmd_waitstatus(); } +sub runcmd { + debugcmd "+",@_; + $!=0; $?=-1; + failedcmd @_ if system @_; +} + sub cmdoutput_errok { confess Dumper(\@_)." ?" if grep { !defined } @_; debugcmd "|",@_; @@ -405,4 +418,50 @@ sub is_fast_fwd ($$) { } } +sub git_slurp_config_src ($) { + my ($src) = @_; + # returns $r such that $r->{KEY}[] = VALUE + my @cmd = (qw(git config -z --get-regexp), "--$src", qw(.*)); + debugcmd "|",@cmd; + + local ($debuglevel) = $debuglevel-2; + local $/="\0"; + + my $r = { }; + open GITS, "-|", @cmd or die $!; + while () { + chomp or die; + printdebug "=> ", (messagequote $_), "\n"; + m/\n/ or die "$_ ?"; + push @{ $r->{$`} }, $'; #'; + } + $!=0; $?=0; + close GITS + or ($!==0 && $?==256) + or failedcmd @cmd; + return $r; +} + +sub workarea_setup ($) { + # for use in the workarea + my ($t_local_git_cfg) = @_; + # should be run in a directory .git/FOO/BAR of a working tree + runcmd qw(git init -q); + runcmd qw(git config gc.auto 0); + foreach my $copy (qw(user.email user.name user.useConfigOnly + core.sharedRepository + core.compression core.looseCompression + core.bigFileThreshold core.fsyncObjectFiles)) { + my $v = $t_local_git_cfg->{$copy}; + next unless $v; + runcmd qw(git config), $copy, $_ foreach @$v; + } + rmtree('.git/objects'); + symlink '../../../../objects','.git/objects' or die $!; + ensuredir '.git/info'; + open GA, "> .git/info/attributes" or die $!; + print GA "* $negate_harmful_gitattrs\n" or die $!; + close GA or die $!; +} + 1;