work/0000755000000000000000000000000014761250142006730 5ustar work/.gitignore0000644000000000000000000000067214761250142010725 0ustar *~ tests/tmp debian/tmp debian/dgit debian/git-debpush debian/git-debrebase debian/dgit-infrastructure debian/files debian/*.substvars debian/*.log debian/debhelper-build-stamp debian/.debhelper dgit-user.7 dgit-nmu-simple.7 dgit-maint-native.7 dgit-maint-merge.7 dgit-maint-gbp.7 dgit-maint-debrebase.7 dgit-maint-bpo.7 dgit-sponsorship.7 dgit-downstream-dsc.7 git-debrebase.1 git-debrebase.5 git-debpush.1 substituted .po4a.translated-only work/DEVELOPER-CERTIFICATE0000644000000000000000000000261614761250142011725 0ustar Developer Certificate of Origin Version 1.1 Copyright (C) 2004, 2006 The Linux Foundation and its contributors. 1 Letterman Drive Suite D4700 San Francisco, CA, 94129 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Developer's Certificate of Origin 1.1 By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. work/Debian/0000755000000000000000000000000014761250142010112 5ustar work/Debian/Dgit/0000755000000000000000000000000014761250142011001 5ustar work/Debian/Dgit/ExitStatus.pm0000644000000000000000000000073514761250142013461 0ustar # -*- perl -*- package Debian::Dgit::ExitStatus; # To use this, at the top (before use strict, even): # # END { $? = $Debian::Dgit::ExitStatus::desired // -1; }; # use Debian::Dgit::ExitStatus; # # and then replace every call to `exit' with `finish'. # Add a `finish 0' to the end of the program. BEGIN { use Exporter; @ISA = qw(Exporter); @EXPORT = qw(finish $desired); } our $desired; sub finish ($) { $desired = $_[0] // 0; exit $desired; } 1; work/Debian/Dgit/GDR.pm0000644000000000000000000000145414761250142011757 0ustar # -*- perl -*- package Debian::Dgit::GDR; use strict; use warnings; # Scripts and programs which are going to `use Debian::Dgit' but which # live in git-debrebase (ie are installed with install-gdr) # should `use Debian::Dgit::GDR' first. All this module does is # adjust @INC so that the script gets the version of the script from # the git-debrebase package (which is installed in a different # location and may be a different version). # To use this with ExitStatus, put at the top (before use strict, even): # # END { $? = $Debian::Dgit::ExitStatus::desired // -1; }; # use Debian::Dgit::GDR; # use Debian::Dgit::ExitStatus; # # and then replace every call to `exit' with `finish'. # Add a `finish 0' to the end of the program. # unshift @INC, q{/usr/share/dgit/gdr/perl5}; ###substituted### 1; work/Debian/Dgit/I18n.pm0000644000000000000000000000122714761250142012060 0ustar # -*- perl -*- package Debian::Dgit::I18n; # This module provides # __ a function which is an alias for gettext # f_ sprintf wrapper that gettexts the format # i_ identify function, but marks string for translation # # In perl the sub `_' is a `superglobal', which means there # is only one of it in the whole program and every reference # is to the same one. So it's not really useable in modules. # Hence __. use Locale::gettext; BEGIN { use Exporter; @ISA = qw(Exporter); @EXPORT = qw(__ f_ i_); } sub __ ($) { gettext @_; } sub i_ ($) { $_[0]; } sub f_ ($$;@) { my $f = shift @_; sprintf +(gettext $f), @_; } 1; work/Debian/Dgit/Infra.pm0000644000000000000000000000102414761250142012373 0ustar # -*- perl -*- package Debian::Dgit::Infra; use strict; use warnings; # Scripts and programs which are going to `use Debian::Dgit' but which # live in dgit-infrastructure (ie are installed with install-infra) # should `use Debian::Dgit::Infra' first. All this module does is # adjust @INC so that the script gets the version of the script from # the dgit-infrastructure package (which is installed in a different # location and may be a different version). # unshift @INC, q{/usr/share/dgit/infra/perl5}; ###substituted### 1; work/Debian/Dgit/Policy/0000755000000000000000000000000014761250142012240 5ustar work/Debian/Dgit/Policy/Debian.pm0000644000000000000000000000131314761250142013756 0ustar # -*- perl -*- package Debian::Dgit::Policy::Debian; use strict; use warnings; use POSIX; BEGIN { use Exporter (); our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = qw(poldb_path poldb_setup $poldbh); %EXPORT_TAGS = ( ); @EXPORT_OK = qw(); } our @EXPORT_OK; our $poldbh; sub poldb_path ($) { my ($repos) = @_; return "$repos/policy.sqlite3"; } sub poldb_setup ($;$) { my ($policydb, $hook) = @_; $poldbh ||= DBI->connect("dbi:SQLite:$policydb",'','', { RaiseError=>1, PrintError=>1, AutoCommit=>0 }); $hook->() if $hook; $poldbh->do("PRAGMA foreign_keys = ON"); } 1; work/Debian/Dgit.pm0000644000000000000000000010143414761250142011342 0ustar # -*- perl -*- # dgit # Debian::Dgit: functions common to dgit and its helpers and servers # # Copyright (C) 2015-2019 Ian Jackson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . package Debian::Dgit; use strict; use warnings; use Carp; use POSIX; use IO::Handle; use Config; use Digest::SHA; use Data::Dumper; use IPC::Open2; use File::Path qw(:DEFAULT make_path); use File::Basename; use Dpkg::Control::Hash; use Debian::Dgit::ExitStatus; use Debian::Dgit::I18n; BEGIN { use Exporter (); our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = qw(setup_sigwarn forkcheck_setup forkcheck_mainprocess dep14_version_mangle debiantags debiantag_new debiantag_maintview upstreamversion upstream_commitish_search resolve_upstream_version stripepoch source_file_leafname is_orig_file_of_p_v server_branch server_ref stat_exists link_ltarget rename_link_xf hashfile fail failmsg ensuredir ensurepath must_getcwd executable_on_path waitstatusmsg failedcmd_waitstatus failedcmd_report_cmd failedcmd runcmd runcmd_quieten shell_cmd cmdoutput cmdoutput_errok @git git_rev_parse changedir_git_toplevel git_cat_file git_get_ref git_get_symref git_for_each_ref git_for_each_tag_referring is_fast_fwd git_check_unmodified git_reflog_action_msg git_update_ref_cmd rm_subdir_cached read_tree_subdir read_tree_debian read_tree_upstream make_commit hash_commit hash_commit_text reflog_cache_insert reflog_cache_lookup $package_re $component_re $suite_re $deliberately_re $distro_re $versiontag_re $series_filename_re $orig_f_comp_re $orig_f_sig_re $tarball_f_ext_re $orig_f_tail_re $extra_orig_namepart_re $git_null_obj $branchprefix $ffq_refprefix $gdrlast_refprefix initdebug enabledebug enabledebuglevel printdebug debugcmd $printdebug_when_debuglevel $debugcmd_when_debuglevel $debugprefix *debuglevel *DEBUG shellquote printcmd messagequote $negate_harmful_gitattrs changedir git_slurp_config_src gdr_ffq_prev_branchinfo tainted_objects_message parsecontrolfh parsecontrol parsechangelog getfield parsechangelog_loop playtree_setup playtree_write_gbp_conf); # implicitly uses $main::us %EXPORT_TAGS = ( policyflags => [qw(NOFFCHECK FRESHREPO NOCOMMITCHECK)], playground => [qw(record_maindir $maindir $local_git_cfg $maindir_gitdir $maindir_gitcommon fresh_playground ensure_a_playground)]); @EXPORT_OK = ( @{ $EXPORT_TAGS{policyflags} }, @{ $EXPORT_TAGS{playground} } ); } our @EXPORT_OK; our $package_re = '[0-9a-z][-+.0-9a-z]*'; our $component_re = '[0-9a-zA-Z][-+.0-9a-zA-Z]*'; our $suite_re = '[-+.0-9a-z]+'; 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; our $extra_orig_namepart_re = qr{[-0-9a-zA-Z]+}; our $orig_f_comp_re = qr{orig(?:-$extra_orig_namepart_re)?}; our $orig_f_sig_re = '\\.(?:asc|gpg|pgp)'; our $tarball_f_ext_re = "\\.tar(?:\\.\\w+)?(?:$orig_f_sig_re)?"; our $orig_f_tail_re = "$orig_f_comp_re$tarball_f_ext_re"; our $git_null_obj = '0' x 40; our $ffq_refprefix = 'ffq-prev'; our $gdrlast_refprefix = 'debrebase-last'; our $printdebug_when_debuglevel = 1; our $debugcmd_when_debuglevel = 1; our (@git) = qw(git); # these three all go together, only valid after record_maindir our $maindir; our $maindir_gitdir; our $maindir_gitcommon; # policy hook exit status bits # see dgit-repos-server head comment for documentation # 1 is reserved in case something fails with `exit 1' and to spot # dynamic loader, runtime, etc., failures, which report 127 or 255 sub NOFFCHECK () { return 0x2; } sub FRESHREPO () { return 0x4; } sub NOCOMMITCHECK () { return 0x8; } our $debugprefix; our $debuglevel = 0; our $negate_harmful_gitattrs = "-text -eol -crlf -ident -filter -working-tree-encoding"; # ^ when updating this, alter the regexp in dgit:is_gitattrs_setup our $forkcheck_mainprocess; sub forkcheck_setup () { $forkcheck_mainprocess = $$; } sub forkcheck_mainprocess () { # You must have called forkcheck_setup or setup_sigwarn already getppid != $forkcheck_mainprocess; } sub setup_sigwarn () { forkcheck_setup(); $SIG{__WARN__} = sub { confess $_[0] if forkcheck_mainprocess; }; } sub initdebug ($) { ($debugprefix) = @_; open DEBUG, ">/dev/null" or confess "$!"; } sub enabledebug () { open DEBUG, ">&STDERR" or confess "$!"; DEBUG->autoflush(1); $debuglevel ||= 1; } sub enabledebuglevel ($) { my ($newlevel) = @_; # may be undef (eg from env var) confess if $debuglevel; $newlevel //= 0; $newlevel += 0; return unless $newlevel; $debuglevel = $newlevel; enabledebug(); } sub printdebug { # Prints a prefix, and @_, to DEBUG. @_ should normally contain # a trailing \n. # With no (or only empty) arguments just prints the prefix and # leaves the caller to do more with DEBUG. The caller should make # sure then to call printdebug with something ending in "\n" to # get the prefix right in subsequent calls. return unless $debuglevel >= $printdebug_when_debuglevel; our $printdebug_noprefix; print DEBUG $debugprefix unless $printdebug_noprefix; pop @_ while @_ and !length $_[-1]; return unless @_; print DEBUG @_ or confess "$!"; $printdebug_noprefix = $_[-1] !~ m{\n$}; } sub messagequote ($) { local ($_) = @_; s{\\}{\\\\}g; s{\n}{\\n}g; s{\x08}{\\b}g; s{\t}{\\t}g; s{[\000-\037\177]}{ sprintf "\\x%02x", ord $& }ge; $_; } sub shellquote { my @out; local $_; defined or confess __ 'internal error' foreach @_; foreach my $a (@_) { $_ = $a; if (!length || m{[^-=_./:0-9a-z]}i) { s{['\\]}{'\\$&'}g; push @out, "'$_'"; } else { push @out, $_; } } return join ' ', @out; } sub printcmd { my $fh = shift @_; my $intro = shift @_; print $fh $intro." ".(join '', shellquote @_)."\n" or confess "$!"; } sub debugcmd { my $extraprefix = shift @_; printcmd(\*DEBUG,$debugprefix.$extraprefix,@_) if $debuglevel >= $debugcmd_when_debuglevel; } sub dep14_version_mangle ($) { my ($v) = @_; # DEP-14 patch proposed 2016-11-09 "Version Mangling" $v =~ y/~:/_%/; $v =~ s/\.(?=\.|$|lock$)/.#/g; return $v; } sub debiantag_new ($$) { my ($v,$distro) = @_; return "archive/$distro/".dep14_version_mangle $v; } sub debiantag_maintview ($$) { my ($v,$distro) = @_; return "$distro/".dep14_version_mangle $v; } sub debiantags ($$) { my ($version,$distro) = @_; map { $_->($version, $distro) } (\&debiantag_new, \&debiantag_maintview); } sub stripepoch ($) { my ($vsn) = @_; $vsn =~ s/^\d+\://; return $vsn; } sub upstreamversion ($) { my ($vsn) = @_; $vsn =~ s/-[^-]+$//; return $vsn; } sub source_file_leafname ($$$) { my ($package,$vsn,$sfx) = @_; return "${package}_".(stripepoch $vsn).$sfx } sub is_orig_file_of_p_v ($$$) { my ($f, $package, $upstreamvsn) = @_; my $base = source_file_leafname $package, $upstreamvsn, ''; return 0 unless $f =~ m/^\Q$base\E\.$orig_f_tail_re$/; return 1; } sub server_branch ($) { return "$branchprefix/$_[0]"; } sub server_ref ($) { return "refs/".server_branch($_[0]); } sub stat_exists ($) { my ($f) = @_; return 1 if stat $f; return 0 if $!==&ENOENT; confess "stat $f: $!"; } sub _us () { $::us // ($0 =~ m#[^/]*$#, $&); } sub failmsg { my $s = f_ "error: %s\n", "@_"; $s =~ s/\n\n$/\n/g; my $prefix = _us().": "; $s =~ s/^/$prefix/gm; return "\n".$s; } sub fail { die failmsg @_; } sub ensuredir ($) { my ($dir) = @_; # does not create parents return if mkdir $dir; return if $! == EEXIST; confess "mkdir $dir: $!"; } sub ensurepath ($$) { my ($firsttocreate, $subdir) = @_; # creates necessary bits of $subidr ensuredir $firsttocreate; make_path "$firsttocreate/$subdir"; } sub must_getcwd () { my $d = getcwd(); defined $d or fail f_ "getcwd failed: %s\n", $!; return $d; } sub executable_on_path ($) { my ($program) = @_; return 1 if $program =~ m{/}; my @path = split /:/, ($ENV{PATH} // "/usr/local/bin:/bin:/usr/bin"); foreach my $pe (@path) { my $here = "$pe/$program"; return $here if stat_exists $here && -x _; } return undef; } our @signames = split / /, $Config{sig_name}; sub waitstatusmsg () { if (!$?) { return __ "terminated, reporting successful completion"; } elsif (!($? & 255)) { return f_ "failed with error exit status %s", WEXITSTATUS($?); } elsif (WIFSIGNALED($?)) { my $signum=WTERMSIG($?); return f_ "died due to fatal signal %s", ($signames[$signum] // "number $signum"). ($? & 128 ? " (core dumped)" : ""); # POSIX(3pm) has no WCOREDUMP } else { return f_ "failed with unknown wait status %s", $?; } } sub failedcmd_report_cmd { my $intro = shift @_; $intro //= __ "failed command"; { local ($!); printcmd \*STDERR, _us().": $intro:", @_ or confess "$!"; }; } sub failedcmd_waitstatus { if ($? < 0) { return f_ "failed to fork/exec: %s", $!; } elsif ($?) { return f_ "subprocess %s", waitstatusmsg(); } else { return __ "subprocess produced invalid output"; } } sub failedcmd { # Expects $!,$? as set by close - see below. # To use with system(), set $?=-1 first. # # Actual behaviour of perl operations: # success $!==0 $?==0 close of piped open # program failed $!==0 $? >0 close of piped open # syscall failure $! >0 $?=-1 close of piped open # failure $! >0 unchanged close of something else # success trashed $?==0 system # program failed trashed $? >0 system # syscall failure $! >0 unchanged system failedcmd_report_cmd undef, @_; fail failedcmd_waitstatus(); } sub runcmd { debugcmd "+",@_; $!=0; $?=-1; failedcmd @_ if system @_; } sub shell_cmd { my ($first_shell, @cmd) = @_; return qw(sh -ec), $first_shell.'; exec "$@"', 'x', @cmd; } # Runs the command in @_, but capturing its stdout and stderr. # Prints those to our stderr only if the command fails. sub runcmd_quieten { debugcmd "+",@_; $!=0; $?=-1; my @real_cmd = shell_cmd <<'END', @_; set +e; output=$("$@" 2>&1); rc=$?; set -e if [ $rc = 0 ]; then exit 0; fi printf >&2 "%s\n" "$output" exit $rc END failedcmd @_ if system @real_cmd; } sub cmdoutput_errok { confess Dumper(\@_)." ?" if grep { !defined } @_; local $printdebug_when_debuglevel = $debugcmd_when_debuglevel; debugcmd "|",@_; open P, "-|", @_ or confess "$_[0] $!"; my $d; $!=0; $?=0; { local $/ = undef; $d =

; } confess "$!" if P->error; if (!close P) { printdebug "=>!$?\n"; return undef; } chomp $d; if ($debuglevel > 0) { $d =~ m/^.*/; my $dd = $&; my $more = (length $' ? '...' : ''); #'); $dd =~ s{[^\n -~]|\\}{ sprintf "\\x%02x", ord $& }ge; printdebug "=> \`$dd'",$more,"\n"; } return $d; } sub cmdoutput { my $d = cmdoutput_errok @_; defined $d or failedcmd @_; return $d; } sub link_ltarget ($$) { my ($old,$new) = @_; lstat $old or return undef; if (-l _) { $old = cmdoutput qw(realpath --), $old; } my $r = link $old, $new; $r = symlink $old, $new if !$r && $!==EXDEV; $r or fail "(sym)link $old $new: $!\n"; } sub rename_link_xf ($$$) { # renames/moves or links/copies $src to $dst, # even if $dst is on a different fs # (May use the filename "$dst.tmp".); # On success, returns true. # On failure, returns false and sets # $@ to a reason message # $! to an errno value, or -1 if not known # having possibly printed something about mv to stderr. # Not safe to use without $keeporig if $dst might be a symlink # to $src, as it might delete $src leaving $dst invalid. my ($keeporig,$src,$dst) = @_; if ($keeporig ? link $src, $dst : rename $src, $dst) { return 1; } if ($! != EXDEV) { $@ = "$!"; return 0; } if (!stat $src) { $@ = f_ "stat source file: %S", $!; return 0; } my @src_stat = (stat _)[0..1]; my @dst_stat; if (stat $dst) { @dst_stat = (stat _)[0..1]; } elsif ($! == ENOENT) { } else { $@ = f_ "stat destination file: %S", $!; return 0; } if ("@src_stat" eq "@dst_stat") { # (Symlinks to) the same file. No need for a copy but # we may need to delete the original. printdebug "rename_link_xf $keeporig $src $dst EXDEV but same\n"; } else { $!=0; $?=0; my @cmd = (qw(cp --), $src, "$dst.tmp"); debugcmd '+',@cmd; if (system @cmd) { failedcmd_report_cmd undef, @cmd; $@ = failedcmd_waitstatus(); $! = -1; return 0; } if (!rename "$dst.tmp", $dst) { $@ = f_ "finally install file after cp: %S", $!; return 0; } } if (!$keeporig) { if (!unlink $src) { $@ = f_ "delete old file after cp: %S", $!; return 0; } } return 1; } sub hashfile ($) { my ($fn) = @_; my $h = Digest::SHA->new(256); $h->addfile($fn); return $h->hexdigest(); } sub git_rev_parse ($) { return cmdoutput qw(git rev-parse), "$_[0]~0"; } sub changedir_git_toplevel () { my $toplevel = cmdoutput qw(git rev-parse --show-toplevel); length $toplevel or fail __ < ($type, $data) or ('missing', undef) # in scalar context, just the data # if $etype defined, dies unless type is $etype or in @$etype our ($gcf_pid, $gcf_i, $gcf_o); local $printdebug_when_debuglevel = $debugcmd_when_debuglevel; my $chk = sub { my ($gtype, $data) = @_; if ($etype) { $etype = [$etype] unless ref $etype; confess "$objname expected @$etype but is $gtype" unless grep { $gtype eq $_ } @$etype; } return ($gtype, $data); }; if (!$gcf_pid) { my @cmd = qw(git cat-file --batch); debugcmd "GCF|", @cmd; $gcf_pid = open2 $gcf_o, $gcf_i, @cmd or confess "$!"; } printdebug "GCF>| $objname\n"; print $gcf_i $objname, "\n" or confess "$!"; my $x = <$gcf_o>; printdebug "GCF<| ", $x; if ($x =~ m/ (missing)$/) { return $chk->($1, undef); } my ($type, $size) = $x =~ m/^.* (\w+) (\d+)\n/ or confess "$objname ?"; my $data; (read $gcf_o, $data, $size) == $size or confess "$objname $!"; $x = <$gcf_o>; $x eq "\n" or confess "$objname ($_) $!"; return $chk->($type, $data); } sub git_get_symref (;$) { my ($symref) = @_; $symref //= 'HEAD'; # => undef if not a symref, otherwise refs/... my @cmd = (qw(git symbolic-ref -q HEAD)); my $branch = cmdoutput_errok @cmd; if (!defined $branch) { $?==256 or failedcmd @cmd; } else { chomp $branch; } return $branch; } sub git_for_each_ref ($$;$) { my ($pattern,$func,$gitdir) = @_; # calls $func->($objid,$objtype,$fullrefname,$reftail); # $reftail is RHS of ref after refs/[^/]+/ # breaks if $pattern matches any ref `refs/blah' where blah has no `/' # $pattern may be an array ref to mean multiple patterns $pattern = [ $pattern ] unless ref $pattern; my @cmd = (qw(git for-each-ref), @$pattern); if (defined $gitdir) { @cmd = ('sh','-ec','cd "$1"; shift; exec "$@"','x', $gitdir, @cmd); } open GFER, "-|", @cmd or confess "$!"; debugcmd "|", @cmd; while () { chomp or confess "$_ ?"; printdebug "|> ", $_, "\n"; m#^(\w+)\s+(\w+)\s+(refs/[^/]+/(\S+))$# or confess "$_ ?"; $func->($1,$2,$3,$4); } $!=0; $?=0; close GFER or confess "$pattern $? $!"; } sub git_get_ref ($) { # => '' if no such ref my ($refname) = @_; local $_ = $refname; s{^refs/}{[r]efs/} or confess "$refname $_ ?"; return cmdoutput qw(git for-each-ref --format=%(objectname)), $_; } sub git_for_each_tag_referring ($$) { my ($objreferring, $func) = @_; # calls $func->($tagobjid,$refobjid,$fullrefname,$tagname); printdebug "git_for_each_tag_referring ", ($objreferring // 'UNDEF'),"\n"; git_for_each_ref('refs/tags', sub { my ($tagobjid,$objtype,$fullrefname,$tagname) = @_; return unless $objtype eq 'tag'; my $refobjid = git_rev_parse $tagobjid; return unless !defined $objreferring # caller wants them all or $tagobjid eq $objreferring or $refobjid eq $objreferring; $func->($tagobjid,$refobjid,$fullrefname,$tagname); }); } sub git_check_unmodified () { foreach my $cached (qw(0 1)) { my @cmd = qw(git diff --quiet); push @cmd, qw(--cached) if $cached; push @cmd, qw(HEAD); debugcmd "+",@cmd; $!=0; $?=-1; system @cmd; return if !$?; if ($?==256) { fail $cached ? __ "git index contains changes (does not match HEAD)" : __ "working tree is dirty (does not match HEAD)"; } else { failedcmd @cmd; } } } sub upstream_commitish_search ($$) { my ($upstream_version, $tried) = @_; # todo: at some point maybe use git-deborig to do this my @found; foreach my $tagpfx ('', 'v', 'upstream/') { my $tag = $tagpfx.(dep14_version_mangle $upstream_version); my $new_upstream = git_get_ref "refs/tags/$tag"; push @$tried, $tag; push @found, [ $tag, $new_upstream ] if $new_upstream; } return @{ $found[0] } if @found == 1; return (); } sub resolve_upstream_version ($$) { my ($new_upstream, $upstream_version) = @_; my $used = $new_upstream; my $message = __ 'using specified upstream commitish'; if (!defined $new_upstream) { my @tried; ($used, $new_upstream) = upstream_commitish_search $upstream_version, \@tried; if (!length $new_upstream) { fail f_ "Could not determine appropriate upstream commitish.\n". " (Tried these tags: %s)\n". " Check version, and specify upstream commitish explicitly.", "@tried"; } $message = f_ 'using upstream from git tag %s', $used; } elsif ($new_upstream =~ m{^refs/tags/($versiontag_re)$}s) { $message = f_ 'using upstream from git tag %s', $1; $used = $1; } $new_upstream = git_rev_parse $new_upstream; return ($new_upstream, $used, $message); # used is a human-readable idea of what we found } sub is_fast_fwd ($$) { my ($ancestor,$child) = @_; my @cmd = (qw(git merge-base), $ancestor, $child); my $mb = cmdoutput_errok @cmd; if (defined $mb) { return git_rev_parse($mb) eq git_rev_parse($ancestor); } else { $?==256 or failedcmd @cmd; return 0; } } sub git_reflog_action_msg ($) { my ($msg) = @_; my $rla = $ENV{GIT_REFLOG_ACTION}; $msg = "$rla: $msg" if length $rla; return $msg; } sub git_update_ref_cmd { # returns qw(git update-ref), qw(-m), @_ # except that message may be modified to honour GIT_REFLOG_ACTION my $msg = shift @_; $msg = git_reflog_action_msg $msg; return qw(git update-ref -m), $msg, @_; } sub rm_subdir_cached ($) { my ($subdir) = @_; runcmd qw(git rm --quiet -rf --cached --ignore-unmatch), $subdir; } sub read_tree_subdir ($$) { my ($subdir, $new_tree_object) = @_; # If $new_tree_object is '', the subtree is deleted. confess unless defined $new_tree_object; rm_subdir_cached $subdir; runcmd qw(git read-tree), "--prefix=$subdir/", $new_tree_object if length $new_tree_object; } sub read_tree_debian ($) { my ($treeish) = @_; read_tree_subdir 'debian', "$treeish:debian"; rm_subdir_cached 'debian/patches'; } sub read_tree_upstream ($;$$) { my ($treeish, $keep_patches, $tree_with_debian) = @_; # if $tree_with_debian is supplied, will use that for debian/ # otherwise will save and restore it. If $tree_with_debian # is '' then debian/ is deleted. my $debian = defined $tree_with_debian ? "$tree_with_debian:debian" : cmdoutput qw(git write-tree --prefix=debian/); runcmd qw(git read-tree), $treeish; read_tree_subdir 'debian', $debian; rm_subdir_cached 'debian/patches' unless $keep_patches; } sub changedir ($) { my ($newdir) = @_; printdebug "CD $newdir\n"; chdir $newdir or confess "chdir: $newdir: $!"; } 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 confess "$!"; while () { chomp or confess; printdebug "=> ", (messagequote $_), "\n"; m/\n/ or confess "$_ ?"; push @{ $r->{$`} }, $'; #'; } $!=0; $?=0; close GITS or ($!==0 && $?==256) or failedcmd @cmd; return $r; } sub gdr_ffq_prev_branchinfo ($) { my ($symref) = @_; # => ('status', "message", [$symref, $ffq_prev, $gdrlast]) # 'status' may be # branch message is undef # weird-symref } no $symref, # notbranch } no $ffq_prev return ('detached', __ 'detached HEAD') unless defined $symref; return ('weird-symref', __ 'HEAD symref is not to refs/') unless $symref =~ m{^refs/}; my $ffq_prev = "refs/$ffq_refprefix/$'"; my $gdrlast = "refs/$gdrlast_refprefix/$'"; printdebug "ffq_prev_branchinfo branch current $symref\n"; return ('branch', undef, $symref, $ffq_prev, $gdrlast); } sub parsecontrolfh ($$;$) { my ($fh, $desc, $allowsigned) = @_; our $dpkgcontrolhash_noissigned; my $c; for (;;) { my %opts = ('name' => $desc); $opts{allow_pgp}= $allowsigned || !$dpkgcontrolhash_noissigned; $c = Dpkg::Control::Hash->new(%opts); $c->parse($fh,$desc) or fail f_ "parsing of %s failed", $desc; last if $allowsigned; last if $dpkgcontrolhash_noissigned; my $issigned= $c->get_option('is_pgp_signed'); if (!defined $issigned) { $dpkgcontrolhash_noissigned= 1; seek $fh, 0,0 or confess "seek $desc: $!"; } elsif ($issigned) { fail f_ "control file %s is (already) PGP-signed. ". " Note that dgit push needs to modify the .dsc and then". " do the signature itself", $desc; } else { last; } } return $c; } sub parsecontrol { my ($file, $desc, $allowsigned) = @_; my $fh = new IO::Handle; open $fh, '<', $file or fail f_ "open %s (%s): %s", $file, $desc, $!; my $c = parsecontrolfh($fh,$desc,$allowsigned); $fh->error and confess "$!"; close $fh; return $c; } sub parsechangelog { my $c = Dpkg::Control::Hash->new(name => 'parsed changelog'); my $p = new IO::Handle; my @cmd = (qw(dpkg-parsechangelog), @_); open $p, '-|', @cmd or confess "$!"; $c->parse($p); $?=0; $!=0; close $p or failedcmd @cmd; return $c; } sub getfield ($$) { my ($dctrl,$field) = @_; my $v = $dctrl->{$field}; return $v if defined $v; fail f_ "missing field %s in %s", $field, $dctrl->get_option('name'); } sub parsechangelog_loop ($$$) { my ($clogcmd, $descbase, $fn) = @_; # @$clogcmd is qw(dpkg-parsechangelog ...some...options...) # calls $fn->($thisstanza, $desc); debugcmd "|",@$clogcmd; open CLOGS, "-|", @$clogcmd or confess "$!"; for (;;) { my $stanzatext = do { local $/=""; ; }; printdebug "clogp stanza ".Dumper($stanzatext) if $debuglevel>1; last if !defined $stanzatext; my $desc = "$descbase, entry no.$."; open my $stanzafh, "<", \$stanzatext or confess; my $thisstanza = parsecontrolfh $stanzafh, $desc, 1; $fn->($thisstanza, $desc); } confess "$!" if CLOGS->error; close CLOGS or $?==SIGPIPE or failedcmd @$clogcmd; } sub make_commit ($$) { my ($parents, $message_paras) = @_; my $tree = cmdoutput qw(git write-tree); my @cmd = (qw(git commit-tree), $tree); push @cmd, qw(-p), $_ foreach @$parents; push @cmd, qw(-m), $_ foreach @$message_paras; return cmdoutput @cmd; } sub hash_commit ($) { my ($file) = @_; return cmdoutput qw(git hash-object -w -t commit), $file; } sub hash_commit_text ($) { my ($text) = @_; my ($out, $in); my @cmd = (qw(git hash-object -w -t commit --stdin)); debugcmd "|",@cmd; print Dumper($text) if $debuglevel > 1; my $child = open2($out, $in, @cmd) or confess "$!"; my $h; eval { print $in $text or confess "$!"; close $in or confess "$!"; $h = <$out>; $h =~ m/^\w+$/ or confess; $h = $&; printdebug "=> $h\n"; }; close $out; waitpid $child, 0 == $child or confess "$child $!"; $? and failedcmd @cmd; return $h; } sub reflog_cache_insert ($$$) { my ($ref, $cachekey, $value) = @_; # you must call this in $maindir # you must have called record_maindir # When we no longer need to support squeeze, use --create-reflog # instead of this: my $parent = $ref; $parent =~ s{/[^/]+$}{}; ensurepath "$maindir_gitcommon/logs", "$parent"; my $makelogfh = new IO::File "$maindir_gitcommon/logs/$ref", '>>' or confess "$!"; my $oldcache = git_get_ref $ref; if ($oldcache eq $value) { my $tree = cmdoutput qw(git rev-parse), "$value:"; # git update-ref doesn't always update, in this case. *sigh* my $authline = (ucfirst _us()). ' <'._us().'@example.com> 1000000000 +0000'; my $dummy = hash_commit_text <(no reflog)\n"; finish 0; } exec @cmd; die f_ "exec %s: %s\n", $cmd[0], $!; } while () { chomp; printdebug ">| ", $_, "\n" if $debuglevel > 1; next unless m/^(\w+) (\S.*\S)$/ && $2 eq $cachekey; close GC; return $1; } confess "$!" if GC->error; failedcmd unless close GC; return undef; } sub tainted_objects_message ($$$) { my ($ti, $override_status, $hinted_dedup) = @_; # $override_status: # undef, not overriddeable # '', not overridden # $deliberately, overridden my $msg = ''; my $timeshow = defined $ti->{time} ? strftime("%Y-%m-%d %H:%M:%S Z", gmtime $ti->{time}) : ""; my $infoshow = length $timeshow && length $ti->{package} ? f_ "Taint recorded at time %s for package %s", $timeshow, $ti->{package}, : length $timeshow && !length $ti->{package} ? f_ "Taint recorded at time %s for any package", $timeshow, : !length $timeshow && length $ti->{package} ? f_ "Taint recorded for package %s", $ti->{package}, : !length $timeshow && !length $ti->{package} ? __ "Taint recorded for any package" : confess; $msg .= <{gitobjtype} $ti->{gitobjid} $infoshow Reason: $ti->{comment} END $msg .= !defined $override_status ? __ <{hint}; if (defined $hint and !$hinted_dedup->{$hint}++) { $msg .= $hint; } return $msg; } # ========== playground handling ========== # terminology: # # $maindir user's git working tree # playground area in .git/ where we can make files, unpack, etc. etc. # playtree git working tree sharing object store with the user's # inside playground, or identical to it # # other globals # # $local_git_cfg hash of arrays of values: git config from $maindir # # expected calling pattern # # firstly # # [record_maindir] # must be run in directory containing .git # assigns to $maindir if not already set # also calls git_slurp_config_src to record git config # in $local_git_cfg, unless it's already set # # fresh_playground SUBDIR_PATH_COMPONENTS # e.g fresh_playground 'dgit/unpack' ('.git/' is implied) # default SUBDIR_PATH_COMPONENTS is playground_subdir # calls record_maindir # sets up a new playground (destroying any old one) # returns playground pathname # caller may call multiple times with different subdir paths # createing different playgrounds # # ensure_a_playground SUBDIR_PATH_COMPONENTS # like fresh_playground except: # merely ensures the directory exists; does not delete an existing one # # then can use # # changedir playground # changedir $maindir # # playtree_setup # # ^ call in some (perhaps trivial) subdir of playground # # rmtree playground # ----- maindir ----- our $local_git_cfg; sub record_maindir () { if (!defined $maindir) { $maindir = must_getcwd(); if (!stat "$maindir/.git") { fail f_ "cannot stat %s/.git: %s", $maindir, $!; } if (-d _) { # we fall back to this in case we have a pre-worktree # git, which may not know git rev-parse --git-common-dir $maindir_gitdir = "$maindir/.git"; $maindir_gitcommon = "$maindir/.git"; } else { $maindir_gitdir = cmdoutput qw(git rev-parse --git-dir); $maindir_gitcommon = cmdoutput qw(git rev-parse --git-common-dir); } } $local_git_cfg //= git_slurp_config_src 'local'; } # ----- playgrounds ----- sub ensure_a_playground_parent ($) { my ($spc) = @_; record_maindir(); $spc = "$maindir_gitdir/$spc"; my $parent = dirname $spc; mkdir $parent or $!==EEXIST or fail f_ "failed to mkdir playground parent %s: %s", $parent, $!; return $spc; } sub ensure_a_playground ($) { my ($spc) = @_; $spc = ensure_a_playground_parent $spc; mkdir $spc or $!==EEXIST or fail f_ "failed to mkdir a playground %s: %s", $spc, $!; return $spc; } sub fresh_playground ($) { my ($spc) = @_; $spc = ensure_a_playground_parent $spc; rmtree $spc; mkdir $spc or fail f_ "failed to mkdir the playground %s: %s", $spc, $!; return $spc; } # ----- playtrees ----- sub playtree_setup () { # for use in the playtree # $maindir must be set, eg by calling record_maindir or fresh_playground # this is confusing: we have # . playtree, not a worktree, has .git/, our cwd # $maindir might be a worktree so # $maindir_gitdir contains our main working "dgit", HEAD, etc. # $maindir_gitcommon the shared stuff, including .objects # we need to invoke git-playtree-setup via git because # there may be config options it needs which are only available # to us, sensibly, in @git # And, we look for it in @INC too. This is a bit perverse. # We do this because in the Debian packages we want to have # a copy of this script in each binary package, rather than # making yet another .deb or tangling the dependencies. # @INC is conveniently available. my $newpath = join ':', +(grep { !m/:/ } @INC), '/usr/share/dgit', $ENV{PATH}; runcmd qw(env), "PATH=$newpath", @git, qw(playtree-setup .); ensuredir '.git/info'; open GA, "> .git/info/attributes" or confess "$!"; print GA "* $negate_harmful_gitattrs\n" or confess "$!"; close GA or confess "$!"; playtree_write_gbp_conf(); } sub playtree_write_gbp_conf (;$) { my ($ignore_new) = @_; $ignore_new //= 'false'; open GC, "> .git/gbp.conf" or confess "$!"; print GC <<"END" or confess $!; [pq] ignore-new = $ignore_new END close GC or confess "$!"; } 1; work/HACKING0000644000000000000000000000633314761250142007724 0ustar Here are some hints and tips or working on src:dgit =================================================== Program and source code layout ------------------------------ Most stuff is in the toplevel. Debian/ contains Perl modules, notably Debian/Dgit.pm. That module contains much shared code and is used by every package. The test suite is very useful for ad-hoc work, so see "Tests" below. Coding style ------------ I like to use perl "poetry mode" where ( ) are often elided. This is often nice and terse but there is a gotcha. This some_function ($a + 2), $b, $c is wrong, because the ( ) are treated as function call ( ) for some_function. When this is a risk, you have to write: some_function +($a + 2), $b, $c Keep the line length to 75 at most please. i18n ---- In the Perl code we use these functions: here: meaning: like, in C: __ translate this message _ aka gettext f_ this is a sprintf string to be translated sprintf(_ ... i_ mark for translation but do not translate here gettext_noop See the info node `(gettext) Sources' for the complete semantics. The shell scripts are not translated right now. Running ad-hoc -------------- You can run everything right out of the git tree, for ad hoc testing,, like this (supposing your dgit tree is in things/Dgit/dgit): ~/things/Dgit/dgit/using-these dgit --some-option blah blah using-these will set PATH and PERLLIB so that programs and modules come from its own directory (obtained from $0). Tests, running and use for hacking ---------------------------------- The test cases are in bash and are in tests/tests/*. They all use shell libraries tests/lib*. You can run it formally with autopkgtest, but you normally want to run tests in one of these two ways [1]: tests/using-intree tests/tests/ 2>&1 |tee ../log tests/run-all [tests/tests/] These will leave their working stuff in ./tests/tmp/. The test suite is often a nice way to set up situations for ad-hoc testing. You can add "xxx" in the middle of one of the test cases to get it to crash at the right point. Have an absolute cd like cd ~/things/Dgit/dgit/tests/tmp/ in your shell history, because each time you run the test it will blow that directory away again. There are many env vars settings like DGIT_TEST_DEBUG= DGIT_TEST_DEBUG=-DDD DGIT_TEST_DEBPUSH_DEBUG= DGIT_TEST_DEBPUSH_DEBUG=x which can be used to control the level of debug output from individual programs run by the test suite. Editing/adding tests -------------------- Things in tests/setup/ generate canned starting points. You can run them by hand, but when they are imported by other tests they are not automatically regenerated by default. So if you are editing one of those, git-clean is your friend. debian/tests/control is autogenerated by a rule in debia/rules. If making actual releases, you must rerun that. [1] The test suite and libraries, when run without any special environment variables, expect to be run via DEP-8 (autopkgtest) - so they want an to everything out of PATH and /usr. But there are also arrangements to honour environment variables set by using-intree. work/Makefile0000644000000000000000000001204714761250142010374 0ustar # dgit # Integration between git and Debian-style archives # # Copyright (C)2013-2018 Ian Jackson # Copyright (C)2019 Sean Whitton # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . INSTALL=install INSTALL_DIR=$(INSTALL) -d INSTALL_PROGRAM=$(INSTALL) -m 755 INSTALL_DATA=$(INSTALL) -m 644 prefix?=/usr/local bindir=$(prefix)/bin mandir=$(prefix)/share/man perldir=$(prefix)/share/perl5 man1dir=$(mandir)/man1 man5dir=$(mandir)/man5 man7dir=$(mandir)/man7 infraexamplesdir=$(prefix)/share/doc/dgit-infrastructure/examples txtdocdir=$(prefix)/share/doc/dgit absurddir=$(prefix)/share/dgit/absurd PROGRAMS=dgit dgit-badcommit-fixup git-playtree-setup MAN1PAGES=dgit.1 MAN7PAGES=dgit.7 \ dgit-user.7 dgit-nmu-simple.7 \ dgit-maint-native.7 \ dgit-maint-merge.7 dgit-maint-gbp.7 \ dgit-maint-debrebase.7 \ dgit-downstream-dsc.7 \ dgit-sponsorship.7 \ dgit-maint-bpo.7 TXTDOCS=README.dsc-import PERLMODULES= \ Debian/Dgit.pm \ Debian/Dgit/ExitStatus.pm \ Debian/Dgit/I18n.pm ABSURDITIES=git GDR_PROGRAMS=git-debrebase GDR_PERLMODULES= \ Debian/Dgit.pm \ Debian/Dgit/GDR.pm \ Debian/Dgit/ExitStatus.pm \ Debian/Dgit/I18n.pm GDR_MAN1PAGES=git-debrebase.1 GDR_MAN5PAGES=git-debrebase.5 GDP_PROGRAMS=git-debpush GDP_MAN1PAGES=git-debpush.1 INFRA_PROGRAMS=dgit-repos-server dgit-ssh-dispatch dgit-mirror-ssh-wrap \ dgit-repos-policy-debian dgit-repos-admin-debian \ dgit-repos-policy-trusting dgit-mirror-rsync INFRA_EXAMPLES=get-dm-txt ssh-wrap drs-cron-wrap get-suites INFRA_PERLMODULES= \ Debian/Dgit.pm \ Debian/Dgit/Infra.pm \ Debian/Dgit/Policy/Debian.pm MANPAGES=$(MAN1PAGES) $(MAN5PAGES) $(MAN7PAGES) \ $(GDR_MAN1PAGES) $(GDR_MAN5PAGES) \ $(GDP_MAN1PAGES) all: $(MANPAGES) $(addprefix substituted/,$(PROGRAMS)) substituted/%: % mkdir -p substituted perl -pe 's{\bundef\b}{'\''$(absurddir)'\''} if m/###substituted###/' \ <$< >$@ install: installdirs all $(INSTALL_PROGRAM) $(addprefix substituted/,$(PROGRAMS)) \ $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) $(addprefix absurd/,$(ABSURDITIES)) \ $(DESTDIR)$(absurddir) $(INSTALL_DATA) $(MAN1PAGES) $(DESTDIR)$(man1dir) $(INSTALL_DATA) $(MAN7PAGES) $(DESTDIR)$(man7dir) $(INSTALL_DATA) $(TXTDOCS) $(DESTDIR)$(txtdocdir) set -e; for m in $(PERLMODULES); do \ $(INSTALL_DATA) $$m $(DESTDIR)$(perldir)/$${m%/*}; \ done installdirs: $(INSTALL_DIR) $(DESTDIR)$(bindir) \ $(DESTDIR)$(man1dir) $(DESTDIR)$(man5dir) \ $(DESTDIR)$(man7dir) \ $(DESTDIR)$(txtdocdir) $(DESTDIR)$(absurddir) \ $(addprefix $(DESTDIR)$(perldir)/, $(dir $(PERLMODULES))) install-gdp: installdirs-gdp $(INSTALL_PROGRAM) $(GDP_PROGRAMS) $(DESTDIR)$(bindir) $(INSTALL_DATA) $(GDP_MAN1PAGES) $(DESTDIR)$(man1dir) install-gdr: installdirs-gdr $(INSTALL_PROGRAM) $(GDR_PROGRAMS) $(DESTDIR)$(bindir) $(INSTALL_DATA) $(GDR_MAN1PAGES) $(DESTDIR)$(man1dir) $(INSTALL_DATA) $(GDR_MAN5PAGES) $(DESTDIR)$(man5dir) set -e; for m in $(GDR_PERLMODULES); do \ $(INSTALL_DATA) $$m $(DESTDIR)$(perldir)/$${m%/*}; \ done install-infra: installdirs-infra $(INSTALL_PROGRAM) $(addprefix infra/, $(INFRA_PROGRAMS)) \ $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) $(addprefix infra/, $(INFRA_EXAMPLES)) \ $(DESTDIR)$(infraexamplesdir) set -e; for m in $(INFRA_PERLMODULES); do \ $(INSTALL_DATA) $$m $(DESTDIR)$(perldir)/$${m%/*}; \ done installdirs-gdp: $(INSTALL_DIR) $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir) installdirs-gdr: $(INSTALL_DIR) $(DESTDIR)$(bindir) \ $(DESTDIR)$(man1dir) $(DESTDIR)$(man5dir) \ $(addprefix $(DESTDIR)$(perldir)/, $(dir $(GDR_PERLMODULES))) installdirs-infra: $(INSTALL_DIR) $(DESTDIR)$(bindir) $(DESTDIR)$(infraexamplesdir) \ $(addprefix $(DESTDIR)$(perldir)/, $(dir $(INFRA_PERLMODULES))) list-manpages: @echo $(MANPAGES) i18n i18n-update: $(MAKE) -C po update $(MAKE) -C po4a update i18n-commit: set -e; x=$$(git status --porcelain); set -x; test "x$$x" = x $(MAKE) i18n-update git commit -a -m 'i18n-commit - autogenerated' check installcheck: clean distclean mostlyclean maintainer-clean: rm -rf tests/tmp substituted set -e; for m in $(MANPAGES); do \ test -e $$m.pod && rm -f $$m; \ done dgit%: dgit%.pod m=$@; pod2man --section=$${m##*.} --date="Debian Project" \ --center="dgit" --name=$${m%.*} \ $^ $@ git-debrebase.%: git-debrebase.%.pod pod2man --section=$* --date="Debian Project" --center="git-debrebase" \ --name=$(subst .$*,,$@) \ $^ $@ git-debpush.1: git-debpush.1.pod pod2man --section=1 --date="Debian Project" --center="git-debpush" \ --name git-debpush \ $^ $@ %.view: % man -l $* work/NOTES.dgit-downstream-dsc.7.pod0000644000000000000000000000472214761250142014354 0ustar NOTE This text was once going to be part of dgit-downstream-dsc(7) or dgit-downstream-dsc(5). It probably wants to be reworked, and maybe put there, to fix #810829 want instructions for reprepro-style small repo This guide is to help you if: * you are a distro which is a downstream of Debian (directly or indirectly) * you want to publish source packages as well as git branches You will also need: * A git server. [...] There are various options for the git server, depending on how much you trust your uploaders. There are four levels of trust and sophistication: shell account For use when uploaders have shell accounts on the server and you trust them completely. You then do not need to install any special software on the server. dgit-repos-server Your uploaders do not (necessarily) have shell accounts. You will need to collect their ssh keys and also their PGP signing keys. You can restrict uploads on a per-package per-key basis by using the Debian `dm.txt' format. dgit-repos-server + policy hook You want to impose additional policy. For example, Debian's copyright review process means that uploads of new packages are initially not public: dgit-repos-policy-debian is an example. custom implementation From the dgit client's point of view, the dgit git server is a git server accessed by ssh (when pushing) or https (when fetching). You may use anything that has the right properties for your needs. dgit primarily authenticates pushes by signing tags, so your software will probably need to check and verify that tag appropriately before accepting a push. dgit-repos-server knows how to do this properly. Set up your git server, as follows: shell account Make a suitable (sub)directory. You should create a _template.git bare repo, with appropriate permissions. When new packages are uploaded, this _template.git will be copied. You will probably want to set core.sharedRepository in the template, and/or arrange for personal groups and 002 umask. dgit-repos-server Additionally, install dgit-infrastructure. Create a service account `dgit' on the server. For each authorised uploader, put their ssh key in dgit's authorized_keys file, with a restricted_command specifying the dgit-repos-server invocation. Put the keyring where dgit-repos-server can find it. Consult the comment at the top of dgit-repos-server for the restricted command rune. work/NOTES.git-debrebase0000644000000000000000000001033614761250142012242 0ustar # problems / outstanding questions: # # * new-upstream has an awkward UI for multiple upstream pieces. # You end up with giant runic command lines. Does this matter / # One consequence of the lack of richness it can need -f in # fairly sensible situations. # # * There should be a good convention for the version number, # and unfinalised or not changelog, after new-upstream. # # * Handing of multi-orig dgit new-upstream .dsc imports is known to # be broken. They may be not recognised, improperly converted, or # their conversion may be unrecognised. # # * We need to develop a plausible model that works for derivatives, # who probably want to maintain their stack on top of Debian's. # downstream-rebase-launder-v0 may be a starting point? # maybe the hypothetical git-ffqrebase is part of it too. # undocumented usages: # # git-debrebase [] downstream-rebase-launder-v0 # experimental ======================================== Theory for ffq-prev refs/ffq-prev/REF relates to refs/REF When we strip a pm, we need to maybe record it (or something) as the new start point. When we do a thing with no recorded ffq-prev ffq-prev is our current tip obviously it is safe to say we will overwrite this we do check whether there are not-included changes in the remotes because if the new ffq-prev is not ff from the remotes the later pushes will fail this model tends to keep ad-hoc commits made on our tip branch before we did rebase start, in the `interchange view' and also in the rebase stack. also we can explicitly preserve with git-debrebase stitch It is always safe to rewind ffq-prev: all that does is overwrite _less_ stuff. in any case putative ffq-prev must be ff from remote. Otherwise when we push it will not be ff, even though we have made pseudomerge to overwrite ffq-prev. So if we spot this, report an error. see above with a recorded ffq-prev we may need to advance ffq-prev, to allow us to generate future pseudomerges that will be pushable advancing ffq-prev is dangerous, since it might effectively cancel the commits that will-ovewrite is advanced over. ??? advance it to merge-base( current remote, current tip ) if possible (see above), - ie to current remote, subject to the condition that that is an ancestor of current tip currently this is not implemented better maybe to detect divergence ? but it is rather late by then! We check we are ff from remotes before recording new ffq-prev ======================================== how to handle divergence and merges (if not detected soon enough) same problem if merge, look at branches before merge generate new combined branch pseudomerge to overwrite merge current avaiable strategies: maybe launder foreign branch if foreign branch is nmuish, can rebase it onto ours could merge breakwaters (use analyse to find them) merge breakwaters (assuming same upstream) manually construct new patch queue by inspection of the other two patch queues instead of manually constructing patch queue, could use gbp pq export and git merge the patch queues (ie work with interdiffs) if upstreams are different and one is ahead simply treat that as "ours" and do the work to import changes from the other if upstreams have diverged, can resolve somehow to make new upstream do new-upstream on each branch separately now reduced to previously "solved" problem in future, auto patch queue merge algorithm determine next patch to apply there are three versions o..O, l..L, r..R we have already constructed m (previous patch or merged breakwater) try using vector calculus in the implied cube and compute multiple ways to check consistency ? ======================================== For downstreams of Debian, sketch of git-ffqrebase # git-ffqrebase start [BASE] # # records previous HEAD so it can be overwritten # # records base for future git-ffqrebase # git-ffqrebase set-base BASE # git-ffqrebase # git-ffqrebase finish # git-ffqrebase status [BRANCH] work/NOTES.podchecker0000644000000000000000000000214114761250142011647 0ustar todo: maybe we wanted to run podchecker but it complains about a lot of things for which we don't have good alternatives. Eg: *** WARNING: (section) in 'dgit-maint-debrebase(7)' deprecated at line 17 in file ../git-debrebase.1.pod But this is not actually described as deprecated and how else to write a manpage cross-reference ? Maybe this warning applies only to perl's own manpages. *** WARNING: 2 unescaped <> in paragraph at line 30 in file ../git-debrebase.1.pod I have a habit of writing things like git-debrebase [-- ] which is obviously unescaped < but the E<> syntax would be awful *** WARNING: No items in =over (at line 31) / =back list at line 42 in file ../dgit-user.7.pod *** WARNING: No argument for =item at line 553 in file ../git-debrebase.1.pod pod doesn't offer a better answer, and these render well *** ERROR: unresolved internal link 'dgit-maint-*(7)' at line 22 in file ../dgit-user.7.pod This is obviously needed. At the time of writing it does not seem to detect anything which generates bad rendering. So for now I will not run it. work/README.dsc-import0000644000000000000000000001066514761250142011700 0ustar We would like to: represent the input tarballs as a commit each (which all get merged together as if by git merge -s subtree), and for quilt packages, each patch as a commit. But w want to avoid (as much as possible) reimplementing the package extraction algorithm in dpkg-source. dpkg-source does not currently provide interfaces that look like they are intended for what dgit wants to do. And dgit wants to work with old versions of dpkg, so I have implemented the following algorithm rather than wait for such interfaces added (even supposing that a sane interface could be designed, which is doubtful): * dgit will untar each input tarball. This will be done by scanning the .dsc for things whose names look like (compressed) tarballs, and using the interfaces provided by Dpkg::Compression to get at the tarball. Each input tarball unpack will be done separately, and will be followed by git add and git write-tree, to obtain a git tree object corresponding to the tarball contents. That tree object will be made into a commit object with no parents. (The package changelog will be searched for the earliest version with the right upstream version component, and the information found there used for the commit object's metadata.) * For `3.0 (quilt), dgit will run dpkg-source -x --skip-patches git plumbing will be used to make the result into a tree and a commit. The commit will have as parents all the tarballs previously mentioned. The main orig tarball will be the leftmost parent and the debian tarball the rightmost parent. The metadata will come from the .dsc and/or the final changelog entry. dgit will then dpkg-source --before-build and record the resulting tree, too. Then, dgit will switch back to the patches-unapplied version and use `gbp pq import' (in the private working area) to turn the patches-unapplied tree into a patches-applied one. Finally dgit will check that the gbp pq generated patches-applied version has the same git tree object as the one generated by dpkg-source --before-build. * For source formats other than `3.0 (quilt)', dgit will do simply dpkg-source -x. Again, it will make that into a tree and a commit. * For source formats with only single file entry in the .dsc, the (one) tarball is not imported separately (since its tree object would be the same as the extracted object), and the commit of the dpkg-source -x output has no parents. * As currently, there will be a final no-change-to-the-tree pseudomerge commit which stitches the package into the relevant dgit suite branch. (By `pseudomerge' we mean something that looks as if it was made with git merge -s ours.) * As currently, dgit will take steps so that none of the git trees discussed above contain a .pc directory. This has the following properties: * Each input tarball is represented by a different commit; in usual cases these commits will be the same for every upload of the same upstream version. * For `3.0 (quilt)' each patch's changes to the upstream files appears as a single git commit (as is the effect of the debian tarball); also, there is a commit object whose tree is just the debian/ directory, which might well be the same as certain debian-only git workflow trees. * For `1.0' non-native, the effect of the diff is represented as a commit. So eg `git blame' will show synthetic commits corresponding to the correct parts of the input source package. * It is possible to `git cherry-pick' etc. commits representing `3.0 (quilt)' patches. It is even possible fish out the patch stack as git branch and rebase it elsewhere etc., since the patch stack is represented as a contiguous series of commits which make only the relevant upstream changes. * Every orig tarball in the source package is decompressed twice, but disk space for only one extra copy of its unpacked contents is needed. (The converse would be possible in principle but would be very hard to arrange with the current interfaces provided by the various tools.) * No back doors into the innards of dpkg-source (nor changes to dpkg-dev) are required. * dgit does grow a dependency on git-buildpackage. * Knowledge of the source format embedded in dgit is is restricted to some relatively straightforward processing of filenames found in .dsc files. * dgit now depends on dpkg-source -x --skip-patches followed by dpkg-source --before-build being the same as dpkg-source -x (for `3.0 (quilt)'). work/README.md0000644000000000000000000000245214761250142010212 0ustar dgit & git-debrebase ==================== * `dgit` - git integration with the Debian archive * `git-debrebase` - delta queue rebase tool for Debian packaging These tools are independent and can be used separately, but they work well together, and they share a source package and a test suite. dgit ---- dgit allows you to treat the Debian archive as if it were a git repository. Conversely, it allows Debian to publish the source of its packages as git branches, in a format which is directly useable by ordinary people. Documentation: https://manpages.debian.org/testing/dgit git-debrebase ------------- git-debrebase is a tool for representing in git, and manpulating, Debian packages based on upstream source code. Documentation: https://manpages.debian.org/testing/git-debrebase Contributing ------------ The source is maintained in git (of course). The principal git branch can be found at either of these locations: * https://salsa.debian.org/dgit-team/dgit * https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git/dgit.git/ Merge requests on Salsa are welcome; as are code contributions via the Debian Bug Tracking System. If you encounter a bug, please report it via the Debian BTS. The package is marked up for message and document translation. See po/README which has Notes for Translators. work/absurd/0000755000000000000000000000000014761250142010210 5ustar work/absurd/git0000755000000000000000000000531414761250142010724 0ustar #!/bin/sh set -e case "$DGIT_ABSURD_DEBUG" in ''|0) exec 3>/dev/null ;; 1) exec 3>>../../gbp-pq-output ;; *) exec 3>>../../gbp-pq-output 2>&3 ;; esac exec 4>>../../absurd-apply-warnings log () { echo >&3 "DGIT ABSURD GIT APPLY (DEBUG) $*" echo >&2 "DGIT ABSURD GIT APPLY (STDERR) $*" } fail () { log "FAILED: $*" exit 127 } self=${0%/*} npath=${PATH#$self:} if test "x$PATH" = "x$npath"; then fail "PATH FILTER FAIL ($0 $self $PATH)" fi filter_path () { PATH=$npath } squash_author () { author_vars='NAME EMAIL DATE' for var in in $author_vars; do eval "GIT_AUTHOR_$var=\$GIT_COMMITTER_$var" done } try_commit () { git commit-tree "$try_commit_obj" /dev/null; } maybe_squash_author () { if (set -e; filter_path; try_commit); then return; fi if ! (set -e; filter_path; squash_author; try_commit); then return; fi read last <../../absurd-apply-applied echo >&4 \ "dgit: warning: suppressed corrupted metadata! ($last)" squash_author } bypass=true for arg in "$@"; do case "$arg" in apply) bypass=false; break ;; commit-tree) # Work around #950446 in gbp echo >&3 "DGIT ABSURD GIT APPLY - COMMIT-TREE: $*" try_commit_obj="$2" maybe_squash_author bypass=true; break ;; -*) ;; *) bypass=true; break ;; esac done if $bypass; then filter_path echo >&3 "DGIT ABSURD GIT APPLY - BYPASS: $*" exec git "$@" fi log "NO BYPASS: $*" case "$DGIT_ABSURD_DEBUG" in ''|0|1) ;; *) set -x ;; esac #exec >/dev/tty 2>&1 index=0 noo=0 for arg in "$@"; do case "$noo.$arg" in 1.--index) index=1 continue ;; 1.--whitespace=fix) continue ;; ?.-*) fail "UNKNOWN OPTION $arg ($*)" ;; 0.apply) ;; 1.*) patch="$arg" ;; *) fail "BAD USAGE $arg ($noo $*)" esac noo=$(( $noo + 1 )) done if [ $noo != 2 ]; then fail "NO PATCH ($*)" fi pwd=`pwd` patch=${patch#$pwd/debian/patches/} rm -f debian/patches/series # Work around #848611. # We need a stunt filename which the source package must not # contain. A trick is to use the commit hash of HEAD, whose # hash value cannot appear in any file in its own tree. omgwtf="dgit-omg-wtf-$(git rev-parse HEAD)" cat <debian/patches/$omgwtf --- --- a/$omgwtf 2016-10-31 23:28:47.314155919 +0000 +++ b/$omgwtf 2016-12-18 22:40:01.870058270 +0000 @@ -0,0 +1 @@ +: END printf "%s\n" "$omgwtf" >debian/patches/series printf "%s\n" "$patch" >>debian/patches/series # Just in case some joker tries to patch .git/something mv .git ../.git set +e dpkg-source --before-build . rc=$? set -e rm -rf .git mv ../.git . test $rc = 0 rm -f $omgwtf debian/patches/$omgwtf rm -rf .pc git checkout debian/patches/series git add -Af . log "APPLIED $patch" printf >../../absurd-apply-applied '%s\n' "$patch" #printf 'APPLIED '; date --iso-8601=ns work/debian/0000755000000000000000000000000014761250142010152 5ustar work/debian/changelog0000644000000000000000000035460314761250142012037 0ustar dgit (10.7+deb12u3) bookworm; urgency=medium * git-debpush: Add source= & version= (Closes: #1069001). -- Sean Whitton Mon, 03 Mar 2025 14:46:58 +0800 dgit (10.7+deb12u2) bookworm; urgency=medium * Prevent pushing older versions than is in the archive. Closes: #1050711. [Reports from Helmut Grohne and Phil Hands] Backported from dgit 11.3. -- Ian Jackson Sun, 03 Sep 2023 00:49:57 +0100 dgit (10.7+deb12u1) bookworm; urgency=medium * Use the old /updates security map only for buster. Fixes fetching from suites ,-security after buster. [Matthew Vernon] Closes: #1050179. -- Ian Jackson Tue, 22 Aug 2023 19:30:47 +0100 dgit (10.7) unstable; urgency=medium * dgit(1), dgit-maint-merge(7): Copy-edit changes since dgit 9.16. * dgit, dgit-maint-merge(7): Merge suggested README.source text into --quilt=single's generated patch header. We now have to say "a workflow similar to ... dgit-maint-merge(7)" but this is worth it for the simplification to the workflow. -- Sean Whitton Wed, 22 Feb 2023 15:13:06 -0700 dgit (10.6) unstable; urgency=medium Bugfix for handling some source packages: * dgit: dsc import: Launder the series file before feeding it to gbp, (in absurd git-apply mode) in case it contains strange things. Closes: #1030093. [Report from Peter Green] Minor improvements to git-debrebase: * git-debrebase(1): Add imprecation to call conclude or prepush, at top * git-debrebase(1): Remove launder-v0 from documentation * git-debrebase status: Print upstream commitid Supporting chnages: * dgit: Fix confusing appending of gbp-pq-output in innards. (Conceivably this might fix wrong messages in very unusual situations.) * dgit: Fix a call to die to be confess, if an unexpected copy fails. * tests: Bail on seeing "internal-only" commits, which should be invisible. * tests: Test laundering of a deranged series file (with a form feed). * dgit-ssh-dispatch: Apply perllib_local to policy hook, fixing a test suite bug where the wrong Dgit.pm might be used. -- Ian Jackson Sat, 04 Feb 2023 16:56:30 +0000 dgit (10.5) unstable; urgency=medium * [INTL:nl] Dutch translation for the dgit package. [Frans Spiesschaert] Closes:#1029682. * dgit: Add TODO about inappropriate translation of Subject -- Ian Jackson Thu, 26 Jan 2023 14:41:05 +0000 dgit (10.4) unstable; urgency=medium * Tainted object handling: Require policy-client-query to be supported when talking to the Debian server, so this check is now properly implemented rather than best-effort. Closes: #944855, #1027186. [Completes work prompted by report from Felipe Sateler.] * git-debrebase(1): Be less scary about --experimental-merge-resolution. -- Ian Jackson Thu, 29 Dec 2022 11:51:50 +0000 dgit (10.3) unstable; urgency=medium dgit useability improvements: * Silently tolerate mentions of debian/ in debian/source/include-binaries. Closes:#1026918. [Report from Simon McVittie] * Scan for duplicated orig tarballs with different names, avoiding strange dpkg-source errors mentioning format 2.0. Closes:#993769. [Report from Philip Hands] * Rename auto quilt mode to try-linear (retaining compat alias), to clarify that it won't automatically detect branch format. Closes:#935762. [Report from David Bremner] * dgit(1): Clarify the non-split-brain --quilt options, explicitly stating that they expect a patched-applied (dgit view) branch. Tainted object handling (relevant to Debian NEW): * dgit can now usually discover when --deliberately-* will be needed, before making signatures and attempting the actual push. Thus, missing a --deliberately no longer burns a version number. * This is #944855. However, it depends new infrastructure, which is (in this version) only queried on a best-effort basis: * New protocol transaction (over ssh) with dgit repos server, to allow client to make a policy enquiry, and specifically to enquire about tainted objects. * More of the relevant error messages are now translatable via gettext. Supporting changes: * Modest refactoring to support the new functionality. * Tests for new functionality, and improved tests in changed areas. * tests: sbuild-gitish: Pass -v to sbuild for better debuggability. -- Ian Jackson Thu, 29 Dec 2022 00:51:29 +0000 dgit (10.2) unstable; urgency=medium Command line change - dgit rpush vs rpush-source vs rpush-built: * Introduce "dgit rpush-source", a new feature. Closes:#974012. [Request from Wookey] * Introduce "dgit rpush-built", meaning what "dgit rpush" does now. * Make "dgit rpush" a configurable alias, which by default warns about future incompatibility and then runs "dgit rpush-built". (This was done for "dgit push" in dgit 10.0.) Bugfixes to dgit: * Be more conservative about when to run "git-debrebase make-patches". Closes:#1025451. [Report from Sean Whitton] * Cope with packages using "3.0 (quilt)" "include-binaries" feature. Closes:#1024233. [Report from Peter Green] * Cope with certain packages where dpkg-source guesses wrong about patch application status. (Perms-only patches may be implicated?) Closes:#1025694. [Report from Matthew Vernon] Minor improvements: * dgit(1): Promote push-source even more, rather than push-built. * git-debrebase --noop-ok: support --no-noop-ok. * Fix a typo "build" for "build" in the changelog entry for 10.1. Debugging fixes and internal changes: * dgit: Fix a direct use of chdir, should be changedir * git-debrebase --noop-ok: use default destination -- Ian Jackson Mon, 12 Dec 2022 01:15:55 +0000 dgit (10.1) unstable; urgency=medium Bugfixes to dgit: * dgit push-built: Populate the split brain cache if necessary Closes:#1019454. [Report from Simon McVittie] Bugfixes to git-debrebase [reports from David Bremner]: * git-debrebase: Fix "stripeoch" bug in convert-from-dgit-view. * git-debrebase: Fix handling of tag during convert-from-dgit-view. * git-debrebase: convert-from-dgit-view: Bail if output is wrong eg due to lack of appropriate d/patches. Documentation and messages: * dgit: Soften message about source-only uploads to NEW. [Report from Simon McVittie] Improves #983056 a bit. * dgit(1): Be more encouraging about --new. Closes:#941323. * dgit(1): Remove obsolete documentation of dgit-tag-format [Remark from Philip Hands in #1023468] * dgit-maint-debrebase(7): add --pretty example for generating hash tags for upstream versions. [Philip Hands] * git-debrebase: conversion: bail a little earlier on snags. Infrastructure (dgit-repos, server side): * get-dm-txt: Handle abolition of archive-query-tls-curl-ca-args (fixes incompatibility with deployed production configuration). Packaging: * New elements to test cases to test some of the fixes. * changelog: Fix misindented line in entry for 9.11. * changelog: Retrospectively xref to #950612 in entry for 9.11. -- Ian Jackson Fri, 11 Nov 2022 23:53:28 +0000 dgit (10.0) unstable; urgency=medium Major command line change - dgit push vs push-built: * Introduce "dgit push-built", meaning what "dgit push" does now. * Make "dgit push" a configurable alias, which by default warns about future incompatibility and then runs "dgit push-built". See dgit(1). * Docs: generally recommend "push-source" rather than "push". [Report from Osamu Aoki] Closes:#992606. New feature, and change to recommended usage: * Provide --quilt=single, and no longer recommend single-debian-patch anywhere (since it can go badly wrong). Closes:#1018984. Handling of unusual kinds of change to upstream files, during quilt fixup: * Don't use dpkg-source --commit, but git diff. * Handle exectutability changes. Closes:#995056. [Report from Peter Green] * Reject all changes to symlinks (including symlink creation). * With dpkg single-debian-patch, pass --include-removal to dpkg-source -b. * Now we can make any diff that dpkg-source can cope with. Closes:#1018143. Changes related to --dry-run and --damp-run: * dgit(1): Demote, and add caveats describing their behaviours. Closes:#973896. [Report from Wookey] * dry run: Fix a handful of bugs (and improve a message). Other: * dgit: Pass require_valid_signature to Dpkg::Source::Package in the correct manner. Closes: #964286. [Guillem Jover] Internal: * Refactorings and commentary, to support the other changes. * Consequential updates to tests. * More comprehensive testing of unusual upstream changes. -- Ian Jackson Sun, 04 Sep 2022 13:43:34 +0100 dgit (9.16) unstable; urgency=medium Compatibility with git-buildpackage gbp pq 0.9.26 (Closes:#1005873): * dgit: Move .pc aside while running gbp pq import * git-debrebase: convert-from-dgit-view: Disable ignore-new where needed Other changes: * Fix typo in changelog for 9.14, noting that we closed #987304. * playtrees (for dgit and git-debrebase): Provide a gbp.conf. * tests: gdr: Provide a way to pass --diagnose. -- Ian Jackson Sat, 28 May 2022 22:49:53 +0100 dgit (9.15) unstable; urgency=medium * dgit: pseudomerge_version_check: Check for unfinalised changelog entry. * tests: Set FILTER_BRANCH_SQUELCH_WARNING=1 * tests: Use t-debchange in some places instead of dch * tests: Update all using tests/update-db-compat. Closes: #1002927. -- Ian Jackson Sun, 02 Jan 2022 12:20:23 +0000 dgit (9.14) unstable; urgency=medium Bugfixes: * Tolerate git config init.defaultBranch. Closes:#972098. Reports from Didier 'OdyX' Raboud, Osamu Aoki. Diagnosis by Stig Sandbeck Mathisen. * dgit: Tolerate making quilt patches creating +x files. Closes:#949675. Report from peter green. * dgit: Avoid use of GZIP environment variable. Closes: #975624. Report from Stéphane Glondu. * Tolerate git config diff.noprefix. Closes:#973881; report from Didier 'OdyX' Raboud. Documentation and diagnostics: * Clarify git-debrabase --anchor, -fanchor-treated. Closes:#977426. Report from Wookey . * dgit: Better message for dirty trees. Closes:#930930. Report and suggestions from Sean Whitton. git-debpush, tag2upload: * Add missing dependency. Closes:#940589; report from Andrej Shadura. * Fix version unmangling. Closes:#987304; report from Wolfgang Silbermayr. Tests: * Introduce t-debchange and set DEBEMAIL. * Add init.defaultBranch to two test cases and diff.noprefix to one. * Test creation of new symlink is treated as unrepresentable. * Increase the nproc -> make -j factor. -- Ian Jackson Wed, 08 Sep 2021 01:30:53 +0100 dgit (9.13) unstable; urgency=medium * gitattributes defuse: work even if .git/info/attributes missing (Closes: #981344) * dgit-maint-*(7): Advice for git-debpush users. Closes:#932520. [Sean Whitton] * dgit.1: drop remark about sbuild not building arch-independent. Closes:#952442. [Helmut Grohne] -- Ian Jackson Fri, 12 Feb 2021 12:48:15 +0000 dgit (9.12) unstable; urgency=medium Bugfixes: * dgit-mirror-ssh-wrap: Cope with yet another new rsync rune. Closes:#968635. [Sergio Durigan Junior] -- Ian Jackson Wed, 19 Aug 2020 17:25:45 +0100 dgit (9.11) unstable; urgency=medium Bugfixes: * git-debrebase, git-debpush: fail when looking for upstream tag if there is more than one candidate. Closes:#961682. [Sean Whitton] * git-debrebase: Fix error message for wrong use of -i * git-debrebase: new-upstream: Do not treat late options as version Documentation: * dgit-maint-debrebase(7): Drop some bad advice about the upstream/ tag case. Closes:#961683. [Sean Whitton] * git-debrebase(1): Fix new-upstream -i docs. Closes:#950612. dgit-infrastructure: * dgit-mirror-ssh-wrap: Cope with new rsync rune. Closes:#963489. * dgit-mirror-ssh-wrap: Clarify the error message Test suite: * Cope with buster & eatmydata (ie, work around #963508) * Provide navigation banner in log when exiting nonzero * Print pwd in failure trap to help with diagnosis -- Ian Jackson Mon, 22 Jun 2020 19:09:17 +0100 dgit (9.10) unstable; urgency=medium dgit bugfix: * Work around gbp metadata handling bug which can prevent import of some anomalous source packages. Closes:#950326. Report from Peter Green. git-debpush bugfix: * avoid a pipefail problem. Closes:#940588. [Sean Whitton] Documentation: * Terminology: Change "rewind" to "rewrite" where appropriate * dgit(1): Cover more cases of --overwrite and --deliberately Closes:#928473. * dgit(1): Do not talk about `intermediate' uploads. * d-m-{merge,debrebase}(7): Use an 'upstream/' tag prefix in gbp.conf; set `merge' in gbp.conf; import tarball before committing gbp.conf. Closes:#932954. [Sean Whitton] i18n: * Updated nl.po file. Closes:#945356. [Frans Spiesschaert] -- Ian Jackson Mon, 03 Feb 2020 08:41:10 +0000 dgit (9.9) unstable; urgency=medium Documentation: * dgit-maint-{merge,debrebase}(7): Suggest a better rune. (`git fetch --tags upstream') Closes:#939679. [Sean Whitton] * git-debpush(1) minor improvements. Closes:#935084. [Sean Whitton] * dgit(1): Fix a typo (found by lintian) * dgit-maint-bpo(7): Mention occasional need for --new. Closes:#935443. * git-debrebase: Extend extended description for this .deb. Infrastructure: * New script dgit-mirror-ssh-wrap suitable for use as restricted command on repos mirror target hosts, and corresponding test. Packaging niggles: * control: Add missing dependency on liburl-perl (dgit and tests) * control: Drop redundant Priority field for dgit-infrastruture * control: update Vcs-Git to end in .git * lintian: Override some checks * control: Bump Standards-Version to 4.4.0.0. -- Ian Jackson Sat, 14 Sep 2019 21:34:13 +0100 dgit (9.8) unstable; urgency=medium dgit, important bugfixes for bugs introduced in 9.6: * Once again cope with archive skew. Closes:#935874. [Initial report from Colin Watson] * Follow http[s] redirects again. Closes:#939564. dgit, useful new behaviours and fixes: * Use distro-info-data to resolve unknown suites. Closes:#931212. [Suggestion from Simon McVittie] * Try to warn about misplacement of dgit options. Closes:#934807. [Useability report from Félix Sipma] * Fail early when the archive/ tag already exists, ie when version needs to be not reused. Closes:#935802. [Useability report from IOhannes m zmölnig] * Do not mistakely reject .asc and .sig files with push-source -C. Closes:#939280. [Report from Simon McVittie] docs: * dgit-maint-{merge,debrebase}(7): Suggest git fetch --all --tags as it handles tags better. [Sean Whitton] Closes:#939504. * git-debrebase(5): Tiny typo fix. * dgit(1): Some semantic linefeeds (no change to rendered output) Supporting changes: * test suite: New test for http mirror and archive skew * test suite: Test already-tagged check * test suite: Add --force-reusing-version to many tests as now needed * Dgit: Minor refactoring of a regexp. -- Ian Jackson Fri, 06 Sep 2019 23:42:15 +0100 dgit (9.7) unstable; urgency=medium dgit general bugfixes: * Correctly test for presence of git repo on dgit git server. Fixes behaviour following mixed dgit/non-dgit uploads. Closes:#934126. (Was badly broken by http fetching rework in dgit 9.6.) * Fix use on NFS, by closing a file which is going to be deleted. [Report and fix from Stéphane Glondu] Closes:#933827. dgit vcs-git bugfixes: * Strip [] (used eg by Debian Haskell Team). Closes:#932699. * update-vcs-git: Cope if url is unchanged. * update-vcs-git: Strip -b (as it always should have done). Test suite: * New facilities for http testing, including mock webservers. * New test cases for http, and for bugs fixed in this version. * Switch to using http git check in three existing tests. * Improve debian/tests/control generator. * Limited refactoring to support other changes. Other minor changes: * dgit: Slightly more debugging for check_for_git with http[s] * changelog: Fix a typo in the entry for 9.6. * i18n (messages) updated, following message changes. -- Ian Jackson Sun, 11 Aug 2019 01:11:01 +0100 dgit (9.6) unstable; urgency=medium * git-playtree-setup had a spurious set -x so many programs spewed debugging output. This is now fixed. Closes:#932959. dgit: * Drop support for configuring old, not currently enabled, methods of TLS key/cert pinning. We are going to revisit this soon. * Provide a --for-push option (useful in for certain special users). * Reduce variety in HTTP clients we use. Specifically, use WWW::Curl for accessing (i) the ftpmaster API, (ii) the http dgit git server mirror (iii) downloading the .dsc. Administrivia: * Add missing Closes of #932476 to changelog entry for 9.5 -- Ian Jackson Thu, 25 Jul 2019 13:12:08 +0100 dgit (9.5) unstable; urgency=medium git-debpush [Sean Whitton]: * Support ignoring individual checks with --force=check. Closes:#932459. * Check upstream source is identical in the upstream tag. Closes:#932476. * Check that patches are (un)applicable. Closes:#932477. * Check for an unstitched git-debrebase branch. Closes:#932612. * Check for explicitly pushing detached HEAD. dgit clone [Ian Jackson]: * No longer create an "origin" remote. Closes:#932694. Documentation: * dgit-maint-bpo(7): new manpage for maintainers of official Debian backports. Closes:#857490. [Sean Whitton] * git-debrebase(1): make this manpage a less intimidating entry point. Closes:#926656. [Sean Whitton & Ian Jackson; prompted by feedback from Sam Hartman] Miscellaneous: * Correct the description of --force in git-debpush(1) [Sean Whitton]. * git-debrebase(*): fix some crossreferences [Sean Whitton]. Closes:#932536. * Break out git-playtree-setup and rewrite in shell. [Ian Jackson] * Fix organisation copyright attribution for Matthew Vernon's contributions. Closes:#932630. * HACKING: new document for helping people work on the code. [Ian Jackson] * Update Vcs-Git etc. to point to salsa. -- Sean Whitton Mon, 22 Jul 2019 21:38:19 +0100 dgit (9.4) unstable; urgency=medium dgit: * Support the Ubuntu Cloud Archive [Matthew Vernon]. Closes:#932322. test suite: * tag-to-upload tests: Tolerate a changed git message. Closes:#932475. administrivia: * debian/copyright: Add some missing credtis * Update copyright notices in many files -- Ian Jackson Sat, 20 Jul 2019 16:26:32 +0100 dgit (9.3) unstable; urgency=medium dgit and git-debrebase bugfixes: * No longer crash if .git/logs does not exist when we need it. * Report the upstream tag, rather than commit id, in tags/commits, if the user explicitly specifies refs/tags/... tag-to-upload, git-debpush [Sean Whitton]: * Several new checks designed to prevent broken uploads. - Including: Check that upstream tag is ancestor of branch to be tagged. Closes:#932096 * Cope with spaces in user-supplied upstream tag. tag-to-upload, server side: * Fix non-default quilt modes. These were all previously broken. * Arrange to report the upstream tag in dgit-generated commits/tags. dgit archive query improvements [Matthew Vernon]: * dgit(1): document the presence of the aptget method. Closes:#932321. minor supporting changes: * New tests tagupl-baredebian and tagupl-gbp. * Tiny addition to debugging output and test suite output. * Test suite rearrangements. -- Ian Jackson Thu, 18 Jul 2019 03:10:25 +0100 dgit (9.2) unstable; urgency=medium * No change upload to force rebuild on buildd. -- Ian Jackson Tue, 09 Jul 2019 22:01:25 +0100 dgit (9.1) unstable; urgency=medium New tools for a "git-push-to-upload" workflow [Ian Jackson & Sean Whitton]: * New script in a new binary package: git-debpush. The new binary package is small, but + git-debpush needs to be in src:dgit, because its test suite is the dgit test suite; however, + git-debpush is functionally and conceptually independent of dgit, so should not go into bin:dgit; in particular + git-debpush's dependencies are quite different to the other binary packages. * New dgit-infrastructure subcommand, tag2upload, to process tags made by git-debpush. Please see git-debpush(1) for a sketch of the workflow. dgit: * Allow the -p option to be used with various push modes. * Include dgit tag metadata in maintainer view tags. For consistency with, and use by, git-debpush. * Include quilt metadata in the archive/ (dgit view) tag. * rpush protocol: Version 6, which includes split brain information for maintainer view tags. And, actually use newer version (was broken in 9.0, which would prefer to select 4 not 5). * Add some missing blank lines to tag messages. * Some other refactoring. Other documentation: * dgit(1): fix a reference in the description of --quilt=auto [Sean Whitton]. Translations: * Do not translate tag subject lines, because these are parsed by dgit-repos-server. Test suite: * Test cases for new tools for "git-push-to-upload" workflow. * drs-git-ext: honour DGIT_DRS_MODE. * Provide a stunt sendmail and a stunt dgit. * Unset CDPATH in case caller has it set. * Some other refactoring. Administrivia: * Update d/copyright years to include 2019 [Sean Whitton]. -- Ian Jackson Sun, 07 Jul 2019 14:28:27 +0100 dgit (9.0) unstable; urgency=medium dgit - low-impact incompatible change: * Drop support for, and testing of, dgit versions which use old tag name (debian/V; now that is maintainer view and dgit is archive/debian/V). The new tags came in in dgit 2.0 in October 2016. No version of dgit without them was in any Debian release. We don't expect there are any sites using old servers which do not support the new format, or anyone using a dgit client older than 2.x who cannot upgrade. git-debrebase fixes [Niko Tyni]: * Fix `git-debrebase convert-from-dgit-view ', which would crash due to an argument parser bug. Closes:#930214. * git-debrebase(1): typo fix. Closes:#930215. dgit - new capabilities: * Support split view with native packages, and with all quilt modes. Now we distinguish "split view" (meaning separate dgit branch) from "splitting quilt modes" (eg --quilt-unapplied). [Prompted in part by enquiries from Sam Hartman] Closes:#926640. * Support for bare debian/ directory (aka packaging-only) git branches Ie, --quilt=baredebian[+tarball]. [Thanks for info from Shengjing Zhu, and docs and UI contributions/review from Sean Whitton.] Closes:#903392. Closes:#931253. dgit - bugfixes: * Fix --dgit-view-save option alias, which never worked. (--save-dgit-view worked, and still does, though.) * i18n: Do not translate import commit messages. dgit - other documentation improvements [Sean Whitton]: * Expand on description of --include-dirty. New text may help user avoid unexpected file deletion. Closes:#930922. * dgit-maint-*(7): Suggest --name-status --diff-filter. Closes:#930956. * dgit-maint-*(7): Using untagged upstream commits. Closes:#930964. dgit - minor consequences of these other changes: * Actually properly reject invalid quilt modes found in git config. (Previously they might be accepted and then cause malfunctions.) * Reject split brain quilt modes with single-debian-patch. (Previously this would malfunction; now we reject it.) * i18n: Add translator notes about ASCII art changes display. * Drop "dgit view: changes are required..." message. * Some other minor changes to quilt fixup error handling. * Changes to debugging output related to quilt modes and split view. * Introduce rpush protocol version 5. Minimum version is now 4. * Considerable internal rearrangement of quilt fixup code. * Considerable test suite work including new tests. dgit test suite: * dgit-repos-policy-debian: Test taint removal. Closes:#929249. -- Ian Jackson Tue, 02 Jul 2019 16:55:15 +0100 dgit (8.6~) UNRELEASED; urgency=medium * dgit: rpush: Work in splitting quilt modes, again. Closes:#931213. -- Ian Jackson Tue, 02 Jul 2019 14:36:47 +0100 dgit (8.5) unstable; urgency=medium * Replace `confess $!' with `confess "$!"', to actually print errno when crashing. Closes:#929549. -- Ian Jackson Mon, 27 May 2019 00:20:58 +0100 dgit (8.4) unstable; urgency=medium Bugfixes: * dgit: import-dsc: Handle relative symlinks correctly. Closes:#913259. * dgit: Do not misrecognise some initial packaging as gdr-compatible. Closes:#922446. [Report from Sean Whitton] * git-debrebase: convert-*: Fix two broken error messages. Closes:#922462. [Report from Didier 'OdyX' Raboud] Documentation: * [nl] translations updated. Closes:#921088. [Frans Spiesschaert] * Many manpage typo fixes. Closes:#918384. [Paul Hardy] * dgit(1): Write the leading dash of an option as '\-'. Closes:#921965. [Bjarni Ingi Gislason] Test suite: * dgit: import-dsc: New test for abs/rel dsc component links Internal changes: * dgit: cmd_import_dsc: comment on lack of is_orig_file check * git-debrebase: resolve_upstream_version: Return $used too -- Ian Jackson Fri, 01 Mar 2019 21:53:40 +0000 dgit (8.3) unstable; urgency=medium dgit - Behavioural changes with compatibility implications: * Pass --no-source-only-changes to pbuilder and cowbuilder Closes:#904862. This option was only recently added to pbuilder. For compatibility with old pbuilder, say, eg `dgit --pbuilder!:--no-source-only-changes'. * With --clean=git etc, check the tree is clean even before building source in dgit's private directory. Specifically, with eg dgit sbuild or dgit build-source. dgit prior to 6.0 would always clean the tree. dgit 6.0 to 8.1 would ignore untracked files completely, leading to occasional lossage. The pre-6.0 behaviour can be requested with --clean=git,always etc. (aka -wga, -wgfa). Closes:#914317. dgit - New features, bugfixes and improved behaviours: * Allow uppercase (ascii) letters in multi-orig components, as is allowed by the spec in dpkg-source(1). Closes:#916926. * Honour --program!:option to suppress options passed by default. * clone: Create destination directory before using network. * Check early that build-products-dir is accessible. Closes:#913648. * Look for origs in `..' as well as build-products-dir, and there are any, link them into the bpd. Closes:#904878. * Provide new --git[-ff],always clean mode (as discussed above). i18n - new translations [Frans Spiesschaert]: * nl, dgit-user(7). Closes:#918253. * nl, messages. Closes:#917148. Documentation: * dgit(1): Fix documentation of .quilt-mode config. * dgit(1): Fix a formatting typo (spurious .TP). Closes:#917194. * dgit-user(7): Fix formatting error in comment about multi-arch. * dgit-maint-debrebase(7): handle DFSG-filtering for a new package. [Sean Whitton] Closes:#915973. Error message improvements: * dgit: When reporting no such package, say `source package'. * dgit: Fix reference to -wdn/-wddn in a message. * dgit: cleaning: Minorly improved handling of note about ignores. * dgit-repos-policy-debian: Remove duplicated text from force report message. Closes:#913676. i18n infrastructure: * po/README: Fix reference to dgit-user_7.pot. * po4a, pairwise-pocheck: Fix recognition of bare `<...>'. * Update po and pot files. Internal changes; * dgit: Remove foolish uses of $b, which is very special in perl. * Modest refactoring to support the other changes. * test suite: pretend-pbuilder: Reject unknown options. * Test suite: examplegit setup: Do not leave the tree dirty. -- Ian Jackson Mon, 07 Jan 2019 00:14:05 +0000 dgit (8.1) unstable; urgency=medium git-debrebase; * convert-from-unapplied: Provide aa an alias for convert-from-gbp and document its scope properly, etc. Closes:#905433. * dgit-maint-debrebase(7): discuss -fdiverged with convert-from-*, and (prompted) dgit --overwrite. Closes:#903377. [Sean Whitton] i18n support: * Check pod translations for a common class of syntax error. (using new machinery for pairwise checking of pod translations.) * po4a: Add -LUTF-8 to the config. * po4a/.gitignore: actually ignore right .po4a.LANG.cfg. test suite: * Run everything with LC_CTYPE=C.UTF-8. * manpages-format: pass --warnings. * NOTES.podchecker: Document why we're not using podchecker. -- Ian Jackson Thu, 08 Nov 2018 02:09:05 +0000 dgit (8.0) unstable; urgency=medium dgit - Behavioural change with compatibility implications: * Check (with --clean=dpkg-source[-d], ie, by default) that rules clean does not leave untracked files (ie, trip if it looks like a `git add' may have been forgotten). dgit will now fail in some situations where previously it would have just carried on. * Honour new clean modes --dpkg-source[-d],no-check aka -wdn / -wddn which suppress this check. (Whether the untracked files are used or disregarded depends on --include-dirty.) * Honour new .clean-mode-newer access config option, to allow git configs to be compatible with both new and old dgits. See relevant parts of dgit(1) for more information. dgit - Improved behaviours: * Better handling of cross-filesystem operations, including build-products-dir on a different fs. Closes:#910730. * Change to git toplevel dir before starting. Closes:#910724. * Provide --clean=check,ignores aka -wci. * Provide --clean=dpkg-source[-d],all-check aka -wda / -wdda. dgit - Important bugfixes: * Check that tree does not contain untracked files (depending on clean mode) when building source using git branch rather than using working tree. In particular, honour --clean=check. Closes:#910705. * Also apply that new cleanliness check during build-source or push-source etc. with --clean=dpkg-source; even though rules clean was not run. See above. Again, -wdn / -wddn may be needed. * dgit: Forbid source building with --include-dirty and non-.. bpd, which can seriously malfunction. Closes:#910725; see #910740. dgit - Additional sanity checks: * quilt linearisation: Stop at debian/source/format changes. * quilt fixup: Cope if gdr analysis finds origin. Closes:#910687. * Add missing error check in single-debian-patch handling. * Refuse to work if critical files have uncommitted changes. * Reject all git config options containing newlines. * Better error message for not in git tree. (For git-debrebase too.) dgit - Minor bugfixes: * Fix spelling errors etc. in messages. * Replace mention of alioth by salsa in a message. * clean_tree: confess rather than die on unknown clean mode. * Add missing \n to crash from git_cat_file. (git-debrebase too.) Documentation: * dgit(1): Document that cleaning is sometimes not needed and is therefore not done. * README.md: Add this document for the benefit of Salsa. * po/README: Mention -k10 threshold. * po/README: Give a pointer to salsa; remind the translator to commit. * dgit(1): Fix spelling errors. * dgit(7): Fix spelling errors. * dgit-sponsorship(7): Fix spelling error. Consequential changes: * Internal refactoring to support all these changes. * Tests adjusted to correspond to, and somewhat test, these changes. * Slight reorganisation to documentation of --clean=dpkg-source etc. Build system: * Makefile: Provide i18n-commit target. * po/list-documents: Set translation threshold to 10%. -- Ian Jackson Sat, 13 Oct 2018 23:56:35 +0100 dgit (7.0) unstable; urgency=medium Bugfixes: * dgit: Do not sometimes crash in quilt-fixup if git-debrebase is not installed. Closes:#910221. * git-debrebase: new-upstream: Drop `sleep 2' (!) * git-debrebase: anchor: Print the anchor, not the breakwater tip (!) * Get rid of perl warning "Statement unlikely to be reached" (introduced in 7.0~pre1). * git-debrebase: merges: Make warnings of lossage less overblown i18n (translation): * Support message translation for git-debrebase. (Re #904883.) * Support document translation. Closes:#904883. * po: Rename `all-po' target to `pofiles' Error message improvements (prompted by i18n work) * Replaced `die' with `confess' in many unexpected syscall errors and internal error cases. * git-debrebase; Print a proper message for failure to opendir the bpd and for failure to chdir to the toplevel. Internal changes: * Minor refactoring to support translation. * i18n-diff-auditor: New script to support translation markup. Packaging: * Use dh_missing --fail-missing * Add missing build-dependency on xgettext Test suite: * gdr-makepatches7: Fixes to dgit/git-debrebase interaction * gdr-makepatches7: Test dgit with missing git-debrebase * Test that the binary packages can be built -- Ian Jackson Thu, 04 Oct 2018 20:33:12 +0100 dgit (7.0~pre1) experimental; urgency=medium * i18n: Support messgae translation for the program dgit. (Working towards #904883.) -- Ian Jackson Tue, 02 Oct 2018 13:20:24 +0100 dgit (6.12) unstable; urgency=medium * test suite: t-check-only-bpd: Check $tmp/.. not .. . Fixes bogus failure in Ubuntu CI. Thanks to Mattia Rizzolo for the report. -- Ian Jackson Fri, 28 Sep 2018 18:17:36 +0100 dgit (6.11) unstable; urgency=medium * dgit-maint-debrebase(7): move and improve the section "Inspecting the history". [Sean Whitton] * Makefile: Adjust scope of dgit(7) pod rule. * local-pod-man: developer script, obsoleteed by `make %.view': drop it. -- Ian Jackson Sun, 26 Aug 2018 14:59:32 +0100 dgit (6.10) unstable; urgency=medium git-debrebase bugfixes: * Patches in subdirectories: fix malfunctions. Closes:#907202,#907206. * new-upstream changelog entry: Use debchange. Closes:#905888. * Empty patch queues: Fix some malfunctions and infelicities. * convert-to-gbp: Actually base the result on the breakwater, not HEAD. dgit bugfixes: * *build*: Cope with new-style --build= specifications * Pass --no-source to sbuild (always). Closes:#904966. * build: Squash $buildproductsdir. Closes:#906786. dgit improvements for git-debrebase compatibility: * Do not try split brain git-debrebase make-patches. Closes:#906908. * Do not abandon quilt fixup at git-debrebase split commits. * Check for git-debrebase with a history walker, not debrebase-last. This can avoids using dpkg-source --commit. Closes:#907208. git-debrebase improvements: * convert-from-*: snag on discarding comments in series. Closes:#907198. * forget-was-ever-debrebase: New subcommand. * Make all commit message annotations have a COMMIT-TYPE. git-debrebase documentation: * dgit-maint-debrebase(7): Add runes for inspecting. Closes:#907190. * git-debrebase(5): Warn against renaming branch while unstitched * git-debrebase(5): Document new understanding of debrebase-last test suite behavioural changes for ad-hoc runs: * run-all: Without --progressive, rm and recreate tests/tmp * run-all: Honour DGIT_TESTS_TMPDIR * run-all: Understand `:' specially test suite: * Tests for the bugfixes and improvements. * lib-gdr: Be more defensive about unexpected states/args * lib-gdr: Check that we made patches with git-debrebase * Honour DGIT_TEST_RUN_PFX env var. * Test dgit calling git-debrebase on new debianisation. * gdr-new-upstream: Check changelog is exactly right. * debchange: Widespread better handling of the time seen by dch. Freeze time. Work around faketime TZ bug (#907264). * test-list-uptodate: Drop imports and dependencies * git-debrebase: gdr-merge-conflicts: Call git merge --no-edit * build-modes-*: Provide stunt dpkg-deb to pass -Znone, for speed. * build-products-dir: Check nothing in ../ * Work if $tmp is on a different filesystem. * Internal changes and refactoring to support other changes. -- Ian Jackson Sun, 26 Aug 2018 14:58:18 +0100 dgit (6.9) unstable; urgency=medium * dgit: do not crash on push of a new gdr package. Closes:#906784. * dgit: Remove unsubstituted $changesfile from message Closes:906787. * dgit-maint-debrebase(7): improve "Converting an existing package", and refer to "ILLEGAL OPERATIONS" in git-debrebase(5). Closes:#905573. [ Sean Whitton ] * test suite: Update debian/tests/control following dependency fix. -- Ian Jackson Tue, 21 Aug 2018 14:36:36 +0100 dgit (6.8) unstable; urgency=medium * test suite: Fix dependencies of new gdr-merge-conflicts test. -- Ian Jackson Mon, 20 Aug 2018 14:52:03 +0100 dgit (6.7) unstable; urgency=medium git-debrebase, bugfixes: * make-patches: Do not bail if there aren't any. * scrap: works properly when it does only rebase --abort. * On rebase: always save ffq-prev even if we were both stitched and laundered. Closes:#905975. git-debrebase, improvements: * Speed: improve laundry performance by a factor of ~55:1, and analysis performance by factor of ~4.2:1. Closes:#905995. * prepush: this is now a silent no-op if the branch is unstitched. This is more friendly. * convert-from-*: Snag on patches in d/patches which are not in series, because they will be deleted. Closes:#904997. * Highly experimental merge resolution support, enabled only with special command line option. * Lots of internal changes to support merge, and other work. * convert-from-*: Check whether ffq-prev or debrebase-last indicate that we are already in gdr format. * convert-from-*: leave debrebase-last refs to hint to everyone that this is now a gdr branch. git-debrebase, improved messages: * Improve ffq head recording message. * Better (less copious by default) debug output. * convert-from-gbp: Improve messages. Closes:#906641. * Provide hints for unprocessable commits, depending on the apparent branch ffq state, including possible suggestion to use convert-from-*. Closes:#905005. Closes:#905279. dgit, improved messages: * Mention bad origs as possible cause of quilt fixup failure, in both dgit(7) and in error messages. No longer suggest --quilt=smash or dpkg-source --commit in the error message. Closes:906196. * Do not suggest --quilt modes if quilt fixup "stopped at" a commit made by git-debrebase. Closes:#906197. * Mention gitattributes as a potential problem in quilt linearisation failure, when appropriate. Closes:#906199. dgit, documentation: * dgit(1): Encourage --overwrite rather than --overwrite=version. * Document that we do not suppress attributes which affect git-archive. This is related to #906199. test suite: * test suite: Set DEBFULLNAME * test suite: unset GIT_EDITOR, so it works if user has that set. Packaging: * changelog: Add close note for #905400 to changelog entry for 6.5. -- Ian Jackson Mon, 20 Aug 2018 02:30:06 +0100 dgit (6.6) unstable; urgency=medium * test suite: Fix gdr's calls to dgit when run formally in autopkgtest. (Affects gdr-import-dgitview.) -- Ian Jackson Sun, 05 Aug 2018 10:42:01 +0100 dgit (6.5) unstable; urgency=medium git-debrebase new features: * git-debrebase: Provide new convert-from-dgit-view operation. The output is, unavoidably, not very pretty. Closes:#905322. * git-debrebase: New subcommand `scrap'. Closes:#905063. git-debrebase error handling improvements: * git-debrebase: Properly reject bare dgit dsc imports. Closes:905400. * git-debrebase: Improve some error message formatting. * git-debrebase: Check for git-rebase in progress and abort most operations. dgit improvements: * dgit: Improve error message for unknown suite, to suggest -d. * dgit: Rename --dgit-view-save to --save-dgit-view, leaving an alias. * dgit: Provide print-unapplied-treeish subcommand. Test suite changes: * test suite: Add t-tstunt-parsechangelog to many gdr tests. * test suite: editing a test script overrides DGIT_TESTS_PROGRESSIVE. * test suite: gdr-import-dgitview: New test for dgit dsc imports. -- Ian Jackson Sat, 04 Aug 2018 17:53:57 +0100 dgit (6.4) unstable; urgency=medium * git-debrebase(1): Fix typo "unappled". Closes:#905064. -- Ian Jackson Thu, 02 Aug 2018 08:24:32 +0100 dgit (6.3) unstable; urgency=medium * git-debrebase: breakwater: Fix error message for unprocessable commits. Closes:#905003. * git-debrebase: new-upstream: Fix error message for new version with bad syntax. * git-debrebase test suite: Test messages about unprocessable commits. * git-debrebase: new-upstream: Fix handling of epochs. * git-debrebase: convert-from-gbp: Use same algorithm for finding upstream commitish as new-upstream. Closes:#905062. * git-debrebase: Improve error messages for bad options. * git-debrebase: Improve error message for convert-from-gbp upstream discrepancy. Closes:#905078. * git-debrebase(5): Add ILLEGAL OPERATIONS section. (Re#905004.) * git-debrebase(1): Warn against plain git rebase. (Re#905004.) * dgit-maint-debrebase(7): Warn more against plain git rebase. Closes:#905004. * git-debrebase: Implement --help, providing a summary. Closes:#904990. -- Ian Jackson Thu, 02 Aug 2018 03:45:40 +0100 dgit (6.2) unstable; urgency=medium * dgit(1): Improve and correct --build-products-dir description. * dgit: Minor code cleanup. * dgit build: Warn if --build-products-dir is not `..'. Closes:#904859. * test suite: Test dgit import-dsc --build-products-dir. [Sean Whitton] * manpages: alioth->salsa * manpages: add references to pbuilder and cowbuilder * dgit-maint-gbp(7): discuss dgit.default.build-products-dir * dgit-maint-gbp(7): update references to --*-dirty * dgit-sponsorship(7): add references to push-source * dgit-maint-debrebase(7): fix command to just launder -- Ian Jackson Sun, 29 Jul 2018 12:57:26 +0100 dgit (6.1) unstable; urgency=medium New feature: * 'pbuilder' and 'cowbuilder' subcommands (Closes: #844125). - Suggest sbuild | pbuilder | cowbuilder. Minor fixes: * Fix an error message to refer to the build products dir instead of just the parent directory. -- Sean Whitton Sat, 28 Jul 2018 20:14:23 +0800 dgit (6.0) unstable; urgency=medium New features [Sean Whitton]: * Introduce dgit.default.build-products-dir git configuration key. Closes:#857316. * Die earlier, and with a more helpful message, if the user tries to include dirty changes when building a source package in split brain mode. dgit behavioural changes: * dgit: Always build the source package ourselves, rather than sometimes leaving that to the builder command. dgit will now usually generate *_multi.changes rather than *_$arch.changes. * dgit: Build source packages in a private directory, except when the user passes --include-dirty [Sean Whitton]. - dgit push-source no longer cleans the tree [Sean Whitton]. * dgit: Rename --ignore-dirty to --include-dirty (leaving the old name supported as a deprecated alias). Test suite improvements: * test suite: unset VISUAL, which interferes. Closes:#904308. * Honour DGIT_SCHROOT_CHROOT to set the schroot to use for the sbuild tests. * Support tests/run-all --progressive. * Drop now-obsolete *-asplit tests. Other improvements: * apt-get method: when apt does not update release files, unconditionally print hint about noatime. Closes:#851873. * messages: Be a lot more friendly about NEW in particular, and also add a couple of `please's. Closes:#904448. * Make --build-products-dir (and the new config key) actually work. Closes:#863582. [ Ian and Sean. ] * dgit: Many important internal rearrangemnts relating to source package production and building. -- Ian Jackson Thu, 26 Jul 2018 14:43:47 +0100 dgit (5.10) unstable; urgency=medium * Merge the experimental branch. * test suite: Drop a couple of useless test log output lines. * infrastructure: Run git gc --auto before mirroring. Closes:#841414. -- Ian Jackson Sat, 14 Jul 2018 18:07:02 +0100 dgit (5.9+exp4) experimental; urgency=medium * test suite: Use dch -r -D sid '' not dch -r sid. Closes:#903441. * test suite: Save a tarball of much of the working area of each test in $AUTOPKGTEST_ARTIFACTS. * Separate changelog entries for the following test attempts in experimental have been elided: dgit (5.9+exp3) experimental; urgency=medium dgit (5.9+exp2) experimental; urgency=medium dgit (5.9+exp1) experimental; urgency=medium -- Ian Jackson Thu, 12 Jul 2018 13:45:07 +0100 dgit (5.9) unstable; urgency=medium * git-debrebase convert-from-gbp: Look for dgit-generated tags so we can usually make the new branch ff of the dgit view. Closes:#903132. * git-debrebase convert-from-gbp: Check that the result will not count as having diverged. This will usually turn failures to make the ff pseudomerge into -fdiverged. Related to #903132. * git-debrebase, Dgit.pm, git: some internal reorganisation to support git-debrebase changes. * dgit-downstream-dsc(7): New manpage. Closes:#842643,#851194. * git-debrebase(5): Document best gitk options. Closes:#901927. -- Ian Jackson Thu, 12 Jul 2018 13:37:12 +0100 dgit (5.8) unstable; urgency=medium Bugfixes: * dgit, git-debrebase: Properly make patches even if an awkward .gitignore ignores the things in debian/patches. Closes:#903130. * git-debrebase status: Fix commit reporting. Closes:903131. * git-debrebase new-upstream: Add a -1 revision if the user didn't supply one. Closes:#903127. * git-debrebase: Improve grammar if one blocking snag. * dgit(1): Unscramble push[-source] descriptions. Closes:#903116. -- Ian Jackson Sun, 08 Jul 2018 11:42:41 +0100 dgit (5.7) unstable; urgency=medium New feature: * dgit checkout: new subcommand. Closes:#878443. * dgit: Check that entirely-new uploads to Debian are not source-only-uploads, as those are REJECTed. Closes:#801435. Bugfixes: * dgit(7): Mention git-debrebase and gbp pq alongside git-dpm, in the comment about handling patch stacks. * dgit update-vcs-git: Honour --package properly. * test suite: Always pass LC_COLLATE=C to sort(1). Closes:#903006. * test suite: Fix trustingpolicy-replay & dput-ng. Closes:#903007. * test suite: Test dput-ng compatibility. -- Ian Jackson Thu, 05 Jul 2018 15:02:21 +0100 dgit (5.6) unstable; urgency=medium * Merge the experimental branch containing the fianl version of the test suite gnupg workarounds. Empirically, - The tests now pass (most of the time, at least) in current Debian unstable, whereas 5.5's fail utterly. - There is still occasional lossage. So when running tests in a loop (eg to test ever commit), it is still good to set DGIT_TEST_RETRY_COUNT=3 (say). * test suite: Test that manpages format with only expected warnings. -- Ian Jackson Sun, 01 Jul 2018 00:41:20 +0100 dgit (5.5+exp9) experimental; urgency=medium * test suite: Explicitly start/stop the gnupg agent, around each call to gnupg. Apropos of #902316 (and #868550). * Separate changelog entries for the following test attempts in experimental have been elided: dgit (5.5+exp8) experimental; urgency=medium dgit (5.5+exp7) experimental; urgency=medium dgit (5.5+exp6) experimental; urgency=medium dgit (5.5+exp5) experimental; urgency=medium dgit (5.5+exp4) experimental; urgency=medium dgit (5.5+exp3) experimental; urgency=medium dgit (5.5+exp2) experimental; urgency=medium dgit (5.4+exp1) experimental; urgency=medium -- Ian Jackson Sat, 30 Jun 2018 19:03:00 +0100 dgit (5.5) unstable; urgency=medium * Add missing comma in debian/control. Closes:#902578. * dgit(1): Fix a wrong reference to \fp, which should be \fP. -- Ian Jackson Thu, 28 Jun 2018 13:25:21 +0100 dgit (5.4) unstable; urgency=medium Improvements: * dgit(1): Better description of --overwrite. Somewhat apropos of discussion in #902534. Bugfixes: * test suite: gdr-viagit, gdr-newupstream: Do not spuriously fail if gnupg not serendipitously installed. Closes:#902559. * Fix bug ref to #865444 in previous changelog entry. -- Ian Jackson Wed, 27 Jun 2018 23:13:42 +0100 dgit (5.3) unstable; urgency=medium Bugfixes: * dgit: Do not introduce duplicate origs in .changes files, eg if the .changes already has that orig. Closes:#869146. * Honour GIT_REFLOG_ACTION everywhere. Closes:#901935. * git-debrebase new-upstream: Provide better reflog entries by setting GIT_REFLOG_ACTION. Closes:#901925. Improvements: * Better message formatting when --overwrite may be needed, and a note about first dgit push in dgit(1). Closes:891031. * dgit(7): Add discussion of quilt fixup error messages, and add cross-references to dgit(1) and the actual error. Somewhat apropos of #865444. -- Ian Jackson Wed, 27 Jun 2018 14:00:31 +0100 dgit (5.2) unstable; urgency=medium dgit bugfixes: * When all Debian changes vanish with single-debian-patch, do not fail to commit the patch queue removal. Closes:#877036. * When build fails because the network is offline, mention that this is because --since-version was not specified. Closes:#883340. * When quilt fixup fails because of discrepancies, print a git diff rune which will show them. Closes:#865446. * When fetch or push wants git fetch (other than in a situation where it happes to be a noop) but --dry-run was specified, fail with an explanation, rather than looping with a false coplaint about git fetch. Closes:#871317. * --overwrite now no longer crashes if there is nothing to overwrite (eg, when used with --new). Instead, it is simply ignored, as it is ignored in situations where the push is fast forward. Closes:#863576. dgit/git-debrebase interop bugfixes: * git-debrebase interop: Add a missing debugcmd debugging print. * git-debrebase interop: Actually tolerate git-debrebase make-patches exiting with status 7. dgit vcs-git handling improvements: * Provide `update-vcs-git' subcommand, for creating and adjusting the vcs-git remote url. Useful for transition from alioth to salsa. Closes:#902006. * Print a warning to stderr on `dgit fetch sid', if your vcs-git remote url disagrees with what's in sid's .dsc. documentation: * dgit(1): Mention under `dgit build' that it uses the network. * dgit(1): Clarify that --overwrite does nothing if not needed. Closes:#863578. * dgit-user(7): Recommend sbuild-debian-developer-setup. [ Sean Whitton. ] Closes:895779. test suite: * Use nproc(1) rather than Sys::CPU. This is more portable and does not depend on libsys-cpu-perl being installed. Closes:888496. -- Ian Jackson Sun, 24 Jun 2018 23:33:28 +0100 dgit (5.1) unstable; urgency=medium dgit gitattributes handling: * Squash the working-tree-encoding attribute too. * Update an existing `dgit-defuse-attrs' macro in .git/info/attributes. * Test the working-tree-encoding attribute squashing properly. Closes:#901900. git-debrebase fixes: * new-upstream: fix (this time for sure) ff check handling of multi-piece upstreams. * Suppress gbp pq export output, except in case of error. Closes:#901809. * Manpages: Fix typos and etc. * Fix a typo in the package description. Test suite: * Triger ci.debian.net autopkgtests on: gnupg diffutils patch. (A dummy test is used to add to Testsuite-Triggers.) -- Ian Jackson Wed, 20 Jun 2018 23:20:57 +0100 dgit (5.0) unstable; urgency=low Major new facility: * git-debrebase, a new git workflow tool, in its own package. * dgit will now, when appropriate, check if it should call git-debrebase. [ Thanks to Sean Whitton for much useful input, and for dgit-maint-debrebase(7). ] dgit bugfixes: * Fix the exit status of programs in dgit.deb, to avoid the Perl misfeature which sometimes copies $! to the exit status. * When checking that the tree is clean, check the git index too. * In quilt_fixup_multipatch, work around git checkout paths not deleting files. (Hypothetical bug AFAIAA.) * Respect --quilt=nofix even if single-debian-patch. dgit minor fixes: * "confess" when we die due to a warning, rather than symply dieing. Internal changes: * Move $playground global to dgit. * Break git_get_symref and $extra_orig_namepart_re out into Dgit.pm. * Changes to support git-debrebase. -- Ian Jackson Mon, 18 Jun 2018 00:29:44 +0100 dgit (4.4) unstable; urgency=high Test suite bugfix: * Use full key hash rather than short keyid. Closes:#896653. [ report: Paul Gevers; fix: Chris Lamb ] -- Ian Jackson Mon, 23 Apr 2018 13:18:51 +0100 dgit (4.3) unstable; urgency=high Documentation improvements: * dgit(7): Discuss file executability. Closes:#886444. * dgit(7): Discuss git-unrepresentable properties of source trees. * dgit-maint-merge(7): Don't suggest using debian/source/patch-header for 1.0 source format. Closes:#887850. [Sean Whitton] Bugfixes: * dgit archive-api-query: Avoid crashing due to lack of $isuite. This breaks the infrastructure. Closes:#886592. -- Ian Jackson Thu, 25 Jan 2018 00:33:56 +0000 dgit (4.2) unstable; urgency=low * Upload dgit 4.x series to unstable. New features [Sean Whitton]: * New 'push-source' subcommand for source-only uploads. Closes:#848931 * When dgit builds a source package, such as in the 'build-source' subcommand, it now bypasses dpkg-buildpackage and invokes dpkg-source directly. This avoids a _source.buildinfo file in the .changes, which doesn't make sense when using dgit. See . Documentation improvements: * dgit(1): Add a bit more rationale (polemic, even). Closes:#874221. * Recommend mk-build-deps rather than apt-get build-dep. Suggestion from Nikolaus Rath. Closes:#863361. * dgit-maint-merge(7): many updates. [Sean Whitton] Closes:#864873,#878433. * dgit-*(7): Mention first upload trick. [Andrew Shadura, Sean Whitton] Closes:#856402. Minor fixes: * When source discrepancy involves file mode changes, report them specially. Closes:#886442. * In split brain mode, with unexpected diffs, print dgit view commitid in suggested diff rune. (HEAD is wrong.) Closes:#886443. * Fix message about missing quilt cache entry to refer to HEAD rather than tree, since dgit needs a commit. Closes:#884646. * Fix grammar error in 4.1 changelog entry. [Sean Whitton] * Remove some whitespace "errors". [Sean Whitton] Packaging: * Remove dependency alternative on realpath (package last existed in Debian wheezy). Closes:#877552. Test suite: * dpkgsourceignores-docs: Correct restriction (so autopkgtest won't try to run it). * Additional workarounds for gnupg races (#868550) including retrying each individual test once, and more sophisticated wrapper for gpg (with locking and, sometimes saves stdin). * oldnewtagalt: Fix regression when running outside git tree, introduced in 4.1. -- Ian Jackson Sun, 07 Jan 2018 21:45:29 +0000 dgit (3.13) unstable; urgency=high Important bugfixes to dgit: * Add missing `use' for Dpkg::Compression et al. Thanks to report from Didier 'OdyX' Raboud. (Closes:#879526.) Test suite: * Add missing `chiark-utils-bin' to Test-Depends. -- Ian Jackson Sun, 22 Oct 2017 17:51:12 +0100 dgit (4.1) experimental; urgency=medium Important improvements to dgit: * Support for `git worktree' worktrees. There may still be bugs; the tests for this are not very comprehensive. And worktrees on different filesystems may not work; that's a matter for the future. Closes:#868515. * Change the dpkg-source -i argument to exclude exactly the right set of things. (Sadly this is not a simple rune.) Other improvements to dgit: * New print-dpkg-source-ignores option to print the big rune you need to pass to dpkg-source to make it work exactly right. * Properly shell-quote the --git-builder argument to gbp. Documentation: * dgit-user(7): Provide information about how to use sbuild. Quite ugly due to #868527. Closes:#868526. * dgit-user(7): Fixed example rune to use curl (which prints to stdout, as the rune expects). [reported by Simon Tatham] Minor improvements: * Do not leave many clog-* files in .git/dgit. Internal changes: * using-these: New script to help with ad-hoc-testing. * Refactoring in preparation for push-source [Sean Whitton]. Test suite: * sbuild-gitish: New test case to check running sbuild from git * Work around gnupg agent connection races by having our stunt gpg wrapper simply try running gpg again, once, if it exits 2. This does not fully suppress the bug but it does significantly reduce the probability. * Other tests for new features. * Various refactoring. -- Ian Jackson Mon, 14 Aug 2017 09:31:03 +0100 dgit (4.0) experimental; urgency=low * dgit: --deliberately-not-fast-forward works properly in split view quilt modes (suppressing the pseudomerge). -- Ian Jackson Sun, 12 Feb 2017 22:22:31 +0000 dgit (3.12) unstable; urgency=high Important bugfixes to dgit: * Pass --no-renames to git diff-tree -z, avoiding potential trouble. * Defend against commit subject lines which would generate patches which look like series files, etc. Involves adding .patch to all generated patch filenames. * dgit import: Defend against broken symlinks in .. * dgit import: Right error message for missing files in .. * dgit import: Avoid making broken symlinks in .. * quilt fixup: Tolerate deletion of executable files. * quilt fixup: Tolerate symlink creation (make patches). Closes:#857382. Important bugfixes to other components: * dgit-repos-server: Do not reject commits with no author/committer email address (but still insist on date, and hence on the actual committer and author commit header fields). Peter Green reports that eg 66c65d90db100435 in upstream linux.git is such a commit (and is accepted by github). Closes:#863353. Test suite: * t-report-fail: print $PWD as part of failure message. * import-dsc: Test missing files, particularly in .. * run git gc on tests/worktrees/example_1.0.tar. * quilt fixup: Check we can delete files with funny modes * quilt fixup: Check that funny changes are represented properly -- Ian Jackson Sun, 16 Jul 2017 21:36:24 +0100 dgit (3.11~deb9u1) stretch; urgency=high * Rebuild and upload to stretch. -- Ian Jackson Tue, 11 Jul 2017 09:28:15 +0100 dgit (3.11) unstable; urgency=high Important bugfixes to dgit: * Fix rpush+buildinfo: Transfer buildinfos for signing. Closes:#867693. * Cope if the archive server sends an HTTP redirect, by passing -L to curl. Closes:#867185,#867309. * Cope with newer git which hates --local outside a tree. Closes:#865863. * rpush: Honour local git config from build host working tree. * Tolerate compressor terminating with SIGPIPE. Closes:#857694. * Honour more pre-tree git config options in our private trees sharing the user's object store. In particular, core.sharedRepository. Prompted by #867603. * Clone multisuite works even without --no-rm-on-error. Closes:#867434. * Work if "git init" does not create $GIT/info. Closes:#858054. * Actually understand foo,-security (!) Closes:#867189. Important bugfixes to other components: * dgit-badcommit-fixup: Honour core.sharedRepository. Closes:#867603. * infrastructure: Cope with new git-receive-pack which has quarantine feature: ie, work around #867702. Test suite: * Cope with git restricting ext:: protocols. * multisuite: Test clone without --rm-on-error. -- Ian Jackson Sat, 08 Jul 2017 22:40:15 +0100 dgit (3.10) unstable; urgency=medium Bugfixes: * dgit: Copy several user.* settings from main tree git local config to dgit private workarea. Closes:#853085. * dgit: Strip initial newline from Changes line from dpkg-parsechangelog so as to avoid blank line in commit messages. Closes:#853093. * dgit: Do not fail when run with detached HEAD. Closes:#853022. * dgit: Be much better about commas in maintainer changelog names. Closes:#852661. Test suite: * quilt-useremail: New test for user config copying (#853085). * lib-import-chk: Test that commits have smae authorship as appears in the changelog. (Or, at least, the same authorship set.) * import-maintmangle: New test for changelog Maintainer mangling. Documentation: * Fix typos. Closes:#853125. [Nicholas D Steeves] -- Ian Jackson Mon, 06 Feb 2017 17:49:39 +0000 dgit (3.9) unstable; urgency=medium Improvements: * dgit --overwrite: Check that the overwritten version's changelog entry is not UNRELEASED. This could easily happen if this release was being made from a git branch which predates the previous package upload. Documentation: * dgit-maint-merge(7): Get git clone url right. Closes:#852609. * dgit-maint-merge(7): Quote sample clone commands. Closes:#852615. Test suite: * overwrite-chkclog: test UNRELEASED handling. -- Ian Jackson Wed, 25 Jan 2017 16:21:53 +0000 dgit (3.8) unstable; urgency=medium Bugfixes: * Make dgit-setup-* work in default distro. Test suite: * defdistro-setup: Test that setup-* functions distro selection works. -- Ian Jackson Mon, 23 Jan 2017 16:21:30 +0000 dgit (3.7) unstable; urgency=medium Bugfixes: * Fix clone-dgit-repos-server and print-dgit-repos-server-print-url. Closes:#851906. Documentation: * dgit-maint-merge(7): Explain when workflow is unsuitable (Closes:#852090) and improve the patch-header (Closes:#851897.) Internal changes: * New %.view target: `make dgit-maint-merge.7.view' runs `man -l ...' Test suite: * defdistro-dsd-clone-drs: New test which would have detected #851906 (and hopefully #850521). -- Ian Jackson Sun, 22 Jan 2017 17:30:24 +0000 dgit (3.6) unstable; urgency=medium Bugfixes: * Actually use the url from a Dgit .dsc field naming an unknown distro. Closes:#851728. * Add dummy implementation of file_in_archive_aptget copied from file_in_archive_dummycat. Re:#851697. [ Peter Green ] Minor improvements: * Use `confess' to print a stack trace in a couple of internal error rcases. Infrastructure: * Properly honour NOCOMMITCHECK policy hook exit status. Closes:#851800. * Do not reject commits with no author/committer name (but still insist on email address and date). Peter Green reports that eg 71e128629ec786f3 in upstream xen.git is such a commit (and is accepted by github). Closes:#851716. Test suite: * downstream-gitless: Test import of .dsc from unknown distro. * downstream-gitless: Test import of .dsc with unsafe url. -- Ian Jackson Thu, 19 Jan 2017 01:15:03 +0000 dgit (3.5) unstable; urgency=medium Bugfixes: * gitattributes: Defuse gitattributes in private working area even if we don't do it in the user's tree (because of user configuration). * gitattributes: When cloning, do not print spurious warning about actually-defused gitattributes. Closes:#851624. * gitattributes: Improve comment left in .git/info/attributes. Test suite: * gitattributes: Many improvements to test case. -- Ian Jackson Tue, 17 Jan 2017 22:36:01 +0000 dgit (3.4) unstable; urgency=low Test suite: * drs-push-rejects: Set origin's url to an ad-hoc expression which produces the right ext:: rune, as dgit would. Closes:#851580. * Replace references to /home/ian in various worktrees with references to /nonexistent, to catch inadvertant accesses. -- Ian Jackson Mon, 16 Jan 2017 17:27:35 +0000 dgit (3.3) unstable; urgency=medium Behavioural changes to work around gitattributes file transformations: * Suppress file-transforming gitattributes in private work areas. * Configure suppression in user's trees in dgit clone and setup-new-tree. * Provide dgit setup-gitattributes to do this explicitly. * Documentation. Bugfixes: * dgit: Remove a leftover debugging print. * dgit: Set default dsc import distro when there is no Dgit field. * dgit: Set default dsc import distro when suppressing Dgit field. * dgit: Option parsing: Fix undefined $suite in some import-dsc. Closes:#851213. Packaging: * Remove redundant use of List::Util qw(any). Closes:#851280. * Remove redundant Recommends on libtext-iconv-perl. Test suite: * Move default dsc distro config setting to lib. We need this for the .dscs we have in tests/pkg-srcs/. * defdistro-import-dsc: Drop this test. * protocol-compat: check that we use the right distro information when importing. * Internal change: fix handling of nonempty distro= * gitattributes: New test for .gitattributes handling. -- Ian Jackson Mon, 16 Jan 2017 10:03:08 +0000 dgit (3.2) unstable; urgency=medium Bugfixes: * dgit: Do not execute END blocks in children. So far symptoms of this bug seem to be limited to duplicated error messages but I have not done a thorough analysis. Closes:#850052. * dgit-infrastructure: dgit-repos-policy-debian: Remirror a package when it becomes public (ie, make the repo available much more promptly when the package passes NEW). Closes:#849789. * dgit: Fix a warning message about ref (mainly, tag) updates. Documentation: * dgit-maint-merge(7): Use git-deborig(1). [Sean Whitton] Closes:#850953. * dgit-user(7): Fix some typos. Internals: * Fix a typo in a comment. Test suite: * infra: mirroring and policy hooks: Improve some debugging output. * infra: mirror-private: test that package becomes public. (#849789) -- Ian Jackson Thu, 12 Jan 2017 02:11:34 +0000 dgit (3.1) unstable; urgency=medium Bugfixes: * dgit import-dsc: Do not crash with undefined $isuite. Closes:#850781. * dgit build: Do not sometimes crash with undefined $isuite. * dgit: Do not nedlessly re-fetch the rewrite map. * dgit: After downloading .debian.* files, save them in `..', too (ie do this not just for .origs). * dgit: When fetching, refetch files with hash mismatches (and save them as `...,fetch'), so we can distinguish them from any built locally. Closes:#850824. Test suite: * Add test for import-dsc with default distro. (Detects #850781.) Administrivia: * Fix a dgit 3.0 changelog bullet referring to refs/dgit-fetch/DISTRO. -- Ian Jackson Tue, 10 Jan 2017 17:50:27 +0000 dgit (3.0) unstable; urgency=medium Protocol change: * Dgit: field now records the nominal distro name, and a hint for a tag and url where the git objects (including any rewrite map) can be fetched. * Use this information, where provided. Closes:#850431. Bugfixes: * dgit config handling: Honour command-line and context-provided suite and distro more reliably and consistently. * Parsing of extended Dgit fields by import-dsc was broken; and is now fixed even for more-extended ones. * dgit clone-dgit-repos-server uses readonly access. Closes:#850521. * fetch and pull ignore the changelog suite when it is UNRELEASED. Closes:#848646. * dgit-badcommit-fixup: Do not investigate symrefs. Closes:#850547. Minor new feature: * distro alias facility in config space. (Primarily for testing.) * Undocumented --config-lookup-explode= feature. (For testing.) * Provide `dgit print-dgit-repos-server-source-url'. Re:#850521. * Honour dgit-distro.*.default-suite and dgit.default.default-suite. Other improvements: * Improve debugging output a bit. * Use refs/dgit-fetch/DISTRO rather than refs/dgit-fetch/SUITE, which leads to less duplication and so less clutter. * Enforce a reasonable syntax for nominal distro names. * When generating orig+debian/patches view, copy debian/ from HEAD. This makes less noise in diffs. Closes:#850095. Docuentation [Sean Whitton and Ian Jackson]: * dgit-sponsorship(7): Use --no-dep14tag. Closes:#849105. * dgit-maint-merge(7): Use debian/source/patch-header. Closes:849120. * dgit(7): Updated `trouble' section to suggest having dpkg-source delete the autotools output (with a patch if necessary). * dgit(1): Several minor updates and fixes. Closes:#850519. Test suite: * Internal improvements. * badcommit-rewrite: Fix operation using installed version of fixup. * Arrange to pass --debug-quick-random to gpg-agent. * Strip block count out of find -ls output - it is unstable! * gbp-orig: Add a missing -m, without which git would run an editor if stdout was a tty (!) * Add t-stunt-parsechangelog to a few tests which were missing it. * Tests for the new protocol feature. * Fail tests if we look up any configuration relating to Debian. -- Ian Jackson Mon, 09 Jan 2017 16:43:10 +0000 dgit (2.16.2) unstable; urgency=low dgit-badcommit-fixup: * Fix crash when running for 2nd time in bare repo. * In --check mode, exit with status 2 if things are not fine. -- Ian Jackson Sat, 07 Jan 2017 13:31:50 +0000 dgit (2.16.1) UNRELEASED; urgency=low * dgit-badcommit-fixup: New mode --check which is readonly. -- Ian Jackson Sat, 07 Jan 2017 13:04:49 +0000 dgit (2.16) unstable; urgency=low Dealing with fallout from #849041: * Provide dgit-badcommit-fixup history-rewriting script. * New rewrite map feature, which allows dgit git server to adjust clients' interpretation of Dgit fields, so that history-rewriting is effective. (Feature is only partially implemented right now - enough to dig current Debian users out of the hole.) Re:#850431. Test suite: * New test case for history-rewriting. * Change `local foo=$(bar)' idiom to `local foo; foo=$(bar)' since the former does not trip set -e even if bar fails :-(. -- Ian Jackson Fri, 06 Jan 2017 20:46:30 +0000 dgit (2.15) UNRELEASED; urgency=high Infastructure: * Prevent introduction of new commits which lack `committer' information. Ie, prevent the reception of new commits afflicted by #849041. Existing commits are tolerated. Test suite: * Be much stricter about messages from git-fsck. -- Ian Jackson Thu, 05 Jan 2017 18:20:23 +0000 dgit (2.14) unstable; urgency=critical CRITICAL BUGFIX: * Do not generate bogus commits with --overwrite or import-dsc. Closes:#849041. Test suite: * Run a lot of git-fsck. -- Ian Jackson Wed, 04 Jan 2017 22:52:55 +0000 dgit (2.13) unstable; urgency=high Changed behaviour: * quilt fixup: Permit creation of patches which delete files, by psssing --include-removal to dpkg-source, and tolerating it when we do our quilt fixup analysis. dpkg-source has supported this since at least stretch. Closes:#848901. Error messages: * Improve "cannot represent change" message: print the git old and new modes too. Bugfix: * Import: Switch back to unpa branch on patch import iterations. In particular, do not fail utterly if dpkg-source and gbp disagree. Closes:#848843. Documentation [Sean Whitton]: * dgit-maint-gbp(7): Remove reference to closed bug. Closes:#848725. * dgit-sponsorship(7): Update in light of fixed #844129. Closes:#848789. -- Ian Jackson Wed, 21 Dec 2016 01:32:41 +0000 dgit (2.12) unstable; urgency=high Changed behaviours: * By default, generate a DEP-14 tag as well as a dgit archive/* tag, even in non-split-view quilt modes. Closes:#844129. * Version tags mangling: Protect dots, as per proposed update to DEP-14. Documentation: * dgit-maint-merge(7): Explain how to change to this workflow from an existing git workflow. [Sean Whitton] Closes:#847807. * dgit-maint-native(7): Clarify that we mean native source format. [Phil Hands] Closes:#847987. Error messages: * Slightly better message when .dsc not found. Apropos of #844128. * Give better advice if .dsc/.changes signing fails: if no changes are needed to the package, user may indeed just debsign and dput. Closes:#844131. * Produce better error reporting when absurd git wrapper fails on a patch during .dsc import. Apropos of #848391. Bugfixes: * If we cannot hardlink origs into our extraction area, use symlinks instead. Closes:#844570. * Suppress some leftover debugging output from import-dsc. Closes:#847658. * Do not fail when cloning a package containing dangling symlinks. Closes:#848512. * Do not fail to import a .dsc containing patches which patch files multiple times, due to #848611. Closes:#848391. * Do not fail to import a .dsc containing patches to .git/ (!) * infra: dgit-repos-policy-debian which broke due to recent git setting GIT_ALTERNATE_OBJECT_DIRECTORIES in the pre-receive-hook. (fixes test suite regression in stretch). Test suite: * Provide and use stunt lintian and debuild, to avoid lintian complaining about our stupid test packages. (fixes test suite regression in stretch). -- Ian Jackson Mon, 19 Dec 2016 17:35:18 +0000 dgit (2.11) unstable; urgency=medium Documentation: * dgit-user(7): Better explanation of combined suites (comma syntax). Thanks to Sean Whitton for review and suggestions. * dgit(1), dgit(7): Better reference docs for combined suites. * dgit(1): Improve formatting of rpush section. Test suite: * Replace make in Test-Depends with build-essential. Most of the tests do in fact run dpkg-buildpackage which bombs out if build-essential is missing. -- Ian Jackson Tue, 08 Nov 2016 22:41:29 +0000 dgit (2.10) unstable; urgency=medium New features: * Support the Debian *-security suites. * New comma-separated multiple-suite merging facility (readonly), so that users can easily track "jessie, or jessie-security". * dgit-user(7): Suggest `dgit clone P jessie,-security'. Bugfixes: * Cope when an orig tarball is a tarbomb. Ie, if it contains other than one single directory toplevel. Closes:#843422. * Actually honour the branch name, if we are on dgit branch, to specify the suite, as documented in the manpage. * When cloning a distro which has no git server, correctly leave the user on the local dgit branch, not on `master'. * Fix an unconditional print that was supposed to be a printdebug: origs .orig.tar.gz f.same=1 #f._differ=-1 * Print a slightly better message if .git found in orig tarball(s). Test suite: * Test suite: Add fakeroot and make to Test-Depends. These aren't necessarily pulled in by anything else. (dpkg-dev Recommends build-essential. But we don't actually need build-essential.) -- Ian Jackson Tue, 08 Nov 2016 01:08:51 +0000 dgit (2.9) unstable; urgency=medium New features: * During push, automatically calculate which .origs are required, so user never needs [--ch:]-sa or [--ch:]-sd. Closes:#829116. * New import-dsc feature. * New option --dgit-view-save= for split view quilt modes. In particular, means that the output of a split view quilt-fixup is left somewhere useful. * dgit clone: Set timestamps in cloned tree to a single unified time. This makes it less likely that the user will trip over any timestamp-dependent FTBFS bugs (eg #842452). * Support dgit --delayed= push (with a warning in the manpage about possible skew). * dgit gbp-build will arrange to let gbp buildpackage generate .orig tarballs if it seems applicable. Closes:#841094. Documentation improvements: * dgit-*(7). Many new tutorial manpages, several written and many improved by Sean Whitton. * dgit(7): Substantial updates, including documenting split view. * dgit(1): Better cross-references. * dgit(1): Remove obsolete workflow information. * dgit(1): Improved BUGS section. * Fix changelog entry for SIGPIPE to correctly mention Closes:#841090. Bugfixes: * Split brain mode: Fix --new. Closes:#842577. * Properly look for .origs etc. in .., fetching them less often. Closes:#842386. * Reject `dgit pull' in split view quilt modes, to avoid creating unfortunate wreckage on non-dgit-view branches. Closes:#842608. * Cope when cloning suite which doesn't receive uploads, like testing. Closes:#842621. * Properly fetch all archive dgit view tags, as we intended. * Actually provide a -p (--package=) option (!) Test suite fixes: * Test suite: Explicitly configure user.name and user.email, so that tests work when environment doesn't have defaults. Closes:#842279 (I hope). -- Ian Jackson Mon, 31 Oct 2016 12:47:18 +0000 dgit (2.8) unstable; urgency=medium * When in split build mode for `gbp-build' or `build', run mergechanges as is required. Closes:#841990. * Test suite: build-mode-*: Check that right .changes comes out (detects #841990). * Defend against debian/patches/series being an unusual object, in case dpkg-source doesn't, in absurd git-apply fallback. -- Ian Jackson Tue, 25 Oct 2016 17:29:23 +0100 dgit (2.7) unstable; urgency=medium Absurd bugfix for serious bug: * Work around `git-apply' problems (eg #841865, #829067) exposed by `gbp pq import' (#841866) by sometimes falling back to an emulation of git-apply in terms of dpkg-source --before-build. Closes:#841867. Minor changes: * dgit(1): Reorder the options, moving more important ones earlier. * dgit(1): Some more info about --deliberately. * Provide various --force-something options. Please don't use them. -- Ian Jackson Mon, 24 Oct 2016 02:37:28 +0100 dgit (2.6) unstable; urgency=medium Fixes to HTTP handling: * Check for non-2xx HTTP status codes from ftpmaster api server. * Always honour --curl= and --curl:. -- Ian Jackson Sun, 23 Oct 2016 14:57:22 +0100 dgit (2.5) unstable; urgency=low Substantive changes: * Do not crash in split brain quilt modes when the two brains are actually identical. (Eg --quilt=gbp with no patches.) Closes:#841770. * Switch to new archive/ tag format by default, even in non-split-brain mode. * Provide --gbp and --dpm as aliases for --quilt=gbp and --quilt=dpm. Documentation: * dgit-maint-merge(7): New tutorial manpage from Sean Whitton. Test suite: * Introduce setup/gnupg, to help work around gnupg2 bug #841143 and improve performance by amortising gnupg migration cost. * Various bugfixes. -- Ian Jackson Sun, 23 Oct 2016 13:20:23 +0100 dgit (2.4) unstable; urgency=low Bugfixes: * split brain cache: Fix a wrong implicit reference to $_. Closes:#841383. * split brain cache: Make sure to write reflog entries for cache updates even if the eventual tree (and therefore commit) is the same. Otherwise, after updating dgit, the cache might have the right answer but not be refreshed even by a build. * dgit gbp-build: No longer invent a --git-debian-branch option. Usually the user is a maintainer using split brain, and we should rely on their own gbp configuration to specify the right check. Closes:#841100. Minor docs fix: * dgit(1): Document which --ch: options are a good idea. -- Ian Jackson Thu, 20 Oct 2016 16:31:54 +0100 dgit (2.3) unstable; urgency=low * With --overwrite, do not check all sorts of tags (which may not exist, or might contain wrong things). Closes:#841101. * When generating pseudomerge in quilt split brain mode due to --overwrite, actually include the version number in the commit message. -- Ian Jackson Tue, 18 Oct 2016 01:58:05 +0100 dgit (2.2) unstable; urgency=low * Fix config relating to Debian to actually make split brain mode work. Closes:#841085. * Detect SIGPIPE (and SIGCHLD) being blocked or ignored. Closes:#841090. -- Ian Jackson Mon, 17 Oct 2016 17:31:18 +0100 dgit (2.1) unstable; urgency=low * Do not crash due in clone to failure to handle dpkg-parsechangelog SIGPIPE. Closes:#840989. Avoids: dgit: failed command: dpkg-parsechangelog --format rfc822 --all dgit: subprocess died due to fatal signal PIPE * git- prefixes: Fix some occurrences of `git-foo' in infrastructure, messages, and test suite. Filter out .../git-core from PATH in test suite so that we catch future occurrences. -- Ian Jackson Sun, 16 Oct 2016 19:05:14 +0100 dgit (2.0) unstable; urgency=low Incompatible change: * dgit sbuild: does not pass -A to sbuild. Consequently the default build is now simply sbuild's default. With older sbuilds it was possible to override dgit's -A by passing another option. But this has been changed recently and now this default setting is very awkward to change for the dgit user. * dgit gbp-build: Make --quilt=gbp the default. (See below.) * New tag format (for dgit view) archive/debian/VERSION. Major new feature: * --quilt=gbp, --quilt=dpm, --quilt=unpacked: Introduce facility for split view (dgit/mainiainer view), to improve compatibility with some workflow tools. New checks and improved behaviours in dgit: * When running dpkg-buildpackage, cope if user specified -g or -G. * dgit sbuild: check that the set of .changes files found is as we expect, before calling mergechanges. Re:#800060. * dgit sbuild: Rename the used-up .changes files to `.inmulti' to avoid accidental use of the wrong one (by software, or by users). * dgit sbuild: Check that the binary .changes file doesn't contain a .dsc. * Introduce --rm-old-changes to delete previous builds' changes files. * Remove any pre-existing _source.changes file before building source, as a safety check. * No longer tolerate a multitude of .changes files when doing push. Instead, insist on a single one. Closes:#800110. * dgit sbuild no longer deletes extranious .changes files; instead we rely on --rm-old-changes, or failing that, fail early. * When doing quilt linearisation, treat upstream .gitignores not in the toplevel the same way we treat ones in the toplevel. * When automatically generating quilt patch, honour GIT_COMMITTER_DATE for filename creation (makes filename deterministic in test suite). * New --overwrite option, replaces need to for user to use git merge -s ours. Closes:#838718. * When generating quilt patches from git commits, make patches that look quite like git-format-patch output (rather than strange things based on an obselete interpretation of DEP-3). * When generating quilt patches from git commits, honour (and strip) any Gbp-Pq headers (that we understand). * Several dgit-generated commits now have slightly better annotations from dgit about what it was doing. * Before committing to push, check that .dsc and .changes correspond. Closes:#800060. * Better error message if non-split-brain patch stack no longer applies (due to new upstream version, or user messing with it). Closes:#833025. * Better error message if HEAD contains changes unrepresentable by `3.0 (quilt)'. Closes:#834618. * Much better error message when HEAD and .dsc do not match. Closes:#809516. Infrastructure: * dgit-repos-policy-debian: Better error handling. * dgit-repos-policy-debian.: fix git-cat-file-handling with multiple taints in db (!). * dgit-infrastructure has, and uses, its own copies of the perl modules. This avoids introducing a versioned dependency between dgit and dgit-infrastructure (and also makes it easier to test cross-version compatibility). Documentation: * Document the dgit-distro.DISTRO.quilt-mode config setting. * Clarify the --clean= options' documentation. Closes:#800054. * Discourage use of the --PROGRAM:OPTION escape hatch. (Apropos of various bug reports including #800060 and #833025.) * Document the expected form of HEAD for each --quilt= mode. Bugfixes: * When cleaning up after failed clone, stat the to-be-cleaned-up directory before running rmtree on it. Closes:#796773. * Do not call "warn" on failure of cleanup handler in END block (since warn has been made fatal and aborts the cleanup chain). * Print better error message (with `fail' rather than `die') if `dgit clone' cannot create the destination directory. * Properly substitute $changesfile in one of the `You can retry' messages. Closes:#800078. * Pass --ch:* and -v options to dpkg-buildpackage when building source. Fixes bad Perl poetry syntax. Closes:#829121. * When synthesing a commit from a .dsc from the archive, stop internal git reset from printing a confusing message about HEAD. * Turn off git gc in the private working areas. * Do not fail to do some important quilt processing in some --quilt modes. * Fix two calls to chdir without proper error checking. * Fix a couple of bugs in error reporting. * Fix several bugs in .orig detection/recognition. * Tidy up refs/dgit-fetch/ after dgit fetch (if successful). * Fix handling of in-archive copies. * Don't break if user has push.followTags=true. Closes:#827878. * Arrange for the special dgit remote to be skipped by git fetch --all etc. And no longer configure a fetch spec, since it won't work anyway. Closes:#827892. * Allow local git config options to override user-global ones, as is proper. Closes:#835858. * When generating patch filenames from titles, first transliterate them (lossily) to ascii. Closes:#834807. Test suite: * When sbuild fails, do not crash due to sed not finding the log file. Instead, simply tolerate the absence of the log file. * Put --no-arch-all in build-modes-sbuild act, not only its real_act. Cosmetic change only. * Set GIT_COMMITTER_DATE and GIT_AUTHOR_DATE and increment them explicitly in drs-push-rejects test. This avoids date dependencies which can cause that test to fail on fast computers. * Remove some spurios .debs from the example_1.0.tar. * Increase sqlite_busy_timeout in debpolicy-dbretry, because old zealot is very slow and we need to give the other processes time to rollback and release the lock. * Test quilt single-debian-patch. * Provide `tartree-edit gitfetchinfo' etc. to help with comparing different test case git working tree tarballs. * Test dgit-repos-policy-debian with multiple (identical, as it happens) existing taints. * Provide better log output for certain failures. * Many new tests (especially for new functionality). * Add missing debhelper (>=8) to test suite's global Depends. * tstunt arrangements: Fix mishandling of PERLLIB, etc. * tstunt-parsechangelog: Produce Timestamp field (like official one does, now). * Do not fail when git requires --allow-unrelated-histories. -- Ian Jackson Sun, 16 Oct 2016 12:12:50 +0100 dgit (1.4) unstable; urgency=high Bugfixes: * Unbreak --dry-run (`exiting subroutine via next', broken in ac221d67, bug released in 0.22). * When running git-add in commit-quilty-patch, properly escape filenames (which git-add treats as glob patterns). * When running git-add in commit-quilty-patch, use -f and sometimes -A, so as to avoid being broken by any .gitignore, etc. * When quilt linearisation fails, print the right information in the error message. (This has been broken forever.) * Cope properly with `3.0 (quilt)' with single-debian-patch. Closes:#796016. (Still does not work with wheezy's dpkg-source, so no test case yet.) * With dgit sbuild, pass our -d before the user's arguments, so that the user can override it. Closes:#796019. New checks and improved behaviours: * Detect and reject git trees containing debian/source/local-options or debian/source/local-patch-header. * In --dry-run mode, _do_ actually run dpkg-source --commit so that we actually do construct the quilt fixup commit; instead, honour --dry-run by avoiding pulling it back to your HEAD. * quilt-fixup checks that the git tree is clean, as for build-prep. Documentation: * In dgit(7), discuss binaries and documentation present in upstream but removed by rules clean. Test suite: * Run quilt-fixup with -wgf in distropatches-reject, so that we don't need build-depends. -- Ian Jackson Sat, 22 Aug 2015 15:31:02 +0100 dgit (1.3) unstable; urgency=high Important bugfixes: * In option parser test `@ARGV' not `length @ARGV'. Closes:#795710. * Properly quote package name when constructing regexp in complete_file_from_dsc. Closes:#795736. Also, grep the code for likely similar problems elsewhere and improve a (harmless) instance in dgit-repos-server. Other improvements: * If a .orig in .. is a symlink, hardlink the link target into our private unpack directory, rather than the link itself (since latter won't work if the symlink is relative). Closes:#795665. * Test suite: Fix t-restriction-x-dgit-schroot-build in non-adt mode. * Infrastructure: Improve an error message in dgit-repos-policy-debian. -- Ian Jackson Sun, 16 Aug 2015 17:51:02 +0100 dgit (1.2) unstable; urgency=high Improvements: * Honour *.clean-mode configuration setting for --clean= mode. * No longer require option values to be cuddled: support `--opt val' and `-o val'. Closes:#763332. Manpages: * Fix typos. * Document that tags are in DEP-14 format, and that they are used for authenticating pushes. * Correct cross-reference to point to browse.d.d.o. * Move dgit.default.* to main CONFIGURATION section. Administrivia: * Add missing close of #793060 to changelog for version 1.1. -- Ian Jackson Fri, 14 Aug 2015 18:27:20 +0100 dgit (1.1) unstable; urgency=medium Bugfixes: * When source package contains things called .git (even files, and even in subdirectories), remove them. Closes:#793671. * Work around curl -sS -I printing `HTTP/1.0 200 Connection established' before the actual header, so dgit works with https_proxy set (!) * --new is needed for read access to packages in NEW, too. Document this, and make it work properly. * Work around #793471 (madness with $SIG{__WARN__} and Perl's system builtin): move $SIG{} setting into setup_sigwarn in Dgit.pm, and check getppid. * When invoking git-buildpackage via dgit gbp-build, consider our command line arguments when massaging the dpkg-buildpackage arguments, so that we don't end up giving dpkg-buildpackage contradictory instructions. * Cope with new git-buildpackage which provides gbp, rather than the eponymous command, on PATH. Configurability: * Honour dgit-distros.DISTRO.cmd-CMD and .opts-CMD. Closes:#793427. * Make configuration able to prevent dpkg-mergechangelogs setup. * Provide dgit setup-new-tree (like dpkg-setup-mergechangelogs but only does it if not disabled in config). * Set up git user.email and user.name from distro access config or DEBEMAIL/DEBFULLNAME. Closes:#793410. * When key to use not specified any other way, use the debian/changelog trailer line. Closes:#793423. * Honour --git= (mostly). Documentation: * Fix some manpage typos. [ Richard Hartmann ] * Manpage said that --clean=check was -wn but that is --clean=none; correctly document that --clean=check is actually -wc. * Document that up to -DDDD (not just -DD) is meaningfully different. * Document that -cname=value applies only for this run. * Improve manpage comment about defining a new distro. * Document that --quilt=linear is the default for Debian. * Fix a formatting problem in --build-products-dir= doc. * In manpage, do not seem to imply that NMU should be of only one new commit. * Qualify to Debian the manpage comment about how to do NMU. * In discussion on how to start using dgit when already using git, do not imply/assume that existing git history will have identical trees to dgit history. * Remove stray sentence in config section of manpage. * Manpage: Clarify wording of readonly config. * Manpage: Better cross-references for -k and keyid. * dgit(7): No longer say that dgit-repos lives on Alioth. Improvements: * Introduce more sophisticated protocol negotiation for rpush. * Do not quote `:' in shellquote. * Print a supplementary message when push fails, giving advice to the user about how to retry. Closes:#793144. * Slurp in entire git config, for better performance. * Rename `git-build' operation to `gbp-build' to make it clearer what it's for. Keep the old name as an alias. * Show `dgit sbuild' in usage message. * When we are using dpkg-buildpackage to clean before using it to also do the build, let it do its cleaning thing as part of its run, rather than running it twice. When we are _not_ supposed to be using dpkg-buildpackage to clean, but we are running it to do the build, pass -nc. Closes:#793060. * Also suppress spurious runs of the clean target when building using git-buildpackage. * When exec fails, always print the program name in the error message. Infrastructure: * Infrastructure: Get mirroring right for fresh repos of existing packages (!) Packaging, cleanups, debugging and test suite: * Fix Vcs-Git and Vcs-Browse to refer to chiark. (The dgit-repos on alioth aren't suitable right now because the master there can currently only be updated with an actual upload, ie dgit push.) * Make warnings fatal in dpkg-repos-admin-debian, dgit-ssh-dispatch (using setup_sigwarn). * tstunt/dpkg-parsechangelog: Make warnings fatal (directly). * tstunt/dpkg-parsechangelog: Do not complain if PERLLIB is empty. * Test suite: Honour DGIT_TEST_DEBUG=''. * With -DDDD, print out all gitcfg references (copious!) * Fix a debug message in the obsolete sshpsql archive access driver. * Test suite: More automatic enumeration of tests. * Test suite: Provide tests which check that all our various build operations run the right targets as expected (ie, that we are massaging the arguments to dpkg-buildpackage, and suppressing our clean target, etc., correctly). -- Ian Jackson Mon, 27 Jul 2015 16:34:31 +0100 dgit (1.0) unstable; urgency=medium Improvements: * Switch to new production git repositories for reading. (this can no longer divert to alioth). Public readonly access now works. Closes:#791447. * Memoise git config lookups (big speedup!) * Provide -wdd aka --clean=dpkg-source-d. Closes:#792433. * Provide -wc aka --clean=check. Manpage updates: * Remove some obsolete caveats from BUGS. * Reorganise and complete the configuration section. * Remove obselete comment about DMs not being able to push. We have, for now, a way to add keys manually. Closes:#720173. Access machinery: * Remove configuration relating to alioth. * Provide for different access mechanisms when pushing. * Provide for configurable git url suffix. * Allow git-url to be '' to force fallback to git-proto etc. * Provide for checking git presence via http[s]. * Do some quoting on debug output (needed if the server might not be trustworthy and might send us bad stuff). * Talk to push.dgit.debian.org, rather than the .debian.net alias. Infrastructure: * Provide for mirroring git updates to a different server. * Provide cgit-regen-config command for cgi-grnet-01. * Make dgit-ssh-dispatch not spew (harmless) warnings if caller tries for a shell session (ie SSH_ORIGINAL_COMMAND not set). Cleanups: * Remove an obsolete comment from the code. * Improve an error message from dgit-repos-policy-debian. * Test suite: Break out t-make-hook-link. * Fix a manpage typo. -- Ian Jackson Sun, 19 Jul 2015 22:15:53 +0100 dgit (0.30) unstable; urgency=high INCOMPATIBLE CHANGES: * Client uses new infrastructure: - Check for new dgit git service on dgit-git.debian.net (ie gideon.debian.org), with transition plan based on diversion feature. Closes:#720172. - Old versions of dgit will stop working when the server-side handle is pulled. * dgit git trees no longer contain .pc for format `3.0 (quilt)' source packages. Closes:#764606. - It is deleted whenever we find it. - Older versions of dgit will choke on trees without .pc. - (When doing quilt fixup, we recreate a suitable .pc in a temporary directory so that we can do dpkg-source --comit.) * All users are urged to upgrade ASAP. Other significant improvements: * When generating quilt patches, try to linearise the git history into a series of individual new patches for debian/patches. Closes:#770710. * When receiving a push with dgit-repos-server, update the server's refs/heads/master if we are pushing to what the distro regards as a relevant branch, and the push would ff master. Closes:#728209. * For non-Debian distros, distro version release tags contain distro name a la DEP-14 (rather than hardcoding `debian/'). * Set up a merge driver for debian/changelog. Closes:#769291. * --clean=git and --clean=none cause dgit to pass -nc to dpkg-buildpackage, suppressing calls to the package's clean target. Also, expand the documentation in this area slightly. Closes:#768590. * Provide --clean=git-ff (aka -wgf), which is useful for dgit itself (!) Minor improvements: * Reduce some noise output and improve the clarity of some messages. * Be more careful about tag updates during fetch: only update tags referring to uploads to distro we are trying to fetch from. * Change realpath dependency to `coreutils (>= 8.23-1~) | realpath' (Closes:#786955.) Bugfixes: * Fix handling of rmadison-based and gitless distros (e.g., Ubuntu). * Add missing `gpgv' to test dependencies in debian/tests/control. * Strip `-b ' from contents of Vcs-Git header, when setting up the vcs-git remote. Closes:#759374. * Do not offer wget as an alternative dependency to curl. We always unconditionally invoke curl and have no code to use wget. Closes:#760805. * Complain about lack of cuddled values for value-taking single-letter options, rather than thinking the user meat an empty value. Closes:#763332. * Reject (rather than ignoring) further options merged witth -wn, -wg, -wd. * Fix inaccurate error message when archive's git hash is not an ancestor of git repo's git hash. * Detect and bomb out on vendor-specific `3.0 (quilt)' patch series. * Fix the rules clean target to remove test results and output. Documentation improvements: * Break out dgit(7) from dgit(1). * Provide example workflow for dgit rpush. Closes:#763334. (Also part of the fix for #768470.) * Document that dgit repos are cloneable with git, in dgit(1) section MODEL. [Andreas Barth.] Closes:#768470. * Better documentation for quilt series handling. * Document under `dgit push' that it is best to build with dgit too. Closes:#763333. * Other minor clarifications and improvements. Behind-the-scenes work: * Use ftpmasterapi archive query method. (Closes:#727702. Also partly obsoletes #768470.) * New dgit-infrastructure binary package containing dgit-repos-server et al. Client users probably don't want this stuff. Also, it provides a convenient way to publish the dependencies. * Many many bugfixes to the server side (dpkg-repos-server et al.). * Add :..; prefix to ssh remote commands, for the benefit of future forced command wrappers. Implicitly, this defines a new ssh-based command protocol. Closes:#720174, #720175. * Distro access configuration handling changes (should not be noticeable to most users). * In places, significant restructuring or tidying up. * Turn all perl warnings into errors using $SIG{__WARN__}. -- Ian Jackson Sun, 05 Jul 2015 01:34:55 +0100 dgit (0.22.1) unstable; urgency=high * Use Dpkg::Version::version_compare everywhere, not Dpkg::Version::version_compare_string. The latter is entirely wrong, meaning that dgit would get many version comparisons wrong. Closes:#768038. -- Ian Jackson Tue, 04 Nov 2014 12:46:40 +0000 dgit (0.22) unstable; urgency=medium Bugfixes: * Clone removes destination directory on error. Closes:#736153. * Work with wheezy-backports (and keep squeeze-backports working too). Closes:#736524. * Work in read-only no-git-history mode with Ubuntu. You still have to pass -dubuntu. Closes:#751781. * Use mirror.ftp-master.debian.org DNS alias rather than coccia. Closes:#752602. * Check hashes of files ourselves rather than running dget to re-retreive the .dsc. * Check SHA-256 of .dsc against hash from archive_query (ie projectb) rather than letting dpkg-source do a signature verification. Closes:#737619. Closes:#737625. * Treat .dsc as bytes, just like everything else, rather than letting HTTP::Message convert it to a Perl unicode string which the rest of the program mishandles. Closes:#738536. Minor improvements: * Include canonicalised suite name in signed tag message. * Mention cross-version dgit rpush incompatibility in manpage. * Check for rpush protocol version incompatibility and crash early if incompatible. * New script tests/using-intree for running tests on the source tree. * Do not spew diff output to terminal (by default). Print sensible message instead. Closes:#736526. * Print better message for lack of configuration settings. * Document that dgit rpush needs gnupg and your public key on the build host. Closes:#736529. * Fix a manpage reference to `--dget=' where `--dgit=' was intended. * Provide t-archive-process-incoming and t-archive-query subroutines for regression test scripts to use. * Print better message for unknown operations. * Provide `dgit clean'. Closes:#736527. * When cloning, set up a remote `vcs-git' from the package's Vcs-Git (and put an appropriate caveat in the manpage). Closes:#740687. Closes:#740721. * Improve error message for .dsc having already been signed (iff using libdpkg-perl 1.17.x). Closes:#731635. * Improve error message for .dsc parsing failures more generally. * Better reporting of child exit statuses (esp. deaths due to signals). * In rpush, on protocol error talking to build host, check if the subprocess died and report differently if so. Closes:#736528. * Fixed a manpage typo. * When tests invoke dgit, use --dgit= so that subprocesses use our dgit rather than system one. * Add a test for dgit rpush. Major new feature, currently stalled awaiting server infrastructure: * dgit-repos-server: New program for receiving signed-tag-based pushes. Corresponding support in dgit itself, but not currently used by default for any distro. * Bring forward push of the version tag ref so it happens alongside the push of the suite branch ref. * New git-check and git-create methods "true" which are no-ops. * test-dummy-drs `distro': for testing dgit and dgit-repos-server. -- Ian Jackson Tue, 19 Aug 2014 11:24:02 +0100 dgit (0.21) unstable; urgency=medium Bugfixes relating to unclean trees: * Run a clean (of the specified type) before any build operation; do this with `dpkg-buildpackage -T' clean if necessary, so -wd now works with all the building methods. * Refuse to do quilt fixup (explicitly requested, or as a result of build) if the tree contains ignored files. Closes:#731632. Error message improvements: * Use failedcmd to report errors when ssh psql fails. Closes:#734281. * failedcmd prints $us, not $_[0] - ie, dgit doesn't pretend, in the error message, to be its child. * Do not report the (irrelevant) $? when madison parsing fails. Better workflow flexibility: * Provide --build-products-dir option (and corresponding semantics for -C) to specify where to find the files to upload. Closes:#731633. Support for Debian backports suites: * New quirks infrastructure in configuration and internals, for suites (or perhaps distros) which are a bit like others. * Use correct default archive location. * Compute "-v" option default value correctly. * Closes:#733954. Packaging improvement: * Add `Testsuite: autopkgtest' to debian/control. (This will only have the right effect with recent enought dpkg; it will generate a harmless warning with earlier versions of dpkg.) -- Ian Jackson Sun, 19 Jan 2014 02:14:25 +0000 dgit (0.20) unstable; urgency=high * Use newest (not oldest) version currently in suite when calculating what value to use for -v by default. Closes:#732781. -- Ian Jackson Sat, 21 Dec 2013 19:13:56 +0000 dgit (0.19) unstable; urgency=low Testing facilities: * Provide "test-dummy" distro with "dummycat" access method. * Provide a selection of autopkgtest (DEP-8) tests. -- Ian Jackson Wed, 27 Nov 2013 18:27:17 +0000 dgit (0.18.2) unstable; urgency=high Bump archive upload urgency to high. -- Ian Jackson Sun, 24 Nov 2013 17:42:57 +0000 dgit (0.18.1) unstable; urgency=low Bugfixes: * sshpsql archive query method passes LANG=C. Closes:#729788. * Subcommand program or argument options containing hyphens work. (Eg, --dpkg-buildpackage:blah was previously incorrectly rejected.) Packaging fixes: * Depend on dput. * Depend on curl | wget, as dget needs one of those. (The dput package, which contains dget, doesn't require them because dput itself works without.) -- Ian Jackson Sun, 24 Nov 2013 17:36:03 +0000 dgit (0.18) unstable; urgency=low Major new feature: * Remote push (dgit rpush), a la debsign -r. Closes:#721185. Improved behaviours: * dgit build, by default, uses the archive to find out what the correct -v option is to pass to dpkg-genchanges. Closes:#727200. * Abolish the sshdakls method and replace it with sshpsql: that is, ssh (to coccia, by default) and run sql commands on the ftpmaster database. This is faster and has fewer bugs but is vulnerable to db schema changes. Closes:#726955. Closes:#720170. Closes:#720176. * When generating git tags, quote the (uncanonicalised) changelog's Distribution field as the suite. * Command execution reports from --dry-run go to stderr. Other new features: * Support --gpg=... to provide a replacement command for gpg. * Support --ssh=... and --ssh:... to affect how we run ssh. Bugfixes: * When using sbuild, pass the arguments to mergechanges in the right order so that we use the correct Description (the _source one, not the one from sbuild which didn't get e.g. -v). * push actually takes an optional suite, like it says in the synopsis. Closes:#727125. * Fix dgit --damp-run sbuild to actually work. * Fix the "shellquote" internal subroutine. The bugs in it ought not to have caused any real trouble in previous versions of dgit. Documentation and message fixes: * manpage: Clarify comments about orig tarballs. Closes: #723605. * manpage: Remove comment in BUGS about lack of policy docs for Dgit field, which is specified now. Closes:#720201. * manpage: Make discussion of --existing-package less scary. The default archive access method no longer needs it. Closes:#720171. * Mention "git merge", not "git-merge", in helpful message. Closes:#725632. Internal and debugging improvements: * Report chdir actions in debugging output. * Improvements to implementation of --dry-run and --damp-run. * Some code motion and cleanups. Note: changelog entries for the following versions, which were uploaded to Debian experimental, have been collapsed into this single entry: 0.18~experimental2 0.18~experimental1 0.17~experimental7 0.17~experimental6 0.17~experimental5 0.17~experimental4 0.17~experimental3 0.17~experimental2 0.17~experimental1 0.16~experimental3 0.16~experimental2 0.16~experimental1 We do describe here all the changes since 0.17. -- Ian Jackson Sat, 09 Nov 2013 10:12:13 +0000 dgit (0.17) unstable; urgency=high * Do not grobble around in .git/refs/; instead, use git-show-ref. This avoids breaking when git makes packed refs. Closes:728893. * Clarify error message for missing refs/remotes/dgit/dgit/. -- Ian Jackson Thu, 07 Nov 2013 00:02:47 +0000 dgit (0.16) unstable; urgency=high * Format `(3.0) quilt' fixup does not mind extraneous other files in the build tree (e.g., build products and logs). Closes: #727053. * Set autoflush on stdout, to get better ordering of debugging etc. output when stdout is redirected. * New --damp-run mode, for more convenient and fuller testing etc. -- Ian Jackson Tue, 22 Oct 2013 13:06:54 +0100 dgit (0.15) unstable; urgency=low * Better handling of packages pushed using dgit and stuck in NEW. (And, use of `--new' is not needed with fetch.) Closes: #722199. * More comprehensive warnings in many cases of archive skew. * Implement `dgit help' as well as `--help'. Closes: #721661. * Provide `dgit version' and `--version'. Closes: #721654. -- Ian Jackson Thu, 12 Sep 2013 00:14:05 +0100 dgit (0.14) unstable; urgency=low * Include package name in tag message. * Create directory .git/dgit when needed during build. Closes: #721428. * Add Vcs-Git and Vcs-Browser [Richard Hartmann]. Closes: #721404. These fields refer to the development branch, "master", on alioth, not to the dgit suite refs (which are not accessible to git clone). -- Ian Jackson Sun, 01 Sep 2013 18:30:44 +0100 dgit (0.13) unstable; urgency=low * Reuse already-downloaded .orig files after checking their hashes. Closes: #720526. (This introduces a dependency on Digest::SHA.) * Do not always pointlessly fetch the .dsc twice. (That code was erroneously duplicated during editing, apparently.) * Remove DGET_UNPACK from the environment in case the user has set it. * Remove scary warning from Description. * When uploading to Debian, tell dput to upload to "ftp-master". This avoids problems with derivatives whose dput has a different default. Closes: #720958. * Fix some bugs in dgit fetch --dry-run which made dgit push --dry-run often not work at all. * Update the local tracking branch for the dgit remote, when pushing. Closes: #720956. * Fix references in manpage to old Vcs-Dgit-Master field name. * Reorganise manpage sections to be in a more conventional order. * New manpage section on FILES IN THE SOURCE PACKAGE BUT NOT IN GIT. Closes: #721186. -- Ian Jackson Thu, 29 Aug 2013 00:27:23 +0100 dgit (0.12) unstable; urgency=low * Cope with packages with epoch. Closes: #720897. * Improve error message for non-fast-forward push. Closes: #720896. * New --ignore-dirty option to skip noncritical check. Closes: #720895. * New --no-quilt-fixup option to suppress quilt fixup. RTFM. * Add Closes line for #720595 to changelog entry for 0.11. -- Ian Jackson Mon, 26 Aug 2013 16:50:39 +0100 dgit (0.11) unstable; urgency=low * Location of dgit-repos is now git.debian.org:/git/dgit-repos/repos. Closes: #720525. The rename on the server side will break older versions of dgit. * Fix bug which would make quilt patch fixup fail if git status produced "M" lines. * Autogenerated quilt patch fixup patch Description contains several recent git commits, rather than implying that the patch corresponds exactly to the top git commit. * Use "ftp.debian.org" not "http.debian.net" as the default Debian archive. (http.debian.net tends to defeat certain kinds of cacheing, and can also have more skew.) * dgit build uses dpkg-buildpackage; there is a dgit git-build for using git-buildpackage. Closes: #720595. * Better error message for use of UNRELEASED suite. Closes: #720523. * Do not canonicalise suite more than once. Related to: #720526. * Fix a badly open-coded copy of check_not_dirty. Closes: #720524. * Fix some bugs in building (eg build-source would fail to do the quilt fixup; the --clean check in build was wrong). * Add missing dependency on realpath. * git-build (git-buildpackage wrapper) does not bother canonicalising the suite if --git-ignore-branch is used. -- Ian Jackson Sun, 25 Aug 2013 17:00:43 +0100 dgit (0.10) unstable; urgency=low * Create .pc/applied-patches - do not empty it (!) -- Ian Jackson Sun, 25 Aug 2013 00:51:50 +0100 dgit (0.9) unstable; urgency=low * New cleaning arrangements. * More comprehensive workaround for `3.0 (quilt)'. * In push, double-check the .changes against the changelog. * Better error when source package contains .git. Closes: #720555. * Change our .dsc field name to `Dgit'. Relevant to #720201. * Fix bug handling our synthetic merges when we see them in the remote suite branch. * `3.0 (quilt)' fixup creates .pc/applied-patches since modern dpkg-source creates it even though old ones didn't always. -- Ian Jackson Sat, 24 Aug 2013 18:49:02 +0100 dgit (0.8) unstable; urgency=low * Fix comparison of archive's .dsc's hash and git branch head to DTRT. * When creating repos in dgit-repos (using the ssh-cmd method), copy _template rather than using mkdir and git init. Closes: #720522. * In push, do git fetch as well as archive fetch, or archive fetch can fail. -- Ian Jackson Fri, 23 Aug 2013 12:24:09 +0100 dgit (0.7) unstable; urgency=low * If dak ls, or rmadison, reports multiple versions, look for them all, and pick the newest .dsc that doesn't give 404. * Manpage formatting fix. * Name the local remote tracking branch remotes/dgit/dgit/ so that we avoid a warning from git about ambiguous branch names. -- Ian Jackson Thu, 22 Aug 2013 18:29:10 +0100 dgit (0.6) unstable; urgency=low * Allow fetching when archive has out-of-date git hash in .dsc. Closes: #720490. -- Ian Jackson Thu, 22 Aug 2013 16:02:10 +0100 dgit (0.5) unstable; urgency=low * Upload to unstable, as this version mostly works. (All the RC bugs of which I'm aware are now properly represented in the BTS.) -- Ian Jackson Thu, 22 Aug 2013 15:38:00 +0100 dgit (0.4~pre2) experimental; urgency=low * Mangle debian/ tags the way git-buildpackage does (as of git-buildpackage 0.5.5, 3c6bbd0f4992f8da). * Support dgit-distro..keyid config option. * Revert change to ssh to alioth CNAME, as the recommended CNAME is to something with no write access to the fs and the new CNAME has not yet been set up. This reintroduces #720172 :-/. -- Ian Jackson Thu, 22 Aug 2013 15:31:17 +0100 dgit (0.4~pre1) experimental; urgency=low * Use dgit.debian.net vhost on alioth. Closes:#720172. * Usage message. Closes:#720085. * Provide "dgit sbuild". * Assorted manpage fixes and improvements. * Fail if a required config item is missing. * Much better error messages. * Better error checking when parsing RFC822-style control data. * Better checking that the supplied .dsc and debian/changes correspond. * Ordering improvement in push: don't add dsc field until git push done. * New --distro option (helps with unknown suites). * Bugfixes. -- Ian Jackson Thu, 22 Aug 2013 13:36:44 +0100 dgit (0.3) experimental; urgency=low * New version which appears to be able to sort of work at least some of the time. -- Ian Jackson Sat, 17 Aug 2013 09:18:04 +0100 dgit (0.2) experimental; urgency=low * New version which might actually work but probably won't. -- Ian Jackson Fri, 16 Aug 2013 16:52:17 +0100 dgit (0.1) experimental; urgency=low * Initial experimental (partial) version. -- Ian Jackson Thu, 15 Aug 2013 12:09:01 +0100 work/debian/compat0000644000000000000000000000000214761250142011350 0ustar 9 work/debian/control0000644000000000000000000000522214761250142011556 0ustar Source: dgit Section: devel Priority: optional Maintainer: Ian Jackson Standards-Version: 4.4.0.0 Build-Depends: debhelper (>= 9), gettext, po4a, tcl Testsuite: autopkgtest Vcs-Git: https://salsa.debian.org/dgit-team/dgit.git Vcs-Browser: https://salsa.debian.org/dgit-team/dgit Package: dgit Depends: perl, libdpkg-perl, git-core, devscripts, dpkg-dev, ${misc:Depends}, git-buildpackage, liblist-moreutils-perl, liblocale-gettext-perl, coreutils (>= 8.23-1~), libdigest-sha-perl, dput, curl, apt, libjson-perl, ca-certificates, libtext-iconv-perl, libtext-glob-perl, libwww-curl-perl, libtext-csv-perl Recommends: ssh-client, distro-info-data, liburi-perl Suggests: sbuild | pbuilder | cowbuilder Architecture: all Description: git interoperability with the Debian archive dgit (with the associated infrastructure) makes it possible to treat the Debian archive as a git repository. . dgit push constructs uploads from git commits . dgit clone and dgit fetch construct git commits from uploads. Package: git-debrebase Depends: perl, git-core, libdpkg-perl, libfile-fnmatch-perl, devscripts, liblocale-gettext-perl, ${misc:Depends} Recommends: dgit, git-buildpackage Architecture: all Description: rebasing git workflow tool for Debian packaging git-debrebase is a tool for representing in git, and manipulating, Debian packages based on upstream source code. . git-debrebase is an alternative to workflows including git-dpm, gbp pq, and direct use of quilt patches. Package: git-debpush Depends: devscripts, git, gnupg, libgit-wrapper-perl, ${misc:Depends} Architecture: all Description: client script for git pushing to Debian-style archives git-debpush is a script to create and push a specially formatted signed git tag. The metadata in the tag indicates that the tagged commit should be pushed (or "uploaded") to a Debian-style archive. . Tags generated by this script can be read by an intermediary service, which performs any conversion that's needed (such as producing and signing a .dsc and .changes), and then uploads the result to the Debian-style archive on your behalf. Package: dgit-infrastructure Depends: ${misc:Depends}, perl, git-core, gpgv, chiark-utils-bin, libjson-perl, libdigest-sha-perl, libdbd-sqlite3-perl, sqlite3, libdpkg-perl, liblocale-gettext-perl Recommends: dgit Architecture: all Description: dgit server backend infrastructure This package contains tools which are useful for setting up a dgit git repository server. You probably want dgit, the client package, instead of dgit-infrastructure. work/debian/copyright0000644000000000000000000001027314761250142012110 0ustar dgit Integration between git and Debian-style archives Copyright (C)2013-2019 Ian Jackson Copyright (C)2016-2019 Sean Whitton Copyright (C)2018-2019 Frans Spiesschaert Copyright (C)2019 Matthew Vernon / Genome Research Limited Copyright (C)2019 Paul Hardy Copyright (C)1999-2010 Joey Hess Copyright (C)2004-2010 Colin Watson Copyright (C)2004-2015 Best Practical Solutions, LLC This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A copy of the GNU General Public License v3 can be found in /usr/share/common-licenses/GPL-3. The tests/ directory contains a complete copy of the source code for the pari-extra 3-1 package. This is a dummy package containing only Debian metadata, by Bill Alombert, with a licence statement saying it's GPL (implicitly GPLv3 compatible). Some of the i18n build system was copied from the Debian debconf package, which has the BSD-2-clause (GPLv3-compatible) licence: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. . THIS SOFTWARE IS PROVIDED BY AUTHORS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Contributions are accepted upstram under the same terms; please sign off your patches (by writing an approprite Signed-Off-By tag in your commit message or patch submission) to indicate your attestation that the Developer Certificate of Origin (version 1.1) applies. -8<- Developer Certificate of Origin Version 1.1 Copyright (C) 2004, 2006 The Linux Foundation and its contributors. 1 Letterman Drive Suite D4700 San Francisco, CA, 94129 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Developer's Certificate of Origin 1.1 By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. work/debian/dgit.install0000644000000000000000000000022414761250142012467 0ustar usr/share/locale/*/LC_MESSAGES/dgit.mo usr/share/man/*/man*/dgit*.[1-9] # ^ translated manpages. This has to be commented if they should go away. work/debian/dgit.lintian-overrides0000644000000000000000000000022614761250142014461 0ustar manpage-has-errors-from-man usr/share/man/man1/dgit.1.gz file '', around line 51: binary-without-manpage usr/bin/dgit-badcommit-fixup work/debian/git-debpush.install0000644000000000000000000000005214761250142013752 0ustar git-playtree-setup /usr/share/git-debpush work/debian/git-debrebase.install0000644000000000000000000000024414761250142014237 0ustar usr/share/locale/*/LC_MESSAGES/git-debrebase.mo # usr/share/man/*/man*/git-debrebase.[1-9] # ^ translated manpages. This has to be un-commented when they appear. work/debian/rules0000755000000000000000000000613314761250142011235 0ustar #!/usr/bin/make -f # dgit # Integration between git and Debian-style archives # # Copyright (C)2013-2019 Ian Jackson # Copyright (C)2019 Sean Whitton # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . export prefix=/usr %: dh $@ override_dh_gencontrol: dh_gencontrol set -e; \ cd debian/dgit; \ v=$$(perl -ne 'print if s/^version:\s+//i' DEBIAN/control); \ perl -i -pe "s/UNRELEASED/$$v/g if m/###substituted###/" usr/bin/dgit override_dh_auto_clean: dh_auto_clean make -C po clean globalperl=/usr/share/perl5 override_dh_auto_install: specpkg_install_gdp \ specpkg_install_gdr \ specpkg_install_infra make install prefix=/usr DESTDIR=debian/dgit make -C po install prefix=/usr DESTDIR=../debian/tmp \ SUPPRESS_PO_UPDATE=1 S='' mv debian/dgit/usr/bin/git-playtree-setup debian/dgit/usr/share/dgit make -C po4a install DESTDIR=../debian/tmp S='' override_dh_missing: dh_missing --fail-missing specpkg_install_gdp: p=git-debpush specpkg_install_gdr: p=git-debrebase specpkg_install_gdr: pm=GDR specpkg_install_infra: p=dgit-infrastructure specpkg_install_infra: pm=Infra define specpkg_install_common make install-$(tok) prefix=/usr DESTDIR=debian/$(p) perldir=$(specperl) endef specpkg_install_gdp: tok=gdp specpkg_install_gdp: specperl=/usr/share/dgit/gdp/perl5 specpkg_install_gdp: $(specpkg_install_common) set -x; perl -i -pe 'next unless m/###substituted###/;' \ -e 's{^(git_playtree_setup)=.*}{$$1=/usr/share/$p/git-playtree-setup};' \ debian/$(p)/usr/bin/* specpkg_install_%: tok=$* specpkg_install_%: specperl=/usr/share/dgit/$(tok)/perl5 specpkg_install_%: $(specpkg_install_common) # # Most of the Perl modules in this package live in # # $(specperl). The exception is Debian::Dgit::Infra, which # # lives in $(globalperl) and adds $(specperl) to @INC. # # We also abuse this for git-playtree-setup. In .debs, this # # goes in the per-.deb @INC dir. See Dgit.pm::playtree_setup. set -ex; \ base=debian/$(p); \ mod=Debian/Dgit/$(pm).pm; \ src=$${base}$(specperl)/$${mod}; \ dst=$${base}$(globalperl)/$${mod}; \ mkdir -p $${dst%/*}; \ mv -f $$src $$dst; \ install -m 755 git-playtree-setup $${base}$(specperl); \ perl -i -p -e 'next unless m/###substituted###/;' \ -e 'next unless s/^# (?=unshift \@INC,)//;' \ -e 'die unless s{q\{\S+\}}{q{$(specperl)}};' \ $$dst debian/tests/control: tests/enumerate-tests debian/tests/control.in $< gencontrol >$@.new && mv -f $@.new $@ debian/tests/control: tests/lib-core tests/lib-restricts debian/tests/control: tests/tests $(wildcard tests/tests/*[^~#]) work/debian/source/0000755000000000000000000000000014761250142011452 5ustar work/debian/source/lintian-overrides0000644000000000000000000000022514761250142015032 0ustar file-contains-trailing-whitespace debian/changelog * unknown-runtime-tests-restriction x-dgit-* missing-debian-source-format older-source-format 1.0 work/debian/tests/0000755000000000000000000000000014761250142011314 5ustar work/debian/tests/control0000644000000000000000000001551314761250142012724 0ustar Tests: baredebian-multitar baredebian-plusgit baredebian-push baredebian-tarball Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, quilt, git-debrebase, git-buildpackage, libdpkg-perl, libgit-wrapper-perl, liblist-compare-perl, libstring-shellquote-perl, libtry-tiny-perl Tests: build-modes-gbp Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-buildpackage Tests: clone-reprepro downstream-gitless Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, reprepro Tests: dpkgsourceignores-docs Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl Restrictions: x-dgit-intree-only Tests: defdistro-dsd-clone-drs dsd-clone-drs Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl Restrictions: x-dgit-intree-only x-dgit-git-only Tests: alternating-dgit clone-gitnosuite clone-nogit clone-skew drs-clone-nogit dsd-clone-nogit ftpmasterapi-http Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, libhttp-server-simple-static-perl Tests: gdr-import-dgit Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debrebase, git-buildpackage, libhttp-server-simple-static-perl Tests: gdr-merge-conflicts Tests-Directory: tests/tests Depends: chiark-utils-bin, faketime, git-debrebase, git-buildpackage, quilt Tests: gdr-diverge-nmu gdr-diverge-nmu-dgit gdr-edits gdr-fresh gdr-import-dgitview gdr-import-nostitch gdr-makepatches7 gdr-merge gdr-subcommands gdr-unprocessable gdr-unprocessable-hints Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debrebase, git-buildpackage Tests: gitattributes Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, bsdgames, man-db, git-man Tests: hint-testsuite-triggers Tests-Directory: tests/tests Depends: gnupg, patch, diffutils Restrictions: hint-testsuite-triggers Tests: gdr-newupstream gdr-viagit i18n-messages Tests-Directory: tests/tests Depends: chiark-utils-bin, faketime, git-debrebase, git-buildpackage Tests: import-linkorigs Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, xz-utils Tests: manpages-format Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, man-db, make, groff, git-debrebase, git-debpush Tests: defdistro-mirror mirror mirror-debnewgit mirror-private Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, rsync Tests: build-modes-sbuild quilt-gbp-build-modes-sbuild Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, sbuild Restrictions: x-dgit-schroot-build Tests: sbuild-gitish Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, sbuild, man-db Restrictions: x-dgit-schroot-build Tests: i18n-po4a-uptodate package-build spelling Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl Restrictions: x-dgit-git-only Tests: tagupl Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, libdpkg-perl, libgit-wrapper-perl, liblist-compare-perl, libstring-shellquote-perl, libtry-tiny-perl, git-debpush Tests: tagupl-baredebian Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, quilt, git-debpush, git-debrebase, git-buildpackage, libdpkg-perl, libgit-wrapper-perl, liblist-compare-perl, libstring-shellquote-perl, libtry-tiny-perl Tests: tagupl-gbp Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush, libdpkg-perl, libgit-wrapper-perl, liblist-compare-perl, libstring-shellquote-perl, libtry-tiny-perl Tests: tagupl-native Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush Tests: test-list-uptodate Tests-Directory: tests/tests Depends: git Tests: trustingpolicy-replay Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, dput-ng Tests: absurd-gitapply badcommit-rewrite build-modes build-modes-long build-modes-source checkout clone-clogsigpipe debpolicy-dbretry debpolicy-newreject debpolicy-quilt-gbp debpolicy-taintrm defdistro-rpush defdistro-setup distropatches-reject dpkgsourceignores-correct drs-push-masterupdate drs-push-rejects dsd-divert fetch-localgitonly fetch-somegit-notlast forcesplit-linear forcesplit-overwrite gbp-orig gitconfig gitworktree import-dsc import-maintmangle import-native import-nonnative import-pushold import-tarbomb inarchivecopy mismatches-contents mismatches-dscchanges multisuite orig-include-exclude orig-include-exclude-chkquery overwrite-chkclog overwrite-junk overwrite-splitbrains overwrite-version pbuilder protocol-compat push-buildproductsdir push-newpackage push-newrepeat push-nextdgit push-source push-source-with-changes quilt quilt-gbp quilt-gbp-build-modes quilt-include-binaries quilt-singlepatch quilt-splitbrains quilt-useremail rpush rpush-quilt rpush-source sourceonlypolicy tag-updates unrepresentable unrepresentable-single-dpkg unrepresentable-single-git version-opt Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl work/debian/tests/control.in0000644000000000000000000000004714761250142013325 0ustar Tests-Directory: tests/tests Depends: work/dgit0000755000000000000000000075523214761250142007623 0ustar #!/usr/bin/perl -w # dgit # Integration between git and Debian-style archives # # Copyright (C)2013-2019 Ian Jackson # Copyright (C)2017-2019 Sean Whitton # Copyright (C)2019 Matthew Vernon / Genome Research Limited # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . END { $? = $Debian::Dgit::ExitStatus::desired // -1; }; use Debian::Dgit::ExitStatus; use Debian::Dgit::I18n; use strict; use Debian::Dgit qw(:DEFAULT :playground); setup_sigwarn(); use IO::Handle; use Data::Dumper; use WWW::Curl::Easy; use Dpkg::Control::Hash; use File::Path; use File::Spec; use File::Temp qw(tempdir); use File::Basename; use File::Copy (); use Dpkg::Version; use Dpkg::Compression; use Dpkg::Compression::Process; use POSIX; use Locale::gettext; use IPC::Open2; use Digest::SHA; use Digest::MD5; use List::MoreUtils qw(pairwise); use Text::Glob qw(match_glob); use Text::CSV; use Fcntl qw(:DEFAULT :flock); use Carp; use Debian::Dgit; our $our_version = 'UNRELEASED'; ###substituted### our $absurdity = undef; ###substituted### $SIG{INT} = 'DEFAULT'; # work around #932841 our @rpushprotovsn_support = qw(6 5 4); # Reverse order! our $protovsn; our $rpush_verb; # "push" or "push-source" our $cmd; our $subcommand; our $isuite; our $idistro; our $package; our @ropts; our $sign = 1; our $dryrun_level = 0; our $changesfile; our $buildproductsdir; our $bpd_glob; our $new_package = 0; our $includedirty = 0; our $rmonerror = 1; our @deliberatelies; our %previously; our $existing_package = 'dpkg'; our $cleanmode; our $changes_since_version; our $rmchanges; our $overwrite_version; # undef: not specified; '': check changelog our $quilt_mode; our $quilt_upstream_commitish; our $quilt_upstream_commitish_used; our $quilt_upstream_commitish_message; our $quilt_options_re = 'gbp|dpm|baredebian(?:\+tarball|\+git)?'; our $quilt_modes_re = "linear|smash|try-linear|auto|single|nofix|nocheck|unapplied|$quilt_options_re"; our $splitview_mode; our $splitview_modes_re = qr{auto|always|never}; our $dodep14tag; our %internal_object_save; our $we_are_responder; our $we_are_initiator; our $initiator_tempdir; our $patches_applied_dirtily = 00; our $chase_dsc_distro=1; our %forceopts = map { $_=>0 } qw(unrepresentable unsupported-source-format dsc-changes-mismatch changes-origs-exactly uploading-binaries uploading-old-version uploading-source-only reusing-version push-tainted import-gitapply-absurd import-gitapply-no-absurd import-dsc-with-dgit-field); our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)"); our $cleanmode_re = qr{(?: dpkg-source (?: -d )? (?: ,no-check | ,all-check )? | (?: git | git-ff ) (?: ,always )? | check (?: ,ignores )? | none )}x; our $git_authline_re = '^([^<>]+) \<(\S+)\> (\d+ [-+]\d+)$'; our $splitbraincache = 'dgit-intern/quilt-cache'; our $rewritemap = 'dgit-rewrite/map'; our @dpkg_source_ignores = qw(-i(?:^|/)\.git(?:/|$) -I.git); our (@dget) = qw(dget); our (@curl) = (qw(curl --proto-redir), '-all,http,https', qw(-L)); our (@dput) = qw(dput); our (@debsign) = qw(debsign); our (@gpg) = qw(gpg); our (@sbuild) = (qw(sbuild --no-source)); our (@ssh) = 'ssh'; our (@dgit) = qw(dgit); our (@git_debrebase) = qw(git-debrebase); our (@aptget) = qw(apt-get); our (@aptcache) = qw(apt-cache); our (@dpkgbuildpackage) = (qw(dpkg-buildpackage), @dpkg_source_ignores); our (@dpkgsource) = (qw(dpkg-source), @dpkg_source_ignores); our (@dpkggenchanges) = qw(dpkg-genchanges); our (@mergechanges) = qw(mergechanges -f); our (@gbp_build) = (''); our (@gbp_pq) = ('gbp pq'); our (@changesopts) = (''); our (@pbuilder) = ("sudo -E pbuilder","--no-source-only-changes"); our (@cowbuilder) = ("sudo -E cowbuilder","--no-source-only-changes"); our %opts_opt_map = ('dget' => \@dget, # accept for compatibility 'curl' => \@curl, 'dput' => \@dput, 'debsign' => \@debsign, 'gpg' => \@gpg, 'sbuild' => \@sbuild, 'ssh' => \@ssh, 'dgit' => \@dgit, 'git' => \@git, 'git-debrebase' => \@git_debrebase, 'apt-get' => \@aptget, 'apt-cache' => \@aptcache, 'dpkg-source' => \@dpkgsource, 'dpkg-buildpackage' => \@dpkgbuildpackage, 'dpkg-genchanges' => \@dpkggenchanges, 'gbp-build' => \@gbp_build, 'gbp-pq' => \@gbp_pq, 'ch' => \@changesopts, 'mergechanges' => \@mergechanges, 'pbuilder' => \@pbuilder, 'cowbuilder' => \@cowbuilder); our %opts_opt_cmdonly = ('gpg' => 1, 'git' => 1); our %opts_cfg_insertpos = map { $_, scalar @{ $opts_opt_map{$_} } } keys %opts_opt_map; sub parseopts_late_defaults(); sub quiltify_trees_differ ($$;$$$); sub setup_gitattrs(;$); sub check_gitattrs($$); our $playground; our $keyid; autoflush STDOUT 1; our $supplementary_message = ''; our $made_split_brain = 0; our $do_split_brain; # Interactions between quilt mode and split brain # (currently, split brain only implemented iff # madformat_wantfixup && quiltmode_splitting) # # source format | sane `3.0 (quilt)' # | madformat_wantfixup() # | # quilt mode | normal quiltmode # | (eg linear) _splitbrain # | # -------------------+------------------------------------------------- # | # no split | no q cache no q cache forbidden, # brain | PM on master q fixup on master prevented # !do_split_brain() | PM on master # | # split brain | no q cache q fixup cached, to dgit view # | PM in dgit view PM in dgit view # # PM = pseudomerge to make ff, due to overwrite (or split view) # "no q cache" = do not record in cache on build, do not check cache # `3.0 (quilt)' with --quilt=nocheck is treated as sane format END { local ($@, $?); return unless forkcheck_mainprocess(); print STDERR "! $_\n" foreach $supplementary_message =~ m/^.+$/mg; } our $remotename = 'dgit'; our @ourdscfield = qw(Dgit Vcs-Dgit-Master); our $csuite; our $instead_distro; if (!defined $absurdity) { $absurdity = $0; $absurdity =~ s{/[^/]+$}{/absurd} or die; } sub madformat ($) { $_[0] eq '3.0 (quilt)' } sub lbranch () { return "$branchprefix/$csuite"; } my $lbranch_re = '^refs/heads/'.$branchprefix.'/([^/.]+)$'; sub lref () { return "refs/heads/".lbranch(); } sub lrref () { return "refs/remotes/$remotename/".server_branch($csuite); } sub rrref () { return server_ref($csuite); } sub srcfn ($$) { my ($vsn, $sfx) = @_; return &source_file_leafname($package, $vsn, $sfx); } sub is_orig_file_of_vsn ($$) { my ($f, $upstreamvsn) = @_; return is_orig_file_of_p_v($f, $package, $upstreamvsn); } sub dscfn ($) { my ($vsn) = @_; return srcfn($vsn,".dsc"); } sub changespat ($;$) { my ($vsn, $arch) = @_; return "${package}_".(stripepoch $vsn)."_".($arch//'*').".changes"; } our $us = 'dgit'; initdebug(''); our @end; END { local ($?); return unless forkcheck_mainprocess(); foreach my $f (@end) { eval { $f->(); }; print STDERR "$us: cleanup: $@" if length $@; } }; sub badcfg { print STDERR f_ "%s: invalid configuration: %s\n", $us, "@_"; finish 12; } sub forceable_fail ($$) { my ($forceoptsl, $msg) = @_; fail $msg unless grep { $forceopts{$_} } @$forceoptsl; print STDERR +(__ "warning: overriding problem due to --force:\n"). $msg; } sub forceing ($) { my ($forceoptsl) = @_; my @got = grep { $forceopts{$_} } @$forceoptsl; return 0 unless @got; print STDERR f_ "warning: skipping checks or functionality due to --force-%s\n", $got[0]; } sub no_such_package () { print STDERR f_ "%s: source package %s does not exist in suite %s\n", $us, $package, $isuite; finish 4; } sub deliberately ($) { my ($enquiry) = @_; return !!grep { $_ eq "--deliberately-$enquiry" or $_ eq "--deliberately-TEST-dgit-only-$enquiry" } @deliberatelies; } sub deliberately_not_fast_forward () { foreach (qw(not-fast-forward fresh-repo)) { return 1 if deliberately($_); } } sub quiltmode_splitting () { $quilt_mode =~ m/gbp|dpm|unapplied|baredebian/; } sub format_quiltmode_splitting ($) { my ($format) = @_; return madformat_wantfixup($format) && quiltmode_splitting(); } sub do_split_brain () { !!($do_split_brain // confess) } sub opts_opt_multi_cmd { my $extra = shift; my @cmd; push @cmd, split /\s+/, shift @_; push @cmd, @$extra; push @cmd, @_; @cmd; } sub gbp_pq { return opts_opt_multi_cmd [], @gbp_pq; } sub gbp_pq_pc_aside (&) { my ($f) = @_; my $undo = rename ".pc", "../pc-aside"; confess "$!" unless $undo || $!==ENOENT; $f->(); if ($undo) { rename "../pc-aside", ".pc", or confess $!; } } sub dgit_privdir () { our $dgit_privdir_made //= ensure_a_playground 'dgit'; } sub bpd_abs () { my $r = $buildproductsdir; $r = "$maindir/$r" unless $r =~ m{^/}; return $r; } sub get_tree_of_commit ($) { my ($commitish) = @_; my $cdata = cmdoutput @git, qw(cat-file commit), $commitish; $cdata =~ m/\n\n/; $cdata = $`; $cdata =~ m/^tree (\w+)$/m or confess "cdata $cdata ?"; return $1; } sub branch_gdr_info ($$) { my ($symref, $head) = @_; my ($status, $msg, $current, $ffq_prev, $gdrlast) = gdr_ffq_prev_branchinfo($symref); return () unless $status eq 'branch'; $ffq_prev = git_get_ref $ffq_prev; $gdrlast = git_get_ref $gdrlast; $gdrlast &&= is_fast_fwd $gdrlast, $head; return ($ffq_prev, $gdrlast); } sub branch_is_gdr_unstitched_ff ($$$) { my ($symref, $head, $ancestor) = @_; my ($ffq_prev, $gdrlast) = branch_gdr_info($symref, $head); return 0 unless $ffq_prev; return 0 unless !defined $ancestor or is_fast_fwd $ancestor, $ffq_prev; return 1; } sub branch_is_gdr ($) { my ($head) = @_; # This is quite like git-debrebase's keycommits. # We have our own implementation because: # - our algorighm can do fewer tests so is faster # - it saves testing to see if gdr is installed # NB we use this jsut for deciding whether to run gdr make-patches # Before reusing this algorithm for somthing else, its # suitability should be reconsidered. my $walk = $head; local $Debian::Dgit::debugcmd_when_debuglevel = 3; printdebug "branch_is_gdr $head...\n"; my $get_patches = sub { my $t = git_cat_file "$_[0]:debian/patches", [qw(missing tree)]; return $t // ''; }; my $tip_patches = $get_patches->($head); WALK: for (;;) { my $cdata = git_cat_file $walk, 'commit'; my ($hdrs,$msg) = $cdata =~ m{\n\n} ? ($`,$') : ($cdata,''); if ($msg =~ m{^\[git-debrebase\ ( anchor | changelog | make-patches | merged-breakwater | pseudomerge ) [: ] }mx) { # no need to analyse this - it's sufficient # (gdr classifications: Anchor, MergedBreakwaters) # (made by gdr: Pseudomerge, Changelog) printdebug "branch_is_gdr $walk gdr $1 YES\n"; return 1; } my @parents = ($hdrs =~ m/^parent (\w+)$/gm); if (@parents==2) { my $walk_tree = get_tree_of_commit $walk; foreach my $p (@parents) { my $p_tree = get_tree_of_commit $p; if ($p_tree eq $walk_tree) { # pseudomerge contriburor # (gdr classification: Pseudomerge; not made by gdr) printdebug "branch_is_gdr $walk unmarked pseudomerge\n" if $debuglevel >= 2; $walk = $p; next WALK; } } # some other non-gdr merge # (gdr classification: VanillaMerge, DgitImportUnpatched, ?) printdebug "branch_is_gdr $walk ?-2-merge NO\n"; return 0; } if (@parents>2) { # (gdr classification: ?) printdebug "branch_is_gdr $walk ?-octopus NO\n"; return 0; } if (!@parents) { printdebug "branch_is_gdr $walk origin\n"; return 0; } if ($get_patches->($walk) ne $tip_patches) { # Our parent added, removed, or edited patches, and wasn't # a gdr make-patches commit. gdr make-patches probably # won't do that well, then. # (gdr classification of parent: AddPatches or ?) printdebug "branch_is_gdr $walk ?-patches NO\n"; return 0; } if ($tip_patches eq '' and !defined git_cat_file "$walk~:debian" and !quiltify_trees_differ "$walk~", $walk ) { # (gdr classification of parent: BreakwaterStart We cannot # process this using git-debrebase, because this can misrecognise # other kinds of branch contents, eg as in #1025451. Not doing # this via gdr is OK, because the normal quilt linearisation will # do - doing it via gdr is just an optimisation. printdebug "branch_is_gdr $walk unmarked BreakwaterStart NO\n"; return 0; } # (gdr classification: Upstream Packaging Mixed Changelog) printdebug "branch_is_gdr $walk plain\n" if $debuglevel >= 2; $walk = $parents[0]; } } #---------- remote protocol support, common ---------- # remote push initiator/responder protocol: # $ dgit remote-push-source-build-host ... ... # where is ,... ... # < dgit-remote-push-source-ready # # Or for push-built, # $ dgit remote-push-build-host ... ... # < dgit-remote-push-ready # # occasionally: # # > progress NBYTES # [NBYTES message] # # > supplementary-message NBYTES # [NBYTES message] # # main sequence: # # > file parsed-changelog # [indicates that output of dpkg-parsechangelog follows] # > data-block NBYTES # > [NBYTES bytes of data (no newline)] # [maybe some more blocks] # > data-end # # > file dsc # [etc] # # > file changes # [etc] # # > param head DGIT-VIEW-HEAD # > param csuite SUITE # > param tagformat new # $protovsn == 4 # > param splitbrain 0|1 # $protovsn >= 6 # > param maint-view MAINT-VIEW-HEAD # # > param buildinfo-filename P_V_X.buildinfo # zero or more times # > file buildinfo # for buildinfos to sign # # not for push-source # # > previously REFNAME=OBJNAME # if --deliberately-not-fast-forward # # goes into tag, for replay prevention # # > want signed-tag # [indicates that signed tag is wanted] # < data-block NBYTES # < [NBYTES bytes of data (no newline)] # [maybe some more blocks] # < data-end # < files-end # # > want signed-dsc-changes # < data-block NBYTES [transfer of signed dsc] # [etc] # < data-block NBYTES [transfer of signed changes] # [etc] # < data-block NBYTES [transfer of each signed buildinfo # [etc] same number and order as "file buildinfo"] # ... # < files-end # # > complete our $i_child_pid; sub i_child_report () { # Sees if our child has died, and reap it if so. Returns a string # describing how it died if it failed, or undef otherwise. return undef unless $i_child_pid; my $got = waitpid $i_child_pid, WNOHANG; return undef if $got <= 0; die unless $got == $i_child_pid; $i_child_pid = undef; return undef unless $?; return f_ "build host child %s", waitstatusmsg(); } sub badproto ($$) { my ($fh, $m) = @_; fail f_ "connection lost: %s", $! if $fh->error; fail f_ "protocol violation; %s not expected", $m; } sub badproto_badread ($$) { my ($fh, $wh) = @_; fail f_ "connection lost: %s", $! if $!; my $report = i_child_report(); fail $report if defined $report; badproto $fh, f_ "eof (reading %s)", $wh; } sub protocol_expect (&$) { my ($match, $fh) = @_; local $_; $_ = <$fh>; defined && chomp or badproto_badread $fh, __ "protocol message"; if (wantarray) { my @r = &$match; return @r if @r; } else { my $r = &$match; return $r if $r; } badproto $fh, f_ "\`%s'", $_; } sub protocol_send_file ($$) { my ($fh, $ourfn) = @_; open PF, "<", $ourfn or die "$ourfn: $!"; for (;;) { my $d; my $got = read PF, $d, 65536; die "$ourfn: $!" unless defined $got; last if !$got; print $fh "data-block ".length($d)."\n" or confess "$!"; print $fh $d or confess "$!"; } PF->error and die "$ourfn $!"; print $fh "data-end\n" or confess "$!"; close PF; } sub protocol_read_bytes ($$) { my ($fh, $nbytes) = @_; $nbytes =~ m/^[1-9]\d{0,5}$|^0$/ or badproto \*RO, __ "bad byte count"; my $d; my $got = read $fh, $d, $nbytes; $got==$nbytes or badproto_badread $fh, __ "data block"; return $d; } sub protocol_receive_file ($$) { my ($fh, $ourfn) = @_; printdebug "() $ourfn\n"; open PF, ">", $ourfn or die "$ourfn: $!"; for (;;) { my ($y,$l) = protocol_expect { m/^data-block (.*)$/ ? (1,$1) : m/^data-end$/ ? (0,) : (); } $fh; last unless $y; my $d = protocol_read_bytes $fh, $l; print PF $d or confess "$!"; } close PF or confess "$!"; } #---------- remote protocol support, responder ---------- sub responder_send_command ($) { my ($command) = @_; return unless $we_are_responder; # called even without $we_are_responder printdebug ">> $command\n"; print PO $command, "\n" or confess "$!"; } sub responder_send_file ($$) { my ($keyword, $ourfn) = @_; return unless $we_are_responder; printdebug "]] $keyword $ourfn\n"; responder_send_command "file $keyword"; protocol_send_file \*PO, $ourfn; } sub responder_receive_files ($@) { my ($keyword, @ourfns) = @_; die unless $we_are_responder; printdebug "[[ $keyword @ourfns\n"; responder_send_command "want $keyword"; foreach my $fn (@ourfns) { protocol_receive_file \*PI, $fn; } printdebug "[[\$\n"; protocol_expect { m/^files-end$/ } \*PI; } #---------- remote protocol support, initiator ---------- sub initiator_expect (&) { my ($match) = @_; protocol_expect { &$match } \*RO; } #---------- end remote code ---------- sub progress { if ($we_are_responder) { my $m = join '', @_; responder_send_command "progress ".length($m) or confess "$!"; print PO $m or confess "$!"; } else { print @_, "\n"; } } our $ua; our ($dscdata,$dscurl,$dsc,$dsc_checked,$skew_warning_vsn); sub act_local () { return $dryrun_level <= 1; } sub act_scary () { return !$dryrun_level; } sub printdone { if (!$dryrun_level) { progress f_ "%s ok: %s", $us, "@_"; } else { progress f_ "would be ok: %s (but dry run only)", "@_"; } } sub dryrun_report { printcmd(\*STDERR,$debugprefix."#",@_); } sub runcmd_ordryrun { if (act_scary()) { runcmd @_; } else { dryrun_report @_; } } sub runcmd_ordryrun_local { if (act_local()) { runcmd @_; } else { dryrun_report @_; } } our $helpmsg = i_ < sign tag and package with instead of default --dry-run -n do not change anything, but go through the motions --damp-run -L like --dry-run but make local changes, without signing --new -N allow introducing a new package --debug -D increase debug level -c= set git config option (used directly by dgit too) END our $later_warning_msg = i_ < 'debian', 'dgit.default.default-suite' => 'unstable', 'dgit.default.old-dsc-distro' => 'debian', 'dgit-suite.*-security.distro' => 'debian-security', 'dgit.default.username' => '', 'dgit.default.archive-query-default-component' => 'main', 'dgit.default.ssh' => 'ssh', 'dgit.default.archive-query' => 'madison:', 'dgit.default.sshpsql-dbname' => 'service=projectb', 'dgit.default.aptget-components' => 'main', 'dgit.default.source-only-uploads' => 'ok', 'dgit.default.policy-query-supported-ssh' => 'unknown', 'dgit.dsc-url-proto-ok.http' => 'true', 'dgit.dsc-url-proto-ok.https' => 'true', 'dgit.dsc-url-proto-ok.git' => 'true', 'dgit.vcs-git.suites', => 'sid', # ;-separated 'dgit.default.dsc-url-proto-ok' => 'false', 'dgit.default.push-subcmd' => 'warn,built', # old means "repo server accepts pushes with old dgit tags" # new means "repo server accepts pushes with new dgit tags" # maint means "repo server accepts split brain pushes" # hist means "repo server may have old pushes without new tag" # ("hist" is implied by "old") 'dgit-distro.debian.archive-query' => 'ftpmasterapi:', 'dgit-distro.debian.git-check' => 'url', 'dgit-distro.debian.git-check-suffix' => '/info/refs', 'dgit-distro.debian.new-private-pushers' => 't', 'dgit-distro.debian.source-only-uploads' => 'not-wholly-new', 'dgit-distro.debian.policy-query-supported-ssh' => 'true', 'dgit-distro.debian/push.git-url' => '', 'dgit-distro.debian/push.git-host' => 'push.dgit.debian.org', 'dgit-distro.debian/push.git-user-force' => 'dgit', 'dgit-distro.debian/push.git-proto' => 'git+ssh://', 'dgit-distro.debian/push.git-path' => '/dgit/debian/repos', 'dgit-distro.debian/push.git-create' => 'true', 'dgit-distro.debian/push.git-check' => 'ssh-cmd', 'dgit-distro.debian.archive-query-url', 'https://api.ftp-master.debian.org/', # 'dgit-distro.debian.archive-query-tls-key', # '/etc/ssl/certs/%HOST%.pem:/etc/dgit/%HOST%.pem', # ^ this does not work because curl is broken nowadays # Fixing #790093 properly will involve providing providing the key # in some pacagke and maybe updating these paths. # # 'dgit-distro.debian.archive-query-tls-curl-args', # '--ca-path=/etc/ssl/ca-debian', # ^ this is a workaround but works (only) on DSA-administered machines 'dgit-distro.debian.git-url' => 'https://git.dgit.debian.org', 'dgit-distro.debian.git-url-suffix' => '', 'dgit-distro.debian.upload-host' => 'ftp-master', # for dput 'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/', 'dgit-distro.debian-security.archive-query' => 'aptget:', 'dgit-distro.debian-security.mirror' => 'http://security.debian.org/debian-security/', 'dgit-distro.debian-security.aptget-suite-map' => 's#buster-security$#buster/updates#', 'dgit-distro.debian-security.aptget-suite-rmap' => 's#buster$#buster-security#', 'dgit-distro.debian-security.nominal-distro' => 'debian', 'dgit-distro.debian.backports-quirk' => '(squeeze)-backports*', 'dgit-distro.debian-backports.mirror' => 'http://backports.debian.org/debian-backports/', 'dgit-distro.ubuntu.git-check' => 'false', 'dgit-distro.ubuntu.mirror' => 'http://archive.ubuntu.com/ubuntu', 'dgit-distro.ubuntucloud.git-check' => 'false', 'dgit-distro.ubuntucloud.nominal-distro' => 'ubuntu', 'dgit-distro.ubuntucloud.archive-query' => 'aptget:', 'dgit-distro.ubuntucloud.mirror' => 'http://ubuntu-cloud.archive.canonical.com/ubuntu', 'dgit-distro.ubuntucloud.aptget-suite-map' => 's#^([^-]+):([^:]+)$#${1}-updates/$2#; s#^(.+)-(.+):(.+)#$1-$2/$3#;', 'dgit-distro.ubuntucloud.aptget-suite-rmap' => 's#/(.+)$#-$1#', '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' => "dummycatapi:", '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', ); our %gitcfgs; our @gitcfgsources = qw(cmdline local global system); our $invoked_in_git_tree = 1; sub git_slurp_config () { # This algoritm is a bit subtle, but this is needed so that for # options which we want to be single-valued, we allow the # different config sources to override properly. See #835858. foreach my $src (@gitcfgsources) { next if $src eq 'cmdline'; # we do this ourselves since git doesn't handle it $gitcfgs{$src} = git_slurp_config_src $src; } } sub git_get_config ($) { my ($c) = @_; foreach my $src (@gitcfgsources) { my $l = $gitcfgs{$src}{$c}; confess "internal error ($l $c)" if $l && !ref $l; printdebug"C $c ".(defined $l ? join " ", map { messagequote "'$_'" } @$l : "undef")."\n" if $debuglevel >= 4; $l or next; @$l==1 or badcfg f_ "multiple values for %s (in %s git config)", $c, $src if @$l > 1; $l->[0] =~ m/\n/ and badcfg f_ "value for config option %s (in %s git config) contains newline(s)!", $c, $src; return $l->[0]; } return undef; } sub cfg { foreach my $c (@_) { return undef if $c =~ /RETURN-UNDEF/; printdebug "C? $c\n" if $debuglevel >= 5; my $v = git_get_config($c); return $v if defined $v; my $dv = $defcfg{$c}; if (defined $dv) { printdebug "CD $c $dv\n" if $debuglevel >= 4; return $dv; } } badcfg f_ "need value for one of: %s\n". "%s: distro or suite appears not to be (properly) supported", "@_", $us; } sub not_necessarily_a_tree () { # needs to be called from pre_* @gitcfgsources = grep { $_ ne 'local' } @gitcfgsources; $invoked_in_git_tree = 0; } sub access_basedistro__noalias () { if (defined $idistro) { return $idistro; } else { my $def = cfg("dgit-suite.$isuite.distro", 'RETURN-UNDEF'); return $def if defined $def; foreach my $src (@gitcfgsources, 'internal') { my $kl = $src eq 'internal' ? \%defcfg : $gitcfgs{$src}; next unless $kl; foreach my $k (keys %$kl) { next unless $k =~ m#^dgit-suite\.(.*)\.distro$#; my $dpat = $1; next unless match_glob $dpat, $isuite; return $kl->{$k}; } } foreach my $csvf () { my $csv_distro = $csvf =~ m{/(\w+)\.csv$} ? $1 : do { printdebug "skipping $csvf\n"; next; }; my $csv = Text::CSV->new({ binary => 1, auto_diag => 2 }) or die; my $fh = new IO::File $csvf, "<:encoding(utf8)" or die "open $csvf: $!"; while (my $cols = $csv->getline($fh)) { next unless $cols->[2] eq $isuite; return $csv_distro; } die "$csvf $!" if $fh->error; close $fh; } return cfg("dgit.default.distro"); } } sub access_basedistro () { my $noalias = access_basedistro__noalias(); my $canon = cfg("dgit-distro.$noalias.alias-canon",'RETURN-UNDEF'); return $canon // $noalias; } sub access_nomdistro () { my $base = access_basedistro(); my $r = cfg("dgit-distro.$base.nominal-distro",'RETURN-UNDEF') // $base; $r =~ m/^$distro_re$/ or badcfg f_ "bad syntax for (nominal) distro \`%s' (does not match %s)", $r, "/^$distro_re$/"; return $r; } sub access_quirk () { # returns (quirk name, distro to use instead or undef, quirk-specific info) my $basedistro = access_basedistro(); my $backports_quirk = cfg("dgit-distro.$basedistro.backports-quirk", 'RETURN-UNDEF'); if (defined $backports_quirk) { my $re = $backports_quirk; $re =~ s/[^-0-9a-z_\%*()]/\\$&/ig; $re =~ s/\*/.*/g; $re =~ s/\%/([-0-9a-z_]+)/ or $re =~ m/[()]/ or badcfg __ "backports-quirk needs \% or ( )"; if ($isuite =~ m/^$re$/) { return ('backports',"$basedistro-backports",$1); } } return ('none',undef); } our $access_forpush; sub parse_cfg_bool ($$$) { my ($what,$def,$v) = @_; $v //= $def; return $v =~ m/^[ty1]/ ? 1 : $v =~ m/^[fn0]/ ? 0 : badcfg f_ "%s needs t (true, y, 1) or f (false, n, 0) not \`%s'", $what, $v; } sub access_forpush_config () { my $d = access_basedistro(); return 1 if $new_package && parse_cfg_bool('new-private-pushers', 0, cfg("dgit-distro.$d.new-private-pushers", 'RETURN-UNDEF')); my $v = cfg("dgit-distro.$d.readonly", 'RETURN-UNDEF'); $v //= 'a'; return $v =~ m/^[ty1]/ ? 0 : # force readonly, forpush = 0 $v =~ m/^[fn0]/ ? 1 : # force nonreadonly, forpush = 1 $v =~ m/^[a]/ ? '' : # auto, forpush = '' badcfg __ "readonly needs t (true, y, 1) or f (false, n, 0) or a (auto)"; } sub access_forpush () { $access_forpush //= access_forpush_config(); return $access_forpush; } sub default_from_access_cfg ($$$;$) { my ($var, $keybase, $defval, $permit_re) = @_; return if defined $$var; $$var = access_cfg("$keybase-newer", 'RETURN-UNDEF'); $$var = undef if $$var && $$var !~ m/^$permit_re$/; $$var //= access_cfg($keybase, 'RETURN-UNDEF'); $$var //= $defval; badcfg f_ "unknown %s \`%s'", $keybase, $$var if defined $permit_re and $$var !~ m/$permit_re/; } sub pushing () { confess +(__ 'internal error').' '.Dumper($access_forpush)," ?" if defined $access_forpush and !$access_forpush; badcfg __ "pushing but distro is configured readonly" if access_forpush_config() eq '0'; $access_forpush = 1; $supplementary_message = __ <<'END' unless $we_are_responder; Push failed, before we got started. You can retry the push, after fixing the problem, if you like. END parseopts_late_defaults(); } sub notpushing () { parseopts_late_defaults(); } sub determine_whether_split_brain ($) { my ($format) = @_; { local $access_forpush; default_from_access_cfg(\$splitview_mode, 'split-view', 'auto', $splitview_modes_re); $do_split_brain = 1 if $splitview_mode eq 'always'; } printdebug "format $format, quilt mode $quilt_mode\n"; if (format_quiltmode_splitting $format) { $splitview_mode ne 'never' or fail f_ "dgit: quilt mode \`%s' (for format \`%s')". " implies split view, but split-view set to \`%s'", $quilt_mode, $format, $splitview_mode; $do_split_brain = 1; } $do_split_brain //= 0; } sub supplementary_message ($) { my ($msg) = @_; if (!$we_are_responder) { $supplementary_message = $msg; return; } else { responder_send_command "supplementary-message ".length($msg) or confess "$!"; print PO $msg or confess "$!"; } } sub access_distros () { # Returns list of distros to try, in order # # We want to try: # 0. `instead of' distro name(s) we have been pointed to # 1. the access_quirk distro, if any # 2a. the user's specified distro, or failing that } basedistro # 2b. the distro calculated from the suite } my @l = access_basedistro(); my (undef,$quirkdistro) = access_quirk(); unshift @l, $quirkdistro; unshift @l, $instead_distro; @l = grep { defined } @l; push @l, access_nomdistro(); if (access_forpush()) { @l = map { ("$_/push", $_) } @l; } @l; } sub access_cfg_cfgs (@) { my (@keys) = @_; my @cfgs; # The nesting of these loops determines the search order. We put # the key loop on the outside so that we search all the distros # for each key, before going on to the next key. That means that # if access_cfg is called with a more specific, and then a less # specific, key, an earlier distro can override the less specific # without necessarily overriding any more specific keys. (If the # distro wants to override the more specific keys it can simply do # so; whereas if we did the loop the other way around, it would be # impossible to for an earlier distro to override a less specific # key but not the more specific ones without restating the unknown # values of the more specific keys. my @realkeys; my @rundef; # We have to deal with RETURN-UNDEF specially, so that we don't # terminate the search prematurely. foreach (@keys) { if (m/RETURN-UNDEF/) { push @rundef, $_; last; } push @realkeys, $_ } foreach my $d (access_distros()) { push @cfgs, map { "dgit-distro.$d.$_" } @realkeys; } push @cfgs, map { "dgit.default.$_" } @realkeys; push @cfgs, @rundef; return @cfgs; } sub access_cfg (@) { my (@keys) = @_; my (@cfgs) = access_cfg_cfgs(@keys); my $value = cfg(@cfgs); return $value; } sub access_cfg_bool ($$) { my ($def, @keys) = @_; parse_cfg_bool($keys[0], $def, access_cfg(@keys, 'RETURN-UNDEF')); } sub string_to_ssh ($) { my ($spec) = @_; if ($spec =~ m/\s/) { return qw(sh -ec), 'exec '.$spec.' "$@"', 'x'; } else { return ($spec); } } sub access_cfg_ssh () { my $gitssh = access_cfg('ssh', 'RETURN-UNDEF'); if (!defined $gitssh) { return @ssh; } else { return string_to_ssh $gitssh; } } sub access_runeinfo ($) { my ($info) = @_; return ": dgit ".access_basedistro()." $info ;"; } sub access_someuserhost ($) { my ($some) = @_; my $user = access_cfg("$some-user-force", 'RETURN-UNDEF'); defined($user) && length($user) or $user = access_cfg("$some-user",'username'); my $host = access_cfg("$some-host"); return length($user) ? "$user\@$host" : $host; } sub access_gituserhost () { return access_someuserhost('git'); } sub access_giturl (;$) { my ($optional) = @_; my $url = access_cfg('git-url','RETURN-UNDEF'); my $suffix; if (!length $url) { my $proto = access_cfg('git-proto', 'RETURN-UNDEF'); return undef unless defined $proto; $url = $proto. access_gituserhost(). access_cfg('git-path'); } else { $suffix = access_cfg('git-url-suffix','RETURN-UNDEF'); } $suffix //= '.git'; return "$url/$package$suffix"; } sub commit_getclogp ($) { # Returns the parsed changelog hashref for a particular commit my ($objid) = @_; our %commit_getclogp_memo; my $memo = $commit_getclogp_memo{$objid}; return $memo if $memo; my $mclog = dgit_privdir()."clog"; runcmd shell_cmd "exec >$mclog", @git, qw(cat-file blob), "$objid:debian/changelog"; $commit_getclogp_memo{$objid} = parsechangelog("-l$mclog"); } sub parse_dscdata () { my $dscfh = new IO::File \$dscdata, '<' or confess "$!"; printdebug Dumper($dscdata) if $debuglevel>1; $dsc = parsecontrolfh($dscfh,$dscurl,1); printdebug Dumper($dsc) if $debuglevel>1; } our %rmad; sub archive_query ($;@) { my ($method) = shift @_; fail __ "this operation does not support multiple comma-separated suites" if $isuite =~ m/,/; my $query = access_cfg('archive-query','RETURN-UNDEF'); $query =~ s/^(\w+):// or badcfg "invalid archive-query method \`$query'"; my $proto = $1; my $data = $'; #'; { no strict qw(refs); &{"${method}_${proto}"}($proto,$data,@_); } } sub archive_query_prepend_mirror { my $m = access_cfg('mirror'); return map { [ $_->[0], $m.$_->[1], @$_[2..$#$_] ] } @_; } 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 cfg_apply_map ($$$) { my ($varref, $what, $mapspec) = @_; return unless $mapspec; printdebug "config $what EVAL{ $mapspec; }\n"; $_ = $$varref; eval "package Dgit::Config; $mapspec;"; die $@ if $@; $$varref = $_; } sub url_fetch ($;@) { my ($url, %xopts) = @_; # Ok404 => 1 means give undef for 404 # AccessBase => 'archive-query' (eg) # CurlOpts => { key => value } my $curl = WWW::Curl::Easy->new; my $setopt = sub { my ($k,$v) = @_; my $x = $curl->setopt($k, $v); confess "$k $v ".$curl->strerror($x)." ?" if $x; }; my $response_body = ''; $setopt->(CURLOPT_FOLLOWLOCATION, 1); $setopt->(CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS|CURLPROTO_HTTP); $setopt->(CURLOPT_URL, $url); $setopt->(CURLOPT_NOSIGNAL, 1); $setopt->(CURLOPT_WRITEDATA, \$response_body); my $xcurlopts = $xopts{CurlOpts} // { }; keys %$xcurlopts; while (my ($k,$v) = each %$xcurlopts) { $setopt->($k,$v); } if ($xopts{AccessBase} && $url =~ m#^https://([-.0-9a-z]+)/#) { foreach my $k ("$xopts{AccessBase}-tls-key", "$xopts{AccessBase}-tls-curl-ca-args") { fail "config option $k is obsolete and no longer supported" if defined access_cfg($k, 'RETURN-UNDEF'); } } printdebug "query: fetching $url...\n"; local $SIG{PIPE} = 'IGNORE'; my $x = $curl->perform(); fail f_ "fetch of %s failed (%s): %s", $url, $curl->strerror($x), $curl->errbuf if $x; my $code = $curl->getinfo(CURLINFO_HTTP_CODE); if ($code eq '404' && $xopts{Ok404}) { return undef; } fail f_ "fetch of %s gave HTTP code %s", $url, $code unless $url =~ m#^file://# or $code =~ m/^2/; confess unless defined $response_body; return $response_body; } #---------- `ftpmasterapi' archive query method (nascent) ---------- sub api_query_raw ($;$) { my ($subpath, $ok404) = @_; my $url = access_cfg('archive-query-url'); $url .= $subpath; return url_fetch $url, Ok404 => $ok404, AccessBase => 'archive-query'; } sub api_query ($$;$) { my ($data, $subpath, $ok404) = @_; use JSON; badcfg __ "ftpmasterapi archive query method takes no data part" if length $data; my $json = api_query_raw $subpath, $ok404; return undef unless defined $json; 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 f_ "unknown suite %s, maybe -d would help", $isuite unless @matched; my $cn; eval { @matched==1 or die f_ "multiple matches for suite %s\n", $isuite; $cn = "$matched[0]{codename}"; defined $cn or die f_ "suite %s info has no codename\n", $isuite; $cn =~ m/^$suite_re$/ or die f_ "suite %s maps to bad codename\n", $isuite; }; 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 f_ "bad version: %s\n", $msg 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 archive_query_prepend_mirror @rows; } sub file_in_archive_ftpmasterapi { my ($proto,$data,$filename) = @_; my $pat = $filename; $pat =~ s/_/\\_/g; $pat = "%/$pat"; $pat =~ s#[^-+_.0-9a-z/]# sprintf '%%%02x', ord $& #ge; my $info = api_query($data, "file_in_archive/$pat", 1); } sub package_not_wholly_new_ftpmasterapi { my ($proto,$data,$pkg) = @_; my $info = api_query($data,"madison?package=${pkg}&f=json"); return !!@$info; } #---------- `aptget' archive query method ---------- our $aptget_base; our $aptget_releasefile; our $aptget_configpath; sub aptget_aptget () { return @aptget, qw(-c), $aptget_configpath; } sub aptget_aptcache () { return @aptcache, qw(-c), $aptget_configpath; } sub aptget_cache_clean { runcmd_ordryrun_local qw(sh -ec), 'cd "$1"; find -atime +30 -type f -print0 | xargs -0r rm --', 'x', $aptget_base; } sub aptget_lock_acquire () { my $lockfile = "$aptget_base/lock"; open APTGET_LOCK, '>', $lockfile or confess "open $lockfile: $!"; flock APTGET_LOCK, LOCK_EX or confess "lock $lockfile: $!"; } sub aptget_prep ($) { my ($data) = @_; return if defined $aptget_base; badcfg __ "aptget archive query method takes no data part" if length $data; my $cache = $ENV{XDG_CACHE_DIR} // "$ENV{HOME}/.cache"; ensuredir $cache; ensuredir "$cache/dgit"; my $cachekey = access_cfg('aptget-cachekey','RETURN-UNDEF') // access_nomdistro(); $aptget_base = "$cache/dgit/aptget"; ensuredir $aptget_base; my $quoted_base = $aptget_base; confess "$quoted_base contains bad chars, cannot continue" if $quoted_base =~ m/["\\]/; # apt.conf(5) says no escaping :-/ ensuredir $aptget_base; aptget_lock_acquire(); aptget_cache_clean(); $aptget_configpath = "$aptget_base/apt.conf#$cachekey"; my $sourceslist = "source.list#$cachekey"; my $aptsuites = $isuite; cfg_apply_map(\$aptsuites, 'suite map', access_cfg('aptget-suite-map', 'RETURN-UNDEF')); open SRCS, ">", "$aptget_base/$sourceslist" or confess "$!"; printf SRCS "deb-src %s %s %s\n", access_cfg('mirror'), $aptsuites, access_cfg('aptget-components') or confess "$!"; ensuredir "$aptget_base/cache"; ensuredir "$aptget_base/lists"; open CONF, ">", $aptget_configpath or confess "$!"; print CONF <) { next unless stat_exists $oldlist; my ($mtime) = (stat _)[9]; utime $oldatime, $mtime, $oldlist or die "$oldlist $!"; } runcmd_ordryrun_local aptget_aptget(), qw(update); my @releasefiles; foreach my $oldlist (<$aptget_base/lists/*Release>) { next unless stat_exists $oldlist; my ($atime) = (stat _)[8]; next if $atime == $oldatime; push @releasefiles, $oldlist; } my @inreleasefiles = grep { m#/InRelease$# } @releasefiles; @releasefiles = @inreleasefiles if @inreleasefiles; if (!@releasefiles) { fail f_ <{$name}; if (defined $val) { printdebug "release file $name: $val\n"; cfg_apply_map(\$val, 'suite rmap', access_cfg('aptget-suite-rmap', 'RETURN-UNDEF')); $val =~ m/^$suite_re$/o or fail f_ "Release file (%s) specifies intolerable %s", $aptget_releasefile, $name; return $val } } return $isuite; } sub archive_query_aptget { my ($proto,$data) = @_; aptget_prep($data); ensuredir "$aptget_base/source"; foreach my $old (<$aptget_base/source/*.dsc>) { unlink $old or die "$old: $!"; } my $showsrc = cmdoutput aptget_aptcache(), qw(showsrc), $package; return () unless $showsrc =~ m/^package:\s*\Q$package\E\s*$/mi; # avoids apt-get source failing with ambiguous error code runcmd_ordryrun_local shell_cmd 'cd "$1"/source; shift', $aptget_base, aptget_aptget(), qw(--download-only --only-source source), $package; my @dscs = <$aptget_base/source/*.dsc>; fail __ "apt-get source did not produce a .dsc" unless @dscs; fail f_ "apt-get source produced several .dscs (%s)", "@dscs" unless @dscs==1; my $pre_dsc = parsecontrol $dscs[0], $dscs[0], 1; use URI::Escape; my $uri = "file://". uri_escape $dscs[0]; $uri =~ s{\%2f}{/}gi; return [ (getfield $pre_dsc, 'Version'), $uri ]; } sub file_in_archive_aptget () { return undef; } sub package_not_wholly_new_aptget () { return undef; } #---------- `dummyapicat' archive query method ---------- # (untranslated, because this is for testing purposes etc.) sub archive_query_dummycatapi { archive_query_ftpmasterapi @_; } sub canonicalise_suite_dummycatapi { canonicalise_suite_ftpmasterapi @_; } sub dummycatapi_run_in_mirror ($@) { # runs $fn with FIA open onto rune my ($rune, $argl, $fn) = @_; my $mirror = access_cfg('mirror'); $mirror =~ s#^file://#/# or die "$mirror ?"; my @cmd = (qw(sh -ec), 'cd "$1"; shift'."\n".$rune, qw(x), $mirror, @$argl); debugcmd "-|", @cmd; open FIA, "-|", @cmd or confess "$!"; my $r = $fn->(); close FIA or ($!==0 && $?==141) or die failedcmd @cmd; return $r; } sub file_in_archive_dummycatapi ($$$) { my ($proto,$data,$filename) = @_; my @out; dummycatapi_run_in_mirror ' find -name "$1" -print0 | xargs -0r sha256sum ', [$filename], sub { while () { chomp or die; printdebug "| $_\n"; m/^(\w+) (\S+)$/ or die "$_ ?"; push @out, { sha256sum => $1, filename => $2 }; } }; return \@out; } sub package_not_wholly_new_dummycatapi { my ($proto,$data,$pkg) = @_; dummycatapi_run_in_mirror " find -name ${pkg}_*.dsc ", [], sub { local $/ = undef; !!; }; } #---------- `madison' archive query method ---------- sub archive_query_madison { return archive_query_prepend_mirror map { [ @$_[0..1] ] } madison_get_parse(@_); } sub madison_get_parse { my ($proto,$data) = @_; die unless $proto eq 'madison'; if (!length $data) { $data= access_cfg('madison-distro','RETURN-UNDEF'); $data //= access_basedistro(); } $rmad{$proto,$data,$package} ||= cmdoutput qw(rmadison -asource),"-s$isuite","-u$data",$package; my $rmad = $rmad{$proto,$data,$package}; my @out; foreach my $l (split /\n/, $rmad) { $l =~ m{^ \s*( [^ \t|]+ )\s* \| \s*( [^ \t|]+ )\s* \| \s*( [^ \t|/]+ )(?:/([^ \t|/]+))? \s* \| \s*( [^ \t|]+ )\s* }x or die "$rmad ?"; $1 eq $package or die "$rmad $package ?"; my $vsn = $2; my $newsuite = $3; my $component; if (defined $4) { $component = $4; } else { $component = access_cfg('archive-query-default-component'); } $5 eq 'source' or die "$rmad ?"; push @out, [$vsn,pool_dsc_subpath($vsn,$component),$newsuite]; } return sort { -version_compare($a->[0],$b->[0]); } @out; } sub canonicalise_suite_madison { # madison canonicalises for us my @r = madison_get_parse(@_); @r or fail f_ "unable to canonicalise suite using package %s". " which does not appear to exist in suite %s;". " --existing-package may help", $package, $isuite; return $r[0][2]; } sub file_in_archive_madison { return undef; } sub package_not_wholly_new_madison { return undef; } #---------- `sshpsql' archive query method ---------- # (untranslated, because this is obsolete) sub sshpsql ($$$) { my ($data,$runeinfo,$sql) = @_; if (!length $data) { $data= access_someuserhost('sshpsql').':'. access_cfg('sshpsql-dbname'); } $data =~ m/:/ or badcfg "invalid sshpsql method string \`$data'"; my ($userhost,$dbname) = ($`,$'); #'; my @rows; my @cmd = (access_cfg_ssh, $userhost, access_runeinfo("ssh-psql $runeinfo"). " export LC_MESSAGES=C; export LC_CTYPE=C;". " ".shellquote qw(psql -A), $dbname, qw(-c), $sql); debugcmd "|",@cmd; open P, "-|", @cmd or confess "$!"; while (

) { chomp or die; printdebug(">|$_|\n"); push @rows, $_; } $!=0; $?=0; close P or failedcmd @cmd; @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{[^-+=:_.,/0-9a-zA-Z]}; } } sub archive_query_sshpsql ($$) { my ($proto,$data) = @_; sql_injection_check $isuite, $package; my @rows = sshpsql($data, "archive-query $isuite $package", <[0],$b->[0]) } @rows; my $digester = Digest::SHA->new(256); @rows = map { my ($vsn,$component,$filename,$sha256sum) = @$_; [ $vsn, "/pool/$component/$filename",$digester,$sha256sum ]; } @rows; return archive_query_prepend_mirror @rows; } sub canonicalise_suite_sshpsql ($$) { my ($proto,$data) = @_; sql_injection_check $isuite; my @rows = sshpsql($data, "canonicalise-suite $isuite", <[0] } @rows; fail "unknown suite $isuite" unless @rows; die "ambiguous $isuite: @rows ?" if @rows>1; return $rows[0]; } sub file_in_archive_sshpsql ($$$) { return undef; } sub package_not_wholly_new_sshpsql ($$$) { return undef; } #---------- `dummycat' archive query method ---------- # (untranslated, because this is for testing purposes etc.) 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; $_ = ; 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 () { 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 archive_query_prepend_mirror sort { -version_compare($a->[0],$b->[0]); } @rows; } sub file_in_archive_dummycat () { return undef; } sub package_not_wholly_new_dummycat () { return undef; } #---------- archive query entrypoints and rest of program ---------- sub canonicalise_suite () { return if defined $csuite; fail f_ "cannot operate on %s suite", $isuite if $isuite eq 'UNRELEASED'; $csuite = archive_query('canonicalise_suite'); if ($isuite ne $csuite) { progress f_ "canonical suite name for %s is %s", $isuite, $csuite; } else { progress f_ "canonical suite name is %s", $csuite; } } sub get_archive_dsc () { canonicalise_suite(); my @vsns = archive_query('archive_query'); foreach my $vinfo (@vsns) { my ($vsn,$vsn_dscurl,$digester,$digest) = @$vinfo; $dscurl = $vsn_dscurl; $dscdata = url_fetch($dscurl, Ok404 => 1 ); if (!$dscdata) { $skew_warning_vsn = $vsn if !defined $skew_warning_vsn; next; } if ($digester) { $digester->reset(); $digester->add($dscdata); my $got = $digester->hexdigest(); $got eq $digest or fail f_ "%s has hash %s but archive told us to expect %s", $dscurl, $got, $digest; } parse_dscdata(); my $fmt = getfield $dsc, 'Format'; $format_ok{$fmt} or forceable_fail [qw(unsupported-source-format)], f_ "unsupported source format %s, sorry", $fmt; $dsc_checked = !!$digester; printdebug "get_archive_dsc: Version ".(getfield $dsc, 'Version')."\n"; return; } $dsc = undef; printdebug "get_archive_dsc: nothing in archive, returning undef\n"; } sub check_for_git (); sub check_for_git () { # returns 0 or 1 my $how = access_cfg('git-check'); if ($how eq 'ssh-cmd') { my @cmd = (access_cfg_ssh, access_gituserhost(), access_runeinfo("git-check $package"). " set -e; cd ".access_cfg('git-path').";". " if test -d $package.git; then echo 1; else echo 0; fi"); my $r= cmdoutput @cmd; if (defined $r and $r =~ m/^divert (\w+)$/) { my $divert=$1; my ($usedistro,) = access_distros(); # NB that if we are pushing, $usedistro will be $distro/push $instead_distro= cfg("dgit-distro.$usedistro.diverts.$divert"); $instead_distro =~ s{^/}{ access_basedistro()."/" }e; progress f_ "diverting to %s (using config for %s)", $divert, $instead_distro; return check_for_git(); } failedcmd @cmd unless defined $r and $r =~ m/^[01]$/; return $r+0; } elsif ($how eq 'url') { my $prefix = access_cfg('git-check-url','git-url'); my $suffix = access_cfg('git-check-suffix','git-suffix', 'RETURN-UNDEF') // '.git'; my $url = "$prefix/$package$suffix"; my $result = url_fetch $url, CurlOpts => { CURLOPT_NOBODY() => 1 }, Ok404 => 1, AccessBase => 'git-check'; $result = defined $result; printdebug "dgit-repos check_for_git => $result.\n"; return $result; } elsif ($how eq 'true') { return 1; } elsif ($how eq 'false') { return 0; } else { badcfg f_ "unknown git-check \`%s'", $how; } } sub create_remote_git_repo () { my $how = access_cfg('git-create'); if ($how eq 'ssh-cmd') { runcmd_ordryrun (access_cfg_ssh, access_gituserhost(), access_runeinfo("git-create $package"). "set -e; cd ".access_cfg('git-path').";". " cp -a _template $package.git"); } elsif ($how eq 'true') { # nothing to do } else { badcfg f_ "unknown git-create \`%s'", $how; } } our ($dsc_hash,$lastpush_mergeinput); our ($dsc_distro, $dsc_hint_tag, $dsc_hint_url); sub prep_ud () { dgit_privdir(); # ensures that $dgit_privdir_made is based on $maindir $playground = fresh_playground 'dgit/unpack'; } sub mktree_in_ud_here () { playtree_setup(); } sub git_write_tree () { my $tree = cmdoutput @git, qw(write-tree); $tree =~ m/^\w+$/ or die "$tree ?"; return $tree; } sub git_add_write_tree () { runcmd @git, qw(add -Af .); return git_write_tree(); } sub remove_stray_gits ($) { my ($what) = @_; my @gitscmd = qw(find -name .git -prune -print0); debugcmd "|",@gitscmd; open GITS, "-|", @gitscmd or confess "$!"; { local $/="\0"; while () { chomp or die; print STDERR f_ "%s: warning: removing from %s: %s\n", $us, $what, (messagequote $_); rmtree $_; } } $!=0; $?=0; close GITS or failedcmd @gitscmd; } sub mktree_in_ud_from_only_subdir ($;$) { my ($what,$raw) = @_; # changes into the subdir my (@dirs) = <*/.>; confess "expected one subdir but found @dirs ?" unless @dirs==1; $dirs[0] =~ m#^([^/]+)/\.$# or die; my $dir = $1; changedir $dir; remove_stray_gits($what); mktree_in_ud_here(); if (!$raw) { my ($format, $fopts) = get_source_format(); if (madformat($format)) { rmtree '.pc'; } } my $tree=git_add_write_tree(); return ($tree,$dir); } our @files_csum_info_fields = (['Checksums-Sha256','Digest::SHA', 'new(256)', 'sha256sum'], ['Checksums-Sha1', 'Digest::SHA', 'new(1)', 'sha1sum'], ['Files', 'Digest::MD5', 'new()', 'md5sum']); sub dsc_files_info () { foreach my $csumi (@files_csum_info_fields) { my ($fname, $module, $method) = @$csumi; my $field = $dsc->{$fname}; next unless defined $field; eval "use $module; 1;" or die $@; my @out; foreach (split /\n/, $field) { next unless m/\S/; m/^(\w+) (\d+) (\S+)$/ or fail f_ "could not parse .dsc %s line \`%s'", $fname, $_; my $digester = eval "$module"."->$method;" or die $@; push @out, { Hash => $1, Bytes => $2, Filename => $3, Digester => $digester, }; } return @out; } fail f_ "missing any supported Checksums-* or Files field in %s", $dsc->get_option('name'); } sub dsc_files () { map { $_->{Filename} } dsc_files_info(); } sub files_compare_inputs (@) { my $inputs = \@_; my %record; my %fchecked; my $showinputs = sub { return join "; ", map { $_->get_option('name') } @$inputs; }; foreach my $in (@$inputs) { my $expected_files; my $in_name = $in->get_option('name'); printdebug "files_compare_inputs $in_name\n"; foreach my $csumi (@files_csum_info_fields) { my ($fname) = @$csumi; printdebug "files_compare_inputs $in_name $fname\n"; my $field = $in->{$fname}; next unless defined $field; my @files; foreach (split /\n/, $field) { next unless m/\S/; my ($info, $f) = m/^(\w+ \d+) (?:\S+ \S+ )?(\S+)$/ or fail "could not parse $in_name $fname line \`$_'"; printdebug "files_compare_inputs $in_name $fname $f\n"; push @files, $f; my $re = \ $record{$f}{$fname}; if (defined $$re) { $fchecked{$f}{$in_name} = 1; $$re eq $info or fail f_ "hash or size of %s varies in %s fields (between: %s)", $f, $fname, $showinputs->(); } else { $$re = $info; } } @files = sort @files; $expected_files //= \@files; "@$expected_files" eq "@files" or fail f_ "file list in %s varies between hash fields!", $in_name; } $expected_files or fail f_ "%s has no files list field(s)", $in_name; } printdebug "files_compare_inputs ".Dumper(\%fchecked, \%record) if $debuglevel>=2; grep { keys %$_ == @$inputs-1 } values %fchecked or fail f_ "no file appears in all file lists (looked in: %s)", $showinputs->(); } sub is_orig_file_in_dsc ($$) { my ($f, $dsc_files_info) = @_; return 0 if @$dsc_files_info <= 1; # One file means no origs, and the filename doesn't have a "what # part of dsc" component. (Consider versions ending `.orig'.) return 0 unless $f =~ m/\.$orig_f_tail_re$/o; return 1; } # This function determines whether a .changes file is source-only from # the point of view of dak. Thus, it permits *_source.buildinfo # files. # # It does not, however, permit any other buildinfo files. After a # source-only upload, the buildds will try to upload files like # foo_1.2.3_amd64.buildinfo. If the package maintainer included files # named like this in their (otherwise) source-only upload, the uploads # of the buildd can be rejected by dak. Fixing the resultant # situation can require manual intervention. So we block such # .buildinfo files when the user tells us to perform a source-only # upload (such as when using the push-source subcommand with the -C # option, which calls this function). # # Note, though, that when dgit is told to prepare a source-only # upload, such as when subcommands like build-source and push-source # without -C are used, dgit has a more restrictive notion of # source-only .changes than dak: such uploads will never include # *_source.buildinfo files. This is because there is no use for such # files when using a tool like dgit to produce the source package, as # dgit ensures the source is identical to git HEAD. sub test_source_only_changes ($) { my ($changes) = @_; foreach my $l (split /\n/, getfield $changes, 'Files') { $l =~ m/\S+$/ or next; # \.tar\.[a-z0-9]+ covers orig.tar and the tarballs in native packages $_ = $&; next if m/(?:\.dsc|\.diff\.gz|$tarball_f_ext_re)$/; next if m/_source\.buildinfo$/; print STDERR f_ "purportedly source-only changes polluted by %s\n", $&; return 0; } return 1; } sub changes_update_origs_from_dsc ($$$$) { my ($dsc, $changes, $upstreamvsn, $changesfile) = @_; my %changes_f; printdebug "checking origs needed ($upstreamvsn)...\n"; $_ = getfield $changes, 'Files'; m/^\w+ \d+ (\S+ \S+) \S+$/m or fail __ "cannot find section/priority from .changes Files field"; my $placementinfo = $1; my %changed; printdebug "checking origs needed placement '$placementinfo'...\n"; foreach my $l (split /\n/, getfield $dsc, 'Files') { $l =~ m/\S+$/ or next; my $file = $&; printdebug "origs $file | $l\n"; next unless is_orig_file_of_vsn $file, $upstreamvsn; printdebug "origs $file is_orig\n"; my $have = archive_query('file_in_archive', $file); if (!defined $have) { print STDERR __ <{$archivefield}; $_ = $dsc->{$fname}; next unless defined; m/^(\w+) .* \Q$file\E$/m or fail f_ ".dsc %s missing entry for %s", $fname, $file; if ($h->{$archivefield} eq $1) { $same++; } else { push @differ, f_ "%s: %s (archive) != %s (local .dsc)", $archivefield, $h->{$archivefield}, $1; } } confess "$file ".Dumper($h)." ?!" if $same && @differ; $found_same++ if $same; push @found_differ, f_ "archive %s: %s", $h->{filename}, join "; ", @differ if @differ; } printdebug "origs $file f.same=$found_same". " #f._differ=$#found_differ\n"; if (@found_differ && !$found_same) { fail join "\n", (f_ "archive contains %s with different checksum", $file), @found_differ; } # Now we edit the changes file to add or remove it foreach my $csumi (@files_csum_info_fields) { my ($fname, $module, $method, $archivefield) = @$csumi; next unless defined $changes->{$fname}; if ($found_same) { # in archive, delete from .changes if it's there $changed{$file} = "removed" if $changes->{$fname} =~ s/\n.* \Q$file\E$(?:)$//m; } elsif ($changes->{$fname} =~ m/^.* \Q$file\E$(?:)$/m) { # not in archive, but it's here in the .changes } else { my $dsc_data = getfield $dsc, $fname; $dsc_data =~ m/^(.* \Q$file\E$)$/m or die "$dsc_data $file ?"; my $extra = $1; $extra =~ s/ \d+ /$&$placementinfo / or confess "$fname $extra >$dsc_data< ?" if $fname eq 'Files'; $changes->{$fname} .= "\n". $extra; $changed{$file} = "added"; } } } if (%changed) { foreach my $file (keys %changed) { progress f_ "edited .changes for archive .orig contents: %s %s", $changed{$file}, $file; } my $chtmp = "$changesfile.tmp"; $changes->save($chtmp); if (act_local()) { rename $chtmp,$changesfile or die "$changesfile $!"; } else { progress f_ "[new .changes left in %s]", $changesfile; } } else { progress f_ "%s already has appropriate .orig(s) (if any)", $changesfile; } } sub clogp_authline ($) { my ($clogp) = @_; my $author = getfield $clogp, 'Maintainer'; if ($author =~ m/^[^"\@]+\,/) { # single entry Maintainer field with unquoted comma $author = ($& =~ y/,//rd).$'; # strip the comma } # git wants a single author; any remaining commas in $author # are by now preceded by @ (or "). It seems safer to punt on # "..." for now rather than attempting to dequote or something. $author =~ s#,.*##ms unless $author =~ m/"/; my $date = cmdoutput qw(date), '+%s %z', qw(-d), getfield($clogp,'Date'); my $authline = "$author $date"; $authline =~ m/$git_authline_re/o or fail f_ "unexpected commit author line format \`%s'". " (was generated from changelog Maintainer field)", $authline; return ($1,$2,$3) if wantarray; return $authline; } sub vendor_patches_distro ($$) { my ($checkdistro, $what) = @_; return unless defined $checkdistro; my $series = "debian/patches/\L$checkdistro\E.series"; printdebug "checking for vendor-specific $series ($what)\n"; if (!open SERIES, "<", $series) { confess "$series $!" unless $!==ENOENT; return; } while () { next unless m/\S/; next if m/^\s+\#/; print STDERR __ <error; close SERIES; } sub check_for_vendor_patches () { # This dpkg-source feature doesn't seem to be documented anywhere! # But it can be found in the changelog (reformatted): # commit 4fa01b70df1dc4458daee306cfa1f987b69da58c # Author: Raphael Hertzog # Date: Sun Oct 3 09:36:48 2010 +0200 # dpkg-source: correctly create .pc/.quilt_series with alternate # series files # # If you have debian/patches/ubuntu.series and you were # unpacking the source package on ubuntu, quilt was still # directed to debian/patches/series instead of # debian/patches/ubuntu.series. # # debian/changelog | 3 +++ # scripts/Dpkg/Source/Package/V3/quilt.pm | 4 +++- # 2 files changed, 6 insertions(+), 1 deletion(-) use Dpkg::Vendor; vendor_patches_distro($ENV{DEB_VENDOR}, "DEB_VENDOR"); vendor_patches_distro(Dpkg::Vendor::get_current_vendor(), __ "Dpkg::Vendor \`current vendor'"); vendor_patches_distro(access_basedistro(), __ "(base) distro being accessed"); vendor_patches_distro(access_nomdistro(), __ "(nominal) distro being accessed"); } sub check_bpd_exists () { stat $buildproductsdir or fail f_ "build-products-dir %s is not accessible: %s\n", $buildproductsdir, $!; } sub dotdot_bpd_transfer_origs ($$$) { my ($bpd_abs, $upstreamversion, $wanted) = @_; # checks is_orig_file_of_vsn and if # calls $wanted->{$leaf} and expects boolish my $dotdot = $maindir; $dotdot =~ s{/[^/]+$}{}; my %dupes; my $dupe_scan = sub { my ($dir, $why_token) = @_; if (!opendir SD, $dir) { return if $! == ENOENT; fail "opendir $why_token ($dir): $!"; } while ($!=0, defined(my $leaf = readdir SD)) { next unless is_orig_file_of_vsn $leaf, $upstreamversion; next if $leaf =~ m{$orig_f_sig_re$}; next unless $leaf =~ m{\.tar(?:\.\w+)?$}; my $base = "$`.tar"; push @{ $dupes{$base}{$leaf} }, [$why_token, $dir]; } die "$dir; $!" if $!; }; $dupe_scan->($dotdot, ".."); $dupe_scan->(bpd_abs(), 'build-products-dir') if $buildproductsdir ne '..'; my $dupes_found = 0; foreach my $base (sort keys %dupes) { my $leaves = $dupes{$base}; next if keys(%$leaves) == 1; $dupes_found = 1; print STDERR f_ "%s: multiple representations of similar orig %s:\n", $us, $base; foreach my $leaf (keys %$leaves) { foreach my $found (@{ $leaves->{$leaf} }) { print STDERR f_ " %s: in %s (%s)\n", $leaf, @$found; } } } fail __ "Duplicate/inconsistent orig tarballs. Delete the spurious ones." if $dupes_found; return if $buildproductsdir eq '..'; my $warned; opendir DD, $dotdot or fail "opendir .. ($dotdot): $!"; while ($!=0, defined(my $leaf = readdir DD)) { { local ($debuglevel) = $debuglevel-1; printdebug "DD_BPD $leaf ?\n"; } next unless is_orig_file_of_vsn $leaf, $upstreamversion; next unless $wanted->($leaf); next if lstat "$bpd_abs/$leaf"; print STDERR f_ "%s: found orig(s) in .. missing from build-products-dir, transferring:\n", $us unless $warned++; $! == &ENOENT or fail f_ "check orig file %s in bpd %s: %s", $leaf, $bpd_abs, $!; lstat "$dotdot/$leaf" or fail f_ "check orig file %s in ..: %s", $leaf, $!; if (-l _) { stat "$dotdot/$leaf" or fail f_ "check target of orig symlink %s in ..: %s", $leaf, $!; my $ltarget = readlink "$dotdot/$leaf" or die "readlink $dotdot/$leaf: $!"; if ($ltarget !~ m{^/}) { $ltarget = "$dotdot/$ltarget"; } symlink $ltarget, "$bpd_abs/$leaf" or die "$ltarget $bpd_abs $leaf: $!"; print STDERR f_ "%s: cloned orig symlink from ..: %s\n", $us, $leaf; } elsif (link "$dotdot/$leaf", "$bpd_abs/$leaf") { print STDERR f_ "%s: hardlinked orig from ..: %s\n", $us, $leaf; } elsif ($! != EXDEV) { fail f_ "failed to make %s a hardlink to %s: %s", "$bpd_abs/$leaf", "$dotdot/$leaf", $!; } else { symlink "$bpd_abs/$leaf", "$dotdot/$leaf" or die "$bpd_abs $dotdot $leaf $!"; print STDERR f_ "%s: symmlinked orig from .. on other filesystem: %s\n", $us, $leaf; } } die "$dotdot; $!" if $!; closedir DD; } sub import_tarball_tartrees ($$) { my ($upstreamv, $dfi) = @_; # cwd should be the playground # We unpack and record the orig tarballs first, so that we only # need disk space for one private copy of the unpacked source. # But we can't make them into commits until we have the metadata # from the debian/changelog, so we record the tree objects now and # make them into commits later. my @tartrees; my $orig_f_base = srcfn $upstreamv, ''; foreach my $fi (@$dfi) { # We actually import, and record as a commit, every tarball # (unless there is only one file, in which case there seems # little point. my $f = $fi->{Filename}; printdebug "import considering $f "; (printdebug "not tar\n"), next unless $f =~ m/\.tar(\.\w+)?$/; (printdebug "signature\n"), next if $f =~ m/$orig_f_sig_re$/o; my $compr_ext = $1; my ($orig_f_part) = $f =~ m/^\Q$orig_f_base\E\.([^._]+)?\.tar(?:\.\w+)?$/; printdebug "Y ", (join ' ', map { $_//"(none)" } $compr_ext, $orig_f_part ), "\n"; my $path = $fi->{Path} // $f; my $input = new IO::File $f, '<' or die "$f $!"; my $compr_pid; my @compr_cmd; if (defined $compr_ext) { my $cname = Dpkg::Compression::compression_guess_from_filename $f; fail "Dpkg::Compression cannot handle file $f in source package" if defined $compr_ext && !defined $cname; my $compr_proc = new Dpkg::Compression::Process compression => $cname; @compr_cmd = $compr_proc->get_uncompress_cmdline(); my $compr_fh = new IO::Handle; my $compr_pid = open $compr_fh, "-|" // confess "$!"; if (!$compr_pid) { open STDIN, "<&", $input or confess "$!"; exec @compr_cmd; die "dgit (child): exec $compr_cmd[0]: $!\n"; } $input = $compr_fh; } rmtree "_unpack-tar"; mkdir "_unpack-tar" or confess "$!"; my @tarcmd = qw(tar -x -f - --no-same-owner --no-same-permissions --no-acls --no-xattrs --no-selinux); my $tar_pid = fork // confess "$!"; if (!$tar_pid) { chdir "_unpack-tar" or confess "$!"; open STDIN, "<&", $input or confess "$!"; exec @tarcmd; die f_ "dgit (child): exec %s: %s", $tarcmd[0], $!; } $!=0; (waitpid $tar_pid, 0) == $tar_pid or confess "$!"; !$? or failedcmd @tarcmd; close $input or (@compr_cmd ? ($?==SIGPIPE || failedcmd @compr_cmd) : confess "$!"); # finally, we have the results in "tarball", but maybe # with the wrong permissions runcmd qw(chmod -R +rwX _unpack-tar); changedir "_unpack-tar"; remove_stray_gits($f); mktree_in_ud_here(); my ($tree) = git_add_write_tree(); my $tentries = cmdoutput @git, qw(ls-tree -z), $tree; if ($tentries =~ m/^\d+ tree (\w+)\t[^\000]+\000$/s) { $tree = $1; printdebug "one subtree $1\n"; } else { printdebug "multiple subtrees\n"; } changedir ".."; rmtree "_unpack-tar"; my $ent = [ $f, $tree ]; push @tartrees, { Orig => !!$orig_f_part, Sort => (!$orig_f_part ? 2 : $orig_f_part =~ m/-/g ? 1 : 0), OrigPart => $orig_f_part, # 'orig', 'orig-XXX', or undef F => $f, Tree => $tree, }; } @tartrees = sort { # put any without "_" first (spec is not clear whether files # are always in the usual order). Tarballs without "_" are # the main orig or the debian tarball. $a->{Sort} <=> $b->{Sort} or $a->{F} cmp $b->{F} } @tartrees; @tartrees; } sub import_tarball_commits ($$) { my ($tartrees, $upstreamv) = @_; # cwd should be a playtree which has a relevant debian/changelog # fills in $tt->{Commit} for each one my $any_orig = grep { $_->{Orig} } @$tartrees; my @clogcmd = qw(dpkg-parsechangelog --format rfc822 --all); my $clogp; my $r1clogp; printdebug "import clog search...\n"; parsechangelog_loop \@clogcmd, (__ "package changelog"), sub { my ($thisstanza, $desc) = @_; no warnings qw(exiting); $clogp //= $thisstanza; printdebug "import clog $thisstanza->{version} $desc...\n"; last if !$any_orig; # we don't need $r1clogp # We look for the first (most recent) changelog entry whose # version number is lower than the upstream version of this # package. Then the last (least recent) previous changelog # entry is treated as the one which introduced this upstream # version and used for the synthetic commits for the upstream # tarballs. # One might think that a more sophisticated algorithm would be # necessary. But: we do not want to scan the whole changelog # file. Stopping when we see an earlier version, which # necessarily then is an earlier upstream version, is the only # realistic way to do that. Then, either the earliest # changelog entry we have seen so far is indeed the earliest # upload of this upstream version; or there are only changelog # entries relating to later upstream versions (which is not # possible unless the changelog and .dsc disagree about the # version). Then it remains to choose between the physically # last entry in the file, and the one with the lowest version # number. If these are not the same, we guess that the # versions were created in a non-monotonic order rather than # that the changelog entries have been misordered. printdebug "import clog $thisstanza->{version} vs $upstreamv...\n"; last if version_compare($thisstanza->{version}, $upstreamv) < 0; $r1clogp = $thisstanza; printdebug "import clog $r1clogp->{version} becomes r1\n"; }; $clogp or fail __ "package changelog has no entries!"; my $authline = clogp_authline $clogp; my $changes = getfield $clogp, 'Changes'; $changes =~ s/^\n//; # Changes: \n my $cversion = getfield $clogp, 'Version'; my $r1authline; if (@$tartrees) { $r1clogp //= $clogp; # maybe there's only one entry; $r1authline = clogp_authline $r1clogp; # Strictly, r1authline might now be wrong if it's going to be # unused because !$any_orig. Whatever. printdebug "import tartrees authline $authline\n"; printdebug "import tartrees r1authline $r1authline\n"; foreach my $tt (@$tartrees) { printdebug "import tartree $tt->{F} $tt->{Tree}\n"; # untranslated so that different people's imports are identical my $mbody = sprintf "Import %s", $tt->{F}; $tt->{Commit} = hash_commit_text($tt->{Orig} ? <{Tree} author $r1authline committer $r1authline $mbody [dgit import orig $tt->{F}] END_O tree $tt->{Tree} author $authline committer $authline $mbody [dgit import tarball $package $cversion $tt->{F}] END_T } } return ($authline, $r1authline, $clogp, $changes); } sub generate_commits_from_dsc () { # See big comment in fetch_from_archive, below. # See also README.dsc-import. prep_ud(); changedir $playground; my $bpd_abs = bpd_abs(); my $upstreamv = upstreamversion $dsc->{version}; my @dfi = dsc_files_info(); dotdot_bpd_transfer_origs $bpd_abs, $upstreamv, sub { grep { $_->{Filename} eq $_[0] } @dfi }; foreach my $fi (@dfi) { my $f = $fi->{Filename}; die "$f ?" if $f =~ m#/|^\.|\.dsc$|\.tmp$#; my $upper_f = "$bpd_abs/$f"; printdebug "considering reusing $f: "; if (link_ltarget "$upper_f,fetch", $f) { printdebug "linked (using ...,fetch).\n"; } elsif ((printdebug "($!) "), $! != ENOENT) { fail f_ "accessing %s: %s", "$buildproductsdir/$f,fetch", $!; } elsif (link_ltarget $upper_f, $f) { printdebug "linked.\n"; } elsif ((printdebug "($!) "), $! != ENOENT) { fail f_ "accessing %s: %s", "$buildproductsdir/$f", $!; } else { printdebug "absent.\n"; } my $refetched; complete_file_from_dsc('.', $fi, \$refetched) or next; printdebug "considering saving $f: "; if (!act_local()) { printdebug "no - dry run.\n"; } elsif (rename_link_xf 1, $f, $upper_f) { printdebug "linked.\n"; } elsif ((printdebug "($@) "), $! != EEXIST) { fail f_ "saving %s: %s", "$buildproductsdir/$f", $@; } elsif (!$refetched) { printdebug "no need.\n"; } elsif (rename_link_xf 1, $f, "$upper_f,fetch") { printdebug "linked (using ...,fetch).\n"; } elsif ((printdebug "($@) "), $! != EEXIST) { fail f_ "saving %s: %s", "$buildproductsdir/$f,fetch", $@; } else { printdebug "cannot.\n"; } } my @tartrees; @tartrees = import_tarball_tartrees($upstreamv, \@dfi) unless @dfi == 1; # only one file in .dsc my $dscfn = "$package.dsc"; my $treeimporthow = 'package'; open D, ">", $dscfn or die "$dscfn: $!"; print D $dscdata or die "$dscfn: $!"; close D or die "$dscfn: $!"; my @cmd = qw(dpkg-source); push @cmd, '--no-check' if $dsc_checked; if (madformat $dsc->{format}) { push @cmd, '--skip-patches'; $treeimporthow = 'unpatched'; } push @cmd, qw(-x --), $dscfn; runcmd @cmd; my ($tree,$dir) = mktree_in_ud_from_only_subdir(__ "source package"); if (madformat $dsc->{format}) { check_for_vendor_patches(); } my $dappliedtree; if (madformat $dsc->{format}) { my @pcmd = qw(dpkg-source --before-build .); runcmd shell_cmd 'exec >/dev/null', @pcmd; rmtree '.pc'; $dappliedtree = git_add_write_tree(); } my ($authline, $r1authline, $clogp, $changes) = import_tarball_commits(\@tartrees, $upstreamv); my $cversion = getfield $clogp, 'Version'; printdebug "import main commit\n"; open C, ">../commit.tmp" or confess "$!"; print C <{Commit} END print C <{format}) { printdebug "import apply patches...\n"; # regularise the state of the working tree so that # the checkout of $rawimport_hash works nicely. my $dappliedcommit = hash_commit_text(<../../absurd-apply-warnings" or die $!; close T or die $!; progress f_ "%s: trying slow absurd-git-apply...", $us; rename "../../gbp-pq-output","../../gbp-pq-output.0" or $!==ENOENT or confess "$!"; } eval { die "forbid absurd git-apply\n" if $use_absurd && forceing [qw(import-gitapply-no-absurd)]; die "only absurd git-apply!\n" if !$use_absurd && forceing [qw(import-gitapply-absurd)]; local $ENV{DGIT_ABSURD_DEBUG} = $debuglevel if $use_absurd; local $ENV{PATH} = $path if $use_absurd; if ($use_absurd) { # We filter the series file, to contain only things # that are actually requests to apply a patch. # # This is needed because sometimes a series file can # contain strange things that gbp pq cannot cope with. # Eg, form feeds. See #1030093. rename "debian/patches/series", "../series.orig" or confess "$!"; open OS, "../series.orig" or confess $!; open NS, ">debian/patches/series" or confess $!; while () { s/\#.*//; s/^\s+//; s/\s+$//; next unless m/\S/; print NS "$_\n" or confess $!; } confess $! if OS->error; close NS or confess $!; runcmd @git, qw(add debian/patches/series); # This commit is spurious, but we must commit for gbp # pq to work. We filter it out of the branch later. runcmd @git, qw(commit --quiet --allow-empty -m), </dev/null 2>../../gbp-pq-output', @showcmd; gbp_pq_pc_aside(sub { debugcmd "+",@realcmd; if (system @realcmd) { die f_ "%s failed: %s\n", +(shellquote @showcmd), failedcmd_waitstatus(); } }); if ($use_absurd) { # Perhaps we should be using git-filter-branch, # but that's really considerably more awkward. runcmd_quieten @git, qw(rebase --keep-empty --allow-empty-message --onto unpa~1 unpa); } my $gapplied = git_rev_parse('HEAD'); my $gappliedtree = cmdoutput @git, qw(rev-parse HEAD:); $gappliedtree eq $dappliedtree or fail f_ < $rawimport_hash, Info => __ "Import of source package", }; my @output = ($rawimport_mergeinput); if ($lastpush_mergeinput) { my $oldclogp = mergeinfo_getclogp($lastpush_mergeinput); my $oversion = getfield $oldclogp, 'Version'; my $vcmp = version_compare($oversion, $cversion); if ($vcmp < 0) { @output = ($rawimport_mergeinput, $lastpush_mergeinput, { ReverseParents => 1, # untranslated so that different people's pseudomerges # are not needlessly different (although they will # still differ if the series of pulls is different) Message => (sprintf < 0) { print STDERR f_ <{Filename}" # and will set $$refetched=1 if it did so (or tried to). my $f = $fi->{Filename}; my $tf = "$dstdir/$f"; my $downloaded = 0; my $got; my $checkhash = sub { open F, "<", "$tf" or die "$tf: $!"; $fi->{Digester}->reset(); $fi->{Digester}->addfile(*F); F->error and confess "$!"; $got = $fi->{Digester}->hexdigest(); return $got eq $fi->{Hash}; }; if (stat_exists $tf) { if ($checkhash->()) { progress f_ "using existing %s", $f; return 1; } if (!$refetched) { fail f_ "file %s has hash %s but .dsc demands hash %s". " (perhaps you should delete this file?)", $f, $got, $fi->{Hash}; } progress f_ "need to fetch correct version of %s", $f; unlink $tf or die "$tf $!"; $$refetched = 1; } else { printdebug "$tf does not exist, need to fetch\n"; } my $furl = $dscurl; $furl =~ s{/[^/]+$}{}; $furl .= "/$f"; die "$f ?" unless $f =~ m/^\Q${package}\E_/; die "$f ?" if $f =~ m#/#; runcmd_ordryrun_local @curl,qw(-f -o),$tf,'--',"$furl"; return 0 if !act_local(); $checkhash->() or fail f_ "file %s has hash %s but .dsc demands hash %s". " (got wrong file from archive!)", $f, $got, $fi->{Hash}; return 1; } sub ensure_we_have_orig () { my @dfi = dsc_files_info(); foreach my $fi (@dfi) { my $f = $fi->{Filename}; next unless is_orig_file_in_dsc($f, \@dfi); complete_file_from_dsc($buildproductsdir, $fi) or next; } } #---------- git fetch ---------- sub lrfetchrefs () { return "refs/dgit-fetch/".access_basedistro(); } sub lrfetchref () { return lrfetchrefs.'/'.server_branch($csuite); } # We fetch some parts of lrfetchrefs/*. Ideally we delete these # locally fetched refs because they have unhelpful names and clutter # up gitk etc. So we track whether we have "used up" head ref (ie, # whether we have made another local ref which refers to this object). # # (If we deleted them unconditionally, then we might end up # re-fetching the same git objects each time dgit fetch was run.) # # So, each use of lrfetchrefs needs to be accompanied by arrangements # in git_fetch_us to fetch the refs in question, and possibly a call # to lrfetchref_used. our (%lrfetchrefs_f, %lrfetchrefs_d); # $lrfetchrefs_X{lrfetchrefs."/heads/whatever"} = $objid sub lrfetchref_used ($) { my ($fullrefname) = @_; my $objid = $lrfetchrefs_f{$fullrefname}; $lrfetchrefs_d{$fullrefname} = $objid if defined $objid; } sub git_lrfetch_sane { my ($url, $supplementary, @specs) = @_; # Make a 'refs/'.lrfetchrefs.'/*' be just like on server, # at least as regards @specs. Also leave the results in # %lrfetchrefs_f, and arrange for lrfetchref_used to be # able to clean these up. # # With $supplementary==1, @specs must not contain wildcards # and we add to our previous fetches (non-atomically). # This is rather miserable: # When git fetch --prune is passed a fetchspec ending with a *, # it does a plausible thing. If there is no * then: # - it matches subpaths too, even if the supplied refspec # starts refs, and behaves completely madly if the source # has refs/refs/something. (See, for example, Debian #NNNN.) # - if there is no matching remote ref, it bombs out the whole # fetch. # We want to fetch a fixed ref, and we don't know in advance # if it exists, so this is not suitable. # # Our workaround is to use git ls-remote. git ls-remote has its # own qairks. Notably, it has the absurd multi-tail-matching # behaviour: git ls-remote R refs/foo can report refs/foo AND # refs/refs/foo etc. # # Also, we want an idempotent snapshot, but we have to make two # calls to the remote: one to git ls-remote and to git fetch. The # solution is use git ls-remote to obtain a target state, and # git fetch to try to generate it. If we don't manage to generate # the target state, we try again. printdebug "git_lrfetch_sane suppl=$supplementary specs @specs\n"; my $specre = join '|', map { my $x = $_; $x =~ s/\W/\\$&/g; my $wildcard = $x =~ s/\\\*$/.*/; die if $wildcard && $supplementary; "(?:refs/$x)"; } @specs; printdebug "git_lrfetch_sane specre=$specre\n"; my $wanted_rref = sub { local ($_) = @_; return m/^(?:$specre)$/; }; my $fetch_iteration = 0; FETCH_ITERATION: for (;;) { printdebug "git_lrfetch_sane iteration $fetch_iteration\n"; if (++$fetch_iteration > 10) { fail __ "too many iterations trying to get sane fetch!"; } my @look = map { "refs/$_" } @specs; my @lcmd = (@git, qw(ls-remote -q --refs), $url, @look); debugcmd "|",@lcmd; my %wantr; open GITLS, "-|", @lcmd or confess "$!"; while () { printdebug "=> ", $_; m/^(\w+)\s+(\S+)\n/ or die "ls-remote $_ ?"; my ($objid,$rrefname) = ($1,$2); if (!$wanted_rref->($rrefname)) { print STDERR f_ <($rrefname)) { printdebug <'; my $want = $wantr{$rrefname}; next if $got eq $want; if (!defined $objgot{$want}) { fail f_ <{Clogp} exists and returns it my ($mi) = @_; $mi->{Clogp} = commit_getclogp($mi->{Commit}); } sub mergeinfo_version ($) { return getfield( (mergeinfo_getclogp $_[0]), 'Version' ); } sub fetch_from_archive_record_1 ($) { my ($hash) = @_; runcmd git_update_ref_cmd "dgit fetch $csuite", 'DGIT_ARCHIVE', $hash; cmdoutput @git, qw(log -n2), $hash; # ... gives git a chance to complain if our commit is malformed } sub fetch_from_archive_record_2 ($) { my ($hash) = @_; my @upd_cmd = (git_update_ref_cmd 'dgit fetch', lrref(), $hash); if (act_local()) { cmdoutput @upd_cmd; } else { dryrun_report @upd_cmd; } } sub parse_dsc_field_def_dsc_distro () { $dsc_distro //= cfg qw(dgit.default.old-dsc-distro dgit.default.distro); } sub parse_dsc_field ($$) { my ($dsc, $what) = @_; my $f; foreach my $field (@ourdscfield) { $f = $dsc->{$field}; last if defined $f; } if (!defined $f) { progress f_ "%s: NO git hash", $what; parse_dsc_field_def_dsc_distro(); } elsif (($dsc_hash, $dsc_distro, $dsc_hint_tag, $dsc_hint_url) = $f =~ m/^(\w+)\s+($distro_re)\s+($versiontag_re)\s+(\S+)(?:\s|$)/) { progress f_ "%s: specified git info (%s)", $what, $dsc_distro; $dsc_hint_tag = [ $dsc_hint_tag ]; } elsif ($f =~ m/^\w+\s*$/) { $dsc_hash = $&; parse_dsc_field_def_dsc_distro(); $dsc_hint_tag = [ debiantags +(getfield $dsc, 'Version'), $dsc_distro ]; progress f_ "%s: specified git hash", $what; } else { fail f_ "%s: invalid Dgit info", $what; } } sub resolve_dsc_field_commit ($$) { my ($already_distro, $already_mapref) = @_; return unless defined $dsc_hash; my $mapref = defined $already_mapref && ($already_distro eq $dsc_distro || !$chase_dsc_distro) ? $already_mapref : undef; my $do_fetch; $do_fetch = sub { my ($what, @fetch) = @_; local $idistro = $dsc_distro; my $lrf = lrfetchrefs; if (!$chase_dsc_distro) { progress f_ "not chasing .dsc distro %s: not fetching %s", $dsc_distro, $what; return 0; } progress f_ ".dsc names distro %s: fetching %s", $dsc_distro, $what; my $url = access_giturl(); if (!defined $url) { defined $dsc_hint_url or fail f_ <((__ "rewrite map"), $rewritemap) or return; $mapref = $lrf.'/'.$rewritemap; } my $rewritemapdata = git_cat_file $mapref.':map'; if (defined $rewritemapdata && $rewritemapdata =~ m/^$dsc_hash(?:[ \t](\w+))/m) { progress __ "server's git history rewrite map contains a relevant entry!"; $dsc_hash = $1; if (defined $dsc_hash) { progress __ "using rewritten git hash in place of .dsc value"; } else { progress __ "server data says .dsc hash is to be disregarded"; } } } if (!defined git_cat_file $dsc_hash) { my @tags = map { "tags/".$_ } @$dsc_hint_tag; my $lrf = $do_fetch->((__ "additional commits"), @tags) && defined git_cat_file $dsc_hash or fail f_ < $lastpush_hash, Info => (__ "dgit suite branch on dgit git server"), }; my $lastfetch_hash = git_get_ref(lrref()); printdebug "fetch_from_archive: lastfetch=$lastfetch_hash\n"; my $lastfetch_mergeinput = $lastfetch_hash && { Commit => $lastfetch_hash, Info => (__ "dgit client's archive history view"), }; my $dsc_mergeinput = $dsc_hash && { Commit => $dsc_hash, Info => (__ "Dgit field in .dsc from archive"), }; my $cwd = getcwd(); my $del_lrfetchrefs = sub { changedir $cwd; my $gur; printdebug "del_lrfetchrefs...\n"; foreach my $fullrefname (sort keys %lrfetchrefs_d) { my $objid = $lrfetchrefs_d{$fullrefname}; printdebug "del_lrfetchrefs: $objid $fullrefname\n"; if (!$gur) { $gur ||= new IO::Handle; open $gur, "|-", qw(git update-ref --stdin) or confess "$!"; } printf $gur "delete %s %s\n", $fullrefname, $objid; } if ($gur) { close $gur or failedcmd "git update-ref delete lrfetchrefs"; } }; if (defined $dsc_hash) { ensure_we_have_orig(); if (!$lastpush_hash || $dsc_hash eq $lastpush_hash) { @mergeinputs = $dsc_mergeinput } elsif (is_fast_fwd($dsc_hash,$lastpush_hash)) { print STDERR f_ <{Commit}; $h and is_fast_fwd($lastfetch_hash, $h); # If true, one of the existing parents of this commit # is a descendant of the $lastfetch_hash, so we'll # be ff from that automatically. } @mergeinputs ) { # Otherwise: push @mergeinputs, $lastfetch_mergeinput; } printdebug "fetch mergeinfos:\n"; foreach my $mi (@mergeinputs) { if ($mi->{Info}) { printdebug " commit $mi->{Commit} $mi->{Info}\n"; } else { printdebug sprintf " ReverseParents=%d Message=%s", $mi->{ReverseParents}, $mi->{Message}; } } my $compat_info= pop @mergeinputs if $mergeinputs[$#mergeinputs]{Message}; @mergeinputs = grep { defined $_->{Commit} } @mergeinputs; my $hash; if (@mergeinputs > 1) { # here we go, then: my $tree_commit = $mergeinputs[0]{Commit}; my $tree = get_tree_of_commit $tree_commit;; # We use the changelog author of the package in question the # author of this pseudo-merge. This is (roughly) correct if # this commit is simply representing aa non-dgit upload. # (Roughly because it does not record sponsorship - but we # don't have sponsorship info because that's in the .changes, # which isn't in the archivw.) # # But, it might be that we are representing archive history # updates (including in-archive copies). These are not really # the responsibility of the person who created the .dsc, but # there is no-one whose name we should better use. (The # author of the .dsc-named commit is clearly worse.) my $useclogp = mergeinfo_getclogp $mergeinputs[0]; my $author = clogp_authline $useclogp; my $cversion = getfield $useclogp, 'Version'; my $mcf = dgit_privdir()."/mergecommit"; open MC, ">", $mcf or die "$mcf $!"; print MC <{Commit} } @mergeinputs; @parents = reverse @parents if $compat_info->{ReverseParents}; print MC <{Commit} END print MC <{Message}) { print MC $compat_info->{Message} or confess "$!"; } else { print MC f_ <{Info} or confess "$!"; }; $message_add_info->($mergeinputs[0]); print MC __ <($_) foreach @mergeinputs[1..$#mergeinputs]; } close MC or confess "$!"; $hash = hash_commit $mcf; } else { $hash = $mergeinputs[0]{Commit}; } printdebug "fetch hash=$hash\n"; my $chkff = sub { my ($lasth, $what) = @_; return unless $lasth; confess "$lasth $hash $what ?" unless is_fast_fwd($lasth, $hash); }; $chkff->($lastpush_hash, __ 'dgit repo server tip (last push)') if $lastpush_hash; $chkff->($lastfetch_hash, __ 'local tracking tip (last fetch)'); fetch_from_archive_record_1($hash); if (defined $skew_warning_vsn) { printdebug "SKEW CHECK WANT $skew_warning_vsn\n"; my $gotclogp = commit_getclogp($hash); my $got_vsn = getfield $gotclogp, 'Version'; printdebug "SKEW CHECK GOT $got_vsn\n"; if (version_compare($got_vsn, $skew_warning_vsn) < 0) { print STDERR f_ <", "$attrs.new" or die "$attrs.new $!"; if (!open ATTRS, "<", $attrs) { $!==ENOENT or die "$attrs: $!"; } else { while () { chomp; next if m{^debian/changelog\s}; print NATTRS $_, "\n" or confess "$!"; } ATTRS->error and confess "$!"; close ATTRS; } print NATTRS "debian/changelog merge=$driver\n" or confess "$!"; close NATTRS; set_local_git_config "$cb.name", __ 'debian/changelog merge driver'; set_local_git_config "$cb.driver", 'dpkg-mergechangelogs -m %O %A %B %A'; rename "$attrs.new", "$attrs" or die "$attrs: $!"; } sub setup_useremail (;$) { my ($always) = @_; return unless $always || access_cfg_bool(1, 'setup-useremail'); my $setup = sub { my ($k, $envvar) = @_; my $v = access_cfg("user-$k", 'RETURN-UNDEF') // $ENV{$envvar}; return unless defined $v; set_local_git_config "user.$k", $v; }; $setup->('email', 'DEBEMAIL'); $setup->('name', 'DEBFULLNAME'); } sub ensure_setup_existing_tree () { my $k = "remote.$remotename.skipdefaultupdate"; my $c = git_get_config $k; return if defined $c; set_local_git_config $k, 'true'; } sub open_main_gitattrs () { confess 'internal error no maindir' unless defined $maindir; my $gai = new IO::File "$maindir_gitcommon/info/attributes" or $!==ENOENT or die "open $maindir_gitcommon/info/attributes: $!"; return $gai; } our $gitattrs_ourmacro_re = qr{^\[attr\]dgit-defuse-attrs\s}; sub is_gitattrs_setup () { # return values: # trueish # 1: gitattributes set up and should be left alone # falseish # 0: there is a dgit-defuse-attrs but it needs fixing # undef: there is none my $gai = open_main_gitattrs(); return undef unless $gai; while (<$gai>) { next unless m{$gitattrs_ourmacro_re}; return 1 if m{\s-working-tree-encoding\s}; printdebug "is_gitattrs_setup: found old macro\n"; return 0; } $gai->error and confess "$!"; printdebug "is_gitattrs_setup: found nothing\n"; return undef; } sub setup_gitattrs (;$) { my ($always) = @_; return unless $always || access_cfg_bool(1, 'setup-gitattributes'); my $already = is_gitattrs_setup(); if ($already) { progress __ < $af.new" or confess "$!"; print GAO <) { if (m{$gitattrs_ourmacro_re}) { die unless defined $already; $_ = $new; } chomp; print GAO $_, "\n" or confess "$!"; } $gai->error and confess "$!"; } close GAO or confess "$!"; rename "$af.new", "$af" or fail f_ "install %s: %s", $af, $!; } sub setup_new_tree () { setup_mergechangelogs(); setup_useremail(); setup_gitattrs(); } sub check_gitattrs ($$) { my ($treeish, $what) = @_; return if is_gitattrs_setup; local $/="\0"; my @cmd = (@git, qw(ls-tree -lrz --), "${treeish}:"); debugcmd "|",@cmd; my $gafl = new IO::File; open $gafl, "-|", @cmd or confess "$!"; while (<$gafl>) { chomp or die; s/^\d+\s+\w+\s+\w+\s+(\d+)\t// or die; next if $1 == 0; next unless m{(?:^|/)\.gitattributes$}; # oh dear, found one print STDERR f_ <(), and returns undef # in parent, returns canonical suite name for $tsuite my $canonsuitefh = IO::File::new_tmpfile; my $pid = fork // confess "$!"; if (!$pid) { forkcheck_setup(); $isuite = $tsuite; $us .= " [$isuite]"; $debugprefix .= " "; progress f_ "fetching %s...", $tsuite; canonicalise_suite(); print $canonsuitefh $csuite, "\n" or confess "$!"; close $canonsuitefh or confess "$!"; $fn->(); return undef; } waitpid $pid,0 == $pid or confess "$!"; fail f_ "failed to obtain %s: %s", $tsuite, waitstatusmsg() if $? && $?!=256*4; seek $canonsuitefh,0,0 or confess "$!"; local $csuite = <$canonsuitefh>; confess "$!" unless defined $csuite && chomp $csuite; if ($? == 256*4) { printdebug "multisuite $tsuite missing\n"; return $csuite; } printdebug "multisuite $tsuite ok (canon=$csuite)\n"; push @$mergeinputs, { Ref => lrref, Info => $csuite, }; return $csuite; } sub fork_for_multisuite ($) { my ($before_fetch_merge) = @_; # if nothing unusual, just returns '' # # if multisuite: # returns 0 to caller in child, to do first of the specified suites # in child, $csuite is not yet set # # returns 1 to caller in parent, to finish up anything needed after # in parent, $csuite is set to canonicalised portmanteau my $org_isuite = $isuite; my @suites = split /\,/, $isuite; return '' unless @suites > 1; printdebug "fork_for_multisuite: @suites\n"; my @mergeinputs; my $cbasesuite = multisuite_suite_child($suites[0], \@mergeinputs, sub { }); return 0 unless defined $cbasesuite; fail f_ "package %s missing in (base suite) %s", $package, $cbasesuite unless @mergeinputs; my @csuites = ($cbasesuite); $before_fetch_merge->(); foreach my $tsuite (@suites[1..$#suites]) { $tsuite =~ s/^-/$cbasesuite-/; my $csubsuite = multisuite_suite_child($tsuite, \@mergeinputs, sub { @end = (); fetch_one(); finish 0; }); $csubsuite =~ s/^\Q$cbasesuite\E-/-/; push @csuites, $csubsuite; } foreach my $mi (@mergeinputs) { my $ref = git_get_ref $mi->{Ref}; die "$mi->{Ref} ?" unless length $ref; $mi->{Commit} = $ref; } $csuite = join ",", @csuites; my $previous = git_get_ref lrref; if ($previous) { unshift @mergeinputs, { Commit => $previous, Info => (__ "local combined tracking branch"), Warning => (__ "archive seems to have rewound: local tracking branch is ahead!"), }; } foreach my $ix (0..$#mergeinputs) { $mergeinputs[$ix]{Index} = $ix; } @mergeinputs = sort { -version_compare(mergeinfo_version $a, mergeinfo_version $b) # highest version first or $a->{Index} <=> $b->{Index}; # earliest in spec first } @mergeinputs; my @needed; NEEDED: foreach my $mi (@mergeinputs) { printdebug "multisuite merge check $mi->{Info}\n"; foreach my $previous (@needed) { next unless is_fast_fwd $mi->{Commit}, $previous->{Commit}; printdebug "multisuite merge un-needed $previous->{Info}\n"; next NEEDED; } push @needed, $mi; printdebug "multisuite merge this-needed\n"; $mi->{Character} = '+'; } $needed[0]{Character} = '*'; my $output = $needed[0]{Commit}; if (@needed > 1) { printdebug "multisuite merge nontrivial\n"; my $tree = cmdoutput qw(git rev-parse), $needed[0]{Commit}.':'; my $commit = "tree $tree\n"; my $msg = f_ "Combine archive branches %s [dgit]\n\n". "Input branches:\n", $csuite; foreach my $mi (sort { $a->{Index} <=> $b->{Index} } @mergeinputs) { printdebug "multisuite merge include $mi->{Info}\n"; $mi->{Character} //= ' '; $commit .= "parent $mi->{Commit}\n"; $msg .= sprintf " %s %-25s %s\n", $mi->{Character}, (mergeinfo_version $mi), $mi->{Info}; } my $authline = clogp_authline mergeinfo_getclogp $needed[0]; $msg .= __ "\nKey\n". " * marks the highest version branch, which choose to use\n". " + marks each branch which was not already an ancestor\n\n"; $msg .= "[dgit multi-suite $csuite]\n"; $commit .= "author $authline\n". "committer $authline\n\n"; $output = hash_commit_text $commit.$msg; printdebug "multisuite merge generated $output\n"; } fetch_from_archive_record_1($output); fetch_from_archive_record_2($output); progress f_ "calculated combined tracking suite %s", $csuite; return 1; } sub clone_set_head () { open H, "> .git/HEAD" or confess "$!"; print H "ref: ".lref()."\n" or confess "$!"; close H or confess "$!"; } sub clone_finish ($) { my ($dstdir) = @_; runcmd @git, qw(reset --hard), lrref(); runcmd qw(bash -ec), <<'END'; set -o pipefail git ls-tree -r --name-only -z HEAD | \ xargs -0r touch -h -r . -- END printdone f_ "ready for work in %s", $dstdir; } sub vcs_git_url_of_ctrl ($) { my ($ctrl) = @_; my $vcsgiturl = $ctrl->{'Vcs-Git'}; if (length $vcsgiturl) { $vcsgiturl =~ s/\s+-b\s+\S+//g; $vcsgiturl =~ s/\s+\[[^][]*\]//g; } return $vcsgiturl; } sub clone ($) { # in multisuite, returns twice! # once in parent after first suite fetched, # and then again in child after everything is finished my ($dstdir) = @_; badusage __ "dry run makes no sense with clone" unless act_local(); my $multi_fetched = fork_for_multisuite(sub { printdebug "multi clone before fetch merge\n"; changedir $dstdir; record_maindir(); }); if ($multi_fetched) { printdebug "multi clone after fetch merge\n"; clone_set_head(); clone_finish($dstdir); return; } printdebug "clone main body\n"; mkdir $dstdir or fail f_ "create \`%s': %s", $dstdir, $!; changedir $dstdir; check_bpd_exists(); canonicalise_suite(); my $hasgit = check_for_git(); runcmd @git, qw(init -q); record_maindir(); setup_new_tree(); clone_set_head(); if ($hasgit) { progress __ "fetching existing git history"; git_fetch_us(); } else { progress __ "starting new git history"; } fetch_from_archive() or no_such_package; my $vcsgiturl = vcs_git_url_of_ctrl $dsc; if (length $vcsgiturl) { runcmd @git, qw(remote add vcs-git), $vcsgiturl; } clone_finish($dstdir); } sub fetch_one () { canonicalise_suite(); if (check_for_git()) { git_fetch_us(); } fetch_from_archive() or no_such_package(); my $vcsgiturl = $dsc && $dsc->{'Vcs-Git'}; if (length $vcsgiturl and (grep { $csuite eq $_ } split /\;/, cfg 'dgit.vcs-git.suites')) { my $current = cfg 'remote.vcs-git.url', 'RETURN-UNDEF'; if (defined $current && $current ne $vcsgiturl) { print STDERR f_ <) { next if m/^\s*\#/; next unless m/\S/; s/\s+$//; # ignore missing final newline if (m/\s*\#\s*/) { my ($k, $v) = ($`, $'); #'); $v =~ s/^"(.*)"$/$1/; $options{$k} = $v; } else { $options{$_} = 1; } } F->error and confess "$!"; close F; } else { confess "$!" unless $!==&ENOENT; } if (!open F, "debian/source/format") { confess "$!" unless $!==&ENOENT; return ''; } $_ = ; F->error and confess "$!"; close F; chomp; return ($_, \%options); } sub madformat_wantfixup ($) { my ($format) = @_; return 0 unless $format eq '3.0 (quilt)'; our $quilt_mode_warned; if ($quilt_mode eq 'nocheck') { progress f_ "Not doing any fixup of \`%s'". " due to ----no-quilt-fixup or --quilt=nocheck", $format unless $quilt_mode_warned++; return 0; } progress f_ "Format \`%s', need to check/update patch stack", $format unless $quilt_mode_warned++; return 1; } sub maybe_split_brain_save ($$$) { my ($headref, $dgitview, $msg) = @_; # => message fragment "$saved" describing disposition of $dgitview # (used inside parens, in the English texts) my $save = $internal_object_save{'dgit-view'}; return f_ "commit id %s", $dgitview unless defined $save; my @cmd = (shell_cmd 'cd "$1"; shift', $maindir, git_update_ref_cmd "dgit --dgit-view-save $msg HEAD=$headref", $save, $dgitview); runcmd @cmd; return f_ "and left in %s", $save; } # An "infopair" is a tuple [ $thing, $what ] # (often $thing is a commit hash; $what is a description) sub infopair_cond_equal ($$) { my ($x,$y) = @_; $x->[0] eq $y->[0] or fail <[1] ($x->[0]) not equal to $y->[1] ($y->[0]) END }; sub infopair_lrf_tag_lookup ($$) { my ($tagnames, $what) = @_; # $tagname may be an array ref my @tagnames = ref $tagnames ? @$tagnames : ($tagnames); printdebug "infopair_lrfetchref_tag_lookup $what @tagnames\n"; foreach my $tagname (@tagnames) { my $lrefname = lrfetchrefs."/tags/$tagname"; my $tagobj = $lrfetchrefs_f{$lrefname}; next unless defined $tagobj; printdebug "infopair_lrfetchref_tag_lookup $tagobj $tagname $what\n"; return [ git_rev_parse($tagobj), $what ]; } fail @tagnames==1 ? (f_ <[0], $desc->[0]) or fail f_ <[1], $anc->[0], $desc->[1], $desc->[0]; %s (%s) .. %s (%s) is not fast forward END }; sub pseudomerge_version_check ($$) { my ($clogp, $archive_hash) = @_; my $arch_clogp = commit_getclogp $archive_hash; my $i_arch_v = [ (getfield $arch_clogp, 'Version'), __ 'version currently in archive' ]; if (defined $overwrite_version) { if (length $overwrite_version) { infopair_cond_equal([ $overwrite_version, '--overwrite= version' ], $i_arch_v); } else { my $v = $i_arch_v->[0]; progress f_ "Checking package changelog for archive version %s ...", $v; my $cd; my $vclogp; eval { my @xa = ("-f$v", "-t$v"); $vclogp = parsechangelog @xa; my $gf = sub { my ($fn) = @_; [ (getfield $vclogp, $fn), (f_ "%s field from dpkg-parsechangelog %s", $fn, "@xa") ]; }; my $cv = $gf->('Version'); infopair_cond_equal($i_arch_v, $cv); $cd = $gf->('Distribution'); }; if ($@) { $@ =~ s/^\n//s; $@ =~ s/^dgit: //gm; fail "$@". f_ "Perhaps debian/changelog does not mention %s ?", $v; } fail f_ <[1], $cd->[0], $v %s is %s Your tree seems to based on earlier (not uploaded) %s. END if $cd->[0] =~ m/UNRELEASED/; fail f_ <{Date}; } } printdebug "pseudomerge_version_check i_arch_v @$i_arch_v\n"; return $i_arch_v; } sub pseudomerge_hash_commit ($$$$ $$) { my ($clogp, $dgitview, $archive_hash, $i_arch_v, $msg_cmd, $msg_msg) = @_; progress f_ "Declaring that HEAD includes all changes in %s...", $i_arch_v->[0]; my $tree = cmdoutput qw(git rev-parse), "${dgitview}:"; my $authline = clogp_authline $clogp; chomp $msg_msg; $msg_cmd .= !defined $overwrite_version ? "" : !length $overwrite_version ? " --overwrite" : " --overwrite=".$overwrite_version; # Contributing parent is the first parent - that makes # git rev-list --first-parent DTRT. my $pmf = dgit_privdir()."/pseudomerge"; open MC, ">", $pmf or die "$pmf $!"; print MC < $merged_dgitview printdebug "splitbrain_pseudomerge...\n"; # # We: debian/PREVIOUS HEAD($maintview) # expect: o ----------------- o # \ \ # o o # a/d/PREVIOUS $dgitview # $archive_hash \ # If so, \ \ # we do: `------------------ o # this: $dgitview' # return $dgitview unless defined $archive_hash; return $dgitview if deliberately_not_fast_forward(); printdebug "splitbrain_pseudomerge...\n"; my $i_arch_v = pseudomerge_version_check($clogp, $archive_hash); if (!defined $overwrite_version) { progress __ "Checking that HEAD includes all changes in archive..."; } return $dgitview if is_fast_fwd $archive_hash, $dgitview; if (defined $overwrite_version) { } elsif (!eval { my $t_dep14 = debiantag_maintview $i_arch_v->[0], access_nomdistro; my $i_dep14 = infopair_lrf_tag_lookup($t_dep14, __ "maintainer view tag"); my $t_dgit = debiantag_new $i_arch_v->[0], access_nomdistro; my $i_dgit = infopair_lrf_tag_lookup($t_dgit, __ "dgit view tag"); my $i_archive = [ $archive_hash, __ "current archive contents" ]; printdebug "splitbrain_pseudomerge i_archive @$i_archive\n"; infopair_cond_equal($i_dgit, $i_archive); infopair_cond_ff($i_dep14, $i_dgit); infopair_cond_ff($i_dep14, [ $maintview, 'HEAD' ]); 1; }) { $@ =~ s/^\n//; chomp $@; print STDERR <[0]; my $r = pseudomerge_hash_commit $clogp, $dgitview, $archive_hash, $i_arch_v, "dgit --quilt=$quilt_mode", (defined $overwrite_version ? f_ "Declare fast forward from %s\n", $arch_v : f_ "Make fast forward from %s\n", $arch_v); maybe_split_brain_save $maintview, $r, "pseudomerge"; progress f_ "Made pseudo-merge of %s into dgit view.", $arch_v; return $r; } sub plain_overwrite_pseudomerge ($$$) { my ($clogp, $head, $archive_hash) = @_; printdebug "plain_overwrite_pseudomerge..."; my $i_arch_v = pseudomerge_version_check($clogp, $archive_hash); return $head if is_fast_fwd $archive_hash, $head; my $m = f_ "Declare fast forward from %s", $i_arch_v->[0]; my $r = pseudomerge_hash_commit $clogp, $head, $archive_hash, $i_arch_v, "dgit", $m; runcmd git_update_ref_cmd $m, 'HEAD', $r, $head; progress f_ "Make pseudo-merge of %s into your HEAD.", $i_arch_v->[0]; return $r; } sub push_parse_changelog ($) { my ($clogpfn) = @_; my $clogp = Dpkg::Control::Hash->new(); $clogp->load($clogpfn) or die; my $clogpackage = getfield $clogp, 'Source'; $package //= $clogpackage; fail f_ "-p specified %s but changelog specified %s", $package, $clogpackage unless $package eq $clogpackage; my $cversion = getfield $clogp, 'Version'; if (!$we_are_initiator) { # rpush initiator can't do this because it doesn't have $isuite yet my $tag = debiantag_new($cversion, access_nomdistro); runcmd @git, qw(check-ref-format), $tag; } my $dscfn = dscfn($cversion); return ($clogp, $cversion, $dscfn); } sub push_parse_dsc ($$$) { my ($dscfn,$dscfnwhat, $cversion) = @_; $dsc = parsecontrol($dscfn,$dscfnwhat); my $dversion = getfield $dsc, 'Version'; my $dscpackage = getfield $dsc, 'Source'; ($dscpackage eq $package && $dversion eq $cversion) or fail f_ "%s is for %s %s but debian/changelog is for %s %s", $dscfn, $dscpackage, $dversion, $package, $cversion; } sub push_tagwants ($$$$) { my ($cversion, $dgithead, $maintviewhead, $tfbase) = @_; my @tagwants; push @tagwants, { TagFn => \&debiantag_new, Objid => $dgithead, TfSuffix => '', View => 'dgit', }; if (defined $maintviewhead) { push @tagwants, { TagFn => \&debiantag_maintview, Objid => $maintviewhead, TfSuffix => '-maintview', View => 'maint', }; } elsif ($dodep14tag ne 'no') { push @tagwants, { TagFn => \&debiantag_maintview, Objid => $dgithead, TfSuffix => '-dgit', View => 'dgit', }; }; foreach my $tw (@tagwants) { $tw->{Tag} = $tw->{TagFn}($cversion, access_nomdistro); $tw->{Tfn} = sub { $tfbase.$tw->{TfSuffix}.$_[0]; }; } printdebug 'push_tagwants: ', Dumper(\@_, \@tagwants); return @tagwants; } sub push_mktags ($$ $$ $) { my ($clogp,$dscfn, $changesfile,$changesfilewhat, $tagwants) = @_; die unless $tagwants->[0]{View} eq 'dgit'; my $declaredistro = access_nomdistro(); my $reader_giturl = do { local $access_forpush=0; access_giturl(); }; $dsc->{$ourdscfield[0]} = join " ", $tagwants->[0]{Objid}, $declaredistro, $tagwants->[0]{Tag}, $reader_giturl; $dsc->save("$dscfn.tmp") or confess "$!"; my $changes = parsecontrol($changesfile,$changesfilewhat); foreach my $field (qw(Source Distribution Version)) { $changes->{$field} eq $clogp->{$field} or fail f_ "changes field %s \`%s' does not match changelog \`%s'", $field, $changes->{$field}, $clogp->{$field}; } my $cversion = getfield $clogp, 'Version'; my $clogsuite = getfield $clogp, 'Distribution'; my $format = getfield $dsc, 'Format'; # We make the git tag by hand because (a) that makes it easier # to control the "tagger" (b) we can do remote signing my $authline = clogp_authline $clogp; my $mktag = sub { my ($tw) = @_; my $tfn = $tw->{Tfn}; my $head = $tw->{Objid}; my $tag = $tw->{Tag}; open TO, '>', $tfn->('.tmp') or confess "$!"; print TO <{View} eq 'dgit') { print TO sprintf <{View} eq 'maint') { print TO sprintf <('.tmp'); if ($sign) { if (!defined $keyid) { $keyid = access_cfg('keyid','RETURN-UNDEF'); } if (!defined $keyid) { $keyid = getfield $clogp, 'Maintainer'; } unlink $tfn->('.tmp.asc') or $!==&ENOENT or confess "$!"; my @sign_cmd = (@gpg, qw(--detach-sign --armor)); push @sign_cmd, qw(-u),$keyid if defined $keyid; push @sign_cmd, $tfn->('.tmp'); runcmd_ordryrun @sign_cmd; if (act_scary()) { $tagobjfn = $tfn->('.signed.tmp'); runcmd shell_cmd "exec >$tagobjfn", qw(cat --), $tfn->('.tmp'), $tfn->('.tmp.asc'); } } return $tagobjfn; }; my @r = map { $mktag->($_); } @$tagwants; return @r; } sub sign_changes ($) { my ($changesfile) = @_; if ($sign) { my @debsign_cmd = @debsign; push @debsign_cmd, "-k$keyid" if defined $keyid; push @debsign_cmd, "-p$gpg[0]" if $gpg[0] ne 'gpg'; push @debsign_cmd, $changesfile; runcmd_ordryrun @debsign_cmd; } } sub tainted_objects_precheck ($$) { my ($json, $dgithead) = @_; my %taints; ROW: foreach my $row (@{ decode_json $json }) { foreach my $override (@{ $row->{overrides} }) { if ($override =~ m{^--deliberately-} && deliberately($')) { printdebug "overriding $row->{gitobjid} $override\n"; next ROW; } } my $objid = $row->{gitobjid}; my ($gtype, $dummy) = git_cat_file $objid, undef; next if $gtype eq 'missing'; if ($row->{gitobjtype} and $gtype ne $row->{gitobjtype}) { print STDERR f_ <<'END', $objid, $gtype, $row->{gitobjtype}; warning: server says object %s type %s is tainted, but here it has type %s END } $taints{$objid}{Type} = $gtype; push @{ $taints{$objid}{Rows} }, $row; } open GRL, "-|", @git, qw(rev-list --objects --in-commit-order --pretty=format:), $dgithead or confess "$!"; my $trouble = 0; my %hinted; my $found = sub { my ($objid) = @_; my $t = $taints{$objid}; return unless $t; foreach my $row (@{ $t->{Rows} }) { # If it was actually overridding we don't get here, asd # don't call tainted_objects_message. Instead, the server # will send such a message to our stderr (sadly, untranslated). my $ovstatus = (grep m{^--deliberately-}, @{ $row->{overrides} }) ? '' : undef; print STDERR tainted_objects_message $row, $ovstatus, \%hinted; $trouble = 1; } }; my $c_commit; while () { if (m{^commit (\w+)$}) { $c_commit = $1; $found->($1, __ 'commit'); } elsif (m{(^\w{20}\w*) } && defined $c_commit) { $found->($1, f_ 'object within commit %s', $c_commit); } else { confess "$_ ?"; } } GRL->error and die $!; close GRL or confess "$? $!"; forceable_fail [qw(push-tainted)], __ "pushing tainted objects (which server would reject)" if $trouble; } sub dopush () { printdebug "actually entering push\n"; supplementary_message(__ <<'END'); Push failed, while checking state of the archive. You can retry the push, after fixing the problem, if you like. END if (check_for_git()) { git_fetch_us(); } my $archive_hash = fetch_from_archive(); my $archive_dsc = $dsc; if (!$archive_hash) { $new_package or fail __ "package appears to be new in this suite;". " if this is intentional, use --new"; } supplementary_message(__ <<'END'); Push failed, while preparing your push. You can retry the push, after fixing the problem, if you like. END prep_ud(); access_giturl(); # check that success is vaguely likely rpush_handle_protovsn_bothends() if $we_are_initiator; my $clogpfn = dgit_privdir()."/changelog.822.tmp"; runcmd shell_cmd "exec >$clogpfn", qw(dpkg-parsechangelog); responder_send_file('parsed-changelog', $clogpfn); my ($clogp, $cversion, $dscfn) = push_parse_changelog("$clogpfn"); my $dscpath = "$buildproductsdir/$dscfn"; stat_exists $dscpath or fail f_ "looked for .dsc %s, but %s; maybe you forgot to build", $dscpath, $!; responder_send_file('dsc', $dscpath); push_parse_dsc($dscpath, $dscfn, $cversion); my $format = getfield $dsc, 'Format'; my $symref = git_get_symref(); my $actualhead = git_rev_parse('HEAD'); if (branch_is_gdr_unstitched_ff($symref, $actualhead, $archive_hash)) { if (quiltmode_splitting()) { my ($ffq_prev, $gdrlast) = branch_gdr_info($symref, $actualhead); fail f_ <{Version}; if (defined $archive_dsc && version_compare($archive_dsc->{Version}, $cversion) >= 0 && !forceing [qw(uploading-old-version)]) { fail f_ <<'END', $archive_dsc->{Version}, $csuite, $cversion; You seem to be trying to push an old version. Version current in archive: %s (in suite %s) Version you are trying to upload: %s END } if (madformat_wantfixup($format)) { # user might have not used dgit build, so maybe do this now: if (do_split_brain()) { changedir $playground; my $cachekey; ($dgithead, $cachekey) = quilt_check_splitbrain_cache($actualhead, $upstreamversion); $dgithead or fail f_ "--quilt=%s but no cached dgit view: perhaps HEAD changed since dgit build[-source] ?", $quilt_mode; } if (!do_split_brain()) { # In split brain mode, do not attempt to incorporate dirty # stuff from the user's working tree. That would be mad. commit_quilty_patch(); } } if (do_split_brain()) { $made_split_brain = 1; $dgithead = splitbrain_pseudomerge($clogp, $actualhead, $dgithead, $archive_hash); $maintviewhead = $actualhead; changedir $maindir; prep_ud(); # so _only_subdir() works, below } if (defined $overwrite_version && !defined $maintviewhead && $archive_hash) { $dgithead = plain_overwrite_pseudomerge($clogp, $dgithead, $archive_hash); } check_not_dirty(); my $forceflag = ''; if ($archive_hash) { if (is_fast_fwd($archive_hash, $dgithead)) { # ok } elsif (deliberately_not_fast_forward) { $forceflag = '+'; } else { fail __ "dgit push: HEAD is not a descendant". " of the archive's version.\n". "To overwrite the archive's contents,". " pass --overwrite[=VERSION].\n". "To rewrite history, if permitted by the archive,". " use --deliberately-not-fast-forward."; } } confess unless !!$made_split_brain == do_split_brain(); my $tagname = debiantag_new $cversion, access_nomdistro(); if (!(forceing[qw(reusing-version)]) && git_get_ref "refs/tags/$tagname") { supplementary_message ''; print STDERR f_ <{format}); changedir $maindir; my @diffcmd = (@git, qw(diff --quiet), $tree, $dgithead); debugcmd "+",@diffcmd; $!=0; $?=-1; my $r = system @diffcmd; if ($r) { if ($r==256) { my $referent = $made_split_brain ? $dgithead : 'HEAD'; my $diffs = cmdoutput @git, qw(diff --stat), $tree, $dgithead; my @mode_changes; my $raw = cmdoutput @git, qw(diff --no-renames -z -r --raw), $tree, $dgithead; my $changed; foreach (split /\0/, $raw) { if (defined $changed) { push @mode_changes, "$changed: $_\n" if $changed; $changed = undef; next; } elsif (m/^:0+ 0+ /) { $changed = ''; } elsif (m/^:(?:10*)?(\d+) (?:10*)?(\d+) /) { $changed = "Mode change from $1 to $2" } else { die "$_ ?"; } } if (@mode_changes) { fail +(f_ <{Files} =~ m{\.deb$}m; my $sourceonlypolicy = access_cfg 'source-only-uploads'; if ($sourceonlypolicy eq 'ok') { } elsif ($sourceonlypolicy eq 'always') { forceable_fail [qw(uploading-binaries)], __ "uploading binaries, although distro policy is source only" if $hasdebs; } elsif ($sourceonlypolicy eq 'never') { forceable_fail [qw(uploading-source-only)], __ "source-only upload, although distro policy requires .debs" if !$hasdebs; } elsif ($sourceonlypolicy eq 'not-wholly-new') { forceable_fail [qw(uploading-source-only)], f_ "source-only upload, though package appears entirely NEW\n". "(this is probably contrary to policy in %s)", access_nomdistro() if !$hasdebs && $new_package && !(archive_query('package_not_wholly_new', $package) // 1); } else { badcfg f_ "unknown source-only-uploads policy \`%s'", $sourceonlypolicy; } # Try to detect if we're about to be rejected due to tainted objects my $pq_supported = access_cfg 'policy-query-supported-ssh'; $pq_supported =~ m{^(?:false|true|unknown)$} or badcfg f_ "policy-query-supported-ssh value '%s' must be false/true/unknown", $pq_supported; if ($pq_supported !~ m/false/) { my @cmd = (access_cfg_ssh, access_gituserhost(), access_runeinfo("policy-client-query $package tainted-objects ". join " ", $csuite). " true"); my $json = cmdoutput_errok @cmd; if (!defined $json) { # "unknown" means try the call, but don't mind if it # fails. (This is OK, as a best effort, because then the # server will enforce the check and this machinery is just # to prevent late failures.) failedcmd @cmd unless $pq_supported =~ m/unknown/; } else { printdebug "tainted-objects: $json\n"; if (length $json) { tainted_objects_precheck $json, $dgithead; } } } # Perhaps adjust .dsc to contain right set of origs changes_update_origs_from_dsc($dsc, $changes, $upstreamversion, $changesfile) unless forceing [qw(changes-origs-exactly)]; # Checks complete, we're going to try and go ahead: responder_send_file('changes',$changesfile); responder_send_command("param head $dgithead"); responder_send_command("param csuite $csuite"); responder_send_command("param isuite $isuite"); responder_send_command("param tagformat new"); # needed in $protovsn==4 responder_send_command("param splitbrain $do_split_brain"); if (defined $maintviewhead) { responder_send_command("param maint-view $maintviewhead"); } # Perhaps send buildinfo(s) for signing my $changes_files = getfield $changes, 'Files'; my @buildinfos = ($changes_files =~ m/ .* (\S+\.buildinfo)$/mg); foreach my $bi (@buildinfos) { responder_send_command("param buildinfo-filename $bi"); responder_send_file('buildinfo', "$buildproductsdir/$bi"); } if (deliberately_not_fast_forward) { git_for_each_ref(lrfetchrefs, sub { my ($objid,$objtype,$lrfetchrefname,$reftail) = @_; my $rrefname= substr($lrfetchrefname, length(lrfetchrefs) + 1); responder_send_command("previously $rrefname=$objid"); $previously{$rrefname} = $objid; }); } my @tagwants = push_tagwants($cversion, $dgithead, $maintviewhead, dgit_privdir()."/tag"); my @tagobjfns; supplementary_message(__ <<'END'); Push failed, while signing the tag. You can retry the push, after fixing the problem, if you like. END # If we manage to sign but fail to record it anywhere, it's fine. if ($we_are_responder) { @tagobjfns = map { $_->{Tfn}('.signed-tmp') } @tagwants; responder_receive_files('signed-tag', @tagobjfns); } else { @tagobjfns = push_mktags($clogp,$dscpath, $changesfile,$changesfile, \@tagwants); } supplementary_message(__ <<'END'); Push failed, *after* signing the tag. If you want to try again, you should use a new version number. END pairwise { $a->{TagObjFn} = $b } @tagwants, @tagobjfns; foreach my $tw (@tagwants) { my $tag = $tw->{Tag}; my $tagobjfn = $tw->{TagObjFn}; my $tag_obj_hash = cmdoutput @git, qw(hash-object -w -t tag), $tagobjfn; runcmd_ordryrun @git, qw(verify-tag), $tag_obj_hash; runcmd_ordryrun_local @git, qw(update-ref), "refs/tags/$tag", $tag_obj_hash; } supplementary_message(__ <<'END'); Push failed, while updating the remote git repository - see messages above. If you want to try again, you should use a new version number. END if (!check_for_git()) { create_remote_git_repo(); } my @pushrefs = $forceflag.$dgithead.":".rrref(); foreach my $tw (@tagwants) { push @pushrefs, $forceflag."refs/tags/$tw->{Tag}"; } runcmd_ordryrun @git, qw(-c push.followTags=false push), access_giturl(), @pushrefs; runcmd_ordryrun git_update_ref_cmd 'dgit push', lrref(), $dgithead; supplementary_message(__ <<'END'); Push failed, while obtaining signatures on the .changes and .dsc. If it was just that the signature failed, you may try again by using debsign by hand to sign the changes file (see the command dgit tried, above), and then dput that changes file to complete the upload. If you need to change the package, you must use a new version number. END if ($we_are_responder) { my $dryrunsuffix = act_local() ? "" : ".tmp"; my @rfiles = ($dscpath, $changesfile); push @rfiles, map { "$buildproductsdir/$_" } @buildinfos; responder_receive_files('signed-dsc-changes', map { "$_$dryrunsuffix" } @rfiles); } else { if (act_local()) { rename "$dscpath.tmp",$dscpath or die "$dscfn $!"; } else { progress f_ "[new .dsc left in %s.tmp]", $dscpath; } sign_changes $changesfile; } supplementary_message(f_ <(); } elsif ($spec eq 'built') { $if_built->(); } elsif ($spec eq 'warn,built') { print STDERR f_ <<'END', $verb,$verb,$verb; warning: "dgit %s" currently means "dgit %s-built" (by default) warning: but is going to change to "dgit %s-source". See dgit!(1). END $if_built->(); } else { fail $badvalue_msg->($spec); } } #---------- remote commands' implementation ---------- sub pre_remote_push_build_host { core_pre_rpush_bh('push'); } sub pre_remote_push_source_build_host { core_pre_rpush_bh('push-source'); } sub core_pre_rpush_bh ($) { ($rpush_verb) = @_; my ($nrargs) = shift @ARGV; my (@rargs) = @ARGV[0..$nrargs-1]; @ARGV = @ARGV[$nrargs..$#ARGV]; die unless @rargs; my ($dir,$vsnwant) = @rargs; # vsnwant is a comma-separated list; we report which we have # chosen in our ready response (so other end can tell if they # offered several) $debugprefix = ' '; $we_are_responder = 1; $us .= " (build host)"; open PI, "<&STDIN" or confess "$!"; open STDIN, "/dev/null" or confess "$!"; open PO, ">&STDOUT" or confess "$!"; autoflush PO 1; open STDOUT, ">&STDERR" or confess "$!"; autoflush STDOUT 1; $vsnwant //= 1; ($protovsn) = grep { $vsnwant =~ m{^(?:.*,)?$_(?:,.*)?$} } @rpushprotovsn_support; fail f_ "build host has dgit rpush protocol versions %s". " but invocation host has %s", (join ",", @rpushprotovsn_support), $vsnwant unless defined $protovsn; changedir $dir; responder_send_command("dgit-remote-$rpush_verb-ready $protovsn"); } sub cmd_remote_push_build_host { &cmd_push_built; } sub cmd_remote_push_source_build_host { &cmd_push_source; } sub pre_remote_push_responder { pre_remote_push_build_host(); } sub cmd_remote_push_responder { cmd_remote_push_build_host(); } # ... for compatibility with proto vsn.1 dgit (just so that user gets # a good error message) sub rpush_handle_protovsn_bothends () { } our $i_tmp; sub i_cleanup { local ($@, $?); my $report = i_child_report(); if (defined $report) { printdebug "($report)\n"; } elsif ($i_child_pid) { printdebug "(killing build host child $i_child_pid)\n"; kill 15, $i_child_pid; } if (defined $i_tmp && !defined $initiator_tempdir) { changedir "/"; eval { rmtree $i_tmp; }; } } END { return unless forkcheck_mainprocess(); i_cleanup(); } sub i_method { my ($base,$selector,@args) = @_; $selector =~ s/\-/_/g; { no strict qw(refs); &{"${base}_${selector}"}(@args); } } sub pre_rpush_source () { not_necessarily_a_tree(); } sub pre_rpush_built () { not_necessarily_a_tree(); } sub pre_rpush () { not_necessarily_a_tree(); } sub cmd_rpush_source { rpush_core('push-source'); } sub cmd_rpush_built { rpush_core('push'); } sub rpush_core ($) { ($rpush_verb) = @_; my $host = nextarg; my $dir; if ($host =~ m/^((?:[^][]|\[[^][]*\])*)\:/) { $host = $1; $dir = $'; #'; } else { $dir = nextarg; } $dir =~ s{^-}{./-}; my @rargs = ($dir); push @rargs, join ",", @rpushprotovsn_support; my @rdgit; push @rdgit, @dgit; push @rdgit, @ropts; push @rdgit, "remote-$rpush_verb-build-host", (scalar @rargs), @rargs; push @rdgit, @ARGV; my @cmd = (@ssh, $host, shellquote @rdgit); debugcmd "+",@cmd; $we_are_initiator=1; if (defined $initiator_tempdir) { rmtree $initiator_tempdir; mkdir $initiator_tempdir, 0700 or fail f_ "create %s: %s", $initiator_tempdir, $!; $i_tmp = $initiator_tempdir; } else { $i_tmp = tempdir(); } $i_child_pid = open2(\*RO, \*RI, @cmd); changedir $i_tmp; ($protovsn) = initiator_expect { m/^dgit-remote-$rpush_verb-ready (\S+)/ }; die "$protovsn ?" unless grep { $_ eq $protovsn } @rpushprotovsn_support; for (;;) { my ($icmd,$iargs) = initiator_expect { m/^(\S+)(?: (.*))?$/; ($1,$2); }; i_method "i_resp", $icmd, $iargs; } } sub i_resp_progress ($) { my ($rhs) = @_; my $msg = protocol_read_bytes \*RO, $rhs; progress $msg; } sub i_resp_supplementary_message ($) { my ($rhs) = @_; $supplementary_message = protocol_read_bytes \*RO, $rhs; } sub i_resp_complete { my $pid = $i_child_pid; $i_child_pid = undef; # prevents killing some other process with same pid printdebug "waiting for build host child $pid...\n"; my $got = waitpid $pid, 0; confess "$!" unless $got == $pid; fail f_ "build host child failed: %s", waitstatusmsg() if $?; i_cleanup(); printdebug __ "all done\n"; finish 0; } sub i_resp_file ($) { my ($keyword) = @_; my $localname = i_method "i_localname", $keyword; my $localpath = "$i_tmp/$localname"; stat_exists $localpath and badproto \*RO, f_ "file %s (%s) twice", $keyword, $localpath; protocol_receive_file \*RO, $localpath; i_method "i_file", $keyword; } our %i_param; sub i_resp_param ($) { $_[0] =~ m/^(\S+) (.*)$/ or badproto \*RO, __ "bad param spec"; $i_param{$1} = $2; } sub i_resp_previously ($) { $_[0] =~ m#^(refs/tags/\S+)=(\w+)$# or badproto \*RO, __ "bad previously spec"; my $r = system qw(git check-ref-format), $1; confess "bad previously ref spec ($r)" if $r; $previously{$1} = $2; } our %i_wanted; our ($i_clogp, $i_version, $i_dscfn, $i_changesfn, @i_buildinfos); sub i_resp_want ($) { my ($keyword) = @_; die "$keyword ?" if $i_wanted{$keyword}++; defined $i_param{'csuite'} or badproto \*RO, "premature desire, no csuite"; $isuite = $i_param{'isuite'} // $i_param{'csuite'}; die unless $isuite =~ m/^$suite_re$/; if (!defined $dsc) { pushing(); rpush_handle_protovsn_bothends(); push_parse_dsc $i_dscfn, 'remote dsc', $i_version; if ($protovsn >= 6) { determine_whether_split_brain getfield $dsc, 'Format'; $do_split_brain eq ($i_param{'splitbrain'} // '') or badproto \*RO, "split brain mismatch, $do_split_brain != $i_param{'split_brain'}"; printdebug "rpush split brain $do_split_brain\n"; } } my @localpaths = i_method "i_want", $keyword; printdebug "[[ $keyword @localpaths\n"; foreach my $localpath (@localpaths) { protocol_send_file \*RI, $localpath; } print RI "files-end\n" or confess "$!"; } sub i_localname_parsed_changelog { return "remote-changelog.822"; } sub i_file_parsed_changelog { ($i_clogp, $i_version, $i_dscfn) = push_parse_changelog "$i_tmp/remote-changelog.822"; die if $i_dscfn =~ m#/|^\W#; } sub i_localname_dsc { defined $i_dscfn or badproto \*RO, "dsc (before parsed-changelog)"; return $i_dscfn; } sub i_file_dsc { } sub i_localname_buildinfo ($) { my $bi = $i_param{'buildinfo-filename'}; defined $bi or badproto \*RO, "buildinfo before filename"; defined $i_changesfn or badproto \*RO, "buildinfo before changes"; $bi =~ m{^\Q$package\E_[!-.0-~]*\.buildinfo$}s or badproto \*RO, "improper buildinfo filename"; return $&; } sub i_file_buildinfo { $rpush_verb eq 'push' or badproto \*RO, "buildinfo file but verb is $rpush_verb"; my $bi = $i_param{'buildinfo-filename'}; my $bd = parsecontrol "$i_tmp/$bi", $bi; my $ch = parsecontrol "$i_tmp/$i_changesfn", 'changes'; if (!forceing [qw(buildinfo-changes-mismatch)]) { files_compare_inputs($bd, $ch); (getfield $bd, $_) eq (getfield $ch, $_) or fail f_ "buildinfo mismatch in field %s", $_ foreach qw(Source Version); !defined $bd->{$_} or fail f_ "buildinfo contains forbidden field %s", $_ foreach qw(Changes Changed-by Distribution); } push @i_buildinfos, $bi; delete $i_param{'buildinfo-filename'}; } sub i_localname_changes { defined $i_dscfn or badproto \*RO, "dsc (before parsed-changelog)"; $i_changesfn = $i_dscfn; $i_changesfn =~ s/\.dsc$/_dgit.changes/ or die; return $i_changesfn; } sub i_file_changes { my $ch = parsecontrol "$i_tmp/$i_changesfn", 'changes'; unless ($rpush_verb eq 'push' || test_source_only_changes($ch)) { fail __ "build-host-supplied changes file is not source-only"; } } sub i_want_signed_tag { printdebug Dumper(\%i_param, $i_dscfn); defined $i_param{'head'} && defined $i_dscfn && defined $i_clogp && defined $i_param{'csuite'} or badproto \*RO, "premature desire for signed-tag"; my $head = $i_param{'head'}; die if $head =~ m/[^0-9a-f]/ || $head !~ m/^../; my $maintview = $i_param{'maint-view'}; die if defined $maintview && $maintview =~ m/[^0-9a-f]/; if ($protovsn == 4) { my $p = $i_param{'tagformat'} // ''; $p eq 'new' or badproto \*RO, "tag format mismatch: $p vs. new"; } die unless $i_param{'csuite'} =~ m/^$suite_re$/; $csuite = $&; defined $dsc or badproto \*RO, "dsc (before parsed-changelog)"; my @tagwants = push_tagwants $i_version, $head, $maintview, "tag"; return push_mktags $i_clogp, $i_dscfn, $i_changesfn, (__ 'remote changes file'), \@tagwants; } sub i_want_signed_dsc_changes { rename "$i_dscfn.tmp","$i_dscfn" or die "$i_dscfn $!"; sign_changes $i_changesfn; return ($i_dscfn, $i_changesfn, @i_buildinfos); } #---------- building etc. ---------- our $version; our $sourcechanges; our $dscfn; #----- `3.0 (quilt)' handling ----- our $fakeeditorenv = 'DGIT_FAKE_EDITOR_QUILT'; sub quiltify_make_dpkg_patch ($$$$$;$) { my ($oldtreeish,$newtreeish, $patchname,$author,$msg, $xinfo) = @_; $xinfo //= ''; mkpath '.git/dgit'; # we are in playtree my $patchfn = "debian/patches/$patchname"; ensuredir dirname $patchfn; open O, '>', $patchfn or confess "$patchfn: $!"; $msg =~ s/\n+/\n\n/; print O <>"$1"; shift; exec "$@"', 'x', $patchfn, @diffcmd; open S, ">> debian/patches/series" or confess "$!"; print S "$patchname\n" or confess "$!"; close S or confess "$!"; } sub normalise_mode_strip_exec ($) { my ($m) = @_; return $m eq '100755' ? '100644' : $m; } sub quiltify_trees_differ ($$;$$$) { my ($x,$y,$finegrained,$ignorenamesr,$unrepres) = @_; # returns true iff the two tree objects differ other than in debian/ # with $finegrained, # returns bitmask 01 - differ in upstream files except .gitignore # 02 - differ in .gitignore # if $ignorenamesr is defined, $ingorenamesr->{$fn} # is set for each modified .gitignore filename $fn # if $unrepres is defined, array ref to which is appeneded # a list of unrepresentable changes (changes that dpkg-source # cannot apply even just during unpack). local $/=undef; my @cmd = (@git, qw(diff-tree -z --no-renames)); push @cmd, qw(--name-only) unless $unrepres; push @cmd, qw(-r) if $finegrained || $unrepres; push @cmd, $x, $y; my $diffs= cmdoutput @cmd; my $r = 0; my @lmodes; foreach my $f (split /\0/, $diffs) { if ($unrepres && !@lmodes) { @lmodes = $f =~ m/^\:(\w+) (\w+) \w+ \w+ / or die "$_ ?"; next; } my ($oldmode,$newmode) = @lmodes; @lmodes = (); next if $f =~ m#^debian(?:/.*)?$#s; if ($unrepres) { eval { die __ "not a plain file\n" unless $newmode =~ m/^(?:10|12)\d{4}$/ || $oldmode =~ m/^(?:10|12)\d{4}$/; if ($oldmode =~ m/[^0]/ && $newmode =~ m/[^0]/) { # both old and new files exist die __ "mode or type changed in unsupported way\n" if normalise_mode_strip_exec($oldmode) ne normalise_mode_strip_exec($newmode); die __ "modified symlink\n" unless $newmode =~ m/^10/; } elsif ($oldmode =~ m/[^0]/) { # deletion die __ "deletion of symlink\n" unless $oldmode =~ m/^10/; } else { # creation die __ "creation with non-default mode, or symlink\n" unless $newmode =~ m/^100644$/ or $newmode =~ m/^100755$/; } }; if ($@) { local $/="\n"; chomp $@; push @$unrepres, [ $f, "$@ ($oldmode->$newmode)" ]; } } my $isignore = $f =~ m#^(?:.*/)?.gitignore$#s; $r |= $isignore ? 02 : 01; $ignorenamesr->{$f}=1 if $ignorenamesr && $isignore; } printdebug "quiltify_trees_differ $x $y => $r\n"; return $r; } sub quiltify_check_unrepresentable ($) { my ($unrepres) = @_; return unless @$unrepres; if ($quilt_mode =~ m/baredebian/) { # With baredebian, even if the upstream commitish has this # problem, we don't want to print this message, as nothing # is going to try to make a patch out of it anyway. return; } print STDERR f_ "dgit: cannot represent change: %s: %s\n", $_->[1], $_->[0] foreach @$unrepres; forceable_fail [qw(unrepresentable)], __ <{O2H} & 01)) { my $msg = f_ "--quilt=%s specified, implying patches-unapplied git tree\n". " but git tree differs from orig in upstream files.", $quilt_mode; $msg .= $fulldiffhint->($unapplied, 'HEAD'); if (!stat_exists "debian/patches" and $quilt_mode !~ m/baredebian/) { $msg .= __ "\n ... debian/patches is missing; perhaps this is a patch queue branch?"; } fail $msg; } if ($quilt_mode =~ m/dpm/ && ($diffbits->{H2A} & 01)) { fail +(f_ <($oldtiptree,'HEAD'); --quilt=%s specified, implying patches-applied git tree but git tree differs from result of applying debian/patches to upstream END } if ($quilt_mode =~ m/baredebian/) { # We need to construct a merge which has upstream files from # upstream and debian/ files from HEAD. read_tree_upstream $quilt_upstream_commitish, 1, $headref; my $version = getfield $clogp, 'Version'; my $upsversion = upstreamversion $version; my $merge = make_commit [ $headref, $quilt_upstream_commitish ], [ +(f_ <{O2A} & 01)) { # some patches progress __ "dgit view: creating patches-applied version using gbp pq"; gbp_pq_pc_aside(sub { runcmd shell_cmd 'exec >/dev/null', gbp_pq, qw(import); }); # gbp pq import creates a fresh branch; push back to dgit-view runcmd @git, qw(update-ref refs/heads/dgit-view HEAD); runcmd @git, qw(checkout -q dgit-view); } if ($quilt_mode =~ m/gbp|dpm/ && ($diffbits->{O2A} & 02)) { fail f_ <{O2H} & 02) && # user has modified .gitignore !($diffbits->{O2A} & 02)) { # patches do not change .gitignore progress __ "dgit view: creating patch to represent .gitignore changes"; ensuredir "debian/patches"; my $gipatch = "debian/patches/auto-gitignore"; open GIPATCH, ">>", "$gipatch" or confess "$gipatch: $!"; stat GIPATCH or confess "$gipatch: $!"; fail f_ "%s already exists; but want to create it". " to record .gitignore changes", $gipatch if (stat _)[7]; # TODO: The "Subject:" ought not to be translated print GIPATCH +(__ <>$gipatch", @git, qw(diff), $unapplied, $headref, "--", sort keys %$editedignores; open SERIES, "+>>", "debian/patches/series" or confess "$!"; defined seek SERIES, -1, 2 or $!==EINVAL or confess "$!"; my $newline; defined read SERIES, $newline, 1 or confess "$!"; print SERIES "\n" or confess "$!" unless $newline eq "\n"; print SERIES "auto-gitignore\n" or confess "$!"; close SERIES or die $!; runcmd @git, qw(add -f -- debian/patches/series), $gipatch; commit_admin +(__ < $git_commit_id, # Child => $c, # or undef if P=T # Whynot => $reason_edge_PC_unsuitable, # in @nots only # Nontrivial => true iff $p..$c has relevant changes # }; my @todo; my @nots; my $sref_S; my $max_work=100; my %considered; # saves being exponential on some weird graphs my $t_sentinels = quiltify_tree_sentinelfiles $target; my $not = sub { my ($search,$whynot) = @_; printdebug " search NOT $search->{Commit} $whynot\n"; $search->{Whynot} = $whynot; push @nots, $search; no warnings qw(exiting); next; }; push @todo, { Commit => $target, }; while (@todo) { my $c = shift @todo; next if $considered{$c->{Commit}}++; $not->($c, __ "maximum search space exceeded") if --$max_work <= 0; printdebug "quiltify investigate $c->{Commit}\n"; # are we done? if (!quiltify_trees_differ $c->{Commit}, $oldtiptree) { printdebug " search finished hooray!\n"; $sref_S = $c; last; } quiltify_nofix_bail " $c->{Commit}", " (tree object $oldtiptree)"; if ($quilt_mode eq 'smash') { printdebug " search quitting smash\n"; last; } my $c_sentinels = quiltify_tree_sentinelfiles $c->{Commit}; $not->($c, f_ "has %s not %s", $c_sentinels, $t_sentinels) if $c_sentinels ne $t_sentinels; my $commitdata = cmdoutput @git, qw(cat-file commit), $c->{Commit}; $commitdata =~ m/\n\n/; $commitdata =~ $`; my @parents = ($commitdata =~ m/^parent (\w+)$/gm); @parents = map { { Commit => $_, Child => $c } } @parents; $not->($c, __ "root commit") if !@parents; foreach my $p (@parents) { $p->{Nontrivial}= quiltify_trees_differ $p->{Commit},$c->{Commit}; } my $ndiffers = grep { $_->{Nontrivial} } @parents; $not->($c, f_ "merge (%s nontrivial parents)", $ndiffers) if $ndiffers > 1; foreach my $p (@parents) { printdebug "considering C=$c->{Commit} P=$p->{Commit}\n"; my @cmd= (@git, qw(diff-tree -r --name-only), $p->{Commit},$c->{Commit}, qw(-- debian/patches .pc debian/source/format)); my $patchstackchange = cmdoutput @cmd; if (length $patchstackchange) { $patchstackchange =~ s/\n/,/g; $not->($p, f_ "changed %s", $patchstackchange); } printdebug " search queue P=$p->{Commit} ", ($p->{Nontrivial} ? "NT" : "triv"),"\n"; push @todo, $p; } } if (!$sref_S) { printdebug "quiltify want to smash\n"; my $abbrev = sub { my $x = $_[0]{Commit}; $x =~ s/(.*?[0-9a-z]{8})[0-9a-z]*$/$1/; return $x; }; if ($quilt_mode eq 'linear') { print STDERR f_ "\n%s: error: quilt fixup cannot be linear. Stopped at:\n", $us; my $all_gdr = !!@nots; foreach my $notp (@nots) { my $c = $notp->{Child}; my $cprange = $abbrev->($notp); $cprange .= "..".$abbrev->($c) if $c; print STDERR f_ "%s: %s: %s\n", $us, $cprange, $notp->{Whynot}; $all_gdr &&= $notp->{Child} && (git_cat_file $notp->{Child}{Commit}, 'commit') =~ m{^\[git-debrebase(?! split[: ]).*\]$}m; } print STDERR "\n"; $failsuggestion = [ grep { $_->[0] ne 'quilt-mode' } @$failsuggestion ] if $all_gdr; print STDERR "$us: $_->[1]\n" foreach @$failsuggestion; fail __ "quilt history linearisation failed. Search \`quilt fixup' in dgit(7).\n"; } elsif ($quilt_mode eq 'smash') { } elsif ($quilt_mode eq 'try-linear') { progress __ "quilt fixup cannot be linear, smashing..."; } else { confess "$quilt_mode ?"; } my $time = $ENV{'GIT_COMMITTER_DATE'} || time; $time =~ s/\s.*//; # trim timezone from GIT_COMMITTER_DATE my $ncommits = 3; my $msg = cmdoutput @git, qw(log), "-n$ncommits"; quiltify_make_dpkg_patch $oldtiptree, $target, "auto-$version-$target-$time", (getfield $clogp, 'Maintainer'), (f_ "Automatically generated patch (%s)\n". "Last (up to) %s git changes, FYI:\n\n", $clogp->{Version}, $ncommits). $msg; return; } progress __ "quiltify linearisation planning successful, executing..."; for (my $p = $sref_S; my $c = $p->{Child}; $p = $p->{Child}) { printdebug "quiltify traverse $p->{Commit}..$c->{Commit}\n"; next unless $p->{Nontrivial}; my $cc = $c->{Commit}; my $commitdata = cmdoutput @git, qw(cat-file commit), $cc; $commitdata =~ m/\n\n/ or die "$c ?"; $commitdata = $`; my $msg = $'; #'; $commitdata =~ m/^author (.*) \d+ [-+0-9]+$/m or die "$cc ?"; my $author = $1; my $commitdate = cmdoutput @git, qw(log -n1 --pretty=format:%aD), $cc; $msg =~ s/^(.*)\n*/$1\n/ or die "$cc $msg ?"; my $strip_nls = sub { $msg =~ s/\n+$//; $msg .= "\n"; }; $strip_nls->(); my $title = $1; my $patchname; my $patchdir; my $gbp_check_suitable = sub { $_ = shift; my ($what) = @_; eval { die __ "contains unexpected slashes\n" if m{//} || m{/$}; die __ "contains leading punctuation\n" if m{^\W} || m{/\W}; die __ "contains bad character(s)\n" if m{[^-a-z0-9_.+=~/]}i; die __ "is series file\n" if m{$series_filename_re}o; die __ "too long\n" if length > 200; }; return $_ unless $@; print STDERR f_ "quiltifying commit %s: ignoring/dropping Gbp-Pq %s: %s", $cc, $what, $@; return undef; }; if ($msg =~ s/^ (?: gbp(?:-pq)? : \s* name \s+ | gbp-pq-name: \s* ) (\S+) \s* \n //ixm) { $patchname = $gbp_check_suitable->($1, 'Name'); } if ($msg =~ s/^ (?: gbp(?:-pq)? : \s* topic \s+ | gbp-pq-topic: \s* ) (\S+) \s* \n //ixm) { $patchdir = $gbp_check_suitable->($1, 'Topic'); } $strip_nls->(); if (!defined $patchname) { $patchname = $title; $patchname =~ s/[.:]$//; use Text::Iconv; eval { my $converter = new Text::Iconv qw(UTF-8 ASCII//TRANSLIT); my $translitname = $converter->convert($patchname); die unless defined $translitname; $patchname = $translitname; }; print STDERR +(f_ "dgit: patch title transliteration error: %s", $@) if $@; $patchname =~ y/ A-Z/-a-z/; $patchname =~ y/-a-z0-9_.+=~//cd; $patchname =~ s/^\W/x-$&/; $patchname = substr($patchname,0,40); $patchname .= ".patch"; } if (!defined $patchdir) { $patchdir = ''; } if (length $patchdir) { $patchname = "$patchdir/$patchname"; } if ($patchname =~ m{^(.*)/}) { mkpath "debian/patches/$1"; } my $index; for ($index=''; stat "debian/patches/$patchname$index"; $index++) { } $!==ENOENT or confess "$patchname$index $!"; quiltify_make_dpkg_patch $p->{Commit} ,$cc, "$patchname$index", $author, $msg, "Date: $commitdate\n". "X-Dgit-Generated: $clogp->{Version} $cc\n"; } runcmd @git, qw(checkout -q), $target; } sub build_maybe_quilt_fixup () { my ($format,$fopts) = get_source_format; return unless madformat_wantfixup $format; # sigh check_for_vendor_patches(); my $clogp = parsechangelog(); my $headref = git_rev_parse('HEAD'); my $symref = git_get_symref(); my $upstreamversion = upstreamversion $version; prep_ud(); changedir $playground; my $splitbrain_cachekey; if (do_split_brain()) { my $cachehit; ($cachehit, $splitbrain_cachekey) = quilt_check_splitbrain_cache($headref, $upstreamversion); if ($cachehit) { changedir $maindir; return; } } unpack_playtree_need_cd_work($headref); if (do_split_brain()) { runcmd @git, qw(checkout -q -b dgit-view); # so long as work is not deleted, its current branch will # remain dgit-view, rather than master, so subsequent calls to # unpack_playtree_need_cd_work # will DTRT, resetting dgit-view. confess if $made_split_brain; $made_split_brain = 1; } chdir '..'; if ($fopts->{'single-debian-patch'}) { fail f_ "quilt mode %s does not make sense (or is not supported) with single-debian-patch", $quilt_mode if quiltmode_splitting(); # We always use dpkg-source --commit in this case, because # otherwise we can generate source packages that trigger horrible # bugs in dpkg-source. # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1018984 quilt_fixup_dpkgsource_singlepatch($clogp, $headref, $upstreamversion); } elsif ($quilt_mode =~ m/single/) { quilt_fixup_git_singlepatch($clogp, $headref, $upstreamversion); } else { quilt_fixup_multipatch($clogp, $headref, $upstreamversion, $splitbrain_cachekey); } if (do_split_brain()) { my $dgitview = git_rev_parse 'HEAD'; changedir $maindir; reflog_cache_insert "refs/$splitbraincache", $splitbrain_cachekey, $dgitview; changedir "$playground/work"; my $saved = maybe_split_brain_save $headref, $dgitview, __ "converted"; progress f_ "dgit view: created (%s)", $saved; } changedir $maindir; runcmd_ordryrun_local @git, qw(pull --ff-only -q), "$playground/work", qw(master); } sub build_check_quilt_splitbrain () { build_maybe_quilt_fixup(); } sub unpack_playtree_need_cd_work ($) { my ($headref) = @_; # prep_ud() must have been called already. if (!chdir "work") { # Check in the filesystem because sometimes we run prep_ud # in between multiple calls to unpack_playtree_need_cd_work. confess "$!" unless $!==ENOENT; mkdir "work" or confess "$!"; changedir "work"; mktree_in_ud_here(); } runcmd @git, qw(reset -q --hard), $headref; } sub unpack_playtree_linkorigs ($$) { my ($upstreamversion, $fn) = @_; # calls $fn->($leafname); my $bpd_abs = bpd_abs(); dotdot_bpd_transfer_origs $bpd_abs, $upstreamversion, sub { 1 }; opendir QFD, $bpd_abs or fail "buildproductsdir: $bpd_abs: $!"; while ($!=0, defined(my $leaf = readdir QFD)) { my $f = bpd_abs()."/".$leaf; { local ($debuglevel) = $debuglevel-1; printdebug "QF linkorigs bpd $leaf, $f ?\n"; } next unless is_orig_file_of_vsn $leaf, $upstreamversion; printdebug "QF linkorigs $leaf, $f Y\n"; link_ltarget $f, $leaf or die "$leaf $!"; $fn->($leaf); } die "$buildproductsdir: $!" if $!; closedir QFD; } sub quilt_fixup_delete_pc () { runcmd @git, qw(rm -rqf .pc); commit_admin +(__ <' or confess "$!"; print $fakedsc <addfile($fh); print $fakedsc " ".$md->hexdigest." $size $leaf\n" or confess "$!"; }; unpack_playtree_linkorigs($upstreamversion, $dscaddfile); my @files=qw(debian/source/format debian/rules debian/control debian/changelog); foreach my $maybe (qw(debian/patches debian/source/options debian/source/include-binaries debian/tests/control)) { next unless stat_exists "$maindir/$maybe"; push @files, $maybe; } if (open IB, "$maindir/debian/source/include-binaries") { BFILE: while () { s{^[ \t]*}{}; s{[ \t\n]*$}{}; next if m{^\#}; next unless length; our $include_binaries_warning; $include_binaries_warning++ or print STDERR __ "warning: package uses dpkg-source include-binaries feature - not all changes are visible in patches!\n"; my @bpath; my $bfile_in = $_; my $bpath_chk; foreach my $ent (split m{/}, $bfile_in) { my $wrong = sub { no warnings qw(exiting); print STDERR f_ "warning: ignoring bad include-binaries file %s: %s\n", $bfile_in, $_[0]; next BFILE; }; $wrong->(f_ "forbidden path component '%s'", $ent) if grep { $_ eq $ent } '', '.', '..'; if (!@bpath) { # check first component # dpkg-source doesn't like files in debian/ which it # considers binary, so the user may have listed # them. We should silently ignore this. #1026918. if ($ent eq 'debian') { no warnings qw(exiting); next BFILE; } $wrong->(f_ "path starts with '%s'", $ent) if grep { $_ eq $ent } qw(.git); } push @bpath, $ent; $bpath_chk = join '/', @bpath; if (!lstat "$maindir/$bpath_chk") { confess "$maindir/$bpath_chk" unless $!==ENOENT; next BFILE; } elsif (-f _ || -d _) { } else { $wrong->(f_ "path to '%s' not a plain file or directory", $bpath_chk); } }; push @files, $bpath_chk; } IB->error and confess "$!"; close IB; } else { $! == ENOENT || confess "$!"; } my $debtar= srcfn $fakeversion,'.debian.tar'; runcmd qw(tar -cf), "./$debtar", qw(-C), $maindir, @files; runcmd qw(gzip -1n), "./$debtar"; $dscaddfile->("$debtar.gz"); close $fakedsc or confess "$!"; } sub quilt_fakedsc2unapplied ($$) { my ($headref, $upstreamversion) = @_; # must be run in the playground # quilt_need_fake_dsc must have been called quilt_need_fake_dsc($upstreamversion); runcmd qw(sh -ec), 'exec dpkg-source --no-check --skip-patches -x fake.dsc >/dev/null'; my $fakexdir= $package.'-'.(stripepoch $upstreamversion); rename $fakexdir, "fake" or die "$fakexdir $!"; changedir 'fake'; remove_stray_gits(__ "source package"); mktree_in_ud_here(); rmtree '.pc'; rmtree 'debian'; # git checkout commitish paths does not delete! runcmd @git, qw(checkout -f), $headref, qw(-- debian); my $unapplied=git_add_write_tree(); printdebug "fake orig tree object $unapplied\n"; return $unapplied; } sub quilt_check_splitbrain_cache ($$) { my ($headref, $upstreamversion) = @_; # Called only if we are in (potentially) split brain mode. # Called in playground. # Computes the cache key and looks in the cache. # Returns ($dgit_view_commitid, $cachekey) or (undef, $cachekey) quilt_need_fake_dsc($upstreamversion); my $splitbrain_cachekey; progress f_ "dgit: split brain (separate dgit view) may be needed (--quilt=%s).", $quilt_mode; # we look in the reflog of dgit-intern/quilt-cache # we look for an entry whose message is the key for the cache lookup my @cachekey = (qw(dgit), $our_version); push @cachekey, $upstreamversion; push @cachekey, $quilt_mode; push @cachekey, $headref; push @cachekey, $quilt_upstream_commitish // '-'; push @cachekey, hashfile('fake.dsc'); my $srcshash = Digest::SHA->new(256); my %sfs = ( %INC, '$0(dgit)' => $0 ); foreach my $sfk (sort keys %sfs) { next unless $sfk =~ m/^\$0\b/ || $sfk =~ m{^Debian/Dgit\b}; $srcshash->add($sfk," "); $srcshash->add(hashfile($sfs{$sfk})); $srcshash->add("\n"); } push @cachekey, $srcshash->hexdigest(); $splitbrain_cachekey = "@cachekey"; printdebug "splitbrain cachekey $splitbrain_cachekey\n"; my $cachehit = reflog_cache_lookup "refs/$splitbraincache", $splitbrain_cachekey; if ($cachehit) { unpack_playtree_need_cd_work($headref); my $saved = maybe_split_brain_save $headref, $cachehit, "cache-hit"; if ($cachehit ne $headref) { progress f_ "dgit view: found cached (%s)", $saved; runcmd @git, qw(checkout -q -b dgit-view), $cachehit; $made_split_brain = 1; return ($cachehit, $splitbrain_cachekey); } progress __ "dgit view: found cached, no changes required"; return ($headref, $splitbrain_cachekey); } printdebug "splitbrain cache miss\n"; return (undef, $splitbrain_cachekey); } sub baredebian_origtarballs_scan ($$$) { my ($fakedfi, $upstreamversion, $dir) = @_; if (!opendir OD, $dir) { return if $! == ENOENT; fail "opendir $dir (origs): $!"; } while ($!=0, defined(my $leaf = readdir OD)) { { local ($debuglevel) = $debuglevel-1; printdebug "BDOS $dir $leaf ?\n"; } next unless is_orig_file_of_vsn $leaf, $upstreamversion; next if grep { $_->{Filename} eq $leaf } @$fakedfi; push @$fakedfi, { Filename => $leaf, Path => "$dir/$leaf", }; } die "$dir; $!" if $!; closedir OD; } sub quilt_fixup_multipatch ($$$) { my ($clogp, $headref, $upstreamversion, $splitbrain_cachekey) = @_; progress f_ "examining quilt state (multiple patches, %s mode)", $quilt_mode; # Our objective is: # - honour any existing .pc in case it has any strangeness # - determine the git commit corresponding to the tip of # the patch stack (if there is one) # - if there is such a git commit, convert each subsequent # git commit into a quilt patch, simulating dpkg-source --commit # - otherwise convert all the differences in the tree into # a single git commit # # To do this we: # So we need to find out what the tree for the tip of the patch # stack is. # 1. Collect all relevant .orig from parent directory # 2. Generate a debian.tar.gz out of # debian/{patches,rules,source/format,source/options} # 3. Generate a fake .dsc containing just these fields: # Format Source Version Files # 4. Extract the fake .dsc # # Then we can actually do the fake dpkg-source --commit. # Another situation we may have to cope with is gbp-style # patches-unapplied trees. # # We would want to detect these, so we know to escape into # quilt_fixup_gbp. However, this is in general not possible. # Consider a package with a one patch which the dgit user reverts # (with git revert or the moral equivalent). # # That is indistinguishable in contents from a patches-unapplied # tree. And looking at the history to distinguish them is not # useful because the user might have made a confusing-looking git # history structure (which ought to produce an error if dgit can't # cope, not a silent reintroduction of an unwanted patch). # # So gbp users will have to pass an option. But we can usually # detect their failure to do so: if the tree is not a clean # patches-applied tree, quilt linearisation fails, but the tree # _is_ a clean patches-unapplied tree, we can suggest that maybe # they want --quilt=unapplied. # # To help detect this, when we are extracting the fake dsc, we # first extract it with --skip-patches, and then apply the patches # afterwards with dpkg-source --before-build. That lets us save a # tree object corresponding to .origs. if ($quilt_mode eq 'linear' && branch_is_gdr($headref)) { # This is much faster. It also makes patches that gdr # likes better for future updates without laundering. # # However, it can fail in some casses where we would # succeed: if there are existing patches, which correspond # to a prefix of the branch, but are not in gbp/gdr # format, gdr will fail (exiting status 7), but we might # be able to figure out where to start linearising. That # will be slower so hopefully there's not much to do. unpack_playtree_need_cd_work $headref; my @cmd = (@git_debrebase, qw(--noop-ok -funclean-mixed -funclean-ordering make-patches --quiet-would-amend)); # We tolerate soe snags that gdr wouldn't, by default. if (act_local()) { debugcmd "+",@cmd; $!=0; $?=-1; failedcmd @cmd if system @cmd and not ($? == 7*256 or $? == -1 && $!==ENOENT); } else { dryrun_report @cmd; } $headref = git_rev_parse('HEAD'); changedir '..'; } my $unapplied=quilt_fakedsc2unapplied($headref, $upstreamversion); ensuredir '.pc'; my @bbcmd = (qw(sh -ec), 'exec dpkg-source --before-build . >/dev/null'); $!=0; $?=-1; debugcmd "+",@bbcmd; if (system @bbcmd) { failedcmd @bbcmd if $? < 0; fail __ <{Commit}; if ($ti->{OrigPart} eq 'orig') { runcmd qw(git read-tree), $c; } elsif ($ti->{OrigPart} =~ m/orig-/) { read_tree_subdir $', $c; } else { confess "$ti->OrigPart} ?" } $parents .= "parent $c\n"; } my $tree = git_write_tree(); my $mbody = f_ 'Combine orig tarballs for %s %s', $package, $upstreamversion; $uheadref = hash_commit_text < quiltify_trees_differ($unapplied,$uheadref, 1, \%editedignores, \@unrepres), H2A => quiltify_trees_differ($uheadref, $oldtiptree,1), O2A => quiltify_trees_differ($unapplied,$oldtiptree,1), }; my @dl; foreach my $bits (qw(01 02)) { foreach my $v (qw(O2H O2A H2A)) { push @dl, ($diffbits->{$v} & $bits) ? '##' : '=='; } } printdebug "differences \@dl @dl.\n"; progress f_ "%s: base trees orig=%.20s o+d/p=%.20s", $us, $unapplied, $oldtiptree; # TRANSLATORS: Try to keep this ascii-art layout right. The 0s in # %9.00009s will be ignored and are there to make the format the # same length (9 characters) as the output it generates. If you # change the value 9, your translations of "upstream" and # 'tarball' must fit into the new length, and you should change # the number of 0s. Do not reduce it below 4 as HEAD has to fit # too. progress f_ "%s: quilt differences: src: %s orig %s gitignores: %s orig %s\n". "%s: quilt differences: %9.00009s %s o+d/p %9.00009s %s o+d/p", $us, $dl[0], $dl[1], $dl[3], $dl[4], $us, $uhead_whatshort, $dl[2], $uhead_whatshort, $dl[5]; quiltify_check_unrepresentable(\@unrepres); my @failsuggestion; if ($onlydebian) { push @failsuggestion, [ 'onlydebian', __ "This has only a debian/ directory; you probably want --quilt=bare debian." ] unless $quilt_mode =~ m/baredebian/; } elsif (!($diffbits->{O2H} & $diffbits->{O2A})) { push @failsuggestion, [ 'unapplied', __ "This might be a patches-unapplied branch." ]; } elsif (!($diffbits->{H2A} & $diffbits->{O2A})) { push @failsuggestion, [ 'applied', __ "This might be a patches-applied branch." ]; } push @failsuggestion, [ 'quilt-mode', __ "Maybe you need one of --[quilt=]gbp --[quilt=]dpm --quilt=unapplied ?" ]; push @failsuggestion, [ 'gitattrs', __ "Warning: Tree has .gitattributes. See GITATTRIBUTES in dgit(7)." ] if stat_exists '.gitattributes'; push @failsuggestion, [ 'origs', __ "Maybe orig tarball(s) are not identical to git representation?" ] unless $onlydebian && $quilt_mode !~ m/baredebian/; # ^ in that case, we didn't really look properly if (quiltmode_splitting()) { quiltify_splitting($clogp, $unapplied, $headref, $oldtiptree, $diffbits, \%editedignores, $splitbrain_cachekey); return; } progress f_ "starting quiltify (multiple patches, %s mode)", $quilt_mode; quiltify($clogp,$headref,$oldtiptree,\@failsuggestion); runcmd @git, qw(checkout -q), (qw(master dgit-view)[do_split_brain()]); if (!open P, '>>', ".pc/applied-patches") { $!==&ENOENT or confess "$!"; } else { close P; } commit_quilty_patch(); if ($mustdeletepc) { quilt_fixup_delete_pc(); } } sub quilt_fixup_editor () { my $descfn = $ENV{$fakeeditorenv}; my $editing = $ARGV[$#ARGV]; open I1, '<', $descfn or confess "$descfn: $!"; open I2, '<', $editing or confess "$editing: $!"; unlink $editing or confess "$editing: $!"; open O, '>', $editing or confess "$editing: $!"; while () { print O or confess "$!"; } I1->error and confess "$!"; my $copying = 0; while () { $copying ||= m/^\-\-\- /; next unless $copying; print O or confess "$!"; } I2->error and confess "$!"; close O or die $1; finish 0; } sub maybe_apply_patches_dirtily () { return unless $quilt_mode =~ m/gbp|unapplied|baredebian/; print STDERR __ <[0] } @vsns; @vsns = sort { -version_compare($a, $b) } @vsns; $changes_since_version = $vsns[0]; progress f_ "changelog will contain changes since %s", $vsns[0]; } else { $changes_since_version = '_'; progress __ "package seems new, not specifying -v"; } } if ($changes_since_version ne '_') { return ("-v$changes_since_version"); } else { return (); } } sub changesopts () { return (changesopts_initial(), changesopts_version()); } sub massage_dbp_args ($;$) { my ($cmd,$xargs) = @_; # Since we split the source build out so we can do strange things # to it, massage the arguments to dpkg-buildpackage so that the # main build doessn't build source (or add an argument to stop it # building source by default). debugcmd '#massaging#', @$cmd if $debuglevel>1; # -nc has the side effect of specifying -b if nothing else specified # and some combinations of -S, -b, et al, are errors, rather than # later simply overriding earlie. So we need to: # - search the command line for these options # - pick the last one # - perhaps add our own as a default # - perhaps adjust it to the corresponding non-source-building version my $dmode = '-F'; foreach my $l ($cmd, $xargs) { next unless $l; @$l = grep { !(m/^-[SgGFABb]$|^--build=/s and $dmode=$_) } @$l; } push @$cmd, '-nc'; #print STDERR "MASS1 ",Dumper($cmd, $xargs, $dmode); my $r = WANTSRC_BUILDER; printdebug "massage split $dmode.\n"; if ($dmode =~ s/^--build=//) { $r = 0; my @d = split /,/, $dmode; $r |= WANTSRC_SOURCE if grep { s/^full$/binary/ } @d; $r |= WANTSRC_SOURCE if grep { s/^source$// } @d; $r |= WANTSRC_BUILDER if grep { m/./ } @d; fail __ "Wanted to build nothing!" unless $r; $dmode = '--build='. join ',', grep m/./, @d; } else { $r = $dmode =~ m/[S]/ ? WANTSRC_SOURCE : $dmode =~ y/gGF/ABb/ ? WANTSRC_SOURCE | WANTSRC_BUILDER : $dmode =~ m/[ABb]/ ? WANTSRC_BUILDER : confess "$dmode ?"; } printdebug "massage done $r $dmode.\n"; push @$cmd, $dmode; #print STDERR "MASS2 ",Dumper($cmd, $xargs, $r); return $r; } sub in_bpd (&) { my ($fn) = @_; my $wasdir = must_getcwd(); changedir $buildproductsdir; $fn->(); changedir $wasdir; } # this sub must run with CWD=$buildproductsdir (eg in in_bpd) sub postbuild_mergechanges ($) { my ($msg_if_onlyone) = @_; # If there is only one .changes file, fail with $msg_if_onlyone, # or if that is undef, be a no-op. # Returns the changes file to report to the user. my $pat = changespat $version; my @changesfiles = grep { !m/_multi\.changes/ } glob $pat; @changesfiles = sort { ($b =~ m/_source\.changes$/ <=> $a =~ m/_source\.changes$/) or $a cmp $b } @changesfiles; my $result; if (@changesfiles==1) { fail +(f_ < !$includedirty return !$includedirty; } sub build_source { $sourcechanges = changespat $version,'source'; if (act_local()) { unlink "$buildproductsdir/$sourcechanges" or $!==ENOENT or fail f_ "remove %s: %s", $sourcechanges, $!; } # confess unless !!$made_split_brain == do_split_brain(); my @cmd = (@dpkgsource, qw(-b --include-removal)); my $leafdir; if (building_source_in_playtree()) { $leafdir = 'work'; my $headref = git_rev_parse('HEAD'); # If we are in split brain, there is already a playtree with # the thing we should package into a .dsc (thanks to quilt # fixup). If not, make a playtree prep_ud() unless $made_split_brain; changedir $playground; unless ($made_split_brain) { my $upstreamversion = upstreamversion $version; unpack_playtree_linkorigs($upstreamversion, sub { }); unpack_playtree_need_cd_work($headref); changedir '..'; } # We are presenting dpkg-source with a tree with no .pc directory. # Without this option, dpkg-source tries to guess if it should # mess about (un)applying patches. Depending on what precisely is # in the patches, it can guess wrong. push @cmd, qw(--no-preparation); runcmd @cmd, qw(--), $leafdir; } else { $leafdir = basename $maindir; if ($buildproductsdir ne '..') { # Well, we are going to run dpkg-source -b which consumes # origs from .. and generates output there. To make this # work when the bpd is not .. , we would have to (i) link # origs from bpd to .. , (ii) check for files that # dpkg-source -b would/might overwrite, and afterwards # (iii) move all the outputs back to the bpd (iv) except # for the origs which should be deleted from .. if they # weren't there beforehand. And if there is an error and # we don't run to completion we would necessarily leave a # mess. This is too much. The real way to fix this # is for dpkg-source to have bpd support. confess unless $includedirty; fail __ "--include-dirty not supported with --build-products-dir, sorry"; } changedir '..'; runcmd_ordryrun_local @cmd, qw(--), $leafdir; } changedir $leafdir; my @gencmd = (qw(sh -ec), 'exec >../$1; shift; exec "$@"','x', $sourcechanges, @dpkggenchanges, qw(-S), changesopts()); if (building_source_in_playtree()) { runcmd @gencmd; } else { runcmd_ordryrun_local @gencmd; } changedir '..'; printdebug "moving $dscfn, $sourcechanges, etc. to ".bpd_abs()."\n"; $dsc = parsecontrol($dscfn, "source package"); my $mv = sub { my ($why, $l) = @_; printdebug " renaming ($why) $l\n"; return unless act_local(); rename_link_xf 0, "$l", bpd_abs()."/$l" or fail f_ "put in place new built file (%s): %s", $l, $@; }; foreach my $l (split /\n/, getfield $dsc, 'Files') { $l =~ m/\S+$/ or next; $mv->('Files', $&); } $mv->('dsc', $dscfn); $mv->('changes', $sourcechanges); changedir $maindir; } sub cmd_build_source { badusage __ "build-source takes no additional arguments" if @ARGV; build_prep(WANTSRC_SOURCE); build_source(); maybe_unapply_patches_again(); printdone f_ "source built, results in %s and %s", $dscfn, $sourcechanges; } sub cmd_push_source { prep_push(); fail __ "dgit push-source: --include-dirty/--ignore-dirty does not make". "sense with push-source!" if $includedirty; build_check_quilt_splitbrain(); if ($changesfile) { my $changes = parsecontrol("$buildproductsdir/$changesfile", __ "source changes file"); unless (test_source_only_changes($changes)) { fail __ "user-specified changes file is not source-only"; } } else { # Building a source package is very fast, so just do it build_source(); confess "er, patches are applied dirtily but shouldn't be.." if $patches_applied_dirtily; $changesfile = $sourcechanges; } dopush(); } sub binary_builder { my ($bbuilder, $pbmc_msg, @args) = @_; build_prep(WANTSRC_SOURCE); build_source(); midbuild_checkchanges(); in_bpd { if (act_local()) { stat_exists $dscfn or fail f_ "%s (in build products dir): %s", $dscfn, $!; stat_exists $sourcechanges or fail f_ "%s (in build products dir): %s", $sourcechanges, $!; } runcmd_ordryrun_local @$bbuilder, @args; }; maybe_unapply_patches_again(); in_bpd { postbuild_mergechanges($pbmc_msg); }; } sub cmd_sbuild { build_prep_early(); maybe_warn_opt_confusion 'sbuild', 'sbuild', \@ARGV; binary_builder(\@sbuild, (__ <; }; D->error and fail f_ "read %s: %s", $dscfn, $!; close C; # we don't normally need this so import it here use Dpkg::Source::Package; my $dp = new Dpkg::Source::Package filename => $dscfn, options => { require_valid_signature => $needsig }; { local $SIG{__WARN__} = sub { print STDERR $_[0]; return unless $needsig; fail __ "import-dsc signature check failed"; }; if (!$dp->is_signed()) { warn f_ "%s: warning: importing unsigned .dsc\n", $us; } else { my $r = $dp->check_signature(); confess "->check_signature => $r" if $needsig && $r; } } parse_dscdata(); $package = getfield $dsc, 'Source'; parse_dsc_field($dsc, __ "Dgit metadata in .dsc") unless forceing [qw(import-dsc-with-dgit-field)]; parse_dsc_field_def_dsc_distro(); $isuite = 'DGIT-IMPORT-DSC'; $idistro //= $dsc_distro; notpushing(); if (defined $dsc_hash) { progress __ "dgit: import-dsc of .dsc with Dgit field, using git hash"; resolve_dsc_field_commit undef, undef; } if (defined $dsc_hash) { my @cmd = (qw(sh -ec), "echo $dsc_hash | git cat-file --batch-check"); my $objgot = cmdoutput @cmd; if ($objgot =~ m#^\w+ missing\b#) { fail f_ < 0) { progress __ "Not fast forward, forced update."; } else { fail f_ "Not fast forward to %s", $dsc_hash; } } import_dsc_result $dstbranch, $dsc_hash, "dgit import-dsc (Dgit): $info", f_ "updated git ref %s", $dstbranch; return 0; } fail f_ <{Filename}; # We transfer all the pieces of the dsc to the bpd, not just # origs. This is by analogy with dgit fetch, which wants to # keep them somewhere to avoid downloading them again. # We make symlinks, though. If the user wants copies, then # they can copy the parts of the dsc to the bpd using dcmd, # or something. my $here = "$buildproductsdir/$f"; if (lstat $here) { if (stat $here) { next; } fail f_ "lstat %s works but stat gives %s !", $here, $!; } fail f_ "stat %s: %s", $here, $! unless $! == ENOENT; printdebug "not in bpd, $f ...\n"; # $f does not exist in bpd, we need to transfer it my $there = $dscfn; $there =~ s{[^/]+$}{$f} or confess "$there ?"; # $there is file we want, relative to user's cwd, or abs printdebug "not in bpd, $f, test $there ...\n"; stat $there or fail f_ "import %s requires %s, but: %s", $dscfn, $there, $!; if ($there =~ m#^(?:\./+)?\.\./+#) { # $there is relative to user's cwd my $there_from_parent = $'; if ($buildproductsdir !~ m{^/}) { # abs2rel, despite its name, can take two relative paths $there = File::Spec->abs2rel($there,$buildproductsdir); # now $there is relative to bpd, great printdebug "not in bpd, $f, abs2rel, $there ...\n"; } else { $there = (dirname $maindir)."/$there_from_parent"; # now $there is absoute printdebug "not in bpd, $f, rel2rel, $there ...\n"; } } elsif ($there =~ m#^/#) { # $there is absolute already printdebug "not in bpd, $f, abs, $there ...\n"; } else { fail f_ "cannot import %s which seems to be inside working tree!", $dscfn; } symlink $there, $here or fail f_ "symlink %s to %s: %s", $there, $here, $!; progress f_ "made symlink %s -> %s", $here, $there; # print STDERR Dumper($fi); } my @mergeinputs = generate_commits_from_dsc(); die unless @mergeinputs == 1; my $newhash = $mergeinputs[0]{Commit}; if ($oldhash) { if ($force > 0) { progress __ "Import, forced update - synthetic orphan git history."; } elsif ($force < 0) { progress __ "Import, merging."; my $tree = cmdoutput @git, qw(rev-parse), "$newhash:"; my $version = getfield $dsc, 'Version'; my $clogp = commit_getclogp $newhash; my $authline = clogp_authline $clogp; $newhash = hash_commit_text <",@cmd; exec @cmd or fail f_ "exec git clone: %s\n", $!; } sub pre_print_dgit_repos_server_source_url () { not_necessarily_a_tree(); } sub cmd_print_dgit_repos_server_source_url { badusage __ "no arguments allowed to dgit print-dgit-repos-server-source-url" if @ARGV; my $url = repos_server_url(); print $url, "\n" or confess "$!"; } sub pre_print_dpkg_source_ignores { not_necessarily_a_tree(); } sub cmd_print_dpkg_source_ignores { badusage __ "no arguments allowed to dgit print-dpkg-source-ignores" if @ARGV; print "@dpkg_source_ignores\n" or confess "$!"; } sub cmd_setup_mergechangelogs { badusage __ "no arguments allowed to dgit setup-mergechangelogs" if @ARGV; local $isuite = 'DGIT-SETUP-TREE'; setup_mergechangelogs(1); } sub cmd_setup_useremail { badusage __ "no arguments allowed to dgit setup-useremail" if @ARGV; local $isuite = 'DGIT-SETUP-TREE'; setup_useremail(1); } sub cmd_setup_gitattributes { badusage __ "no arguments allowed to dgit setup-useremail" if @ARGV; local $isuite = 'DGIT-SETUP-TREE'; setup_gitattrs(1); } sub cmd_setup_new_tree { badusage __ "no arguments allowed to dgit setup-tree" if @ARGV; local $isuite = 'DGIT-SETUP-TREE'; setup_new_tree(); } #---------- argument parsing and main program ---------- sub cmd_version { print "dgit version $our_version\n" or confess "$!"; finish 0; } our (%valopts_long, %valopts_short); our (%funcopts_long); our @rvalopts; our (@modeopt_cfgs); sub defvalopt ($$$$) { my ($long,$short,$val_re,$how) = @_; my $oi = { Long => $long, Short => $short, Re => $val_re, How => $how }; $valopts_long{$long} = $oi; $valopts_short{$short} = $oi; # $how subref should: # do whatever assignemnt or thing it likes with $_[0] # if the option should not be passed on to remote, @rvalopts=() # or $how can be a scalar ref, meaning simply assign the value } defvalopt '--since-version', '-v', '[^_]+|_', \$changes_since_version; defvalopt '--distro', '-d', '.+', \$idistro; defvalopt '', '-k', '.+', \$keyid; defvalopt '--existing-package','', '.*', \$existing_package; defvalopt '--build-products-dir','','.*', \$buildproductsdir; defvalopt '--clean', '', $cleanmode_re, \$cleanmode; defvalopt '--package', '-p', $package_re, \$package; defvalopt '--quilt', '', $quilt_modes_re, \$quilt_mode; defvalopt '', '-C', '.+', sub { ($changesfile) = (@_); if ($changesfile =~ s#^(.*)/##) { $buildproductsdir = $1; } }; defvalopt '--initiator-tempdir','','.*', sub { ($initiator_tempdir) = (@_); $initiator_tempdir =~ m#^/# or badusage __ "--initiator-tempdir must be used specify an". " absolute, not relative, directory." }; sub defoptmodes ($@) { my ($varref, $cfgkey, $default, %optmap) = @_; my %permit; while (my ($opt,$val) = each %optmap) { $funcopts_long{$opt} = sub { $$varref = $val; }; $permit{$val} = $val; } push @modeopt_cfgs, { Var => $varref, Key => $cfgkey, Default => $default, Vals => \%permit }; } defoptmodes \$dodep14tag, qw( dep14tag want --dep14tag want --no-dep14tag no --always-dep14tag always ); sub parseopts () { my $om; if (defined $ENV{'DGIT_SSH'}) { @ssh = string_to_ssh $ENV{'DGIT_SSH'}; } elsif (defined $ENV{'GIT_SSH'}) { @ssh = ($ENV{'GIT_SSH'}); } my $oi; my $val; my $valopt = sub { my ($what) = @_; @rvalopts = ($_); if (!defined $val) { badusage f_ "%s needs a value", $what unless @ARGV; $val = shift @ARGV; push @rvalopts, $val; } badusage f_ "bad value \`%s' for %s", $val, $what unless $val =~ m/^$oi->{Re}$(?!\n)/s; my $how = $oi->{How}; if (ref($how) eq 'SCALAR') { $$how = $val; } else { $how->($val); } push @ropts, @rvalopts; }; while (@ARGV) { last unless $ARGV[0] =~ m/^-/; $_ = shift @ARGV; last if m/^--?$/; if (m/^--/) { if (m/^--dry-run$/) { push @ropts, $_; $dryrun_level=2; } elsif (m/^--damp-run$/) { push @ropts, $_; $dryrun_level=1; } elsif (m/^--no-sign$/) { push @ropts, $_; $sign=0; } elsif (m/^--help$/) { cmd_help(); } elsif (m/^--version$/) { cmd_version(); } elsif (m/^--new$/) { push @ropts, $_; $new_package=1; } elsif (m/^--([-0-9a-z]+)=(.+)/s && ($om = $opts_opt_map{$1}) && length $om->[0]) { push @ropts, $_; $om->[0] = $2; } elsif (m/^--([-0-9a-z]+):(.*)/s && !$opts_opt_cmdonly{$1} && ($om = $opts_opt_map{$1})) { push @ropts, $_; push @$om, $2; } elsif (m/^--([-0-9a-z]+)\!:(.*)/s && !$opts_opt_cmdonly{$1} && ($om = $opts_opt_map{$1})) { push @ropts, $_; my $cmd = shift @$om; @$om = ($cmd, grep { $_ ne $2 } @$om); } elsif (m/^--($quilt_options_re)$/s) { push @ropts, "--quilt=$1"; $quilt_mode = $1; } elsif (m/^--(?:ignore|include)-dirty$/s) { push @ropts, $_; $includedirty = 1; } elsif (m/^--no-quilt-fixup$/s) { push @ropts, $_; $quilt_mode = 'nocheck'; } elsif (m/^--no-rm-on-error$/s) { push @ropts, $_; $rmonerror = 0; } elsif (m/^--no-chase-dsc-distro$/s) { push @ropts, $_; $chase_dsc_distro = 0; } elsif (m/^--overwrite$/s) { push @ropts, $_; $overwrite_version = ''; } elsif (m/^--split-(?:view|brain)$/s) { push @ropts, $_; $splitview_mode = 'always'; } elsif (m/^--split-(?:view|brain)=($splitview_modes_re)$/s) { push @ropts, $_; $splitview_mode = $1; } elsif (m/^--overwrite=(.+)$/s) { push @ropts, $_; $overwrite_version = $1; } elsif (m/^--delayed=(\d+)$/s) { push @ropts, $_; push @dput, $_; } elsif (m/^--upstream-commitish=(.+)$/s) { push @ropts, $_; $quilt_upstream_commitish = $1; } elsif (m/^--save-(dgit-view)=(.+)$/s || m/^--(dgit-view)-save=(.+)$/s ) { my ($k,$v) = ($1,$2); push @ropts, $_; $v =~ s#^(?!refs/)#refs/heads/#; $internal_object_save{$k} = $v; } elsif (m/^--(no-)?rm-old-changes$/s) { push @ropts, $_; $rmchanges = !$1; } elsif (m/^--deliberately-($deliberately_re)$/s) { push @ropts, $_; push @deliberatelies, $&; } elsif (m/^--force-(.*)/ && defined $forceopts{$1}) { push @ropts, $&; $forceopts{$1} = 1; $_=''; } elsif (m/^--force-/) { print STDERR f_ "%s: warning: ignoring unknown force option %s\n", $us, $_; $_=''; } elsif (m/^--for-push$/s) { push @ropts, $_; $access_forpush = 1; } elsif (m/^--config-lookup-explode=(.+)$/s) { # undocumented, for testing push @ropts, $_; $gitcfgs{cmdline}{$1} = 'CONFIG-LOOKUP-EXPLODE'; # ^ it's supposed to be an array ref } elsif (m/^(--[-0-9a-z]+)(=|$)/ && ($oi = $valopts_long{$1})) { $val = $2 ? $' : undef; #'; $valopt->($oi->{Long}); } elsif ($funcopts_long{$_}) { push @ropts, $_; $funcopts_long{$_}(); } else { badusage f_ "unknown long option \`%s'", $_; } } else { while (m/^-./s) { if (s/^-n/-/) { push @ropts, $&; $dryrun_level=2; } elsif (s/^-L/-/) { push @ropts, $&; $dryrun_level=1; } elsif (s/^-h/-/) { cmd_help(); } elsif (s/^-D/-/) { push @ropts, $&; $debuglevel++; enabledebug(); } elsif (s/^-N/-/) { push @ropts, $&; $new_package=1; } elsif (m/^-m/) { push @ropts, $&; push @changesopts, $_; $_ = ''; } elsif (s/^-wn$//s) { push @ropts, $&; $cleanmode = 'none'; } elsif (s/^-wg(f?)(a?)$//s) { push @ropts, $&; $cleanmode = 'git'; $cleanmode .= '-ff' if $1; $cleanmode .= ',always' if $2; } elsif (s/^-wd(d?)([na]?)$//s) { push @ropts, $&; $cleanmode = 'dpkg-source'; $cleanmode .= '-d' if $1; $cleanmode .= ',no-check' if $2 eq 'n'; $cleanmode .= ',all-check' if $2 eq 'a'; } elsif (s/^-wc$//s) { push @ropts, $&; $cleanmode = 'check'; } elsif (s/^-wci$//s) { push @ropts, $&; $cleanmode = 'check,ignores'; } elsif (s/^-c([^=]*)\=(.*)$//s) { push @git, '-c', $&; $gitcfgs{cmdline}{$1} = [ $2 ]; } elsif (s/^-c([^=]+)$//s) { push @git, '-c', $&; $gitcfgs{cmdline}{$1} = [ 'true' ]; } elsif (m/^-[a-zA-Z]/ && ($oi = $valopts_short{$&})) { $val = $'; #'; $val = undef unless length $val; $valopt->($oi->{Short}); $_ = ''; } else { badusage f_ "unknown short option \`%s'", $_; } } } } } sub check_env_sanity () { my $blocked = new POSIX::SigSet; sigprocmask SIG_UNBLOCK, $blocked, $blocked or confess "$!"; eval { foreach my $name (qw(PIPE CHLD)) { my $signame = "SIG$name"; my $signum = eval "POSIX::$signame" // die; die f_ "%s is set to something other than SIG_DFL\n", $signame if defined $SIG{$name} and $SIG{$name} ne 'DEFAULT'; $blocked->ismember($signum) and die f_ "%s is blocked\n", $signame; } }; return unless $@; chomp $@; fail f_ <[0]; $om->[0] = $v; } foreach my $c (access_cfg_cfgs("opts-$k")) { my @vl = map { $_ ? @$_ : () } map { $gitcfgs{$_}{$c} } reverse @gitcfgsources; printdebug "CL $c ", (join " ", map { shellquote } @vl), "\n" if $debuglevel >= 4; next unless @vl; badcfg f_ "cannot configure options for %s", $k if $opts_opt_cmdonly{$k}; my $insertpos = $opts_cfg_insertpos{$k}; @$om = ( @$om[0..$insertpos-1], @vl, @$om[$insertpos..$#$om] ); } } if (!defined $rmchanges) { local $access_forpush; $rmchanges = access_cfg_bool(0, 'rm-old-changes'); } if (!defined $quilt_mode) { local $access_forpush; $quilt_mode = cfg('dgit.force.quilt-mode', 'RETURN-UNDEF') // access_cfg('quilt-mode', 'RETURN-UNDEF') // 'linear'; $quilt_mode =~ m/^($quilt_modes_re)$/ or badcfg f_ "unknown quilt-mode \`%s'", $quilt_mode; $quilt_mode = $1; } $quilt_mode =~ s/^(baredebian)\+git$/$1/; $quilt_mode =~ s/^auto$/try-linear/; foreach my $moc (@modeopt_cfgs) { local $access_forpush; my $vr = $moc->{Var}; next if defined $$vr; $$vr = access_cfg($moc->{Key}, 'RETURN-UNDEF') // $moc->{Default}; my $v = $moc->{Vals}{$$vr}; badcfg f_ "unknown %s setting \`%s'", $moc->{Key}, $$vr unless defined $v; $$vr = $v; } { local $access_forpush; default_from_access_cfg(\$cleanmode, 'clean-mode', 'dpkg-source', $cleanmode_re); } $buildproductsdir //= access_cfg('build-products-dir', 'RETURN-UNDEF'); $buildproductsdir //= '..'; $bpd_glob = $buildproductsdir; $bpd_glob =~ s#[][\\{}*?~]#\\$&#g; } setlocale(LC_MESSAGES, ""); textdomain("dgit"); if ($ENV{$fakeeditorenv}) { git_slurp_config(); quilt_fixup_editor(); } parseopts(); check_env_sanity(); print STDERR __ "DRY RUN ONLY\n" if $dryrun_level > 1; print STDERR __ "DAMP RUN - WILL MAKE LOCAL (UNSIGNED) CHANGES\n" if $dryrun_level == 1; if (!@ARGV) { print STDERR __ $helpmsg or confess "$!"; finish 8; } $cmd = $subcommand = shift @ARGV; my $orig_cmd = $cmd; $cmd =~ y/-/_/; my $pre_fn = ${*::}{"pre_$cmd"}; $pre_fn->() if $pre_fn; if ($invoked_in_git_tree) { changedir_git_toplevel(); record_maindir(); } git_slurp_config(); my $fn = ${*::}{"cmd_$cmd"}; $fn or badusage f_ "unknown operation %s", $orig_cmd; $fn->(); finish 0; work/dgit-badcommit-fixup0000755000000000000000000001633614761250142012704 0ustar #!/usr/bin/perl -w # # Script to help with fallout from #849041. # # usage: # dgit-badcommit-fixup --check # dgit-badcommit-fixup --test # dgit-badcommit-fixup --real # Update procedure, from server operator's point of view: # # 1. Test in an offline tree that this DTRT # # 2. Announce a transition time. Tell everyone that between # the transition time and their next upload, they must # run this script. # # 3. At the transition time, run this script in every repo. # # 4. Run the mirror script to push changes, if necessary. END { $? = $Debian::Dgit::ExitStatus::desired // -1; }; use Debian::Dgit::ExitStatus; use strict; use POSIX; use IPC::Open2; use Data::Dumper; our $our_version = 'UNRELEASED'; ###substituted### my $real; foreach my $a (@ARGV) { if ($a eq '--test') { $real = 0; } elsif ($a eq '--real') { $real = 1; } elsif ($a eq '--check') { $real = -1; } else { die "$a ?"; } } die unless defined $real; my $gcfpid = open2 \*GCFO, \*GCFI, 'git cat-file --batch' or die $!; our %count; no warnings qw(recursion); sub runcmd { system @_ and die "@_ $! $?"; } $!=0; $?=0; my $bare = `git rev-parse --is-bare-repository`; die "$? $!" if $?; chomp $bare or die; our @configs; foreach my $k (qw(core.sharedRepository)) { $?=0; $!=0; my $v = `set -x; git config --local $k`; if (defined $v && $?==0 && chomp $v) { push @configs, [ $k, $v ]; } elsif (defined $v && $?==256 && $v eq '') { } else { die "git-config --local $k => $v $? $! ?"; } } sub getobj ($$) { my ($obj, $type) = @_; print GCFI $obj, "\n" or die $!; my $x = ; my ($gtype, $gsize) = $x =~ m/^\w+ (\w+) (\d+)\n/ or die "$obj ?"; $gtype eq $type or die "$obj $gtype != $type ?"; my $gdata; (read GCFO, $gdata, $gsize) == $gsize or die "$obj $!"; $x = ; $x eq "\n" or die "$obj ($_) $!"; $count{inspected}++; return $gdata; } sub hashobj ($$) { my ($data,$type) = @_; my $gwopid = open2 \*GWO, \*GWI, "git hash-object -w -t $type --stdin" or die $!; print GWI $data or die $!; close GWI or die $!; $_ = ; close GWO or die $!; waitpid $gwopid,0 == $gwopid or die $!; die $? if $?; m/^(\w+)\n/ or die "$_ ?"; $count{"rewritten $type"}++; return $1; } our %memo; sub rewrite_commit ($); sub rewrite_commit ($) { my ($obj) = @_; my $m = \ $memo{$obj}; return $$m if defined $$m; my $olddata = getobj $obj, 'commit'; $olddata =~ m/(?<=\n)(?=\n)/ or die "$obj ?"; my $msg = $'; local $_ = $`; s{^(parent )(\w+)$}{ $1 . rewrite_commit($2) }gme; $count{'fix overwrite'} += s{^commiter }{committer }gm; if (!m{^author }m && !m{^committer }m) { m{^parent (\w+)}m or die "$obj ?"; my $parent = getobj $1, 'commit'; $parent =~ m/^(?:.+\n)+(author .*\ncommitter .*\n)/; m/\n$/ or die "$obj ?"; $_ .= $1; $count{'fix import'}++; } my $newdata = $_.$msg; my $newobj; if ($newdata eq $olddata) { $newobj = $obj; $count{unchanged}++; #print STDERR "UNCHANGED $obj\n"; } else { $newobj = hashobj $newdata, 'commit'; #print STDERR "REWRITTEN $obj $newobj\n"; } $$m= $newobj; return $newobj; } our @updates; sub filter_updates () { @updates = grep { $_->[1] ne $_->[2] } @updates; } sub rewrite_tag ($) { my ($obj) = @_; $_ = getobj $obj, 'tag'; m/^type (\w+)\n/m or die "$obj ?"; if ($1 ne 'commit') { $count{"oddtags $1"}++; return $obj; } m/^object (\w+)\n/m or die "$obj ?"; my $oldref = $1; my $newref = rewrite_commit $oldref; if ($oldref eq $newref) { return $obj; } s/^(object )\w+$/ $1.$newref /me or die "$obj ($_) ?"; s/^-----BEGIN PGP SIGNATURE-----\n.*^-----END PGP SIGNATURE-----\n$//sm; return hashobj $_, 'tag'; } sub edit_rewrite_map ($) { my ($old) = @_; filter_updates(); return $old unless @updates; my $td = 'dgit-broken-fixup.tmp'; runcmd qw(rm -rf), $td; mkdir $td, 0700 or die "$td $!"; chdir $td or die $!; runcmd qw(git init -q); runcmd qw(git config gc.auto 0); runcmd qw(rm -rf .git/objects); symlink "../../objects", ".git/objects" or die $!; foreach my $c (@configs) { runcmd qw(git config), $c->[0], $c->[1]; } my %map; if ($old) { runcmd qw(git checkout -q), $old; open M, "map" or die $!; while () { m/^(\w+)(?:\s+(\w+))?$/ or die; $map{$1} = $2; $count{rewrite_map_previous}++; } M->error and die $!; close M or die $!; } foreach my $oldc (keys %memo) { my $newc = $memo{$oldc}; next if $oldc eq $newc; $map{$oldc} = $newc; } foreach my $up (@updates) { # catches tags $map{ $up->[1] } = $up->[2]; } open M, ">", "map" or die $!; printf M "%s%s\n", $_, (defined $map{$_} ? " $map{$_}" : "") or die $! foreach keys %map; close M or die $!; if (!$old) { runcmd qw(git add map); } runcmd qw(git commit -q), qw(-m), </dev/null git symbolic-ref -q "$1"', qw(x), $refname; if ($?==0) { $count{symrefs_ignored}++; next; } die "$? $!" unless $?==256; my $rewrite; if ($type eq 'commit') { $rewrite = rewrite_commit($obj); } elsif ($type eq 'tag') { $rewrite = rewrite_tag($obj); } else { warn "ref $refname refers to $type\n"; next; } push @updates, [ $refname, $obj, $rewrite ]; } if ($bare eq 'true') { my $new_rewrite_map = edit_rewrite_map($org_rewrite_map); push @updates, [ 'refs/dgit-rewrite/map', ($org_rewrite_map // '0'x40), ($new_rewrite_map // '0'x40), 1 ]; } filter_updates(); if (!@updates) { print Dumper(\%count), "all is well - nothing to do\n"; finish 0; } #print Dumper(\@updates); open U, "|git update-ref -m 'dgit bad commit fixup' --stdin" or die $! if $real >= 0; for my $up (@updates) { my ($ref, $old, $new, $nobackup) = @$up; my $otherref = $ref; $otherref =~ s{^refs/}{}; if ($real > 0) { print U <= 0) { $?=0; $!=0; close U or die "$? $!"; die $? if $?; } print Dumper(\%count); if ($real >= 0) { print "old values saved in refs/dgit-badcommit/\n" or die $!; } elsif ($real == 0) { print "testing output saved in refs/dgit-badfixuptest/\n" or die $!; } else { print STDERR "found work to do, exiting status 2\n"; finish 2; } finish 0; work/dgit-downstream-dsc.7.pod0000644000000000000000000002617414761250142013472 0ustar =head1 NAME dgit-downstream-dsc - setting up dgit push for a new distro =head1 INTRODUCTION This document is aimed at downstreams of Debian. It explains how you can publish your packages' source code both as traditional Debian source packages, and as git branches, using B. Your users will be able to get the source with B, or with traditional tools such as B. Note that often it is unnecessary to publish traditional source packages. Debian-format source packages can be complex, idiosyncratic and difficult to work with. You should avoid them if you can. If you do not need to publish source packages, you can work as a Debian downstream purely using git branches, (using dgit to get the source from Debian in git form). You can build binaries directly from git, and push package source code as a git branch to an ordinary git server. See L. Not every option is covered here. L has a mostly-complete list of config options, although not always with useful descriptions. =head1 NAMES You need to choose some names. =over =item I name dgit understands each thing it interacts with as a B. So in dgit terms, you are setting up a distro. You need a name for yourself (ie for your distro). The name will appear in the git tags made by your tools, and in configuration settings. It must be globally unique across all people and institutions who use dgit. You could choose your organisation's domain name, or a part of it if you think that is going to be very unique. The distro name may contain ascii alphanumerics and B<. + ->, although B<-> may be confusing and is probably best avoided. Try to avoid uppercase letters (and underscore): you will be typing this name a lot. For example, if you were the Free Software Foundation Europe (fsfe.org) you might call your distro fsfe or fsfe.org. In the rest of this document we will write I for your distro name. =item I names In dgit and Debian archive terminology, a B is a line of development, and/or a Debian release. For example, at the time of writing, Debian has suites like B aka B, B aka B, and B aka B. There are also ancillary suites like B. If your releases align with Debian's releases, then your suites should contain the Debian suite names. B use just the Debian names. That will cause confusion. Instead, prepend your organisation's name and a hyphen. For example, FSFE might end up with suites like fsfe-stretch. Suite names end up in git ref and branch names, and on dgit command lines. Suite names can contain alphanumerics and C<->. Other characters may work but are not recommended. =back =head1 SERVICES You will need to run two parallel services: =over =item git server This will hold the git branches accessed by dgit. Everyone who will use dgit push needs to be able to update BI (note, not BI) on that server, and to make tags IBI and BIBI. Normally this would be done over ssh. The server may host other branches and tags too. So this might be your ordinary git server, or an instance of a git hosting system. Everyone who obtains one of your source packages, or who will run B and B, needs to have at least read access to the git server. Ideally everything would be published via the git smart https protocol. The git server name, and public git url structure, should be chosen so they will not need to change in the future. Best is to give the git server a DNS name of its own. Debian's dgit git server has special access control rules, implemented in B and B in the package B. but in most installations this is not needed. If there is no or little distinction between (i) developers who are entitled to upload (push) and (ii) repository administrators, then it is sufficient to provide a git server with a unix account for each user who will be pushing, perhaps using ssh restricted commands. =item Debian-format archive (repository) This holds the source packages. You will probably use the same archive to host your binaries, and point your B at it. dgit uses the term B for this. There are a variety of tools for creating and managing a Debian-format archive. In this document we will assume you are using B. Setting up reprepro is not covered in this tutorial. Instead, we assume you already have reprepro working. You should also write appropriate dput configuration, since dgit uses dput to upload packages to the archive. This will involve choosing a dput host name. That's probably your distro name, I. =back =head1 CONFIGURATION When you have all of the above set up, you are ready to explain to dgit how to access your systems. dgit is configured via git's configuration system, so this is done with git configuration. See L. Below, each heading is one or more git config keys. B is literal text and I is things that vary. In the descriptions of the effects of config settings, we refer to the config values C. =over =item BIB<.git-url>, B<.git-url-suffix> Specify the publicly accessible git URLs for your dgit git server. The urls generated are CBIC The url should be stable, and publicly accessible, because its name is published in .dsc files. (Note that if you make modified versions of packages from Debian, the copyleft licences used for Free Software often require you to permit your users, employees, and downstreams to further distribute your modified source code.) =item BIB The domain name of your git server's ssh interface. =item BIB BIB Some git hosting systems expect everyone to connect over ssh as the same user, often B. If this is the case, set C to that user. If you have a normal git over ssh arrangement, where people ssh as themselves, leave C unset. If a user wishes to override the username (for example, if their local username is not the same as on the server) they can set C. =item BIB Set this to the empty string. This will arrange that push accesses to the ssh server will use C, etc. =item BIB B =item CIB The path to your repositories. dgit push will try to push to C[C|CB<@>]CBIB<.git> =item BIB<.git-check>, B<.git-check-suffix> dgit clone needs to be able to tell whether there is yet a git repository for a particular package. If you always have a git repository for every package in your archive, perhaps because you never use dput/dupload, and always dgit push, set C to B. Otherwise, set C to a url prefix - ideally, https. dgit clone will try to fetch CBIC and expect to get either some successful fetch (it doesn't matter what) or a file not found error (http 404 status code). Other outcomes are fatal errors. If your git server runs cgit, then you can set C to the same as C, and C to B. =item BIB, B dgit push also needs to be able to check whether the repo exists. You can set both of these to B, which will use an ssh shell command to test repository existence. Or leave them unset, and dgit push will use the readonly details. If repositories are created automatically on push, somehow, you can set C to B. =item BIB<.upload-host> What I value to pass to dput, to upload. This is a nickname, not the real host name. You need to provide everyone who will push with an appropriate dput configuration. See L. A good nickname for your upload host is your distro name I. =item BIB<.mirror> Set this to the url of your source package archive. This is the same string as appears in the 2nd field of each B entry. =item BIB<.archive-query>, B<.archive-query-url> If you have a smallish distro, set C to B (with a colon). If your distro is large (eg, if it contains a substantial fraction of Debian) then this will not be very efficient: with this setting, dgit often needs to download and update Sources files. For large distros, it is better to implement the Debian archive ftpmaster API. See L, and set C to B (with a colon) and C to your API base URL. dgit uses these queries: B, BIBI and BI (so you need not implement anything else). Alternatively, if your system supports the rmadison protocol, you can set C to B[I]. dgit will invoke B -uI. =item BIB<.distro> I Set this for every one of your suites. You will have to update this when new suites are created. If you forget, your users can explicitly specify B<-d> I to dgit. =back =head1 TEMPLATE GIT REPOSITORY When dgit push is used for I for the first time, it must create a git repository on the git server. If C is set to B, dgit will use the user's shell access to the server to B IB<.git>. So you should create B<_template.git> with suitable contents. Note that the ssh rune invoked by dgit does not do any locking. So if two people dgit push the same package at the same time, there will be lossage. Either don't do that, or set up B. =head1 SSH COMMANDS When a user who can push runs dgit, dgit uses ssh to access the git server. To make use of ssh restricted command easier, and for the benefit of dgit-repos-server, dgit's ssh commands each start with a parseable commentish rune. The ssh commands used by dgit are these: =over =item B<: dgit> I B I B<;>... Test whether I has a git repo on the server already. Should print B<0> or B<1> and a newline, and exit status zero in either case. The rest of the command, after B<;>, is a shell implementation of this test. Used when C is set to B. =item B<: dgit> I B I B<;>... Create the git repository for I on the server. See L, above. The rest of the command is an appropriate invocation of cd and cp. Used when C is set to B. =item B..., B... dgit invokes git to access the repository; git then runs these commands. Note that dgit push will first do a git fetch over ssh, so you must provide upload-pack as well as receive-pack. =back (There are also other ssh commands which are historical or obscure.) =head1 SEE ALSO dgit(1) work/dgit-maint-bpo.7.pod0000644000000000000000000001000314761250142012406 0ustar =head1 NAME dgit - tips for maintaining official Debian backports =head1 INTRODUCTION This document describes elements of a workflow for using B to maintain an official Debian backport. We do not assume that whoever uploads the package to Debian unstable is using B. =head1 GENERAL TIPS The first time a package is backported for any particular Debian release, you will have to pass the --new option to dgit. =head1 TERMINOLOGY Let the I branch contain the packaging history uploaded to Debian unstable, and the I branch be where you prepare your uploads to the B suite. A B backports workflow means that each time an upload migrates to Debian testing and you want to prepare an upload to B, you do something like this: =over 4 % git checkout buster-bpo % git merge master % dch --bpo % # any other changes needed for backporting % git commit -a % # try a build =back A B backports workflow means that you throw away the history of the I branch each time a new version migrates to Debian testing, something equivalent to this: =over 4 % git checkout -B buster-bpo master % dch --bpo % # any other changes needed for backporting % git commit -a % # try a build =back If you use a merging backports workflow, your changelog contains entries for each previous upload to B; in a rebasing workflow, it contains only the latest. =head1 CHOOSING BETWEEN THE TWO WORKFLOWS If backporting involves making no (additional) changes to the upstream source, whether you use a merging or rebasing backports workflow is a matter of personal preference. There are good arguments in favour of both workflows fitting the semantics of the B<*-backports> suites. If you have to make changes to the upstream source to make the package work on machines running Debian stable, it is advisable to choose a rebasing workflow. This ensures that dgit can automatically update the debian/patches directory without any manual intervention. =head1 TIPS FOR A MERGING WORKFLOW =head2 Use dgit's branches If you do not yourself upload the package to Debian unstable, it is usually easiest to use dgit's branches, and ignore the configured Vcs-Git repository. You would use =over 4 % dgit clone foo bullseye =back for a new backport of package 'foo' to B, and then =over 4 % dgit fetch bullseye % git merge dgit/dgit/bullseye =back when new versions migrate to Debian testing. =head1 TIPS FOR A REBASING WORKFLOW =head2 Use dgit's branches If you do not yourself upload the package to Debian unstable, it is usually easiest to use dgit's branches, and ignore the configured Vcs-Git repository. For each new version from Debian testing, you would =over 4 % dgit fetch bullseye % git checkout -B buster-bpo dgit/dgit/bullseye % # use git-cherry-pick(1) to (re)apply any needed backporting fixes =back =head2 Overwriting B tries hard to prevent you from accidentally overwriting uploads that it thinks aren't represented in the git history you are trying to upload. This is mainly to prevent accidentally overwriting NMUs. With a rebasing backports workflow, dgit will think that every upload of a new version from Debian testing might be accidentally overwriting uploads. You will need to explicitly indicate the upload to B you wish to overwrite. Suppose that the last upload to B was versioned I<1.2.2-1~bpo10+1> and you have now prepared I<1.2.3-1~bpo10+1> for upload. When you B, you will need to pass I<--overwrite=1.2.2-1~bpo10+1>. Alternatively, you can perform the pseudomerge that I<--overwrite> would have done yourself: =over 4 % dgit fetch buster-backports % git merge -s ours dgit/dgit/buster-backports % dgit push-source =back =head1 SEE ALSO dgit(1), dgit(7), https://backports.debian.org/ =head1 AUTHOR This manpage was written and is maintained by Sean Whitton . work/dgit-maint-debrebase.7.pod0000644000000000000000000005502014761250142013552 0ustar =head1 NAME dgit - tutorial for package maintainers, using a workflow centered around git-debrebase(1) =head1 INTRODUCTION This document describes elements of a workflow for maintaining a non-native Debian package using B. We maintain the Debian delta as a series of git commits on our master branch. We use git-debrebase(1) to shuffle our branch such that this series of git commits appears at the end of the branch. All the public git history is fast-forwarding, i.e., we do not rewrite and force-push. Some advantages of this workflow: =over 4 =item Manipulate the delta queue using the full power of git-rebase(1), instead of relying on quilt(1), and without having to switch back and forth between patches-applied and patches-unapplied branches when committing changes and trying to build, as with gbp-pq(1). =item If you are using 3.0 (quilt), provide your delta queue as a properly separated series of quilt patches in the source package that you upload to the archive (unlike with dgit-maint-merge(7)). =item Avoid the git tree being dirtied by the application or unapplication of patches, as they are always applied. =item Benefit from dgit's safety catches. In particular, ensure that your upload always matches exactly your git HEAD. =item Provide your full git history in a standard format on B, where it can benefit downstream dgit users, such as people using dgit to do an NMU (see dgit-nmu-simple(7) and dgit-user(7)). =item Minimise the amount you need to know about 3.0 (quilt) in order to maintain Debian source packages which use that format. =back This workflow is appropriate for packages where the Debian delta contains multiple pieces which interact, or which you don't expect to be able to upstream soon. For packages with simple and/or short-lived Debian deltas, use of git-debrebase(1) introduces unneeded complexity. For such packages, consider the workflow described in dgit-maint-merge(7). =head1 INITIAL DEBIANISATION This section explains how to start using this workflow with a new package. It should be skipped when converting an existing package to this workflow. =head2 When upstream tags releases in git Suppose that the latest stable upstream release is 1.2.2, and this has been tagged '1.2.2' by upstream. =over 4 % git clone -oupstream https://some.upstream/foo.git % cd foo % git verify-tag 1.2.2 % git reset --hard 1.2.2 % git branch --unset-upstream =back The final command detaches your master branch from the upstream remote, so that git doesn't try to push anything there, or merge unreleased upstream commits. To maintain a copy of your packaging branch on B in addition to B, you can do something like this: =over 4 % git remote add -f origin salsa.debian.org:Debian/foo.git % git push --follow-tags -u origin master =back Now go ahead and Debianise your package. Make commits on the master branch, adding things in the I directory, or patching the upstream source. For technical reasons, B In other words, make a commit introducing I before patching the upstream source. Finally, you need an orig tarball: =over 4 % git deborig =back See git-deborig(1) if this fails. This tarball is ephemeral and easily regenerated, so we don't commit it anywhere (e.g. with tools like pristine-tar(1)). =head3 Comparing upstream's tarball releases =over 4 The above assumes that you know how to build the package from git and that doing so is straightforward. If, as a user of the upstream source, you usually build from upstream tarball releases, rather than upstream git tags, you will sometimes find that the git tree doesn't contain everything that is in the tarball. Additional build steps may be needed. For example, you may need your I to run autotools. You can compare the upstream tarball release, and upstream git tag, within git, by importing the tarball into git as described in the next section, using a different value for 'upstream-tag', and then using git-diff(1) to compare the imported tarball to the release tag. =back =head3 Using untagged upstream commits =over 4 Sometimes upstream does not tag their releases, or you want to package an unreleased git snapshot. In such a case you can create your own upstream release tag, of the form BI, where I is the upstream version you plan to put in I. The B prefix ensures that your tag will not clash with any tags upstream later creates. For example, suppose that the latest upstream release is 1.2.2 and you want to package git commit ab34c21 which was made on 2013-12-11. A common convention is to use the upstream version number 1.2.2+git20131211.ab34c21 and so you could use =over 4 % git tag -s upstream/1.2.2+git20131211.ab34c21 ab34c21 =back to obtain a release tag, and then proceed as above. One can generate such a versioned tag using git show's --pretty option. e.g.: =over 4 % git tag -s upstream/$(git show --date=format:%Y%m%d --pretty=format:"1.2.2+git%cd.%h" --quiet upstream/main) upstream/main =back =back =head2 When upstream releases only tarballs Because we want to work in git, we need a virtual upstream branch with virtual release tags. gbp-import-orig(1) can manage this for us. To begin =over 4 % mkdir foo % cd foo % git init % git checkout -b upstream % gbp import-orig \ --upstream-branch=upstream --debian-branch=master \ --upstream-tag='upstream/%(version)s' \ --sign-tags --no-pristine-tar \ ../foo_1.2.2.orig.tar.xz % git branch -f upstream =back This should leave you on the master branch. Next, our upstream branch cannot be pushed to B, but since we will need it whenever we import a new upstream version, we must push it somewhere. The usual choice is B: =over 4 % git remote add -f origin salsa.debian.org:Debian/foo.git % git push --follow-tags -u origin master upstream =back You are now ready to proceed as above, making commits to the I directory and to the upstream source. As above, for technical reasons, B In other words, make a commit introducing I before patching the upstream source. A convenient way to ensure this requirement is satisfied is to start by creating I: =over 4 [DEFAULT] upstream-branch = upstream debian-branch = master upstream-tag = upstream/%(version)s sign-tags = True pristine-tar = False pristine-tar-commit = False [import-orig] merge = False =back and commit that: =over 4 % git add debian/gbp.conf && git commit -m "create gbp.conf" =back Note that we couldn't create I before now for the same technical reasons which require our first commit to introduce I without patching the upstream source. That's why we had to pass a lot of options to our first call to gbp-import-orig(1). =head1 CONVERTING AN EXISTING PACKAGE This section explains how to convert an existing Debian package to this workflow. It should be skipped when debianising a new package. If you have an existing git history that you have pushed to an ordinary git server like B, we start with that. If you don't already have it locally, you'll need to clone it, and obtain the corresponding orig.tar from the archive: =over 4 % git clone salsa.debian.org:Debian/foo % cd foo % dgit setup-new-tree % origtargz =back If you don't have any existing git history, or you have history only on the special B server, we start with B: =over 4 % dgit clone foo % cd foo =back Then we make new upstream tags available: =over 4 % git remote add -f upstream https://some.upstream/foo.git =back We now use a B command to convert your existing history to the git-debrebase(5) data model. Which command you should use depends on some facts about your repository: =over 4 =item (A) There is no delta queue. If there do not exist any Debian patches, use =over 4 % git debrebase convert-from-gbp =back =item (B) There is a delta queue, and patches are unapplied. This is the standard git-buildpackage(1) workflow: there are Debian patches, but the upstream source is committed to git without those patches applied. Use =over 4 % git debrebase convert-from-gbp =back If you were not previously using dgit to upload your package (i.e. you were not using the workflow described in dgit-maint-gbp(7)), and you happen to have run B in this clone of the repository, you will need to pass I<--fdiverged> to this command. =item (C) There is a delta queue, and patches are applied. Use =over 4 % git debrebase convert-from-dgit-view =back =back Finally, you need to ensure that your git HEAD is dgit-compatible, i.e., it is exactly what you would get if you deleted .git, invoked B, and then unpacked the resultant source package. To achieve this, you might need to delete I. One way to have dgit check your progress is to run B. =head1 GIT CONFIGURATION git-debrebase(1) does not yet support using B to merge divergent branches of development (see "OTHER MERGES" in git-debrebase(5)). You should configure git such that B does not try to merge: =over 4 % git config --local pull.rebase true =back Now when you pull work from other Debian contributors, git will rebase your work on top of theirs. If you use this clone for upstream development in addition to Debian packaging work, you may not want to set this global setting. Instead, see the B and BnameE.rebase> settings in git-config(5). =head1 IMPORTING NEW UPSTREAM RELEASES There are two steps: obtaining git refs that correspond to the new release, and importing that release using git-debrebase(1). =head2 Obtaining the release =head3 When upstream tags releases in git =over 4 % git fetch --tags upstream =back If you want to package an untagged upstream commit (because upstream does not tag releases or because you want to package an upstream development snapshot), see "Using untagged upstream commits" above. =head3 When upstream releases only tarballs You will need the I from "When upstream releases only tarballs", above. You will also need your upstream branch. Above, we pushed this to B. You will need to clone or fetch from there, instead of relying on B/B alone. Then, either =over 4 % gbp import-orig ../foo_1.2.3.orig.tar.xz =back or if you have a working watch file =over 4 % gbp import-orig --uscan =back =head2 Importing the release =over 4 % git debrebase new-upstream 1.2.3 =back This invocation of git-debrebase(1) involves a git rebase. You may need to resolve conflicts if the Debian delta queue does not apply cleanly to the new upstream source. If all went well, you can now review the merge of the new upstream release: =over 4 git diff debian/1.2.2-1..HEAD -- . ':!debian' =back Also, diff with I<--name-status> and I<--diff-filter=ADR> to see just the list of added or removed files, which is useful to determine whether there are any new or deleted files that may need accounting for in your copyright file. If you obtained a tarball from upstream, you are ready to try a build. If you merged a git tag from upstream, you will first need to generate a tarball: =over 4 % git deborig =back =head1 EDITING THE DEBIAN PACKAGING Just make commits on master that change the contents of I. =head1 EDITING THE DELTA QUEUE =head2 Adding new patches Adding new patches is straightforward: just make commits touching only files outside of the I directory. You can also use tools like git-revert(1), git-am(1) and git-cherry-pick(1). =head2 Editing patches: starting a debrebase git-debrebase(1) is a wrapper around git-rebase(1) which allows us to edit, re-order and delete patches. Run =over 4 % git debrebase -i =back to start an interactive rebase. You can edit, re-order and delete commits just as you would during B. =head2 Editing patches: finishing a debrebase After completing the git rebase, your branch will not be a fast-forward of the git HEAD you had before the rebase. This means that we cannot push the branch anywhere. If you are ready to upload, B (or B) will take care of fixing this up for you. If you are not yet ready to upload, and want to push your branch to a git remote such as B, =over 4 % git debrebase conclude =back Note that each time you conclude a debrebase you introduce a pseudomerge into your git history, which may make it harder to read. Try to do all of the editing of the delta queue that you think will be needed for this editing session in a single debrebase, so that there is a single debrebase stitch. =head1 BUILDING AND UPLOADING You can use dpkg-buildpackage(1) for test builds. When you are ready to build for an upload, use B, B or B. Upload with B or B. Remember to pass I<--new> if the package is new in the target suite. In some cases where you used B since the last upload, it is not possible for dgit to make your history fast-forwarding from the history on B. In such cases you will have to pass I<--overwrite> to dgit. git-debrebase will normally tell you if this will be needed. If you want to upload with git-debpush(1), for the first upload you should pass the B<--quilt=linear> quilt mode option (see git-debpush(1)). Right before uploading, if you did not just already do so, you might want to have git-debrebase(1) shuffle your branch such that the Debian delta queue appears right at the tip of the branch you will push: =over 4 % git debrebase % dgit push-source =back Note that this will introduce a new pseudomerge. After dgit pushing, be sure to git push to B, if you're using that. =head1 HANDLING DFSG-NON-FREE MATERIAL =head2 Illegal material Here we explain how to handle material that is merely DFSG-non-free. Material which is legally dangerous (for example, files which are actually illegal) cannot be handled this way. If you encounter possibly-legally-dangerous material in the upstream source code you should seek advice. It is often best not to make a fuss on a public mailing list (at least, not at first). Instead, email your archive administrators. For Debian that is To: dgit-owner@debian.org, ftpmaster@ftp-master.debian.org =head2 DFSG-non-free: When upstream tags releases in git Our approach is to maintain a DFSG-clean upstream branch, and create tags on this branch for each release that we want to import. We then import those tags per "Importing the release", above. In the case of a new package, we base our initial Debianisation on our first DFSG-clean tag. For the first upstream release that requires DFSG filtering: =over 4 % git checkout -b upstream-dfsg 1.2.3 % git rm evil.bin % git commit -m "upstream version 1.2.3 DFSG-cleaned" % git tag -s 1.2.3+dfsg % git checkout master =back Now either proceed with "Importing the release" on the 1.2.3+dfsg tag, or in the case of a new package, =over 4 % git branch --unset-upstream % git reset --hard 1.2.3+dfsg =back and proceed with "INITIAL DEBIANISATION". For subsequent releases (whether or not they require additional filtering): =over 4 % git checkout upstream-dfsg % git merge 1.2.4 % git rm further-evil.bin # if needed % git commit -m "upstream version 1.2.4 DFSG-cleaned" # if needed % git tag -s 1.2.4+dfsg % git checkout master % # proceed with "Importing the release" on 1.2.4+dfsg tag =back Our upstream-dfsg branch cannot be pushed to B, but since we will need it whenever we import a new upstream version, we must push it somewhere. Assuming that you have already set up an origin remote per the above, =over 4 % git push --follow-tags -u origin master upstream-dfsg =back =head2 DFSG-non-free: When upstream releases only tarballs The easiest way to handle this is to add a B field to I, and a B setting in I. See uscan(1). Alternatively, see the I<--filter> option detailed in gbp-import-orig(1). =head1 INCORPORATING NMUS In the simplest case, =over 4 % dgit fetch % git merge --ff-only dgit/dgit/sid =back If that fails, because your branch and the NMUers' work represent divergent branches of development, you have a number of options. Here we describe the two simplest. Note that you should not try to resolve the divergent branches by editing files in I. Changes there would either cause trouble, or be overwritten by git-debrebase(1). =head2 Rebasing your work onto the NMU =over 4 % git rebase dgit/dgit/sid =back If the NMUer added new commits modifying the upstream source, you will probably want to debrebase before your next upload to tidy those up. For example, the NMUer might have used git-revert(1) to unapply one of your patches. A debrebase can be used to strip both the patch and the reversion from the delta queue. =head2 Manually applying the debdiff If you cannot rebase because you have already pushed to B, say, you can manually apply the NMU debdiff, commit and debrebase. The next B will require I<--overwrite>. =head1 HINTS AND TIPS =head2 Minimising pseudomerges Above we noted that each time you conclude a debrebase, you introduce a pseudomerge into your git history, which may make it harder to read. A simple convention you can use to minimise the number of pseudomerges is to B only right before you upload or push to B. It is possible, though much less convenient, to reduce the number of pseudomerges yet further. We debrebase only (i) when importing a new release, and (ii) right before uploading. Instead of editing the existing delta queue, you append fixup commits (and reversions of commits) that alter the upstream source to the required state. You can push and pull to and from B during this. Just before uploading, you debrebase, once, to tidy everything up. =head2 The debian/patches directory In this workflow, I is purely an output of git-debrebase(1). You should not make changes there. They will either cause trouble, or be ignored and overwritten by git-debrebase(1). I will often be out-of-date because git-debrebase(1) will only regenerate it when it needs to. So you should not rely on the information in that directory. When preparing patches to forward upstream, you should use git-format-patch(1) on git commits, rather than sending files from I. =head2 Upstream branches In this workflow, we specify upstream tags rather than any branches. Except when (i) upstream releases only tarballs, (ii) we require DFSG filtering, or (iii) you also happen to be involved in upstream development, we do not maintain any local branch corresponding to upstream, except temporary branches used to prepare patches for forwarding, and the like. The idea here is that from Debian's point of view, upstream releases are immutable points in history. We want to make sure that we are basing our Debian package on a properly identified upstream version, rather than some arbitrary commit on some branch. Tags are more useful for this. Upstream's branches remain available as the git remote tracking branches for your upstream remote, e.g. I. =head2 The first ever dgit push If this is the first ever dgit push of the package, consider passing I<--deliberately-not-fast-forward> instead of I<--overwrite>. This avoids introducing a new origin commit into your git history. (This origin commit would represent the most recent non-dgit upload of the package, but this should already be represented in your git history.) =head2 Inspecting the history The git history made by git-debrebase can seem complicated. Here are some suggestions for helpful invocations of gitk and git. They can be adapted for other tools like tig(1), git-log(1), magit, etc. History of package in Debian, disregarding history from upstream: =over % gitk --first-parent In a laundered branch, the delta queue is at the top. =back History of the packaging, excluding the delta queue: % gitk :/debian :!/debian/patches Just the delta queue (i.e. Debian's changes to upstream): % gitk --first-parent -- :/ :!/debian Full history including old versions of the delta queue: =over % gitk --date-order The "Declare fast forward" commits you see have an older history (usually, an older delta queue) as one parent, and a newer history as the other. --date-order makes gitk show the delta queues in the right order. =back Complete diff since the last upload: =over % git diff dgit/dgit/sid..HEAD -- :/ :!/debian/patches This includes changes to upstream files. =back Interdiff of delta queue since last upload, if you really want it: % git debrebase make-patches % git diff dgit/dgit/sid..HEAD -- debian/patches And of course there is: % git debrebase status =head2 Alternative ways to start a debrebase Above we started an interactive debrebase by invoking git-debrebase(1) like this: =over 4 % git debrebase -i =back It is also possible to perform a non-interactive rebase, like this: =over 4 % git debrebase -- [git-rebase options...] =back A third alternative is to have git-debrebase(1) shuffle all the Debian changes to the end of your branch, and then manipulate them yourself using git-rebase(1) directly. For example, =over 4 % git debrebase % git rebase -i HEAD~5 # there are 4 Debian patches =back If you take this approach, you should be very careful not to start the rebase too early, including before the most recent pseudomerge. git-rebase without a base argument will often start the rebase too early, and should be avoided. Run git-debrebase instead. See also "ILLEGAL OPERATIONS" in git-debrebase(5). =head1 SEE ALSO dgit(1), dgit(7), git-debrebase(1), git-debrebase(5) =head1 AUTHOR This tutorial was written and is maintained by Sean Whitton . It contains contributions from other dgit contributors too - see the dgit copyright file. work/dgit-maint-gbp.7.pod0000644000000000000000000000747114761250142012415 0ustar =head1 NAME dgit - tutorial for package maintainers already using git-buildpackage(1) =head1 INTRODUCTION This document explains how B can be incorporated into a git-buildpackage(1) package-maintenance workflow. This should be read jointly with git-buildpackage(1)'s documentation. Some reasons why you might want to incorporate B into your existing workflow: =over 4 =item Benefit from dgit's safety catches. In particular, ensure that your upload always matches exactly your git HEAD. =item Provide a better, more detailed git history to downstream dgit users, such as people using dgit to do an NMU (see dgit-nmu-simple(7) and dgit-user(7)). =back Note that we assume a patches-unapplied repository: the upstream source committed to the git repository is unpatched. git-buildpackage(1) can work with patched-applied repositories, but is normally used with patches-unapplied. =head1 GIT CONFIGURATION If you have configured an I in your gbp.conf, you should tell dgit about it: =over 4 % git config --global dgit.default.build-products-dir /home/spwhitton/build-area =back If you run =over 4 % git config dgit.default.quilt-mode gbp =back in your repository, you can omit I<--gbp> wherever it occurs below. Note that this does require that you always work from your gbp master branch, never the dgit patches-applied branch. =head1 BUILDING You can perform test builds like this: =over 4 % dgit [--include-dirty] gbp-build [OPTIONS] =back where I<--include-dirty> is needed for testing uncommitted changes, and I are any further options to be passed on to gbp-buildpackage(1). If you are doing a source-only upload, you do not need to prepare a I<_source.changes>, as B will take of that on your behalf. If you need to include binaries with your upload, you will probably want to use sbuild(1), pbuilder(1) or cowbuilder(1): =over 4 % dgit --rm-old-changes --gbp sbuild =back replacing 'sbuild' with 'pbuilder' or 'cowbuilder' if appropriate. We use I<--rm-old-changes> to ensure that there is exactly one changes file corresponding to this package, so we can be confident we're uploading what we intend (though B will do some safety checks). Note that none of the commands in this section are required to upload with dgit. You can invoke gbp-buildpackage(1), pbuilder(1), cowbuilder(1) and sbuild(1) directly. However, the defaults for these tools may leave you with something that dgit will refuse to upload because it doesn't match your git HEAD. As a general rule, leave all signing and tagging to dgit. =head1 UPLOADING Don't use I<--git-tag>: B will do this for you. To do a source-only upload: =over 4 % dgit --gbp push-source =back or if you need to include binaries, =over 4 % dgit --gbp push =back This will push your git history to the dgit-repos, but you probably want to follow it up with a push to salsa. You will need to pass I<--overwrite> if the previous upload was not performed with dgit. If this is first ever dgit push of the package, consider passing I<--deliberately-not-fast-forward> instead of I<--overwrite>. This avoids introducing a new origin commit into the dgit view of your git history. (This origin commit would represent the most recent non-dgit upload of the package, but this should already be represented in your git history.) Alternatively, you can use git-debpush(1). For the first upload you should pass the B<--gbp> quilt mode option (see git-debpush(1)). =head1 INCORPORATING NMUS B can't yet incorporate NMUs into patches-unapplied gbp branches. You can just apply the NMU diff the traditional way. The next upload will require I<--overwrite>. =head1 SEE ALSO dgit(1), dgit(7) =head1 AUTHOR This tutorial was written and is maintained by Sean Whitton . work/dgit-maint-merge.7.pod0000644000000000000000000003274514761250142012746 0ustar =head1 NAME dgit - tutorial for package maintainers, using a workflow centered around git-merge(1) =head1 INTRODUCTION This document describes elements of a workflow for maintaining a non-native Debian package using B. The workflow makes the following opinionated assumptions: =over 4 =item Git histories should be the non-linear histories produced by git-merge(1), preserving all information about divergent development that was later brought together. =item Maintaining convenient and powerful git workflows takes priority over the usefulness of the raw Debian source package. The Debian archive is thought of as an output format. For example, we don't spend time curating a series of quilt patches. However, in straightforward cases, the information such a series would contain is readily available from B. =item It is more important to have the Debian package's git history be a descendent of upstream's git history than to use exactly the orig.tar that upstream makes available for download. =back This workflow is less suitable for some packages. When the Debian delta contains multiple pieces which interact, or which you aren't going to be able to upstream soon, it might be preferable to maintain the delta as a rebasing patch series. For such a workflow see for example dgit-maint-debrebase(7) and dgit-maint-gbp(7). =head1 INITIAL DEBIANISATION This section explains how to start using this workflow with a new package. It should be skipped when converting an existing package to this workflow. =head2 When upstream tags releases in git Suppose that the latest stable upstream release is 1.2.2, and this has been tagged '1.2.2' by upstream. =over 4 % git clone -oupstream https://some.upstream/foo.git % cd foo % git verify-tag 1.2.2 % git reset --hard 1.2.2 % git branch --unset-upstream =back The final command detaches your master branch from the upstream remote, so that git doesn't try to push anything there, or merge unreleased upstream commits. If you want to maintain a copy of your packaging branch on B in addition to B, you can do something like this: =over 4 % git remote add -f origin salsa.debian.org:Debian/foo.git % git push --follow-tags -u origin master =back Now go ahead and Debianise your package. Just make commits on the master branch, adding things in the I directory. If you need to patch the upstream source, just make commits that change files outside of the I directory. It is best to separate commits that touch I from commits that touch upstream source, so that the latter can be cherry-picked by upstream. Note that there is no need to maintain a separate 'upstream' branch, unless you also happen to be involved in upstream development. We work with upstream tags rather than any branches, except when forwarding patches (see FORWARDING PATCHES UPSTREAM, below). Finally, you need an orig tarball: =over 4 % git deborig =back See git-deborig(1) if this fails. This tarball is ephemeral and easily regenerated, so we don't commit it anywhere (e.g. with tools like pristine-tar(1)). =head3 Verifying upstream's tarball releases =over 4 It can be a good idea to compare upstream's released tarballs with the release tags, at least for the first upload of the package. If they are different, you might need to add some additional steps to your I, such as running autotools. A convenient way to perform this check is to import the tarball as described in the following section, using a different value for 'upstream-tag', and then use git-diff(1) to compare the imported tarball to the release tag. If they are the same, you can use upstream's tarball instead of running git-deborig(1). =back =head3 Using untagged upstream commits =over 4 Sometimes upstream does not tag their releases, or you want to package an unreleased git snapshot. In such a case you can create your own upstream release tag, of the form BI, where I is the upstream version you plan to put in I. The B prefix ensures that your tag will not clash with any tags upstream later creates. For example, suppose that the latest upstream release is 1.2.2 and you want to package git commit ab34c21 which was made on 2013-12-11. A common convention is to use the upstream version number 1.2.2+git20131211.ab34c21 and so you could use =over 4 % git tag -s upstream/1.2.2+git20131211.ab34c21 ab34c21 =back to obtain a release tag, and then proceed as above. One can generate such a versioned tag using git show's --pretty option. e.g.: =over 4 % git tag -s upstream/$(git show --date=format:%Y%m%d --pretty=format:"1.2.2+git%cd.%h" --quiet upstream/main) upstream/main =back =back =head2 When upstream releases only tarballs We need a virtual upstream branch with virtual release tags. gbp-import-orig(1) can manage this for us. To begin =over 4 % mkdir foo % cd foo % git init =back Now create I: =over 4 [DEFAULT] upstream-branch = upstream debian-branch = master upstream-tag = upstream/%(version)s sign-tags = True pristine-tar = False pristine-tar-commit = False [import-orig] merge-mode = merge merge = False =back gbp-import-orig(1) requires a pre-existing upstream branch: =over 4 % git add debian/gbp.conf && git commit -m "create gbp.conf" % git checkout --orphan upstream % git rm -rf . % git commit --allow-empty -m "initial, empty branch for upstream source" % git checkout -f master =back Then we can import the upstream version: =over 4 % gbp import-orig --merge --merge-mode=replace ../foo_1.2.2.orig.tar.xz =back Our upstream branch cannot be pushed to B, but since we will need it whenever we import a new upstream version, we must push it somewhere. The usual choice is B: =over 4 % git remote add -f origin salsa.debian.org:Debian/foo.git % git push --follow-tags -u origin master upstream =back You are now ready to proceed as above, making commits to both the upstream source and the I directory. =head1 CONVERTING AN EXISTING PACKAGE This section explains how to convert an existing Debian package to this workflow. It should be skipped when debianising a new package. =head2 No existing git history =over 4 % dgit clone foo % cd foo % git remote add -f upstream https://some.upstream/foo.git =back =head2 Existing git history using another workflow First, if you don't already have the git history locally, clone it, and obtain the corresponding orig.tar from the archive: =over 4 % git clone git.debian.org:collab-maint/foo % cd foo % origtargz =back Now dump any existing patch queue: =over 4 % git rm -rf debian/patches % git commit -m "drop existing quilt patch queue" =back Then make new upstream tags available: =over 4 % git remote add -f upstream https://some.upstream/foo.git =back =for dgit-test dpkg-source-ignores begin Now you simply need to ensure that your git HEAD is dgit-compatible, i.e., it is exactly what you would get if you ran B and then unpacked the resultant source package. =for dgit-test dpkg-source-ignores end To achieve this, you might need to delete I. One way to have dgit check your progress is to run B. The first dgit push will require I<--overwrite>. If this is the first ever dgit push of the package, consider passing I<--deliberately-not-fast-forward> instead of I<--overwrite>. This avoids introducing a new origin commit into your git history. (This origin commit would represent the most recent non-dgit upload of the package, but this should already be represented in your git history.) =head1 SOURCE PACKAGE AND GIT CONFIGURATION =head2 dgit configuration We must tell dgit not to try to maintain a linear queue of patches to the upstream source: =over 4 git config dgit.default.quilt-mode single =back This command should be executed in each git clone of this package, including your co-maintainer's. Don't set it more globally, because it is not a good default for working on Debian source packages in general. =head2 debian/source/options We set a source package option to help dpkg handle changes to the upstream source: =over 4 auto-commit =back You don't need to create this file if you are using the version 1.0 source package format. =head1 BUILDING AND UPLOADING Use B, B, B, B, B, and B as detailed in dgit(1). If any command fails, dgit will provide a carefully-worded error message explaining what you should do. If it's not clear, file a bug against dgit. Remember to pass I<--new> for the first upload. If you want to upload with git-debpush(1), for the first upload you should pass the B<--quilt=single> quilt mode option (see git-debpush(1)). As another alternative to B and friends, you can use a tool like gitpkg(1). This works because like dgit, gitpkg(1) enforces that HEAD has exactly the contents of the source package. gitpkg(1) is highly configurable, and one dgit user reports using it to produce and test multiple source packages, from different branches corresponding to each of the current Debian suites. If you want to skip dgit's checks while iterating on a problem with the package build (for example, you don't want to commit your changes to git), you can just run dpkg-buildpackage(1) or debuild(1) instead. =head1 NEW UPSTREAM RELEASES =head2 Obtaining the release =head3 When upstream tags releases in git =over 4 % git fetch --tags upstream =back If you want to package an untagged upstream commit (because upstream does not tag releases or because you want to package an upstream development snapshot), see "Using untagged upstream commits" above. =head3 When upstream releases only tarballs You will need the I from "When upstream releases only tarballs", above. You will also need your upstream branch. Above, we pushed this to B. You will need to clone or fetch from there, instead of relying on B/B alone. Then, either =over 4 % gbp import-orig ../foo_1.2.3.orig.tar.xz =back or if you have a working watch file =over 4 % gbp import-orig --uscan =back In the following, replace I<1.2.3> with I. =head2 Reviewing & merging the release It's a good idea to preview the merge of the new upstream release. First, just check for any new or deleted files that may need accounting for in your copyright file: =over 4 % git diff --name-status --diff-filter=ADR master..1.2.3 -- . ':!debian' =back You can then review the full merge diff: =over 4 % git merge-tree `git merge-base master 1.2.3` master 1.2.3 | $PAGER =back Once you're satisfied with what will be merged, update your package: =over 4 % git merge 1.2.3 % dch -v1.2.3-1 New upstream release. % git add debian/changelog && git commit -m changelog =back If you obtained a tarball from upstream, you are ready to try a build. If you merged a git tag from upstream, you will first need to generate a tarball: =over 4 % git deborig =back =head1 HANDLING DFSG-NON-FREE MATERIAL =head2 When upstream tags releases in git We create a DFSG-clean tag to merge to master: =over 4 % git checkout -b pre-dfsg 1.2.3 % git rm evil.bin % git commit -m "upstream version 1.2.3 DFSG-cleaned" % git tag -s 1.2.3+dfsg % git checkout master % git branch -D pre-dfsg =back Before merging the new 1.2.3+dfsg tag to master, you should first determine whether it would be legally dangerous for the non-free material to be publicly accessible in the git history on B. If it would be dangerous, there is a big problem; in this case please consult your archive administrators (for Debian this is the dgit administrator dgit-owner@debian.org and the ftpmasters ftpmaster@ftp-master.debian.org). =head2 When upstream releases only tarballs The easiest way to handle this is to add a B field to I, and a B setting in I. See uscan(1). Alternatively, see the I<--filter> option detailed in gbp-import-orig(1). =head1 FORWARDING PATCHES UPSTREAM The basic steps are: =over 4 =item 1. Create a new branch based off upstream's master branch. =item 2. git-cherry-pick(1) commits from your master branch onto your new branch. =item 3. Push the branch somewhere and ask upstream to merge it, or use git-format-patch(1) or git-request-pull(1). =back For example (and it is only an example): =over 4 % # fork foo.git on GitHub % git remote add -f fork git@github.com:spwhitton/foo.git % git checkout -b fix-error upstream/master % git config branch.fix-error.pushRemote fork % git cherry-pick master^2 % git push % # submit pull request on GitHub =back Note that when you merge an upstream release containing your forwarded patches, git and dgit will transparently handle "dropping" the patches that have been forwarded, "retaining" the ones that haven't. =head1 INCORPORATING NMUS =over 4 % dgit pull =back Alternatively, you can apply the NMU diff to your repository. The next push will then require I<--overwrite>. =head1 SEE ALSO dgit(1), dgit(7) =head1 AUTHOR This tutorial was written and is maintained by Sean Whitton . It contains contributions from other dgit contributors too - see the dgit copyright file. work/dgit-maint-native.7.pod0000644000000000000000000000453114761250142013125 0ustar =head1 NAME dgit - tutorial for package maintainers of Debian-native packages =head1 INTRODUCTION This document describes elements of a workflow for using B to maintain a Debian package that uses one of the native source formats ("1.0" & "3.0 (native)"). =over 4 =item We expect that your git history is fast-forwarding. =item You should be prepared to tolerate a small amount of ugliness in your git history in the form of merges which stitch the dgit-generated archive view into your maintainer history. This is to handle uploads that were not made with dgit, such as the uploads you made before switching to this workflow, or NMUs. =back =head2 Benefits =over 4 =item Benefit from dgit's safety catches. In particular, ensure that your upload always matches exactly your git HEAD. =item Provide a better, more detailed history to downstream dgit users. =item Incorporate an NMU with one command. =back =head1 FIRST PUSH WITH DGIT You do not need to do anything special to your tree to push with dgit. Simply prepare your git tree in the usual way, and then: =over 4 % dgit -wgf --overwrite push-source =back (Do not make any tags yourself: dgit push will do that.) You may use B or B instead of B; see dgit(1) for the syntax of those subcommands. The --overwrite option tells dgit that you are expecting that your git history is not a descendant of the history which dgit synthesised from the previous non-dgit uploads. dgit will make a merge commit on your branch but without making any code changes (ie, a pseudo-merge) so that your history, which will be pushed to the dgit git server, is fast forward from the dgit archive view. Alternatively, if this was the first ever dgit push of the package, you can avoid this merge commit by passing C<--deliberately-not-fast-forward> instead of C<--overwrite>. This avoids introducing a new origin commit into your git history. =head1 SUBSEQUENT PUSHES =over 4 % dgit -wgf push-source =back That's it. =head1 INCORPORATING AN NMU =over 4 % dgit pull =back That's it. Or, if you would prefer to review the changes, you can do this: =over 4 % dgit fetch % dgit diff HEAD..dgit/dgit/sid =back If you do not merge the NMU into your own git history, the next push will then require I<--overwrite>. =head1 SEE ALSO dgit(1), dgit(7) work/dgit-nmu-simple.7.pod0000644000000000000000000001015114761250142012612 0ustar =head1 NAME dgit-nmu-simple - tutorial for DDs wanting to NMU with git =head1 INTRODUCTION AND SCOPE This tutorial describes how a Debian Developer can do a straightforward NMU of a package in Debian, using dgit. This document won't help you decide whether an NMU is a good idea or whether it be well received. The Debian Developers' Reference has some (sometimes questionable) guidance on this. Conversely, you do not need to know anything about the usual maintainer's git workflow. If appropriate, you can work on many different packages, making similar changes, without worrying about the individual maintainers' git practices. This tutorial only covers changes which can sensibly be expressed as a reasonably small number of linear commits (whether to Debian packaging or to upstream files or both). If you want to do a new upstream version, you probably want to do as the maintainer would have done. You'll need to find out what the maintainer's git practices are and consult the appropriate C workflow tutorial, =head1 SUMMARY =over 4 % dgit clone glibc jessie % cd glibc % git am ~/glibc-security-fix.diff % dch --nmu "Apply upstream's fix for foo bug." % git add debian/changelog && git commit -m"NMU changelog entry" % dpkg-buildpackage -uc -b [ run your tests ] % dch -r && git add debian/changelog && git commit -m"Finalise NMU" % dgit -wgf sbuild -A -c jessie [ any final tests on generated .debs ] % dgit -wgf [--delayed=5] push-source jessie [ enter your gnupg passphrase as prompted ] [ see that push and upload are successful ] [ prepare and email NMU diff (git-diff, git-format-patch) ] =back =head1 WHAT KIND OF CHANGES AND COMMITS TO MAKE When preparing an NMU, the git commits you make on the dgit branch should be simple linear series of commits with good commit messages. The commit messages will be published in various ways, including perhaps being used as the cover messages for generated quilt patches. Do not make merge commits. Do not try to rebase to drop patches - if you need to revert a change which is actually a Debian patch, use git-revert. If you need to modify a Debian patch, make a new commit which fixes what needs fixing, and explain in the commit message which patch it should be squashed with (perhaps by use of a commit message in C format). (Of course if you have specific instructions from the maintainer, you can follow those instead. But the procedure in this tutorial is legitimate for any maintainer, in the sense that it should generate an upload to which the maintainer cannot reasonably object.) =head1 RELEVANT BRANCHES dgit clone will put you on a branch like C. There is a pseudo-remote called C which also contains a branch like C, so you do things like C to see what changes you have made. =head1 KEEPING YOUR WORKING TREE TIDY Don't forget to C any new files you create. Otherwise git clean (which is requested with the C<-wgf> option in the recipe above) will delete them. Many package builds leave dirty git trees. So, commit before building. That way you can use C. If you follow this approach you don't need to care about the build dirtying the tree. It also means you don't care about the package clean target, which is just as well because many package clean targets are broken. =head1 OTHER GIT BRANCHES The dgit git history (visible in gitk and git log) is not necessarily related to the maintainer's or upstream's git history (if any). If the maintainer has advertised a git repo with Vcs-Git dgit will set up a remote for it, so you can do =over 4 % git fetch vcs-git =back You can cherry pick changes from there, for example. Note that the maintainer's git history may not be suitable for use with dgit. For example, it might be a patches-unapplied branch or even contain only a debian/ directory. =head1 UPLOADING TO DELAYED You can use dgit's I<--delayed> option to upload to the DELAYED queue. However, you should read the warning about this option in dgit(1). =head1 SEE ALSO dgit(1), dgit(7), dgit-maint-*(7) work/dgit-sponsorship.7.pod0000644000000000000000000001754614761250142013132 0ustar =head1 NAME dgit-sponsorship - tutorial for Debian upload sponsorship, using git =head1 INTRODUCTION AND SCOPE This tutorial describes how a Debian sponsored contributor and a sponsoring DD (or DM) can collaborate and publish using git. The sponsor must be intending to use dgit for the upload. (If the sponsor does not use dgit, it is not possible to properly publish a sponsee's git branch.) It is best if the sponsee also uses dgit; but also covered (later on) is the case where the sponsee provides a proposed upload in source package form, but the sponsor would like to work in git. This tutorial does not provide a checklist for the sponsor's review. Both contributors are expected to be familiar with Debian packaging and Debian's processes, and with git. =head1 SPONSEE WORKFLOW This section is addressed to the sponsee: =head2 General You should prepare the package as if you were going to upload it with C or C yourself. For a straightforward NMU, consult L. If you are the (prospective) maintainer, you can adopt any suitable (dgit-compatible) git workflow. The L tutorials describe some of the possibilities. =head2 Upload preparation You should go through all of the steps a self-uploading maintainer would do, including building for ad hoc tests, and checking via a formal build (eg using C) that the package builds on sid (or the target release). At the point where you would, if you were a DD, do the actual upload by running dgit push, you hand off to your sponsor. If you were going to use one of the C<--quilt=> options to dgit, or C or C, you must specify that in your handoff email - see below. =head2 git+origs based handoff The elements of the handoff consists of: =over =item * The git branch. =item * Any .orig tarballs which will be needed, or sample git-archive(1) or gbp-buildpackage(1) command(s) to generate them. =item * A sample dgit push-source command, containing any dgit --quilt=, --gbp or --dpm option needed =item * Plus of course all the usual information about the state of the package, any caveats or areas you would like the sponsor to focus their review, constraints about upload timing, etc. =back If the handoff is done by email, the elements above should be a in a single, signed, message. This could be an RFS submission against the sponsorship-requests pseudo-package. =head3 git branch =over 4 The sponsee should push their HEAD as a git branch to any suitable git server. They can use their own git server; salsa is another possibility. The branch names used by the sponsee on their local machine, and on the server, do not matter. Instead, the sponsee should include the git commit id of their HEAD in their handover email. =back =head3 orig tarballs =over 4 If there are any .origs that are not in the archive already, the sponsor will need them as part of the upload. If the sponsee generated these tarballs with git-archive(1) or gbp-buildpackage(1), they can simply include a sample invocation of git-archive(1) or ensure that a suitable gbp.conf is present in the source package to generate the tarball. Otherwise, the simplest approach is to commit the orig tarballs with pristine-tar(1), e.g. =over 4 % pristine-tar commit ../foo_1.2.3.orig.tar.xz upstream/1.2.3 =back and be sure to push the pristine-tar branch. If you are using git-buildpackage(1), just pass I<--git-pristine-tar> and I<--git-pristine-tar-commit>. Alternatively, the sponsee can put them on a suitable webserver, or attach to the e-mail, if they are small. The sponsee should quote sha256sums of the .origs in their handoff email, unless they supplied commands to generate them. =back =head3 quilt options =over 4 Some workflows involve git branches which are not natively dgit-compatible. Normally dgit will convert them as needed, during push. Supply a sample "dgit push-source" command including any C<--gbp> (aka C<--quilt=gbp>), C<--dpm> (aka C<--quilt=dpm>), or other C<--quilt=> option they need to use. e.g. =over 4 % dgit --gbp push-source =back =back =head1 SPONSOR WORKFLOW This part is addressed to the sponsor: =head2 Receiving and validating the sponsorship request You should check the signature on the email. Use C or C to obtain the git branch prepared by your sponsee, and obtain any .origs mentioned by the sponsee (to extract .origs committed with pristine-tar, you can use origtargz(1), or use "gbp clone --pristine-tar".) Check the git commit ID of the sponsee's branch tip, and the sha256sums of the .origs, against the handoff email. Now you can check out the branch tip, and do your substantive review. =head2 Dealing with branches that want --quilt= If your sponsee mentioned a C<--quilt> option, and you don't want to grapple with their preferred tree format, you can convert their tree into the standard dgit view: =over 4 % dgit -wgf --quilt=foo --dgit-view-save=unquilted quilt-fixup % git checkout unquilted =back You should check that what you're looking at is a descendant of the sponsee's branch. =head2 Some hints which may help the review C will get you an up-to-date C showing what's in the archive already. C will check that dgit can build an appropriate source package. There is no need to run debdiff. dgit will not upload anything that doesn't unpack to exactly the git commit you are pushing, so you can rely on what you see in C. =head2 Doing the upload When you have completed your source review, and use C or similar, to to the build, and then C or C to do the upload. Check whether the sponsee made a debian/I tag. If they did, ensure you have their tag in the repository you are pushing from, or pass C<--no-dep14tag>. This avoids identically named, non-identical tags, which can be confusing. (It is possible to upload from the quilt-cache dgit view. If you want to do this, B pass the C<--quilt> or C<--gbp> or C<--dpm> options again, and B pass C<--no-dep14tag>, since the debian/I tag should go on the sponsee's branch.) If this was the first upload done with dgit, you may need to pass C<--overwrite> to dgit. Alternatively, if this was the first ever dgit push of the package, you can pass C<--deliberately-not-fast-forward> instead of C<--overwrite>. This avoids introducing a new origin commit into the dgit view of the sponsee's git history which is unnecessary and could be confusing. =head1 SPONSORING A NON-GIT-USING SPONSEE This part is addressed to the sponsor: If your sponsee does not use git, you can still do your review with git, and use dgit for the upload. Your sponsee will provide you with a source package: that is, a .dsc and the files it refers to. Obtain these files, and check signatures as appropriate. Then: =over 4 % dgit clone PACKAGE % cd PACKAGE % dgit import-dsc /path/to/sponsee's.dsc +sponsee % git checkout sponsee =back Or for an entirely new package: =over 4 % mkdir PACKAGE % cd PACKAGE % git init % dgit -pPACKAGE import-dsc /path/to/sponsee's.dsc +sponsee =back This will leave you looking at the sponsee's package, formatted as a dgit branch. When you have finished your review and your tests, you can do the dgit push-source (or dgit sbuild and dgit push-built) directly from the "sponsee" branch. You will need to pass C<--overwrite> to dgit push for every successive upload. This disables a safety catch which would normally spot situations where changes are accidentally lost. When your sponsee is sending you source packages - perhaps multiple source packages with the same version number - these safety catches are inevitably ineffective. =head1 SEE ALSO dgit(1), dgit(7), dgit-nmu-simple(7), dgit-maint-*(7) work/dgit-user.7.pod0000644000000000000000000003045414761250142011512 0ustar =head1 NAME dgit-user - making and sharing changes to Debian packages, with git =head1 INTRODUCTION dgit lets you fetch the source code to every package on your system as if your distro used git to maintain all of it. You can then edit it, build updated binary packages (.debs) and install and run them. You can also share your work with others. This tutorial gives some recipes and hints for this. It assumes you have basic familiarity with git. It does not assume any initial familiarity with Debian's packaging processes. If you are a package maintainer within Debian; a DM or DD; and/or a sponsee: this tutorial is not for you. Try L, L, or L and L. =head1 SUMMARY (These runes will be discussed later.) =over 4 % dgit clone glibc jessie,-security % cd glibc % curl 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u % git commit -a -m 'Fix libc lost output bug' % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit % mk-build-deps --root-cmd=sudo --install % dpkg-buildpackage -uc -b % sudo dpkg -i ../libc6_*.deb =back Occasionally: =over 4 % git clean -xdf % git reset --hard =back Later: =over 4 % cd glibc % dgit pull jessie,-security % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit % dpkg-buildpackage -uc -b % sudo dpkg -i ../libc6_*.deb =back =head1 FINDING THE RIGHT SOURCE CODE - DGIT CLONE =over 4 % dgit clone glibc jessie,-security % cd glibc =back dgit clone needs to be told the source package name (which might be different to the binary package name, which was the name you passed to "apt-get install") and the codename or alias of the Debian release (this is called the "suite"). =head2 Finding the source package name For many packages, the source package name is obvious. Otherwise, if you know a file that's in the package, you can look it up with dpkg: =over 4 % dpkg -S /lib/i386-linux-gnu/libc.so.6 libc6:i386: /lib/i386-linux-gnu/libc.so.6 % dpkg -s libc6:i386 Package: libc6 Status: install ok installed ... Source: glibc =back (In this example, libc6 is a "multi-arch: allowed" package, which means that it exists in several different builds for different architectures. That's where C<:i386> comes from.) =head2 Finding the Debian release (the "suite") Internally, Debian (and derived) distros normally refer to their releases by codenames. Debian also has aliases which refer to the current stable release etc. So for example, at the time of writing Debian C (Debian 8) is Debian C; and the current version of Ubuntu is C (Yakkety Yak, 16.10). You can specify either the codename C or the alias C. If you don't say, you get C, which is Debian C - the main work-in progress branch. If you don't know what you're running, try this: =over 4 % grep '^deb' /etc/apt/sources.list deb http://the.earth.li/debian/ jessie main non-free contrib ... % =back For Debian, you should add C<,-security> to the end of the suite name, unless you're on unstable or testing. Hence, in our example C becomes C. (Yes, with a comma.) =head1 WHAT DGIT CLONE PRODUCES =head2 What branches are there dgit clone will give you a new working tree, and arrange for you to be on a branch named like C (yes, with a comma in the branch name). For each release (like C) there is a tracking branch for the contents of the archive, called C (and similarly for other suites). This can be updated with C. This, the I, is synthesized by your local copy of dgit. It is fast forwarding. Debian separates out the security updates, into C<*-security>. Telling dgit C means that it should include any updates available in C. The comma notation is a request to dgit to track jessie, or jessie-security if there is an update for the package there. (You can also dgit fetch in a tree that wasn't made by dgit clone. If there's no C you'll have to supply a C<-p>I option to dgit fetch.) =head2 What kind of source tree do you get If the Debian package is based on some upstream release, the code layout should be like the upstream version. You should find C helpful to find where to edit. The package's Debian metadata and the scripts for building binary packages are under C. C, C and C are the starting points. The Debian Policy Manual has most of the in-depth technical details. For many Debian packages, there will also be some things in C. It is best to ignore these. Insofar as they are relevant the changes there will have been applied to the actual files, probably by means of actual comments in the git history. The contents of debian/patches are ignored when building binaries from dgitish git branches. (For Debian afficionados: the git trees that come out of dgit are "patches-applied packaging branches without a .pc directory".) =head2 What kind of history you get If you're lucky, the history will be a version of, or based on, the Debian maintainer's own git history, or upstream's git history. But for many packages the real git history does not exist, or has not been published in a dgitish form. So you may find that the history is a rather short history invented by dgit. dgit histories often contain automatically-generated commits, including commits which make no changes but just serve to make a rebasing branch fast-forward. This is particularly true of combining branches like C. If the package maintainer is using git then after dgit clone you may find that there is a useful C remote referring to the Debian package maintainer's repository for the package. You can see what's there with C. But use what you find there with care: Debian maintainers' git repositories often have contents which are very confusing and idiosyncratic. In particular, you may need to manually apply the patches that are in debian/patches before you do anything else! =head1 BUILDING =head2 Always commit before building =over 4 % wget 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u % git commit -a -m 'Fix libc lost output bug' =back Debian package builds are often quite messy: they may modify files which are also committed to git, or leave outputs and temporary files not covered by C<.gitignore>. If you always commit, you can use =over 4 % git clean -xdf % git reset --hard =back to tidy up after a build. (If you forgot to commit, don't use those commands; instead, you may find that you can use C to help commit what you actually wanted to keep.) These are destructive commands which delete all new files (so you B remember to say C) and throw away edits to every file (so you B remember to commit). =head2 Update the changelog (at least once) before building =over 4 % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit =back The binaries you build will have a version number which ultimately comes from the C. You want to be able to tell your binaries apart from your distro's. So you should update C to add a new stanza at the top, for your build. This rune provides an easy way to do this. It adds a new changelog entry with an uninformative message and a plausible version number (containing a bit of your git commit id). If you want to be more sophisticated, the package C has a good Emacs mode for editing changelogs. Alternatively, you could edit the changelog with another text editor, or run C or C with different options. Choosing a good version number is slightly tricky and a complete treatment is beyond the scope of this tutorial. =head2 Actually building =over 4 % mk-build-deps --root-cmd=sudo --install % dpkg-buildpackage -uc -b =back dpkg-buildpackage is the primary tool for building a Debian source package. C<-uc> means not to pgp-sign the results. C<-b> means build all binary packages, but not to build a source package. =head2 Using sbuild You can build in an schroot chroot, with sbuild, instead of in your main environment. (sbuild is used by the Debian build daemons.) =over 4 % git clean -xdf % sbuild -c jessie -A --no-clean-source \ --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn' =back Note that this will seem to leave a "source package" (.dsc and .tar.gz) in the parent directory, but that source package should not be used. It is likely to be broken. For more information see Debian bug #868527. =head1 INSTALLING =head2 Debian Jessie or older =over 4 % sudo dpkg -i ../libc6_*.deb =back You can use C to install the .debs that came out of your package. If the dependencies aren't installed, you will get an error, which can usually be fixed with C. =head2 Debian Stretch or newer =over 4 % sudo apt install ../libc6_*.deb =back =head1 Multiarch If you're working on a library package and your system has multiple architectures enabled, you may see something like this: =over 4 dpkg: error processing package libpcre3-dev:amd64 (--configure): package libpcre3-dev:amd64 2:8.39-3~3.gbp8f25f5 cannot be configured because libpcre3-dev:i386 is at a different version (2:8.39-2) =back The multiarch system used by Debian requires each package which is present for multiple architectures to be exactly the same across all the architectures for which it is installed. The proper solution is to build the package for all the architectures you have enabled. You'll need a chroot for each of the secondary architectures. This is somewhat tiresome, even though Debian has excellent tools for managing chroots. C from the package of the same name and C from the C package are good starting points. Otherwise you could deinstall the packages of interest for those other architectures with something like C. If neither of those are an option, your desperate last resort is to try using the same version number as the official package for your own package. (The version is controlled by C - see above.) This is not ideal because it makes it hard to tell what is installed, and because it will mislead and confuse apt. With the "same number" approach you may still get errors like =over 4 trying to overwrite shared '/usr/include/pcreposix.h', which is different from other instances of package libpcre3-dev =back but passing C<--force-overwrite> to dpkg will help - assuming you know what you're doing. =head1 SHARING YOUR WORK The C branch (or whatever) is a normal git branch. You can use C to publish it on any suitable git server. Anyone who gets that git branch from you will be able to build binary packages (.deb) just as you did. If you want to contribute your changes back to Debian, you should probably send them as attachments to an email to the L (either a followup to an existing bug, or a new bug). Patches in C format are usually very welcome. =head2 Source packages The git branch is not sufficient to build a source package the way Debian does. Source packages are somewhat awkward to work with. Indeed many plausible git histories or git trees cannot be converted into a suitable source package. So I recommend you share your git branch instead. If a git branch is not enough, and you need to provide a source package but don't care about its format/layout (for example because some software you have consumes source packages, not git histories) you can use this recipe to generate a C<3.0 (native)> source package, which is just a tarball with accompanying .dsc metadata file: =over 4 % echo '3.0 (native)' >debian/source/format % git commit -m 'switch to native source format' debian/source/format % dgit -wgf build-source =back If you need to provide a good-looking source package, be prepared for a lot more work. You will need to read much more, perhaps starting with L, L or L =head1 SEE ALSO dgit(1), dgit(7) work/dgit.10000644000000000000000000015324014761250142007746 0ustar '\" t .TH dgit 1 "" "Debian Project" "dgit" .SH NAME dgit \- git integration with the Debian archive . .SH SYNOPSIS .B dgit [\fIdgit\-opts\fP] \fBclone\fP [\fIdgit\-opts\fP] \fIpackage\fP [\fIsuite\fP] [\fB./\fP\fIdir|\fB/\fP\fIdir\fR] .br .B dgit [\fIdgit\-opts\fP] \fBfetch\fP|\fBpull\fP [\fIdgit\-opts\fP] [\fIsuite\fP] .br .B dgit [\fIdgit\-opts\fP] \fBbuild\fP|\fBsbuild\fP|\fBbuild-source\fP [\fIbuild\-opts\fP] .br .B dgit [\fIdgit\-opts\fP] \fBpbuilder\fP|\fBcowbuilder\fP [\fIdebbuildopts\fP] .br .B dgit [\fIdgit\-opts\fP] \fBpush\fP|\fBpush-built\fP [\fIdgit\-opts\fP] [\fIsuite\fP] .br .B dgit [\fIdgit\-opts\fP] \fBrpush\fR|\fBrpush-built\fP \fIbuild-host\fR\fB:\fR\fIbuild-dir\fR [\fIpush args...\fR] .br .B dgit [\fIdgit\-opts\fP] \fIaction\fR ... .SH DESCRIPTION .B dgit allows you to treat the Debian archive as if it were a git repository. Conversely, it allows Debian to publish the source of its packages as git branches, in a format which is directly useable by ordinary people. This is the command line reference. Please read the tutorial(s): .TS lb l. dgit-user(7) for users: edit, build and share packages dgit-nmu-simple(7) for DDs: do a straightforward NMU dgit-maint-native(7) for maintainers of Debian-native packages dgit-maint-debrebase(7) for maintainers: a pure-git rebasish workflow dgit-maint-merge(7) for maintainers: a pure-git merging workflow dgit-maint-gbp(7) for maintainers already using git-buildpackage dgit-sponsorship(7) for sponsors and sponsored contributors dgit-downstream-dsc(7) setting up dgit push for a new distro .TE .LP See \fBdgit(7)\fP for detailed information about the data model, common problems likely to arise with certain kinds of package, etc. .SH OPERATIONS .TP \fBdgit clone\fR \fIpackage\fP [\fIsuite\fP] [\fB./\fP\fIdir|\fB/\fP\fIdir\fR] Consults the archive and dgit-repos to construct the git view of history for .I package in .I suite .RB ( sid by default) in a new directory (named .BI ./ package by default); also, downloads any necessary orig tarballs. The suite's git tip is left on the local branch .BI dgit/ suite ready for work, and on the corresponding dgit remote tracking branch. The .B origin remote will be set up to point to the package's dgit-repos tree for the distro to which .I suite belongs. .I suite may be a combination of several underlying suites in the form .IR mainsuite \fB,\fR subsuite ...; see COMBINED SUITES in dgit(7). For your convenience, the .B vcs-git remote will be set up from the package's Vcs-Git field, if there is one - but note that in the general case the history found there may be different to or even disjoint from dgit's view. (See also dgit update-vcs-git.) .TP \fBdgit fetch\fR [\fIsuite\fP] Consults the archive and git-repos to update the git view of history for a specific suite (and downloads any necessary orig tarballs), and updates the remote tracking branch .BR remotes/dgit/dgit/ \fIsuite\fR. If the current branch is .BI dgit/ suite then dgit fetch defaults to .IR suite ; otherwise it parses debian/changelog and uses the suite specified there. suite may be a combined suite, as for clone. .TP \fBdgit pull\fR [\fIsuite\fP] Does dgit fetch, and then merges the new head of the remote tracking branch .BI remotes/dgit/dgit/ suite into the current branch. .TP \fBdgit checkout\fR \fIsuite\fR Checks out the local branch .BR dgit/ \fIsuite\fR. If the branch does not exist, dgit checkout creates it, and sets it up the same way as dgit clone would. In that case, if the archive remote tracking branch does not exist, dgit checkout will do a dgit fetch first. NB: dgit checkout will only do a fetch if it has to. If you already have the suite branch, and want to merge your branch with updates from the archive, use dgit pull. dgit checkout will normally need to access the archive server, to canonicalise the provided suite name. The exception is if you specify the canonical name, and the branch (or tracking branch) already exists. .TP \fBdgit build\fR ... Runs .B dpkg-buildpackage with some suitable options. Options and arguments after build will be passed on to dpkg-buildpackage. It is not necessary to use dgit build when using dgit; it is OK to use any approach which ensures that the generated source package corresponds to the relevant git commit. Tagging, signing and actually uploading should be left to dgit push. dgit's build operations access the network, to get the \-v option right. See \-v, below. .TP \fBdgit build-source\fR ... Builds the source package, and a changes file for a prospective source-only upload, using .BR dpkg-source . The output is left in .IR package \fB_\fR version \fB.dsc\fR and .IR package \fB_\fR version \fB_source.changes\fR. Tagging, signing and actually uploading should be left to dgit push-source, or dgit push. .TP .B dgit clean Cleans the current working tree (according to the \-\-clean= option in force). .TP \fBdgit update-vcs-git\fR [\fIsuite\fP|\fB.\fR] [\fB\-\-\fR] [\fIgit fetch options\fR] .TQ \fBdgit update-vcs-git\fR [\fIsuite|\fP\fB.\fR] \fB\-\fR Sets up, or updates the url of, the vcs-git remote, and (unless \fB-\fR was specified) runs git fetch on it. By default, the Vcs-Git field of the .dsc from Debian sid is used, as that is probably most up to date. Another suite may be specified, or .B . to indicate that the Vcs-Git of the cwd's debian/control should be used instead. .TP .B dgit help Print a usage summary. .TP \fBdgit sbuild\fR ... Constructs the source package, uses .B sbuild to do a binary build, and uses mergechanges to merge the source and binary changes files. Options and arguments after sbuild will be passed on to sbuild. The output is left in .IR package \fB_\fR version \fB_multi.changes\fR. .IP Tagging, signing and actually uploading should be left to dgit push. .TP \fBdgit pbuilder\fR [\fIdebbuildopts\fP] Constructs the source package, uses .B pbuilder to do a binary build, and uses mergechanges to merge the source and binary changes files. The output is left in .IR package \fB_\fR version \fB_multi.changes\fR. You should ensure that your dgit \-\-build-products-dir setting matches your pbuilder \-\-buildresult. The \fIdebbuildopts\fP are passed to pbuilder using its \-\-debbuildopts option. If you want to pass other options to pbuilder, use the \fB\-\-pbuilder:\fR dgit option as described below (remember that dgit options should appear between \fBdgit\fR and \fBpbuilder\fR). You should ensure that in your pbuilderrc you do .B not have the setting .B SOURCE_ONLY_CHANGES=yes as this may cause trouble. .TP \fBdgit cowbuilder\fR [\fIdebbuildopts\fP] Like \fBdgit pbuilder\fR, but uses .B cowbuilder instead of .B pbuilder. .TP \fBdgit gbp-build\fR ... Runs .B git-buildpackage with some suitable options. Options and arguments after gbp-build will be passed on to git-buildpackage. By default this uses \-\-quilt=gbp, so HEAD should be a git-buildpackage style branch, not a patches-applied branch. Tagging, signing and actually uploading should be left to dgit push. .TP \fBdgit push-source\fR [\fIsuite\fP] Does an `upload': sends the current HEAD to dgit-repos (as git commits), and to the archive (as a source package, built by this command). This is the usual way to upload to Debian. It is like saying "update the source code in the archive to match my git HEAD, and let the autobuilders do the rest." In more detail: dgit push-source builds a source package from HEAD. It then pushes the HEAD to the suite's dgit-repos branch, adjusts the .changes to include any .origs which the archive lacks and exclude .origs which the archive has (so \-sa and \-sd are not needed when building for dgit push), makes a signed git tag, edits the .dsc to contain the dgit metadata field, runs debsign to sign the upload (.dsc and .changes), pushes the signed tag, and finally uses dput to upload the .changes to the archive. dgit push always uses the package, suite and version specified in the debian/changelog and the .dsc, which must agree. If the command line specifies a suite then that must match too. When used on a git-debrebase branch, dgit calls git-debrebase to prepare the branch for source package upload and push. With \fB\-C\fR, dgit push-source performs a dgit push-built, additionally ensuring that no binary packages are uploaded. .TP \fBdgit push-built\fR [\fIsuite\fP] Does an `upload' of a previously built package, possibly including binaries. Sends the current HEAD to dgit-repos (as git commits); and, sends the previously built source package and binaries to the archive. The package must already have been built ready for upload, with the .dsc and .changes left in the parent directory. It is normally best to do the build with dgit too (e.g. with dgit sbuild): some existing build tools pass unhelpful options to dpkg-source et al by default, which can result in the built source package not being identical to the git tree. dgit will check that the .dsc corresponds exactly to the current HEAD, ensuring that all users, whether of the dgit git view, or of the traditional archive, see the same source package. .TP \fBdgit rpush-source\fR|\fBrpush-built\fR \fIbuild-host\fR\fB:\fR\fIsrc-dir\fR [\fIpush args...\fR] Pushes the contents of the specified directory on a remote machine. This is like running dgit push on build-host with src-dir as the current directory; however, signing operations are done on the invoking host. This allows you to do a push when the system which has the source code (and any built binaries) has no access to the key: .TS l l. 1. Clone on build host (dgit clone) 2. Edit code on build host (edit, git commit) 3. Build package on build host (dgit build) 4. Test package on build host or elsewhere (dpkg \-i, test) 5. Upload by invoking dgit rpush on host with your GPG key. .TE However, the build-host must be able to ssh to the dgit repos. If this is not already the case, you must organise it separately, for example by the use of ssh agent forwarding. The remaining arguments are treated just as dgit push-source or dgit push-built would handle them. build-host and build\-dir can be passed as separate arguments; this is assumed to be the case if the first argument contains no : (except perhaps one in [ ], to support IPv6 address literals). You will need similar enough versions of dgit on the build-host and the invocation host. The build-host needs gnupg installed, with your public key in its keyring (but not your private key, obviously). .TP \fBdgit push\fR|\fBrpush\fR \fI...\fP Configurable aliases for .BR "dgit push-built" and .BR "dgit rpush-built". These aliases will in the future change to mean .BR "dgit push-source" and .BR "dgit rpush-source" , and therefore they currently generate a warning. The behaviour of dgit push is controlled by the .B dgit.default.push-subcmd git config option: .TS l l l . \fBsource\fR runs \fBdgit push-source\fR future default \fBbuilt\fR and runs \fBdgit push-built\fR \fBbuilt,warn\fR warns, and runs \fBdgit push-built\fR current default \fBreject\fR fails .TE For dgit rpush, the behaviour is controlled by .BR dgit.default.rpush-subcmd , falling back to .BR dgit.default.push-subcmd if that is not set. Because dgit rpush is not typically run in a git working tree, only global git config options (and \fB-c\fR command line options) are relevant. These settings can safely be passed to older dgit (via .BR -c); the value .B built will be supported indefinitely. This should be used in scripts that need to work with both old versions of dgit (that don't have \fBpush-built\fR) and new versions (where \fBpush-source\fR is the default). .TP .B dgit setup-new-tree Configure the current working tree the way that dgit clone would have set it up. Like running .BR "dgit setup-useremail" , .B setup-mergechangelogs and .B setup-gitattributes (but only does each thing if dgit is configured to do it automatically). You can use these in any git repository, not just ones used with the other dgit operations. Does .B not run .B update-vcs-git (as that requires Debian packaging information). .TP .B dgit setup-useremail Set the working tree's user.name and user.email from the distro-specific dgit configuration .RB ( dgit-distro. \fIdistro\fR .user-name " and " .user-email ), or DEBFULLNAME or DEBEMAIL. .TP .B dgit setup-mergechangelogs Configures a git merge helper for the file .B debian/changelog which uses .BR dpkg-mergechangelogs . .TP .B dgit setup-gitattributes Set up the working tree's .B .git/info/attributes to disable all transforming attributes for all files. This is done by defining a macro attribute, .B dgit-defuse-attrs, and applying it to .BR * . For why, see .B GITATTRIBUTES in .BR dgit(7) . Note that only attributes affecting the working tree are suppressed. git-archive may remain exciting. If there is an existing macro attribute line .B [attr]dgit-defuse-attrs in .git/info/attributes, but it is insufficient, because it was made by an earlier version of dgit and git has since introduced new transforming attributes, this modifies the macro to disable the newer transformations. (If there is already a macro attribute line .B [attr]dgit-defuse-attrs in .git/info/attributes which does what dgit requires (whatever files it effects), this operation does nothing further. This fact can be used to defeat or partially defeat dgit setup-gitattributes and hence dgit setup-new-tree.) .TP .B dgit quilt-fixup `3.0 (quilt)' format source packages need changes representing not only in-tree but also as patches in debian/patches. dgit quilt-fixup checks whether this has been done; if not, dgit will make appropriate patches in debian/patches and also commit the resulting changes to git. This is normally done automatically by dgit build and dgit push. dgit will try to turn each relevant commit in your git history into a new quilt patch. dgit cannot convert nontrivial merges, or certain other kinds of more exotic history. If dgit can't find a suitable linearisation of your history, by default it will fail, but you can ask it to generate a single squashed patch instead. When used with a git-debrebase branch, dgit will ask git-debrebase to prepare patches. However, dgit can make patches in some situations where git-debrebase fails, so dgit quilt-fixup can be useful in its own right. To always use dgit's own patch generator instead of git-debrebase make-patches, pass \-\-git-debrebase=true to dgit. See .B FORMAT 3.0 (QUILT) in .BR dgit(7) . .TP \fBdgit import-dsc\fR [\fIsub-options\fR] \fI../path/to/.dsc\fR [\fB+\fR|\fB..\fR]branch Import a Debian-format source package, specified by its .dsc, into git, the way dgit fetch would do. This does about half the work of dgit fetch: it will convert the .dsc into a new, orphan git branch. Since dgit has no access to a corresponding source package archive or knowledge of the history it does not consider whether this version is newer than any previous import or corresponding git branches; and it therefore does not make a pseudomerge to bind the import into any existing git history. Because a .dsc can contain a Dgit field naming a git commit (which you might not have), and specifying where to find that commit (and any history rewrite table), import-dsc might need online access. If this is a problem (or dgit's efforts to find the commit fail), consider \-\-no-chase-dsc-distro or \-\-force-import-dsc-with-dgit-field. There is only one sub-option: .B \-\-require-valid-signature causes dgit to insist that the signature on the .dsc is valid (using the same criteria as dpkg-source \-x). Otherwise, dgit tries to verify the signature but the outcome is reported only as messages to stderr. If .I branch is prefixed with .B + then if it already exists, it will be simply overwritten, no matter its existing contents. If .I branch is prefixed with .B .. then if it already exists and dgit actually imports the dsc (rather than simply reading the git commit out of the Dgit field), dgit will make a pseudomerge so that the result is necessarily fast forward from the existing branch. Otherwise, if \fIbranch\fR already exists, dgit will stop with an error message. If .I branch does not start with refs/, refs/heads/ is prepended. .TP .B dgit version Prints version information and exits. .TP .BI "dgit clone-dgit-repos-server" " destdir" Tries to fetch a copy of the source code for the dgit-repos-server, as actually being used on the dgit git server, as a git tree. .TP .BI "dgit print-dgit-repos-server-source-url" Prints the url used by dgit clone-dgit-repos-server. This is hopefully suitable for use as a git remote url. It may not be useable in a browser. .TP .BI "dgit print-dpkg-source-ignores" Prints the \-i and \-I arguments which must be passed to dpkg-souce to cause it to exclude exactly the .git directory and nothing else. The separate arguments are unquoted, separated by spaces, and do not contain spaces. .TP .B dgit print-unapplied-treeish Constructs a tree-ish approximating the patches-unapplied state of your 3.0 (quilt) package, and prints the git object name to stdout. This requires appropriate .orig tarballs. This tree object is identical to your .origs as regards upstream files. The contents of the debian subdirectory is not interesting and should not be inspected; except that debian/patches will be identical to your HEAD. To make this operate off-line, the access configuration key which is used to determine the build-products-dir is the uncanonicalised version of the suite name from the changelog, or (of course) dgit.default.build-products-dir. See ACCESS CONFIGURATION, below. This function is primarily provided for the benefit of git-debrebase. .SH OPTIONS .TP .BI \-k keyid Use .I keyid for signing the tag and the upload. The default comes from the distro's .B keyid config setting (see CONFIGURATION, below), or failing that, the uploader trailer line in debian/changelog. .TP .BR --no-sign does not sign tags or uploads (meaningful only with push). .TP .TP .BI -p package Specifies that we should process source package .I package rather than looking in debian/control or debian/changelog. Valid with dgit fetch and dgit pull, only. .TP .BR --clean=git " | " -wg Use .BR "git clean -xdf" to clean the working tree, rather than running the package's rules clean target. This will delete all files which are not tracked by git. (Including any files you forgot to git add.) .BI --clean= ... options other than dpkg-source are useful when the package's clean target is troublesome, or to avoid needing the build-dependencies. dgit will only actually clean the tree if it needs to (because it needs to build the source package or binaries from your working tree). Otherwise it will just check that there are no untracked unignored files. See --clean=git[-ff],always, below. .TP .BR --clean=git-ff " | " -wgf Use .BR "git clean -xdff" to clean the working tree. Like git clean -xdf but it also removes any subdirectories containing different git trees (which only unusual packages are likely to create). .TP .BR --clean=git "[" -ff "]" ,always " | " -wga " | " -wgfa Like --clean=git, but always does the clean and not just a check, deleting any untracked un-ignored files. .TP .BR --clean=check " | " --clean=check,ignores " | " -wc " | " -wci Merely check that the tree is clean (does not contain uncommitted files). Avoids running rules clean, and can avoid needing the build-dependencies. With .BR ,ignores or .BR \-wci , untracked files covered by .gitignore are tolerated, so only files which show up as .B ? in git status (ie, ones you maybe forgot to git add) are treated as a problem. .TP .BR \-\-clean=none " | " \-wn Do not clean the tree, nor check that it is clean. Avoids running rules clean, and can avoid needing the build-dependencies. If there are files which are not in git, or if the build creates such files, a subsequent dgit push will fail. .TP .BR --clean=dpkg-source "[" -d "] | " -wd " | " -wdd Use dpkg-buildpackage to do the clean, so that the source package is cleaned by dpkg-source running the package's clean target. --clean=dpkg-source is the default. Without the extra .BR d , requires the package's build dependencies. With .BR ... -d or .BR -wdd , the build-dependencies are not checked (due to passing .BR -d to dpkg-buildpackage), which violates policy, but may work in practice. The rules clean target will only be run if it is needed: when dgit is going to build source or binary packages from your working tree, rather than from your git branch (for example because of \-\-include-dirty or because the binary package build uses your working tree). In all cases, dgit will check that there are (after rules clean, if applicable) no untracked un-ignored files, in case these are files you forgot to git add. (Except that this check is not done for a `3.0 (quilt)' package when dgit has to apply patches, dirtily, to the working tree.) If your package does not have a good .gitignore you will probably need --clean=dpkg-source,no-check aka -wdn. .TP .BR --clean=dpkg-source "[" -d "]" ,no-check " | " -wdn " | " -wddn Like --clean=dpkg-source, but does not care about untracked un-ignored files. .TP .BR --clean=dpkg-source "[" -d "]" ,all-check " | " -wda " | " -wdda Like --clean=dpkg-source, but fails even on ignored untracked files. This could perhaps be used to detect bugs in your rules clean target. .TP .BR -N " | " --new The package is, or may be, new in this suite. Without this, dgit will refuse to push. Needing --new is not unusual; for example, it is frequently needed for uploading to Debian experimental. Note that dgit may be unable to access the git history for an entirely new package which has not been accepted by the archive. So for an entirely new package you need to properly coordinate with anyone else who might upload. .TP .BR --include-dirty Do not complain if the working tree does not match your git HEAD, and when building, include the changes from your working tree. This can be useful with build, if you plan to commit later. (dgit push will still ensure that the .dsc you upload and the git tree you push are identical, so this option won't make broken pushes.) Note that this does .BR not prevent dgit from cleaning your tree, so if the changes in your working tree are in the form of untracked files, those might still be deleted, especially with --clean=git. If you want to include untracked files in the build, you can use --clean=none or --clean=dpkg-source[-d] in addition to --include-dirty. Note that this combination can fail if the untracked files are under \fIdebian/patches/\fR. .TP .BR --ignore-dirty Deprecated alias for --include-dirty. .TP .BR --overwrite [=\fIprevious-version\fR] Declare that your HEAD really does contain all the (wanted) changes from all versions listed in its changelog; or, all (wanted) changes from .IR previous-version . This promise is needed when your git branch is not a descendant of the version in the archive according to the git revision history. It is safer not to specify .IR previous-version , and usually it's not needed. Just say .BR \-\-overwrite , unless you know what you are doing. This option is useful if you are the maintainer, and you have incorporated NMU changes into your own git workflow in a way that doesn't make your branch a fast forward from the NMU. It can also be useful when there was an upload made without dgit since the most recent upload made with dgit. This option is also usually necessary the first time a package is pushed with dgit push to a particular suite. See .BR dgit-maint- \fI*\fR (7) . If .I previous-version is not specified, dgit will check that the version in the archive is mentioned in your debian/changelog. (This will avoid losing changes, even with .BR --overwrite , unless someone committed to git a finalised changelog entry, and then made later changes to that version.) If .IR previous-version is specified, it ought to be the version currently in the archive. dgit push --overwrite will, if necessary, make a pseudo-merge (that is, something that looks like the result of git merge -s ours) to stitch the archive's version into your own git history, so that your push is a fast forward from the archive. (In quilt mode .BR gbp ", " dpm ", " unpatched " or " baredebian *, implying a split between the dgit view and the maintainer view, the pseudo-merge will appear only in the dgit view.) .TP .BR \-\-delayed =\fIdays\fR Upload to a DELAYED queue. .B WARNING: If the maintainer responds by cancelling your upload from the queue, and does not make an upload of their own, this will not rewind the git branch on the dgit git server. Other dgit users will then see your push (with a warning message from dgit) even though the maintainer wanted to abolish it. Such users might unwittingly reintroduce your changes. If this situation arises, someone should make a suitable dgit push to update the contents of dgit-repos to a version without the controversial changes. .TP .BR --no-chase-dsc-distro Tells dgit not to look online for additional git repositories containing information about a particular .dsc being imported. Chasing is the default. For most operations (such as fetch and pull), disabling chasing means dgit will access only the git server for the distro you are directly working with, even if the .dsc was copied verbatim from another distro. For import-dsc, disabling chasing means dgit will work completely offline. Disabling chasing can be hazardous: if the .dsc names a git commit which has been rewritten by those in charge of the distro, this option may prevent that rewrite from being effective. Also, it can mean that dgit fails to find necessary git commits. .TP .BR \-\-save-dgit-view= \fIbranch\fR|\fIref\fR Specifies that when split view is in operation, and dgit calculates (or looks up in its cache) a dgit view corresponding to your HEAD, the dgit view will be left in .IR ref . The specified ref is unconditionally overwritten, so don't specify a branch you want to keep. This option is effective only with the following operations: quilt-fixup; push; all builds. And it is only effective when split view is actually in operation. If ref does not start with refs/ it is taken to be a branch - i.e. refs/heads/ is prepended. .B \-\-dgit-view-save is a deprecated alias for \-\-save-dgit-view. .TP .BI \-\-deliberately- something Declare that you are deliberately doing .IR something . This can be used to override safety catches, including safety catches which relate to distro-specific policies. The use of \-\-deliberately is declared and published in the signed tags generated for you by dgit, so that the archive software can give effect to your intent, and for the benefit of humans looking at the history. The meanings of .IR something s understood in the context of Debian are discussed below: .TP .BR --deliberately-not-fast-forward Declare that you are deliberately rewriting history. This could be because your branch is not fast forward from the dgit server history, or not fast forward from a locally-synthesised dsc import. When pushing to Debian, use this only when you are making a renewed upload of an entirely new source package whose previous version was not accepted for release from NEW because of problems with copyright or redistributibility; or, exceptionally, for the very first upload with dgit. When split view is in operation, this also prevents the construction by dgit of a pseudomerge to make the dgit view fast forwarding. Normally only one of --overwrite (which creates a suitable pseudomerge) and --deliberately-not-fast-forward (which suppresses the pseudomerge and the fast forward checks) should be needed; --overwrite is usually better. .TP .BR --deliberately-include-questionable-history Declare that you are deliberately including, in the git history of your current push, history which contains a previously-submitted version of this package which was not approved (or has not yet been approved) by the ftpmasters. When pushing to Debian, only use this option after verifying that: none of the rejected-from-NEW (or never-accepted) versions in the git history of your current push, were rejected by ftpmaster for copyright or redistributability reasons. .TP .BR --deliberately-fresh-repo Declare that you are deliberately rewriting history and want to throw away the existing repo. Not relevant when pushing to Debian, as the Debian server will do this automatically when necessary. .TP .BR --quilt=linear With format `3.0 (quilt)', insist on a linear patch stack: one new patch for each relevant commit. If such a stack cannot be generated, fail. This is the default for Debian. HEAD should be a series of plain commits (not touching debian/patches/), and pseudomerges, with as ancestor a patches-applied branch. .TP .BR --quilt=try-linear With format `3.0 (quilt)', prefer a linear patch stack (as with --quilt=linear) but if that doesn't seem possible, try to generate a single squashed patch for all the changes made in git (as with --quilt=smash). This is not a good idea for an NMU in Debian. .TP .BR --quilt=smash With format `3.0 (quilt)', assume patches-applied (as obtained from dgit clone) and generate a single additional patch for all the changes made in git. This is not a good idea for an NMU in Debian. (If HEAD has any in-tree patches already, they must apply cleanly. This will be the case for any trees produced by dgit fetch or clone; if you do not change the upstream version nor make changes in debian/patches, it will remain true.) .TP .BR --quilt=single With format `3.0 (quilt)', assume patches-applied (as obtained from dgit clone), delete all the existing patches, and then generate a single patch for all the changes made in git. This is not a good idea for an NMU in Debian. Use this instead of the .B single-debian-patch dpkg-source format option. That dpkg-source option cannot handle certain changes to the tree that dpkg-source otherwise permits, and in some cases it can generate strange source packages that dpkg-source appears to accept but which become corrupted when people later try to modify them. .TP .BR --quilt=nofix With format `3.0 (quilt)', assume patches-applied (as obtained from dgit clone), and check that the patch metadata is up to date. If it isn't, fail; you must then fix the metadata yourself somehow before pushing. (NB that dpkg-source --commit will not work because the dgit git tree does not have a .B .pc directory.) .TP .BR --quilt=nocheck " | " --no-quilt-fixup With format `3.0 (quilt)', assume that the tree is patches-applied (as obtained from dgit clone), and \fIassume\fR that the patch metadata is up to date. If you use this option and the patch metadata is out of date, dgit push will fail. .TP .BR -- [ quilt= ] gbp " | " -- [ quilt= ] dpm " | " --quilt=unapplied " | " -- [ quilt= ] baredebian [ +git | +tarball ] Tell dgit that you are using a nearly-dgit-compatible git branch, aka a .BR "maintainer view" , and do not want your branch changed by dgit. These quilt modes are known as .BR "splitting quilt modes" . See --split-view, below. .B --gbp (short for .BR --quilt=gbp ) is for use with git-buildpackage. Your HEAD is expected to be a patches-unapplied git branch, except that it might contain changes to upstream .gitignore files. This is the default for dgit gbp-build. .B --dpm (short for .BR --quilt=dpm ) is for use with git-dpm. Your HEAD is expected to be a patches-applied git branch, except that it might contain changes to upstream .gitignore files. .B --quilt=unapplied specifies that your HEAD is a patches-unapplied git branch (and that any changes to upstream .gitignore files are represented as patches in debian/patches). .B --quilt=baredebian (or its alias .BR --quilt=baredebian+git ) specifies that your HEAD contains only a debian/ directory, with any changes to upstream files represented as patches in debian/patches. The upstream source must be available in git, by default, in a suitably named git tag; see --upstream-commitish. In this mode, dgit cannot check that all edited upstream files are properly represented as patches: dgit relies on debian/patches being correct. .B --quilt=baredebian+tarball is like --quilt=baredebian, but is used when there is no appropriate upstream git history. To construct the dgit view, dgit will import your orig tarballs' contents into git. In this mode, dgit cannot check that the upstream parts of your upload correspond to what you intend: dgit relies on the right orig tarball(s) existing, and debian/patches being correct. With --quilt=gbp|dpm|unapplied|baredebian*, dgit push (or precursors like quilt-fixup and build) will automatically generate a conversion of your git branch into the right form. dgit push will push the dgit-compatible form (the .BR "dgit view" ) to the dgit git server. The dgit view will be visible to you in the dgit remote tracking branches, but your own branch will not be modified. dgit push will create a tag .BI debian/ version for the maintainer view, and the dgit tag .BI archive/debian/ version for the dgit view. dgit quilt-fixup will merely do some checks, and cache the maintainer view. .B If you have a branch like this it is essential to specify the appropriate \-\-quilt= option! This is because it is not always possible to tell: a patches-unapplied git branch of a package with one patch, for example, looks very like a patches-applied branch where the user has used git revert to undo the patch, expecting to actually revert it. However, if you fail to specify the right \-\-quilt option, and you aren't too lucky, dgit will notice the problem and stop, with a useful hint. .TP .BR \-d "\fIdistro\fR | " \-\-distro= \fIdistro\fR Specifies that the suite to be operated on is part of distro .IR distro . This overrides the default value found from the git config option .BR dgit-suite. \fIsuite\fR .distro . The only effect is that other configuration variables (used for accessing the archive and dgit-repos) used are .BR dgit-distro. \fIdistro\fR .* . If your suite is part of a distro that dgit already knows about, you can use this option to make dgit work even if your dgit doesn't know about the suite. For example, specifying .B \-ddebian will work when the suite is an unknown suite in the Debian archive. To define a new distro it is necessary to define methods and URLs for fetching (and, for dgit push, altering) a variety of information both in the archive and in dgit-repos. How to set this up is not yet documented. .TP .BR \-\-split-view=auto | always | never Controls whether dgit operates a split view, separating your own branch (as Debian maintainer) from that shown to users of dgit clone and dgit fetch. When split view is in operation dgit will not make or merge any commits onto your own branch. Specifically, only the dgit view will contain dgit's pseudomerges, which bring into the git history previous uploads made with dgit push, and any commits in debian/patches required to make a correct `3.0 (quilt)' source package. .B auto is the default, and splits the view only when needed: i.e., when you are working with a `3.0 (quilt)' source package and a splitting quilt mode: \-\-[quilt=]gbp, dpm, unpatched or baredebian*. .B always splits the view regardless of the source format and the quilt mode. .B never will cause dgit to fail if split view is needed. When split view is in operation, the dgit view is visible in your local git clone, but only in refs specific to dgit: notably .BI remotes/dgit/dgit/ suite and .BR archive/ \fIdistro\fR / \fIversion\fR. Note that split view does not affect dgit fetch, and is not compatible with dgit pull. .TP .BI \-C changesfile Specifies the .changes file which is to be uploaded. By default dgit push looks for a single .changes file in the parent directory whose filename suggests it is for the right package and version. If the specified .I changesfile pathname contains slashes, the directory part is also used as the value for .BR \-\-build-products-dir ; otherwise, the changes file is expected in that directory (by default, in .BR .. ). .TP .BI \-\-upstream-commitish= upstream For use with --quilt=baredebian only. Specifies the commit containing the upstream source. This commit must be identical to your .orig tarball. The default is to look for one of the git tags .IB U " v" U " upstream/" U (in that order), where U is the upstream version. .TP .B \-\-rm-old-changes When doing a build, delete any changes files matching .IB package _ version _*.changes before starting. This ensures that dgit push (and dgit sbuild) will be able to unambiguously identify the relevant changes files from the most recent build, even if there have been previous builds with different tools or options. The default is not to remove, but .B \-\-no-rm-old-changes can be used to override a previous \-\-rm-old-changes or the .rm-old-changes configuration setting. Note that \fBdgit push-source\fR will always find the right .changes, regardless of this option. .TP .BI \-\-build-products-dir= directory Specifies where to find and create tarballs, binary packages, source packages, .changes files, and so on. By default, dgit uses the parent directory .RB ( .. ). Changing this setting may necessitate moving .orig tarballs to the new directory, so it is probably best to use the .BI dgit.default.build-products-dir configuration setting (see CONFIGURATION, below) which this command line option overrides). .TP .BI --no-rm-on-error Do not delete the destination directory if clone fails. .TP .BI --dep14tag Generates a DEP-14 tag (eg .BR debian/ \fIversion\fR) as well as a dgit tag (eg .BR archive/debian/ \fIversion\fR). This is the default. .TP .BI --no-dep14tag Do not generate a DEP-14 tag, except when split view is in operation. .TP .BI --always-dep14tag Obsolete alias for --dep14tag, retained for compatibility. .TP .BI -D Prints debugging information to stderr. Repeating the option produces more output (currently, up to -DDDD is meaningfully different). .TP .BI -c name = value Specifies a git configuration option, to be used for this run. dgit itself is also controlled by git configuration options. .TP .RI \fB-v\fR version "|\fB_\fR | " \fB--since-version=\fR version |\fB_\fR Specifies the .BI -v version option to pass to dpkg-genchanges, during builds. Changes (from debian/changelog) since this version will be included in the built changes file, and hence in the upload. If this option is not specified, dgit will query the archive and use the latest version uploaded to the intended suite. Specifying .B _ inhibits this, so that no -v option will be passed to dpkg-genchanges (and as a result, only the last stanza from debian/changelog will be used for the build and upload). .TP .RI \fB-m\fR maintaineraddress Passed to dpkg-genchanges (eventually). .TP .RI \fB--ch:\fR option Specifies a single additional option to pass, eventually, to dpkg-genchanges. Options which are safe to pass include .BR -C (and also .BR "-si -sa -sd" although these should never be necessary with Debian since dgit automatically calculates whether .origs need to be uploaded.) For other options the caveat below applies. .TP .RI \fB--curl:\fR option " | \fB--dput:\fR" option " |..." Specifies a single additional option to pass to .BR curl , .BR dput , .BR debsign , .BR dpkg-source , .BR dpkg-buildpackage , .BR dpkg-genchanges , .BR sbuild , .BR pbuilder , .BR cowbuilder , .BR ssh , .BR dgit , .BR git-debrebase , .BR apt-get , .BR apt-cache , .BR gbp-pq , .BR gbp-build , or .BR mergechanges . Can be repeated as necessary. Use of this ability should not normally be necessary. It is provided for working around bugs, or other unusual situations. If you use these options, you may violate dgit's assumptions about the behaviour of its subprograms and cause lossage. For dpkg-buildpackage, dpkg-genchanges, mergechanges and sbuild, the option applies only when the program is invoked directly by dgit. Usually, for passing options to dpkg-genchanges, you should use .BR \-\-ch: \fIoption\fR. Specifying \-\-git is not effective for some lower-level read-only git operations performed by dgit, and also not when git is invoked by another program run by dgit. See notes below regarding ssh and dgit. NB that \-\-gpg:option is not supported (because debsign does not have that facility). But see .B \-k and the .B keyid distro config setting. .TP .RI \fB\-\-curl!:\fR option " | \fB\-\-dput!:\fR" option " |..." Specifies an option to remove from the command line for a program called by dgit, as for \fB\-\-\fR\fIprogram\fI\fB:\fR\fIoption\fR (and the same caveats apply). Any options or arguments exactly identical to .I option are removed. (It is not an error if there were none.) This can only be used to delete options which are always passed by default by dgit, or to undo a previous \fB\-\-\fR\fIprogram\fI\fB:\fR\fIoption\fR. It cannot be used to override option(s) dynamically decided on by dgit. .TP .RI \fB\-\-curl=\fR program " | \fB\-\-dput=\fR" program " |..." Specifies alternative programs to use instead of .BR curl , .BR dput , .BR debsign , .BR dpkg-source , .BR dpkg-buildpackage , .BR dpkg-genchanges , .BR sbuild , .BR pbuilder , .BR cowbuilder , .BR gpg , .BR ssh , .BR dgit , .BR git-debrebase , .BR apt-get , .BR apt-cache , .BR git , .BR gbp-pq , .BR gbp-build , or .BR mergechanges . For .BR dpkg-buildpackage , .BR dpkg-genchanges , .B mergechanges and .BR sbuild , this applies only when the program is invoked directly by dgit. For .BR dgit , specifies the command to run on the remote host when dgit rpush needs to invoke a remote copy of itself. (dgit also reinvokes itself as the EDITOR for dpkg-source \-\-commit; this is done using argv[0], and is not affected by \-\-dgit=). .BR gbp-build 's value is used instead of gbp build or git-buildpackage. (The default is the latter unless the former exists on PATH.) .BR gbp-pq 's value is used instead of gbp pq. In both cases, unusually, the specified value is split on whitespace to produce a command and possibly some options and/or arguments. For pbuilder and cowbuilder, the defaults are .BR "sudo -E pbuilder" and .BR "sudo -E cowbuilder" respectively. Like with gbp-build and gbp pq, the specified value is split on whitespace. For .BR ssh , the default value is taken from the .B DGIT_SSH or .B GIT_SSH environment variables, if set (see below). And, for ssh, when accessing the archive and dgit-repos, this command line setting is overridden by the git config variables .BI dgit-distro. distro .ssh and .B .dgit.default.ssh (which can in turn be overridden with \-c). Also, when dgit is using git to access dgit-repos, only git's idea of what ssh to use (eg, .BR GIT_SSH ) is relevant. .TP .BI \-\-existing-package= package dgit push needs to canonicalise the suite name. Sometimes, dgit lacks a way to ask the archive to do this without knowing the name of an existing package. Without \-\-new we can just use the package we are trying to push. But with \-\-new that will not work, so we guess .B dpkg or use the value of this option. This option is not needed with the default mechanisms for accessing the archive. .TP .BR \-h | \-\-help Print a usage summary. .TP .BI \-\-initiator-tempdir= directory dgit rpush uses a temporary directory on the invoking (signing) host. This option causes dgit to use .I directory instead. Furthermore, the specified directory will be emptied, removed and recreated before dgit starts, rather than removed after dgit finishes. The directory specified must be an absolute pathname. .TP .BR \-\-dry-run " | " \-n Go through the motions, fetching all information needed, but do not actually update the output(s). For push, dgit does the required checks and leaves the new .dsc in a temporary file, but does not sign, tag, push or upload. This is not a very good simulation. It can easily go wrong in ways that a for-real push wouldn't. .TP .BR \-\-damp-run " | " \-L Go through many more of the motions: do everything that doesn't involve either signing things, or making changes on the public servers. Using this will make unsigned tags, and possibly other local changes, that will get in the way of a for-real push. So be prepared to burn the version number you're using. .TP .BI \-\-force- something Instructs dgit to try to proceed despite detecting what it thinks is going to be a fatal problem. .B This is probably not going to work. These options are provided as an escape hatch, in case dgit is confused. (They might also be useful for testing error cases.) .TP .B \-\-force-import-dsc-with-dgit-field Tell dgit import-dsc to treat a .dsc with a Dgit field like one without it. The result is a fresh import, discarding the git history that the person who pushed that .dsc was working with. .TP .B \-\-force-reusing-version Carry on even though this involves reusing a version number of a previous push or upload. It is normally best to give different versions different numbers. Some servers (including, usually, the Debian server) will reject attempts to reuse or replace already-pushed versions. .TP .B \-\-force-uploading-binaries Carry on and upload binaries even though dgit thinks your distro does not permit that. .TP .B \-\-force-uploading-source-only Carry on and do a source-only upload, without any binaries, even though dgit thinks your distro does not permit that, or does not permit that in this situation. .TP .B \-\-force-unrepresentable Carry on even if dgit thinks that your git tree contains changes (relative to your .orig tarballs) which dpkg-source is not able to represent. Your build or push will probably fail later. .TP .B \-\-force-changes-origs-exactly Use the set of .origs specified in your .changes, exactly, without regard to what is in the archive already. The archive may well reject your upload. .TP .B \-\-force-unsupported-source-format Carry on despite dgit not understanding your source package format. dgit will probably mishandle it. .TP .B \-\-force-dsc-changes-mismatch Do not check whether .dsc and .changes match. The archive will probably reject your upload. .TP .BR \-\-force-import-gitapply-absurd " | " \-\-force-import-gitapply-no-absurd Force on or off the use of the absurd git-apply emulation when running gbp pq import when importing a package from a .dsc. See Debian bug #841867. .TP .BR \-\-force-push-tainted Go ahead and try to push even tainted git objects hat the server says it is going to reject, but without declaring any --deliberately. This option is provided for testing or strange situations, and is not the way to override the taint check: using it will probably just fail later, burning the version number you are using. Use the appropriate --deliberately option instead. .TP .BR \-\-for\-push Override the dgit-distro.distro.readonly configuration setting, to specify that we have read/write access and should use the corresponding git and achieve access approach even if the operation is a read-only one. .SH CONFIGURATION dgit can be configured via the git config system. You may set keys with git-config (either in system-global or per-tree configuration), or provide .BI -c key = value on the dgit command line. .LP Settings likely to be useful for an end user include: .TP .BI dgit.default.build-products-dir Specifies where to find the built files to be uploaded, when --build-products-dir is not specified. The default is the parent directory .RB ( .. ). .TP .BR dgit-suite. \fIsuite\fR .distro " \fIdistro\fR" Specifies the distro for a suite. dgit keys off the suite name (which appears in changelogs etc.), and uses that to determine the distro which is involved. The config used is thereafter that for the distro. .I suite may be a glob pattern. .TP .BI dgit.default.distro " distro" The default distro for an unknown suite. This is only used if no .BI /usr/share/distro-info/ somedistro .csv mentions the specified suite. .TP .BI dgit.default.default-suite " suite" The default suite (eg for clone). .TP .BR dgit.default. * for each .BR dgit-distro. \fIdistro\fR . *, the default value used if there is no distro-specific setting. .TP .BR dgit-distro. \fIdistro\fR .clean-mode One of the values for the command line \-\-clean= option; used if \-\-clean is not specified. .TP .BR dgit-distro. \fIdistro\fR .clean-mode-newer Like .clean-mode, but ignored if the value is unknown to this version of dgit. Setting both .clean-mode and .clean-mode-newer is useful to provide a single git config compatible with different dgit versions. .TP .BR dgit-distro. \fIdistro\fR .quilt-mode One of the values for the command line \-\-quilt= option; used if \-\-quilt is not specified. .TP .BR dgit-distro. \fIdistro\fR .split-view .TP .BR dgit-distro. \fIdistro\fR .rm-old-changes Boolean, used if neither \-\-rm-old-changes nor \-\-no-rm-old-changes is specified. The default is not to remove. .TP .BR dgit-distro. \fIdistro\fR .readonly " " auto | a " | " true | t | y | 1 " | " false | f | n | 0 Whether you have push access to the distro. For Debian, it is OK to use auto, which uses readonly mode if you are not pushing right now; but, setting this to false will avoid relying on the mirror of the dgit git repository server. .TP .BI dgit-distro. distro .keyid See also .BR \-k . .TP .BI dgit-distro. distro .mirror " url" .TP .BI dgit-distro. distro .username Not relevant for Debian. .TP .BI dgit-distro. distro .upload-host Might be useful if you have an intermediate queue server. .TP .BI dgit-distro. distro .user-name " " dgit-distro. distro .user-email Values to configure for user.name and user.email in new git trees. If not specified, the DEBFULLNAME and DEBEMAIL environment variables are used, respectively. Only used if .setup-usermail is not disabled. .TP .BI dgit-distro. distro .setup-useremail Whether to set user.name and user.email in new git trees. True by default. Ignored for dgit setup-useremail, which does it anyway. .TP .BI dgit-distro. distro .setup-mergechangelogs Whether to set up a merge driver which uses dpkg-mergechangelogs for debian/changelog. True by default. Ignored for dgit setup-mergechangelogs, which does it anyway. .TP .BI dgit-distro. distro .setup-gitattributes Whether to configure .git/info/attributes to suppress checkin/checkout file content transformations in new git trees. True by default. Ignored for dgit setup-gitattributes, which does it anyway. .TP .BI dgit-distro. distro .cmd- cmd Program to use instead of .IR cmd . Works like .BR \-\- \fIcmd\fR = "... ." .TP .BI dgit-distro. distro .opts- cmd Extra options to pass to .IR cmd . Works like .BR \-\- \fIcmd\fR : "... ." To pass several options, configure multiple values in git config (with git config \-\-add). The options for .BI dgit.default.opts- cmd and .BI dgit-distro. distro /push.opts- cmd are all used, followed by options from dgit's command line. .SH ACCESS CONFIGURATION There are many other settings which specify how a particular distro's services (archive and git) are provided. These should not normally be adjusted, but are documented for the benefit of distros who wish to adopt dgit. .TP .BI dgit-distro. distro .nominal-distro Shown in git tags, Dgit fields, and so on. .TP .BI dgit-distro. distro .alias-canon Used for all access configuration lookup. .TP .BR dgit-distro. \fIdistro\fR /push. * If set, overrides corresponding non \fB/push\fR config when .BR readonly=false , or when pushing and .BR readonly=auto . .TP .BI dgit-distro. distro .git-url .TP .BR dgit-distro. \fIdistro\fR .git-url [ -suffix ] .TP .BI dgit-distro. distro .git-proto .TP .BI dgit-distro. distro .git-path .TP .BR dgit-distro. \fIdistro\fR .git-check " " true | false | url | ssh-cmd .TP .BI dgit-distro. distro .git-check-suffix .TP .BI dgit-distro. distro .policy-query-supported-ssh " " false | unknown | true .TP .BR dgit-distro. \fIdistro\fR .diverts.divert " " new-distro | / \fIdistro-suffix\fR .TP .BI dgit-distro. distro .git-create " " ssh-cmd | true .TP .BR dgit-distro. \fIdistro\fR .archive-query " " ftpmasterapi: " | " madison: "\fIdistro\fR | " dummycat: "\fI/path\fR | " sshpsql: \fIuser\fR @ \fIhost\fR : \fIdbname\fR " " | " aptget:" .TP .BR dgit-distro. \fIdistro\fR .archive-query- ( url | tls-key | curl-ca-args ) .TP .BI dgit-distro. distro .madison-distro .TP .BI dgit-distro. distro .archive-query-default-component .TP .BR dgit-distro. \fIdistro\fR .dep14tag " " want | no [| always ] .TP .BI dgit-distro. distro .ssh .TP .BI dgit-distro. distro .sshpsql-dbname .TP .BR dgit-distro. \fIdistro\fR . ( git | sshpsql ) - ( user | host | user-force ) .TP .BI dgit-distro. distro .backports-quirk .TP .BI dgit-distro. distro .rewrite-map-enable .TP .BR dgit-distro. \fIdistro\fR .source-only-uploads " " ok | always | never | not-wholly-new .TP .BI dgit.default.old-dsc-distro .TP .BI dgit.dsc-url-proto-ok. protocol .TP .BI dgit.dsc-url-proto-ok.bad-syntax .TP .BI dgit.default.dsc-url-proto-ok .TP .BI dgit.default.push-subcmd " " source | built | warn,built Controls the behaviour of .BR "dgit push" . .TP .BR dgit.vcs-git.suites " \fIsuite\fR[" ; ...] .SH ENVIRONMENT VARIABLES .TP .BR DGIT_SSH ", " GIT_SSH specify an alternative default program (and perhaps arguments) to use instead of ssh. DGIT_SSH is consulted first and may contain arguments; if it contains any whitespace will be passed to the shell. GIT_SSH specifies just the program; no arguments can be specified, so dgit interprets it the same way as git does. See also the \-\-ssh= and \-\-ssh: options. .TP .BR DEBEMAIL ", " DEBFULLNAME Default git user.email and user.name for new trees. See .BR "dgit setup-new-tree" . .TP .BR gpg ", " dpkg- "..., " debsign ", " git ", [" lib ] curl ", " dput and other subprograms and modules used by dgit are affected by various environment variables. Consult the documentation for those programs for details. .SH BUGS There should be a `dgit rebase-prep' command or some such to turn a fast-forwarding branch containing pseudo-merges back into a rebasing patch stack. It might have to leave a note for a future dgit push. If the dgit push fails halfway through, it is not necessarily restartable and idempotent. It would be good to check that the proposed signing key is available before starting work. dgit's build functions, and dgit push, may make changes to your current HEAD. Sadly this is necessary for packages in the `3.0 (quilt)' source format. This is ultimately due to what I consider design problems in quilt and dpkg-source. \-\-dry-run does not always work properly, as not doing some of the git fetches may result in subsequent actions being different. Doing a non-dry-run dgit fetch first will help. \-\-damp-run is likely to work much better. .SH SEE ALSO \fBdgit\fP(7), \fBdgit-*\fP(7), \fBcurl\fP(1), \fBdput\fP(1), \fBdebsign\fP(1), \fBgit-config\fP(1), \fBgit-buildpackage\fP(1), \fBdpkg-buildpackage\fP(1), .br https://browse.dgit.debian.org/ work/dgit.70000644000000000000000000004664714761250142007770 0ustar .TH dgit 7 "" "Debian Project" "dgit" .SH NAME dgit \- principles of operation .SH SUMMARY .B dgit treats the Debian archive as a version control system, and bidirectionally gateways between the archive and git. The git view of the package can contain the usual upstream git history, and will be augmented by commits representing uploads done by other developers not using dgit. This git history is stored in a canonical location known as .B dgit-repos which lives on a dedicated git server. git branches suitable for use with dgit can be edited directly in git, and used directly for building binary packages. They can be shared using all conventional means for sharing git branches. It is not necessary to use dgit to work with dgitish git branches. However, dgit is (usually) needed in order to convert to or from Debian-format source packages. .SH SEE ALSO .TP \fBdgit\fP(1) Reference manual and documentation catalogue. .TP \fBdgit-*\fB(7) Tutorials and workflow guides. See dgit(1) for a list. .SH MODEL You may use any suitable git workflow with dgit, provided you satisfy dgit's requirements: dgit maintains a pseudo-remote called .BR dgit , with one branch per suite. This remote cannot be used with plain git. The .B dgit-repos repository for each package contains one ref per suite named \fBrefs/dgit/\fR\fIsuite\fR. These should be pushed to only by dgit. They are fast forwarding. Each push on this branch corresponds to an upload (or attempted upload). However, it is perfectly fine to have other branches in dgit-repos; normally the dgit-repos repo for the package will be accessible via the remote name `origin'. dgit push-* will also make signed tags called .BI archive/debian/ version (with version encoded a la DEP-14) and push them to dgit-repos. These are used at the server to authenticate pushes. Uploads made by dgit contain an additional field .B Dgit in the source package .dsc. (This is added by dgit push-*.) This specifies: a commit (an ancestor of the dgit/suite branch) whose tree is identical to the unpacked source upload; the distro to which the upload was made; a tag name which can be used to fetch the git commits; and a url to use as a hint for the dgit git server for that distro. Uploads not made by dgit are represented in git by commits which are synthesised by dgit. The tree of each such commit corresponds to the unpacked source; there is a commit with the contents, and a pseudo-merge from last known upload - that is, from the contents of the dgit/suite branch. Depending on the source package format, the contents commit may have a more complex structure, but ultimately it will be a convergence of stubby branches from origin commits representing the components of the source package. dgit expects trees that it works with to have a .B dgit (pseudo) remote. This refers to the dgit-created git view of the corresponding archive. The dgit archive tracking view is synthesised locally, on demand, by each copy of dgit. The tracking view is always a descendant of the dgit-repos suite branch (if one exists), but may be ahead of it if uploads have been done without dgit. The archive tracking view is always fast forwarding within each suite. dgit push-* can operate on any commit which is a descendant of the suite tracking branch. dgit does not make a systematic record of its imports of orig tarball(s). So it does not work by finding git tags or branches referring to orig tarball(s). The orig tarballs are downloaded (by dgit clone) into the parent directory, as with a traditional (non-gitish) dpkg-source workflow. You need to retain these tarballs in the parent directory for dgit build and dgit push-*. (They are not needed for purely-git-based workflows.) dgit repositories could be cloned with standard (git) methods. However, the dgit repositories do not contain uploads not made with dgit. And for sourceful builds / uploads the orig tarball(s) will need to be present in the parent directory. To a user looking at the archive, changes pushed in a simple NMU using dgit look like reasonable changes made in an NMU: in a `3.0 (quilt)' package the delta from the previous upload is recorded in new patch(es) constructed by dpkg-source. .SH COMBINED SUITES dgit can synthesize a combined view of several underlying suites. This is requested by specifying, for .I suite, a comma-separated list: .IP .IR mainsuite \fB,\fR subsuite ... .LP This facility is available with dgit clone, fetch and pull, only. dgit will fetch the same package from each specified underlying suite, separately (as if with dgit fetch). dgit will then generate a pseudomerge commit on the tracking branch .BI remotes/dgit/dgit/ suite which has the tip of each of the underlying suites as an ancestor, and which contains the same as the suite which has the highest version of the package. The package must exist in mainsuite, but need not exist in the subsuites. If a specified subsuite starts with .B - then mainsuite is prepended. So, for example, .B stable,-security means to look for the package in stable, and stable-security, taking whichever is newer. If stable is currently jessie, dgit clone would leave you on the branch .BR dgit/jessie,-security . Combined suites are not supported by the dgit build operations. This is because those options are intended for building for uploading source packages, and look in the changelog to find the relevant suite. It does not make sense to name a dgit-synthesised combined suite in a changelog, or to try to upload to it. When using this facility, it is important to always specify the same suites in the same order: dgit will not make a coherent fast-forwarding history view otherwise. The history generated by this feature is not normally suitable for merging back into upstreams, as it necessarily contains unattractive pseudomerges. .SH LIMITATIONS Because the synthesis of the suite tracking branches is done locally based only on the current archive state, it will not necessarily see every upload not done with dgit. Also, different versions of dgit (or the software it calls) might import the same .dscs differently (although we try to minimise this). As a consequence, the dgit tracking views of the same suite, made by different instances of dgit, may vary. They will have the same contents, but may have different history. There is no uniform linkage between the tracking branches for different suites. The Debian infrastructure does not do any automatic import of uploads made without dgit. It would be possible for a distro's infrastructure to do this; in that case, different dgit client instances would see exactly the same history. There has been no bulk import of historical uploads into Debian's dgit infrastructure. To do this it would be necessary to decide whether to import existing vcs history (which might not be faithful to dgit's invariants) or previous non-Dgit uploads (which would not provide a very rich history). git represents only file executability. git does not represent empty directories, or any leaf objects other than plain files and symlinks. The behaviour of Debian source package formats on objects with unusual permissions is complicated. Some pathological Debian source packages will no longer build if empty directories are pruned (or if other things not reproduced by git are changed). Such sources cannot be worked with properly in git, and therefore not with dgit either. .SH READ-ONLY DISTROS Distros which do not maintain a set of dgit history git repositories can still be used in a read-only mode with dgit. Currently Ubuntu is configured this way. .SH GITATTRIBUTES git has features which can automatically transform files as they are being copied between the working tree and the git history. The attributes can be specified in the source tree itself, in .BR .gitattributes . See \fBgitattributes\fP(5). These transformations are context-sensitive and not, in general, reversible, so dgit operates on the principle that the dgit git history contains the actual contents of the package. (When dgit is manipulating a .dsc, it does so in a private area, where the transforming gitattributes are defused, to achieve this.) If transforming gitattributes are used, they can cause trouble, because the working tree files can differ from the git revision history (and therefore from the source packages). dgit warns if it finds a .gitattributes file (in a package being fetched or imported), unless the transforming gitattributes have been defused. dgit clone and dgit setup-new-tree disable transforming gitattributes by default, by creating a suitable .git/info/attributes. See .B dgit setup-new-tree and .B dgit setup-gitattributes in dgit(1). Note that dgit does not disable gitattributes unless they would actually interfere with your work on dgit branches. In particular, gitattributes which affect .B git archive are not disabled, so .origs you generate by hand can be wrong. You should consider using .B git-deborig (1) which gets this right, suppressing the attributes. .SH PACKAGE SOURCE FORMATS If you are not the maintainer, you do not need to worry about the source format of the package. You can just make changes as you like in git. If the package is a `3.0 (quilt)' package, the patch stack will usually not be represented in the git history. .SH FILE EXECUTABILITY Debian source package formats do not always faithfully reproduce changes to executability. But dgit insists that the result of dgit clone is identical (as far as git can represent - see Limitations, above) to the result of dpkg-source -x. So files that are executable in your git tree must be executable in the result of dpkg-source -x (but often aren't). If a package has such troublesome files, they have to be non-executable in dgit-compatible git branches. .SH FORMAT 3.0 (QUILT) For a format `3.0 (quilt)' source package, dgit may have to make a commit on your current branch to contain metadata used by quilt and dpkg-source. This is because `3.0 (quilt)' source format represents the patch stack as files in debian/patches/ actually inside the source tree. This means that, taking the whole tree (as seen by git or ls) (i) dpkg-source cannot represent certain trees, and (ii) packing up a tree in `3.0 (quilt)' and then unpacking it does not always yield the same tree. dgit will automatically work around this for you when building and pushing. The only thing you need to know is that dgit build, sbuild, etc., may make new commits on your HEAD. If you're not a quilt user this commit won't contain any changes to files you care about. Simply committing to source files (whether in debian/ or not, but not to patches) will result in a branch that dgit quilt-fixup can linearise. Other kinds of changes, including editing patches or merging, cannot be handled this way. You can explicitly request that dgit do just this fixup, by running dgit quilt-fixup. If you are a quilt user you need to know that dgit's git trees are `patches applied packaging branches' and do not contain the .pc directory (which is used by quilt to record which patches are applied). If you want to manipulate the patch stack you probably want to be looking at tools like git-debrebase, gbp pq, or git-dpm. .SS quilt fixup error messages When dgit's quilt fixup fails, it prints messages like this: .EX dgit: base trees orig=5531f03d8456b702eab6 o+d/p=135338e9cc253cc85f84 dgit: quilt differences: src: == orig ## gitignores: == orig ## dgit: quilt differences: HEAD ## o+d/p HEAD ## o+d/p starting quiltify (multiple patches, linear mode) dgit: error: quilt fixup cannot be linear. Stopped at: dgit: 696c9bd5..84ae8f96: changed debian/patches/test-gitignore .EE .TP .B orig is an import of the .orig tarballs dgit found, with the debian/ directory from your HEAD substituted. This is a git tree object, not a commit: you can pass its hash to git-diff but not git-log. .TP .B o+d/p is another tree object, which is the same as orig but with the patches from debian/patches applied. .TP .B HEAD is of course your own git HEAD. .TP .B quilt differences shows whether each of the these trees differs from the others (i) in upstream files excluding .gitignore files; (ii) in upstream .gitignore files. .B == indicates equality; .B ## indicates inequality. .LP dgit quilt-fixup --quilt=linear walks commits backwards from your HEAD trying to construct a linear set of additional patches, starting at the end. It hopes to eventually find an ancestor whose tree is identical to o+d/p in all upstream files. In the error message, 696c9bd5..84ae8f96 is the first commit child-parent edge which cannot sensibly be either ignored, or turned into a patch in debian/patches. In this example, this is because it itself changes files in debian/patches, indicating that something unusual is going on and that continuing is not safe. But you might also see other kinds of troublesome commit or edge. Your appropriate response depends on the cause and the context. If you have been freely merging your git branch and do not need need a pretty linear patch queue, you can use .BR --quilt=single or .BR --quilt=smash . (Don't use the .B single-debian-patch dpkg source format option; it has strange properties.) If you want a pretty linear series, and this message is unexpected, it can mean that you have unwittingly committed changes that are not representable by dpkg-source (such as some mode changes). Or maybe you just forgot a necessary .B --quilt= option. Finally, this problem can occur if you have provided Debian git tooling such as git-debrebase, git-dpm or git-buildpackage with upstream git commit(s) or tag(s) which are not 100% identical to your orig tarball(s). .SH SPLIT VIEW AND SPLITTING QUILT MODES When working with git branches intended for use with the `3.0 (quilt)' source format dgit can automatically convert a suitable maintainer-provided git branch (in one of a variety of formats) into a dgit branch. When a splitting quilt mode is selected dgit build commands and dgit push-* will, on each invocation, convert the user's HEAD into the dgit view, so that it can be built and/or uploaded. Split view mode can also be enabled explicitly with the --split-view command line option and the .split-view access configuration key. When split view is in operation, regardless of the quilt mode, any dgit-generated pseudomerges and any quilt fixup commits will appear only in the dgit view. dgit push-* will push the dgit view to the dgit git server. The dgit view is always a descendant of the maintainer view. dgit push-* will also make a maintainer view tag according to DEP-14 and push that to the dgit git server. Splitting quilt modes must be enabled explicitly (by the use of the applicable command line options, subcommands, or configuration). This is because it is not possible to reliably tell (for example) whether a git tree for a dpkg-source `3.0 (quilt)' package is a patches-applied or patches-unapplied tree. Split view conversions are cached in the ref dgit-intern/quilt-cache. This should not be manipulated directly. .SH FILES IN THE ORIG TARBALL BUT NOT IN GIT - AUTOTOOLS ETC. This section is mainly of interest to maintainers who want to use dgit with their existing git history for the Debian package. Some developers like to have an extra-clean git tree which lacks files which are normally found in source tarballs and therefore in Debian source packages. For example, it is conventional to ship ./configure in the source tarball, but some people prefer not to have it present in the git view of their project. dgit requires that the source package unpacks to exactly the same files as are in the git commit on which dgit push-* operates. So if you just try to dgit push-* directly from one of these extra-clean git branches, it will fail. As the maintainer you therefore have the following options: .TP \(bu Delete the files from your git branches, and your Debian source packages, and carry the deletion as a delta from upstream. (With `3.0 (quilt)' this means representing the deletions as patches. You may need to pass --include-removal to dpkg-source --commit, or pass corresponding options to other tools.) This can make the Debian source package less useful for people without Debian build infrastructure. .TP \(bu Persuade upstream that the source code in their git history and the source they ship as tarballs should be identical. Of course simply removing the files from the tarball may make the tarball hard for people to use. .IP One answer is to commit the (maybe autogenerated) files, perhaps with some simple automation to deal with conflicts and spurious changes. This has the advantage that someone who clones the git repository finds the program just as easy to build as someone who uses the tarball. .LP Of course it may also be that the differences are due to build system bugs, which cause unintended files to end up in the source package. dgit will notice this and complain. You may have to fix these bugs before you can unify your existing git history with dgit's. .LP .SH FILES IN THE SOURCE PACKAGE BUT NOT IN GIT - DOCS, BINARIES ETC. Some upstream tarballs contain build artifacts which upstream expects some users not to want to rebuild (or indeed to find hard to rebuild), but which in Debian we always rebuild. .LP Examples sometimes include crossbuild firmware binaries and documentation. To avoid problems when building updated source packages (in particular, to avoid trying to represent as changes in the source package uninteresting or perhaps unrepresentable changes to such files) many maintainers arrange for the package clean target to delete these files. .LP dpkg-source does not (with any of the commonly used source formats) represent deletion of binaries (outside debian/) present in upstream. Thus deleting such files in a dpkg-source working tree does not actually result in them being deleted from the source package. Thus deleting the files in rules clean sweeps this problem under the rug. .LP However, git does always properly record file deletion. Since dgit's principle is that the dgit git tree is the same of dpkg-source -x, that means that a dgit-compatible git tree always contains these files. .LP For the non-maintainer, this can be observed in the following suboptimal occurrences: .TP \(bu The package clean target often deletes these files, making the git tree dirty trying to build the source package, etc. This can be fixed by using .BR "dgit -wg" " aka " "--clean=git" , so that the package clean target is never run. .TP \(bu The package build modifies these files, so that builds make the git tree dirty. This can be worked around by using `git reset --hard' after each build (or at least before each commit or push). .LP From the maintainer's point of view, the main consequence is that to make a dgit-compatible git branch it is necessary to commit these files to git. The maintainer has a few additional options for mitigation: for example, it may be possible for the rules file to arrange to do the build in a temporary area, which avoids updating the troublesome files; they can then be left in the git tree without seeing trouble. .SH PROBLEMS WITH PACKAGE CLEAN TARGETS ETC. A related problem is other unexpected behaviour by a package's .B clean target. If a package's rules modify files which are distributed in the package, or simply forget to remove certain files, dgit will complain that the tree is dirty. .LP Again, the solution is to use .BR "dgit -wg" " aka " "--clean=git" , which instructs dgit to use git clean instead of the package's build target, along with perhaps .B git reset --hard before each build. .LP This is 100% reliable, but has the downside that if you forget to git add or to commit, and then use .BR "dgit -wg" " or " "git reset --hard" , your changes may be lost. work/git-debpush0000755000000000000000000003530614761250142011100 0ustar #!/bin/bash # git-debpush -- create & push a git tag with metadata for an ftp-master upload # # Copyright (C) 2019 Sean Whitton # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e$DGIT_TEST_DEBPUSH_DEBUG set -o pipefail # DESIGN PRINCIPLES # # - do not invoke dgit, do anything involving any tarballs, no network # access except `git push` right at the end # # - do not look at the working tree, like `git push` `git tag` # # - we are always in split brain mode, because that fits this workflow, # and avoids pushes failing just because dgit in the intermediary # service wants to append commits # # - if there is no previous tag created by this script, require a quilt # mode; if there is a previous tag, and no quilt mode provided, assume # same quilt mode as in previous tag created by this script # **** Helper functions and variables **** us="$(basename $0)" git_playtree_setup=git-playtree-setup ###substituted### git_playtree_setup=${DEBPUSH_GIT_PLAYTREE_SETUP-$git_playtree_setup} cleanup() { if [ -d "$temp" ]; then rm -rf "$temp" fi } fail () { echo >&2 "$us: $*"; exit 127; } badusage () { fail "bad usage: $*"; } get_file_from_ref () { local path=$1 # redirect to /dev/null instead of using `grep -Eq` to avoid grep # SIGPIPEing git-ls-tree if git ls-tree --name-only -r "$branch" \ | grep -E "^$path$" >/dev/null; then git cat-file blob $branch:$path fi } failed_check=false fail_check () { local check=$1; shift local check_is_forced=false case ",$force," in *",$check,"*) check_is_forced=true ;; esac if $force_all || $check_is_forced; then echo >&2 "$us: warning: $* ('$check' check)" else echo >&2 "$us: $* ('$check' check)" failed_check=true fi } fail_check_upstream_nonidentical () { fail_check upstream-nonidentical \ "the upstream source in tag $upstream_tag is not identical to the upstream source in $branch" } find_last_tag () { local prefix=$1 set +o pipefail # perl will SIGPIPE git-log(1) here git log --pretty=format:'%D' --decorate=full "$branch" \ | perl -wne 'use Dpkg::Version; @pieces = split /, /, $_; @debian_tag_vs = sort { version_compare($b, $a) } map { m|tag: refs/tags/'"$prefix"'(.+)| ? $1 : () } @pieces; if (@debian_tag_vs) { print "'"$prefix"'$debian_tag_vs[0]\n"; exit }' set -o pipefail } check_treesame () { local first=$1 local second=$2 shift 2 set +e git diff --quiet --exit-code "$first".."$second" -- . "$@" git_diff_rc=$? set -e # show the user what the difference was if [ $git_diff_rc = 1 ]; then git diff --compact-summary "$first".."$second" -- . "$@" fi if [ $git_diff_rc -le 1 ]; then return $git_diff_rc else fail "'git diff' exited with unexpected code $git_diff_rc" fi } check_patches_apply () { local should_match_branch="$1" local playground="$(git rev-parse --git-dir)/gdp" local playtree="$playground/apply-patches" local git_apply_rc=0 rm -rf "$playground" mkdir -p "$playtree" local pwd="$(pwd)" cd "$playtree" "$git_playtree_setup" . # checking out the upstream source and then d/patches on top # ensures this check will work for a variety of quilt modes git checkout -b upstream "$upstream_committish" git checkout "$branch_commit" -- debian if [ -s "debian/patches/series" ]; then while read patch; do shopt -s extglob; patch="${patch%%?( )#*}"; shopt -u extglob if [ -z "$patch" ]; then continue; fi set +e git apply --index "debian/patches/$patch" git_apply_rc=$? set -e if ! [ $git_apply_rc = 0 ]; then fail_check patches-applicable \ "'git apply' failed to apply patch $patch" break fi done /dev/null; then fail_check detached \ "HEAD is detached; you probably don't want to debpush it" fi # **** Gather git information **** remoteconfigs=() to_push=() # Maybe $branch is a symbolic ref. If so, resolve it branchref="$(git symbolic-ref -q $branch || test $? = 1)" if [ "x$branchref" != "x" ]; then branch="$branchref" fi # If $branch is the name of a branch but it does not start with # 'refs/heads/', prepend 'refs/heads/', so that we can know later # whether we are tagging a branch or some other kind of committish case "$branch" in refs/heads/*) ;; *) branchref="$(git for-each-ref --format='%(objectname)' \ '[r]efs/heads/$branch')" if [ "x$branchref" != "x" ]; then branch="refs/heads/$branch" fi ;; esac # If our tag will point at a branch, push that branch, and add its # pushRemote and remote to the things we'll check if the user didn't # supply a remote case "$branch" in refs/heads/*) b=${branch#refs/heads/} to_push+=("$b") remoteconfigs+=( branch.$b.pushRemote branch.$b.remote ) ;; esac # resolve $branch to a commit branch_commit="$(git rev-parse --verify ${branch}^{commit})" # also check, if the branch does not have its own pushRemote or # remote, whether there's a default push remote configured remoteconfigs+=(remote.pushDefault) if $pushing && [ "x$remote" = "x" ]; then for c in "${remoteconfigs[@]}"; do remote=$(git config "$c" || test $? = 1) if [ "x$remote" != "x" ]; then break; fi done if [ "x$remote" = "x" ]; then fail "pushing, but could not determine remote, so need --remote=" fi fi # **** Gather source package information **** temp=$(mktemp -d) trap cleanup EXIT mkdir "$temp/debian" git cat-file blob "$branch":debian/changelog >"$temp/debian/changelog" version=$(cd $temp; dpkg-parsechangelog -SVersion) source=$(cd $temp; dpkg-parsechangelog -SSource) target=$(cd $temp; dpkg-parsechangelog -SDistribution) rm -rf "$temp" trap - EXIT format="$(get_file_from_ref debian/source/format)" case "$format" in '3.0 (quilt)') upstream=true ;; '3.0 (native)') upstream=false ;; '1.0'|'') if get_file_from_ref debian/source/options | grep -q '^-sn *$'; then upstream=false elif get_file_from_ref debian/source/options | grep -q '^-sk *$'; then upstream=true else fail 'please see "SOURCE FORMAT 1.0" in git-debpush(1)' fi ;; *) fail "unsupported debian/source/format $format" ;; esac # **** Gather git history information **** last_debian_tag=$(find_last_tag "debian/") last_archive_tag=$(find_last_tag "archive/debian/") upstream_info="" if $upstream; then if [ "x$upstream_tag" = x ]; then upstream_tag=$( set +e git deborig --just-print --version="$version" \ | head -n1 ps="${PIPESTATUS[*]}" set -e case "$ps" in "0 0"|"141 0") ;; # ok or SIGPIPE *" 0") echo >&2 \ "$us: git-deborig failed; maybe try $us --upstream=TAG" exit 0 ;; *) exit 127; # presumably head will have complained esac ) if [ "x$upstream_tag" = x ]; then exit 127; fi fi upstream_committish=$(git rev-parse "refs/tags/${upstream_tag}"^{}) upstream_info=" upstream-tag=$upstream_tag upstream=$upstream_committish" to_push+=("$upstream_tag") fi # **** Useful sanity checks **** # ---- UNRELEASED suite if [ "$target" = "UNRELEASED" ]; then fail_check unreleased "UNRELEASED changelog" fi # ---- Pushing dgit view to maintainer view if ! [ "x$last_debian_tag" = "x" ] && ! [ "x$last_archive_tag" = "x" ]; then last_debian_tag_c=$(git rev-parse "$last_debian_tag"^{}) last_archive_tag_c=$(git rev-parse "$last_archive_tag"^{}) if ! [ "$last_debian_tag_c" = "$last_archive_tag_c" ] \ && git merge-base --is-ancestor \ "$last_debian_tag" "$last_archive_tag"; then fail_check dgit-view \ "looks like you might be trying to push the dgit view to the maintainer branch?" fi fi # ---- Targeting different suite if ! [ "x$last_debian_tag" = "x" ]; then temp=$(mktemp -d) trap cleanup EXIT mkdir "$temp/debian" git cat-file blob "$last_debian_tag":debian/changelog >"$temp/debian/changelog" prev_target=$(cd $temp; dpkg-parsechangelog -SDistribution) rm -rf "$temp" trap - EXIT if ! [ "$prev_target" = "$target" ] && ! [ "$target" = "UNRELEASED" ]; then fail_check suite \ "last upload targeted $prev_target, now targeting $target; might be a mistake?" fi fi # ---- Upstream tag is not ancestor of $branch if ! [ "x$upstream_tag" = "x" ] \ && ! git merge-base --is-ancestor "$upstream_tag" "$branch" \ && ! [ "$quilt_mode" = "baredebian" ]; then fail_check upstream-nonancestor \ "upstream tag $upstream_tag is not an ancestor of $branch; probably a mistake" fi # ---- Quilt mode-specific checks case "$quilt_mode" in gbp) check_treesame "$upstream_tag" "$branch" ':!debian' ':!**.gitignore' \ || fail_check_upstream_nonidentical check_patches_apply false ;; unapplied) check_treesame "$upstream_tag" "$branch" ':!debian' \ || fail_check_upstream_nonidentical check_patches_apply false ;; baredebian) check_patches_apply false ;; dpm|nofix) check_patches_apply true ;; esac # ---- git-debrebase branch format checks # only check branches, since you can't run `git debrebase conclude` on # non-branches case "$branch" in refs/heads/*) # see "STITCHING, PSEUDO-MERGES, FFQ RECORD" in git-debrebase(5) ffq_prev_ref="refs/ffq-prev/${branch#refs/}" if git show-ref --quiet --verify "$ffq_prev_ref"; then fail_check unstitched \ "this looks like an unstitched git-debrebase branch, which should not be pushed" fi esac # ---- Summary if $failed_check; then # We don't mention the --force=check options here as those are # mainly for use by scripts, or when you already know what check # is going to fail before you invoke git-debpush. Keep the # script's terminal output as simple as possible. No "see the # manpage"! fail "some check(s) failed; you can pass --force to ignore them" fi # **** Create the git tag **** # convert according to DEP-14 rules git_version=$(echo $version | tr ':~' '%_' | sed 's/\.(?=\.|$|lock$)/.#/g') debian_tag="$distro/$git_version" to_push+=("$debian_tag") # If the user didn't supply a quilt mode, look for it in a previous # tag made by this script if [ "x$quilt_mode" = "x" ] && [ "$format" = "3.0 (quilt)" ]; then set +o pipefail # perl will SIGPIPE git-cat-file(1) here if [ "x$last_debian_tag" != "x" ]; then quilt_mode=$(git cat-file -p $(git rev-parse "$last_debian_tag") \ | perl -wne \ 'm/^\[dgit.*--quilt=([a-z+]+).*\]$/; if ($1) { print "$1\n"; exit }') fi set -o pipefail fi quilt_mode_text="" if [ "$format" = "3.0 (quilt)" ]; then if [ "x$quilt_mode" = "x" ]; then echo >&2 "$us: could not determine the git branch layout" echo >&2 "$us: please supply a --quilt= argument" exit 1 else quilt_mode_text=" --quilt=$quilt_mode" fi fi tagmessage="$source release $version for $target [dgit distro=$distro split$quilt_mode_text] [dgit please-upload source=$source version=$version$upstream_info] " git tag "${git_tag_opts[@]}" -s -m "$tagmessage" "$debian_tag" "$branch" # **** Do a git push **** if $pushing; then git push "$remote" "${to_push[@]}" fi work/git-debpush.1.pod0000644000000000000000000001727714761250142012024 0ustar =head1 NAME git-debpush - create & push a git tag with metadata for an ftp-master upload =head1 SYNOPSIS B [I

] git-debrebase [] convert-from-* ... ... See git-debrebase(1), git-debrebase(5), dgit-maint-debrebase(7) (in dgit). END our ($opt_force, $opt_noop_ok, $opt_merges, @opt_anchors); our ($opt_defaultcmd_interactive); our $us = qw(git-debrebase); our $wrecknoteprefix = 'refs/debrebase/wreckage'; our $merge_cache_ref = 'refs/debrebase/merge-resolutions'; $|=1; sub badusage ($) { my ($m) = @_; print STDERR f_ "%s: bad usage: %s\n", $us, $m; finish 8; } sub getoptions_main { my $m = shift; local $SIG{__WARN__}; # GetOptions calls `warn' to print messages GetOptions @_ or badusage $m; } sub getoptions { my $sc = shift; getoptions_main +(f_ "bad options follow \`git-debrebase %s'", $sc), @_; } sub cfg ($;$) { my ($k, $optional) = @_; local $/ = "\0"; my @cmd = qw(git config -z); push @cmd, qw(--get-all) if wantarray; push @cmd, $k; my $out = cmdoutput_errok @cmd; if (!defined $out) { fail f_ "missing required git config %s", $k unless $optional; return (); } my @l = split /\0/, $out; return wantarray ? @l : $l[0]; } memoize('cfg'); sub dd ($) { my ($v) = @_; my $dd = new Data::Dumper [ $v ]; Terse $dd 1; Indent $dd 0; Useqq $dd 1; return Dump $dd; } sub get_commit ($) { my ($objid) = @_; my $data = (git_cat_file $objid, 'commit'); $data =~ m/(?<=\n)\n/ or confess "$objid ($data) ?"; return ($`,$'); } sub D_UPS () { 0x02; } # upstream files sub D_PAT_ADD () { 0x04; } # debian/patches/ extra patches at end sub D_PAT_OTH () { 0x08; } # debian/patches other changes sub D_DEB_CLOG () { 0x10; } # debian/changelog sub D_DEB_OTH () { 0x20; } # debian/ (not patches/ or changelog) sub DS_DEB () { D_DEB_CLOG | D_DEB_OTH; } # debian/ (not patches/) our $playprefix = 'debrebase'; our $rd; our $workarea; our @dgit = qw(dgit); sub in_workarea ($) { my ($sub) = @_; changedir $workarea; my $r = eval { $sub->(); }; { local $@; changedir $maindir; } die $@ if $@; } sub fresh_workarea (;$) { my ($subdir) = @_; $subdir //= 'work'; $workarea = fresh_playground "$playprefix/$subdir"; in_workarea sub { playtree_setup }; } sub run_ref_updates_now ($$) { my ($mrest, $updates) = @_; # @$updates is a list of lines for git-update-ref, without \ns my @upd_cmd = (git_update_ref_cmd "debrebase: $mrest", qw(--stdin)); debugcmd '>|', @upd_cmd; open U, "|-", @upd_cmd or confess "$!"; foreach (@$updates) { printdebug ">= ", $_, "\n"; print U $_, "\n" or confess "$!"; } printdebug ">\$\n"; close U or failedcmd @upd_cmd; } our $snags_forced = 0; our $snags_tripped = 0; our $snags_summarised = 0; our @deferred_updates; our @deferred_update_messages; sub merge_wreckage_cleaning ($) { my ($updates) = @_; git_for_each_ref("$wrecknoteprefix/*", sub { my ($objid,$objtype,$fullrefname,$reftail) = @_; push @$updates, "delete $fullrefname"; }); } sub all_snags_summarised () { $snags_forced + $snags_tripped == $snags_summarised; } sub run_deferred_updates ($) { my ($mrest) = @_; my $m = 'dangerous internal error'; confess $m.' - '.__ $m unless all_snags_summarised(); merge_wreckage_cleaning \@deferred_updates; run_ref_updates_now $mrest, \@deferred_updates; print $_, "\n" foreach @deferred_update_messages; @deferred_updates = (); @deferred_update_messages = (); } sub get_tree ($;$$) { # tree object name => ([ $name, $info ], ...) # where $name is the sort key, ie has / at end for subtrees # $info is the LHS from git-ls-tree ( ) # without $precheck, will crash if $x does not exist, so don't do that; # instead pass '' to get (). my ($x, $precheck, $recurse) = @_; return () if !length $x; if ($precheck) { my ($type, $dummy) = git_cat_file $x, [qw(tree missing)]; return () if $type eq 'missing'; } $recurse = !!$recurse; confess "get_tree needs object not $x ?" unless $x =~ m{^[0-9a-f]+\:}; our (@get_tree_memo, %get_tree_memo); my $memo = $get_tree_memo{$recurse,$x}; return @$memo if $memo; local $Debian::Dgit::debugcmd_when_debuglevel = 3; my @l; my @cmd = (qw(git ls-tree -z --full-tree)); push @cmd, qw(-r) if $recurse; push @cmd, qw(--), $x; my $o = cmdoutput @cmd; $o =~ s/\0$//s; my $last = ''; foreach my $l (split /\0/, $o) { my ($i, $n) = split /\t/, $l, 2; $n .= '/' if $i =~ m/^\d+ tree /; push @l, [ $n, $i ]; confess "$x need $last < $n ?" unless $last lt $n; } $get_tree_memo{$recurse,$x} = \@l; push @get_tree_memo, $x; if (@get_tree_memo > 10) { delete $get_tree_memo{ shift @get_tree_memo }; } return @l; } sub trees_diff_walk ($$$;$) { # trees_diff_walk [{..opts...},] $x, $y, sub {... } # calls sub->($name, $ix, $iy) for each difference # $x and $y are as for get_tree # where $name, $ix, $iy are $name and $info from get_tree # opts are all call even for names same in both # recurse call even for names same in both my $opts = shift @_ if @_>=4; my ($x,$y,$call) = @_; my $all = $opts->{all}; return if !$all and $x eq $y; my @x = get_tree $x, 0, $opts->{recurse}; my @y = get_tree $y, 0, $opts->{recurse}; printdebug "trees_diff_walk(..$x,$y..) ".Dumper(\@x,\@y) if $debuglevel >= 3; while (@x || @y) { my $cmp = !@x <=> !@y # eg @y empty? $cmp=-1, use x || $x[0][0] cmp $y[0][0]; # eg, x lt y ? $cmp=-1, use x my ($n, $ix, $iy); # all same? $cmp=0, use both $ix=$iy=''; printdebug "trees_diff_walk $cmp : @{ $x[0]//[] } | @{ $y[0]//[] }\n" if $debuglevel >= 3; ($n, $ix) = @{ shift @x } if $cmp <= 0; ($n, $iy) = @{ shift @y } if $cmp >= 0; next if !$all and $ix eq $iy; printdebug sprintf "trees_diff_walk(%d,'%s','%s') call('%s','%s','%s')\n", !!$all,$x,$y, $n,$ix,$iy if $debuglevel >= 2; $call->($n, $ix, $iy); } } sub get_differs ($$) { my ($x,$y) = @_; # This does a similar job to quiltify_trees_differ, in dgit, a bit. # But we don't care about modes, or dpkg-source-unrepresentable # changes, and we don't need the plethora of different modes. # Conversely we need to distinguish different kinds of changes to # debian/ and debian/patches/. # Also, here we have, and want to use, trees_diff_walk, because # we may be calling this an awful lot and we want it to be fast. my $differs = 0; my @debian_info; no warnings qw(exiting); my $plain = sub { $_[0] =~ m{^(100|0*)644 blob }s; }; trees_diff_walk "$x:", "$y:", sub { my ($n,$ix,$iy) = @_; # analyse difference at the toplevel if ($n ne 'debian/') { $differs |= D_UPS; next; } if ($n eq 'debian') { # one side has a non-tree for ./debian ! $differs |= D_DEB_OTH; next; } my $xd = $ix && "$x:debian"; my $yd = $iy && "$y:debian"; trees_diff_walk $xd, $yd, sub { my ($n,$ix,$iy) = @_; # analyse difference in debian/ if ($n eq 'changelog' && (!$ix || $plain->($ix)) && $plain->($iy) ) { $differs |= D_DEB_CLOG; next; } if ($n ne 'patches/') { $differs |= D_DEB_OTH; next; } my $xp = $ix && "$xd/patches"; my $yp = $iy && "$yd/patches"; trees_diff_walk { recurse=>1 }, $xp, $yp, sub { my ($n,$ix,$iy) = @_; # analyse difference in debian/patches my $ok; if ($n =~ m{/$}s) { # we are recursing; directories may appear and disappear $ok = 1; } elsif ($n !~ m/\.series$/s && !$ix && $plain->($iy)) { $ok = 1; } elsif ($n eq 'series' && $plain->($ix) && $plain->($iy)) { my $x_s = (git_cat_file "$xp/series", 'blob'); my $y_s = (git_cat_file "$yp/series", 'blob'); chomp $x_s; $x_s .= "\n"; $ok = $x_s eq substr($y_s, 0, length $x_s); } else { # nope } $differs |= $ok ? D_PAT_ADD : D_PAT_OTH; }; }; }; printdebug sprintf "get_differs %s %s = %#x\n", $x, $y, $differs; return $differs; } sub commit_pr_info ($) { my ($r) = @_; return Data::Dumper->dump([$r], [qw(commit)]); } sub calculate_committer_authline () { my $c = cmdoutput @git, qw(commit-tree --no-gpg-sign -m), 'DUMMY COMMIT (git-debrebase)', "HEAD:"; my ($h,$m) = get_commit $c; $h =~ m/^committer .*$/m or confess "($h) ?"; return $&; } our @snag_force_opts; sub snag ($$;@) { my ($tag,$msg) = @_; # ignores extra args, for benefit of keycommits if (grep { $_ eq $tag } @snag_force_opts) { $snags_forced++; print STDERR f_ "%s: snag ignored (-f%s): %s\n", $us, $tag, $msg; } else { $snags_tripped++; print STDERR f_ "%s: snag detected (-f%s): %s\n", $us, $tag, $msg; } } # Important: all mainline code must call snags_maybe_bail after # any point where snag might be called, but before making changes # (eg before any call to run_deferred_updates). snags_maybe_bail # may be called more than once if necessary (but this is not ideal # because then the messages about number of snags may be confusing). sub snags_maybe_bail () { return if all_snags_summarised(); if ($snags_forced) { print STDERR f_ "%s: snags: %d overriden by individual -f options\n", $us, $snags_forced; } if ($snags_tripped) { if ($opt_force) { print STDERR f_ "%s: snags: %d overriden by global --force\n", $us, $snags_tripped; } else { fail f_ "%s: snags: %d blocker(s) (you could -f, or --force)", $us, $snags_tripped; } } $snags_summarised = $snags_forced + $snags_tripped; } sub snags_maybe_bail_early () { # useful to bail out early without doing a lot of work; # not a substitute for snags_maybe_bail. snags_maybe_bail() if $snags_tripped && !$opt_force; } sub any_snags () { return $snags_forced || $snags_tripped; } sub ffq_prev_branchinfo () { my $current = git_get_symref(); return gdr_ffq_prev_branchinfo($current); } sub record_gdrlast ($$;$) { my ($gdrlast, $newvalue, $oldvalue) = @_; $oldvalue ||= $git_null_obj; push @deferred_updates, "update $gdrlast $newvalue $oldvalue"; } sub fail_unprocessable ($) { my ($msg) = @_; changedir $maindir; my ($ffqs, $ffqm, $symref, $ffq_prev, $gdrlast) = ffq_prev_branchinfo(); my $mangled = __ <../gbp-pq-err 2>&1', @gbp_cmd; if ($r) { { local ($!,$?); copy('../gbp-pq-err', \*STDERR); } failedcmd @gbp_cmd; } return 0 unless stat_exists 'debian/patches'; runcmd @git, qw(add -f debian/patches); return 1; } # MERGE-TODO allow merge resolution separately from laundering, before git merge # later/rework? # use git-format-patch? # our own patch identification algorithm? # this is an alternative strategy sub merge_failed ($$;@) { my ($wrecknotes, $emsg, @xmsgs) = @_; my @m; push @m, "Merge resolution failed: $emsg"; push @m, @xmsgs; changedir $maindir; my @updates; merge_wreckage_cleaning \@updates; run_ref_updates_now "merge failed", \@updates; @updates = (); keys %$wrecknotes; while (my ($k,$v) = each %$wrecknotes) { push @updates, "create $wrecknoteprefix/$k $v"; } run_ref_updates_now "merge failed", \@updates; push @m, "Wreckage left in $wrecknoteprefix/*."; push @m, "See git-debrebase(1) section FAILED MERGES for suggestions."; # use finish rather than fail, in case we are within an eval # (that can happen inside walk!) print STDERR "\n"; print STDERR "$us: $_\n" foreach @m; finish 15; } sub mwrecknote ($$$) { my ($wrecknotes, $reftail, $commitish) = @_; confess unless defined $commitish; printdebug "mwrecknote $reftail $commitish\n"; $wrecknotes->{$reftail} = $commitish; } sub merge_attempt_cmd { my $wrecknotes = shift @_; debugcmd '+', @_; $!=0; $?=-1; if (system @_) { merge_failed $wrecknotes, failedcmd_waitstatus(), "failed command: @_"; } } sub merge_series_patchqueue_convert ($$$); sub merge_series ($$$;@) { my ($newbase, $wrecknotes, $base_q, @input_qs) = @_; # $base_q{SeriesBase} $input_qs[]{SeriesBase} # $base_q{SeriesTip} $input_qs[]{SeriesTip} # ^ specifies several patch series (currently we only support exactly 2) # return value is a commit which is the result of # merging the two versions of the same topic branch # $input_q[0] and $input_q[1] # with respect to the old version # $base_q # all onto $newbase. # Creates, in *_q, a key MR for its private use printdebug "merge_series newbase=$newbase\n"; $input_qs[$_]{MR}{S} = $_ foreach (0..$#input_qs); $base_q->{MR}{S} = 'base'; my %prereq; # $prereq{}{} = 1 or absent # $prereq{}{} exists or not (even later) my $merged_pq; my $mwrecknote = sub { &mwrecknote($wrecknotes, @_); }; my $attempt_cmd = sub { &merge_attempt_cmd($wrecknotes, @_); }; local $workarea; fresh_workarea "merge"; my $seriesfile = "debian/patches/series"; in_workarea sub { playtree_setup(); foreach my $q ($base_q, reverse @input_qs) { my $s = $q->{MR}{S}; my $any = gbp_pq_export "p-$s", $q->{SeriesBase}, $q->{SeriesTip}; my @earlier; if ($any) { open S, $seriesfile or confess "$seriesfile $!"; while (my $patch = ) { chomp $patch or confess "$!"; $prereq{$patch} //= {}; foreach my $earlier (@earlier) { $prereq{$patch}{$earlier}{$s}++ and confess; } push @earlier, $patch; stat "debian/patches/$patch" or confess "$patch ?"; } S->error and confess "$seriesfile $!"; close S; } read_tree_upstream $newbase, 1; my $pec = make_commit [ grep { defined } $base_q->{MR}{PEC} ], [ "Convert $s to patch queue for merging", "[git-debrebase merge-innards patch-queue import:". " $q->{SeriesTip}]" ]; printdebug "merge_series pec $pec "; runcmd @git, qw(rm -q --ignore-unmatch --cached), $seriesfile; $pec = make_commit [ $pec ], [ "Drop series file from $s to avoid merge trouble", "[git-debrebase merge-innards patch-queue prep:". " $q->{SeriesTip}]" ]; read_tree_debian $newbase; if (@earlier) { read_tree_subdir 'debian/patches', "$pec:debian/patches"; } else { rm_subdir_cached 'debian/patches'; } $pec = make_commit [ $pec ], [ "Update debian/ (excluding patches) to final to avoid re-merging", "debian/ was already merged and we need to just take that.", "[git-debrebase merge-innards patch-queue packaging:". " $q->{SeriesTip}]" ]; printdebug "pec' $pec\n"; runcmd @git, qw(reset -q --hard), $pec; $q->{MR}{PEC} = $pec; $mwrecknote->("$q->{LeftRight}-patchqueue", $pec); } # now, because of reverse, we are on $input_q->{MR}{OQC} runcmd @git, qw(checkout -q -b merge); printdebug "merge_series merging...\n"; my @mergecmd = (@git, qw(merge --quiet --no-edit), "p-1"); $attempt_cmd->(@mergecmd); printdebug "merge_series merge ok, series...\n"; # We need to construct a new series file # Firstly, resolve prereq foreach my $f (sort keys %prereq) { printdebug "merge_series patch\t$f\t"; if (!stat_exists "debian/patches/$f") { print DEBUG " drop\n" if $debuglevel; # git merge deleted it; that's how we tell it's not wanted delete $prereq{$f}; next; } print DEBUG " keep\n" if $debuglevel; foreach my $g (sort keys %{ $prereq{$f} }) { my $gfp = $prereq{$f}{$g}; printdebug "merge_series prereq\t$f\t-> $g\t"; if (!!$gfp->{0} == !!$gfp->{1} ? $gfp->{0} : !$gfp->{base}) { print DEBUG "\tkeep\n" if $debuglevel; } else { print DEBUG "\tdrop\n" if $debuglevel; delete $prereq{$f}{$g}; } } } my $unsat = sub { my ($f) = @_; return scalar keys %{ $prereq{$f} }; }; my $nodate = time + 1; my %authordate; # $authordate{}; my $authordate = sub { my ($f) = @_; $authordate{$f} //= do { open PF, "<", "debian/patches/$f" or confess "$f $!"; while () { return $nodate if m/^$/; last if s{^Date: }{}; } chomp; return cmdoutput qw(date +%s -d), $_; }; }; open NS, '>', $seriesfile or confess "$!"; while (keys %prereq) { my $best; foreach my $try (sort keys %prereq) { if ($best) { next if ( $unsat->($try) <=> $unsat->($best) or $authordate->($try) <=> $authordate->($best) or $try cmp $best ) >= 0; } $best = $try; } printdebug "merge_series series next $best\n"; print NS "$best\n" or confess "$!"; delete $prereq{$best}; foreach my $gp (values %prereq) { delete $gp->{$best}; } } runcmd @git, qw(add), $seriesfile; runcmd @git, qw(commit --quiet -m), 'Merged patch queue form'; $merged_pq = git_rev_parse 'HEAD'; $mwrecknote->('merged-patchqueue', $merged_pq); }; return merge_series_patchqueue_convert $wrecknotes, $newbase, $merged_pq; } sub merge_series_patchqueue_convert ($$$) { my ($wrecknotes, $newbase, $merged_pq) = @_; my $result; in_workarea sub { playtree_setup(); printdebug "merge_series series gbp pq import\n"; runcmd @git, qw(checkout -q -b mergec), $merged_pq; merge_attempt_cmd($wrecknotes, qw(gbp pq import)); # MERGE-TODO consider git-format-patch etc. instead, # since gbp pq doesn't always round-trip :-/ # OK now we are on patch-queue/merge, and we need to rebase # onto the intended parent and drop the patches from each one printdebug "merge_series series ok, building...\n"; my $build = $newbase; my @lcmd = (@git, qw(rev-list --reverse mergec..patch-queue/mergec)); foreach my $c (grep /./, split /\n/, cmdoutput @lcmd) { my $commit = git_cat_file $c, 'commit'; printdebug "merge_series series ok, building $c\n"; read_tree_upstream $c, 0, $newbase; my $tree = cmdoutput @git, qw(write-tree); $commit =~ s{^parent (\S+)$}{parent $build}m or confess; $commit =~ s{^tree (\S+)$}{tree $tree}m or confess; open C, ">", "../mcommit" or confess "$!"; print C $commit or confess "$!"; close C or confess "$!"; $build = hash_commit '../mcommit'; } $result = $build; mwrecknote($wrecknotes, 'merged-result', $result); runcmd @git, qw(update-ref refs/heads/result), $result; runcmd @git, qw(checkout -q -b debug); runcmd @git, qw(commit --allow-empty -q -m M-INDEX); runcmd @git, qw(add .); runcmd @git, qw(commit --allow-empty -q -m M-WORKTREE); my $mdebug = git_rev_parse 'HEAD'; printdebug sprintf "merge_series done debug=%s\n", $mdebug; mwrecknote($wrecknotes, 'merged-debug', $mdebug); }; printdebug "merge_series returns $result\n"; return $result; } # classify returns an info hash like this # CommitId => $objid # Hdr => # commit headers, including 1 final newline # Msg => # commit message (so one newline is dropped) # Tree => $treeobjid # Type => (see below) # Parents = [ { # Ix => $index # ie 0, 1, 2, ... # CommitId # Differs => return value from get_differs # IsOrigin # IsDggitImport => 'orig' 'tarball' 'unpatched' 'package' (as from dgit) # } ...] # NewMsg => # commit message, but with any [dgit import ...] edited # # to say "[was: ...]" # # Types: # Packaging # Changelog # Upstream # AddPatches # Mixed # # Pseudomerge # has additional entres in classification result # Overwritten = [ subset of Parents ] # Contributor = $the_remaining_Parent # # DgitImportUnpatched # has additional entry in classification result # OrigParents = [ subset of Parents ] # # Anchor # has additional entry in classification result # OrigParents = [ subset of Parents ] # singleton list # # TreatAsAnchor # # BreakwaterStart # # Unknown # has additional entry in classification result # Why => "prose" sub parsecommit ($;$) { my ($objid, $p_ref) = @_; # => hash with CommitId Hdr Msg Tree Parents # Parents entries have only Ix CommitId # $p_ref, if provided, must be [] and is used as a base for Parents $p_ref //= []; confess if @$p_ref; my ($h,$m) = get_commit $objid; my ($t) = $h =~ m/^tree (\w+)$/m or confess $objid; my (@ph) = $h =~ m/^parent (\w+)$/mg; my $r = { CommitId => $objid, Hdr => $h, Msg => $m, Tree => $t, Parents => $p_ref, }; foreach my $ph (@ph) { push @$p_ref, { Ix => scalar @$p_ref, CommitId => $ph, }; } return $r; } sub classify ($) { my ($objid) = @_; my @p; my $r = parsecommit($objid, \@p); my $t = $r->{Tree}; foreach my $p (@p) { $p->{Differs} = (get_differs $p->{CommitId}, $t), } printdebug "classify $objid \$t=$t \@p", (map { sprintf " %s/%#x", $_->{CommitId}, $_->{Differs} } @p), "\n"; my $classify = sub { my ($type, @rest) = @_; $r = { %$r, Type => $type, @rest }; if ($debuglevel) { printdebug " = $type ".(dd $r)."\n"; } return $r; }; my $unknown = sub { my ($why) = @_; $r = { %$r, Type => qw(Unknown), Why => $why }; printdebug " ** Unknown\n"; return $r; }; if (grep { $_ eq $objid } @opt_anchors) { return $classify->('TreatAsAnchor'); } my @identical = grep { !$_->{Differs} } @p; my ($stype, $series) = git_cat_file "$t:debian/patches/series"; my $haspatches = $stype ne 'missing' && $series =~ m/^\s*[^#\n\t ]/m; if ($r->{Msg} =~ m{^\[git-debrebase anchor.*\]$}m) { # multi-orig upstreams are represented with an anchor merge # from a single upstream commit which combines the orig tarballs # Every anchor tagged this way must be a merge. # We are relying on the # [git-debrebase anchor: ...] # commit message annotation in "declare" anchor merges (which # do not have any upstream changes), to distinguish those # anchor merges from ordinary pseudomerges (which we might # just try to strip). # # However, the user is going to be doing git-rebase a lot. We # really don't want them to rewrite an anchor commit. # git-rebase trips up on merges, so that is a useful safety # catch. # # BreakwaterStart commits are also anchors in the terminology # of git-debrebase(5), but they are untagged (and always # manually generated). # # We cannot not tolerate any tagged linear commit (ie, # BreakwaterStart commits tagged `[anchor:') because such a # thing could result from an erroneous linearising raw git # rebase of a merge anchor. That would represent a corruption # of the branch. and we want to detect and reject the results # of such corruption before it makes it out anywhere. If we # reject it here then we avoid making the pseudomerge which # would be needed to push it. my $badanchor = sub { $unknown->(f_ "git-debrebase \`anchor' but %s", "@_"); }; @p == 2 or return $badanchor->(__ "has other than two parents"); $haspatches and return $badanchor->(__ "contains debian/patches"); # How to decide about l/r ordering of anchors ? git # --topo-order prefers to expand 2nd parent first. There's # already an easy rune to look for debian/ history anyway (git log # debian/) so debian breakwater branch should be 1st parent; that # way also there's also an easy rune to look for the upstream # patches (--topo-order). # Also this makes --first-parent be slightly more likely to # be useful - it makes it provide a linearised breakwater history. # Of course one can say somthing like # gitk -- ':/' ':!/debian' # to get _just_ the commits touching upstream files, and by # the TREESAME logic in git-rev-list this will leave the # breakwater into upstream at the first anchor. But that # doesn't report debian/ changes at all. # Other observations about gitk: by default, gitk seems to # produce output in a different order to git-rev-list. I # can't seem to find this documented anywhere. gitk # --date-order DTRT. But, gitk always seems to put the # parents from left to right, in order, so it's easy to see # which way round a pseudomerge is. $p[0]{IsOrigin} and $badanchor->(__ "is an origin commit"); $p[1]{Differs} & ~DS_DEB and $badanchor->(__ "upstream files differ from left parent"); $p[0]{Differs} & ~D_UPS and $badanchor->(__ "debian/ differs from right parent"); return $classify->(qw(Anchor), OrigParents => [ $p[1] ]); } if (@p == 1) { my $d = $r->{Parents}[0]{Differs}; if ($d == D_PAT_ADD) { return $classify->(qw(AddPatches)); } elsif ($d & (D_PAT_ADD|D_PAT_OTH)) { return $unknown->(__ "edits debian/patches"); } elsif ($d & DS_DEB and !($d & ~DS_DEB)) { my ($ty,$dummy) = git_cat_file "$p[0]{CommitId}:debian"; if ($ty eq 'tree') { if ($d == D_DEB_CLOG) { return $classify->(qw(Changelog)); } else { return $classify->(qw(Packaging)); } } elsif ($ty eq 'missing') { return $classify->(qw(BreakwaterStart)); } else { return $unknown->(__ "parent's debian is not a directory"); } } elsif ($d == D_UPS) { return $classify->(qw(Upstream)); } elsif ($d & DS_DEB and $d & D_UPS and !($d & ~(DS_DEB|D_UPS))) { return $classify->(qw(Mixed)); } elsif ($d == 0) { return $unknown->(__ "no changes"); } else { confess "internal error $objid ?"; } } if (!@p) { return $unknown->(__ "origin commit"); } if (@p == 2 && @identical == 1) { my @overwritten = grep { $_->{Differs} } @p; confess "internal error $objid ?" unless @overwritten==1; return $classify->(qw(Pseudomerge), Overwritten => [ $overwritten[0] ], Contributor => $identical[0]); } if (@p == 2 && @identical == 2) { my $get_t = sub { my ($ph,$pm) = get_commit $_[0]{CommitId}; $ph =~ m/^committer .* (\d+) [-+]\d+$/m or confess "$_->{CommitId} ?"; $1; }; my @bytime = @p; my $order = $get_t->($bytime[0]) <=> $get_t->($bytime[1]); if ($order > 0) { # newer first } elsif ($order < 0) { @bytime = reverse @bytime; } else { # same age, default to order made by -s ours # that is, commit was made by someone who preferred L } return $classify->(qw(Pseudomerge), SubType => qw(Ambiguous), Contributor => $bytime[0], Overwritten => [ $bytime[1] ]); } foreach my $p (@p) { my ($p_h, $p_m) = get_commit $p->{CommitId}; $p->{IsOrigin} = $p_h !~ m/^parent \w+$/m; ($p->{IsDgitImport},) = $p_m =~ m/^\[dgit import ([0-9a-z]+) .*\]$/m; } my @orig_ps = grep { ($_->{IsDgitImport}//'X') eq 'orig' } @p; my $m2 = $r->{Msg}; if (!(grep { !$_->{IsOrigin} } @p) and (@orig_ps >= @p - 1) and $m2 =~ s{^\[(dgit import unpatched .*)\]$}{[was: $1]}m) { $r->{NewMsg} = $m2; return $classify->(qw(DgitImportUnpatched), OrigParents => \@orig_ps); } if (@p == 2 and $r->{Msg} =~ m{^\[git-debrebase merged-breakwater.*\]$}m) { return $classify->("MergedBreakwaters"); } if ($r->{Msg} =~ m{^\[(git-debrebase|dgit)[: ].*\]$}m) { return $unknown->(f_ "unknown kind of merge from %s", $1); } if (@p > 2) { return $unknown->(__ "octopus merge"); } if (!$opt_merges) { return $unknown->(__ "general two-parent merge"); } return $classify->("VanillaMerge"); } sub keycommits ($;$$$$$); sub mergedbreakwaters_anchor ($) { my ($cl) = @_; my $best_anchor; foreach my $p (@{ $cl->{Parents} }) { my ($panchor, $pbw) = keycommits $p->{CommitId}, undef,undef,undef,undef, 1; $best_anchor = $panchor if !defined $best_anchor or is_fast_fwd $best_anchor, $panchor; fail f_ "inconsistent anchors in merged-breakwaters %s", $p->{CommitId} unless is_fast_fwd $panchor, $best_anchor; } return $best_anchor; } sub keycommits ($;$$$$$) { my ($head, $furniture, $unclean, $trouble, $fatal, $claimed_bw) = @_; # => ($anchor, $breakwater) # $furniture->("unclean-$tagsfx", $msg, $cl) # $unclean->("unclean-$tagsfx", $msg, $cl) # is callled for each situation or commit that # wouldn't be found in a laundered branch # $furniture is for furniture commits such as might be found on an # interchange branch (pseudomerge, d/patches, changelog) # $trouble is for things whnich prevent the return of # anchor and breakwater information; if that is ignored, # then keycommits returns (undef, undef) instead. # $fatal is for unprocessable commits, and should normally cause # a failure. If ignored, agaion, (undef, undef) is returned. # # If $claimed_bw, this is supposed to be a breakwater commit. # # If a callback is undef, fail is called instead. # If a callback is defined but false, the situation is ignored. # Callbacks may say: # no warnings qw(exiting); last; # if the answer is no longer wanted. my ($anchor, $breakwater); $breakwater = $head if $claimed_bw; my $clogonly; my $cl; my $found_pm; $fatal //= sub { fail_unprocessable $_[1]; }; my $x = sub { my ($cb, $tagsfx, $mainwhy, $xwhy) = @_; my $why = $mainwhy.$xwhy; my $m = f_ "branch needs laundering (run git-debrebase): %s", $why; fail $m unless defined $cb; return unless $cb; $cb->("unclean-$tagsfx", $why, $cl, $mainwhy); }; my $found_anchor = sub { ($anchor) = @_; $breakwater //= $clogonly; $breakwater //= $head; no warnings qw(exiting); last; }; for (;;) { $cl = classify $head; my $ty = $cl->{Type}; if ($ty eq 'Packaging') { $breakwater //= $clogonly; $breakwater //= $head; } elsif ($ty eq 'Changelog') { # this is going to count as the tip of the breakwater # only if it has no upstream stuff before it $clogonly //= $head; } elsif ($ty eq 'Anchor' or $ty eq 'TreatAsAnchor' or $ty eq 'BreakwaterStart') { $found_anchor->($head); } elsif ($ty eq 'Upstream') { $x->($unclean, 'ordering', (f_ "packaging change (%s) follows upstream change", $breakwater), (f_ " (eg %s)", $head)) if defined $breakwater; $clogonly = undef; $breakwater = undef; } elsif ($ty eq 'Mixed') { $x->($unclean, 'mixed', (__ "found mixed upstream/packaging commit"), (f_ " (%s)", $head)); $clogonly = undef; $breakwater = undef; } elsif ($ty eq 'Pseudomerge' or $ty eq 'AddPatches') { my $found_pm = 1; $x->($furniture, (lc $ty), (f_ "found interchange bureaucracy commit (%s)", $ty), (f_ " (%s)", $head)); } elsif ($ty eq 'DgitImportUnpatched') { if ($found_pm) { $x->($trouble, 'dgitimport', (__ "found dgit dsc import"), (f_ " (%s)", $head)); return (undef,undef); } else { $x->($fatal, 'unprocessable', (__ "found bare dgit dsc import with no prior history"), (f_ " (%s)", $head)); return (undef,undef); } } elsif ($ty eq 'VanillaMerge') { $x->($trouble, 'vanillamerge', (__ "found vanilla merge"), (f_ " (%s)", $head)); return (undef,undef); } elsif ($ty eq 'MergedBreakwaters') { $found_anchor->(mergedbreakwaters_anchor $cl); } else { $x->($fatal, 'unprocessable', (f_ "found unprocessable commit, cannot cope: %s", $cl->{Why}), (f_ " (%s)", $head)); return (undef,undef); } $head = $cl->{Parents}[0]{CommitId}; } return ($anchor, $breakwater); } sub treated_anchor_msg () { __ 'old anchor is recognised due to --anchor, cannot check upstream' } sub walk ($;$$$); sub walk ($;$$$) { my ($input, $nogenerate,$report, $report_lprefix) = @_; # => ($tip, $breakwater_tip, $last_anchor) # (or nothing, if $nogenerate) printdebug "*** WALK $input ".($nogenerate//0)." ".($report//'-')."\n"; $report_lprefix //= ''; # go through commits backwards # we generate two lists of commits to apply: # breakwater branch and upstream patches my (@brw_cl, @upp_cl, @processed); my %found; my $upp_limit; my @pseudomerges; my $cl; my $xmsg = sub { my ($prose, $info) = @_; # We deliberately do not translate $prose, since this mostly # appears in commits in Debian and they should be in English. my $ms = $cl->{Msg}; chomp $ms; confess unless defined $info; $ms .= "\n\n[git-debrebase $info: $prose]\n"; return (Msg => $ms); }; my $rewrite_from_here = sub { my ($cl) = @_; my $sp_cl = { SpecialMethod => 'StartRewrite' }; push @$cl, $sp_cl; push @processed, $sp_cl; }; my $cur = $input; my $prdelim = ""; my $prprdelim = sub { print $report $prdelim if $report; $prdelim=""; }; my $prline = sub { return unless $report; print $report $prdelim, $report_lprefix, @_; $prdelim = "\n"; }; my $bomb = sub { # usage: return $bomb->(); print $report " Unprocessable" if $report; print $report " ($cl->{Why})" if $report && defined $cl->{Why}; $prprdelim->(); if ($nogenerate) { return (undef,undef); } my $d = join ' ', map { sprintf "%#x", $_->{Differs} } @{ $cl->{Parents} }; fail_unprocessable f_ +(defined $cl->{Why} ? i_ 'found unprocessable commit, cannot cope; %3$s: (commit %1$s) (d.%2$s)' : i_ 'found unprocessable commit, cannot cope: (commit %1$s) (d.%2$s)'), $cur, $d, $cl->{Why}; }; my $build; my $breakwater; my $build_start = sub { my ($msg, $parent) = @_; $prline->(" $msg"); $build = $parent; no warnings qw(exiting); last; }; my $nomerge = sub { my ($emsg) = @_; merge_failed $cl->{MergeWreckNotes}, $emsg; }; my $mwrecknote = sub { &mwrecknote($cl->{MergeWreckNotes}, @_); }; my $last_anchor; for (;;) { $cl = classify $cur; $cl->{MergeWreckNotes} //= {}; my $ty = $cl->{Type}; my $st = $cl->{SubType}; $prline->("$cl->{CommitId} $cl->{Type}"); $found{$ty. ( defined($st) ? "-$st" : '' )}++; push @processed, $cl; my $p0 = @{ $cl->{Parents} }==1 ? $cl->{Parents}[0]{CommitId} : undef; if ($ty eq 'AddPatches') { $cur = $p0; $rewrite_from_here->(\@upp_cl); next; } elsif ($ty eq 'Packaging' or $ty eq 'Changelog') { push @brw_cl, $cl; $cur = $p0; next; } elsif ($ty eq 'BreakwaterStart') { $last_anchor = $cur; $build_start->('FirstPackaging', $cur); } elsif ($ty eq 'Upstream') { push @upp_cl, $cl; $cur = $p0; next; } elsif ($ty eq 'Mixed') { my $queue = sub { my ($q, $wh) = @_; my $cls = { %$cl, $xmsg->("mixed commit: $wh part",'split') }; push @$q, $cls; }; $queue->(\@brw_cl, "debian"); $queue->(\@upp_cl, "upstream"); $rewrite_from_here->(\@brw_cl); $cur = $p0; next; } elsif ($ty eq 'Pseudomerge') { my $contrib = $cl->{Contributor}{CommitId}; print $report " Contributor=$contrib" if $report; push @pseudomerges, $cl; $rewrite_from_here->(\@upp_cl); $cur = $contrib; next; } elsif ($ty eq 'Anchor' or $ty eq 'TreatAsAnchor') { $last_anchor = $cur; $build_start->("Anchor", $cur); } elsif ($ty eq 'DgitImportUnpatched') { my $pm = $pseudomerges[-1]; if (defined $pm) { # To an extent, this is heuristic. Imports don't have # a useful history of the debian/ branch. We assume # that the first pseudomerge after an import has a # useful history of debian/, and ignore the histories # from later pseudomerges. Often the first pseudomerge # will be the dgit import of the upload to the actual # suite intended by the non-dgit NMUer, and later # pseudomerges may represent in-archive copies. my $ovwrs = $pm->{Overwritten}; printf $report " PM=%s \@Overwr:%d", $pm->{CommitId}, (scalar @$ovwrs) if $report; if (@$ovwrs != 1) { printdebug "*** WALK BOMB DgitImportUnpatched\n"; return $bomb->(); } my $ovwr = $ovwrs->[0]{CommitId}; printf $report " Overwr=%s", $ovwr if $report; # This import has a tree which is just like a # breakwater tree, but it has the wrong history. It # ought to have the previous breakwater (which the # pseudomerge overwrote) as an ancestor. That will # make the history of the debian/ files correct. As # for the upstream version: either it's the same as # was ovewritten (ie, same as the previous # breakwater), in which case that history is precisely # right; or, otherwise, it was a non-gitish upload of a # new upstream version. We can tell these apart by # looking at the tree of the supposed upstream. push @brw_cl, { %$cl, SpecialMethod => 'DgitImportDebianUpdate', $xmsg->("debian changes", 'convert dgit import') }, { %$cl, SpecialMethod => 'DgitImportUpstreamUpdate', $xmsg->("convert dgit import: upstream update", "anchor") }; $prline->(" Import"); $rewrite_from_here->(\@brw_cl); $upp_limit //= $#upp_cl; # further, deeper, patches discarded $cur = $ovwr; next; } else { # Everything is from this import. This kind of import # is already nearly in valid breakwater format, with the # patches as commits. Unfortunately it contains # debian/patches/. printdebug "*** WALK BOMB bare dgit import\n"; $cl->{Why} = __ "bare dgit dsc import"; return $bomb->(); } confess "$ty ?"; } elsif ($ty eq 'MergedBreakwaters') { $last_anchor = mergedbreakwaters_anchor $cl; $build_start->(' MergedBreakwaters', $cur); last; } elsif ($ty eq 'VanillaMerge') { # User may have merged unstitched branch(es). We will # have now lost what ffq-prev was then (since the later # pseudomerge may introduce further changes). The effect # of resolving such a merge is that we may have to go back # further in history to find a merge base, since the one # which was reachable via ffq-prev is no longer findable. # This is suboptimal, but if it all works we'll have done # the right thing. # MERGE-TODO we should warn the user in the docs about this my $ok=1; my $best_anchor; # We expect to find a dominating anchor amongst the # inputs' anchors. That will be the new anchor. # # More complicated is finding a merge base for the # breakwaters. We need a merge base that is a breakwater # commit. The ancestors of breakwater commits are more # breakwater commits and possibly upstream commits and the # ancestors of those upstream. Upstreams might have # arbitrary ancestors. But any upstream commit U is # either included in both anchors, in which case the # earlier anchor is a better merge base than any of U's # ancestors; or U is not included in the older anchor, in # which case U is not an ancestor of the vanilla merge at # all. So no upstream commit, nor any ancestor thereof, # is a best merge base. As for non-breakwater Debian # commits: these are never ancestors of any breakwater. # # So any best merge base as found by git-merge-base # is a suitable breakwater anchor. Usually there will # be only one. printdebug "*** MERGE\n"; my @bwbcmd = (@git, qw(merge-base)); my @ibcmd = (@git, qw(merge-base --all)); my $might_be_in_bw = 1; my $ps = $cl->{Parents}; $mwrecknote->('vanilla-merge', $cl->{CommitId}); foreach my $p (@$ps) { $prline->(" VanillaMerge ".$p->{Ix}); $prprdelim->(); my ($ptip, $pbw, $panchor) = walk $p->{CommitId}, 0, $report, $report_lprefix.' '; $p->{Laundered} = $p->{SeriesTip} = $ptip; $p->{Breakwater} = $p->{SeriesBase} = $pbw; $p->{Anchor} = $panchor; my $lr = $p->{LeftRight} = (qw(left right))[$p->{Ix}]; $mwrecknote->("$lr-input", $p->{CommitId}); my $mwrecknote_parent = sub { my ($which) = @_; $mwrecknote->("$lr-".(lc $which), $p->{$which}); }; $mwrecknote_parent->('Laundered'); $mwrecknote_parent->('Breakwater'); $mwrecknote_parent->('Anchor'); $best_anchor = $panchor if !defined $best_anchor or is_fast_fwd $best_anchor, $panchor; printdebug " MERGE BA best=".($best_anchor//'-'). " p=$panchor\n"; } $mwrecknote->('result-anchor', $best_anchor); foreach my $p (@$ps) { $prline->(" VanillaMerge ".$p->{Ix}); if (!is_fast_fwd $p->{Anchor}, $best_anchor) { $nomerge->('divergent anchors'); } elsif ($p->{Anchor} eq $best_anchor) { print $report " SameAnchor" if $report; } else { print $report " SupersededAnchor" if $report; } if ($p->{Breakwater} eq $p->{CommitId}) { # this parent commit was its own breakwater, # ie it is part of the breakwater print $report " Breakwater" if $report; } else { $might_be_in_bw = 0; } push @bwbcmd, $p->{Breakwater}; push @ibcmd, $p->{CommitId}; } if ($ok && $might_be_in_bw) { # We could rewrite this to contaion the metadata # declaring it to be MergedBreakwaters, but # unnecessarily rewriting a merge seems unhelpful. $prline->(" VanillaMerge MergedBreakwaters"); $last_anchor = $best_anchor; $build_start->('MergedBreakwaters', $cur); } my $bwb = cmdoutput @bwbcmd; # OK, now we have a breakwater base, but we need the merge # base for the interchange branch because we need the delta # queue. # # This a the best merge base of our inputs which has the # breakwater merge base as an ancestor. my @ibs = grep /./, split /\n/, cmdoutput @ibcmd; @ibs or confess 'internal error, expected anchor at least ?'; my $ib; my $ibleaf; foreach my $tibix (0..$#ibs) { my $tib = $ibs[$tibix]; my $ff = is_fast_fwd $bwb, $tib; my $ok = !$ff ? 'rej' : $ib ? 'extra' : 'ok'; my $tibleaf = "interchange-mbcand-$ok-$tibix"; $mwrecknote->($tibleaf, $tib); next unless $ff; next if $ib; $ib = $tib; $ibleaf = $tibleaf; } $ib or $nomerge->("no suitable interchange merge base"); $prline->(" VanillaMerge Base"); $prprdelim->(); my ($btip, $bbw, $banchor) = eval { walk $ib, 0, $report, $report_lprefix.' '; }; $nomerge->("walking interchange branch merge base ($ibleaf):\n". $@) if length $@; $mwrecknote->("mergebase-laundered", $btip); $mwrecknote->("mergebase-breakwater", $bbw); $mwrecknote->("mergebase-anchor", $banchor); my $ibinfo = { SeriesTip => $btip, SeriesBase => $bbw, Anchor => $banchor, LeftRight => 'mergebase' }; $bbw eq $bwb or $nomerge->("interchange merge-base ($ib)'s". " breakwater ($bbw)". " != breakwaters' merge-base ($bwb)"); grep { $_->{Anchor} eq $ibinfo->{Anchor} } @$ps or $nomerge->("interchange merge-base ($ib)'s". " anchor ($ibinfo->{SeriesBase})". " != any merge input's anchor (". (join ' ', map { $_->{Anchor} } @$ps). ")"); $cl->{MergeInterchangeBaseInfo} = $ibinfo; $cl->{MergeBestAnchor} = $best_anchor; push @brw_cl, { %$cl, SpecialMethod => 'MergeCreateMergedBreakwaters', $xmsg->('constructed from vanilla merge', 'merged-breakwater'), }; push @upp_cl, { %$cl, SpecialMethod => 'MergeMergeSeries', }; $build_start->('MergeBreakwaters', $cur); } else { printdebug "*** WALK BOMB unrecognised\n"; return $bomb->(); } } $prprdelim->(); printdebug "*** WALK prep done cur=$cur". " brw $#brw_cl upp $#upp_cl proc $#processed pm $#pseudomerges\n"; return if $nogenerate; # Now we build it back up again fresh_workarea(); my $rewriting = 0; $#upp_cl = $upp_limit if defined $upp_limit; my $committer_authline = calculate_committer_authline(); printdebug "WALK REBUILD $build ".(scalar @processed)."\n"; confess __ "internal error" unless $build eq (pop @processed)->{CommitId}; in_workarea sub { mkdir $rd or $!==EEXIST or confess "$!"; my $current_method; my $want_debian = $build; my $want_upstream = $build; my $read_tree_upstream = sub { ($want_upstream) = @_; }; my $read_tree_debian = sub { ($want_debian) = @_; }; foreach my $cl (qw(Debian), (reverse @brw_cl), { SpecialMethod => 'RecordBreakwaterTip' }, qw(Upstream), (reverse @upp_cl)) { if (!ref $cl) { $current_method = $cl; next; } my $method = $cl->{SpecialMethod} // $current_method; my @parents = ($build); my $cltree = $cl->{CommitId}; printdebug "WALK BUILD ".($cltree//'undef'). " $method (rewriting=$rewriting)\n"; if ($method eq 'Debian') { $read_tree_debian->($cltree); } elsif ($method eq 'Upstream') { $read_tree_upstream->($cltree); } elsif ($method eq 'StartRewrite') { $rewriting = 1; next; } elsif ($method eq 'RecordBreakwaterTip') { $breakwater = $build; next; } elsif ($method eq 'DgitImportDebianUpdate') { $read_tree_debian->($cltree); } elsif ($method eq 'DgitImportUpstreamUpdate') { confess unless $rewriting; my $differs = (get_differs $build, $cltree); next unless $differs & D_UPS; $read_tree_upstream->($cltree); push @parents, map { $_->{CommitId} } @{ $cl->{OrigParents} }; } elsif ($method eq 'MergeCreateMergedBreakwaters') { print "Found a general merge, will try to tidy it up.\n"; $rewriting = 1; $read_tree_upstream->($cl->{MergeBestAnchor}); $read_tree_debian->($cltree); @parents = map { $_->{Breakwater} } @{ $cl->{Parents} }; } elsif ($method eq 'MergeMergeSeries') { my $cachehit = reflog_cache_lookup $merge_cache_ref, "vanilla-merge $cl->{CommitId}"; if ($cachehit) { print "Using supplied resolution for $cl->{CommitId}...\n"; $build = $cachehit; $mwrecknote->('cached-resolution', $build); } else { print "Running merge resolution for $cl->{CommitId}...\n"; $mwrecknote->('new-base', $build); $build = merge_series $build, $cl->{MergeWreckNotes}, $cl->{MergeInterchangeBaseInfo}, @{ $cl->{Parents} }; } $last_anchor = $cl->{MergeBestAnchor}; # Check for mismerges: my $check = sub { my ($against, $allow, $what) = @_; my $differs = get_differs $build, $against; $nomerge->(sprintf "merge misresolved: %s are not the same (%s %s d.%#x)", $what, $against, $build, $differs) if $differs & ~($allow | D_PAT_ADD); }; # Breakwater changes which were in each side of the # merge will have been incorporated into the # MergeCreateMergedBreakwaters output. Because the # upstream series was rebased onto the new breakwater, # so should all of the packaging changes which were in # the input. $check->($input, D_UPS, 'debian files'); # Upstream files are merge_series, which ought to # have been identical to the original merge. $check->($cl->{CommitId}, DS_DEB, 'upstream files'); print "Merge resolution successful.\n"; next; } else { confess "$method ?"; } if (!$rewriting) { my $procd = (pop @processed) // 'UNDEF'; if ($cl ne $procd) { $rewriting = 1; printdebug "WALK REWRITING NOW cl=$cl procd=$procd\n"; } } if ($rewriting) { read_tree_upstream $want_upstream, 0, $want_debian; my $newtree = cmdoutput @git, qw(write-tree); my $ch = $cl->{Hdr}; $ch =~ s{^tree .*}{tree $newtree}m or confess "$ch ?"; $ch =~ s{^parent .*\n}{}mg; $ch =~ s{(?=^author)}{ join '', map { "parent $_\n" } @parents }me or confess "$ch ?"; if ($rewriting) { $ch =~ s{^committer .*$}{$committer_authline}m or confess "$ch ?"; } my $cf = "$rd/m$rewriting"; open CD, ">", $cf or confess "$!"; print CD $ch, "\n", $cl->{Msg} or confess "$!"; close CD or confess "$!"; my @cmd = (@git, qw(hash-object)); push @cmd, qw(-w) if $rewriting; push @cmd, qw(-t commit), $cf; my $newcommit = cmdoutput @cmd; confess "$ch ?" unless $rewriting or $newcommit eq $cl->{CommitId}; $build = $newcommit; } else { $build = $cl->{CommitId}; trees_diff_walk "$want_upstream:", "$build:", sub { my ($n) = @_; no warnings qw(exiting); next if $n eq 'debian/'; confess f_ "mismatch %s ?", "@_"; }; trees_diff_walk "$want_debian:debian", "$build:debian", sub { confess f_ "mismatch %s ?", "@_"; }; my @old_parents = map { $_->{CommitId} } @{ $cl->{Parents} }; confess f_ "mismatch %s != %s ?", "@parents", "@old_parents" unless "@parents" eq "@old_parents"; } if (grep { $method eq $_ } qw(DgitImportUpstreamUpdate)) { $last_anchor = $cur; } } }; my $final_check = get_differs $build, $input; confess f_ "internal error %#x %s %s", $final_check, $input, $build if $final_check & ~D_PAT_ADD; my @r = ($build, $breakwater, $last_anchor); printdebug "*** WALK RETURN @r\n"; return @r } sub get_head () { git_check_unmodified(); return git_rev_parse qw(HEAD); } sub update_head ($$$) { my ($old, $new, $mrest) = @_; push @deferred_updates, "update HEAD $new $old"; run_deferred_updates $mrest; } sub update_head_checkout ($$$) { my ($old, $new, $mrest) = @_; update_head $old, $new, $mrest; runcmd @git, qw(reset --hard); } sub update_head_postlaunder ($$$) { my ($old, $tip, $reflogmsg) = @_; return if $tip eq $old && !@deferred_updates; print f_ "%s: laundered (head was %s)\n", $us, $old; update_head $old, $tip, $reflogmsg; # no tree changes except debian/patches runcmd @git, qw(rm --quiet --ignore-unmatch -rf debian/patches); } sub currently_rebasing() { foreach (qw(rebase-merge rebase-apply)) { return 1 if stat_exists "$maindir_gitdir/$_"; } return 0; } sub bail_if_rebasing() { fail __ "you are in the middle of a git-rebase already" if currently_rebasing(); } sub do_launder_head ($) { my ($reflogmsg) = @_; my $old = get_head(); record_ffq_auto(); my ($tip,$breakwater) = walk $old; snags_maybe_bail(); update_head_postlaunder $old, $tip, $reflogmsg; return ($tip,$breakwater); } sub cmd_launder_v0 () { # =item git-debrebase launder-v0 # # Launders the branch without recording anything in ffq-prev. # Then prints some information about the current branch. # Do not use this operation; # it will be withdrawn soon. # # (docs removed from manual and placed here in dgit 10.6; # the code is retained for information) badusage "no arguments to launder-v0 allowed" if @ARGV; my $old = get_head(); my ($tip,$breakwater,$last_anchor) = walk $old; update_head_postlaunder $old, $tip, 'launder'; printf "# breakwater tip\n%s\n", $breakwater; printf "# working tip\n%s\n", $tip; printf "# last anchor\n%s\n", $last_anchor; } sub defaultcmd_rebase () { push @ARGV, @{ $opt_defaultcmd_interactive // [] }; my ($tip,$breakwater) = do_launder_head __ 'launder for rebase'; runcmd @git, qw(rebase), @ARGV, $breakwater if @ARGV; } sub cmd_analyse () { badusage __ "analyse does not support any options" if @ARGV and $ARGV[0] =~ m/^-/; badusage __ "too many arguments to analyse" if @ARGV>1; my ($old) = @ARGV; if (defined $old) { $old = git_rev_parse $old; } else { $old = git_rev_parse 'HEAD'; } my ($dummy,$breakwater) = walk $old, 1,*STDOUT; STDOUT->error and confess "$!"; } sub ffq_check ($;$$) { # calls $ff and/or $notff zero or more times # then returns either (status,message) where status is # exists # detached # weird-symref # notbranch # or (undef,undef, $ffq_prev,$gdrlast) # $ff and $notff are called like this: # $ff->("message for stdout\n"); # $notff->('snag-name', $message); # normally $currentval should be HEAD my ($currentval, $ff, $notff) =@_; $ff //= sub { print $_[0] or confess "$!"; }; $notff //= \&snag; my ($status, $message, $current, $ffq_prev, $gdrlast) = ffq_prev_branchinfo(); return ($status, $message) unless $status eq 'branch'; my $exists = git_get_ref $ffq_prev; return ('exists', f_ "%s already exists", $ffq_prev) if $exists; return ('not-branch', __ 'HEAD symref is not to refs/heads/') unless $current =~ m{^refs/heads/}; my $branch = $'; my @check_specs = split /\;/, (cfg "branch.$branch.ffq-ffrefs",1) // '*'; my %checked; printdebug "ffq check_specs @check_specs\n"; my $check = sub { my ($lrref, $desc) = @_; printdebug "ffq might check $lrref ($desc)\n"; my $invert; for my $chk (@check_specs) { my $glob = $chk; $invert = $glob =~ s{^[!^]}{}; last if fnmatch $glob, $lrref; } return if $invert; my $lrval = git_get_ref $lrref; return unless length $lrval; if (is_fast_fwd $lrval, $currentval) { $ff->(f_ "OK, you are ahead of %s\n", $lrref); $checked{$lrref} = 1; } elsif (is_fast_fwd $currentval, $lrval) { $checked{$lrref} = -1; $notff->('behind', f_ "you are behind %s, divergence risk", $lrref); } else { $checked{$lrref} = -1; $notff->('diverged', f_ "you have diverged from %s", $lrref); } }; my $merge = cfg "branch.$branch.merge",1; if (defined $merge and $merge =~ m{^refs/heads/}) { my $rhs = $'; printdebug "ffq merge $rhs\n"; my $check_remote = sub { my ($remote, $desc) = @_; printdebug "ffq check_remote ".($remote//'undef')." $desc\n"; return unless defined $remote; $check->("refs/remotes/$remote/$rhs", $desc); }; $check_remote->((scalar cfg "branch.$branch.remote",1), 'remote fetch/merge branch'); $check_remote->((scalar cfg "branch.$branch.pushRemote",1) // (scalar cfg "branch.$branch.pushDefault",1), 'remote push branch'); } if ($branch =~ m{^dgit/}) { $check->("refs/remotes/dgit/$branch", __ 'remote dgit branch'); } elsif ($branch =~ m{^master$}) { $check->("refs/remotes/dgit/dgit/sid", __ 'remote dgit branch for sid'); } return (undef, undef, $ffq_prev, $gdrlast); } sub record_ffq_prev_deferred () { # => ('status', "message") # 'status' may be # deferred message is undef # exists # detached # weird-symref # notbranch # if not ff from some branch we should be ff from, is an snag # if "deferred", will have added something about that to # @deferred_update_messages, and also maybe printed (already) # some messages about ff checks bail_if_rebasing(); my $currentval = get_head(); my ($status,$message, $ffq_prev,$gdrlast) = ffq_check $currentval; return ($status,$message) if defined $status; snags_maybe_bail(); push @deferred_updates, "update $ffq_prev $currentval $git_null_obj"; push @deferred_updates, "delete $gdrlast"; push @deferred_update_messages, __ "Recorded previous head for preservation"; return ('deferred', undef); } sub record_ffq_auto () { my ($status, $message) = record_ffq_prev_deferred(); if ($status eq 'deferred' || $status eq 'exists') { } else { snag $status, f_ "could not record ffq-prev: %s", $message; snags_maybe_bail(); } } sub ffq_prev_info () { bail_if_rebasing(); # => ($ffq_prev, $gdrlast, $ffq_prev_commitish) my ($status, $message, $current, $ffq_prev, $gdrlast) = ffq_prev_branchinfo(); if ($status ne 'branch') { snag $status, f_ "could not check ffq-prev: %s", $message; snags_maybe_bail(); } my $ffq_prev_commitish = $ffq_prev && git_get_ref $ffq_prev; return ($ffq_prev, $gdrlast, $ffq_prev_commitish); } sub stitch ($$$$$) { my ($old_head, $ffq_prev, $gdrlast, $ffq_prev_commitish, $prose) = @_; push @deferred_updates, "delete $ffq_prev $ffq_prev_commitish"; if (is_fast_fwd $old_head, $ffq_prev_commitish) { my $differs = get_differs $old_head, $ffq_prev_commitish; unless ($differs & ~D_PAT_ADD) { # ffq-prev is ahead of us, and the only tree changes it has # are possibly addition of things in debian/patches/. # Just wind forwards rather than making a pointless pseudomerge. record_gdrlast $gdrlast, $ffq_prev_commitish; update_head_checkout $old_head, $ffq_prev_commitish, sprintf "stitch (%s)", __ 'fast forward'; return; } } fresh_workarea(); # We make pseudomerges with L as the contributing parent. # This makes git rev-list --first-parent work properly. my $new_head = make_commit [ $old_head, $ffq_prev ], [ # we translate this against the time when this same code is # used outside Debian, for downstreams and users (__ 'Declare fast forward / record previous work'), "[git-debrebase pseudomerge: $prose]", ]; record_gdrlast $gdrlast, $new_head; update_head $old_head, $new_head, "stitch: $prose"; } sub do_stitch ($;$) { my ($prose, $unclean) = @_; my ($ffq_prev, $gdrlast, $ffq_prev_commitish) = ffq_prev_info(); if (!$ffq_prev_commitish) { fail __ "No ffq-prev to stitch." unless $opt_noop_ok; return; } my $dangling_head = get_head(); keycommits $dangling_head, $unclean,$unclean,$unclean; snags_maybe_bail(); stitch($dangling_head, $ffq_prev, $gdrlast, $ffq_prev_commitish, $prose); } sub cmd_new_upstream () { # automatically and unconditionally launders before rebasing # if rebase --abort is used, laundering has still been done my %pieces; badusage __ "need NEW-VERSION [UPS-COMMITTISH]" unless @ARGV >= 1; # parse args - low commitment my $spec_version = shift @ARGV; my $new_version = (new Dpkg::Version $spec_version, check => 1); fail f_ "bad version number \`%s'", $spec_version unless defined $new_version; if ($new_version->is_native()) { $new_version = (new Dpkg::Version "$spec_version-1", check => 1); } my $new_upstream = (@ARGV && $ARGV[0] !~ m{^-}) ? shift @ARGV : undef; my $new_upstream_version = upstreamversion $new_version; my $new_upstream_used; ($new_upstream, $new_upstream_used) = resolve_upstream_version $new_upstream, $new_upstream_version; record_ffq_auto(); my $piece = sub { my ($n, @x) = @_; # may be '' my $pc = $pieces{$n} //= { Name => $n, Desc => ($n ? (f_ "upstream piece \`%s'", $n) : (__ "upstream (main piece")), }; while (my $k = shift @x) { $pc->{$k} = shift @x; } $pc; }; my @newpieces; my $newpiece = sub { my ($n, @x) = @_; # may be '' my $pc = $piece->($n, @x, NewIx => (scalar @newpieces)); push @newpieces, $pc; }; $newpiece->('', OldIx => 0, New => $new_upstream, ); while (@ARGV && $ARGV[0] !~ m{^-}) { my $n = shift @ARGV; badusage __ "for each EXTRA-UPS-NAME need EXTRA-UPS-COMMITISH" unless @ARGV && $ARGV[0] !~ m{^-}; my $c = git_rev_parse shift @ARGV; confess unless $n =~ m/^$extra_orig_namepart_re$/; $newpiece->($n, New => $c); } # now we need to investigate the branch this generates the # laundered version but we don't switch to it yet my $old_head = get_head(); my ($old_laundered_tip,$old_bw,$old_anchor) = walk $old_head; my $old_bw_cl = classify $old_bw; my $old_anchor_cl = classify $old_anchor; my $old_upstream; if (!$old_anchor_cl->{OrigParents}) { snag 'anchor-treated', treated_anchor_msg(); } else { $old_upstream = parsecommit $old_anchor_cl->{OrigParents}[0]{CommitId}; $piece->('', Old => $old_upstream->{CommitId}); } if ($old_upstream && $old_upstream->{Msg} =~ m{^\[git-debrebase }m) { if ($old_upstream->{Msg} =~ m{^\[git-debrebase upstream-combine (\.(?: $extra_orig_namepart_re)+)\:.*\]$}m ) { my @oldpieces = (split / /, $1); my $old_n_parents = scalar @{ $old_upstream->{Parents} }; if ($old_n_parents != @oldpieces && $old_n_parents != @oldpieces + 1) { snag 'upstream-confusing', f_ "previous upstream combine %s". " mentions %d pieces (each implying one parent)". " but has %d parents". " (one per piece plus maybe a previous combine)", $old_upstream->{CommitId}, (scalar @oldpieces), $old_n_parents; } elsif ($oldpieces[0] ne '.') { snag 'upstream-confusing', f_ "previous upstream combine %s". " first piece is not \`.'", $oldpieces[0]; } else { $oldpieces[0] = ''; foreach my $i (0..$#oldpieces) { my $n = $oldpieces[$i]; my $hat = 1 + $i + ($old_n_parents - @oldpieces); $piece->($n, Old => $old_upstream->{CommitId}.'^'.$hat); } } } else { snag 'upstream-confusing', f_ "previous upstream %s is from". " git-debrebase but not an \`upstream-combine' commit", $old_upstream->{CommitId}; } } foreach my $pc (values %pieces) { if (!$old_upstream) { # we have complained already } elsif (!$pc->{Old}) { snag 'upstream-new-piece', f_ "introducing upstream piece \`%s'", $pc->{Name}; } elsif (!$pc->{New}) { snag 'upstream-rm-piece', f_ "dropping upstream piece \`%s'", $pc->{Name}; } elsif (!is_fast_fwd $pc->{Old}, $pc->{New}) { snag 'upstream-not-ff', f_ "not fast forward: %s %s", $pc->{Name}, "$pc->{Old}..$pc->{New}"; } } printdebug "%pieces = ", (dd \%pieces), "\n"; printdebug "\@newpieces = ", (dd \@newpieces), "\n"; snags_maybe_bail(); my $new_bw; fresh_workarea(); in_workarea sub { my @upstream_merge_parents; if (!any_snags()) { push @upstream_merge_parents, $old_upstream->{CommitId}; } foreach my $pc (@newpieces) { # always has '' first if ($pc->{Name}) { read_tree_subdir $pc->{Name}, $pc->{New}; } else { runcmd @git, qw(read-tree), $pc->{New}; } push @upstream_merge_parents, $pc->{New}; } # index now contains the new upstream if (@newpieces > 1) { # need to make the upstream subtree merge commit $new_upstream = make_commit \@upstream_merge_parents, [ "Combine upstreams for $new_upstream_version", ("[git-debrebase upstream-combine . ". (join " ", map { $_->{Name} } @newpieces[1..$#newpieces]). ": new upstream]"), ]; } # $new_upstream is either the single upstream commit, or the # combined commit we just made. Either way it will be the # "upstream" parent of the anchor merge. read_tree_subdir 'debian', "$old_bw:debian"; # index now contains the anchor merge contents $new_bw = make_commit [ $old_bw, $new_upstream ], [ "Update to upstream $new_upstream_version", "[git-debrebase anchor: new upstream $new_upstream_version, merge]", ]; # Now we have to add a changelog stanza so the Debian version # is right. We use debchange to do this. Invoking debchange # here is a bit fiddly because it has a lot of optional # exciting behaviours, some of which will break stuff, and # some of which won't work in a playtree. # Make debchange use git's idea of the user's identity. # That way, if the user never uses debchange et al, configuring # git is enough. my $usetup = sub { my ($e, $k) = @_; my $v = cfg $k, 1; defined $v or return; $ENV{$e} = $v; }; $usetup->('DEBEMAIL', 'user.email'); $usetup->('DEBFULLNAME', 'user.name'); my @dch = (qw(debchange --allow-lower-version .* --no-auto-nmu --preserve --vendor=Unknown-Vendor --changelog debian/changelog --check-dirname-level 0 --release-heuristic=changelog -v), $new_version, "Update to new upstream version $new_upstream_version."); runcmd @git, qw(checkout -q debian/changelog); runcmd @dch; runcmd @git, qw(update-index --add --replace), 'debian/changelog'; # Now we have the final new breakwater branch in the index $new_bw = make_commit [ $new_bw ], [ "Update changelog for new upstream $new_upstream_version", "[git-debrebase changelog: new upstream $new_upstream_version]", ]; }; # we have constructed the new breakwater. we now need to commit to # the laundering output, because git-rebase can't easily be made # to make a replay list which is based on some other branch update_head_postlaunder $old_head, $old_laundered_tip, 'launder for new upstream'; my @cmd = (@git, qw(rebase --onto), $new_bw, $old_bw, @ARGV); local $ENV{GIT_REFLOG_ACTION} = git_reflog_action_msg "debrebase new-upstream $new_version: rebase"; runcmd @cmd; # now it's for the user to sort out } sub cmd_record_ffq_prev () { badusage "no arguments allowed" if @ARGV; my ($status, $msg) = record_ffq_prev_deferred(); if ($status eq 'exists' && $opt_noop_ok) { print __ "Previous head already recorded\n" or confess "$!"; } elsif ($status eq 'deferred') { run_deferred_updates 'record-ffq-prev'; } else { fail f_ "Could not preserve: %s", $msg; } } sub cmd_anchor () { badusage __ "no arguments allowed" if @ARGV; my ($anchor, $bw) = keycommits +(git_rev_parse 'HEAD'), 0,0; print "$anchor\n" or confess "$!"; } sub cmd_breakwater () { badusage __ "no arguments allowed" if @ARGV; my ($anchor, $bw) = keycommits +(git_rev_parse 'HEAD'), 0,0; print "$bw\n" or confess "$!"; } sub cmd_status () { badusage __ "no arguments allowed" if @ARGV; # todo: gdr status should print divergence info # todo: gdr status should print upstream component(s) info # todo: gdr should leave/maintain some refs with this kind of info ? my $oldest = { Badness => 0 }; my $newest; my $note = sub { my ($badness, $ourmsg, $snagname, $dummy, $cl, $kcmsg) = @_; if ($oldest->{Badness} < $badness) { $oldest = $newest = undef; } $oldest = { Badness => $badness, CommitId => $cl->{CommitId}, OurMsg => $ourmsg, KcMsg => $kcmsg, }; $newest //= $oldest; }; my ($anchor, $bw) = keycommits +(git_rev_parse 'HEAD'), sub { $note->(1, __ 'branch contains furniture (not laundered)',@_); }, sub { $note->(2, __ 'branch is unlaundered', @_); }, sub { $note->(3, __ 'branch needs laundering', @_); }, sub { $note->(4, __ 'branch not in git-debrebase form', @_); }; my $prcommitinfo = sub { my ($cid) = @_; flush STDOUT or confess "$!"; runcmd @git, qw(--no-pager log -n1), '--pretty=format: %h %s%n', $cid; }; print __ "current branch contents, in git-debrebase terms:\n"; if (!$oldest->{Badness}) { print __ " branch is laundered\n"; } else { print " $oldest->{OurMsg}\n"; my $printed = ''; foreach my $info ($oldest, $newest) { my $cid = $info->{CommitId}; next if $cid eq $printed; $printed = $cid; print " $info->{KcMsg}\n"; $prcommitinfo->($cid); } } my $prab = sub { my ($cid, $what) = @_; if (!defined $cid) { print f_ " %s is not well-defined\n", $what; } else { print " $what\n"; $prcommitinfo->($cid); } }; print __ "key git-debrebase commits:\n"; $prab->($anchor, __ 'anchor'); $prab->($bw, __ 'breakwater'); if (defined $anchor) { print " upstream\n"; my $cl = classify $anchor; my $ops = $cl->{OrigParents}; if ($ops) { $prcommitinfo->($ops->[0]{CommitId}); } else { printf " %s\n", treated_anchor_msg(); } } my ($ffqstatus, $ffq_msg, $current, $ffq_prev, $gdrlast) = ffq_prev_branchinfo(); print __ "branch and ref status, in git-debrebase terms:\n"; if ($ffq_msg) { print " $ffq_msg\n"; } else { $ffq_prev = git_get_ref $ffq_prev; $gdrlast = git_get_ref $gdrlast; if ($ffq_prev) { print __ " unstitched; previous tip was:\n"; $prcommitinfo->($ffq_prev); } elsif (!$gdrlast) { print __ " stitched? (no record of git-debrebase work)\n"; } elsif (is_fast_fwd $gdrlast, 'HEAD') { print __ " stitched\n"; } else { print __ " not git-debrebase (diverged since last stitch)\n" } } print __ "you are currently rebasing\n" if currently_rebasing(); } sub cmd_stitch () { my $prose = 'stitch'; getoptions("stitch", 'prose=s', \$prose); badusage __ "no arguments allowed" if @ARGV; do_stitch $prose, 0; } sub cmd_prepush () { $opt_noop_ok = 1; cmd_stitch(); } sub cmd_quick () { badusage __ "no arguments allowed" if @ARGV; do_launder_head __ 'launder for git-debrebase quick'; do_stitch 'quick'; } sub cmd_conclude () { my ($ffq_prev, $gdrlast, $ffq_prev_commitish) = ffq_prev_info(); if (!$ffq_prev_commitish) { fail __ "No ongoing git-debrebase session." unless $opt_noop_ok; return; } my $dangling_head = get_head(); badusage "no arguments allowed" if @ARGV; do_launder_head __ 'launder for git-debrebase quick'; do_stitch 'quick'; } sub cmd_scrap () { if (currently_rebasing()) { runcmd @git, qw(rebase --abort); push @deferred_updates, 'verify HEAD HEAD'; # noop, but stops us complaining that scrap was a noop } badusage __ "no arguments allowed" if @ARGV; my ($ffq_prev, $gdrlast, $ffq_prev_commitish) = ffq_prev_info(); my $scrapping_head; if ($ffq_prev_commitish) { $scrapping_head = get_head(); push @deferred_updates, "update $gdrlast $ffq_prev_commitish $git_null_obj", "update $ffq_prev $git_null_obj $ffq_prev_commitish"; } if (git_get_ref $merge_cache_ref) { push @deferred_updates, "delete $merge_cache_ref"; } if (!@deferred_updates) { fail __ "No ongoing git-debrebase session." unless $opt_noop_ok; finish 0; } snags_maybe_bail(); if ($scrapping_head) { update_head_checkout $scrapping_head, $ffq_prev_commitish, "scrap"; } else { run_deferred_updates "scrap"; } } sub make_patches_staged ($) { my ($head) = @_; # Produces the patches that would result from $head if it were # laundered. my ($secret_head, $secret_bw, $last_anchor) = walk $head; fresh_workarea(); my $any; in_workarea sub { $any = gbp_pq_export 'bw', $secret_bw, $secret_head; }; return $any; } sub make_patches ($) { my ($head) = @_; keycommits $head, 0, \&snag; my $any = make_patches_staged $head; my $out; in_workarea sub { my $ptree = !$any ? undef : cmdoutput @git, qw(write-tree --prefix=debian/patches/); runcmd @git, qw(read-tree), $head; if ($ptree) { read_tree_subdir 'debian/patches', $ptree; } else { rm_subdir_cached 'debian/patches'; } $out = make_commit [$head], [ (__ 'Commit patch queue (exported by git-debrebase)'), '[git-debrebase make-patches: export and commit patches]', ]; }; return $out; } sub cmd_make_patches () { my $opt_quiet_would_amend; getoptions("make-patches", 'quiet-would-amend!', \$opt_quiet_would_amend); badusage __ "no arguments allowed" if @ARGV; bail_if_rebasing(); my $old_head = get_head(); my $new = make_patches $old_head; my $d = get_differs $old_head, $new; if ($d == 0) { fail __ "No (more) patches to export." unless $opt_noop_ok; return; } elsif ($d == D_PAT_ADD) { snags_maybe_bail(); update_head_checkout $old_head, $new, 'make-patches'; } else { print STDERR failmsg f_ "Patch export produced patch amendments". " (abandoned output commit %s).". " Try laundering first.", $new unless $opt_quiet_would_amend; finish 7; } } sub check_series_has_all_patches ($) { my ($head) = @_; my $seriesfn = 'debian/patches/series'; my ($dummy, $series) = git_cat_file "$head:$seriesfn", [qw(blob missing)]; $series //= ''; my %series; our $comments_snagged; foreach my $f (grep /\S/, grep {!m/^\s\#/} split /\n/, $series) { if ($f =~ m/^\s*\#/) { snag 'series-comments', f_ "%s contains comments, which will be discarded", $seriesfn unless $comments_snagged++; next; } fail f_ "patch %s repeated in %s !", $f, $seriesfn if $series{$f}++; } foreach my $patchfile (get_tree "$head:debian/patches", 1,1) { my ($f,$i) = @$patchfile; next if $series{$f}; next if $f eq 'series'; snag 'unused-patches', f_ "Unused patch file %s will be discarded", $f; } } sub begin_convert_from () { my $head = get_head(); my ($ffqs, $ffqm, $symref, $ffq_prev, $gdrlast) = ffq_prev_branchinfo(); fail __ "ffq-prev exists, this is already managed by git-debrebase!" if $ffq_prev && git_get_ref $ffq_prev; my $gdrlast_obj = $gdrlast && git_get_ref $gdrlast; snag 'already-converted', __ "ahead of debrebase-last, this is already managed by git-debrebase!" if $gdrlast_obj && is_fast_fwd $gdrlast_obj, $head; return ($head, { LastRef => $gdrlast, LastObj => $gdrlast_obj }); } sub complete_convert_from ($$$$) { my ($old_head, $new_head, $gi, $mrest) = @_; snags_maybe_bail(); ffq_check $new_head; record_gdrlast $gi->{LastRef}, $new_head, $gi->{LastObj} if $gi->{LastRef}; snags_maybe_bail(); update_head_checkout $old_head, $new_head, $mrest; } sub cmd_convert_from_unapplied () { cmd_convert_from_gbp(); } sub cmd_convert_from_gbp () { badusage __ "want only 1 optional argument, the upstream git commitish" unless @ARGV<=1; my $clogp = parsechangelog(); my $version = $clogp->{'Version'} // fail __ "missing Version from changelog\n"; my ($upstream_spec) = @ARGV; my $upstream_version = upstreamversion $version; my ($upstream, $upstream_used) = resolve_upstream_version($upstream_spec, $upstream_version); my ($old_head, $gdrlastinfo) = begin_convert_from(); my $upsdiff = get_differs $upstream, $old_head; if ($upsdiff & D_UPS) { runcmd @git, qw(--no-pager diff --stat), $upstream, $old_head, qw( -- :!/debian :/); fail f_ <{Date}; next unless $stz->{Distribution} ne 'UNRELEASED'; $lvsn = $stz->{Version}; $suite = $stz->{Distribution}; last; }; die __ "neither of the first two changelog entries are released\n" unless defined $lvsn; print "last finished-looking changelog entry: ($lvsn) $suite\n"; my $mtag_pat = debiantag_maintview $lvsn, '*'; my $mtag = cmdoutput @git, qw(describe --always --abbrev=0 --match), $mtag_pat; die f_ "could not find suitable maintainer view tag %s\n", $mtag_pat unless $mtag =~ m{/}; is_fast_fwd $mtag, 'HEAD' or die f_ "HEAD is not FF from maintainer tag %s!", $mtag; my $dtag = "archive/$mtag"; git_get_ref "refs/tags/$dtag" or die f_ "dgit view tag %s not found\n", $dtag; is_fast_fwd $mtag, $dtag or die f_ "dgit view tag %s is not FF from maintainer tag %s\n", $dtag, $mtag; print f_ "will stitch in dgit view, %s\n", $dtag; git_rev_parse $dtag; }; if (!$previous_dgit_view) { $@ =~ s/^\n+//; chomp $@; print STDERR f_ <1; my @upstreams; if (@ARGV) { my $spec = shift @ARGV; my $commit = git_rev_parse "$spec^{commit}"; push @upstreams, { Commit => $commit, Source => (f_ "%s, from command line", $spec), Only => 1, }; } my ($head, $gdrlastinfo) = begin_convert_from(); if (!$always) { my $troubles = 0; my $trouble = sub { $troubles++; }; keycommits $head, sub{}, sub{}, $trouble, $trouble; printdebug "troubles=$troubles\n"; if (!$troubles) { print STDERR f_ <{Version}; print STDERR __ "Considering possible commits corresponding to upstream:\n"; if (!@upstreams) { if ($do_tags) { my @tried; my ($ups_tag, $ups_rev) = upstream_commitish_search $version, \@tried; if ($ups_rev) { my $this = f_ "git tag %s", $ups_tag; push @upstreams, { Commit => "$ups_rev~0", Source => $this, }; } else { print STDERR f_ " git tag: no suitable tag found (tried %s)\n", "@tried"; } } if ($do_origs) { my $p = $clogp->{'Source'}; # we do a quick check to see if there are plausible origs my $something=0; if (!opendir BPD, $bpd) { die f_ "opendir build-products-dir %s: %s", $bpd, $! unless $!==ENOENT; } else { while ($!=0, my $f = readdir BPD) { next unless is_orig_file_of_p_v $f, $p, $version; print STDERR f_ " orig: found what looks like a .orig, %s\n", "$bpd/$f"; $something=1; last; } confess "read $bpd: $!" if $!; closedir BPD; } if ($something) { my $tree = cmdoutput @dgit, qw(--build-products-dir), $bpd, qw(print-unapplied-treeish); fresh_workarea(); in_workarea sub { runcmd @git, qw(reset --quiet), $tree, qw(-- .); rm_subdir_cached 'debian'; $tree = cmdoutput @git, qw(write-tree); my $ups_synth = make_commit [], [ < $ups_synth, Source => "orig(s) imported via dgit", }; } } else { print STDERR f_ " orig: no suitable origs found (looked for %s in %s)\n", "${p}_".(stripepoch $version)."...", $bpd; } } } my $some_patches = stat_exists 'debian/patches/series'; print STDERR __ "Evaluating possible commits corresponding to upstream:\n"; my $result; foreach my $u (@upstreams) { my $work = $head; fresh_workarea(); in_workarea sub { runcmd @git, qw(reset --quiet), $u->{Commit}, qw(-- .); runcmd @git, qw(checkout), $u->{Commit}, qw(-- .); runcmd @git, qw(clean -xdff); runcmd @git, qw(checkout), $head, qw(-- debian); if ($some_patches) { rm_subdir_cached 'debian/patches'; $work = make_commit [ $work ], [ 'git-debrebase convert-from-dgit-view: drop upstream changes from breakwater', "Drop upstream changes, and delete debian/patches, as part of converting\n". "to git-debrebase format. Upstream changes will appear as commits.", '[git-debrebase convert-from-dgit-view drop-patches]' ]; } $work = make_commit [ $work, $u->{Commit} ], [ 'git-debrebase convert-from-dgit-view: declare upstream', '(Re)constructed breakwater merge.', '[git-debrebase anchor: declare upstream]' ]; runcmd @git, qw(checkout --quiet -b mk), $work; if ($some_patches) { runcmd @git, qw(checkout), $head, qw(-- debian/patches); runcmd @git, qw(reset --quiet); # We deliberately run with dirty patches, so want --ignore-new # but it isn't available everywhere playtree_write_gbp_conf('true'); my @gbp_cmd = (qw(gbp pq import)); if (!$diagnose) { my $gbp_err = "../gbp-pq-err"; @gbp_cmd = shell_cmd "exec >$gbp_err 2>&1", @gbp_cmd; } my $r = system @gbp_cmd; playtree_write_gbp_conf(); if ($r) { print STDERR f_ " %s: couldn't apply patches: gbp pq %s", $u->{Source}, waitstatusmsg(); return; } } my $work = git_rev_parse qw(HEAD); my $diffout = cmdoutput @git, qw(diff-tree --stat HEAD), $work; if (length $diffout) { print STDERR f_ " %s: applying patches gives different tree\n", $u->{Source}; print STDERR $diffout if $diagnose; return; } # OMG! $u->{Result} = $work; $result = $u; }; last if $result; } if (!$result) { fail __ <{Source}; my $out_diff = get_differs $result->{Result}, $head; if ($out_diff & (D_UPS | DS_DEB)) { print STDERR "\n", f_ <{Result}; Result of applying debian/patches/ onto the upstream is not the same as HEAD. (Applying patches gave the commit %s) Perhaps the upstream is not right, or not all of the delta is in d/patches. END runcmd @git, qw(--no-pager diff --stat), $result->{Result}, $head, qw( -- :!/debian/patches :/); snag 'conversion-mismatch', __ "Output of conversion does not match input!"; } complete_convert_from $head, $result->{Result}, $gdrlastinfo, 'convert-from-dgit-view'; } sub cmd_forget_was_ever_debrebase () { badusage __ "forget-was-ever-debrebase takes no further arguments" if @ARGV; my ($ffqstatus, $ffq_msg, $current, $ffq_prev, $gdrlast) = ffq_prev_branchinfo(); fail f_ "Not suitable for recording git-debrebaseness anyway: %s", $ffq_msg if defined $ffq_msg; push @deferred_updates, "delete $ffq_prev"; push @deferred_updates, "delete $gdrlast"; snags_maybe_bail(); run_deferred_updates "forget-was-ever-debrebase"; } sub cmd_record_resolved_merge () { badusage "record-resolved-merge takes no further arguments" if @ARGV; # MERGE-TODO needs documentation my $new = get_head(); my $method; print "Checking how you have resolved the merge problem\n"; my $nope = sub { print "Not $method: @_"; 0; }; my $maybe = sub { print "Seems to be $method.\n"; }; my $yes = sub { my ($key, $ref) = @_; reflog_cache_insert $merge_cache_ref, $key, $ref; print "OK. You can switch branches and try git-debrebase again.\n"; 1; }; fresh_workarea 'merge'; sub { $method = 'vanilla-merge patchqueue'; my $vanilla = git_get_ref "$wrecknoteprefix/vanilla-merge"; $vanilla or return $nope->("wreckage was not of vanilla-merge"); foreach my $lr (qw(left right)) { my $n = "$wrecknoteprefix/$lr-patchqueue"; my $lrpq = git_get_ref $n; $lrpq or return $nope->("wreckage did not contain patchqueues"); is_fast_fwd $lrpq, $new or return $nope->("HEAD not ff of $n"); } $maybe->(); my $newbase = git_get_ref "$wrecknoteprefix/new-base" or die "wreckage element $wrecknoteprefix/new-base missing"; my $result = merge_series_patchqueue_convert {}, $newbase, $new; $yes->("vanilla-merge $vanilla", $result); 1; }->() or sub { fail "No resolved merge method seems applicable.\n"; }->(); } sub cmd_downstream_rebase_launder_v0 () { badusage "needs 1 argument, the baseline" unless @ARGV==1; my ($base) = @ARGV; $base = git_rev_parse $base; my $old_head = get_head(); my $current = $old_head; my $topmost_keep; for (;;) { if ($current eq $base) { $topmost_keep //= $current; print " $current BASE stop\n"; last; } my $cl = classify $current; print " $current $cl->{Type}"; my $keep = 0; my $p0 = $cl->{Parents}[0]{CommitId}; my $next; if ($cl->{Type} eq 'Pseudomerge') { print " ^".($cl->{Contributor}{Ix}+1); $next = $cl->{Contributor}{CommitId}; } elsif ($cl->{Type} eq 'AddPatches' or $cl->{Type} eq 'Changelog') { print " strip"; $next = $p0; } else { print " keep"; $next = $p0; $keep = 1; } print "\n"; if ($keep) { $topmost_keep //= $current; } else { die "to-be stripped changes not on top of the branch\n" if $topmost_keep; } $current = $next; } if ($topmost_keep eq $old_head) { print "unchanged\n"; } else { print "updating to $topmost_keep\n"; update_head_checkout $old_head, $topmost_keep, 'downstream-rebase-launder-v0'; } } setlocale(LC_MESSAGES, ""); textdomain("git-debrebase"); getoptions_main (__ "bad options\n", "D+" => \$debuglevel, 'noop-ok!', 'f=s' => \@snag_force_opts, 'anchor=s' => \@opt_anchors, '--dgit=s' => \($dgit[0]), 'force!', 'experimental-merge-resolution!', \$opt_merges, '-i:s' => sub { my ($opt,$val) = @_; badusage f_ "%s: with git-debrebase, get-rebase -i option may only be followed by more options (as separate arguments)", $us if length $val; confess if $opt_defaultcmd_interactive; # should not happen $opt_defaultcmd_interactive = [ qw(-i) ]; # This access to @ARGV is excessive familiarity with # Getopt::Long, but there isn't another sensible # approach. '-i=s{0,}' does not work with bundling. push @$opt_defaultcmd_interactive, @ARGV; @ARGV=(); }, 'help' => sub { print __ $usage_message or confess "$!"; finish 0; }, ); initdebug('git-debrebase '); enabledebug if $debuglevel; changedir_git_toplevel(); $rd = fresh_playground "$playprefix/misc"; @opt_anchors = map { git_rev_parse $_ } @opt_anchors; if (!@ARGV || $opt_defaultcmd_interactive || $ARGV[0] =~ m{^-}) { defaultcmd_rebase(); } else { my $cmd = shift @ARGV; my $cmdfn = $cmd; $cmdfn =~ y/-/_/; $cmdfn = ${*::}{"cmd_$cmdfn"}; $cmdfn or badusage f_ "unknown git-debrebase sub-operation %s", $cmd; $cmdfn->(); } finish 0; work/git-debrebase.1.pod0000644000000000000000000004417014761250142012276 0ustar =head1 NAME git-debrebase - tool to maintain series of Debian changes to upstream source =head1 SYNOPSYS git-debrebase [] [-- ] git-debrebase [] [ =head1 QUICK REFERENCE These are most of the commands you will regularly need: git debrebase -i # edit the patch queue git debrebase conclude && git push # push to eg salsa git debrebase conclude && dgit push-source # source-only upload git debrebase new-upstream 1.2.3-1 [-i] # uses tag, eg "v1.2.3" dpkg-buildpackage -uc -b # get test debs, at any time To add patches, or edit the packaging, just make git commits. Ignore anything that may appear in debian/patches. Avoid using "git pull" and "git merge" without "--ff-only". When sharing branches, you should usually share a fast-forwarding branch (ie, use C (or C) before pushing. git-debrebase has a special branch format, so see "CONVERTING AN EXISTING PACKAGE" in L. =head1 GUIDE TO DOCUMENTATION This is the command line reference. There is also a detailed workflow tutorial at L (on which the above "QUICK REFERENCE" is based). For background, theory of operation, and definitions see L. You should read this manpage in conjunction with L, which defines many important terms used here. =head1 PRINCIPAL OPERATIONS =over =item git-debrebase [-- ] =item git-debrebase [-i ] Unstitches and launders the branch. (See L below.) Then, if any git-rebase options were supplied, edits the Debian delta queue, using git-rebase, by running git rebase Do not pass a base branch argument: git-debrebase will supply that. Do not use --onto, or --fork-point. Useful git-rebase options include -i and --autosquash. If git-rebase stops for any reason, you may git-rebase --abort, --continue, or --skip, as usual. If you abort the git-rebase, the branch will still have been laundered, but everything in the rebase will be undone. The options for git-rebase must either start with C<-i>, or be prececded by C<-->, to distinguish them from options for git-debrebase. It is hazardous to use plain git-rebase on a git-debrebase branch, because git-rebase has a tendency to start the rebase too far back in history, and then drop important commits. See L =item git-debrebase status Analyses the current branch, both in terms of its contents, and the refs which are relevant to git-debrebase, and prints a human-readable summary. Please do not attempt to parse the output; it may be reformatted or reorganised in the future. Instead, use one of the L described below. =item git-debrebase conclude Finishes a git-debrebase session, tidying up the branch and making it fast forward again. Specifically: if the branch is unstitched, launders and restitches it, making a new pseudomerge. Otherwise, it is an error, unless --noop-ok. =item git-debrebase quick Unconditionally launders and restitches the branch, consuming any ffq-prev and making a new pseudomerge. If the branch is already laundered and stitched, does nothing. =item git-debrebase prepush [--prose=] If the branch is unstitched, stitches it, consuming ffq-prev. This is a good command to run before pushing to a git server. You should consider using B instead, because that launders the branch too. =item git-debrebase stitch [--prose=] Stitches the branch, consuming ffq-prev. If there is no ffq-prev, it is an error, unless --noop-ok. You should consider using B or B instead. =item git-debrebase scrap Throws away all the work since the branch was last stitched. This is done by resetting you to ffq-prev and discarding all working tree changes. If you are in the middle of a git-rebase, will abort that too. =item git-debrebase new-upstream [...] [--|-i ] Rebases the delta queue onto a new upstream version. In detail: Firstly, checks that the proposed rebase seems to make sense: It is a snag unless the new upstream(s) are fast forward from the previous upstream(s) as found in the current breakwater anchor. And, in the case of a multi-piece upstream (a multi-component upstream, in dpkg-source terminology), if the pieces are not in the same order, with the same names. If all seems well, unstitches and launders the branch. Then, generates (in a private working area) a new anchor merge commit, on top of the breakwater tip, and on top of that a commit to update the version number in debian/changelog. Finally, starts a git-rebase of the delta queue onto these new commits. That git-rebase may complete successfully, or it may require your assistance, just like a normal git-rebase. If you git-rebase --abort, the whole new upstream operation is aborted, except for the laundering. may be a whole new Debian version, including revision, or just the upstream part, in which case -1 will be appended to make the new Debian version. The are, optionally, in order: =over =item The new upstream branch (or commit-ish). The default is to look for one of these tags, in this order: U vU upstream/U; where U is the new upstream version. (This is the same algorithm as L.) It is a snag if the upstream contains a debian/ directory; if forced to proceed, git-debrebase will disregard the upstream's debian/ and take (only) the packaging from the current breakwater. =item Specifies that this is a multi-piece upstream. May be repeated. When such a pair is specified, git-debrebase will first combine the pieces of the upstream together, and then use the result as the combined new upstream. For each , the tree of the becomes the subdirectory in the combined new upstream (supplanting any subdirectory that might be there in the main upstream branch). has a restricted syntax: it may contain only ASCII alphanumerics and hyphens. The combined upstream is itself recorded as a commit, with each of the upstream pieces' commits as parents. The combined commit contains an annotation to allow a future git-debrebase new upstream operation to make the coherency checks described above. =item These will be passed to git rebase. If the upstream rebase is troublesome, -i may be helpful. As with plain git-debrebase, do not specify a base, or --onto, or --fork-point. =back If you are planning to generate a .dsc, you will also need to have, or generate, actual orig tarball(s), which must be identical to the rev-spec(s) passed to git-debrebase. git-debrebase does not concern itself with source packages so neither helps with this, nor checks it. L, L, L and L may be able to help. =item git-debrebase make-patches [--quiet-would-amend] Generate patches in debian/patches/ representing the changes made to upstream files. It is not normally necessary to run this command explicitly. When uploading to Debian, dgit and git-debrebase will cooperate to regenerate patches as necessary. When working with pure git remotes, the patches are not needed. Normally git-debrebase make-patches will require a laundered branch. (A laundered branch does not contain any patches.) But if there are already some patches made by git-debrebase make-patches, and all that has happened is that more changes to upstream files have been committed, running it again can add the missing patches. If the patches implied by the current branch are not a simple superset of those already in debian/patches, make-patches will fail with exit status 7, and an error message. (The message can be suppressed with --quiet-would-amend.) If the problem is simply that the existing patches were not made by git-debrebase, using dgit quilt-fixup instead should succeed. =item git-debrebase convert-from-unapplied [] =item git-debrebase convert-from-gbp [] Converts any of the following into a git-debrebase interchange branch: =over =item a gbp patches-unapplied branch (but not a gbp pq patch-queue branch) =item a patches-unapplied git packaging branch containing debian/patches, as used with quilt =item a git branch for a package which has no Debian delta - ie where upstream files are have not been modified in Debian, so there are no patches =back (These two commands operate identically and are simply aliases.) The conversion is done by generating a new anchor merge, converting any quilt patches as a delta queue, and dropping the patches from the tree. The upstream commit-ish should correspond to the upstream branch or tag, if there is one. It is a snag if it is not an ancestor of HEAD, or if the history between the upstream and HEAD contains commits which make changes to upstream files. If it is not specified, the same algorithm is used as for git-debrebase new-upstream. It is also a snag if the specified upstream has a debian/ subdirectory. This check exists to detect certain likely user errors, but if this situation is true and expected, forcing it is fine. git-debrebase will try to look for the dgit archive view of the most recent release, and if it finds it will make a pseduomerge so that your new git-debrebase view is appropriately fast forward. The result is a well-formed git-debrebase interchange branch. The result is also fast-forward from the original branch. It is a snag if the new branch looks like it will have diverged, just as for a laundering/unstitching call to git-debrebase; See L, below. Note that it is dangerous not to know whether you are dealing with a (gbp) patches-unapplied branch containing quilt patches, or a git-debrebase interchange branch. At worst, using the wrong tool for the branch format might result in a dropped patch queue! =back =head1 UNDERLYING AND SUPPLEMENTARY OPERATIONS =over =item git-debrebase breakwater Prints the breakwater tip commitid. If your HEAD branch is not fully laundered, prints the tip of the so-far-laundered breakwater. =item git-debrebase anchor Prints the breakwater anchor commitid. =item git-debrebase analyse Walks the history of the current branch, most recent commit first, back until the most recent anchor, printing the commit object id, and commit type and info (ie the semantics in the git-debrebase model) for each commit. =item git-debrebase record-ffq-prev Establishes the current branch's ffq-prev, as discussed in L, but does not launder the branch or move HEAD. It is an error if the ffq-prev could not be recorded. It is also an error if an ffq-prev has already been recorded, unless --noop-ok. =item git-debrebase convert-to-gbp Converts a laundered branch into a gbp patches-unapplied branch containing quilt patches. The result is not fast forward from the interchange branch, and any ffq-prev is deleted. This is provided mostly for the test suite and for unusual situations. It should only be used with care and with a proper understanding of the underlying theory. Be sure to not accidentally treat the result as a git-debrebase branch, or you will drop all the patches! =item git-debrebase convert-from-dgit-view [] [upstream] Converts any dgit-compatible git branch corresponding to a (possibly hypothetical) 3.0 quilt dsc source package into a git-debrebase-compatible branch. This operation should not be used if the branch is already in git-debrebase form. Normally git-debrebase will refuse to continue in this case (or silently do nothing if the global --noop-ok option is used). Some representation of the original upstream source code will be needed. If I is supplied, that must be a suitable upstream commit. By default, git-debrebase will look first for git tags (as for new-upstream), and then for orig tarballs which it will ask dgit to process. The upstream source must be exactly right and all the patches in debian/patches must be up to date. Applying the patches from debian/patches to the upstream source must result in exactly your HEAD. The output is laundered and stitched. The resulting history is not particularly pretty, especially if orig tarball(s) were imported to produce a synthetic upstream commit. The available convert-options are as follows. (These must come after convert-from-dgit-view.) =over =item --[no-]diagnose Print additional error messages to help diagnose failure to find an appropriate upstream. --no-diagnose is the default. =item --build-products-dir Directory to look in for orig tarballs. The default is the git config option dgit.default.build-products-dir or failing that, C<..>. Passed on to dgit, if git-debrebase invokes dgit. =item --[no-]origs Whether to try to look for or use any orig tarballs. --origs is the default. =item --[no-]tags Whether to try to look for or use any upstream git tags. --tags is the default. =item --always-convert-anyway Perform the conversion operation, producing unpleasant extra history, even if the branch seems to be in git-debrebase form already. This should not be done unless necessary, and it should not be necessary. =back =item git-debrebase forget-was-ever-debrebase Deletes the ffq-prev and debrebase-last refs associated with this branch, that git-debrebase and dgit use to determine whether this branch is managed by git-debrebase, and what previous head may need to be stitched back in. This can be useful if you were just playing with git-debrebase, and have used git-reset --hard to go back to a commit before your experiments. Do not use this if you expect to run git-debrebase on the branch again. =back =head1 OPTIONS This section documents the general options to git-debrebase (ie, the ones which immediately follow git-debrebase or git debrebase on the command line). Individual operations may have their own options which are docuented under each operation. =over =item -f Turns snag(s) with id into warnings. Some troublesome things which git-debrebase encounters are Bs. (The specific instances are discussed in the text for the relevant operation.) When a snag is detected, a message is printed to stderr containing the snag id (in the form C<-f>), along with some prose. If snags are detected, git-debrebase does not continue, unless the relevant -f is specified, or --force is specified. =item --force Turns all snags into warnings. See the -f option. Do not invoke git-debrebase --force in scripts and aliases; instead, specify the particular -f for expected snags. =item --noop-ok Suppresses the error in some situations where git-debrebase does nothing, because there is nothing to do. The specific instances are discussed in the text for the relvant operation. =item --anchor= Treats as an anchor. This overrides the usual logic which automatically classifies commits as anchors, pseudomerges, delta queue commits, etc. It also disables some coherency checks which depend on metadata extracted from its commit message, so it is a snag (C<-fanchor-treated>) if is the anchor for the previous upstream version in git-debrebase new-upstream operations. You have to check yourself that the new upstream is fast forward from the old one, and has the right components (as if applicable). =item --dgit= Run , instead of dgit from PATH, when invocation of dgit is necessary. This is provided mostly for the benefit of the test suite. =item -D Requests (more) debugging. May be repeated. =item --experimental-merge-resolution Enable experimental code for handling general merges (see L). If using this option succeeds, the output is likely to be correct, although it would be a good idea to check that it seems sane. If it fails, your tree should be left where it was. However, there may be lossage of various kinds, including misleading error messages, and references to nonexistent documentation. On merge failure, it might invite you to delve into an incomprehensible pile of multidimensional merge wreckage, which is supposed to be left in special refs invented for the purpose (so, not your working tree, or HEAD). =back =head1 UNSTITCHING AND LAUNDERING Several operations unstitch and launder the branch first. In detail this means: =head2 Establish the current branch's ffq-prev If ffq-prev is not yet recorded, git-debrebase checks that the current branch is ahead of relevant remote tracking branches. The relevant branches depend on the current branch (and its git configuration) and are as follows: =over =item The branch that git would merge from (remote..merge, remote..remote); =item The branch git would push to, if different (remote..pushRemote etc.); =item For local dgit suite branches, the corresponding tracking remote; =item If you are on C, remotes/dgit/dgit/sid. =back The apparently relevant ref names to check are filtered through branch..ffq-ffrefs, which is a semicolon-separated list of glob patterns, each optionally preceded by !; first match wins. In each case it is a snag if the local HEAD is behind the checked remote, or if local HEAD has diverged from it. All the checks are done locally using the remote tracking refs: git-debrebase does not fetch anything from anywhere. If these checks pass, or are forced, git-debrebse then records the current tip as ffq-prev. =head2 Examine the branch git-debrebase analyses the current HEAD's history to find the anchor in its breakwater, and the most recent breakwater tip. =head2 Rewrite the commits into laundered form Mixed debian+upstream commits are split into two commits each. Delta queue (upstream files) commits bubble to the top. Pseudomerges, and quilt patch additions, are dropped. This rewrite will always succeed, by construction. The result is the laundered branch. =head1 SEE ALSO git-debrebase(1), dgit-maint-debrebase(7), dgit(1), gitglossary(7) work/git-debrebase.5.pod0000644000000000000000000005064414761250142012305 0ustar =head1 NAME git-debrebase - git data model for Debian packaging =head1 INTRODUCTION git-debrebase is a tool for representing in git, and manpulating, Debian packages based on upstream source code. The Debian packaging has a fast forwarding history. The delta queue (changes to upstream files) is represented as a series of individual git commits, which can worked on with rebase, and also shared. =head2 DISCUSSION git-debrebase is designed to work well with dgit. git-debrebase can also be used in workflows without source packages, for example to work on Debian-format packages outside or alongside Debian. git-debrebase itself is not very suitable for use by Debian derivatives, to work on packages inherited from Debian, because it assumes that you want to throw away any packaging provided by your upstream. However, use of git-debrebase in Debian does not make anything harder for derivatives, and it can make some things easier. When using gitk on branches managed by git-debrebase, B, B and B (or B) produce more useful output than the default. =head1 TERMINOLOGY =over =item Pseudomerge A merge which does not actually merge the trees; instead, it is constructed by taking the tree from one of the parents (ignoring the contents of the other parents). These are used to make a rewritten history fast forward from a previous tip, so that it can be pushed and pulled normally. Manual construction of pseudomerges can be done with C but is not normally needed when using git-debrebase. =item Packaging files Files in the source tree within B, excluding anything in B. =item Upstream The version of the package without Debian's packaging. Typically provided by the actual upstream project, and sometimes tracked by Debian contributors in a branch C. Upstream contains upstream files, but some upstreams also contain packaging files in B. Any such non-upstream files found in upstream are thrown away by git-debrebase each time a new upstream version is incorporated. =item Upstream files Files in the source tree outside B. These may include unmodified source from upstream, but also files which have been modified or created for Debian. =item Delta queue Debian's changes to upstream files: a series of git commits. =item Quilt patches Files in B generated for the benefit of dpkg-source's 3.0 (quilt) .dsc source package format. Not used, often deleted, and regenerated when needed (such as when uploading to Debian), by git-debrebase. =item Interchange branch; breakwater; stitched; laundered See L. =item Anchor; Packaging See L. =item ffq-prev; debrebase-last See L. =back =head1 DIAGRAM ------/--A!----/--B3!--%--/--> interchange view / / / with debian/ directory % % % entire delta queue applied / / / 3.0 (quilt) has debian/patches / / 3* "master" on Debian git servers / / / 2* 2* 2 / / / 1 1 1 breakwater branch, merging baseline / / / unmodified upstream code ---@-----@--A----@--B--C plus debian/ (but no debian/patches) / / / no ref refers to this: we --#-----#-------#-----> upstream reconstruct its identity by inspecting interchange branch Key: 1,2,3 commits touching upstream files only A,B,C commits touching debian/ only B3 mixed commit (eg made by an NMUer) # upstream releases -@- anchor merge, takes contents of debian/ from the / previous `breakwater' commit and rest from upstream -/- pseudomerge; contents are identical to / parent lower on diagram. % dgit- or git-debrebase- generated commit of debian/patches. `3.0 (quilt)' only; generally dropped by git-debrebase. * Maintainer's HEAD was here while they were editing, before they said they were done, at which point their tools made -/- (and maybe %) to convert to the fast-forwarding interchange branch. ! NMUer's HEAD was here when they said `dgit push'. Rebase branch launderer turns each ! into an equivalent *. =head1 BRANCHES AND BRANCH STATES - OVERVIEW git-debrebase has one primary branch, the B. This branch is found on Debian contributors' workstations (typically, a maintainer would call it B), in the Debian dgit git server as the suite branch (B) and on other git servers which support Debian work (eg B on salsa). The interchange branch is fast-forwarding (by virtue of pseudomerges, where necessary). It is possible to have multiple different interchange branches for the same package, stored as different local and remote git branches. However, divergence should be avoided where possible - see L. A suitable interchange branch can be used directly with dgit. In this case each dgit archive suite branch is a separate interchange branch. Within the ancestry of the interchange branch, there is another important, implicit branch, the B. The breakwater contains unmodified upstream source, but with Debian's packaging superimposed (replacing any C directory that may be in the upstream commits). The breakwater does not contain any representation of the delta queue (not even debian/patches). The part of the breakwater processed by git-debrebase is the part since the most recent B, which is usually a special merge generated by git-debrebase. When working, locally, the user's branch can be in a rebasing state, known as B. While a branch is unstitched, it is not in interchange format. The previous interchange branch tip is recorded, so that the previous history and the user's work can later be stitched into the fast-forwarding interchange form. An unstitched branch may be in B state, which means it has a more particular special form convenient for manipulating the delta queue. =head1 BRANCH CONTENTS - DETAILED SPECIFICATION It is most convenient to describe the B branch first. A breakwater is B, but is not usually named by a ref. It contains B (ancestors first): =over =item Anchor An B commit, which is usually a special two-parent merge: The first parent contains the most recent version, at that point, of the Debian packaging (in debian/); it also often contains upstream files, but they are to be ignored. Often the first parent is a previous breakwater tip. The second parent is an upstream source commit. It may sometimes contain a debian/ subdirectory, but if so that is to be ignored. The second parent's upstream files are identical to the anchor's. Anchor merges always contain C<[git-debrebase anchor: ...]> as a line in the commit message. Alternatively, an anchor may be a single-parent commit which introduces the C directory and makes no other changes: ie, the start of Debian packaging. =item Packaging Zero or more single-parent commits containing only packaging changes. (And no quilt patch changes.) =back The B branch state is B. A laundered branch is based on a breakwater but also contains, additionally, B the breakwater, a representation of the delta queue: =over =item Delta queue commits Zero or more single-parent commits containing only changes to upstream files. =back The merely B (ie, unstitched but unlaundered) branch state is also B. It has the same contents as the laundered state, except that it may contain, additionally, B: =over =item Linear commits to the source Further commit(s) containing changes to to upstream files and/or to packaging, possibly mixed within a single commit. (But not quilt patch changes.) =item Quilt patch addition for `3.0 (quilt)' Commit(s) which add patches to B, and add those patches to the end of B. These are only necessary when working with packages in C<.dsc 3.0 (quilt)> format. For git-debrebase they are purely an output; they are deleted when branches are laundered. git-debrebase takes care to make a proper patch series out of the delta queue, so that any resulting source packages are nice. =back Finally, an B branch is B. It has the same contents as an unlaundered branch state, but may (and usually will) additionally contain (in some order, possibly intermixed with the extra commits which may be found on an unstitched unlaundered branch): =over =item Pseudomerge to make fast forward A pseudomerge making the branch fast forward from previous history. The contributing parent is itself in interchange format. Normally the overwritten parent is a previous tip of an interchange branch, but this is not necessary as the overwritten parent is not examined. If the two parents have identical trees, the one with the later commit date (or, if the commit dates are the same, the first parent) is treated as the contributing parent. =item dgit dsc import pseudomerge Debian .dsc source package import(s) made by dgit (during dgit fetch of a package most recently uploaded to Debian without dgit, or during dgit import-dsc). git-debrebase requires that each such import is in the fast-forwarding format produced by dgit: a two-parent pseudomerge, whose contributing parent is in the non-fast-forwarding dgit dsc import format (not described further here), and whose overwritten parent is the previous interchange tip (eg, the previous tip of the dgit suite branch). =back =head1 STITCHING, PSEUDO-MERGES, FFQ RECORD Whenever the branch C is unstitched, the previous head is recorded in the git ref C. Unstiched branches are not fast forward from the published interchange branches [1]. So before a branch can be pushed, the right pseudomerge must be reestablished. This is the stitch operation, which consumes the ffq-prev ref. When the user has an unstitched branch, they may rewrite it freely, from the breakwater tip onwards. Such a git rebase is the default operation for git-debrebase. Rebases should not go back before the breakwater tip, and certainly not before the most recent anchor. Unstitched branches must not be pushed to interchange branch refs (by the use of C or equivalent). It is OK to share an unstitched branch in similar circumstances and with similar warnings to sharing any other rebasing git branch. [1] Strictly, for a package which has never had a Debian delta queue, the interchange and breakwater branches may be identical, in which case the unstitched branch is fast forward from the interchange branch and no pseudomerge is needed. When ffq-prev is not present, C records some ancestor of refs/B, (usually, the result of last stitch). This is used for status printing and some error error checks - especially for printing guesses about what a problem is. To determine whether a branch is being maintained in git-debrebase form it is necessary to walk its history. =head1 OTHER MERGES Note that the representation described here does not permit general merges on any of the relevant branches. For this reason the tools will try to help the user avoid divergence of the interchange branch. See dgit-maint-debrebase(7) for a discussion of what kinds of behaviours should be be avoided because they might generate such merges. Automatic resolution of divergent interchange branches (or laundering of merges on the interchange branch) is thought to be possible, but there is no tooling for this yet: Nonlinear (merging) history in the interchange branch is awkward because it (obviously) does not preserve the linearity of the delta queue. Easy merging of divergent delta queues is a research problem. Nonlinear (merging) history in the breakwater branch is in principle tolerable, but each of the parents would have to be, in turn, a breakwater, and difficult questions arise if they don't have the same anchor. We use the commit message annotation to distinguish the special anchor merges from other general merges, so we can at least detect unsupported merges. =head1 LEGAL OPERATIONS The following basic operations follow from this model (refer to the diagram above): =over =item Append linear commits No matter the branch state, it is always fine to simply git commit (or cherry-pick etc.) commits containing upstream file changes, packaging changes, or both. (This may make the branch unlaundered.) =item Launder branch Record the previous head in ffq-prev, if we were stitched before (and delete debrebase-last). Reorganise the current branch so that the packaging changes come first, followed by the delta queue, turning C<-@-A-1-2-B3> into C<...@-A-B-1-2-3>. Drop pseudomerges and any quilt patch additions. =item Interactive rebase With a laundered branch, one can do an interactive git rebase of the delta queue. =item New upstream rebase Start rebasing onto a new upstream version, turning C<...#..@-A-B-1-2-3> into C<(...#..@-A-B-, ...#'-)@'-1-2>. This has to be a wrapper around git-rebase, which prepares @' and then tries to rebase 1 2 onto @'. If the user asks for an interactive rebase, @' doesn't appear in the commit list, since @' is the newbase of the rebase (see git-rebase(1)). Note that the construction of @' cannot fail because @' simply copies debian/ from B and and everything else from #'. (Rebasing A and B is undesirable. We want the debian/ files to be non-rebasing so that git log shows the packaging history.) =item Stitch Make a pseudomerge, whose contributing parent is the unstitched branch and whose overwritten parent is ffq-prev, consuming ffq-prev in the process (and writing debrebase-last instead). Ideally the contributing parent would be a laundered branch, or perhaps a laundered branch with a quilt patch addition commit. =item Commit quilt patches To generate a tree which can be represented as a 3.0 (quilt) .dsc source package, the delta queue must be reified inside the git tree in B. These patch files can be stripped out and/or regenerated as needed. =back =head1 ILLEGAL OPERATIONS Some git operations are not permitted in this data model. Performing them will break git-debrebase. =over =item General merges See L, above. =item git-rebase starting too soon, or without base argument git-rebase must not be invoked in such a way that the chosen base is before the anchor, or before the last pseudomerge. This is because git-rebase mangles merges. git rebase --preserve-merges is also dangerous. git-rebase without a base argument will often start too early. For these reasons, it is better to use git-debrebase and let it choose the base for your rebase. If you do realise you have made this mistake, it is best to use the reflog to recover to a suitable good previous state. =item Editing debian/patches debian/patches is an output from git-debrebase, not an input. If you edit patches git-debrebase will complain and refuse to work. If you add patches your work is likely to be discarded. Instead of editing patches, use git-debrebase to edit the corresponding commits. =item Renaming (etc.) branch while unstitched The previous HEAD, which will be pseudomerged over by operations like git-debrebase stitch, is recorded in a ref name dervied from your branch name. If you rename unstitched branches, this information can get out of step. Conversely, creating a new branch from an unstitched branch is good for making a branch to play about in, but the result cannot be stitched. =back =head1 COMMIT MESSAGE ANNOTATIONS git-debrebase makes annotations in the messages of commits it generates. The general form is [git-debrebase COMMIT-TYPE [ ARGS...]: PROSE, MORE PROSE] git-debrebase treats anything after the colon as a comment, paying no attention to PROSE. The full set of annotations is: [git-debrebase split: mixed commit, debian part] [git-debrebase split: mixed commit, upstream-part] [git-debrebase convert dgit import: debian changes] [git-debrebase anchor: convert dgit import, upstream changes] [git-debrebase upstream-combine . PIECE[ PIECE...]: new upstream] [git-debrebase anchor: new upstream NEW-UPSTREAM-VERSION, merge] [git-debrebase changelog: new upstream NEW-UPSTREAM-VERSION] [git-debrebase make-patches: export and commit patches] [git-debrebase convert-from-gbp: drop patches] [git-debrebase anchor: declare upstream] [git-debrebase pseudomerge: stitch] [git-debrebase merged-breakwater: constructed from vanilla merge] [git-debrebase convert-to-gbp: commit patches] [git-debrebase convert-from-dgit-view upstream-import-convert: VERSION] [git-debrebase convert-from-dgit-view drop-patches] Only anchor merges have the C<[git-debrebase anchor: ...]> tag. Single-parent anchors are not generated by git-debrebase, and when made manually should not contain any C<[git-debrebase ...]> annotation. The C and C tags are added to the pre-existing commit message, when git-debrebase rewrites the commit. =head1 APPENDIX - DGIT IMPORT HANDLING The dgit .dsc import format is not documented or specified (so some of the following terms are not defined anywhere). The dgit import format it is defined by the implementation in dgit, of which git-debrebase has special knowledge. Consider a non-dgit NMU followed by a dgit NMU: interchange --/--B3!--%--//----D*--> / / % 4 / 3 / 2 / 1 2 &_ / /| \ 1 0 00 =XBC% / / --@--A breakwater / --#--------> upstream Supplementary key: =XBC% dgit tarball import of .debian.tar.gz containing Debian packaging including changes B C and quilt patches 0 dgit tarball import of upstream tarball 00 dgit tarball import of supplementary upstream piece &_ dgit import nearly-breakwater-anchor // dgit fetch / import-dsc pseudomerge to make fast forward &' git-debrebase converted import (upstream files only) C' git-debrebase converted packaging change import * ** before and after HEAD We want to transform this into: =over =item I. No new upstream version (0 + 00 eq #) --/--B3!--%--//-----D*-------------/--> / / / % 4 4** / 3 3 / 2 2 / 1 1 2 &_ / / /| \ / 1 0 00 =XBC% / / / / / --@--A-----B---------------------C'---D / --#-----------------------------------------> =item II. New upstream (0 + 00 neq #) --/--B3!--%--//-----D*-------------/--> / / / % 4 4** / 3 3 / 2 2 / 1 1 2 &_ / / /| \ / 1 0 00 =XBC% / / / / / --@--A-----B-----------------@---C'---D / / --#--------------------- - - / - - ---------> / &' /| 0 00 =back =head1 SEE ALSO git-debrebase(1), dgit-maint-rebase(7), dgit(1) work/git-playtree-setup0000755000000000000000000000227414761250142012427 0ustar #!/bin/bash # # usage: # rm -rf .git/some/play/thing # git-playtree-setup .git/some/play/thing # or: # mkdir .git/some/play/thing # cd .git/some/play/thing # git-playtree-setup . # # Honours GIT_PLAYTREE_DEFAULT_BRANCH, which currently defaults to "master" set -e${GIT_PLAYTREE_SETUP_DEBUG} target=$1; shift case "$#.$target" in 0.[^-]*) ;; *) echo >&2 'bad usage' ; exit 8 ;; esac [ "x$target" = x. ] || mkdir $target cd $target gcd=$(cd .. && git rev-parse --git-common-dir) case "$gcd" in /*) ;; *) gcd="../$gcd" ;; esac git -c init.defaultBranch=${GIT_PLAYTREE_DEFAULT_BRANCH-master} init -q git config gc.auto 0 git config diff.noprefix 0 unset_all () { git config --local --unset-all $key || [ $? = 5 ]; } for key in \ user.email user.name user.useConfigOnly \ core.sharedRepository \ core.compression core.looseCompression \ core.bigFileThreshold core.fsyncObjectFiles \ ; do unset_all ( git --git-dir="$gcd" config -z --get-all $key || [ $? = 1 ] ) | xargs -n1 -0r -- \ git config --local --add $key done rm -rf .git/objects ln -s "$gcd/objects" .git/objects work/i18n-common.make0000644000000000000000000000146114761250142011636 0ustar # dgit translation common make file components # Copyright (C)2018 Ian Jackson # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . e=set -e; exec >$@.tmp f=mv -f $@.tmp $@ o= >$@.tmp && $f S=@ # Set S='' to see commands being run work/i18n-diff-auditor0000755000000000000000000003404214761250142012013 0ustar #!/usr/bin/perl -w # # i18n-diff-auditor # Copyright (C)2018 Ian Jackson # GPLv3+, NO WARRANTY, see below. # # # Usage: # something like this # git-log -n1 -p | ./i18n-diff-auditor -D 2>&1 |less -j10 +/'^!.*' # # -D is for debug. Currently only one level. # # Output is the relevant diff hunks, with each line prepended with # space for ok lines and ! for questionable ones, and with relevant # diff lines prepended with lines starting !! (and lines starting # # for debug output), so ovrall: # # !! reasoning for subsequent questionable diff line(s) # !+ diff line found to be questionable # !- diff line found to be questionable # @@@ etc. diff furniture # + diff line checked and ok # - diff line checked and ok # # debug output (normally precedes relevant output) # # Changes are generally marked as ok if they correspond to a known # intended code change pattern. (That includes changing error calls # to different error calls.) If they don't correspond to any known # pattern, they are "questionable" and the first thing that doesn't # match the most common pattern is reported. # # Might be useful for projects other than dgit, provided it uses # the same gettext aliases (__ f_ i_) and similar error calls # (die, confess, fail). # # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . use strict; use Carp; use Data::Dumper; use Getopt::Long; our $debug = 0; GetOptions("debug|D+" => \$debug ); our @debug; sub debug ($$) { my ($i,$s) = @_; push @{ $debug[$i] }, $s if $debug; } my @d = <>; unshift @d, "# dummy line to make line 1 index 1 in \@d\n"; our $i_last_l_ok = -1; our $count_i_last_l_ok; sub l_ok ($) { my ($i) = @_; if ($i == $i_last_l_ok) { confess $i if $count_i_last_l_ok++ > 50; } else { $count_i_last_l_ok = 0; $i_last_l_ok = $i; } return unless $i < @d; $_ = $d[$i]; #print STDERR "L $i\n"; 1; } sub l ($) { my ($i) = @_; confess $i unless l_ok $i; }; our $perlop_text = <<'END'; # c&p from man perlop left terms and list operators (leftward) left -> nonassoc ++ -- right ** right ! ~ \ and unary + and - left =~ !~ left * / % x left + - . left << >> nonassoc named unary operators nonassoc < > <= >= lt gt le ge nonassoc == != <=> eq ne cmp ~~ left & left | ^ left && left || // nonassoc .. ... right ?: right = += -= *= etc. goto last next redo dump left , => nonassoc list operators (rightward) right not left and left or xor **= += *= &= &.= <<= &&= -= /= |= |.= >>= ||= .= %= ^= ^.= //= x= END our $perlop_re; sub prep_perlop () { my @ops; foreach (split /\n/, $perlop_text) { next unless m{\S}; s{\s+$}{}; s{^\s+}{}; s{^(?: left | right | nonassoc ) \s+}{}x; next if m{^terms and list operators}; next if m{^named unary}; next if m{^list operators}; s{ and unary.*}{}; s{ etc\. }{ }; s{\?\:}{ ? : }; foreach my $op (split /\s+/) { next unless length $op; next if $op =~ m{^\w+$}; $op =~ s/\W/\\$&/g; push @ops, $op; } } $perlop_re = '(?: '.(join ' | ', @ops).' )'; $perlop_re = qr{$perlop_re}x; #print STDERR "$perlop_re\n"; } prep_perlop(); our ($ifilehead, $ifirsthunkhead); our ($ihunkhead, $ihunkend); our ($ichunkstart, $ichunkend); our ($before, $after); sub is_string ($) { $_[0]{T} =~ m/heredoc|string/; } sub is_trans ($) { grep { $_[0]{E} eq $_ } qw(__ f_ i_); } sub qp ($) { my ($p) = @_; $p =~ s{\\}{\\\\}g; $p =~ s{\'}{\\'}g; $p =~ s{\n}{\\n}g; $p =~ s{\t}{\\t}g; return "'$p'"; }; sub semiparse ($) { ($_) = @_; my @o; #my $in = $_; # entries contain # T type # E exact input text (does not contain here doc contents) # P something to print in messages # V value, only for: heredoc string # Q quote characcter, only for: heredoc string for (;;) { s{^\s+}{}; if (s{^[\$\@\%]?[_0-9a-zA-Z]+}{}) { push @o, { T => 'ident', E => $&, P => $& }; } elsif (s{^\<\<(['"]?)([A-Z_]+)\1}{}) { my ($q,$d) = ($1,$2); $q ||= '"'; push @o, { T => 'heredoc', Q => $q, Delim => $d, E => $&, P => "<<$q$d$q" }; if (s{^ ( .* \n ) ( (?: (?! $d \n ) .* \n )*? ) $d \n }{ $1 }xe) { $o[$#o]{V} = $2; } else { m{^.*\n} or confess; $_ = $&; $o[$#o]{V} = $'; $o[$#o]{Invented} = 1; } } elsif (s{^ (["'])( (?: [^\\'"] | \\ [^"'] | (?! \1 ) [^"] )* ) \1 }{}x) { my ($q,$v) = ($1,$2); push @o, { T => 'string', E => $&, P => "$q$q", Q => $q, V => $v}; } elsif (s{^$perlop_re|^\;}{}) { push @o, { T => 'op', E => $&, P => $& }; } elsif (s/^[[{(]//) { push @o, { T => 'bra', E => $&, P => $& }; } elsif (s/^[]})]//) { push @o, { T => 'ket', E => $&, P => $& }; } elsif (s/^( [\$\@\%] )( \{ )//x) { push @o, { T => 'deref', E => $1, P => $1 }, { T => 'bra', E => $2, P => $2 }; } elsif (s/^ [\$\@\%] [^[^{] //x) { push @o, { T => 'specvar', E => $&, P => $& }; } elsif (!length) { last; } elsif (s{^\#.*\n}{}) { } else { m{^.{0,10}}; die "cannot tokenise \`$&'"; } } for (my $i=0; $i+2 < @o; $i++) { next unless $o[$i+1]{E} eq '.'; my @inputs = @o[$i, $i+2]; #print STDERR Dumper(\@inputs); next if grep { !is_string($_) } @inputs; my $q = $inputs[0]{Q}; next if grep { $_->{Q} ne $q } @inputs; next if grep { $_->{Invented} } @inputs; my $new = { T => 'joinedstrings', E => (join '.', map { $_->{E} } @inputs), P => (join '.', map { $_->{P} } @inputs), V => (join '', map { $_->{V} } @inputs), Q => $q, }; @o = (@o[0..$i-1], $new, @o[$i+3..$#o]); $i--; # counteracts $i++ } debug $ichunkstart, "semiparsed: ".join ' ', map { $_->{P} } @o; # debug $ichunkstart, "semiparsed V: ".join ' ', map { defined $_->{V} ? ">$_->{V}<" : '-' } @o; return @o; } our @analysed_x; our @analysed_y; sub analyse_chunk_core () { $before //= ''; die "plain deletion\n" unless defined $after; my @xs = semiparse $before; my @ys = semiparse $after; @analysed_x = @analysed_y = (); my $next_something = sub { my ($ary,$anal,$var,$what) = @_; die "ran out of $what\n" unless @$ary; my $r = shift @$ary; push @$anal, $r->{P}; $$var = $r; }; my ($x,$y); my $next_x = sub { $next_something->(\@xs, \@analysed_x, \$x, 'before'); }; my $next_y = sub { $next_something->(\@ys, \@analysed_y, \$y, 'after' ); }; our @y_expect_suffix = (); ANALYSE: for (;;) { while (my $e = shift @y_expect_suffix) { $next_y->(); $y->{E} eq $e or die "suffix mismatch, expected $e got $y->{E}\n"; } last unless @xs or @ys; $next_x->(); $next_y->(); next if $x->{E} eq $y->{E}; next if $x->{E} eq 'sprintf' and $y->{E} eq 'f_'; next if $x->{E} eq 'die' and $y->{E} eq 'confess'; next if $x->{E} eq 'die' and $y->{E} eq 'fail'; foreach my $with_fh (qw(0 1)) { next unless $x->{E} eq 'printf'; next unless $y->{E} eq 'print'; next unless @xs >= $with_fh; next unless @ys > $with_fh; if ($with_fh) { next unless $xs[0]{E} eq $ys[0]{E}; next unless $xs[0]{E} =~ m{^[A-Z]+$} or $xs[0]{T} eq 'ident' && $xs[0]{E} =~ m{^\$}; } next unless $ys[$with_fh]{E} eq 'f_'; # yay! $next_x->() if $with_fh; $next_y->() if $with_fh; $next_y->(); # f_ next ANALYSE; } if ($y->{E} eq '+' and @ys >= 3 and $ys[0]{E} eq '(' and is_trans($ys[1])) { $next_y->(); # ( $next_y->(); # __ f_ i_ @y_expect_suffix = ')'; } elsif ($y->{E} eq '(' and @ys > 2 and is_trans($ys[0]) and @analysed_y and (grep { $_ eq $analysed_y[-1] } (qw( => [ { ? : . ), '(', ',') )) { $next_y->(); # __ f_ i_ @y_expect_suffix = ')'; } my $string_changed; my $ye = $y->{E}; if (is_trans($y)) { $next_y->(); die "__ on non-string $y->{P}\n" unless is_string($y); die "__ on was non-string $x->{P}\n" unless is_string($x); if ($y->{Q} ne "'") { die "var subst in new string\n" if $y->{V} =~ m{(?{V} eq $x->{V}; die "__ string quote changed\n" unless $y->{Q} eq $x->{Q}; }; $string_changed = $@; } if ($ye eq '__') { $_ = $y->{V}; die "percent $& in __ ' string\n" if m{\%}; die $string_changed if length $string_changed; next; } if ($ye eq 'i_') { die $string_changed if length $string_changed; next; } if ($ye eq 'f_') { my $fmt = $y->{V}; die "no percent in f_ string\n" unless $fmt =~ m{\%}; next unless $string_changed; die "f_ old string '-quoted\n" if $x->{Q} ne '"'; my $xs = $x->{V}; my $exactly = sub { my ($lit, $what) = @_; my $xl = substr($xs, 0, length($lit)); if ($xl ne $lit) { debug $ichunkstart, "not exactly x: ..".qp($xs); debug $ichunkstart, "not exactly y: ".qp($lit); my $next = @ys ? $ys[0]{P} : '(end)'; die "string contents mismatch near $what before $next\n"; } $xs = substr($xs, length($lit)); }; for (;;) { #print STDERR Dumper($fmt, $xs, \@xs, @ys); if ($fmt !~ m{\%[^\%]}) { $exactly->($fmt, '(tail)'); $fmt = ''; die "text deleted from end of string: ".qp($xs)."\n" if length $xs; last; } $exactly->($`, '(literal)'); $fmt = $'; if ($& eq '%%') { $exactly->('%', '%%'); next; } elsif ($& ne '%s') { die "unhandled %-subst $&\n"; } $next_y->(); die "expected comma, got $y->{P}\n" unless $y->{E} eq ','; if (!length $fmt and !length $xs and @xs and $xs[0]{E} eq '.') { # X has "" . # Y has "%s" [other args] , $next_x->(); # eat the '.' next; } if ($xs =~ m{^\@}) { $next_y->(); die "\@... => not string" unless is_string($y); die "\@... => $y->{P}" if $y->{Q} ne '"'; $exactly->($y->{V}, $y->{P}); next; } my $bras = 0; for (;;) { if (!$bras and !@ys) { last; } $next_y->(); if (!$bras and (grep { $y->{E} eq $_ } qw( or xor and not ; : if unless while when ) or $y->{E} eq ',' or $y->{T} eq 'ket' )) { # lookahead shows close of containing scope # or lower precedence operator unshift @ys, $y; pop @analysed_y; last; } $xs =~ s{^\s+}{} if $bras; if (is_string($y) and $y->{Q} eq '"') { $exactly->($y->{V}, $y->{P}); next; } $exactly->($y->{E}, $y->{P}); if ($y->{T} eq 'bra' or $y->{E} eq '?') { $bras++; } elsif ($y->{T} eq 'ket' or $y->{E} eq ':') { die "too many kets at $y->{E}\n" unless $bras; $bras--; } } } next; } die "mismatch $x->{P} => $y->{P}\n"; } } sub analyse_chunk () { for (;;) { eval { analyse_chunk_core(); }; return unless length $@; if ($@ =~ m{^missing end of here doc (\S+)\n}) { # fudge this # (this never happens now, but in the future we might # want this code again eg to try adding to the chunk) $before .= "\n$1\n"; $after .= "\n$1\n"; next; } else { die $@; } } } our @report; our $last_filehead = -1; sub report_on_hunk () { return unless @report; if ($last_filehead != $ifilehead) { foreach (my $i=$ifilehead; $i<$ifirsthunkhead; $i++) { print $d[$i]; } $last_filehead = $ifilehead; } my $dummy_r = { S => (scalar @d)+1, E => (scalar @d)+1 }; my $r; for (my $i=$ihunkhead; ; $i++) { for (;;) { $r //= shift @report; $r //= $dummy_r; last if $i < $r->{E}; confess unless $r->{Done} == 03; $r = undef; } last unless $i<$ihunkend; foreach my $ds (@{ $debug[$i] }) { print "# $ds\n"; } if ($i == $r->{S}) { print "!! $r->{M}"; $r->{Done} |= 01; } if ($i >= $r->{S}) { print "!"; $r->{Done} |= 02; } else { print " "; } print $d[$i]; } confess unless $r = $dummy_r; } for ($ifilehead = 0; l_ok $ifilehead; $ifilehead++) { m{^diff} or next; $ifirsthunkhead = $ifilehead; while (l_ok $ifirsthunkhead and m{^diff|^index|^---|^\Q+++\E}) { $ifirsthunkhead++ } $ihunkhead = $ifirsthunkhead; while (l_ok $ihunkhead) { m{^\@\@} or confess "$ihunkhead $_ ?"; my $i = $ihunkhead + 1; for (; ; $i++) { if (!l_ok $i or m{^ } or m{^\@\@}) { if (defined $ichunkstart) { $ichunkend = $i; eval { analyse_chunk(); 1; }; if (length $@) { debug $ichunkstart, "done x: @analysed_x"; debug $ichunkstart, "done y: @analysed_y"; push @report, { M => $@, S => $ichunkstart, E => $ichunkend }; } $ichunkstart = $ichunkend = $before = $after = undef; } l_ok $i or last; m{^\@\@} and last; } elsif (m{^[-+]}) { my $which = $& eq '-' ? \$before : \$after; $ichunkstart //= $i; $$which //= ''; $$which .= $'; } else { confess "$i $_ ?"; } } $ihunkend = $i; report_on_hunk(); $ichunkend = $i; $ihunkhead = $i; } } work/infra/0000755000000000000000000000000014761250142010027 5ustar work/infra/cgit-regen-config0000755000000000000000000000067714761250142013256 0ustar #!/bin/sh set -e root=/srv/dgit.debian.org repos=$root/unpriv/repos outfile=$root/etc/projects.cgit lockfile=$outfile.lock template=$root/config/cgit-template flock $lockfile -c ' outfile='"$outfile"' repos='"$repos"' exec >"$outfile.tmp" for ff in "$repos"/[0-9a-z]*.git; do f=${ff##*/} p=${f%.git} cat <&2 "dgit-mirror-rsync: $*"; exit 127 } if [ $# -lt 2 ]; then fail "too few arguments"; fi self=$0 case "$self" in /*) ;; */*) self="$PWD/$self" ;; *) ;; esac distrodir=$1; shift action=$1; shift package=$1 repos=$distrodir/repos rsync=(rsync -rltH --safe-links --delete) hooktimeout=30 rsynctimeout=900 rsyncssh='ssh -o batchmode=yes' mirror_gc_cmd='git gc --auto' . $distrodir/mirror-settings # contents of $queue # $queue/$package.n - mirror needed # $queue/$package.a - being attempted, or attempt failed # $queue/$package.lock - lock (with-lock-ex) # $queue/$package.err - stderr from failed (or current) run # $queue/$package.log - stderr from last successful run cd $repos queue=_mirror-queue case "$remoterepos" in *:/*|/*) ;; '') fail "remoterepos config not set" ;; *) fail "remoterepos config does not match *:/* or /*" ;; esac actually () { if [ "x$mirror_gc_cmd" != x ]; then ( cd "$repos/$package.git" $mirror_gc_cmd ) fi "${rsync[@]}" \ --timeout=$rsynctimeout \ -e "$rsyncssh" \ "$repos/$package.git"/. \ "$remoterepos/$package.git" } reinvoke () { newaction="$1"; shift exec \ "$@" \ "$self" "$distrodir" "reinvoke$newaction" "$package" } check-package-mirrorable () { local repo=$repos/$package.git local mode; mode=$(stat -c%a "$repo") case $mode in *5) return 0 ;; *0) return 1 ;; *) echo >&2 "unexpected mode $mode for $repo"; return 1 ;; esac } lock-and-process () { check-package-mirrorable || return 0 reinvoke -locked with-lock-ex -w "$queue/$package.lock" } attempt () { exec 3>&2 >"$queue/$package.err" 2>&1 if actually; then rm -f "$queue/$package.a" exec 2>&3 2>&1 mv -f "$queue/$package.err" "$queue/$package.log" if ! [ -s "$queue/$package.log" ]; then rm "$queue/$package.log" fi rm "$queue/$package.lock" else cat >&3 "$queue/$package.err" exit 127 fi } lock-and-process-baseof-f () { package=${f##*/} package=${package%.*} lock-and-process } case "$action" in updated-hook) check-package-mirrorable || exit 0 touch "$queue/$package.n" reinvoke -timed timeout --foreground $hooktimeout ;; reinvoke-timed) (lock-and-process) >/dev/null 2>&1 ;; mirror) lock-and-process ;; reinvoke-locked) touch "$queue/$package.a" rm -f "$queue/$package.n" attempt ;; backlog) for f in $queue/*.[na]; do (lock-and-process-baseof-f ||:) done ;; all) for f in [a-z0-9]*.git; do (lock-and-process-baseof-f) done ;; setup) test -d "$queue" || mkdir "$queue" ;; *) fail "bad action $action" ;; esac work/infra/dgit-mirror-ssh-wrap0000755000000000000000000000222614761250142013760 0ustar #!/usr/bin/perl -w # Intended to be used as a restricted command. # Usage: # command="/path/to/dgit-mirror-ssh-wrap /srv/repos/ .git --" # or similar. The two substantive arguments are literals. # The example permits writes to directories # /srv/repos/$PACKAGE.git # where $PACKAGE has the syntax of a Debian package name. use strict; die 'bad usage' unless @ARGV==3 && $ARGV[2] eq '--'; our ($prefix, $suffix) = @ARGV; $prefix =~ s/\W/\\$&/g; $suffix =~ s/\W/\\$&/g; my $package = qr{[0-9a-z][-+.0-9a-z]*}; my $d = qr{$prefix$package$suffix}; my $command = $ENV{SSH_ORIGINAL_COMMAND} // die "missing SSH_ORIGINAL_COMMAND"; #print STDERR ">$d<\n"; $_ = $command; m{^rsync --server -lHtre\.iLsfxC --timeout=\d+ --delete --safe-links \. $d$} || m{^rsync --server -lHtre\.iLsfxCIv --timeout=\d+ --delete --safe-links \. $d$} || m{^rsync --server -lHtre\.iLsfxCIvu --timeout=\d+ --delete --safe-links \. $d$} # To add a new command pattern, add || m{^ ... $} above. # The pattern should contain $d where the per-package destination # directory would go. or die "dgit-mirror-ssh-wrap: unexpected command (rsync upgraded?): $command\n"; exec $& or die $!; work/infra/dgit-repos-admin-debian0000755000000000000000000001365514761250142014352 0ustar #!/usr/bin/perl -w # dgit repos policy admin script for Debian # # Copyright (C) 2015-2016 Ian Jackson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . use strict; use Debian::Dgit::Infra; # must precede Debian::Dgit; - can change @INC! use Debian::Dgit; setup_sigwarn(); our $usage = <<'END'; usage: dgit-repos-admin-debian [] operation... options: --git-dir /path/to/git/repo/or/working/tree --repos /path/to/dgit/repos/directory } alternatives --db /path/to/dgit/repos/policy.sqlite3 } (at least one of above required; if only one, cwd is used for other) operations: create-db list-taints taint [--global|] '' untaint [--global|] END use POSIX; use DBI; use Debian::Dgit::Policy::Debian; sub badusage ($) { die "bad usage: $_[0]\n$usage"; } use Getopt::Long qw(:config posix_default gnu_compat bundling); our ($git_dir,$repos_dir,$db_path); GetOptions("git-dir=s" => \$git_dir, "repos=s" => \$repos_dir, "db=s" => \$db_path) or die $usage; $db_path //= poldb_path($repos_dir) if defined $repos_dir; $db_path // $repos_dir || die <<'END'.$usage; Must supply --git-dir and/or --repos (or --db instead of --repos). If only one of --git-dir and --repos is supplied, other is taken to be current working directory. END # / $git_dir //= '.'; $repos_dir //= '.'; our $p; our $gitobjid; sub get_package_objid () { $p = shift @ARGV; $p // badusage "operation needs package or --global"; if ($p eq '--global') { $p = ''; } else { $p =~ m/^$package_re$/ or badusage 'package name or --global needed'; } $gitobjid = shift @ARGV; $gitobjid // badusage "operation needs git object id"; $gitobjid =~ m/\W/ && badusage "invalid git object id"; } sub sort_out_git_dir () { foreach my $sfx ('/.git', '') { my $path = "$git_dir/$sfx"; if (stat_exists "$path/objects") { $ENV{GIT_DIR} = $git_dir = $path; return; } } die "git directory $git_dir doesn't seem valid\n"; } sub show_taints ($$@) { my ($m, $cond, @condargs) = @_; my $q = $poldbh->prepare ("SELECT package,gitobjid,gitobjtype,time,comment, ". " (gitobjdata IS NOT NULL) hasdata". " FROM taints WHERE $cond". " ORDER BY package, gitobjid, time"); $q->execute(@condargs); print "$m:\n" or die $!; my $count = 0; while (my $row = $q->fetchrow_hashref) { my $t = strftime "%Y-%m-%dT%H:%M:%S", gmtime $row->{time}; my $objinfo = $row->{gitobjtype}. ($row->{hasdata} ? '+' : ' '); my $comment = $row->{comment}; $comment =~ s/\\/\\\\/g; $comment =~ s/\n/\\n/g; printf(" %s %-30s %s %7s %s\n", $t, $row->{package}, $row->{gitobjid}, $objinfo, $row->{comment}) or die $!; $count++; } return $count; } sub cmd_list_taints ($) { badusage "no args/options" if @ARGV; my $count = show_taints("all taints","1"); printf "%d taints listed\n", $count or die $!; } sub cmd_create_db ($) { badusage "no args/options" if @ARGV; $poldbh->do(<do(<do(<commit; } sub show_taints_bypackage ($) { my ($m) = @_; show_taints($m, "package = ?", $p); } sub show_taints_bygitobjid ($) { my ($m) = @_; show_taints($m, "gitobjid = ?", $gitobjid); } sub show_relevant_taints ($) { my ($what) = @_; show_taints_bypackage($p ? "$what taints for package $p" : "$what global taints"); show_taints_bygitobjid("$what taints for object $gitobjid"); } sub cmd_taint () { get_package_objid(); my $comment = shift @ARGV; $comment // badusage "operation needs comment"; @ARGV && badusage "too many arguments to taint"; sort_out_git_dir(); $!=0; $?=0; my $objtype = `git cat-file -t $gitobjid`; chomp $objtype or die "$? $!"; $poldbh->do("INSERT INTO taints". " (package, gitobjid, gitobjtype, time, comment)". " VALUES (?,?,?,?,?)", {}, $p, $gitobjid, $objtype, time, $comment); $poldbh->commit; print "taint added\n" or die $!; show_relevant_taints("resulting"); } sub cmd_untaint () { get_package_objid(); @ARGV && badusage "too many arguments to untaint"; show_relevant_taints("existing"); my $affected = $poldbh->do("DELETE FROM taints". " WHERE package = ? AND gitobjid = ?", {}, $p, $gitobjid); $poldbh->commit; printf "%d taints removed\n", $affected or die $!; exit $affected ? 0 : 1; } my $cmd = shift @ARGV; $cmd // badusage "need operation"; $cmd =~ y/-/_/; my $fn = ${*::}{"cmd_$cmd"}; $fn or badusage "unknown operation $cmd"; poldb_setup($db_path); $fn->(); work/infra/dgit-repos-policy-debian0000755000000000000000000004702314761250142014555 0ustar #!/usr/bin/perl -w # dgit repos policy hook script for Debian # # Copyright (C) 2015-2019 Ian Jackson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . use strict; use Debian::Dgit::Infra; # must precede Debian::Dgit; - can change @INC! use Debian::Dgit qw(:DEFAULT :policyflags); setup_sigwarn(); use POSIX; use JSON; use File::Temp qw(tempfile); use DBI; use IPC::Open2; use Data::Dumper; use Debian::Dgit::Policy::Debian; initdebug('%'); enabledebuglevel $ENV{'DGIT_DRS_DEBUG'}; END { $? = 127; } # deliberate exit uses _exit our $distro = shift @ARGV // die "need DISTRO"; our $repos = shift @ARGV // die "need DGIT-REPOS-DIR"; our $dgitlive = shift @ARGV // die "need DGIT-LIVE-DIR"; our $distrodir = shift @ARGV // die "need DISTRO-DIR"; our $action = shift @ARGV // die "need ACTION"; our $publicmode = 02775; our $new_upload_propagation_slop = 3600*4 + 100;# fixme config; our $poldbh; our $pkg; our $pkgdir; our ($pkg_exists,$pkg_secret); our $stderr; our ($version,$suite,$tagname); our %deliberately; # We assume that it is not possible for NEW to have a version older # than sid. # Whenever pushing, we check for # source-package-local tainted history # global tainted history # can be overridden by --deliberately except for an admin prohib taint # # ALL of the following apply only if history is secret: # # if NEW has no version, or a version which is not in our history[1] # (always) # check all suites # if any suite's version is in our history[1], publish our history # otherwise discard our history, # tainting --deliberately-include-questionable-history # # if NEW has a version which is in our history[1] # (on push only) # require explicit specification of one of # --deliberately-include-questionable-history # --deliberately-not-fast-forward # (latter will taint old NEW version --d-i-q-h) # (otherwise) # leave it be # # [1] looking for the relevant git tag for the version number and not # caring what that tag refers to. # # When we are doing a push to a fresh repo, any version will do: in # this case, this is the first dgit upload of an existing package, # and we trust that the uploader hasn't included in their git # history any previous non-dgit uploads. # # A wrinkle: if we approved a push recently, we treat NEW as having # a version which is in our history. This is because the package may # still be being uploaded. (We record this using the timestamp of the # package's git repo directory.) # We aim for the following invariants and properties: # # - .dsc of published dgit package will have corresponding publicly # visible dgit-repo (soon) # # - when a new package is rejected we help maintainer avoid # accidentally including bad objects in published dgit history # # - .dsc of NEW dgit package has corresponding dgit-repo but not # publicly readable sub apiquery ($) { my ($subpath) = @_; local $/=undef; my $dgit = "$dgitlive/dgit"; $dgit = "dgit" if !stat_exists $dgit; my $cmd = "$dgit -d$distro \$DGIT_TEST_OPTS"; $cmd .= " -".("D" x $debuglevel) if $debuglevel; $cmd .= " archive-api-query $subpath"; printdebug "apiquery $cmd\n"; $!=0; $?=0; my $json = `$cmd`; defined $json && !$? or die "$subpath $! $?"; my $r = decode_json $json; my $d = new Data::Dumper([$r], [qw(r)]); printdebug "apiquery $subpath | ", $d->Dump() if $debuglevel>=2; return $r; } sub vsn_in_our_history ($) { my ($vsn) = @_; # Eventually, when we withdraw support for old-format (DEP-14 # namespace) tags, we will need to change this to only look # for debiantag_new. See the commit # "Tag change: Update dgit-repos-policy-debian" # (reverting which is a good start for that change). my @tagrefs = map { "refs/tags/".$_ } debiantags $vsn, $distro; printdebug " checking history vsn=$vsn tagrefs=@tagrefs\n"; open F, "-|", qw(git for-each-ref), @tagrefs; $_ = ; close F; return 1 if defined && m/\S/; die "$pkg tagrefs @tagrefs $? $!" if $?; return 0; } sub specific_suite_has_suitable_vsn ($$) { my ($suite, $vsn_check) = @_; # tests $vsn_check->($version) my $in_suite = apiquery "dsc_in_suite/$suite/$pkg"; foreach my $entry (@$in_suite) { my $vsn = $entry->{version}; die "$pkg ?" unless defined $vsn; printdebug " checking history found suite=$suite vsn=$vsn\n"; return 1 if $vsn_check->($vsn); } return 0; } sub new_has_vsn_in_our_history () { return specific_suite_has_suitable_vsn('new', \&vsn_in_our_history); } sub good_suite_has_suitable_vsn ($) { my ($vsn_check) = @_; # as for specific_suite_has_specific_vsn my $suites = apiquery "suites"; foreach my $suitei (@$suites) { my $suite = $suitei->{name}; die unless defined $suite; next if $suite =~ m/\bnew$/; return 1 if specific_suite_has_suitable_vsn($suite, $vsn_check); } return 0; } sub statpackage () { $pkgdir = "$repos/$pkg.git"; if (!stat_exists $pkgdir) { printdebug "statpackage $pkg => ENOENT\n"; $pkg_exists = 0; } else { $pkg_exists = 1; $pkg_secret = !!(~(stat _)[2] & 05); printdebug "statpackage $pkg => exists, secret=$pkg_secret.\n"; } } sub getpackage () { die "need PACKAGE" unless @ARGV >= 1; $pkg = shift @ARGV; die unless $pkg =~ m/^$package_re$/; statpackage(); } sub add_taint ($$) { my ($refobj, $reason) = @_; printdebug "TAINTING $refobj\n", (map { "\%| $_" } split "\n", $reason), "\n"; my $tf = new File::Temp or die $!; print $tf "$refobj^0\n" or die $!; flush $tf or die $!; seek $tf,0,0 or die $!; my $gcfpid = open GCF, "-|"; defined $gcfpid or die $!; if (!$gcfpid) { open STDIN, "<&", $tf or die $!; exec 'git', 'cat-file', '--batch'; die $!; } close $tf or die $!; $_ = ; defined $_ or die; m/^(\w+) (\w+) (\d+)\n/ or die "$_ ?"; my $gitobjid = $1; my $gitobjtype = $2; my $bytes = $3; my $gitobjdata; if ($gitobjtype eq 'commit' or $gitobjtype eq 'tag') { $!=0; read GCF, $gitobjdata, $bytes == $bytes or die "$gitobjid $bytes $!"; } close GCF; $poldbh->do("INSERT INTO taints". " (package, gitobjid, gitobjtype, gitobjdata, time, comment)". " VALUES (?,?,?,?,?,?)", {}, $pkg, $gitobjid, $gitobjtype, $gitobjdata, time, $reason); my $taint_id = $poldbh->last_insert_id(undef,undef,"taints","taint_id"); die unless defined $taint_id; $poldbh->do("INSERT INTO taintoverrides". " (taint_id, deliberately)". " VALUES (?, '--deliberately-include-questionable-history')", {}, $taint_id); } sub add_taint_by_tag ($$) { my ($tagname,$refobjid) = @_; add_taint($refobjid, "tag $tagname referred to this object in git tree but all". " previously pushed versions were found to have been". " removed from NEW (ie, rejected) (or never arrived)"); } sub check_package () { # This is not read-only, but it is safe to call within a # policy-client-query, because it will do one of the following: # # * Do nothing much. # * Find that the package has been ACCEPTed, make it not secret, # and mirror it. # * Find that the package has been REJECTed and add some taints # to the db. This may be rolled back, but that's OK because # future calls will discover the same. # # (This is a consequence of this function being idempotent, # cron-callable, and correct in the sense that it doesn't make # wrongly-sequenced updates to both the DB and the FS.) # # An (often useful) side-effect is to chdir to the package repo. return 0 unless $pkg_exists; return 0 unless $pkg_secret; printdebug "check_package\n"; chdir $pkgdir or die "$pkgdir $!"; stat '.' or die "$pkgdir $!"; my $mtime = ((stat _)[9]); my $age = time - $mtime; printdebug "check_package age=$age\n"; if (good_suite_has_suitable_vsn(\&vsn_in_our_history)) { chmod $publicmode, "." or die $!; $pkg_secret = 0; eval { my $mirror_hook = "$distrodir/mirror-hook"; if (stat_exists $mirror_hook) { my @mirror_cmd = ($mirror_hook, $distrodir, "updated-hook", $pkg); debugcmd " (mirror)",@mirror_cmd; system @mirror_cmd and failedcmd @mirror_cmd; } }; if (length $@) { chomp $@; print STDERR "policy hook: warning:". " failed to mirror publication of \`$pkg':". " $@\n"; } return 0; } return 0 if $age < $new_upload_propagation_slop; return 0 if new_has_vsn_in_our_history(); printdebug "check_package secret, deleted, tainting\n"; git_for_each_ref('refs/tags', sub { my ($objid,$objtype,$fullrefname,$tagname) = @_; add_taint_by_tag($tagname,$objid); }); return FRESHREPO; } sub action_check_package () { getpackage(); return check_package(); } sub getpushinfo () { die unless @ARGV >= 4; $version = shift @ARGV; $suite = shift @ARGV; $tagname = shift @ARGV; my $delibs = shift @ARGV; foreach my $delib (split /\,/, $delibs) { $deliberately{$delib} = 1; } } sub deliberately ($) { return $deliberately{"--deliberately-$_[0]"}; } sub package_questionable_head_msg () { # This lets us reuse some of the same code, and the same message, # for checking during actual push, and for pre-push taint check. # # In principle it might be nicer to unify this code, with some # kind of super realistic dry run push function. However, that # dry run function would have to involve sending the client's git # objects to the server. We wouldn't want to do that twice, so it # would have to be cached somehow, but we don't want to allow # un-signed things to lurk about on the server. (The super dry # run mode would have to involve the server tolerating an unsigned # tag, or something, but that would be OK in principle.) The dry # run mode would have to be careful about what subsets of the # actions it took. # # So instead we apply ad-hoc checks, with separate implementations # for the push path, and the pre-push checks. The tainted-objects # policy-client-query exists to support this: it allows the # efficient reimplementation of the tainted objects check, without # transferring the objects to the server. return undef unless $pkg_exists; return undef unless $pkg_secret; # TODO: ideally this would be translated at the client end but # that would involve marking it i_ here (which is part of # dgit-intrastructure.deb) and then having the string appear in # the po for dgit.deb. return <= 1; my $freshrepo = shift @ARGV; my $initq = $poldbh->prepare(<execute($pkg); my @objscatcmd = qw(git); push @objscatcmd, qw(--git-dir), $freshrepo if length $freshrepo; push @objscatcmd, qw(cat-file --batch); debugcmd '|',@objscatcmd if $debuglevel>=2; my @taintids; my $chkinput = tempfile(); while (my $taint = $initq->fetchrow_hashref()) { push @taintids, $taint->{taint_id}; print $chkinput $taint->{gitobjid}, "\n" or die $!; printdebug '|> ', $taint->{gitobjid}, "\n" if $debuglevel>=2; } flush $chkinput or die $!; seek $chkinput,0,0 or die $!; my $checkpid = open CHKOUT, "-|" // die $!; if (!$checkpid) { open STDIN, "<&", $chkinput or die $!; delete $ENV{GIT_ALTERNATE_OBJECT_DIRECTORIES}; # ^ recent versions of git set this in the environment of # receive hooks. This can cause us to see things which # the user is trying to abolish. exec @objscatcmd or die $!; } my ($taintinfoq,$overridesanyq,$untaintq,$overridesq); my $overridesstmt = <; die "($taintid @objscatcmd) $!" unless defined $_; printdebug "|< ", $_ if $debuglevel>=2; next if m/^\w+ missing$/; die "($taintid @objscatcmd) $_ ?" unless m/^(\w+) (\w+) (\d+)\s/; my ($objid,$objtype,$nbytes) = ($1,$2,$3); my $drop; (read CHKOUT, $drop, $nbytes) == $nbytes or die "($taintid @objscatcmd) $!"; $!=0; $_ = ; die "($taintid @objscatcmd) $!" unless defined $_; die "($taintid @objscatcmd) $_ ?" if m/\S/; $taintinfoq ||= $poldbh->prepare(<execute($taintid); my $ti = $taintinfoq->fetchrow_hashref(); die "($taintid)" unless $ti; printdebug "SQL overrides: @overridesv $taintid /\n$overridesstmt\n"; $overridesq ||= $poldbh->prepare($overridesstmt); $overridesq->execute(@overridesv, $taintid); my ($ovwhy) = $overridesq->fetchrow_array(); my $ovstatus; if (!defined $ovwhy) { $overridesanyq ||= $poldbh->prepare(<execute($taintid); my ($ovany) = $overridesanyq->fetchrow_array(); $ovwhy = $ovany ? '' : undef; $mustreject = 1; } else { $untaintq ||= $poldbh->prepare(<execute($taintid); } $stderr .= tainted_objects_message({ %$ti, gitobjid => $objid, gitobjtype => $objtype, }, $ovstatus, \%hinted); } close CHKOUT; if ($mustreject) { $stderr .= <> 1)); printdebug sprintf "chmod %#o (was %#o) %s\n", $newmode, $oldmode, $freshrepo; chmod $newmode, $freshrepo or die $!; utime undef, undef, $freshrepo or die $!; } } return 0; } sub action_check_list () { opendir L, "$repos" or die "$repos $!"; while (defined (my $dent = readdir L)) { next unless $dent =~ m/^($package_re)\.git$/; $pkg = $1; statpackage(); next unless $pkg_exists; next unless $pkg_secret; print "$pkg\n" or die $!; } closedir L or die $!; close STDOUT or die $!; return 0; } sub polclqu_tainted_objects () { check_package(); my $suite = shift @ARGV // die "need SUITE"; my $topq = $poldbh->selectall_arrayref(< {} }, $pkg); foreach my $row (@$topq) { my $delibs = $poldbh->selectall_arrayref(<{taint_id}); $row->{overrides} = [ map { $_->[0] } @$delibs ]; delete $row->{taint_id}; # remove any undef entries, for nice json foreach my $k (keys %$row) { defined $row->{$k} or delete $row->{$k}; } } if (defined(my $questionable_head_msg = package_questionable_head_msg())) { # We would reject this in push. We need to arrange that the # client will detect this. The object tainting mechanism can # be (ab)used for this: we tell the client that HEAD is tainted. my $head = git_rev_parse(server_ref($suite).'~0'); push @$topq, { gitobjtype => 'commit', gitobjid => $head, comment => 'Package is in NEW, need a --deliberately', hint => $questionable_head_msg, # If the client was told -d-i-q-h, then they can go ahead - # our push will be placated. If the client was told -d-n-f-f # then presumably they aren't sending the old HEAD, so there # won't be a tainted object reachable from their head - so # -d-n-f-f isn't listed here. After all, this is for controlling # when the client will regard this as a blocking problem, not # for advising the user about overriding options. overrides => [qw(--deliberately-include-questionable-history)] }; } print encode_json $topq, "\n" or die $!; } my $fn_name; if ($action eq 'policy-client-query') { getpackage(); my $query = shift @ARGV // die "need QUERY-OP"; $fn_name = "polclqu_$query"; } else { $fn_name = "action_$action"; } $fn_name =~ y/-/_/; my $fn = ${*::}{$fn_name}; if (!$fn) { printdebug "dgit-repos-policy-debian: unknown $fn_name\n"; _exit 0; } my $sleepy=0; my $rcode; my $db_busy_exception= 'Debian::Dgit::Policy::Debian::DB_BUSY'; my @orgargv = @ARGV; for (;;) { @ARGV = @orgargv; eval { poldb_setup(poldb_path($repos), sub { $poldbh->{HandleError} = sub { return 0 unless $poldbh->err == 5; # SQLITE_BUSY, not in .pm :-( die bless { }, $db_busy_exception; }; eval ($ENV{'DGIT_RPD_TEST_DBLOOP_HOOK'}//''); die $@ if length $@; # used by tests/tests/debpolicy-dbretry }); $stderr = ''; $rcode = $fn->(); if ($action eq 'policy-client-query') { close STDOUT or die $!; _exit 0; } else { die unless defined $rcode; $poldbh->commit; printdebug "poldbh commit\n"; } }; last unless length $@; die $@ unless ref $@ eq $db_busy_exception; die if $sleepy >= 20; $sleepy++; print STDERR "[policy database busy, retrying (${sleepy}s)]\n"; eval { $poldbh->rollback; }; } print STDERR $stderr or die $!; flush STDERR or die $!; _exit $rcode; work/infra/dgit-repos-policy-trusting0000755000000000000000000000210514761250142015202 0ustar #!/bin/bash # # This is a genuine policy, not just one for testing. # # It allows anyone authorised to push to also, on demand: # - wipe the repo and replace it with a new one # (with --deliberately-fresh-repo) # - do non-fast-forward pushes # (with --deliberately-not-fast-forward) set -e case "$DGIT_DRS_DEBUG" in ''|0) exec 3>/dev/null ;; 1) exec 3>&2 ;; *) exec 3>&2; set -x ;; esac distro=$1 ; shift reposdir=$1 ; shift livedir=$1 ; shift distrodir=$1 ; shift action=$1 ; shift echo >&3 "dgit-repos-policy-trusting: action=$action" case "$action" in push|push-confirm) ;; *) exit 0 ;; esac package=$1 ; shift version=$1 ; shift suite=$1 ; shift tagname=$1 ; shift delibs=$1 ; shift bitmask=0 policyflags () { perl -e ' use Debian::Dgit::Infra; use Debian::Dgit qw(:policyflags); print '$1',"\n" ' } set -e case "$action//,$delibs," in push//*,--deliberately-fresh-repo,*) bitmask=$(( bitmask | `policyflags 'NOFFCHECK|FRESHREPO'` )) ;; push//*,--deliberately-not-fast-forward,*) bitmask=$(( bitmask | `policyflags 'NOFFCHECK'` )) ;; esac exit $bitmask work/infra/dgit-repos-server0000755000000000000000000012232314761250142013341 0ustar #!/usr/bin/perl -w # dgit-repos-server # # git protocol proxy to check dgit pushes etc. # # Copyright (C) 2014-2017,2019 Ian Jackson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # usages: # dgit-repos-server DISTRO DISTRO-DIR AUTH-SPEC [] --ssh # dgit-repos-server DISTRO DISTRO-DIR AUTH-SPEC [] --cron # dgit-repos-server DISTRO DISTRO-DIR AUTH-SPEC [] \ # --tag2upload URL TAGNAME # settings # --repos=GIT-REPOS-DIR default DISTRO-DIR/repos/ # --suites=SUITES-FILE default DISTRO-DIR/suites # --suites-master=SUITES-FILE default DISTRO-DIR/suites-master # --policy-hook=POLICY-HOOK default DISTRO-DIR/policy-hook # --mirror-hook=MIRROR-HOOK default DISTRO-DIR/mirror-hook # --dgit-live=DGIT-LIVE-DIR default DISTRO-DIR/dgit-live # (DISTRO-DIR is not used other than as default and to pass to policy # and mirror hooks) # internal usage: # .../dgit-repos-server --pre-receive-hook PACKAGE # # Invoked as the ssh restricted command # # Works like git-receive-pack # # SUITES-FILE is the name of a file which lists the permissible suites # one per line (#-comments and blank lines ignored). For --suites-master # it is a list of the suite(s) which should, when pushed to, update # `master' on the server (if fast forward). # # AUTH-SPEC is a :-separated list of # KEYRING.GPG,AUTH-SPEC # where AUTH-SPEC is one of # a # mDM.TXT # (With --cron AUTH-SPEC is not used and may be the empty string.) use strict; use Carp; use IO::Handle; use Debian::Dgit::Infra; # must precede Debian::Dgit; - can change @INC! use Debian::Dgit qw(:DEFAULT :policyflags); setup_sigwarn(); # DGIT-REPOS-DIR contains: # git tree (or other object) lock (in acquisition order, outer first) # # _tmp/PACKAGE_prospective ! } SAME.lock, held during receive-pack # # _tmp/PACKAGE_incoming$$ ! } SAME.lock, held during receive-pack # _tmp/PACKAGE_incoming$$_fresh ! } # # PACKAGE.git } PACKAGE.git.lock # PACKAGE_garbage } (also covers executions of # PACKAGE_garbage-old } policy hook script for PACKAGE) # PACKAGE_garbage-tmp } # policy* } (for policy hook script, covered by # } lock only when invoked for a package) # # leaf locks, held during brief operaton only: # # _empty } SAME.lock # _empty.new } # # _template } SAME.lock # # locks marked ! may be held during client data transfer # What we do on push is this: # - extract the destination repo name # - make a hardlink clone of the destination repo # - provide the destination with a stunt pre-receive hook # - run actual git-receive-pack with that new destination # as a result of this the stunt pre-receive hook runs; it does this: # + understand what refs we are allegedly updating and # check some correspondences: # * we are updating only refs/tags/[archive/]DISTRO/* and refs/dgit/* # * and only one of each # * and the tag does not already exist # and # * recover the suite name from the destination refs/dgit/ ref # + disassemble the signed tag into its various fields and signature # including: # * parsing the first line of the tag message to recover # the package name, version and suite # * checking that the package name corresponds to the dest repo name # * checking that the suite name is as recovered above # + verify the signature on the signed tag # and if necessary check that the keyid and package are listed in dm.txt # + check various correspondences: # * the signed tag must refer to a commit # * the signed tag commit must be the refs/dgit value # * the name in the signed tag must correspond to its ref name # * the tag name must be [archive/]debian/ (massaged as needed) # * the suite is one of those permitted # * the signed tag has a suitable name # * run the "push" policy hook # * replay prevention for --deliberately-not-fast-forward # * check the commit is a fast forward # * handle a request from the policy hook for a fresh repo # + push the signed tag and new dgit branch to the actual repo # # If the destination repo does not already exist, we need to make # sure that we create it reasonably atomically, and also that # we don't every have a destination repo containing no refs at all # (because such a thing causes git-fetch-pack to barf). So then we # do as above, except: # - before starting, we take out our own lock for the destination repo # - we create a prospective new destination repo by making a copy # of _template # - we use the prospective new destination repo instead of the # actual new destination repo (since the latter doesn't exist) # - after git-receive-pack exits, we # + check that the prospective repo contains a tag and head # + rename the prospective destination repo into place # # Cleanup strategy: # - We are crash-only # - Temporary working trees and their locks are cleaned up # opportunistically by a program which tries to take each lock and # if successful deletes both the tree and the lockfile # - Prospective working trees and their locks are cleaned up by # a program which tries to take each lock and if successful # deletes any prospective working tree and the lock (but not # of course any actual tree) # - It is forbidden to _remove_ the lockfile without removing # the corresponding temporary tree, as the lockfile is also # a stampfile whose presence indicates that there may be # cleanup to do # # Policy hook scripts are invoked like this: # POLICY-HOOK-SCRIPT DISTRO DGIT-REPOS-DIR DGIT-LIVE-DIR DISTRO-DIR ACTION... # ie. # POLICY-HOOK-SCRIPT ... check-list [...] # POLICY-HOOK-SCRIPT ... check-package PACKAGE [...] # POLICY-HOOK-SCRIPT ... push PACKAGE \ # VERSION SUITE TAGNAME DELIBERATELIES [...] # POLICY-HOOK-SCRIPT ... push-confirm PACKAGE \ # VERSION SUITE TAGNAME DELIBERATELIES FRESH-REPO|'' [...] # POLICY-HOOK-SCRIPT ... policy-client-query PACKAGE POL-CL-QUERY [...] # # DELIBERATELIES is like this: --deliberately-foo,--deliberately-bar,... # POL-CL-QUERY is in the syntax of a package name # # Exit status of policy hook is a bitmask. # Bit weight constants are defined in Dgit.pm. # NOFFCHECK (2) # suppress dgit-repos-server's fast-forward check ("push" only) # FRESHREPO (4) # blow away repo right away (ie, as if before push or fetch) # ("check-package" and "push" only) # NOCOMMITCHECK (8) # suppress dgit-repos-server's check that commits do # not lack "committer" info (eg as produced by #849041) # ("push" only) # any unexpected bits mean failure, and then known set bits are ignored # if no unexpected bits set, operation continues (subject to meaning # of any expected bits set). So, eg, exit 0 means "continue normally" # and would be appropriate for an unknown action. # # cwd for push and push-confirm is a temporary repo where the incoming # objects have been received; TAGNAME is the version-based tag. # # FRESH-REPO is '' iff the repo for this package already existed, or # the pathname of the newly-created repo which will be renamed into # place if everything goes well. (NB that this is generally not the # same repo as the cwd, because the objects are first received into a # temporary repo so they can be examined.) In this case FRESH-REPO # contains exactly the objects and refs that will appear in the # destination if push-confirm approves. # # if push requested FRESHREPO, push-confirm happens in the old working # repo and FRESH-REPO is guaranteed not to be ''. # # policy hook for a particular package will be invoked only once at # a time - (see comments about DGIT-REPOS-DIR, above) # # check-list and check-package are invoked via the --cron option. # First, without any locking, check-list is called. It should produce # a list of package names (one per line). Then check-package will be # invoked for each named package, in each case after taking an # appropriate lock. # # If policy hook wants to run dgit (or something else in the dgit # package), it should use DGIT-LIVE-DIR/dgit (etc.), or if that is # ENOENT, use the installed version. # # POL-CL-QUERY is one of the following: # # tainted-objects SUITE # => [ { "gitobjid": "sha", # "comment": $string, # in server"s native language, UTF-8 # "overrides": [ "--deliberately-include-q-h", ... ], # # optional (may be absent, not null): # "gitobjtype": "commit", # as from git-cat-file -t # "time": $time_t, # "hint": $string, # client should translate if it can # } } # # Arguments after POL-CL-QUERY cannot contain `;` or whitespace; # they are obtained by dgit-ssh-dispatch by naive whitespace-splitting # a string from SSH_ORIGINAL_COMMAND. # # (Response value is JSON unless otherwise specified.) # If POL-CL-QUERY is not supported, the server will exit successfully # producing no output. # # Mirror hook scripts are invoked like this: # MIRROR-HOOK-SCRIPT DISTRO-DIR ACTION... # and currently there is only one action invoked by dgit-repos-server: # MIRROR-HOOK-SCRIPT DISTRO-DIR updated-hook PACKAGE [...] # # Exit status of the mirror hook is advisory only. The mirror hook # runs too late to do anything useful about a problem, so the only # effect of a mirror hook exiting nonzero is a warning message to # stderr (which the pushing user should end up seeing). # # If the mirror hook does not exist, it is silently skipped. use POSIX; use Fcntl qw(:flock); use File::Path qw(rmtree); use File::Temp qw(tempfile); initdebug(''); our $func; our $dgitrepos; our $package; our $distro; our $suitesfile; our $suitesformasterfile; our $policyhook; our $mirrorhook; our $dgitlive; our $distrodir; our $destrepo; our $workrepo; our $keyrings; our @lockfhs; our @deliberatelies; our %previously; our $policy; our @policy_args; #----- utilities ----- sub realdestrepo () { "$dgitrepos/$package.git"; } sub acquirelock ($$) { my ($lock, $must) = @_; my $fh; printdebug sprintf "locking %s %d\n", $lock, $must; for (;;) { close $fh if $fh; $fh = new IO::File $lock, ">" or die "open $lock: $!"; my $ok = flock $fh, $must ? LOCK_EX : (LOCK_EX|LOCK_NB); if (!$ok) { die "flock $lock: $!" if $must; printdebug " locking $lock failed\n"; return undef; } next unless stat_exists $lock; my $want = (stat _)[1]; stat $fh or die $!; my $got = (stat _)[1]; last if $got == $want; } return $fh; } sub acquirermtree ($$) { my ($tree, $must) = @_; my $fh = acquirelock("$tree.lock", $must); if ($fh) { push @lockfhs, $fh; rmtree $tree; } return $fh; } sub locksometree ($) { my ($tree) = @_; acquirelock("$tree.lock", 1); } sub lockrealtree () { locksometree(realdestrepo); } sub mkrepotmp () { ensuredir "$dgitrepos/_tmp" }; sub removedtagsfile () { "$dgitrepos/_removed-tags/$package"; } sub recorderror ($) { my ($why) = @_; my $w = $ENV{'DGIT_DRS_WORK'}; # we are in stunthook if (defined $w) { chomp $why; open ERR, ">", "$w/drs-error" or die $!; print ERR $why, "\n" or die $!; close ERR or die $!; return 1; } return 0; } sub reject ($) { my ($why) = @_; recorderror "reject: $why"; die "\ndgit-repos-server: reject: $why\n\n"; } sub policyhook { my ($policyallowbits, @polargs) = @_; # => ($exitstatuspolicybitmap); die if $policyallowbits & ~0x3e; my @cmd = ($policyhook,$distro,$dgitrepos,$dgitlive,$distrodir,@polargs); debugcmd '+M',@cmd; my $r = system @cmd; die "system: $!" if $r < 0; die "dgit-repos-server: policy hook failed (or rejected) ($?)\n" if $r & ~($policyallowbits << 8); printdebug sprintf "hook => %#x\n", $r; return $r >> 8; } sub mkemptyrepo ($$) { my ($dir,$sharedperm) = @_; runcmd qw(git init --bare --quiet), "--shared=$sharedperm", $dir; } sub mkrepo_fromtemplate ($) { my ($dir) = @_; my $template = "$dgitrepos/_template"; my $templatelock = locksometree($template); printdebug "copy template $template -> $dir\n"; my $r = system qw(cp -a --), $template, $dir; !$r or die "create new repo $dir failed: $r $!"; close $templatelock; } sub movetogarbage () { # realdestrepo must have been locked my $real = realdestrepo; return unless stat_exists $real; my $garbagerepo = "$dgitrepos/${package}_garbage"; # We arrange to always keep at least one old tree, for recovery # from mistakes. This is either $garbage or $garbage-old. if (stat_exists "$garbagerepo") { printdebug "movetogarbage: rmtree $garbagerepo-tmp\n"; rmtree "$garbagerepo-tmp"; if (rename "$garbagerepo-old", "$garbagerepo-tmp") { printdebug "movetogarbage: $garbagerepo-old -> -tmp, rmtree\n"; rmtree "$garbagerepo-tmp"; } else { die "$garbagerepo $!" unless $!==ENOENT; printdebug "movetogarbage: $garbagerepo-old -> -tmp\n"; } printdebug "movetogarbage: $garbagerepo -> -old\n"; rename "$garbagerepo", "$garbagerepo-old" or die "$garbagerepo $!"; } ensuredir "$dgitrepos/_removed-tags"; open PREVIOUS, ">>", removedtagsfile or die removedtagsfile." $!"; git_for_each_ref([ map { 'refs/tags/'.$_ } debiantags('*',$distro) ], sub { my ($objid,$objtype,$fullrefname,$reftail) = @_; print PREVIOUS "\n$objid $reftail .\n" or die $!; }, $real); close PREVIOUS or die $!; printdebug "movetogarbage: $real -> $garbagerepo\n"; rename $real, $garbagerepo or $! == ENOENT or die "$garbagerepo $!"; } sub policy_checkpackage () { my $lfh = lockrealtree(); $policy = policyhook(FRESHREPO,'check-package',$package); if ($policy & FRESHREPO) { movetogarbage(); } close $lfh; } #----- git-receive-pack ----- sub fixmissing__git_receive_pack () { mkrepotmp(); $destrepo = "$dgitrepos/_tmp/${package}_prospective"; acquirermtree($destrepo, 1); mkrepo_fromtemplate($destrepo); } sub makeworkingclone () { mkrepotmp(); $workrepo = "$dgitrepos/_tmp/${package}_incoming$$"; acquirermtree($workrepo, 1); my $lfh = lockrealtree(); runcmd qw(git clone -l -q --mirror), $destrepo, $workrepo; close $lfh; rmtree "${workrepo}_fresh"; } sub mkscript ($$) { my ($path,$contents) = @_; my $fh = new IO::File $path, O_WRONLY|O_CREAT|O_TRUNC, 0777 or die "$path: $!"; print $fh $contents or die "$path: $!"; close $fh or die "$path: $!"; } sub setupstunthook () { my $prerecv = "$workrepo/hooks/pre-receive"; mkscript $prerecv, <> 8) : "wait status $?"); } } sub maybeinstallprospective () { return if $destrepo eq realdestrepo; if (open REJ, "<", "$workrepo/drs-error") { local $/ = undef; my $msg = ; REJ->error and die $!; print STDERR $msg; exit 1; } else { $!==&ENOENT or die $!; } printdebug " show-ref ($destrepo) ...\n"; my $child = open SR, "-|"; defined $child or die $!; if (!$child) { chdir $destrepo or die $!; exec qw(git show-ref); die $!; } my %got = qw(newtag 0 omtag 0 head 0); while () { chomp or die; printdebug " show-refs| $_\n"; s/^\S*[1-9a-f]\S* (\S+)$/$1/ or die; next if m{^refs/heads/master$}; my $wh = m{^refs/tags/archive/} ? 'newtag' : m{^refs/tags/} ? 'omtag' : m{^refs/dgit/} ? 'head' : die; use Data::Dumper; die if $got{$wh}++; } $!=0; $?=0; close SR or $?==256 or die "$? $!"; printdebug "installprospective ?\n"; die Dumper(\%got)." -- missing refs in new repo" unless $got{head} && grep { m/tag$/ && $got{$_} } keys %got; lockrealtree(); if ($destrepo eq "${workrepo}_fresh") { movetogarbage; } printdebug "install $destrepo => ".realdestrepo."\n"; rename $destrepo, realdestrepo or die $!; remove realdestrepo.".lock" or die $!; } sub main__git_receive_pack () { makeworkingclone(); setupstunthook(); runcmd qw(git receive-pack), $workrepo; dealwithfreshrepo(); maybeinstallprospective(); mirrorhook('updated-hook', $package); } #----- stunt post-receive hook ----- our ($tagname, $tagval, $suite, $oldcommit, $commit); our ($version, %tagh); our ($maint_tagname, $maint_tagval); our ($tagexists_error); sub readupdates () { printdebug " updates ...\n"; my %tags; while () { chomp or die; printdebug " upd.| $_\n"; m/^(\S+) (\S+) (\S+)$/ or die "$_ ?"; my ($old, $sha1, $refname) = ($1, $2, $3); if ($refname =~ m{^refs/tags/(?=(?:archive/)?$distro/)}) { my $tn = $'; #'; $tags{$tn} = $sha1; $tagexists_error= "tag $tn already exists -". " not replacing previously-pushed version" if $old =~ m/[^0]/; } elsif ($refname =~ m{^refs/dgit/}) { reject "pushing multiple heads!" if defined $suite; $suite = $'; #'; $oldcommit = $old; $commit = $sha1; } else { reject "pushing unexpected ref!"; } } STDIN->error and die $!; reject "push is missing tag ref update" unless %tags; my @dtags = grep { m#^archive/# } keys %tags; reject "need exactly one archive/* tag" if @dtags!=1; my @mtags = grep { !m#^archive/# } keys %tags; reject "pushing too many non-dgit tags" if @mtags>1; ($tagname) = @dtags; ($maint_tagname) = @mtags; $tagval = $tags{$tagname}; $maint_tagval = $tags{$maint_tagname // ''}; reject "push is missing head ref update" unless defined $suite; printdebug " updates ok.\n"; } sub readtag () { printdebug " readtag...\n"; open PT, ">dgit-tmp/plaintext" or die $!; open DS, ">dgit-tmp/plaintext.asc" or die $!; open T, "-|", qw(git cat-file tag), $tagval or die $!; for (;;) { $!=0; $_=; defined or die $!; print PT or die $!; if (m/^(\S+) (.*)/) { push @{ $tagh{$1} }, $2; } elsif (!m/\S/) { last; } else { die; } } $!=0; $_=; defined or die $!; } sub parsetag_general ($$) { my ($dgititemfn, $distrofn) = @_; printdebug " parsetag...\n"; my $copyl = $_; for (;;) { print PT $copyl or die $!; $!=0; $_=; defined or die "missing signature? $!"; $copyl = $_; if (m/^\[dgit ([^"].*)\]$/) { # [dgit "something"] is for future $_ = $1." "; while (length) { if ($dgititemfn->()) { } elsif (s/^distro\=(\S+) //) { $distrofn->($1); } elsif (s/^([-+.=0-9a-z]\S*) //) { printdebug " parsetag ignoring unrecognised \`$1'\n"; } else { die "unknown dgit info in tag ($_)"; } } next; } last if m/^-----BEGIN PGP/; } $_ = $copyl; for (;;) { print DS or die $!; $!=0; $_=; last if !defined; } T->error and die $!; close PT or die $!; close DS or die $!; printdebug " parsetag ok.\n"; } sub parsetag () { readtag(); m/^($package_re) release (\S+) for \S+ \((\S+)\) \[dgit\]$/ or reject "tag message not in expected format"; die unless $1 eq $package; $version = $2; die "$3 != $suite " unless $3 eq $suite; parsetag_general sub { if (s/^(--deliberately-$deliberately_re) //) { push @deliberatelies, $1; } elsif (s/^previously:(\S+)=(\w+) //) { die "previously $1 twice" if defined $previously{$1}; $previously{$1} = $2; } else { return 0; } return 1; }, sub { my ($gotdistro) = @_; die "$gotdistro != $distro" unless $gotdistro eq $distro; }; } sub checksig_keyring ($) { my ($keyringfile) = @_; # returns primary-keyid if signed by a key in this keyring # or undef if not # or dies on other errors my $ok = undef; printdebug " checksig keyring $keyringfile...\n"; our @cmd = (qw(gpgv --status-fd=1 --keyring), $keyringfile, qw(dgit-tmp/plaintext.asc dgit-tmp/plaintext)); debugcmd '|',@cmd; open P, "-|", @cmd or die $!; while (

) { next unless s/^\[GNUPG:\] //; chomp or die; printdebug " checksig| $_\n"; my @l = split / /, $_; if ($l[0] eq 'NO_PUBKEY') { last; } elsif ($l[0] eq 'VALIDSIG') { my $sigtype = $l[9]; $sigtype eq '00' or reject "signature is not of type 00!"; $ok = $l[10]; die unless defined $ok; last; } } close P; printdebug sprintf " checksig ok=%d\n", !!$ok; return $ok; } sub dm_txt_check ($$) { my ($keyid, $dmtxtfn) = @_; printdebug " dm_txt_check $keyid $dmtxtfn\n"; open DT, '<', $dmtxtfn or die "$dmtxtfn $!"; while (

) { m/^fingerprint:\s+\Q$keyid\E$/oi ..0 or next; if (s/^allow:/ /i..0) { } else { m/^./ or reject "key $keyid missing Allow section in permissions!"; next; } # in right stanza... s/^[ \t]+// or reject "package $package not allowed for key $keyid"; # in allow field... s/\([^()]+\)//; s/\,//; chomp or die; printdebug " dm_txt_check allow| $_\n"; foreach my $p (split /\s+/) { if ($p eq $package) { # yay! printdebug " dm_txt_check ok\n"; return; } } } DT->error and die $!; close DT or die $!; reject "key $keyid not in permissions list although in keyring!"; } sub verifytag () { foreach my $kas (split /:/, $keyrings) { printdebug "verifytag $kas...\n"; $kas =~ s/^([^,]+),// or die; my $keyid = checksig_keyring $1; if (defined $keyid) { if ($kas =~ m/^a$/) { printdebug "verifytag a ok\n"; return; # yay } elsif ($kas =~ m/^m([^,]+)$/) { dm_txt_check($keyid, $1); printdebug "verifytag m ok\n"; return; } else { die; } } } reject "key not found in keyrings"; } sub suite_is_in ($) { my ($sf) = @_; printdebug "suite_is_in ($sf)\n"; if (!open SUITES, "<", $sf) { $!==ENOENT or die $!; return 0; } while () { chomp; next unless m/\S/; next if m/^\#/; s/\s+$//; return 1 if $_ eq $suite; } die $! if SUITES->error; return 0; } sub checksuite () { printdebug "checksuite ($suitesfile)\n"; return if suite_is_in $suitesfile; reject "unknown suite"; } sub checktagnoreplay () { # We need to prevent a replay attack using an earlier signed tag. # We also want to archive in the history the object ids of # anything we remove, even if we get rid of the actual objects. # # So, we check that the signed tag mentions the name and tag # object id of: # # (a) In the case of FRESHREPO: all tags and refs/heads/* in # the repo. That is, effectively, all the things we are # deleting. # # This prevents any tag implying a FRESHREPO push # being replayed into a different state of the repo. # # There is still the folowing risk: If a non-ff push is of a # head which is an ancestor of a previous ff-only push, the # previous push can be replayed. # # So we keep a separate list, as a file in the repo, of all # the tag object ids we have ever seen and removed. Any such # tag object id will be rejected even for ff-only pushes. # # (b) In the case of just NOFFCHECK: all tags referring to the # current head for the suite (there must be at least one). # # This prevents any tag implying a NOFFCHECK push being # replayed to overwrite a different head. # # The possibility of an earlier ff-only push being replayed is # eliminated as follows: the tag from such a push would still # be in our repo, and therefore the replayed push would be # rejected because the set of refs being updated would be # wrong. if (!open PREVIOUS, "<", removedtagsfile) { die removedtagsfile." $!" unless $!==ENOENT; } else { # Protocol for updating this file is to append to it, not # write-new-and-rename. So all updates are prefixed with \n # and suffixed with " .\n" so that partial writes can be # ignored. while () { next unless m/^(\w+) (.*) \.\n/; next unless $1 eq $tagval; reject "Replay of previously-rewound upload ($tagval $2)"; } die removedtagsfile." $!" if PREVIOUS->error; close PREVIOUS; } return unless $policy & (FRESHREPO|NOFFCHECK); my $garbagerepo = "$dgitrepos/${package}_garbage"; lockrealtree(); my $nchecked = 0; my @problems; my $check_ref_previously= sub { my ($objid,$objtype,$fullrefname,$reftail) = @_; my $supkey = $fullrefname; $supkey =~ s{^refs/}{} or die "$supkey $objid ?"; my $supobjid = $previously{$supkey}; if (!defined $supobjid) { printdebug "checktagnoreply - missing\n"; push @problems, "does not declare previously $supkey"; } elsif ($supobjid ne $objid) { push @problems, "declared previously $supkey=$supobjid". " but actually previously $supkey=$objid"; } else { $nchecked++; } }; if ($policy & FRESHREPO) { foreach my $kind (qw(tags heads)) { git_for_each_ref("refs/$kind", $check_ref_previously); } } else { my $branch= server_branch($suite); my $branchhead= git_get_ref(server_ref($suite)); if (!length $branchhead) { # No such branch - NOFFCHECK was unnecessary. Oh well. printdebug "checktagnoreplay - not FRESHREPO, new branch, ok\n"; } else { printdebug "checktagnoreplay - not FRESHREPO,". " checking for overwriting refs/$branch=$branchhead\n"; git_for_each_tag_referring($branchhead, sub { my ($tagobjid,$refobjid,$fullrefname,$tagname) = @_; $check_ref_previously->($tagobjid,undef,$fullrefname,undef); }); printdebug "checktagnoreplay - not FRESHREPO, nchecked=$nchecked"; push @problems, "does not declare previously any tag". " referring to branch head $branch=$branchhead" unless $nchecked; } } if (@problems) { reject "replay attack prevention check failed:". " signed tag for $version: ". join("; ", @problems). "\n"; } printdebug "checktagnoreplay - all ok ($tagval)\n" } sub tagh1 ($) { my ($tag) = @_; my $vals = $tagh{$tag}; reject "missing header $tag in signed tag object" unless $vals; reject "multiple headers $tag in signed tag object" unless @$vals == 1; return $vals->[0]; } sub basic_tag_checks() { printdebug "checks\n"; tagh1('type') eq 'commit' or reject "tag refers to wrong kind of object"; tagh1('object') eq $commit or reject "tag refers to wrong commit"; tagh1('tag') eq $tagname or reject "tag name in tag is wrong"; } sub checks () { basic_tag_checks(); my @expecttagnames = debiantags($version, $distro); printdebug "expected tag @expecttagnames\n"; grep { $tagname eq $_ } @expecttagnames or die; foreach my $othertag (grep { $_ ne $tagname } @expecttagnames) { reject "tag $othertag already exists -". " not replacing previously-pushed version" if git_get_ref "refs/tags/".$othertag; } lockrealtree(); @policy_args = ($package,$version,$suite,$tagname, join(",",@deliberatelies)); $policy = policyhook(NOFFCHECK|FRESHREPO|NOCOMMITCHECK, 'push', @policy_args); if (defined $tagexists_error) { if ($policy & FRESHREPO) { printdebug "ignoring tagexists_error: $tagexists_error\n"; } else { reject $tagexists_error; } } checktagnoreplay(); checksuite(); # check that our ref is being fast-forwarded printdebug "oldcommit $oldcommit\n"; if (!($policy & NOFFCHECK) && $oldcommit =~ m/[^0]/) { $?=0; $!=0; my $mb = `git merge-base $commit $oldcommit`; chomp $mb; $mb eq $oldcommit or reject "not fast forward on dgit branch"; } # defend against commits generated by #849041 if (!($policy & NOCOMMITCHECK)) { my @checks = qw(%at %ct); my @chk = qw(git log -z); push @chk, '--pretty=tformat:%H%n'. (join "", map { $_, '%n' } @checks); push @chk, "^$oldcommit" if $oldcommit =~ m/[^0]/; push @chk, $commit;; printdebug " ~NOCOMMITCHECK @chk\n"; open CHK, "-|", @chk or die $!; local $/ = "\0"; while () { next unless m/^$/m; m/^\w+(?=\n)/ or die; reject "corrupted object $& (missing metadata)"; } $!=0; $?=0; close CHK or $?==256 or die "$? $!"; } if ($policy & FRESHREPO) { # It's a bit late to be discovering this here, isn't it ? # # What we do is: Generate a fresh destination repo right now, # and arrange to treat it from now on as if it were a # prospective repo. # # The presence of this fresh destination repo is detected by # the parent, which responds by making a fresh master repo # from the template. (If the repo didn't already exist then # $destrepo was _prospective, and we change it here. This is # OK because the parent's check for _fresh persuades it not to # use _prospective.) # $destrepo = "${workrepo}_fresh"; # workrepo lock covers mkrepo_fromtemplate $destrepo; } } sub onwardpush () { my @cmdbase = (qw(git send-pack), $destrepo); push @cmdbase, qw(--force) if $policy & NOFFCHECK; if ($ENV{GIT_QUARANTINE_PATH}) { my $recv_wrapper = "$ENV{GIT_QUARANTINE_PATH}/dgit-recv-wrapper"; mkscript $recv_wrapper, <<'END'; #!/bin/sh set -e unset GIT_QUARANTINE_PATH exec git receive-pack "$@" END push @cmdbase, "--receive-pack=$recv_wrapper"; } my @cmd = @cmdbase; push @cmd, "$commit:refs/dgit/$suite", "$tagval:refs/tags/$tagname"; push @cmd, "$maint_tagval:refs/tags/$maint_tagname" if defined $maint_tagname; debugcmd '+',@cmd; $!=0; my $r = system @cmd; !$r or die "onward push to $destrepo failed: $r $!"; if (suite_is_in $suitesformasterfile) { @cmd = @cmdbase; push @cmd, "$commit:refs/heads/master"; debugcmd '+', @cmd; $!=0; my $r = system @cmd; # tolerate errors (might be not ff) !($r & ~0xff00) or die "onward push to $destrepo#master failed: $r $!"; } } sub finalisepush () { if ($destrepo eq realdestrepo) { policyhook(0, 'push-confirm', @policy_args, ''); onwardpush(); } else { # We are to receive the push into a new repo (perhaps # because the policy push hook asked us to with FRESHREPO, or # perhaps because the repo didn't exist before). # # We want to provide the policy push-confirm hook with a repo # which looks like the one which is going to be installed. # The working repo is no good because it might contain # previous history. # # So we push the objects into the prospective new repo right # away. If the hook declines, we decline, and the prospective # repo is never installed. onwardpush(); policyhook(0, 'push-confirm', @policy_args, $destrepo); } } sub stunthook () { printdebug "stunthook in $workrepo\n"; chdir $workrepo or die "chdir $workrepo: $!"; mkdir "dgit-tmp" or $!==EEXIST or die $!; readupdates(); parsetag(); verifytag(); checks(); finalisepush(); printdebug "stunthook done.\n"; } #----- git-upload-pack ----- sub fixmissing__git_upload_pack () { $destrepo = "$dgitrepos/_empty"; my $lfh = locksometree($destrepo); return if stat_exists $destrepo; rmtree "$destrepo.new"; mkemptyrepo "$destrepo.new", "0644"; rename "$destrepo.new", $destrepo or die $!; unlink "$destrepo.lock" or die $!; close $lfh; } sub main__git_upload_pack () { my $lfh = locksometree($destrepo); printdebug "git-upload-pack in $destrepo\n"; chdir $destrepo or die "$destrepo: $!"; close $lfh; runcmd qw(git upload-pack), "."; } #----- arg parsing and main program ----- sub argval () { die unless @ARGV; my $v = shift @ARGV; die if $v =~ m/^-/; return $v; } our %indistrodir = ( # keys are used for DGIT_DRS_XXX too 'repos' => \$dgitrepos, 'suites' => \$suitesfile, 'suites-master' => \$suitesformasterfile, 'policy-hook' => \$policyhook, 'mirror-hook' => \$mirrorhook, 'dgit-live' => \$dgitlive, ); our @hookenvs = qw(distro suitesfile suitesformasterfile policyhook mirrorhook dgitlive keyrings dgitrepos distrodir); # workrepo and destrepo handled ad-hoc sub mode_tag2upload () { # CALLER MUST PREVENT MULTIPLE CONCURRENT RUNS IN SAME CWD # If we fail (exit nonzero), caller should capture our stderr, # and retry some bounded number of times in some appropriate way # Uses whatever ambient gpg key is available @ARGV==2 or die; my $url; ($url,$tagval) = @ARGV; $ENV{DGIT_DRS_EMAIL_NOREPLY} // die; my $start = time // die; my @t = gmtime $start; die if $url =~ m/[^[:graph:]]/; die if $tagval =~ m/[^[:graph:]]/; open OL, ">>overall.log" or die $!; autoflush OL 1; my $quit = sub { printf OL "%04d-%02d-%02d %02d:%02d:%02d (%04ds): %s %s: %s\n", $t[5] + 1900, @t[4,3,2,1,0], (time-$start), $url, $tagval, $_[0]; exit 0; }; $ENV{DGIT_DRS_ANY_URL} or $url =~ m{^https://}s or $quit->("url scheme not as expected"); $tagval =~ m{^$distro/($versiontag_re)$}s or $quit->("tag name not for us"); $version = $1; $version =~ y/_\%\#/~:/d; my $work = 'work'; my $tagref = "refs/tags/$tagval"; rmtree $work; rmtree 'bpd'; mkdir $work or die $!; mkdir 'bpd' or die $!; unlink <*.orig*>; dif $! if <*.orig*>; changedir $work; runcmd qw(git init -q); runcmd qw(git remote add origin), $url; runcmd qw(git fetch --depth=1 origin), "$tagref:$tagref"; changedir ".git"; mkdir 'dgit-tmp' or die $!; my $tagger; open T, "-|", qw(git cat-file tag), $tagval or die $!; { local $/ = undef; $!=0; $_=; defined or die $!; # quick and dirty check, will check properly later m/^\[dgit[^"]* please-upload(?:\]| )/m or $quit->("tag missing please-upload request"); m/^tagger (.*) \d+ [-+]\d+$/m or $quit->("failed to fish tagger out of tag"); $tagger = $1; }; readtag(); m/^($package_re) release (\S+) for ($suite_re)$/ or $quit->("tag headline not for us"); $package = $1; my $tagmversion = $2; $suite = $3; # This is for us. From now on, we will capture errors to # be emailed to the tagger. open H, ">>dgit-tmp/tagupl.email" or die $!; print H <>dgit-tmp/tagupl.log" or die $!; my $child = fork() // die $!; if ($child) { # we are the parent # if child exits 0, it has called $quit->() $!=0; waitpid $child, 0 == $child or die $!; printdebug "child $child ?=$?\n"; exit 0 unless $?; print L "execution child: ", waitstatusmsg(), "\n" or die $!; close L or die $!; print H <>tagupl.email $ENV{DGIT_DRS_SENDMAIL} -oee -odb -oi -t \\ -f$ENV{DGIT_DRS_EMAIL_NOREPLY} \\ ("failed, emailed"); } open STDERR, ">&L" or die $!; open STDOUT, ">&STDERR" or die $!; open DEBUG, ">&STDERR" if $debuglevel; reject "version mismatch $tagmversion != $version " unless $tagmversion eq $version; my %need = map { $_ => 1 } qw(please-upload split); my ($upstreamc, $upstreamt); my $quilt; my $distro_ok; confess if defined $upstreamt; parsetag_general sub { if (m/^(\S+) / && exists $need{$1}) { $_ = $'; delete $need{$1}; } elsif (s/^upstream=(\w+) //) { $upstreamc = $1; } elsif (s/^upstream-tag=(\S+) //) { $upstreamt = $1; } elsif (s/^--quilt=([-+0-9a-z]+) //) { $quilt = $1; } else { return 0; } return 1; }, sub { my ($gotdistro) = @_; $distro_ok ||= $gotdistro eq $distro; }; $quit->("not for this distro") unless $distro_ok; reject "missing \"$_\"" foreach keys %need; verifytag(); reject "upstream tag and not commitish, or v-v" unless defined $upstreamt == defined $upstreamc; my @dgit; push @dgit, $ENV{DGIT_DRS_DGIT} // 'dgit'; push @dgit, '-wn'; push @dgit, "-p$package"; push @dgit, '--build-products-dir=../bpd'; changedir ".."; runcmd (@dgit, qw(setup-gitattributes)); my @fetch = qw(git fetch origin --unshallow); if (defined $upstreamt) { runcmd qw(git check-ref-format), "refs/tags/$upstreamt"; my $utagref = "refs/tags/$upstreamt"; push @fetch, "$utagref:$utagref"; } runcmd @fetch; runcmd qw(git checkout -q), "refs/tags/$tagval"; my $clogp = parsechangelog(); my $clogf = sub { my ($f, $exp) = @_; my $got = getfield $clogp, $f; return if $got eq $exp; reject "mismatch: changelog $f $got != $exp"; }; $clogf->('Version', $version); $clogf->('Source', $package); @fetch = (@dgit, qw(--for-push fetch), $suite); debugcmd "+",@_; $!=0; $?=-1; if (system @fetch) { failedcmd @fetch unless $? == 4*256; } # this is just to get the orig, so we don't really care about the ref if (defined $upstreamc) { my $need_upstreamc = git_rev_parse "refs/tags/$upstreamt"; $upstreamc eq $need_upstreamc or reject "upstream-commitish=$upstreamc but tag refers to $need_upstreamc"; runcmd qw(git deborig), "$upstreamc"; } my @dgitcmd; push @dgitcmd, @dgit; push @dgitcmd, qw(--force-uploading-source-only); if (defined $quilt) { push @dgitcmd, "--quilt=$quilt"; if ($quilt =~ m/baredebian/) { die "needed upstream commmitish with --quilt=baredebian" unless defined $upstreamc; push @dgitcmd, "--upstream-commitish=refs/tags/$upstreamt"; } } push @dgitcmd, qw(push-source --new --overwrite), $suite; runcmd @dgitcmd; $quit->('done'); } sub mode_ssh () { die if @ARGV; my $cmd = $ENV{'SSH_ORIGINAL_COMMAND'}; $cmd =~ m{ ^ (?: \S* / )? ( [-0-9a-z]+ ) \s+ '? (?: \S* / )? ($package_re) \.git '?$ }ox or reject "command string not understood"; my $method = $1; $package = $2; my $funcn = $method; $funcn =~ y/-/_/; my $mainfunc = $main::{"main__$funcn"}; reject "unknown method" unless $mainfunc; policy_checkpackage(); if (stat_exists realdestrepo) { $destrepo = realdestrepo; } else { printdebug " fixmissing $funcn\n"; my $fixfunc = $main::{"fixmissing__$funcn"}; &$fixfunc; } printdebug " running main $funcn\n"; &$mainfunc; } sub mode_cron () { die if @ARGV; my $listfh = tempfile(); open STDOUT, ">&", $listfh or die $!; policyhook(0,'check-list'); open STDOUT, ">&STDERR" or die $!; seek $listfh, 0, 0 or die $!; while (<$listfh>) { chomp or die; next if m/^\s*\#/; next unless m/\S/; die unless m/^($package_re)$/; $package = $1; policy_checkpackage(); } die $! if $listfh->error; } sub parseargsdispatch () { die unless @ARGV; delete $ENV{'GIT_DIR'}; # if not run via ssh, our parent git process delete $ENV{'GIT_PREFIX'}; # sets these and they mess things up if ($ENV{'DGIT_DRS_DEBUG'}) { enabledebug(); } if ($ARGV[0] eq '--pre-receive-hook') { if ($debuglevel) { $debugprefix.="="; printdebug "in stunthook ".(shellquote @ARGV)."\n"; foreach my $k (sort keys %ENV) { printdebug "$k=$ENV{$k}\n" if $k =~ m/^DGIT/; } } shift @ARGV; @ARGV == 1 or die; $package = shift @ARGV; ${ $main::{$_} } = $ENV{"DGIT_DRS_\U$_"} foreach @hookenvs; defined($workrepo = $ENV{'DGIT_DRS_WORK'}) or die; defined($destrepo = $ENV{'DGIT_DRS_DEST'}) or die; open STDOUT, ">&STDERR" or die $!; eval { stunthook(); }; if ($@) { recorderror "$@" or die; die $@; } exit 0; } $distro = argval(); $distrodir = argval(); $keyrings = argval(); foreach my $dk (keys %indistrodir) { ${ $indistrodir{$dk} } = "$distrodir/$dk"; } while (@ARGV && $ARGV[0] =~ m/^--([-0-9a-z]+)=/ && $indistrodir{$1}) { ${ $indistrodir{$1} } = $'; #'; shift @ARGV; } $ENV{"DGIT_DRS_\U$_"} = ${ $main::{$_} } foreach @hookenvs; die unless @ARGV>=1; my $mode = shift @ARGV; die unless $mode =~ m/^--(\w+)$/; my $fn = ${*::}{"mode_$1"}; die unless $fn; $fn->(); } sub unlockall () { while (my $fh = pop @lockfhs) { close $fh; } } sub cleanup () { unlockall(); if (!chdir "$dgitrepos/_tmp") { $!==ENOENT or die $!; return; } foreach my $lf (<*.lock>) { my $tree = $lf; $tree =~ s/\.lock$//; next unless acquirermtree($tree, 0); remove $lf or warn $!; unlockall(); } } parseargsdispatch(); cleanup(); work/infra/dgit-ssh-dispatch0000755000000000000000000001210314761250142013271 0ustar #!/usr/bin/perl -w # wrapper to dispatch git ssh service requests # # Copyright (C) 2015-2016 Ian Jackson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . use strict; use Debian::Dgit::Infra; # must precede Debian::Dgit; - can change @INC! use Debian::Dgit; setup_sigwarn(); use POSIX; open DEBUG, '>/dev/null' or die $!; if (@ARGV && $ARGV[0] eq '-D') { shift @ARGV; open DEBUG, '>&STDERR' or die $!; } die unless @ARGV>=1 && @ARGV<=2 && $ARGV[0] !~ m/^-/; our ($dispatchdir,$authrune) = @ARGV; $authrune //= join ':', '@/keyrings/debian-keyring.gpg,a', '@/keyrings/debian-maintainers.gpg,m@/dm.txt'; our $lre = $package_re; our $qre = '["'."']?"; # $dispatchdir/distro=DISTRO should contain # dgit-live a clone of dgit (only if not using installed vsns) # diverts # repos/ } by virtue of # suites } dgit-repos-server's defaults relating to # policy-hook } dispatch-dir # plus files required by the authrune (by default, keyrings/ and dm.txt) # # diverts should be list of # [] # where is a package name pattern which may contain * or literals. # is for `git config dgit-distro.DISTRO.diverts.' our ($distro,$pkg, $d); our ($dgitlive,$repos,$suites,$diverts,$policyhook,$repo); sub checkdivert ($) { my ($df) = @_; if (!open DIV, '<', $df) { $!==ENOENT or die $!; return undef; } else { while (
) { s/^\s+//; s/\s+$//; next unless m/\S/; next if m/^\#/; my $divert; if (s/\s+(\S+)$//) { $divert=$1; } s/[^-+._0-9a-zA-Z*]/\\$&/g; s/\*/.*/g; printf DEBUG 'DISPATCH DIVERT ^%s$ %s'."\n", $_, ($divert // '(undef)'); if ($pkg =~ m/^$_$/) { return $divert; } } DIV->error and die $!; close DIV; return undef; } } sub finish () { close STDOUT or die $!; exit 0; } sub prl ($) { print @_, "\n" or die $!; } sub selectpackage ($$;$) { my $divertfn; ($distro,$pkg, $divertfn) = @_; # $distro,$pkg must have sane syntax $d = "$dispatchdir/distro=$distro"; if (!stat $d) { die $! unless $!==ENOENT; die "unknown distro ($distro)\n"; } $dgitlive= "$d/dgit-live"; $repos= "$d/repos"; $suites= "$d/suites"; $policyhook= "$d/policy-hook"; $authrune =~ s/\@/$d/g; my $divert = checkdivert("$d/diverts"); if (defined $divert) { $divertfn //= sub { die "diverted to $divert incompletely or too late!\n"; }; $divertfn->($divert); die; } $repo = "$repos/$pkg.git"; print DEBUG "DISPATCH DISTRO $distro PKG $pkg\n"; } sub hasrepo () { if (stat $repo) { -d _ or die; return 1; } else { $!==ENOENT or die $!; return 0; } } sub serve_up ($) { my ($repo) = @_; exec qw(git upload-pack --strict --timeout=1000), $repo; die "exec git: $!"; } sub perllib_local () { $ENV{'PERLLIB'} //= ''; $ENV{'PERLLIB'} =~ s#^(?=.)#:#; $ENV{'PERLLIB'} =~ s#^# $ENV{DGIT_TEST_INTREE} // $dgitlive #e; } sub dispatch () { local ($_) = $ENV{'SSH_ORIGINAL_COMMAND'} // ''; if (m#^: dgit ($lre) git-check ($lre) ;#) { selectpackage $1,$2, sub { prl "divert @_"; finish; }; prl hasrepo; finish; } elsif ( m#^${qre}git-([-a-z]+) ${qre}/dgit/($lre)/repos/($lre)\.git${qre}$# ) { my $cmd=$1; selectpackage $2,$3; if ($cmd eq 'receive-pack') { perllib_local(); my $s = "$dgitlive/infra/dgit-repos-server"; $s = "dgit-repos-server" if !stat_exists $s; exec $s, $distro, $d, $authrune, qw(--ssh); die "exec $s: $!"; } elsif ($cmd eq 'upload-pack') { $repo='$repos/_empty' unless hasrepo; serve_up $repo; } else { die "unsupported git operation $cmd ($_)"; } } elsif ( m#^${qre}git-upload-pack ${qre}/dgit/($lre)/(?:repos/)?_dgit-repos-server\.git${qre}$# ) { my $distro= $1; # if running installed packages, source code should come # some other way serve_up("$dispatchdir/distro=$1/dgit-live/.git"); } elsif (m#^${qre}git-upload-pack\s#) { die "unknown repo to serve ($_). use dgit, or for server source ". "git clone here:/dgit/DISTRO/repos/_dgit-repos-server.git"; } elsif (m#^: dgit ($lre) policy-client-query ($lre) ($lre) ([^;]*) ;#) { my $query_op = $3; my $query_args = $4; selectpackage $1,$2; my @cmd = ($policyhook,$distro,$repos,$dgitlive,$d, 'policy-client-query', $pkg, $query_op, split / /, $query_args); perllib_local(); exec @cmd;; die "exec $cmd[0]: $!"; } else { die "unsupported operation ($_)"; } } dispatch; work/infra/drs-cron-wrap0000755000000000000000000000043614761250142012456 0ustar #!/bin/sh set -e umask 002 distro=$1; shift srvdir=/srv/dgit.debian.org dispatchdir=$srvdir/dispatch-dir dgitlive=$srvdir/dgit-live distrodir=$dispatchdir/distro=$distro PERLLIB="$dgitlive${PERLLIB+:}${PERLLIB}" \ exec $dgitlive/infra/dgit-repos-server $distro $distrodir '' --cron work/infra/get-dm-txt0000755000000000000000000000074314761250142011753 0ustar #!/bin/sh set -e cd ${DGIT_INFRA_GETDMTXT_DATADIR-/srv/dgit.debian.org/data} ${DGIT_INFRA_GETDMTXT_UMASK-umask 002} file=dm.txt server=ftp-master.debian.org path=$file certargs=$(git config --default '' \ dgit-distro.debian.archive-query-tls-curl-ca-args \ || (echo >&2 "git config failed"; exit 1)) with-lock-ex -f $file.lock sh -c " if ! curl $certargs \ >$file.new https://$server/$path 2>$file.stderr; then cat $file.stderr >&2 exit 127 fi mv -f $file.new $file " work/infra/get-suites0000755000000000000000000000114514761250142012047 0ustar #!/bin/bash set -e set -o pipefail srvdir=/srv/dgit.debian.org dgitlive=${DGIT_TEST_INTREE-$srvdir/dgit-live} output=${DGIT_GETSUITES_OUTPUT-$srvdir/data/suites} export PERLLIB="$dgitlive${PERLLIB+:}${PERLLIB}" $dgitlive/dgit archive-api-query /suites | perl -we ' use strict; use JSON; undef $/; my $json = ; die $! if STDIN->error; my $items = decode_json $json; foreach my $item (@$items) { next unless ($item->{archive}//"") eq "ftp-master"; next unless ($item->{codename}); print $item->{codename}, "\n" or die $!; } flush STDOUT or die $!; ' >$output.new mv -f $output.new $output work/infra/ssh-wrap0000755000000000000000000000032514761250142011521 0ustar #!/bin/sh set -e umask 002 srvdir=/srv/dgit.debian.org dispatchdir=$srvdir/dispatch-dir dgitlive=$srvdir/dgit-live PERLLIB="$dgitlive${PERLLIB+:}${PERLLIB}" \ exec $dgitlive/infra/dgit-ssh-dispatch $dispatchdir work/po/0000755000000000000000000000000014761250142007346 5ustar work/po/.gitignore0000644000000000000000000000005414761250142011335 0ustar .*.make .*.potfiles .*.pot .*.tmp .*.new mo work/po/Makefile0000644000000000000000000000741114761250142011011 0ustar # dgit message translation machinery # # Translators: there is no need to look at this file. It contains # complicated machinery which you do not need to understand :-). # See po/README instead. # Copyright (C)2018 Ian Jackson # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ----- metaprogramming (translators, pleaee ignore all this) ----- # # We present translators with a single file po/messages.pot containing # all the messages for the translated programs in dgit.deb and # git-debrebase.deb. This also includes the messages from the shared # perl modules. # # But when we make the .debs, we want to ship in each .deb the # messages for that .deb, only (but including the common parts). # # So we generate three intermediate .pots, # .{dgit,git-debrebase,common}.pot # and merge them to make messages.pot. # # From the translations we generate two .mo files for each output # language: {dgit,git-debrebase}.mo -- including the common messages. # # To avoid dirtying the tree whenever we do `make install', # we honour SUPPRESS_PO_UPDATE, to be used like this # make install prefix=$(prefix) SUPPRESS_PO_UPDATE=1 all: messages.pot mofiles include ../i18n-common.make .%.potfiles: $S $e; echo ../$*; $f .common.potfiles: $S $e; find ../Debian -name \*.pm; $f .%.make: .%.potfiles Makefile part.make $S $e; \ sed 's/~/$*/g' part.make; \ sed "s#^#.$*.pot: #" $<; \ $f -include .dgit.make -include .git-debrebase.make -include .common.make POFILES := $(wildcard *.po) LANGS := $(basename $(POFILES)) MOFILES = $(foreach part,$(filter-out common,$(PARTS)), \ $(addprefix mo/$(part)_, $(POFILES:.po=.mo))) messages.pot: $(if $(SUPPRESS_PO_UPDATE),,$(POTS)) $S msgcat --to-code=UTF-8 $^ >.messages.0.tmp $S ( ./remove-potcdate <$@ ||: ) >.messages.1.tmp $S ./remove-potcdate <.messages.0.tmp >.messages.2.tmp $S cmp -s .messages.[12].tmp || mv -v .messages.0.tmp $@ @echo 'Updated $@.' %.mo: %.po $S msgfmt -o $@ $< XGETTEXT_OPTS += -Lperl -k__ -kf_ -ki_ XGETTEXT_OPTS += --from-code=UTF-8 XGETTEXT_OPTS += --package-name=dgit --package-version=ongoing # The --package-* avoids this error from make check's `msgfmt -c' # warning: header field 'Project-Id-Version' still has the initial default value %.pot: $S TZ=UTC xgettext $(XGETTEXT_OPTS) $^ -o $@.tmp && $f mofiles: $(MOFILES) @echo 'Generated mo/*.mo (binary translated messages) OK.' install: all set -e; for file in $(MOFILES); do \ lang=$${file#*_}; lang=$${lang%.mo}; \ part=$${file#mo/}; part=$${part%%_*}; \ d=$(DESTDIR)$(prefix)/share/locale/$$lang/LC_MESSAGES; \ install -d $$d; \ install -m 0644 $$file $$d/$$part.mo; \ done clean: rm -f .*.make .*.potfiles .*.pot .*.tmp rm -rf mo %.po: $(if $(SUPPRESS_PO_UPDATE),,messages.pot) @echo -n "Merging messages.pot and $@ " $S if test -f $@; then \ msgmerge --previous $@ messages.pot -o $@.new; \ else \ msgcat --lang=$* messages.pot >$@.new; \ fi $S mv -f $@.new $@ $S msgfmt -o /dev/null --statistics $@ .PRECIOUS: .%.potfiles pofiles: $(POFILES) update: pofiles check check: $(if $(SUPPRESS_PO_UPDATE),,pofiles) $S set -e; for file in $(POFILES); do \ lang=`echo $$file | sed 's/\.po//'`; \ printf "$$lang: "; \ msgfmt -o /dev/null -c -v --statistics $$lang.po;\ done work/po/README0000644000000000000000000001044514761250142010232 0ustar NOTES FOR TRANSLATORS ===================== Introduction ------------ The dgit source package contains dgit and git-debrebase. These are useful for a variety of different users and in different situations. So there are various documents aimed at various users. * dgit and git-debrebase both support message translation. * Documentation translation is handled via po4a, in the po4a directory. The documeents are all manpages. * git-debrebase is currently mostly useful within the Debian project, but this will change and its document translations will then be more important. The en_US message translation is slightly special. It is used for testing the translation machinery, and since the source native language is en_GB, there is not much other need for the en_US translation. The threshold for generation of a translated documents has been set to 10% (of each individual document). The documents are quite sectional and I expect even a partially translated document to be useful. Translatation priorities ------------------------ HIGH po4a/dgit-user_7.pot How to use dgit to as a downstream or user MEDIUM po/messages.pot All the messages for both programs po4a/dgit_1 po4a/dgit-downstream-dsc_7 po4a/dgit-sponshorship_7 po4a/dgit_7 LOW po4a/dgit-maint-* } For work within the Debian project po4a/dgit-nmu-simple_7 } (where one needs good English anyway) po4a/git-debrebase_* Currently low priority but this will change Translation organisation ------------------------ po/messages.pot all messages from both dgit and git-debrebase po/LANG.po translations of those po/mo output directory, do not look here po4a/MAN_S.pot paragraphs from manpage MAN in section S po4a/MAN_S.LANG.po translation of manpage MAN(S) into LANG po4a/po4a.cfg config file for po4a po4a/LANG.preview preview for you, see below po4a/translated/ output directory, do not look here Note on git-debrebase --------------------- git-debrebase has a fairly complex underlying model, which is defined in git-debrebase(5). It is importnt when translating both documents and messages for git-derebase, that consistent translations are used for the words defined in `TERMINOLOGY' and `BRANCH CONTENTS'. You may want to start by reading git-debrebase(5). When translating git-debrebaase(5) itself, please add the English term after the definining use of each word. For example Your-word-for-pseudomerge (Pseudomerge) translation of the definition This will be useful because some of these words appear in necessarily-untranslated but user-visible protocol elements (eg sometimes in annotations in autogenerated git commit messages) To start translating -------------------- In po/ 1. run make LANGUAGE.po 2. edit LANGUAGE.po to add translations. In po4a/ 1. edit po4a.cfg to add your language to [po4a_langs] 2. then run po4a po4a.cfg 3. edit each MANPAGE_SECTION.LANG.po to add translations. Important commands for translators ---------------------------------- In po/ make LANGUAGE.po Creates or updates messages.pot and LANGUAGE.po. make pofiles Updates messages.pot from all the sources, with new messages, and merges them into all the language-specific .po files make check Updates everything and then checks everything, printing translation statistics. In po4a/ po4a po4a.cfg Updates all pot and po files make preview.LANG Makes a directory preview.LANG containing translated and compiled manpages which can be previewed with `man -l', and prints a list of appropriate `man -l' commands. (Requires `tcl' to be installed.) Committing and contributing your translation -------------------------------------------- When you're done you'll need to commit the changes you have made to your language's po files. If you started a new translation, don't forget to `git add' your new files ! The easiest way to contribute your translation is probably for you to file a Merge Request on Sala: https://salsa.debian.org/dgit-team/dgit Contributions via the Debian Bug Tracking System are also welcome. work/po/en_US.po0000644000000000000000000015141414761250142010725 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the dgit package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: dgit ongoing\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-29 11:56+0000\n" "PO-Revision-Date: 2018-08-26 16:55+0100\n" "Last-Translator: Ian Jackson \n" "Language-Team: dgit developrs \n" "Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../dgit:270 #, perl-format msgid "%s: invalid configuration: %s\n" msgstr "" #: ../dgit:277 msgid "warning: overriding problem due to --force:\n" msgstr "" #: ../dgit:285 #, perl-format msgid "warning: skipping checks or functionality due to --force-%s\n" msgstr "" #: ../dgit:290 #, perl-format msgid "%s: source package %s does not exist in suite %s\n" msgstr "" #: ../dgit:544 #, perl-format msgid "build host child %s" msgstr "" #: ../dgit:549 ../dgit:555 #, perl-format msgid "connection lost: %s" msgstr "" #: ../dgit:550 #, perl-format msgid "protocol violation; %s not expected" msgstr "" #: ../dgit:558 #, perl-format msgid "eof (reading %s)" msgstr "" #: ../dgit:565 msgid "protocol message" msgstr "" #: ../dgit:573 #, perl-format msgid "`%s'" msgstr "" #: ../dgit:594 msgid "bad byte count" msgstr "" #: ../dgit:597 msgid "data block" msgstr "" #: ../dgit:676 #, perl-format msgid "%s ok: %s" msgstr "" #: ../dgit:678 #, perl-format msgid "would be ok: %s (but dry run only)" msgstr "" #: ../dgit:703 msgid "" "main usages:\n" " dgit [dgit-opts] clone [dgit-opts] package [suite] [./dir|/dir]\n" " dgit [dgit-opts] fetch|pull [dgit-opts] [suite]\n" " dgit [dgit-opts] build [dpkg-buildpackage-opts]\n" " dgit [dgit-opts] sbuild [sbuild-opts]\n" " dgit [dgit-opts] pbuilder|cowbuilder [debbuildopts]\n" " dgit [dgit-opts] push [dgit-opts] [suite]\n" " dgit [dgit-opts] push-source [dgit-opts] [suite]\n" " dgit [dgit-opts] rpush build-host:build-dir ...\n" "important dgit options:\n" " -k sign tag and package with instead of default\n" " --dry-run -n do not change anything, but go through the motions\n" " --damp-run -L like --dry-run but make local changes, without " "signing\n" " --new -N allow introducing a new package\n" " --debug -D increase debug level\n" " -c= set git config option (used directly by dgit too)\n" msgstr "" #: ../dgit:722 msgid "Perhaps the upload is stuck in incoming. Using the version from git.\n" msgstr "" #: ../dgit:726 #, perl-format msgid "" "%s: %s\n" "%s" msgstr "" #: ../dgit:731 msgid "too few arguments" msgstr "" #: ../dgit:850 #, perl-format msgid "multiple values for %s (in %s git config)" msgstr "" #: ../dgit:853 #, perl-format msgid "value for config option %s (in %s git config) contains newline(s)!" msgstr "" #: ../dgit:873 #, perl-format msgid "" "need value for one of: %s\n" "%s: distro or suite appears not to be (properly) supported" msgstr "" #: ../dgit:930 #, perl-format msgid "bad syntax for (nominal) distro `%s' (does not match %s)" msgstr "" #: ../dgit:945 #, perl-format msgid "backports-quirk needs % or ( )" msgstr "" #: ../dgit:961 #, perl-format msgid "%s needs t (true, y, 1) or f (false, n, 0) not `%s'" msgstr "" #: ../dgit:981 msgid "readonly needs t (true, y, 1) or f (false, n, 0) or a (auto)" msgstr "" #: ../dgit:999 #, perl-format msgid "unknown %s `%s'" msgstr "" #: ../dgit:1004 ../git-debrebase:1548 ../Debian/Dgit.pm:212 msgid "internal error" msgstr "" #: ../dgit:1006 msgid "pushing but distro is configured readonly" msgstr "" #: ../dgit:1010 msgid "" "Push failed, before we got started.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:1033 #, perl-format msgid "" "dgit: quilt mode `%s' (for format `%s') implies split view, but split-view " "set to `%s'" msgstr "" #: ../dgit:1196 msgid "this operation does not support multiple comma-separated suites" msgstr "" #: ../dgit:1264 #, perl-format msgid "fetch of %s failed (%s): %s" msgstr "" #: ../dgit:1271 #, perl-format msgid "fetch of %s gave HTTP code %s" msgstr "" #: ../dgit:1292 msgid "ftpmasterapi archive query method takes no data part" msgstr "" #: ../dgit:1310 #, perl-format msgid "unknown suite %s, maybe -d would help" msgstr "" #: ../dgit:1314 #, perl-format msgid "multiple matches for suite %s\n" msgstr "" #: ../dgit:1316 #, perl-format msgid "suite %s info has no codename\n" msgstr "" #: ../dgit:1318 #, perl-format msgid "suite %s maps to bad codename\n" msgstr "" #: ../dgit:1320 ../dgit:1345 msgid "bad ftpmaster api response: " msgstr "" #: ../dgit:1334 #, perl-format msgid "bad version: %s\n" msgstr "" #: ../dgit:1336 msgid "bad component" msgstr "" #: ../dgit:1339 msgid "bad filename" msgstr "" #: ../dgit:1341 msgid "bad sha256sum" msgstr "" #: ../dgit:1392 msgid "aptget archive query method takes no data part" msgstr "" #: ../dgit:1476 #, perl-format msgid "" "apt seemed to not to update dgit's cached Release files for %s.\n" "(Perhaps %s\n" " is on a filesystem mounted `noatime'; if so, please use `relatime'.)\n" msgstr "" #: ../dgit:1500 #, perl-format msgid "Release file (%s) specifies intolerable %s" msgstr "" #: ../dgit:1526 msgid "apt-get source did not produce a .dsc" msgstr "" #: ../dgit:1527 #, perl-format msgid "apt-get source produced several .dscs (%s)" msgstr "" #: ../dgit:1632 #, perl-format msgid "" "unable to canonicalise suite using package %s which does not appear to exist " "in suite %s; --existing-package may help" msgstr "" #: ../dgit:1771 #, perl-format msgid "cannot operate on %s suite" msgstr "" #: ../dgit:1774 #, perl-format msgid "canonical suite name for %s is %s" msgstr "" #: ../dgit:1776 #, perl-format msgid "canonical suite name is %s" msgstr "" #: ../dgit:1796 #, perl-format msgid "%s has hash %s but archive told us to expect %s" msgstr "" #: ../dgit:1802 #, perl-format msgid "unsupported source format %s, sorry" msgstr "" #: ../dgit:1829 #, perl-format msgid "diverting to %s (using config for %s)" msgstr "" #: ../dgit:1852 #, perl-format msgid "unknown git-check `%s'" msgstr "" #: ../dgit:1867 #, perl-format msgid "unknown git-create `%s'" msgstr "" #: ../dgit:1904 #, perl-format msgid "%s: warning: removing from %s: %s\n" msgstr "" #: ../dgit:1950 #, perl-format msgid "could not parse .dsc %s line `%s'" msgstr "" #: ../dgit:1961 #, perl-format msgid "missing any supported Checksums-* or Files field in %s" msgstr "" #: ../dgit:2007 #, perl-format msgid "hash or size of %s varies in %s fields (between: %s)" msgstr "" #: ../dgit:2016 #, perl-format msgid "file list in %s varies between hash fields!" msgstr "" #: ../dgit:2020 #, perl-format msgid "%s has no files list field(s)" msgstr "" #: ../dgit:2026 #, perl-format msgid "no file appears in all file lists (looked in: %s)" msgstr "" #: ../dgit:2069 #, perl-format msgid "purportedly source-only changes polluted by %s\n" msgstr "" #: ../dgit:2081 msgid "cannot find section/priority from .changes Files field" msgstr "" #: ../dgit:2094 msgid "" "archive does not support .orig check; hope you used --ch:--sa/-sd if needed\n" msgstr "" #: ../dgit:2110 #, perl-format msgid ".dsc %s missing entry for %s" msgstr "" #: ../dgit:2115 #, perl-format msgid "%s: %s (archive) != %s (local .dsc)" msgstr "" #: ../dgit:2123 #, perl-format msgid "archive %s: %s" msgstr "" #: ../dgit:2130 #, perl-format msgid "archive contains %s with different checksum" msgstr "" #: ../dgit:2158 #, perl-format msgid "edited .changes for archive .orig contents: %s %s" msgstr "" #: ../dgit:2166 #, perl-format msgid "[new .changes left in %s]" msgstr "" #: ../dgit:2169 #, perl-format msgid "%s already has appropriate .orig(s) (if any)" msgstr "" #: ../dgit:2188 #, perl-format msgid "" "unexpected commit author line format `%s' (was generated from changelog " "Maintainer field)" msgstr "" #: ../dgit:2211 msgid "" "\n" "Unfortunately, this source package uses a feature of dpkg-source where\n" "the same source package unpacks to different source code on different\n" "distros. dgit cannot safely operate on such packages on affected\n" "distros, because the meaning of source packages is not stable.\n" "\n" "Please ask the distro/maintainer to remove the distro-specific series\n" "files and use a different technique (if necessary, uploading actually\n" "different packages, if different distros are supposed to have\n" "different code).\n" "\n" msgstr "" #: ../dgit:2223 #, perl-format msgid "" "Found active distro-specific series file for %s (%s): %s, cannot continue" msgstr "" #: ../dgit:2254 msgid "Dpkg::Vendor `current vendor'" msgstr "" #: ../dgit:2256 msgid "(base) distro being accessed" msgstr "" #: ../dgit:2258 msgid "(nominal) distro being accessed" msgstr "" #: ../dgit:2263 #, perl-format msgid "build-products-dir %s is not accessible: %s\n" msgstr "" #: ../dgit:2301 #, perl-format msgid "%s: multiple representations of similar orig %s:\n" msgstr "" #: ../dgit:2305 #, perl-format msgid " %s: in %s (%s)\n" msgstr "" #: ../dgit:2310 msgid "Duplicate/inconsistent orig tarballs. Delete the spurious ones." msgstr "" #: ../dgit:2327 #, perl-format msgid "" "%s: found orig(s) in .. missing from build-products-dir, transferring:\n" msgstr "" #: ../dgit:2331 #, perl-format msgid "check orig file %s in bpd %s: %s" msgstr "" #: ../dgit:2333 #, perl-format msgid "check orig file %s in ..: %s" msgstr "" #: ../dgit:2336 #, perl-format msgid "check target of orig symlink %s in ..: %s" msgstr "" #: ../dgit:2345 #, perl-format msgid "%s: cloned orig symlink from ..: %s\n" msgstr "" #: ../dgit:2349 #, perl-format msgid "%s: hardlinked orig from ..: %s\n" msgstr "" #: ../dgit:2352 #, perl-format msgid "failed to make %s a hardlink to %s: %s" msgstr "" #: ../dgit:2358 #, perl-format msgid "%s: symmlinked orig from .. on other filesystem: %s\n" msgstr "" #: ../dgit:2429 #, perl-format msgid "dgit (child): exec %s: %s" msgstr "" #: ../dgit:2491 msgid "package changelog" msgstr "" #: ../dgit:2531 msgid "package changelog has no entries!" msgstr "" #: ../dgit:2600 ../dgit:2605 #, perl-format msgid "accessing %s: %s" msgstr "" #: ../dgit:2622 ../dgit:2629 #, perl-format msgid "saving %s: %s" msgstr "" #: ../dgit:2655 ../dgit:6433 msgid "source package" msgstr "" #: ../dgit:2735 #, perl-format msgid "%s: trying slow absurd-git-apply..." msgstr "" #: ../dgit:2755 #, perl-format msgid "%s failed: %s\n" msgstr "" #: ../dgit:2765 #, perl-format msgid "" "gbp-pq import and dpkg-source disagree!\n" " gbp-pq import gave commit %s\n" " gbp-pq import gave tree %s\n" " dpkg-source --before-build gave tree %s\n" msgstr "" #: ../dgit:2785 #, perl-format msgid "synthesised git commit from .dsc %s" msgstr "" #: ../dgit:2789 msgid "Import of source package" msgstr "" #: ../dgit:2809 #, perl-format msgid "" "\n" "Version actually in archive: %s (older)\n" "Last version pushed with dgit: %s (newer or same)\n" "%s\n" msgstr "" #: ../dgit:2851 #, perl-format msgid "using existing %s" msgstr "" #: ../dgit:2855 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (perhaps you should delete this " "file?)" msgstr "" #: ../dgit:2859 #, perl-format msgid "need to fetch correct version of %s" msgstr "" #: ../dgit:2875 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (got wrong file from archive!)" msgstr "" #: ../dgit:2970 msgid "too many iterations trying to get sane fetch!" msgstr "" #: ../dgit:2985 #, perl-format msgid "warning: git ls-remote %s reported %s; this is silly, ignoring it.\n" msgstr "" #: ../dgit:3029 #, perl-format msgid "warning: git fetch %s created %s; this is silly, deleting it.\n" msgstr "" #: ../dgit:3044 #, perl-format msgid "" "--dry-run specified but we actually wanted the results of git fetch,\n" "so this is not going to work. Try running dgit fetch first,\n" "or using --damp-run instead of --dry-run. (Wanted: %s.)\n" msgstr "" #: ../dgit:3049 #, perl-format msgid "" "warning: git ls-remote suggests we want %s\n" "warning: and it should refer to %s\n" "warning: but git fetch didn't fetch that object to any relevant ref.\n" "warning: This may be due to a race with someone updating the server.\n" "warning: Will try again...\n" msgstr "" #: ../dgit:3196 #, perl-format msgid "not chasing .dsc distro %s: not fetching %s" msgstr "" #: ../dgit:3201 #, perl-format msgid ".dsc names distro %s: fetching %s" msgstr "" #: ../dgit:3206 #, perl-format msgid "" ".dsc Dgit metadata is in context of distro %s\n" "for which we have no configured url and .dsc provides no hint\n" msgstr "" #: ../dgit:3216 #, perl-format msgid "" ".dsc Dgit metadata is in context of distro %s\n" "for which we have no configured url;\n" ".dsc provides hinted url with protocol %s which is unsafe.\n" "(can be overridden by config - consult documentation)\n" msgstr "" #: ../dgit:3236 msgid "rewrite map" msgstr "" #: ../dgit:3243 msgid "server's git history rewrite map contains a relevant entry!" msgstr "" #: ../dgit:3247 msgid "using rewritten git hash in place of .dsc value" msgstr "" #: ../dgit:3249 msgid "server data says .dsc hash is to be disregarded" msgstr "" #: ../dgit:3256 msgid "additional commits" msgstr "" #: ../dgit:3259 #, perl-format msgid "" ".dsc Dgit metadata requires commit %s\n" "but we could not obtain that object anywhere.\n" msgstr "" #: ../dgit:3284 msgid "last upload to archive" msgstr "" #: ../dgit:3288 msgid "no version available from the archive" msgstr "" #: ../dgit:3371 msgid "dgit suite branch on dgit git server" msgstr "" #: ../dgit:3378 msgid "dgit client's archive history view" msgstr "" #: ../dgit:3383 msgid "Dgit field in .dsc from archive" msgstr "" #: ../dgit:3411 #, perl-format msgid "" "\n" "Git commit in archive is behind the last version allegedly pushed/uploaded.\n" "Commit referred to by archive: %s\n" "Last version pushed with dgit: %s\n" "%s\n" msgstr "" #: ../dgit:3424 msgid "archive .dsc names newer git commit" msgstr "" #: ../dgit:3427 msgid "archive .dsc names other git commit, fixing up" msgstr "" #: ../dgit:3448 #, perl-format msgid "" "\n" "Package not found in the archive, but has allegedly been pushed using dgit.\n" "%s\n" msgstr "" #: ../dgit:3457 #, perl-format msgid "" "\n" "Warning: relevant archive skew detected.\n" "Archive allegedly contains %s\n" "But we were not able to obtain any version from the archive or git.\n" "\n" msgstr "" #: ../dgit:3542 #, perl-format msgid "" "Record %s (%s) in archive suite %s\n" "\n" "Record that\n" msgstr "" #: ../dgit:3555 msgid "should be treated as descended from\n" msgstr "" #: ../dgit:3573 msgid "dgit repo server tip (last push)" msgstr "" #: ../dgit:3575 msgid "local tracking tip (last fetch)" msgstr "" #: ../dgit:3586 #, perl-format msgid "" "\n" "Warning: archive skew detected. Using the available version:\n" "Archive allegedly contains %s\n" "We were able to obtain only %s\n" "\n" msgstr "" #: ../dgit:3601 msgid "fetched source tree" msgstr "" #: ../dgit:3637 msgid "debian/changelog merge driver" msgstr "" #: ../dgit:3702 msgid "" "[attr]dgit-defuse-attrs already found, and proper, in .git/info/attributes\n" " not doing further gitattributes setup\n" msgstr "" #: ../dgit:3716 msgid "# ^ see GITATTRIBUTES in dgit(7) and dgit setup-new-tree in dgit(1)\n" msgstr "" #: ../dgit:3731 #, perl-format msgid "install %s: %s" msgstr "" #: ../dgit:3758 #, perl-format msgid "" "dgit: warning: %s contains .gitattributes\n" "dgit: .gitattributes not (fully) defused. Recommended: dgit setup-new-" "tree.\n" msgstr "" #: ../dgit:3780 #, perl-format msgid "fetching %s..." msgstr "" #: ../dgit:3788 #, perl-format msgid "failed to obtain %s: %s" msgstr "" #: ../dgit:3827 #, perl-format msgid "package %s missing in (base suite) %s" msgstr "" #: ../dgit:3859 msgid "local combined tracking branch" msgstr "" #: ../dgit:3861 msgid "archive seems to have rewound: local tracking branch is ahead!" msgstr "" #: ../dgit:3900 #, perl-format msgid "" "Combine archive branches %s [dgit]\n" "\n" "Input branches:\n" msgstr "" #: ../dgit:3914 msgid "" "\n" "Key\n" " * marks the highest version branch, which choose to use\n" " + marks each branch which was not already an ancestor\n" "\n" msgstr "" #: ../dgit:3929 #, perl-format msgid "calculated combined tracking suite %s" msgstr "" #: ../dgit:3947 #, perl-format msgid "ready for work in %s" msgstr "" #: ../dgit:3965 msgid "dry run makes no sense with clone" msgstr "" #: ../dgit:3980 #, perl-format msgid "create `%s': %s" msgstr "" #: ../dgit:3992 msgid "fetching existing git history" msgstr "" #: ../dgit:3995 msgid "starting new git history" msgstr "" #: ../dgit:4020 #, perl-format msgid "" "FYI: Vcs-Git in %s has different url to your vcs-git remote.\n" " Your vcs-git remote url may be out of date. Use dgit update-vcs-git ?\n" msgstr "" #: ../dgit:4025 #, perl-format msgid "fetched into %s" msgstr "" #: ../dgit:4037 #, perl-format msgid "Merge from %s [dgit]" msgstr "" #: ../dgit:4039 #, perl-format msgid "fetched to %s and merged into HEAD" msgstr "" #: ../dgit:4047 #, perl-format msgid "git tree contains %s" msgstr "" #: ../dgit:4058 msgid "you have uncommitted changes to critical files, cannot continue:\n" msgstr "" #: ../dgit:4077 #, perl-format msgid "" "quilt fixup required but quilt mode is `nofix'\n" "HEAD commit%s differs from tree implied by debian/patches%s" msgstr "" #: ../dgit:4094 msgid "nothing quilty to commit, ok." msgstr "" #: ../dgit:4097 msgid " (wanted to commit patch update)" msgstr "" #: ../dgit:4101 msgid "" "Commit Debian 3.0 (quilt) metadata\n" "\n" msgstr "" #: ../dgit:4145 #, perl-format msgid "" "Not doing any fixup of `%s' due to ----no-quilt-fixup or --quilt=nocheck" msgstr "" #: ../dgit:4150 #, perl-format msgid "Format `%s', need to check/update patch stack" msgstr "" #: ../dgit:4160 #, perl-format msgid "commit id %s" msgstr "" #: ../dgit:4166 #, perl-format msgid "and left in %s" msgstr "" #: ../dgit:4192 #, perl-format msgid "Wanted tag %s (%s) on dgit server, but not found\n" msgstr "" #: ../dgit:4195 #, perl-format msgid "Wanted tag %s (one of: %s) on dgit server, but not found\n" msgstr "" #: ../dgit:4203 #, perl-format msgid "%s (%s) .. %s (%s) is not fast forward\n" msgstr "" #: ../dgit:4212 msgid "version currently in archive" msgstr "" #: ../dgit:4221 #, perl-format msgid "Checking package changelog for archive version %s ..." msgstr "" #: ../dgit:4230 #, perl-format msgid "%s field from dpkg-parsechangelog %s" msgstr "" #: ../dgit:4241 #, perl-format msgid "Perhaps debian/changelog does not mention %s ?" msgstr "" #: ../dgit:4244 #, perl-format msgid "" "%s is %s\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" #: ../dgit:4249 #, perl-format msgid "" "d/changelog entry for %s is unfinalised!\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" #: ../dgit:4263 #, perl-format msgid "Declaring that HEAD includes all changes in %s..." msgstr "" #: ../dgit:4319 msgid "Checking that HEAD includes all changes in archive..." msgstr "" #: ../dgit:4328 msgid "maintainer view tag" msgstr "" #: ../dgit:4330 msgid "dgit view tag" msgstr "" #: ../dgit:4331 msgid "current archive contents" msgstr "" #: ../dgit:4344 msgid "" "| Not fast forward; maybe --overwrite is needed ? Please see dgit(1).\n" msgstr "" #: ../dgit:4354 #, perl-format msgid "Declare fast forward from %s\n" msgstr "" #: ../dgit:4355 #, perl-format msgid "Make fast forward from %s\n" msgstr "" #: ../dgit:4359 #, perl-format msgid "Made pseudo-merge of %s into dgit view." msgstr "" #: ../dgit:4372 #, perl-format msgid "Declare fast forward from %s" msgstr "" #: ../dgit:4380 #, perl-format msgid "Make pseudo-merge of %s into your HEAD." msgstr "" #: ../dgit:4392 #, perl-format msgid "-p specified %s but changelog specified %s" msgstr "" #: ../dgit:4414 #, perl-format msgid "%s is for %s %s but debian/changelog is for %s %s" msgstr "" #: ../dgit:4468 #, perl-format msgid "changes field %s `%s' does not match changelog `%s'" msgstr "" #: ../dgit:5701 #, perl-format msgid "dgit: cannot represent change: %s: %s\n" msgstr "" #: ../dgit:5706 msgid "" "HEAD has changes to .orig[s] which are not representable by `3.0 (quilt)'\n" msgstr "" #: ../dgit:5744 #, perl-format msgid "" "\n" "For full diff showing the problem(s), type:\n" " %s\n" msgstr "" #: ../dgit:5751 #, perl-format msgid "" "--quilt=%s specified, implying patches-unapplied git tree\n" " but git tree differs from orig in upstream files." msgstr "" #: ../dgit:5757 msgid "" "\n" " ... debian/patches is missing; perhaps this is a patch queue branch?" msgstr "" #: ../dgit:5764 #, perl-format msgid "" "--quilt=%s specified, implying patches-applied git tree\n" " but git tree differs from result of applying debian/patches to upstream\n" msgstr "" #: ../dgit:5778 #, perl-format msgid "Combine debian/ with upstream source for %s\n" msgstr "" #: ../dgit:5786 msgid "dgit view: creating patches-applied version using gbp pq" msgstr "" #: ../dgit:5797 #, perl-format msgid "" "--quilt=%s specified, implying that HEAD is for use with a\n" " tool which does not create patches for changes to upstream\n" " .gitignores: but, such patches exist in debian/patches.\n" msgstr "" #: ../dgit:5805 msgid "dgit view: creating patch to represent .gitignore changes" msgstr "" #: ../dgit:5810 #, perl-format msgid "%s already exists; but want to create it to record .gitignore changes" msgstr "" #: ../dgit:5815 msgid "" "Subject: Update .gitignore from Debian packaging branch\n" "\n" "The Debian packaging git branch contains these updates to the upstream\n" ".gitignore file(s). This patch is autogenerated, to provide these\n" "updates to users of the official Debian archive view of the package.\n" msgstr "" #: ../dgit:5837 msgid "Commit patch to update .gitignore\n" msgstr "" #: ../dgit:5907 msgid "maximum search space exceeded" msgstr "" #: ../dgit:5925 #, perl-format msgid "has %s not %s" msgstr "" #: ../dgit:5934 msgid "root commit" msgstr "" #: ../dgit:5940 #, perl-format msgid "merge (%s nontrivial parents)" msgstr "" #: ../dgit:5952 #, perl-format msgid "changed %s" msgstr "" #: ../dgit:5971 #, perl-format msgid "" "\n" "%s: error: quilt fixup cannot be linear. Stopped at:\n" msgstr "" #: ../dgit:5978 #, perl-format msgid "%s: %s: %s\n" msgstr "" #: ../dgit:5990 msgid "quilt history linearisation failed. Search `quilt fixup' in dgit(7).\n" msgstr "" #: ../dgit:5993 msgid "quilt fixup cannot be linear, smashing..." msgstr "" #: ../dgit:6007 #, perl-format msgid "" "Automatically generated patch (%s)\n" "Last (up to) %s git changes, FYI:\n" "\n" msgstr "" #: ../dgit:6014 msgid "quiltify linearisation planning successful, executing..." msgstr "" #: ../dgit:6048 msgid "contains unexpected slashes\n" msgstr "" #: ../dgit:6049 msgid "contains leading punctuation\n" msgstr "" #: ../dgit:6050 msgid "contains bad character(s)\n" msgstr "" #: ../dgit:6051 msgid "is series file\n" msgstr "" #: ../dgit:6052 msgid "too long\n" msgstr "" #: ../dgit:6056 #, perl-format msgid "quiltifying commit %s: ignoring/dropping Gbp-Pq %s: %s" msgstr "" #: ../dgit:6085 #, perl-format msgid "dgit: patch title transliteration error: %s" msgstr "" #: ../dgit:6160 #, perl-format msgid "" "quilt mode %s does not make sense (or is not supported) with single-debian-" "patch" msgstr "" #: ../dgit:6185 msgid "converted" msgstr "" #: ../dgit:6186 #, perl-format msgid "dgit view: created (%s)" msgstr "" #: ../dgit:6240 msgid "Commit removal of .pc (quilt series tracking data)\n" msgstr "" #: ../dgit:6250 msgid "starting quiltify (single-debian-patch)" msgstr "" #: ../dgit:6286 #, perl-format msgid "regenerating patch using git diff (--quilt=%s)" msgstr "" #: ../dgit:6367 msgid "" "warning: package uses dpkg-source include-binaries feature - not all changes " "are visible in patches!\n" msgstr "" #: ../dgit:6376 #, perl-format msgid "warning: ignoring bad include-binaries file %s: %s\n" msgstr "" #: ../dgit:6379 #, perl-format msgid "forbidden path component '%s'" msgstr "" #: ../dgit:6389 #, perl-format msgid "path starts with '%s'" msgstr "" #: ../dgit:6399 #, perl-format msgid "path to '%s' not a plain file or directory" msgstr "" #: ../dgit:6457 #, perl-format msgid "dgit: split brain (separate dgit view) may be needed (--quilt=%s)." msgstr "" #: ../dgit:6489 #, perl-format msgid "dgit view: found cached (%s)" msgstr "" #: ../dgit:6494 msgid "dgit view: found cached, no changes required" msgstr "" #: ../dgit:6529 #, perl-format msgid "examining quilt state (multiple patches, %s mode)" msgstr "" #: ../dgit:6622 msgid "" "failed to apply your git tree's patch stack (from debian/patches/) to\n" " the corresponding upstream tarball(s). Your source tree and .orig\n" " are probably too inconsistent. dgit can only fix up certain kinds of\n" " anomaly (depending on the quilt mode). Please see --quilt= in dgit(1).\n" msgstr "" #: ../dgit:6636 msgid "Tree already contains .pc - will delete it." msgstr "" #: ../dgit:6670 msgid "baredebian quilt fixup: could not find any origs" msgstr "" #: ../dgit:6683 msgid "tarball" msgstr "" #: ../dgit:6701 #, perl-format msgid "Combine orig tarballs for %s %s" msgstr "" #: ../dgit:6717 msgid "tarballs" msgstr "" #: ../dgit:6731 msgid "upstream" msgstr "" #: ../dgit:6755 #, perl-format msgid "%s: base trees orig=%.20s o+d/p=%.20s" msgstr "" #: ../dgit:6765 #, perl-format msgid "" "%s: quilt differences: src: %s orig %s gitignores: %s orig %s\n" "%s: quilt differences: %9.00009s %s o+d/p %9.00009s %s o+d/p" msgstr "" #: ../dgit:6775 msgid "" "This has only a debian/ directory; you probably want --quilt=bare debian." msgstr "" #: ../dgit:6779 msgid "This might be a patches-unapplied branch." msgstr "" #: ../dgit:6782 msgid "This might be a patches-applied branch." msgstr "" #: ../dgit:6785 msgid "Maybe you need one of --[quilt=]gbp --[quilt=]dpm --quilt=unapplied ?" msgstr "" #: ../dgit:6788 msgid "Warning: Tree has .gitattributes. See GITATTRIBUTES in dgit(7)." msgstr "" #: ../dgit:6792 msgid "Maybe orig tarball(s) are not identical to git representation?" msgstr "" #: ../dgit:6803 #, perl-format msgid "starting quiltify (multiple patches, %s mode)" msgstr "" #: ../dgit:6842 msgid "" "\n" "dgit: Building, or cleaning with rules target, in patches-unapplied tree.\n" "dgit: Have to apply the patches - making the tree dirty.\n" "dgit: (Consider specifying --clean=git and (or) using dgit sbuild.)\n" "\n" msgstr "" #: ../dgit:6854 msgid "dgit: Unapplying patches again to tidy up the tree." msgstr "" #: ../dgit:6883 msgid "" "If this is just missing .gitignore entries, use a different clean\n" "mode, eg --clean=dpkg-source,no-check (-wdn/-wddn) to ignore them\n" "or --clean=git (-wg/-wgf) to use `git clean' instead.\n" msgstr "" #: ../dgit:6895 msgid "tree contains uncommitted files and --clean=check specified" msgstr "" #: ../dgit:6898 msgid "tree contains uncommitted files (NB dgit didn't run rules clean)" msgstr "" #: ../dgit:6901 msgid "" "tree contains uncommited, untracked, unignored files\n" "You can use --clean=git[-ff],always (-wga/-wgfa) to delete them.\n" "To include them in the build, it is usually best to just commit them." msgstr "" #: ../dgit:6915 #, perl-format msgid "" "quilt mode %s (generally needs untracked upstream files)\n" "contradicts clean mode %s (which would delete them)\n" msgstr "" #: ../dgit:6932 msgid "tree contains uncommitted files (after running rules clean)" msgstr "" #: ../dgit:6946 msgid "clean takes no additional arguments" msgstr "" #: ../dgit:6965 #, perl-format msgid "-p specified package %s, but changelog says %s" msgstr "" #: ../dgit:6975 msgid "" "dgit: --include-dirty is not supported with split view (including with view-" "splitting quilt modes)" msgstr "" #: ../dgit:6984 #, perl-format msgid "dgit: --quilt=%s, %s" msgstr "" #: ../dgit:6988 msgid "dgit: --upstream-commitish only makes sense with --quilt=baredebian" msgstr "" #: ../dgit:7023 #, perl-format msgid "remove old changes file %s: %s" msgstr "" #: ../dgit:7025 #, perl-format msgid "would remove %s" msgstr "" #: ../dgit:7043 #, perl-format msgid "warning: dgit option %s must be passed before %s on dgit command line\n" msgstr "" #: ../dgit:7050 #, perl-format msgid "" "warning: option %s should probably be passed to dgit before %s sub-command " "on the dgit command line, so that it is seen by dgit and not simply passed " "to %s\n" msgstr "" #: ../dgit:7076 msgid "archive query failed (queried because --since-version not specified)" msgstr "" #: ../dgit:7082 #, perl-format msgid "changelog will contain changes since %s" msgstr "" #: ../dgit:7085 msgid "package seems new, not specifying -v" msgstr "" #: ../dgit:7128 msgid "Wanted to build nothing!" msgstr "" #: ../dgit:7166 #, perl-format msgid "only one changes file from build (%s)\n" msgstr "" #: ../dgit:7173 #, perl-format msgid "%s found in binaries changes file %s" msgstr "" #: ../dgit:7180 #, perl-format msgid "%s unexpectedly not created by build" msgstr "" #: ../dgit:7184 #, perl-format msgid "install new changes %s{,.inmulti}: %s" msgstr "" #: ../dgit:7189 #, perl-format msgid "wrong number of different changes files (%s)" msgstr "" #: ../dgit:7192 #, perl-format msgid "build successful, results in %s\n" msgstr "" #: ../dgit:7205 #, perl-format msgid "" "changes files other than source matching %s already present; building would " "result in ambiguity about the intended results.\n" "Suggest you delete %s.\n" msgstr "" #: ../dgit:7223 msgid "build successful\n" msgstr "" #: ../dgit:7231 #, perl-format msgid "" "%s: warning: build-products-dir set, but not supported by dpkg-buildpackage\n" "%s: warning: build-products-dir will be ignored; files will go to ..\n" msgstr "" #: ../dgit:7342 #, perl-format msgid "remove %s: %s" msgstr "" #: ../dgit:7387 msgid "--include-dirty not supported with --build-products-dir, sorry" msgstr "" #: ../dgit:7413 #, perl-format msgid "put in place new built file (%s): %s" msgstr "" #: ../dgit:7426 msgid "build-source takes no additional arguments" msgstr "" #: ../dgit:7430 #, perl-format msgid "source built, results in %s and %s" msgstr "" #: ../dgit:7437 msgid "" "dgit push-source: --include-dirty/--ignore-dirty does not makesense with " "push-source!" msgstr "" #: ../dgit:7443 msgid "source changes file" msgstr "" #: ../dgit:7445 msgid "user-specified changes file is not source-only" msgstr "" #: ../dgit:7465 ../dgit:7467 #, perl-format msgid "%s (in build products dir): %s" msgstr "" #: ../dgit:7481 msgid "" "perhaps you need to pass -A ? (sbuild's default is to build only\n" "arch-specific binaries; dgit 1.4 used to override that.)\n" msgstr "" #: ../dgit:7494 msgid "" "you asked for a builder but your debbuildopts didn't ask for any binaries -- " "is this really what you meant?" msgstr "" #: ../dgit:7498 msgid "" "we must build a .dsc to pass to the builder but your debbuiltopts forbids " "the building of a source package; cannot continue" msgstr "" #: ../dgit:7528 msgid "incorrect arguments to dgit print-unapplied-treeish" msgstr "" #: ../dgit:7549 msgid "source tree" msgstr "" #: ../dgit:7551 #, perl-format msgid "dgit: import-dsc: %s" msgstr "" #: ../dgit:7564 #, perl-format msgid "unknown dgit import-dsc sub-option `%s'" msgstr "" #: ../dgit:7568 msgid "usage: dgit import-dsc .../PATH/TO/.DSC BRANCH" msgstr "" #: ../dgit:7572 msgid "dry run makes no sense with import-dsc" msgstr "" #: ../dgit:7589 #, perl-format msgid "%s is checked out - will not update it" msgstr "" #: ../dgit:7594 #, perl-format msgid "open import .dsc (%s): %s" msgstr "" #: ../dgit:7596 #, perl-format msgid "read %s: %s" msgstr "" #: ../dgit:7607 msgid "import-dsc signature check failed" msgstr "" #: ../dgit:7610 #, perl-format msgid "%s: warning: importing unsigned .dsc\n" msgstr "" #: ../dgit:7621 msgid "Dgit metadata in .dsc" msgstr "" #: ../dgit:7632 msgid "dgit: import-dsc of .dsc with Dgit field, using git hash" msgstr "" #: ../dgit:7641 #, perl-format msgid "" ".dsc contains Dgit field referring to object %s\n" "Your git tree does not have that object. Try `git fetch' from a\n" "plausible server (browse.dgit.d.o? salsa?), and try the import-dsc again.\n" msgstr "" #: ../dgit:7648 msgid "Not fast forward, forced update." msgstr "" #: ../dgit:7650 #, perl-format msgid "Not fast forward to %s" msgstr "" #: ../dgit:7655 #, perl-format msgid "updated git ref %s" msgstr "" #: ../dgit:7660 #, perl-format msgid "" "Branch %s already exists\n" "Specify ..%s for a pseudo-merge, binding in existing history\n" "Specify +%s to overwrite, discarding existing history\n" msgstr "" #: ../dgit:7680 #, perl-format msgid "lstat %s works but stat gives %s !" msgstr "" #: ../dgit:7682 #, perl-format msgid "stat %s: %s" msgstr "" #: ../dgit:7690 #, perl-format msgid "import %s requires %s, but: %s" msgstr "" #: ../dgit:7709 #, perl-format msgid "cannot import %s which seems to be inside working tree!" msgstr "" #: ../dgit:7713 #, perl-format msgid "symlink %s to %s: %s" msgstr "" #: ../dgit:7714 #, perl-format msgid "made symlink %s -> %s" msgstr "" #: ../dgit:7725 msgid "Import, forced update - synthetic orphan git history." msgstr "" #: ../dgit:7727 msgid "Import, merging." msgstr "" #: ../dgit:7741 #, perl-format msgid "Merge %s (%s) import into %s\n" msgstr "" #: ../dgit:7750 #, perl-format msgid "results are in git ref %s" msgstr "" #: ../dgit:7757 msgid "need only 1 subpath argument" msgstr "" #: ../dgit:7775 msgid "need destination argument" msgstr "" #: ../dgit:7780 #, perl-format msgid "exec git clone: %s\n" msgstr "" #: ../dgit:7788 msgid "no arguments allowed to dgit print-dgit-repos-server-source-url" msgstr "" #: ../dgit:7799 msgid "no arguments allowed to dgit print-dpkg-source-ignores" msgstr "" #: ../dgit:7805 msgid "no arguments allowed to dgit setup-mergechangelogs" msgstr "" #: ../dgit:7812 ../dgit:7818 msgid "no arguments allowed to dgit setup-useremail" msgstr "" #: ../dgit:7824 msgid "no arguments allowed to dgit setup-tree" msgstr "" #: ../dgit:7871 msgid "" "--initiator-tempdir must be used specify an absolute, not relative, " "directory." msgstr "" #: ../dgit:7910 #, perl-format msgid "%s needs a value" msgstr "" #: ../dgit:7914 #, perl-format msgid "bad value `%s' for %s" msgstr "" #: ../dgit:8014 #, perl-format msgid "%s: warning: ignoring unknown force option %s\n" msgstr "" #: ../dgit:8032 #, perl-format msgid "unknown long option `%s'" msgstr "" #: ../dgit:8087 #, perl-format msgid "unknown short option `%s'" msgstr "" #: ../dgit:8102 #, perl-format msgid "%s is set to something other than SIG_DFL\n" msgstr "" #: ../dgit:8106 #, perl-format msgid "%s is blocked\n" msgstr "" #: ../dgit:8112 #, perl-format msgid "" "On entry to dgit, %s\n" "This is a bug produced by something in your execution environment.\n" "Giving up.\n" msgstr "" #: ../dgit:8129 #, perl-format msgid "cannot set command for %s" msgstr "" #: ../dgit:8142 #, perl-format msgid "cannot configure options for %s" msgstr "" #: ../dgit:8162 #, perl-format msgid "unknown quilt-mode `%s'" msgstr "" #: ../dgit:8174 #, perl-format msgid "unknown %s setting `%s'" msgstr "" #: ../dgit:8202 msgid "DRY RUN ONLY\n" msgstr "" #: ../dgit:8203 msgid "DAMP RUN - WILL MAKE LOCAL (UNSIGNED) CHANGES\n" msgstr "" #: ../dgit:8223 #, perl-format msgid "unknown operation %s" msgstr "" #: ../git-debrebase:45 msgid "" "usages:\n" " git-debrebase [] [--|-i ]\n" " git-debrebase [] status\n" " git-debrebase [] prepush [--prose=...]\n" " git-debrebase [] quick|conclude\n" " git-debrebase [] new-upstream [
]\n" " git-debrebase [] convert-from-* ...\n" " ...\n" "See git-debrebase(1), git-debrebase(5), dgit-maint-debrebase(7) (in dgit).\n" msgstr "" #: ../git-debrebase:68 #, perl-format msgid "%s: bad usage: %s\n" msgstr "" #: ../git-debrebase:79 #, perl-format msgid "bad options follow `git-debrebase %s'" msgstr "" #: ../git-debrebase:90 #, perl-format msgid "missing required git config %s" msgstr "" #: ../git-debrebase:363 #, perl-format msgid "%s: snag ignored (-f%s): %s\n" msgstr "" #: ../git-debrebase:366 #, perl-format msgid "%s: snag detected (-f%s): %s\n" msgstr "" #: ../git-debrebase:379 #, perl-format msgid "%s: snags: %d overriden by individual -f options\n" msgstr "" #: ../git-debrebase:385 #, perl-format msgid "%s: snags: %d overriden by global --force\n" msgstr "" #: ../git-debrebase:389 #, perl-format msgid "%s: snags: %d blocker(s) (you could -f, or --force)" msgstr "" #: ../git-debrebase:421 msgid "" "Branch/history seems mangled - no longer in gdr format.\n" "See ILLEGAL OPERATIONS in git-debrebase(5).\n" msgstr "" #: ../git-debrebase:428 #, perl-format msgid "" "%s\n" "Is this meant to be a gdr branch? %s\n" msgstr "" #: ../git-debrebase:433 #, perl-format msgid "" "%s\n" "%s\n" "Consider git-debrebase scrap, to throw away your recent work.\n" msgstr "" #: ../git-debrebase:439 #, perl-format msgid "" "%s\n" "Branch does not seem to be meant to be a git-debrebase branch?\n" "Wrong branch, or maybe you needed git-debrebase convert-from-*.\n" msgstr "" #: ../git-debrebase:450 #, perl-format msgid "" "%s\n" "Branch/history mangled, and diverged since last git-debrebase.\n" "Maybe you reset to, or rebased from, somewhere inappropriate.\n" msgstr "" #: ../git-debrebase:897 #, perl-format msgid "git-debrebase `anchor' but %s" msgstr "" #: ../git-debrebase:899 msgid "has other than two parents" msgstr "" #: ../git-debrebase:900 msgid "contains debian/patches" msgstr "" #: ../git-debrebase:926 msgid "is an origin commit" msgstr "" #: ../git-debrebase:928 msgid "upstream files differ from left parent" msgstr "" #: ../git-debrebase:930 msgid "debian/ differs from right parent" msgstr "" #: ../git-debrebase:941 msgid "edits debian/patches" msgstr "" #: ../git-debrebase:953 msgid "parent's debian is not a directory" msgstr "" #: ../git-debrebase:960 msgid "no changes" msgstr "" #: ../git-debrebase:966 msgid "origin commit" msgstr "" #: ../git-debrebase:1017 #, perl-format msgid "unknown kind of merge from %s" msgstr "" #: ../git-debrebase:1020 msgid "octopus merge" msgstr "" #: ../git-debrebase:1024 msgid "general two-parent merge" msgstr "" #: ../git-debrebase:1041 #, perl-format msgid "inconsistent anchors in merged-breakwaters %s" msgstr "" #: ../git-debrebase:1081 #, perl-format msgid "branch needs laundering (run git-debrebase): %s" msgstr "" #: ../git-debrebase:1109 #, perl-format msgid "packaging change (%s) follows upstream change" msgstr "" #: ../git-debrebase:1110 #, perl-format msgid " (eg %s)" msgstr "" #: ../git-debrebase:1116 msgid "found mixed upstream/packaging commit" msgstr "" #: ../git-debrebase:1117 ../git-debrebase:1125 ../git-debrebase:1130 #: ../git-debrebase:1135 ../git-debrebase:1141 ../git-debrebase:1149 #, perl-format msgid " (%s)" msgstr "" #: ../git-debrebase:1124 #, perl-format msgid "found interchange bureaucracy commit (%s)" msgstr "" #: ../git-debrebase:1129 msgid "found dgit dsc import" msgstr "" #: ../git-debrebase:1134 msgid "found bare dgit dsc import with no prior history" msgstr "" #: ../git-debrebase:1140 msgid "found vanilla merge" msgstr "" #: ../git-debrebase:1147 #, perl-format msgid "found unprocessable commit, cannot cope: %s" msgstr "" #: ../git-debrebase:1215 #, perl-format msgid "found unprocessable commit, cannot cope; %3$s: (commit %1$s) (d.%2$s)" msgstr "" #: ../git-debrebase:1216 #, perl-format msgid "found unprocessable commit, cannot cope: (commit %1$s) (d.%2$s)" msgstr "" #: ../git-debrebase:1337 msgid "bare dgit dsc import" msgstr "" #: ../git-debrebase:1677 ../git-debrebase:1680 #, perl-format msgid "mismatch %s ?" msgstr "" #: ../git-debrebase:1683 #, perl-format msgid "mismatch %s != %s ?" msgstr "" #: ../git-debrebase:1693 #, perl-format msgid "internal error %#x %s %s" msgstr "" #: ../git-debrebase:1721 #, perl-format msgid "%s: laundered (head was %s)\n" msgstr "" #: ../git-debrebase:1735 msgid "you are in the middle of a git-rebase already" msgstr "" #: ../git-debrebase:1761 msgid "launder for rebase" msgstr "" #: ../git-debrebase:1766 msgid "analyse does not support any options" msgstr "" #: ../git-debrebase:1768 msgid "too many arguments to analyse" msgstr "" #: ../git-debrebase:1801 #, perl-format msgid "%s already exists" msgstr "" #: ../git-debrebase:1803 msgid "HEAD symref is not to refs/heads/" msgstr "" #: ../git-debrebase:1826 #, perl-format msgid "OK, you are ahead of %s\n" msgstr "" #: ../git-debrebase:1830 #, perl-format msgid "you are behind %s, divergence risk" msgstr "" #: ../git-debrebase:1834 #, perl-format msgid "you have diverged from %s" msgstr "" #: ../git-debrebase:1856 msgid "remote dgit branch" msgstr "" #: ../git-debrebase:1859 msgid "remote dgit branch for sid" msgstr "" #: ../git-debrebase:1887 msgid "Recorded previous head for preservation" msgstr "" #: ../git-debrebase:1895 #, perl-format msgid "could not record ffq-prev: %s" msgstr "" #: ../git-debrebase:1906 #, perl-format msgid "could not check ffq-prev: %s" msgstr "" #: ../git-debrebase:1926 msgid "fast forward" msgstr "" #: ../git-debrebase:1936 msgid "Declare fast forward / record previous work" msgstr "" #: ../git-debrebase:1948 msgid "No ffq-prev to stitch." msgstr "" #: ../git-debrebase:1965 msgid "need NEW-VERSION [UPS-COMMITTISH]" msgstr "" #: ../git-debrebase:1970 #, perl-format msgid "bad version number `%s'" msgstr "" #: ../git-debrebase:1988 #, perl-format msgid "upstream piece `%s'" msgstr "" #: ../git-debrebase:1989 msgid "upstream (main piece" msgstr "" #: ../git-debrebase:2009 msgid "for each EXTRA-UPS-NAME need EXTRA-UPS-COMMITISH" msgstr "" #: ../git-debrebase:2027 msgid "old anchor is recognised due to --anchor, cannot check upstream" msgstr "old anchor is recognized due to --anchor, cannot check upstream" #: ../git-debrebase:2043 #, perl-format msgid "" "previous upstream combine %s mentions %d pieces (each implying one parent) " "but has %d parents (one per piece plus maybe a previous combine)" msgstr "" #: ../git-debrebase:2052 #, perl-format msgid "previous upstream combine %s first piece is not `.'" msgstr "" #: ../git-debrebase:2065 #, perl-format msgid "" "previous upstream %s is from git-debrebase but not an `upstream-combine' " "commit" msgstr "" #: ../git-debrebase:2076 #, perl-format msgid "introducing upstream piece `%s'" msgstr "" #: ../git-debrebase:2079 #, perl-format msgid "dropping upstream piece `%s'" msgstr "" #: ../git-debrebase:2082 #, perl-format msgid "not fast forward: %s %s" msgstr "" #: ../git-debrebase:2193 msgid "Previous head already recorded\n" msgstr "" #: ../git-debrebase:2197 #, perl-format msgid "Could not preserve: %s" msgstr "" #: ../git-debrebase:2202 ../git-debrebase:2208 ../git-debrebase:2214 #: ../git-debrebase:2304 ../git-debrebase:2313 ../git-debrebase:2337 #: ../git-debrebase:2401 msgid "no arguments allowed" msgstr "" #: ../git-debrebase:2236 msgid "branch contains furniture (not laundered)" msgstr "" #: ../git-debrebase:2237 msgid "branch is unlaundered" msgstr "" #: ../git-debrebase:2238 msgid "branch needs laundering" msgstr "" #: ../git-debrebase:2239 msgid "branch not in git-debrebase form" msgstr "" #: ../git-debrebase:2249 msgid "current branch contents, in git-debrebase terms:\n" msgstr "" #: ../git-debrebase:2251 msgid " branch is laundered\n" msgstr "" #: ../git-debrebase:2267 #, perl-format msgid " %s is not well-defined\n" msgstr "" #: ../git-debrebase:2273 msgid "key git-debrebase commits:\n" msgstr "" #: ../git-debrebase:2274 msgid "anchor" msgstr "" #: ../git-debrebase:2275 msgid "breakwater" msgstr "" #: ../git-debrebase:2280 msgid "branch and ref status, in git-debrebase terms:\n" msgstr "" #: ../git-debrebase:2287 msgid " unstitched; previous tip was:\n" msgstr "" #: ../git-debrebase:2290 msgid " stitched? (no record of git-debrebase work)\n" msgstr "" #: ../git-debrebase:2292 msgid " stitched\n" msgstr "" #: ../git-debrebase:2294 msgid " not git-debrebase (diverged since last stitch)\n" msgstr "" #: ../git-debrebase:2297 msgid "you are currently rebasing\n" msgstr "" #: ../git-debrebase:2314 ../git-debrebase:2327 msgid "launder for git-debrebase quick" msgstr "" #: ../git-debrebase:2321 ../git-debrebase:2351 msgid "No ongoing git-debrebase session." msgstr "" #: ../git-debrebase:2390 msgid "Commit patch queue (exported by git-debrebase)" msgstr "" #: ../git-debrebase:2407 msgid "No (more) patches to export." msgstr "" #: ../git-debrebase:2414 #, perl-format msgid "" "Patch export produced patch amendments (abandoned output commit %s). Try " "laundering first." msgstr "" #: ../git-debrebase:2434 #, perl-format msgid "%s contains comments, which will be discarded" msgstr "" #: ../git-debrebase:2439 #, perl-format msgid "patch %s repeated in %s !" msgstr "" #: ../git-debrebase:2446 #, perl-format msgid "Unused patch file %s will be discarded" msgstr "" #: ../git-debrebase:2454 msgid "ffq-prev exists, this is already managed by git-debrebase!" msgstr "" #: ../git-debrebase:2459 msgid "ahead of debrebase-last, this is already managed by git-debrebase!" msgstr "" #: ../git-debrebase:2476 msgid "want only 1 optional argument, the upstream git commitish" msgstr "" #: ../git-debrebase:2481 msgid "missing Version from changelog\n" msgstr "" #: ../git-debrebase:2497 #, perl-format msgid "" "upstream (%s) and HEAD are not\n" "identical in upstream files. See diffstat above, or run\n" " git diff %s HEAD -- :!/debian :/\n" msgstr "" #: ../git-debrebase:2505 #, perl-format msgid "upstream (%s) is not an ancestor of HEAD" msgstr "" #: ../git-debrebase:2512 #, perl-format msgid "" "history between upstream (%s) and HEAD contains direct changes to upstream " "files - are you sure this is a gbp (patches-unapplied) branch?" msgstr "" #: ../git-debrebase:2514 #, perl-format msgid "list expected changes with: %s\n" msgstr "" #: ../git-debrebase:2521 #, perl-format msgid "upstream (%s) contains debian/ directory" msgstr "" #: ../git-debrebase:2539 msgid "neither of the first two changelog entries are released\n" msgstr "" #: ../git-debrebase:2545 #, perl-format msgid "could not find suitable maintainer view tag %s\n" msgstr "" #: ../git-debrebase:2548 #, perl-format msgid "HEAD is not FF from maintainer tag %s!" msgstr "" #: ../git-debrebase:2551 #, perl-format msgid "dgit view tag %s not found\n" msgstr "" #: ../git-debrebase:2553 #, perl-format msgid "dgit view tag %s is not FF from maintainer tag %s\n" msgstr "" #: ../git-debrebase:2555 #, perl-format msgid "will stitch in dgit view, %s\n" msgstr "" #: ../git-debrebase:2562 #, perl-format msgid "" "Cannot confirm dgit view: %s\n" "Failed to stitch in dgit view (see messages above).\n" "dgit --overwrite will be needed on the first dgit push after conversion.\n" msgstr "" #: ../git-debrebase:2608 #, perl-format msgid "%s: converted from patched-unapplied (gbp) branch format, OK\n" msgstr "" #: ../git-debrebase:2637 #, perl-format msgid "" "%s: converted to git-buildpackage branch format\n" "%s: WARNING: do not now run \"git-debrebase\" any more\n" "%s: WARNING: doing so would drop all upstream patches!\n" msgstr "" #: ../git-debrebase:2658 msgid "takes 1 optional argument, the upstream commitish" msgstr "" #: ../git-debrebase:2666 #, perl-format msgid "%s, from command line" msgstr "" #: ../git-debrebase:2680 #, perl-format msgid "" "%s: Branch already seems to be in git-debrebase format!\n" "%s: --always-convert-anyway would do the conversion operation anyway\n" "%s: but is probably a bad idea. Probably, you wanted to do nothing.\n" msgstr "" #: ../git-debrebase:2684 msgid "Branch already in git-debrebase format." msgstr "" #: ../git-debrebase:2696 msgid "Considering possible commits corresponding to upstream:\n" msgstr "" #: ../git-debrebase:2704 #, perl-format msgid "git tag %s" msgstr "" #: ../git-debrebase:2710 #, perl-format msgid " git tag: no suitable tag found (tried %s)\n" msgstr "" #: ../git-debrebase:2719 #, perl-format msgid "opendir build-products-dir %s: %s" msgstr "" #: ../git-debrebase:2725 #, perl-format msgid " orig: found what looks like a .orig, %s\n" msgstr "" #: ../git-debrebase:2756 #, perl-format msgid " orig: no suitable origs found (looked for %s in %s)\n" msgstr "" #: ../git-debrebase:2765 msgid "Evaluating possible commits corresponding to upstream:\n" msgstr "" #: ../git-debrebase:2806 #, perl-format msgid " %s: couldn't apply patches: gbp pq %s" msgstr "" #: ../git-debrebase:2815 #, perl-format msgid " %s: applying patches gives different tree\n" msgstr "" #: ../git-debrebase:2829 msgid "" "Could not find or construct a suitable upstream commit.\n" "Rerun adding --diagnose after convert-from-dgit-view, or pass a\n" "upstream commmit explicitly or provide suitable origs.\n" msgstr "" #: ../git-debrebase:2835 #, perl-format msgid "Yes, will base new branch on %s\n" msgstr "" #: ../git-debrebase:2840 #, perl-format msgid "" "Result of applying debian/patches/ onto the upstream is not the same as " "HEAD.\n" "(Applying patches gave the commit %s)\n" "Perhaps the upstream is not right, or not all of the delta is in d/patches.\n" msgstr "" #: ../git-debrebase:2848 msgid "Output of conversion does not match input!" msgstr "" #: ../git-debrebase:2856 msgid "forget-was-ever-debrebase takes no further arguments" msgstr "" #: ../git-debrebase:2860 #, perl-format msgid "Not suitable for recording git-debrebaseness anyway: %s" msgstr "" #: ../git-debrebase:2962 msgid "bad options\n" msgstr "" #: ../git-debrebase:2972 #, perl-format msgid "" "%s: with git-debrebase, get-rebase -i option may only be followed by more " "options (as separate arguments)" msgstr "" #: ../git-debrebase:3002 #, perl-format msgid "unknown git-debrebase sub-operation %s" msgstr "" #: ../Debian/Dgit.pm:299 #, perl-format msgid "error: %s\n" msgstr "" #: ../Debian/Dgit.pm:325 #, perl-format msgid "getcwd failed: %s\n" msgstr "" #: ../Debian/Dgit.pm:344 msgid "terminated, reporting successful completion" msgstr "" #: ../Debian/Dgit.pm:346 #, perl-format msgid "failed with error exit status %s" msgstr "" #: ../Debian/Dgit.pm:349 #, perl-format msgid "died due to fatal signal %s" msgstr "" #: ../Debian/Dgit.pm:353 #, perl-format msgid "failed with unknown wait status %s" msgstr "" #: ../Debian/Dgit.pm:359 msgid "failed command" msgstr "" #: ../Debian/Dgit.pm:365 #, perl-format msgid "failed to fork/exec: %s" msgstr "" #: ../Debian/Dgit.pm:367 #, perl-format msgid "subprocess %s" msgstr "" #: ../Debian/Dgit.pm:369 msgid "subprocess produced invalid output" msgstr "" #: ../Debian/Dgit.pm:460 msgid "stat source file: %S" msgstr "" #: ../Debian/Dgit.pm:470 msgid "stat destination file: %S" msgstr "" #: ../Debian/Dgit.pm:489 msgid "finally install file after cp: %S" msgstr "" #: ../Debian/Dgit.pm:495 msgid "delete old file after cp: %S" msgstr "" #: ../Debian/Dgit.pm:516 msgid "" "not in a git working tree?\n" "(git rev-parse --show-toplevel produced no output)\n" msgstr "" #: ../Debian/Dgit.pm:519 #, perl-format msgid "chdir toplevel %s: %s\n" msgstr "" #: ../Debian/Dgit.pm:627 msgid "git index contains changes (does not match HEAD)" msgstr "" #: ../Debian/Dgit.pm:628 msgid "working tree is dirty (does not match HEAD)" msgstr "" #: ../Debian/Dgit.pm:653 msgid "using specified upstream commitish" msgstr "" #: ../Debian/Dgit.pm:660 #, perl-format msgid "" "Could not determine appropriate upstream commitish.\n" " (Tried these tags: %s)\n" " Check version, and specify upstream commitish explicitly." msgstr "" #: ../Debian/Dgit.pm:665 ../Debian/Dgit.pm:667 #, perl-format msgid "using upstream from git tag %s" msgstr "" #: ../Debian/Dgit.pm:773 msgid "detached HEAD" msgstr "" #: ../Debian/Dgit.pm:774 msgid "HEAD symref is not to refs/" msgstr "" #: ../Debian/Dgit.pm:790 #, perl-format msgid "parsing of %s failed" msgstr "" #: ../Debian/Dgit.pm:799 #, perl-format msgid "" "control file %s is (already) PGP-signed. Note that dgit push needs to " "modify the .dsc and then do the signature itself" msgstr "" #: ../Debian/Dgit.pm:813 #, perl-format msgid "open %s (%s): %s" msgstr "" #: ../Debian/Dgit.pm:834 #, perl-format msgid "missing field %s in %s" msgstr "" #: ../Debian/Dgit.pm:920 msgid "Dummy commit - do not use\n" msgstr "" #: ../Debian/Dgit.pm:941 #, perl-format msgid "exec %s: %s\n" msgstr "" #: ../Debian/Dgit.pm:969 #, perl-format msgid "Taint recorded at time %s for package %s" msgstr "" #: ../Debian/Dgit.pm:971 #, perl-format msgid "Taint recorded at time %s for any package" msgstr "" #: ../Debian/Dgit.pm:973 #, perl-format msgid "Taint recorded for package %s" msgstr "" #: ../Debian/Dgit.pm:975 msgid "Taint recorded for any package" msgstr "" #: ../Debian/Dgit.pm:987 msgid "Uncorrectable error. If confused, consult administrator.\n" msgstr "" #: ../Debian/Dgit.pm:990 msgid "Could perhaps be forced using --deliberately. Consult documentation.\n" msgstr "" #: ../Debian/Dgit.pm:993 #, perl-format msgid "Forcing due to %s\n" msgstr "" #: ../Debian/Dgit.pm:1058 #, perl-format msgid "cannot stat %s/.git: %s" msgstr "" #: ../Debian/Dgit.pm:1081 #, perl-format msgid "failed to mkdir playground parent %s: %s" msgstr "" #: ../Debian/Dgit.pm:1089 #, perl-format msgid "failed to mkdir a playground %s: %s" msgstr "" #: ../Debian/Dgit.pm:1098 #, perl-format msgid "failed to mkdir the playground %s: %s" msgstr "" work/po/messages.pot0000644000000000000000000015123714761250142011712 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the dgit package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: dgit ongoing\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-29 11:56+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../dgit:270 #, perl-format msgid "%s: invalid configuration: %s\n" msgstr "" #: ../dgit:277 msgid "warning: overriding problem due to --force:\n" msgstr "" #: ../dgit:285 #, perl-format msgid "warning: skipping checks or functionality due to --force-%s\n" msgstr "" #: ../dgit:290 #, perl-format msgid "%s: source package %s does not exist in suite %s\n" msgstr "" #: ../dgit:544 #, perl-format msgid "build host child %s" msgstr "" #: ../dgit:549 ../dgit:555 #, perl-format msgid "connection lost: %s" msgstr "" #: ../dgit:550 #, perl-format msgid "protocol violation; %s not expected" msgstr "" #: ../dgit:558 #, perl-format msgid "eof (reading %s)" msgstr "" #: ../dgit:565 msgid "protocol message" msgstr "" #: ../dgit:573 #, perl-format msgid "`%s'" msgstr "" #: ../dgit:594 msgid "bad byte count" msgstr "" #: ../dgit:597 msgid "data block" msgstr "" #: ../dgit:676 #, perl-format msgid "%s ok: %s" msgstr "" #: ../dgit:678 #, perl-format msgid "would be ok: %s (but dry run only)" msgstr "" #: ../dgit:703 msgid "" "main usages:\n" " dgit [dgit-opts] clone [dgit-opts] package [suite] [./dir|/dir]\n" " dgit [dgit-opts] fetch|pull [dgit-opts] [suite]\n" " dgit [dgit-opts] build [dpkg-buildpackage-opts]\n" " dgit [dgit-opts] sbuild [sbuild-opts]\n" " dgit [dgit-opts] pbuilder|cowbuilder [debbuildopts]\n" " dgit [dgit-opts] push [dgit-opts] [suite]\n" " dgit [dgit-opts] push-source [dgit-opts] [suite]\n" " dgit [dgit-opts] rpush build-host:build-dir ...\n" "important dgit options:\n" " -k sign tag and package with instead of default\n" " --dry-run -n do not change anything, but go through the motions\n" " --damp-run -L like --dry-run but make local changes, without " "signing\n" " --new -N allow introducing a new package\n" " --debug -D increase debug level\n" " -c= set git config option (used directly by dgit too)\n" msgstr "" #: ../dgit:722 msgid "Perhaps the upload is stuck in incoming. Using the version from git.\n" msgstr "" #: ../dgit:726 #, perl-format msgid "" "%s: %s\n" "%s" msgstr "" #: ../dgit:731 msgid "too few arguments" msgstr "" #: ../dgit:850 #, perl-format msgid "multiple values for %s (in %s git config)" msgstr "" #: ../dgit:853 #, perl-format msgid "value for config option %s (in %s git config) contains newline(s)!" msgstr "" #: ../dgit:873 #, perl-format msgid "" "need value for one of: %s\n" "%s: distro or suite appears not to be (properly) supported" msgstr "" #: ../dgit:930 #, perl-format msgid "bad syntax for (nominal) distro `%s' (does not match %s)" msgstr "" #: ../dgit:945 #, perl-format msgid "backports-quirk needs % or ( )" msgstr "" #: ../dgit:961 #, perl-format msgid "%s needs t (true, y, 1) or f (false, n, 0) not `%s'" msgstr "" #: ../dgit:981 msgid "readonly needs t (true, y, 1) or f (false, n, 0) or a (auto)" msgstr "" #: ../dgit:999 #, perl-format msgid "unknown %s `%s'" msgstr "" #: ../dgit:1004 ../git-debrebase:1548 ../Debian/Dgit.pm:212 msgid "internal error" msgstr "" #: ../dgit:1006 msgid "pushing but distro is configured readonly" msgstr "" #: ../dgit:1010 msgid "" "Push failed, before we got started.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:1033 #, perl-format msgid "" "dgit: quilt mode `%s' (for format `%s') implies split view, but split-view " "set to `%s'" msgstr "" #: ../dgit:1196 msgid "this operation does not support multiple comma-separated suites" msgstr "" #: ../dgit:1264 #, perl-format msgid "fetch of %s failed (%s): %s" msgstr "" #: ../dgit:1271 #, perl-format msgid "fetch of %s gave HTTP code %s" msgstr "" #: ../dgit:1292 msgid "ftpmasterapi archive query method takes no data part" msgstr "" #: ../dgit:1310 #, perl-format msgid "unknown suite %s, maybe -d would help" msgstr "" #: ../dgit:1314 #, perl-format msgid "multiple matches for suite %s\n" msgstr "" #: ../dgit:1316 #, perl-format msgid "suite %s info has no codename\n" msgstr "" #: ../dgit:1318 #, perl-format msgid "suite %s maps to bad codename\n" msgstr "" #: ../dgit:1320 ../dgit:1345 msgid "bad ftpmaster api response: " msgstr "" #: ../dgit:1334 #, perl-format msgid "bad version: %s\n" msgstr "" #: ../dgit:1336 msgid "bad component" msgstr "" #: ../dgit:1339 msgid "bad filename" msgstr "" #: ../dgit:1341 msgid "bad sha256sum" msgstr "" #: ../dgit:1392 msgid "aptget archive query method takes no data part" msgstr "" #: ../dgit:1476 #, perl-format msgid "" "apt seemed to not to update dgit's cached Release files for %s.\n" "(Perhaps %s\n" " is on a filesystem mounted `noatime'; if so, please use `relatime'.)\n" msgstr "" #: ../dgit:1500 #, perl-format msgid "Release file (%s) specifies intolerable %s" msgstr "" #: ../dgit:1526 msgid "apt-get source did not produce a .dsc" msgstr "" #: ../dgit:1527 #, perl-format msgid "apt-get source produced several .dscs (%s)" msgstr "" #: ../dgit:1632 #, perl-format msgid "" "unable to canonicalise suite using package %s which does not appear to exist " "in suite %s; --existing-package may help" msgstr "" #: ../dgit:1771 #, perl-format msgid "cannot operate on %s suite" msgstr "" #: ../dgit:1774 #, perl-format msgid "canonical suite name for %s is %s" msgstr "" #: ../dgit:1776 #, perl-format msgid "canonical suite name is %s" msgstr "" #: ../dgit:1796 #, perl-format msgid "%s has hash %s but archive told us to expect %s" msgstr "" #: ../dgit:1802 #, perl-format msgid "unsupported source format %s, sorry" msgstr "" #: ../dgit:1829 #, perl-format msgid "diverting to %s (using config for %s)" msgstr "" #: ../dgit:1852 #, perl-format msgid "unknown git-check `%s'" msgstr "" #: ../dgit:1867 #, perl-format msgid "unknown git-create `%s'" msgstr "" #: ../dgit:1904 #, perl-format msgid "%s: warning: removing from %s: %s\n" msgstr "" #: ../dgit:1950 #, perl-format msgid "could not parse .dsc %s line `%s'" msgstr "" #: ../dgit:1961 #, perl-format msgid "missing any supported Checksums-* or Files field in %s" msgstr "" #: ../dgit:2007 #, perl-format msgid "hash or size of %s varies in %s fields (between: %s)" msgstr "" #: ../dgit:2016 #, perl-format msgid "file list in %s varies between hash fields!" msgstr "" #: ../dgit:2020 #, perl-format msgid "%s has no files list field(s)" msgstr "" #: ../dgit:2026 #, perl-format msgid "no file appears in all file lists (looked in: %s)" msgstr "" #: ../dgit:2069 #, perl-format msgid "purportedly source-only changes polluted by %s\n" msgstr "" #: ../dgit:2081 msgid "cannot find section/priority from .changes Files field" msgstr "" #: ../dgit:2094 msgid "" "archive does not support .orig check; hope you used --ch:--sa/-sd if needed\n" msgstr "" #: ../dgit:2110 #, perl-format msgid ".dsc %s missing entry for %s" msgstr "" #: ../dgit:2115 #, perl-format msgid "%s: %s (archive) != %s (local .dsc)" msgstr "" #: ../dgit:2123 #, perl-format msgid "archive %s: %s" msgstr "" #: ../dgit:2130 #, perl-format msgid "archive contains %s with different checksum" msgstr "" #: ../dgit:2158 #, perl-format msgid "edited .changes for archive .orig contents: %s %s" msgstr "" #: ../dgit:2166 #, perl-format msgid "[new .changes left in %s]" msgstr "" #: ../dgit:2169 #, perl-format msgid "%s already has appropriate .orig(s) (if any)" msgstr "" #: ../dgit:2188 #, perl-format msgid "" "unexpected commit author line format `%s' (was generated from changelog " "Maintainer field)" msgstr "" #: ../dgit:2211 msgid "" "\n" "Unfortunately, this source package uses a feature of dpkg-source where\n" "the same source package unpacks to different source code on different\n" "distros. dgit cannot safely operate on such packages on affected\n" "distros, because the meaning of source packages is not stable.\n" "\n" "Please ask the distro/maintainer to remove the distro-specific series\n" "files and use a different technique (if necessary, uploading actually\n" "different packages, if different distros are supposed to have\n" "different code).\n" "\n" msgstr "" #: ../dgit:2223 #, perl-format msgid "" "Found active distro-specific series file for %s (%s): %s, cannot continue" msgstr "" #: ../dgit:2254 msgid "Dpkg::Vendor `current vendor'" msgstr "" #: ../dgit:2256 msgid "(base) distro being accessed" msgstr "" #: ../dgit:2258 msgid "(nominal) distro being accessed" msgstr "" #: ../dgit:2263 #, perl-format msgid "build-products-dir %s is not accessible: %s\n" msgstr "" #: ../dgit:2301 #, perl-format msgid "%s: multiple representations of similar orig %s:\n" msgstr "" #: ../dgit:2305 #, perl-format msgid " %s: in %s (%s)\n" msgstr "" #: ../dgit:2310 msgid "Duplicate/inconsistent orig tarballs. Delete the spurious ones." msgstr "" #: ../dgit:2327 #, perl-format msgid "" "%s: found orig(s) in .. missing from build-products-dir, transferring:\n" msgstr "" #: ../dgit:2331 #, perl-format msgid "check orig file %s in bpd %s: %s" msgstr "" #: ../dgit:2333 #, perl-format msgid "check orig file %s in ..: %s" msgstr "" #: ../dgit:2336 #, perl-format msgid "check target of orig symlink %s in ..: %s" msgstr "" #: ../dgit:2345 #, perl-format msgid "%s: cloned orig symlink from ..: %s\n" msgstr "" #: ../dgit:2349 #, perl-format msgid "%s: hardlinked orig from ..: %s\n" msgstr "" #: ../dgit:2352 #, perl-format msgid "failed to make %s a hardlink to %s: %s" msgstr "" #: ../dgit:2358 #, perl-format msgid "%s: symmlinked orig from .. on other filesystem: %s\n" msgstr "" #: ../dgit:2429 #, perl-format msgid "dgit (child): exec %s: %s" msgstr "" #: ../dgit:2491 msgid "package changelog" msgstr "" #: ../dgit:2531 msgid "package changelog has no entries!" msgstr "" #: ../dgit:2600 ../dgit:2605 #, perl-format msgid "accessing %s: %s" msgstr "" #: ../dgit:2622 ../dgit:2629 #, perl-format msgid "saving %s: %s" msgstr "" #: ../dgit:2655 ../dgit:6433 msgid "source package" msgstr "" #: ../dgit:2735 #, perl-format msgid "%s: trying slow absurd-git-apply..." msgstr "" #: ../dgit:2755 #, perl-format msgid "%s failed: %s\n" msgstr "" #: ../dgit:2765 #, perl-format msgid "" "gbp-pq import and dpkg-source disagree!\n" " gbp-pq import gave commit %s\n" " gbp-pq import gave tree %s\n" " dpkg-source --before-build gave tree %s\n" msgstr "" #: ../dgit:2785 #, perl-format msgid "synthesised git commit from .dsc %s" msgstr "" #: ../dgit:2789 msgid "Import of source package" msgstr "" #: ../dgit:2809 #, perl-format msgid "" "\n" "Version actually in archive: %s (older)\n" "Last version pushed with dgit: %s (newer or same)\n" "%s\n" msgstr "" #: ../dgit:2851 #, perl-format msgid "using existing %s" msgstr "" #: ../dgit:2855 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (perhaps you should delete this " "file?)" msgstr "" #: ../dgit:2859 #, perl-format msgid "need to fetch correct version of %s" msgstr "" #: ../dgit:2875 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (got wrong file from archive!)" msgstr "" #: ../dgit:2970 msgid "too many iterations trying to get sane fetch!" msgstr "" #: ../dgit:2985 #, perl-format msgid "warning: git ls-remote %s reported %s; this is silly, ignoring it.\n" msgstr "" #: ../dgit:3029 #, perl-format msgid "warning: git fetch %s created %s; this is silly, deleting it.\n" msgstr "" #: ../dgit:3044 #, perl-format msgid "" "--dry-run specified but we actually wanted the results of git fetch,\n" "so this is not going to work. Try running dgit fetch first,\n" "or using --damp-run instead of --dry-run. (Wanted: %s.)\n" msgstr "" #: ../dgit:3049 #, perl-format msgid "" "warning: git ls-remote suggests we want %s\n" "warning: and it should refer to %s\n" "warning: but git fetch didn't fetch that object to any relevant ref.\n" "warning: This may be due to a race with someone updating the server.\n" "warning: Will try again...\n" msgstr "" #: ../dgit:3196 #, perl-format msgid "not chasing .dsc distro %s: not fetching %s" msgstr "" #: ../dgit:3201 #, perl-format msgid ".dsc names distro %s: fetching %s" msgstr "" #: ../dgit:3206 #, perl-format msgid "" ".dsc Dgit metadata is in context of distro %s\n" "for which we have no configured url and .dsc provides no hint\n" msgstr "" #: ../dgit:3216 #, perl-format msgid "" ".dsc Dgit metadata is in context of distro %s\n" "for which we have no configured url;\n" ".dsc provides hinted url with protocol %s which is unsafe.\n" "(can be overridden by config - consult documentation)\n" msgstr "" #: ../dgit:3236 msgid "rewrite map" msgstr "" #: ../dgit:3243 msgid "server's git history rewrite map contains a relevant entry!" msgstr "" #: ../dgit:3247 msgid "using rewritten git hash in place of .dsc value" msgstr "" #: ../dgit:3249 msgid "server data says .dsc hash is to be disregarded" msgstr "" #: ../dgit:3256 msgid "additional commits" msgstr "" #: ../dgit:3259 #, perl-format msgid "" ".dsc Dgit metadata requires commit %s\n" "but we could not obtain that object anywhere.\n" msgstr "" #: ../dgit:3284 msgid "last upload to archive" msgstr "" #: ../dgit:3288 msgid "no version available from the archive" msgstr "" #: ../dgit:3371 msgid "dgit suite branch on dgit git server" msgstr "" #: ../dgit:3378 msgid "dgit client's archive history view" msgstr "" #: ../dgit:3383 msgid "Dgit field in .dsc from archive" msgstr "" #: ../dgit:3411 #, perl-format msgid "" "\n" "Git commit in archive is behind the last version allegedly pushed/uploaded.\n" "Commit referred to by archive: %s\n" "Last version pushed with dgit: %s\n" "%s\n" msgstr "" #: ../dgit:3424 msgid "archive .dsc names newer git commit" msgstr "" #: ../dgit:3427 msgid "archive .dsc names other git commit, fixing up" msgstr "" #: ../dgit:3448 #, perl-format msgid "" "\n" "Package not found in the archive, but has allegedly been pushed using dgit.\n" "%s\n" msgstr "" #: ../dgit:3457 #, perl-format msgid "" "\n" "Warning: relevant archive skew detected.\n" "Archive allegedly contains %s\n" "But we were not able to obtain any version from the archive or git.\n" "\n" msgstr "" #: ../dgit:3542 #, perl-format msgid "" "Record %s (%s) in archive suite %s\n" "\n" "Record that\n" msgstr "" #: ../dgit:3555 msgid "should be treated as descended from\n" msgstr "" #: ../dgit:3573 msgid "dgit repo server tip (last push)" msgstr "" #: ../dgit:3575 msgid "local tracking tip (last fetch)" msgstr "" #: ../dgit:3586 #, perl-format msgid "" "\n" "Warning: archive skew detected. Using the available version:\n" "Archive allegedly contains %s\n" "We were able to obtain only %s\n" "\n" msgstr "" #: ../dgit:3601 msgid "fetched source tree" msgstr "" #: ../dgit:3637 msgid "debian/changelog merge driver" msgstr "" #: ../dgit:3702 msgid "" "[attr]dgit-defuse-attrs already found, and proper, in .git/info/attributes\n" " not doing further gitattributes setup\n" msgstr "" #: ../dgit:3716 msgid "# ^ see GITATTRIBUTES in dgit(7) and dgit setup-new-tree in dgit(1)\n" msgstr "" #: ../dgit:3731 #, perl-format msgid "install %s: %s" msgstr "" #: ../dgit:3758 #, perl-format msgid "" "dgit: warning: %s contains .gitattributes\n" "dgit: .gitattributes not (fully) defused. Recommended: dgit setup-new-" "tree.\n" msgstr "" #: ../dgit:3780 #, perl-format msgid "fetching %s..." msgstr "" #: ../dgit:3788 #, perl-format msgid "failed to obtain %s: %s" msgstr "" #: ../dgit:3827 #, perl-format msgid "package %s missing in (base suite) %s" msgstr "" #: ../dgit:3859 msgid "local combined tracking branch" msgstr "" #: ../dgit:3861 msgid "archive seems to have rewound: local tracking branch is ahead!" msgstr "" #: ../dgit:3900 #, perl-format msgid "" "Combine archive branches %s [dgit]\n" "\n" "Input branches:\n" msgstr "" #: ../dgit:3914 msgid "" "\n" "Key\n" " * marks the highest version branch, which choose to use\n" " + marks each branch which was not already an ancestor\n" "\n" msgstr "" #: ../dgit:3929 #, perl-format msgid "calculated combined tracking suite %s" msgstr "" #: ../dgit:3947 #, perl-format msgid "ready for work in %s" msgstr "" #: ../dgit:3965 msgid "dry run makes no sense with clone" msgstr "" #: ../dgit:3980 #, perl-format msgid "create `%s': %s" msgstr "" #: ../dgit:3992 msgid "fetching existing git history" msgstr "" #: ../dgit:3995 msgid "starting new git history" msgstr "" #: ../dgit:4020 #, perl-format msgid "" "FYI: Vcs-Git in %s has different url to your vcs-git remote.\n" " Your vcs-git remote url may be out of date. Use dgit update-vcs-git ?\n" msgstr "" #: ../dgit:4025 #, perl-format msgid "fetched into %s" msgstr "" #: ../dgit:4037 #, perl-format msgid "Merge from %s [dgit]" msgstr "" #: ../dgit:4039 #, perl-format msgid "fetched to %s and merged into HEAD" msgstr "" #: ../dgit:4047 #, perl-format msgid "git tree contains %s" msgstr "" #: ../dgit:4058 msgid "you have uncommitted changes to critical files, cannot continue:\n" msgstr "" #: ../dgit:4077 #, perl-format msgid "" "quilt fixup required but quilt mode is `nofix'\n" "HEAD commit%s differs from tree implied by debian/patches%s" msgstr "" #: ../dgit:4094 msgid "nothing quilty to commit, ok." msgstr "" #: ../dgit:4097 msgid " (wanted to commit patch update)" msgstr "" #: ../dgit:4101 msgid "" "Commit Debian 3.0 (quilt) metadata\n" "\n" msgstr "" #: ../dgit:4145 #, perl-format msgid "" "Not doing any fixup of `%s' due to ----no-quilt-fixup or --quilt=nocheck" msgstr "" #: ../dgit:4150 #, perl-format msgid "Format `%s', need to check/update patch stack" msgstr "" #: ../dgit:4160 #, perl-format msgid "commit id %s" msgstr "" #: ../dgit:4166 #, perl-format msgid "and left in %s" msgstr "" #: ../dgit:4192 #, perl-format msgid "Wanted tag %s (%s) on dgit server, but not found\n" msgstr "" #: ../dgit:4195 #, perl-format msgid "Wanted tag %s (one of: %s) on dgit server, but not found\n" msgstr "" #: ../dgit:4203 #, perl-format msgid "%s (%s) .. %s (%s) is not fast forward\n" msgstr "" #: ../dgit:4212 msgid "version currently in archive" msgstr "" #: ../dgit:4221 #, perl-format msgid "Checking package changelog for archive version %s ..." msgstr "" #: ../dgit:4230 #, perl-format msgid "%s field from dpkg-parsechangelog %s" msgstr "" #: ../dgit:4241 #, perl-format msgid "Perhaps debian/changelog does not mention %s ?" msgstr "" #: ../dgit:4244 #, perl-format msgid "" "%s is %s\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" #: ../dgit:4249 #, perl-format msgid "" "d/changelog entry for %s is unfinalised!\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" #: ../dgit:4263 #, perl-format msgid "Declaring that HEAD includes all changes in %s..." msgstr "" #: ../dgit:4319 msgid "Checking that HEAD includes all changes in archive..." msgstr "" #: ../dgit:4328 msgid "maintainer view tag" msgstr "" #: ../dgit:4330 msgid "dgit view tag" msgstr "" #: ../dgit:4331 msgid "current archive contents" msgstr "" #: ../dgit:4344 msgid "" "| Not fast forward; maybe --overwrite is needed ? Please see dgit(1).\n" msgstr "" #: ../dgit:4354 #, perl-format msgid "Declare fast forward from %s\n" msgstr "" #: ../dgit:4355 #, perl-format msgid "Make fast forward from %s\n" msgstr "" #: ../dgit:4359 #, perl-format msgid "Made pseudo-merge of %s into dgit view." msgstr "" #: ../dgit:4372 #, perl-format msgid "Declare fast forward from %s" msgstr "" #: ../dgit:4380 #, perl-format msgid "Make pseudo-merge of %s into your HEAD." msgstr "" #: ../dgit:4392 #, perl-format msgid "-p specified %s but changelog specified %s" msgstr "" #: ../dgit:4414 #, perl-format msgid "%s is for %s %s but debian/changelog is for %s %s" msgstr "" #: ../dgit:4468 #, perl-format msgid "changes field %s `%s' does not match changelog `%s'" msgstr "" #: ../dgit:5701 #, perl-format msgid "dgit: cannot represent change: %s: %s\n" msgstr "" #: ../dgit:5706 msgid "" "HEAD has changes to .orig[s] which are not representable by `3.0 (quilt)'\n" msgstr "" #: ../dgit:5744 #, perl-format msgid "" "\n" "For full diff showing the problem(s), type:\n" " %s\n" msgstr "" #: ../dgit:5751 #, perl-format msgid "" "--quilt=%s specified, implying patches-unapplied git tree\n" " but git tree differs from orig in upstream files." msgstr "" #: ../dgit:5757 msgid "" "\n" " ... debian/patches is missing; perhaps this is a patch queue branch?" msgstr "" #: ../dgit:5764 #, perl-format msgid "" "--quilt=%s specified, implying patches-applied git tree\n" " but git tree differs from result of applying debian/patches to upstream\n" msgstr "" #: ../dgit:5778 #, perl-format msgid "Combine debian/ with upstream source for %s\n" msgstr "" #: ../dgit:5786 msgid "dgit view: creating patches-applied version using gbp pq" msgstr "" #: ../dgit:5797 #, perl-format msgid "" "--quilt=%s specified, implying that HEAD is for use with a\n" " tool which does not create patches for changes to upstream\n" " .gitignores: but, such patches exist in debian/patches.\n" msgstr "" #: ../dgit:5805 msgid "dgit view: creating patch to represent .gitignore changes" msgstr "" #: ../dgit:5810 #, perl-format msgid "%s already exists; but want to create it to record .gitignore changes" msgstr "" #: ../dgit:5815 msgid "" "Subject: Update .gitignore from Debian packaging branch\n" "\n" "The Debian packaging git branch contains these updates to the upstream\n" ".gitignore file(s). This patch is autogenerated, to provide these\n" "updates to users of the official Debian archive view of the package.\n" msgstr "" #: ../dgit:5837 msgid "Commit patch to update .gitignore\n" msgstr "" #: ../dgit:5907 msgid "maximum search space exceeded" msgstr "" #: ../dgit:5925 #, perl-format msgid "has %s not %s" msgstr "" #: ../dgit:5934 msgid "root commit" msgstr "" #: ../dgit:5940 #, perl-format msgid "merge (%s nontrivial parents)" msgstr "" #: ../dgit:5952 #, perl-format msgid "changed %s" msgstr "" #: ../dgit:5971 #, perl-format msgid "" "\n" "%s: error: quilt fixup cannot be linear. Stopped at:\n" msgstr "" #: ../dgit:5978 #, perl-format msgid "%s: %s: %s\n" msgstr "" #: ../dgit:5990 msgid "quilt history linearisation failed. Search `quilt fixup' in dgit(7).\n" msgstr "" #: ../dgit:5993 msgid "quilt fixup cannot be linear, smashing..." msgstr "" #: ../dgit:6007 #, perl-format msgid "" "Automatically generated patch (%s)\n" "Last (up to) %s git changes, FYI:\n" "\n" msgstr "" #: ../dgit:6014 msgid "quiltify linearisation planning successful, executing..." msgstr "" #: ../dgit:6048 msgid "contains unexpected slashes\n" msgstr "" #: ../dgit:6049 msgid "contains leading punctuation\n" msgstr "" #: ../dgit:6050 msgid "contains bad character(s)\n" msgstr "" #: ../dgit:6051 msgid "is series file\n" msgstr "" #: ../dgit:6052 msgid "too long\n" msgstr "" #: ../dgit:6056 #, perl-format msgid "quiltifying commit %s: ignoring/dropping Gbp-Pq %s: %s" msgstr "" #: ../dgit:6085 #, perl-format msgid "dgit: patch title transliteration error: %s" msgstr "" #: ../dgit:6160 #, perl-format msgid "" "quilt mode %s does not make sense (or is not supported) with single-debian-" "patch" msgstr "" #: ../dgit:6185 msgid "converted" msgstr "" #: ../dgit:6186 #, perl-format msgid "dgit view: created (%s)" msgstr "" #: ../dgit:6240 msgid "Commit removal of .pc (quilt series tracking data)\n" msgstr "" #: ../dgit:6250 msgid "starting quiltify (single-debian-patch)" msgstr "" #: ../dgit:6286 #, perl-format msgid "regenerating patch using git diff (--quilt=%s)" msgstr "" #: ../dgit:6367 msgid "" "warning: package uses dpkg-source include-binaries feature - not all changes " "are visible in patches!\n" msgstr "" #: ../dgit:6376 #, perl-format msgid "warning: ignoring bad include-binaries file %s: %s\n" msgstr "" #: ../dgit:6379 #, perl-format msgid "forbidden path component '%s'" msgstr "" #: ../dgit:6389 #, perl-format msgid "path starts with '%s'" msgstr "" #: ../dgit:6399 #, perl-format msgid "path to '%s' not a plain file or directory" msgstr "" #: ../dgit:6457 #, perl-format msgid "dgit: split brain (separate dgit view) may be needed (--quilt=%s)." msgstr "" #: ../dgit:6489 #, perl-format msgid "dgit view: found cached (%s)" msgstr "" #: ../dgit:6494 msgid "dgit view: found cached, no changes required" msgstr "" #: ../dgit:6529 #, perl-format msgid "examining quilt state (multiple patches, %s mode)" msgstr "" #: ../dgit:6622 msgid "" "failed to apply your git tree's patch stack (from debian/patches/) to\n" " the corresponding upstream tarball(s). Your source tree and .orig\n" " are probably too inconsistent. dgit can only fix up certain kinds of\n" " anomaly (depending on the quilt mode). Please see --quilt= in dgit(1).\n" msgstr "" #: ../dgit:6636 msgid "Tree already contains .pc - will delete it." msgstr "" #: ../dgit:6670 msgid "baredebian quilt fixup: could not find any origs" msgstr "" #: ../dgit:6683 msgid "tarball" msgstr "" #: ../dgit:6701 #, perl-format msgid "Combine orig tarballs for %s %s" msgstr "" #: ../dgit:6717 msgid "tarballs" msgstr "" #: ../dgit:6731 msgid "upstream" msgstr "" #: ../dgit:6755 #, perl-format msgid "%s: base trees orig=%.20s o+d/p=%.20s" msgstr "" #: ../dgit:6765 #, perl-format msgid "" "%s: quilt differences: src: %s orig %s gitignores: %s orig %s\n" "%s: quilt differences: %9.00009s %s o+d/p %9.00009s %s o+d/p" msgstr "" #: ../dgit:6775 msgid "" "This has only a debian/ directory; you probably want --quilt=bare debian." msgstr "" #: ../dgit:6779 msgid "This might be a patches-unapplied branch." msgstr "" #: ../dgit:6782 msgid "This might be a patches-applied branch." msgstr "" #: ../dgit:6785 msgid "Maybe you need one of --[quilt=]gbp --[quilt=]dpm --quilt=unapplied ?" msgstr "" #: ../dgit:6788 msgid "Warning: Tree has .gitattributes. See GITATTRIBUTES in dgit(7)." msgstr "" #: ../dgit:6792 msgid "Maybe orig tarball(s) are not identical to git representation?" msgstr "" #: ../dgit:6803 #, perl-format msgid "starting quiltify (multiple patches, %s mode)" msgstr "" #: ../dgit:6842 msgid "" "\n" "dgit: Building, or cleaning with rules target, in patches-unapplied tree.\n" "dgit: Have to apply the patches - making the tree dirty.\n" "dgit: (Consider specifying --clean=git and (or) using dgit sbuild.)\n" "\n" msgstr "" #: ../dgit:6854 msgid "dgit: Unapplying patches again to tidy up the tree." msgstr "" #: ../dgit:6883 msgid "" "If this is just missing .gitignore entries, use a different clean\n" "mode, eg --clean=dpkg-source,no-check (-wdn/-wddn) to ignore them\n" "or --clean=git (-wg/-wgf) to use `git clean' instead.\n" msgstr "" #: ../dgit:6895 msgid "tree contains uncommitted files and --clean=check specified" msgstr "" #: ../dgit:6898 msgid "tree contains uncommitted files (NB dgit didn't run rules clean)" msgstr "" #: ../dgit:6901 msgid "" "tree contains uncommited, untracked, unignored files\n" "You can use --clean=git[-ff],always (-wga/-wgfa) to delete them.\n" "To include them in the build, it is usually best to just commit them." msgstr "" #: ../dgit:6915 #, perl-format msgid "" "quilt mode %s (generally needs untracked upstream files)\n" "contradicts clean mode %s (which would delete them)\n" msgstr "" #: ../dgit:6932 msgid "tree contains uncommitted files (after running rules clean)" msgstr "" #: ../dgit:6946 msgid "clean takes no additional arguments" msgstr "" #: ../dgit:6965 #, perl-format msgid "-p specified package %s, but changelog says %s" msgstr "" #: ../dgit:6975 msgid "" "dgit: --include-dirty is not supported with split view (including with view-" "splitting quilt modes)" msgstr "" #: ../dgit:6984 #, perl-format msgid "dgit: --quilt=%s, %s" msgstr "" #: ../dgit:6988 msgid "dgit: --upstream-commitish only makes sense with --quilt=baredebian" msgstr "" #: ../dgit:7023 #, perl-format msgid "remove old changes file %s: %s" msgstr "" #: ../dgit:7025 #, perl-format msgid "would remove %s" msgstr "" #: ../dgit:7043 #, perl-format msgid "warning: dgit option %s must be passed before %s on dgit command line\n" msgstr "" #: ../dgit:7050 #, perl-format msgid "" "warning: option %s should probably be passed to dgit before %s sub-command " "on the dgit command line, so that it is seen by dgit and not simply passed " "to %s\n" msgstr "" #: ../dgit:7076 msgid "archive query failed (queried because --since-version not specified)" msgstr "" #: ../dgit:7082 #, perl-format msgid "changelog will contain changes since %s" msgstr "" #: ../dgit:7085 msgid "package seems new, not specifying -v" msgstr "" #: ../dgit:7128 msgid "Wanted to build nothing!" msgstr "" #: ../dgit:7166 #, perl-format msgid "only one changes file from build (%s)\n" msgstr "" #: ../dgit:7173 #, perl-format msgid "%s found in binaries changes file %s" msgstr "" #: ../dgit:7180 #, perl-format msgid "%s unexpectedly not created by build" msgstr "" #: ../dgit:7184 #, perl-format msgid "install new changes %s{,.inmulti}: %s" msgstr "" #: ../dgit:7189 #, perl-format msgid "wrong number of different changes files (%s)" msgstr "" #: ../dgit:7192 #, perl-format msgid "build successful, results in %s\n" msgstr "" #: ../dgit:7205 #, perl-format msgid "" "changes files other than source matching %s already present; building would " "result in ambiguity about the intended results.\n" "Suggest you delete %s.\n" msgstr "" #: ../dgit:7223 msgid "build successful\n" msgstr "" #: ../dgit:7231 #, perl-format msgid "" "%s: warning: build-products-dir set, but not supported by dpkg-buildpackage\n" "%s: warning: build-products-dir will be ignored; files will go to ..\n" msgstr "" #: ../dgit:7342 #, perl-format msgid "remove %s: %s" msgstr "" #: ../dgit:7387 msgid "--include-dirty not supported with --build-products-dir, sorry" msgstr "" #: ../dgit:7413 #, perl-format msgid "put in place new built file (%s): %s" msgstr "" #: ../dgit:7426 msgid "build-source takes no additional arguments" msgstr "" #: ../dgit:7430 #, perl-format msgid "source built, results in %s and %s" msgstr "" #: ../dgit:7437 msgid "" "dgit push-source: --include-dirty/--ignore-dirty does not makesense with " "push-source!" msgstr "" #: ../dgit:7443 msgid "source changes file" msgstr "" #: ../dgit:7445 msgid "user-specified changes file is not source-only" msgstr "" #: ../dgit:7465 ../dgit:7467 #, perl-format msgid "%s (in build products dir): %s" msgstr "" #: ../dgit:7481 msgid "" "perhaps you need to pass -A ? (sbuild's default is to build only\n" "arch-specific binaries; dgit 1.4 used to override that.)\n" msgstr "" #: ../dgit:7494 msgid "" "you asked for a builder but your debbuildopts didn't ask for any binaries -- " "is this really what you meant?" msgstr "" #: ../dgit:7498 msgid "" "we must build a .dsc to pass to the builder but your debbuiltopts forbids " "the building of a source package; cannot continue" msgstr "" #: ../dgit:7528 msgid "incorrect arguments to dgit print-unapplied-treeish" msgstr "" #: ../dgit:7549 msgid "source tree" msgstr "" #: ../dgit:7551 #, perl-format msgid "dgit: import-dsc: %s" msgstr "" #: ../dgit:7564 #, perl-format msgid "unknown dgit import-dsc sub-option `%s'" msgstr "" #: ../dgit:7568 msgid "usage: dgit import-dsc .../PATH/TO/.DSC BRANCH" msgstr "" #: ../dgit:7572 msgid "dry run makes no sense with import-dsc" msgstr "" #: ../dgit:7589 #, perl-format msgid "%s is checked out - will not update it" msgstr "" #: ../dgit:7594 #, perl-format msgid "open import .dsc (%s): %s" msgstr "" #: ../dgit:7596 #, perl-format msgid "read %s: %s" msgstr "" #: ../dgit:7607 msgid "import-dsc signature check failed" msgstr "" #: ../dgit:7610 #, perl-format msgid "%s: warning: importing unsigned .dsc\n" msgstr "" #: ../dgit:7621 msgid "Dgit metadata in .dsc" msgstr "" #: ../dgit:7632 msgid "dgit: import-dsc of .dsc with Dgit field, using git hash" msgstr "" #: ../dgit:7641 #, perl-format msgid "" ".dsc contains Dgit field referring to object %s\n" "Your git tree does not have that object. Try `git fetch' from a\n" "plausible server (browse.dgit.d.o? salsa?), and try the import-dsc again.\n" msgstr "" #: ../dgit:7648 msgid "Not fast forward, forced update." msgstr "" #: ../dgit:7650 #, perl-format msgid "Not fast forward to %s" msgstr "" #: ../dgit:7655 #, perl-format msgid "updated git ref %s" msgstr "" #: ../dgit:7660 #, perl-format msgid "" "Branch %s already exists\n" "Specify ..%s for a pseudo-merge, binding in existing history\n" "Specify +%s to overwrite, discarding existing history\n" msgstr "" #: ../dgit:7680 #, perl-format msgid "lstat %s works but stat gives %s !" msgstr "" #: ../dgit:7682 #, perl-format msgid "stat %s: %s" msgstr "" #: ../dgit:7690 #, perl-format msgid "import %s requires %s, but: %s" msgstr "" #: ../dgit:7709 #, perl-format msgid "cannot import %s which seems to be inside working tree!" msgstr "" #: ../dgit:7713 #, perl-format msgid "symlink %s to %s: %s" msgstr "" #: ../dgit:7714 #, perl-format msgid "made symlink %s -> %s" msgstr "" #: ../dgit:7725 msgid "Import, forced update - synthetic orphan git history." msgstr "" #: ../dgit:7727 msgid "Import, merging." msgstr "" #: ../dgit:7741 #, perl-format msgid "Merge %s (%s) import into %s\n" msgstr "" #: ../dgit:7750 #, perl-format msgid "results are in git ref %s" msgstr "" #: ../dgit:7757 msgid "need only 1 subpath argument" msgstr "" #: ../dgit:7775 msgid "need destination argument" msgstr "" #: ../dgit:7780 #, perl-format msgid "exec git clone: %s\n" msgstr "" #: ../dgit:7788 msgid "no arguments allowed to dgit print-dgit-repos-server-source-url" msgstr "" #: ../dgit:7799 msgid "no arguments allowed to dgit print-dpkg-source-ignores" msgstr "" #: ../dgit:7805 msgid "no arguments allowed to dgit setup-mergechangelogs" msgstr "" #: ../dgit:7812 ../dgit:7818 msgid "no arguments allowed to dgit setup-useremail" msgstr "" #: ../dgit:7824 msgid "no arguments allowed to dgit setup-tree" msgstr "" #: ../dgit:7871 msgid "" "--initiator-tempdir must be used specify an absolute, not relative, " "directory." msgstr "" #: ../dgit:7910 #, perl-format msgid "%s needs a value" msgstr "" #: ../dgit:7914 #, perl-format msgid "bad value `%s' for %s" msgstr "" #: ../dgit:8014 #, perl-format msgid "%s: warning: ignoring unknown force option %s\n" msgstr "" #: ../dgit:8032 #, perl-format msgid "unknown long option `%s'" msgstr "" #: ../dgit:8087 #, perl-format msgid "unknown short option `%s'" msgstr "" #: ../dgit:8102 #, perl-format msgid "%s is set to something other than SIG_DFL\n" msgstr "" #: ../dgit:8106 #, perl-format msgid "%s is blocked\n" msgstr "" #: ../dgit:8112 #, perl-format msgid "" "On entry to dgit, %s\n" "This is a bug produced by something in your execution environment.\n" "Giving up.\n" msgstr "" #: ../dgit:8129 #, perl-format msgid "cannot set command for %s" msgstr "" #: ../dgit:8142 #, perl-format msgid "cannot configure options for %s" msgstr "" #: ../dgit:8162 #, perl-format msgid "unknown quilt-mode `%s'" msgstr "" #: ../dgit:8174 #, perl-format msgid "unknown %s setting `%s'" msgstr "" #: ../dgit:8202 msgid "DRY RUN ONLY\n" msgstr "" #: ../dgit:8203 msgid "DAMP RUN - WILL MAKE LOCAL (UNSIGNED) CHANGES\n" msgstr "" #: ../dgit:8223 #, perl-format msgid "unknown operation %s" msgstr "" #: ../git-debrebase:45 msgid "" "usages:\n" " git-debrebase [] [--|-i ]\n" " git-debrebase [] status\n" " git-debrebase [] prepush [--prose=...]\n" " git-debrebase [] quick|conclude\n" " git-debrebase [] new-upstream [
]\n" " git-debrebase [] convert-from-* ...\n" " ...\n" "See git-debrebase(1), git-debrebase(5), dgit-maint-debrebase(7) (in dgit).\n" msgstr "" #: ../git-debrebase:68 #, perl-format msgid "%s: bad usage: %s\n" msgstr "" #: ../git-debrebase:79 #, perl-format msgid "bad options follow `git-debrebase %s'" msgstr "" #: ../git-debrebase:90 #, perl-format msgid "missing required git config %s" msgstr "" #: ../git-debrebase:363 #, perl-format msgid "%s: snag ignored (-f%s): %s\n" msgstr "" #: ../git-debrebase:366 #, perl-format msgid "%s: snag detected (-f%s): %s\n" msgstr "" #: ../git-debrebase:379 #, perl-format msgid "%s: snags: %d overriden by individual -f options\n" msgstr "" #: ../git-debrebase:385 #, perl-format msgid "%s: snags: %d overriden by global --force\n" msgstr "" #: ../git-debrebase:389 #, perl-format msgid "%s: snags: %d blocker(s) (you could -f, or --force)" msgstr "" #: ../git-debrebase:421 msgid "" "Branch/history seems mangled - no longer in gdr format.\n" "See ILLEGAL OPERATIONS in git-debrebase(5).\n" msgstr "" #: ../git-debrebase:428 #, perl-format msgid "" "%s\n" "Is this meant to be a gdr branch? %s\n" msgstr "" #: ../git-debrebase:433 #, perl-format msgid "" "%s\n" "%s\n" "Consider git-debrebase scrap, to throw away your recent work.\n" msgstr "" #: ../git-debrebase:439 #, perl-format msgid "" "%s\n" "Branch does not seem to be meant to be a git-debrebase branch?\n" "Wrong branch, or maybe you needed git-debrebase convert-from-*.\n" msgstr "" #: ../git-debrebase:450 #, perl-format msgid "" "%s\n" "Branch/history mangled, and diverged since last git-debrebase.\n" "Maybe you reset to, or rebased from, somewhere inappropriate.\n" msgstr "" #: ../git-debrebase:897 #, perl-format msgid "git-debrebase `anchor' but %s" msgstr "" #: ../git-debrebase:899 msgid "has other than two parents" msgstr "" #: ../git-debrebase:900 msgid "contains debian/patches" msgstr "" #: ../git-debrebase:926 msgid "is an origin commit" msgstr "" #: ../git-debrebase:928 msgid "upstream files differ from left parent" msgstr "" #: ../git-debrebase:930 msgid "debian/ differs from right parent" msgstr "" #: ../git-debrebase:941 msgid "edits debian/patches" msgstr "" #: ../git-debrebase:953 msgid "parent's debian is not a directory" msgstr "" #: ../git-debrebase:960 msgid "no changes" msgstr "" #: ../git-debrebase:966 msgid "origin commit" msgstr "" #: ../git-debrebase:1017 #, perl-format msgid "unknown kind of merge from %s" msgstr "" #: ../git-debrebase:1020 msgid "octopus merge" msgstr "" #: ../git-debrebase:1024 msgid "general two-parent merge" msgstr "" #: ../git-debrebase:1041 #, perl-format msgid "inconsistent anchors in merged-breakwaters %s" msgstr "" #: ../git-debrebase:1081 #, perl-format msgid "branch needs laundering (run git-debrebase): %s" msgstr "" #: ../git-debrebase:1109 #, perl-format msgid "packaging change (%s) follows upstream change" msgstr "" #: ../git-debrebase:1110 #, perl-format msgid " (eg %s)" msgstr "" #: ../git-debrebase:1116 msgid "found mixed upstream/packaging commit" msgstr "" #: ../git-debrebase:1117 ../git-debrebase:1125 ../git-debrebase:1130 #: ../git-debrebase:1135 ../git-debrebase:1141 ../git-debrebase:1149 #, perl-format msgid " (%s)" msgstr "" #: ../git-debrebase:1124 #, perl-format msgid "found interchange bureaucracy commit (%s)" msgstr "" #: ../git-debrebase:1129 msgid "found dgit dsc import" msgstr "" #: ../git-debrebase:1134 msgid "found bare dgit dsc import with no prior history" msgstr "" #: ../git-debrebase:1140 msgid "found vanilla merge" msgstr "" #: ../git-debrebase:1147 #, perl-format msgid "found unprocessable commit, cannot cope: %s" msgstr "" #: ../git-debrebase:1215 #, perl-format msgid "found unprocessable commit, cannot cope; %3$s: (commit %1$s) (d.%2$s)" msgstr "" #: ../git-debrebase:1216 #, perl-format msgid "found unprocessable commit, cannot cope: (commit %1$s) (d.%2$s)" msgstr "" #: ../git-debrebase:1337 msgid "bare dgit dsc import" msgstr "" #: ../git-debrebase:1677 ../git-debrebase:1680 #, perl-format msgid "mismatch %s ?" msgstr "" #: ../git-debrebase:1683 #, perl-format msgid "mismatch %s != %s ?" msgstr "" #: ../git-debrebase:1693 #, perl-format msgid "internal error %#x %s %s" msgstr "" #: ../git-debrebase:1721 #, perl-format msgid "%s: laundered (head was %s)\n" msgstr "" #: ../git-debrebase:1735 msgid "you are in the middle of a git-rebase already" msgstr "" #: ../git-debrebase:1761 msgid "launder for rebase" msgstr "" #: ../git-debrebase:1766 msgid "analyse does not support any options" msgstr "" #: ../git-debrebase:1768 msgid "too many arguments to analyse" msgstr "" #: ../git-debrebase:1801 #, perl-format msgid "%s already exists" msgstr "" #: ../git-debrebase:1803 msgid "HEAD symref is not to refs/heads/" msgstr "" #: ../git-debrebase:1826 #, perl-format msgid "OK, you are ahead of %s\n" msgstr "" #: ../git-debrebase:1830 #, perl-format msgid "you are behind %s, divergence risk" msgstr "" #: ../git-debrebase:1834 #, perl-format msgid "you have diverged from %s" msgstr "" #: ../git-debrebase:1856 msgid "remote dgit branch" msgstr "" #: ../git-debrebase:1859 msgid "remote dgit branch for sid" msgstr "" #: ../git-debrebase:1887 msgid "Recorded previous head for preservation" msgstr "" #: ../git-debrebase:1895 #, perl-format msgid "could not record ffq-prev: %s" msgstr "" #: ../git-debrebase:1906 #, perl-format msgid "could not check ffq-prev: %s" msgstr "" #: ../git-debrebase:1926 msgid "fast forward" msgstr "" #: ../git-debrebase:1936 msgid "Declare fast forward / record previous work" msgstr "" #: ../git-debrebase:1948 msgid "No ffq-prev to stitch." msgstr "" #: ../git-debrebase:1965 msgid "need NEW-VERSION [UPS-COMMITTISH]" msgstr "" #: ../git-debrebase:1970 #, perl-format msgid "bad version number `%s'" msgstr "" #: ../git-debrebase:1988 #, perl-format msgid "upstream piece `%s'" msgstr "" #: ../git-debrebase:1989 msgid "upstream (main piece" msgstr "" #: ../git-debrebase:2009 msgid "for each EXTRA-UPS-NAME need EXTRA-UPS-COMMITISH" msgstr "" #: ../git-debrebase:2027 msgid "old anchor is recognised due to --anchor, cannot check upstream" msgstr "" #: ../git-debrebase:2043 #, perl-format msgid "" "previous upstream combine %s mentions %d pieces (each implying one parent) " "but has %d parents (one per piece plus maybe a previous combine)" msgstr "" #: ../git-debrebase:2052 #, perl-format msgid "previous upstream combine %s first piece is not `.'" msgstr "" #: ../git-debrebase:2065 #, perl-format msgid "" "previous upstream %s is from git-debrebase but not an `upstream-combine' " "commit" msgstr "" #: ../git-debrebase:2076 #, perl-format msgid "introducing upstream piece `%s'" msgstr "" #: ../git-debrebase:2079 #, perl-format msgid "dropping upstream piece `%s'" msgstr "" #: ../git-debrebase:2082 #, perl-format msgid "not fast forward: %s %s" msgstr "" #: ../git-debrebase:2193 msgid "Previous head already recorded\n" msgstr "" #: ../git-debrebase:2197 #, perl-format msgid "Could not preserve: %s" msgstr "" #: ../git-debrebase:2202 ../git-debrebase:2208 ../git-debrebase:2214 #: ../git-debrebase:2304 ../git-debrebase:2313 ../git-debrebase:2337 #: ../git-debrebase:2401 msgid "no arguments allowed" msgstr "" #: ../git-debrebase:2236 msgid "branch contains furniture (not laundered)" msgstr "" #: ../git-debrebase:2237 msgid "branch is unlaundered" msgstr "" #: ../git-debrebase:2238 msgid "branch needs laundering" msgstr "" #: ../git-debrebase:2239 msgid "branch not in git-debrebase form" msgstr "" #: ../git-debrebase:2249 msgid "current branch contents, in git-debrebase terms:\n" msgstr "" #: ../git-debrebase:2251 msgid " branch is laundered\n" msgstr "" #: ../git-debrebase:2267 #, perl-format msgid " %s is not well-defined\n" msgstr "" #: ../git-debrebase:2273 msgid "key git-debrebase commits:\n" msgstr "" #: ../git-debrebase:2274 msgid "anchor" msgstr "" #: ../git-debrebase:2275 msgid "breakwater" msgstr "" #: ../git-debrebase:2280 msgid "branch and ref status, in git-debrebase terms:\n" msgstr "" #: ../git-debrebase:2287 msgid " unstitched; previous tip was:\n" msgstr "" #: ../git-debrebase:2290 msgid " stitched? (no record of git-debrebase work)\n" msgstr "" #: ../git-debrebase:2292 msgid " stitched\n" msgstr "" #: ../git-debrebase:2294 msgid " not git-debrebase (diverged since last stitch)\n" msgstr "" #: ../git-debrebase:2297 msgid "you are currently rebasing\n" msgstr "" #: ../git-debrebase:2314 ../git-debrebase:2327 msgid "launder for git-debrebase quick" msgstr "" #: ../git-debrebase:2321 ../git-debrebase:2351 msgid "No ongoing git-debrebase session." msgstr "" #: ../git-debrebase:2390 msgid "Commit patch queue (exported by git-debrebase)" msgstr "" #: ../git-debrebase:2407 msgid "No (more) patches to export." msgstr "" #: ../git-debrebase:2414 #, perl-format msgid "" "Patch export produced patch amendments (abandoned output commit %s). Try " "laundering first." msgstr "" #: ../git-debrebase:2434 #, perl-format msgid "%s contains comments, which will be discarded" msgstr "" #: ../git-debrebase:2439 #, perl-format msgid "patch %s repeated in %s !" msgstr "" #: ../git-debrebase:2446 #, perl-format msgid "Unused patch file %s will be discarded" msgstr "" #: ../git-debrebase:2454 msgid "ffq-prev exists, this is already managed by git-debrebase!" msgstr "" #: ../git-debrebase:2459 msgid "ahead of debrebase-last, this is already managed by git-debrebase!" msgstr "" #: ../git-debrebase:2476 msgid "want only 1 optional argument, the upstream git commitish" msgstr "" #: ../git-debrebase:2481 msgid "missing Version from changelog\n" msgstr "" #: ../git-debrebase:2497 #, perl-format msgid "" "upstream (%s) and HEAD are not\n" "identical in upstream files. See diffstat above, or run\n" " git diff %s HEAD -- :!/debian :/\n" msgstr "" #: ../git-debrebase:2505 #, perl-format msgid "upstream (%s) is not an ancestor of HEAD" msgstr "" #: ../git-debrebase:2512 #, perl-format msgid "" "history between upstream (%s) and HEAD contains direct changes to upstream " "files - are you sure this is a gbp (patches-unapplied) branch?" msgstr "" #: ../git-debrebase:2514 #, perl-format msgid "list expected changes with: %s\n" msgstr "" #: ../git-debrebase:2521 #, perl-format msgid "upstream (%s) contains debian/ directory" msgstr "" #: ../git-debrebase:2539 msgid "neither of the first two changelog entries are released\n" msgstr "" #: ../git-debrebase:2545 #, perl-format msgid "could not find suitable maintainer view tag %s\n" msgstr "" #: ../git-debrebase:2548 #, perl-format msgid "HEAD is not FF from maintainer tag %s!" msgstr "" #: ../git-debrebase:2551 #, perl-format msgid "dgit view tag %s not found\n" msgstr "" #: ../git-debrebase:2553 #, perl-format msgid "dgit view tag %s is not FF from maintainer tag %s\n" msgstr "" #: ../git-debrebase:2555 #, perl-format msgid "will stitch in dgit view, %s\n" msgstr "" #: ../git-debrebase:2562 #, perl-format msgid "" "Cannot confirm dgit view: %s\n" "Failed to stitch in dgit view (see messages above).\n" "dgit --overwrite will be needed on the first dgit push after conversion.\n" msgstr "" #: ../git-debrebase:2608 #, perl-format msgid "%s: converted from patched-unapplied (gbp) branch format, OK\n" msgstr "" #: ../git-debrebase:2637 #, perl-format msgid "" "%s: converted to git-buildpackage branch format\n" "%s: WARNING: do not now run \"git-debrebase\" any more\n" "%s: WARNING: doing so would drop all upstream patches!\n" msgstr "" #: ../git-debrebase:2658 msgid "takes 1 optional argument, the upstream commitish" msgstr "" #: ../git-debrebase:2666 #, perl-format msgid "%s, from command line" msgstr "" #: ../git-debrebase:2680 #, perl-format msgid "" "%s: Branch already seems to be in git-debrebase format!\n" "%s: --always-convert-anyway would do the conversion operation anyway\n" "%s: but is probably a bad idea. Probably, you wanted to do nothing.\n" msgstr "" #: ../git-debrebase:2684 msgid "Branch already in git-debrebase format." msgstr "" #: ../git-debrebase:2696 msgid "Considering possible commits corresponding to upstream:\n" msgstr "" #: ../git-debrebase:2704 #, perl-format msgid "git tag %s" msgstr "" #: ../git-debrebase:2710 #, perl-format msgid " git tag: no suitable tag found (tried %s)\n" msgstr "" #: ../git-debrebase:2719 #, perl-format msgid "opendir build-products-dir %s: %s" msgstr "" #: ../git-debrebase:2725 #, perl-format msgid " orig: found what looks like a .orig, %s\n" msgstr "" #: ../git-debrebase:2756 #, perl-format msgid " orig: no suitable origs found (looked for %s in %s)\n" msgstr "" #: ../git-debrebase:2765 msgid "Evaluating possible commits corresponding to upstream:\n" msgstr "" #: ../git-debrebase:2806 #, perl-format msgid " %s: couldn't apply patches: gbp pq %s" msgstr "" #: ../git-debrebase:2815 #, perl-format msgid " %s: applying patches gives different tree\n" msgstr "" #: ../git-debrebase:2829 msgid "" "Could not find or construct a suitable upstream commit.\n" "Rerun adding --diagnose after convert-from-dgit-view, or pass a\n" "upstream commmit explicitly or provide suitable origs.\n" msgstr "" #: ../git-debrebase:2835 #, perl-format msgid "Yes, will base new branch on %s\n" msgstr "" #: ../git-debrebase:2840 #, perl-format msgid "" "Result of applying debian/patches/ onto the upstream is not the same as " "HEAD.\n" "(Applying patches gave the commit %s)\n" "Perhaps the upstream is not right, or not all of the delta is in d/patches.\n" msgstr "" #: ../git-debrebase:2848 msgid "Output of conversion does not match input!" msgstr "" #: ../git-debrebase:2856 msgid "forget-was-ever-debrebase takes no further arguments" msgstr "" #: ../git-debrebase:2860 #, perl-format msgid "Not suitable for recording git-debrebaseness anyway: %s" msgstr "" #: ../git-debrebase:2962 msgid "bad options\n" msgstr "" #: ../git-debrebase:2972 #, perl-format msgid "" "%s: with git-debrebase, get-rebase -i option may only be followed by more " "options (as separate arguments)" msgstr "" #: ../git-debrebase:3002 #, perl-format msgid "unknown git-debrebase sub-operation %s" msgstr "" #: ../Debian/Dgit.pm:299 #, perl-format msgid "error: %s\n" msgstr "" #: ../Debian/Dgit.pm:325 #, perl-format msgid "getcwd failed: %s\n" msgstr "" #: ../Debian/Dgit.pm:344 msgid "terminated, reporting successful completion" msgstr "" #: ../Debian/Dgit.pm:346 #, perl-format msgid "failed with error exit status %s" msgstr "" #: ../Debian/Dgit.pm:349 #, perl-format msgid "died due to fatal signal %s" msgstr "" #: ../Debian/Dgit.pm:353 #, perl-format msgid "failed with unknown wait status %s" msgstr "" #: ../Debian/Dgit.pm:359 msgid "failed command" msgstr "" #: ../Debian/Dgit.pm:365 #, perl-format msgid "failed to fork/exec: %s" msgstr "" #: ../Debian/Dgit.pm:367 #, perl-format msgid "subprocess %s" msgstr "" #: ../Debian/Dgit.pm:369 msgid "subprocess produced invalid output" msgstr "" #: ../Debian/Dgit.pm:460 msgid "stat source file: %S" msgstr "" #: ../Debian/Dgit.pm:470 msgid "stat destination file: %S" msgstr "" #: ../Debian/Dgit.pm:489 msgid "finally install file after cp: %S" msgstr "" #: ../Debian/Dgit.pm:495 msgid "delete old file after cp: %S" msgstr "" #: ../Debian/Dgit.pm:516 msgid "" "not in a git working tree?\n" "(git rev-parse --show-toplevel produced no output)\n" msgstr "" #: ../Debian/Dgit.pm:519 #, perl-format msgid "chdir toplevel %s: %s\n" msgstr "" #: ../Debian/Dgit.pm:627 msgid "git index contains changes (does not match HEAD)" msgstr "" #: ../Debian/Dgit.pm:628 msgid "working tree is dirty (does not match HEAD)" msgstr "" #: ../Debian/Dgit.pm:653 msgid "using specified upstream commitish" msgstr "" #: ../Debian/Dgit.pm:660 #, perl-format msgid "" "Could not determine appropriate upstream commitish.\n" " (Tried these tags: %s)\n" " Check version, and specify upstream commitish explicitly." msgstr "" #: ../Debian/Dgit.pm:665 ../Debian/Dgit.pm:667 #, perl-format msgid "using upstream from git tag %s" msgstr "" #: ../Debian/Dgit.pm:773 msgid "detached HEAD" msgstr "" #: ../Debian/Dgit.pm:774 msgid "HEAD symref is not to refs/" msgstr "" #: ../Debian/Dgit.pm:790 #, perl-format msgid "parsing of %s failed" msgstr "" #: ../Debian/Dgit.pm:799 #, perl-format msgid "" "control file %s is (already) PGP-signed. Note that dgit push needs to " "modify the .dsc and then do the signature itself" msgstr "" #: ../Debian/Dgit.pm:813 #, perl-format msgid "open %s (%s): %s" msgstr "" #: ../Debian/Dgit.pm:834 #, perl-format msgid "missing field %s in %s" msgstr "" #: ../Debian/Dgit.pm:920 msgid "Dummy commit - do not use\n" msgstr "" #: ../Debian/Dgit.pm:941 #, perl-format msgid "exec %s: %s\n" msgstr "" #: ../Debian/Dgit.pm:969 #, perl-format msgid "Taint recorded at time %s for package %s" msgstr "" #: ../Debian/Dgit.pm:971 #, perl-format msgid "Taint recorded at time %s for any package" msgstr "" #: ../Debian/Dgit.pm:973 #, perl-format msgid "Taint recorded for package %s" msgstr "" #: ../Debian/Dgit.pm:975 msgid "Taint recorded for any package" msgstr "" #: ../Debian/Dgit.pm:987 msgid "Uncorrectable error. If confused, consult administrator.\n" msgstr "" #: ../Debian/Dgit.pm:990 msgid "Could perhaps be forced using --deliberately. Consult documentation.\n" msgstr "" #: ../Debian/Dgit.pm:993 #, perl-format msgid "Forcing due to %s\n" msgstr "" #: ../Debian/Dgit.pm:1058 #, perl-format msgid "cannot stat %s/.git: %s" msgstr "" #: ../Debian/Dgit.pm:1081 #, perl-format msgid "failed to mkdir playground parent %s: %s" msgstr "" #: ../Debian/Dgit.pm:1089 #, perl-format msgid "failed to mkdir a playground %s: %s" msgstr "" #: ../Debian/Dgit.pm:1098 #, perl-format msgid "failed to mkdir the playground %s: %s" msgstr "" work/po/nl.po0000644000000000000000000025430214761250142010325 0ustar # Dutch translation of dgit. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the dgit package. # FIRST AUTHOR , YEAR. # Frans Spiesschaert , 2018, 2019, 2023. # msgid "" msgstr "" "Project-Id-Version: dgit_10.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-29 11:56+0000\n" "PO-Revision-Date: 2023-01-17 17:24+0100\n" "Last-Translator: Frans Spiesschaert \n" "Language-Team: Debian Dutch l10n Team \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../dgit:270 #, perl-format msgid "%s: invalid configuration: %s\n" msgstr "%s: ongeldige configuratie: %s\n" #: ../dgit:277 msgid "warning: overriding problem due to --force:\n" msgstr "waarschuwing: overschrijvingsprobleem wegens --force:\n" #: ../dgit:285 #, perl-format msgid "warning: skipping checks or functionality due to --force-%s\n" msgstr "" "waarschuwing: controles of functionaliteit overgeslagen wegens --force-%s\n" #: ../dgit:290 #, perl-format msgid "%s: source package %s does not exist in suite %s\n" msgstr "%s: broncodepakket %s bestaat niet in suite %s\n" #: ../dgit:544 #, perl-format msgid "build host child %s" msgstr "bouwcomputer-dochter %s" #: ../dgit:549 ../dgit:555 #, perl-format msgid "connection lost: %s" msgstr "verbinding verbroken: %s" #: ../dgit:550 #, perl-format msgid "protocol violation; %s not expected" msgstr "protocolschending; %s werd niet verwacht" #: ../dgit:558 #, perl-format msgid "eof (reading %s)" msgstr "eof (bij het lezen van %s)" #: ../dgit:565 msgid "protocol message" msgstr "protocolbericht" #: ../dgit:573 #, perl-format msgid "`%s'" msgstr "`%s'" #: ../dgit:594 msgid "bad byte count" msgstr "aantal slechte bytes" #: ../dgit:597 msgid "data block" msgstr "gegevensblok" #: ../dgit:676 #, perl-format msgid "%s ok: %s" msgstr "%s oké: %s" #: ../dgit:678 #, perl-format msgid "would be ok: %s (but dry run only)" msgstr "zou oké zijn: %s (maar slechts een testuitvoering)" #: ../dgit:703 msgid "" "main usages:\n" " dgit [dgit-opts] clone [dgit-opts] package [suite] [./dir|/dir]\n" " dgit [dgit-opts] fetch|pull [dgit-opts] [suite]\n" " dgit [dgit-opts] build [dpkg-buildpackage-opts]\n" " dgit [dgit-opts] sbuild [sbuild-opts]\n" " dgit [dgit-opts] pbuilder|cowbuilder [debbuildopts]\n" " dgit [dgit-opts] push [dgit-opts] [suite]\n" " dgit [dgit-opts] push-source [dgit-opts] [suite]\n" " dgit [dgit-opts] rpush build-host:build-dir ...\n" "important dgit options:\n" " -k sign tag and package with instead of default\n" " --dry-run -n do not change anything, but go through the motions\n" " --damp-run -L like --dry-run but make local changes, without " "signing\n" " --new -N allow introducing a new package\n" " --debug -D increase debug level\n" " -c= set git config option (used directly by dgit too)\n" msgstr "" "belangrijkste toepassingen:\n" " dgit [dgit-opties] clone [dgit-opties] pakket [suite] [./map|/map]\n" " dgit [dgit-opties] fetch|pull [dgit-opties] [suite]\n" " dgit [dgit-opties] build [dpkg-buildpackage-opties]\n" " dgit [dgit-opties] sbuild [sbuild-opties]\n" " dgit [dgit-opties] pbuilder|cowbuilder [debbuild-opties]\n" " dgit [dgit-opties] push [dgit-opties] [suite]\n" " dgit [dgit-opties] push-source [dgit-opties] [suite]\n" " dgit [dgit-opties] rpush bouw-computer:bouw-map ...\n" "belangrijke dgit-opties:\n" " -k tag en pakket ondertekenen met \n" " in plaats van met de standaard\n" " --dry-run -n niets wijzigen, maar de bewerkingen doorlopen\n" " --damp-run -L zoals --dry-run maar lokale wijzigingen maken,\n" " zonder te ondertekenen\n" " --new -N introductie van een nieuw pakket toelaten\n" " --debug -D debug-niveau verhogen\n" " -c= configuratieoptie instellen voor git\n" " (ook rechtstreeks gebruikt door dgit)\n" #: ../dgit:722 msgid "Perhaps the upload is stuck in incoming. Using the version from git.\n" msgstr "" "Misschien zit de upload vast in incoming. De versie van git wordt " "gebruikt.\n" #: ../dgit:726 #, perl-format msgid "" "%s: %s\n" "%s" msgstr "" "%s: %s\n" "%s" #: ../dgit:731 msgid "too few arguments" msgstr "te weinig argumenten" #: ../dgit:850 #, perl-format msgid "multiple values for %s (in %s git config)" msgstr "verschillende waarden voor %s (in %s git config)" #: ../dgit:853 #, perl-format msgid "value for config option %s (in %s git config) contains newline(s)!" msgstr "" "waarde voor configuratieoptie %s (in %s git config) bevat regeleinde(s)!" #: ../dgit:873 #, perl-format msgid "" "need value for one of: %s\n" "%s: distro or suite appears not to be (properly) supported" msgstr "" "heb waarde nodig voor één van: %s\n" "%s: distributie of suite lijkt niet (behoorlijk) ondersteund te worden" #: ../dgit:930 #, perl-format msgid "bad syntax for (nominal) distro `%s' (does not match %s)" msgstr "" "slechte syntaxis voor (nominale) distributie `%s' (komt niet overeen met %s)" #: ../dgit:945 #, perl-format msgid "backports-quirk needs % or ( )" msgstr "backports-spitsvondigheid vereist % of ( )" #: ../dgit:961 #, perl-format msgid "%s needs t (true, y, 1) or f (false, n, 0) not `%s'" msgstr "%s vereist t (true, y, 1) of f (false, n, 0) en niet `%s'" #: ../dgit:981 msgid "readonly needs t (true, y, 1) or f (false, n, 0) or a (auto)" msgstr "" "alleen-lezen (readonly) vereist t (true, y, 1) of f (false, n, 0) of een " "(auto)" #: ../dgit:999 #, perl-format msgid "unknown %s `%s'" msgstr "onbekend %s `%s'" #: ../dgit:1004 ../git-debrebase:1548 ../Debian/Dgit.pm:212 msgid "internal error" msgstr "interne fout" #: ../dgit:1006 msgid "pushing but distro is configured readonly" msgstr "" "een push aan het uitvoeren, maar de distributie is voor alleen-lezen " "geconfigureerd" #: ../dgit:1010 msgid "" "Push failed, before we got started.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" "Push mislukte vooraleer we nog maar gestart waren.\n" "Als u wilt, kunt u de push opnieuw proberen nadat het probleem opgelost " "werd.\n" #: ../dgit:1033 #, perl-format msgid "" "dgit: quilt mode `%s' (for format `%s') implies split view, but split-view " "set to `%s'" msgstr "" "dgit: quilt modus `%s' (voor indeling `%s') impliceert gesplitste weergave, " "maar gesplitste weergave staat ingesteld op `%s'" #: ../dgit:1196 msgid "this operation does not support multiple comma-separated suites" msgstr "" "meerdere met een komma van elkaar gescheiden suites worden door deze " "bewerking niet ondersteund" #: ../dgit:1264 #, perl-format msgid "fetch of %s failed (%s): %s" msgstr "ophalen (fetch) van %s mislukte (%s): %s" #: ../dgit:1271 #, perl-format msgid "fetch of %s gave HTTP code %s" msgstr "een fetch van %s gaf HTTP-code %s" #: ../dgit:1292 msgid "ftpmasterapi archive query method takes no data part" msgstr "" "de methode ftpmasterapi voor een verzoek aan het archief kent geen data-" "onderdeel" #: ../dgit:1310 #, perl-format msgid "unknown suite %s, maybe -d would help" msgstr "onbekende suite %s, misschien is -d nuttig" #: ../dgit:1314 #, perl-format msgid "multiple matches for suite %s\n" msgstr "meerdere overeenkomsten met suite %s\n" #: ../dgit:1316 #, perl-format msgid "suite %s info has no codename\n" msgstr "info over suite %s bevat geen codenaam\n" #: ../dgit:1318 #, perl-format msgid "suite %s maps to bad codename\n" msgstr "suite %s is gekoppeld aan een verkeerde codenaam\n" #: ../dgit:1320 ../dgit:1345 msgid "bad ftpmaster api response: " msgstr "verkeerd antwoord van de ftpmaster api:" #: ../dgit:1334 #, perl-format msgid "bad version: %s\n" msgstr "verkeerde versie: %s\n" #: ../dgit:1336 msgid "bad component" msgstr "verkeerde component" #: ../dgit:1339 msgid "bad filename" msgstr "verkeerde bestandsnaam" #: ../dgit:1341 msgid "bad sha256sum" msgstr "verkeerde sha256sum" #: ../dgit:1392 msgid "aptget archive query method takes no data part" msgstr "" "de methode aptget voor een verzoek aan het archief kent geen data-onderdeel" #: ../dgit:1476 #, perl-format msgid "" "apt seemed to not to update dgit's cached Release files for %s.\n" "(Perhaps %s\n" " is on a filesystem mounted `noatime'; if so, please use `relatime'.)\n" msgstr "" "blijkbaar werkte apt de gecachete Release-bestanden van dgit voor %s niet " "bij.\n" "(Misschien bevindt %s\n" " zich op een bestandssysteem dat met `noatime' aangekoppeld is; mocht dit " "het geval zijn, gebruik dan `relatime'.)\n" #: ../dgit:1500 #, perl-format msgid "Release file (%s) specifies intolerable %s" msgstr "Release-bestand (%s) vermeldt ontoelaatbaar %s" #: ../dgit:1526 msgid "apt-get source did not produce a .dsc" msgstr "apt-get source produceerde geen .dsc-bestand" #: ../dgit:1527 #, perl-format msgid "apt-get source produced several .dscs (%s)" msgstr "apt-get source produceerde verschillende .dsc-bestanden (%s)" #: ../dgit:1632 #, perl-format msgid "" "unable to canonicalise suite using package %s which does not appear to exist " "in suite %s; --existing-package may help" msgstr "" "niet in staat de suite ondubbelzinnig te bepalen met pakket %s dat blijkbaar " "niet bestaat in suite %s; --existing-package kan behulpzaam zijn" #: ../dgit:1771 #, perl-format msgid "cannot operate on %s suite" msgstr "kan geen acties uitvoeren op suite %s" #: ../dgit:1774 #, perl-format msgid "canonical suite name for %s is %s" msgstr "de gebruikelijke suitenaam voor %s is %s" #: ../dgit:1776 #, perl-format msgid "canonical suite name is %s" msgstr "de gebruikelijke suitenaam is %s" #: ../dgit:1796 #, perl-format msgid "%s has hash %s but archive told us to expect %s" msgstr "%s heeft hash %s maar volgens het archief moesten we %s verwachten" #: ../dgit:1802 #, perl-format msgid "unsupported source format %s, sorry" msgstr "niet-ondersteunde broncode-indeling %s, sorry" #: ../dgit:1829 #, perl-format msgid "diverting to %s (using config for %s)" msgstr "er wordt omgeschakeld naar %s (de configuratie voor %s wordt gebruikt)" #: ../dgit:1852 #, perl-format msgid "unknown git-check `%s'" msgstr "onbekende git-check `%s'" #: ../dgit:1867 #, perl-format msgid "unknown git-create `%s'" msgstr "onbekende git-create `%s'" #: ../dgit:1904 #, perl-format msgid "%s: warning: removing from %s: %s\n" msgstr "%s: waarschuwing: wordt verwijderd van %s: %s\n" #: ../dgit:1950 #, perl-format msgid "could not parse .dsc %s line `%s'" msgstr "kon .dsc %s regel `%s' niet ontleden" #: ../dgit:1961 #, perl-format msgid "missing any supported Checksums-* or Files field in %s" msgstr "een ondersteund Checksums-* of Files-veld ontbreekt in %s" #: ../dgit:2007 #, perl-format msgid "hash or size of %s varies in %s fields (between: %s)" msgstr "hash of grootte van %s varieert in %s-velden (tussen: %s)" #: ../dgit:2016 #, perl-format msgid "file list in %s varies between hash fields!" msgstr "bestandenlijst in %s varieert tussen hash-velden!" #: ../dgit:2020 #, perl-format msgid "%s has no files list field(s)" msgstr "%s bevat geen veld(en) met een bestandenlijst" #: ../dgit:2026 #, perl-format msgid "no file appears in all file lists (looked in: %s)" msgstr "in geen enkele bestandenlijst komt een bestand voor (gezocht in: %s)" #: ../dgit:2069 #, perl-format msgid "purportedly source-only changes polluted by %s\n" msgstr "ogenschijnlijke source-only wijzigingen vervuild door %s\n" #: ../dgit:2081 msgid "cannot find section/priority from .changes Files field" msgstr "" "kan sectie/prioriteit niet vinden in het veld Files van het .changes-bestand" #: ../dgit:2094 msgid "" "archive does not support .orig check; hope you used --ch:--sa/-sd if needed\n" msgstr "" "archief ondersteunt controle van .orig niet; hopelijk gebruikte u zo nodig --" "ch:--sa/-sd\n" #: ../dgit:2110 #, perl-format msgid ".dsc %s missing entry for %s" msgstr ".dsc %s mist een item voor %s" #: ../dgit:2115 #, perl-format msgid "%s: %s (archive) != %s (local .dsc)" msgstr "%s: %s (archief) != %s (lokale .dsc)" #: ../dgit:2123 #, perl-format msgid "archive %s: %s" msgstr "archief %s: %s" #: ../dgit:2130 #, perl-format msgid "archive contains %s with different checksum" msgstr "archief bevat %s met een andere checksum" #: ../dgit:2158 #, perl-format msgid "edited .changes for archive .orig contents: %s %s" msgstr "bewerkte .changes voor de inhoud van .orig van het archief: %s %s" #: ../dgit:2166 #, perl-format msgid "[new .changes left in %s]" msgstr "[nieuwe .changes achtergelaten in %s]" #: ../dgit:2169 #, perl-format msgid "%s already has appropriate .orig(s) (if any)" msgstr "%s heeft reeds passende .orig(s) (indien van toepassing)" #: ../dgit:2188 #, perl-format msgid "" "unexpected commit author line format `%s' (was generated from changelog " "Maintainer field)" msgstr "" "onverwachte indeling `%s' van de auteursregel van de commit (werd " "gegenereerd uit het Maintainer-veld in changelog)" #: ../dgit:2211 msgid "" "\n" "Unfortunately, this source package uses a feature of dpkg-source where\n" "the same source package unpacks to different source code on different\n" "distros. dgit cannot safely operate on such packages on affected\n" "distros, because the meaning of source packages is not stable.\n" "\n" "Please ask the distro/maintainer to remove the distro-specific series\n" "files and use a different technique (if necessary, uploading actually\n" "different packages, if different distros are supposed to have\n" "different code).\n" "\n" msgstr "" "\n" "Jammer genoeg gebruikt dit broncodepakket een functionaliteit van dpkg-" "source waarbij hetzelfde broncodepakket uitgepakt wordt tot andere broncode " "bij verschillende distributies. dgit is op de betreffende distributies niet " "in staat om betrouwbaar te werken met dergelijke pakketten, aangezien de " "bedoeling van de broncodepakketten niet stabiel is.\n" "\n" "Vraag de distributie/pakketonderhouder om de distributiespecifieke reeks " "bestanden te verwijderen en een andere techniek te gebruiken (zo nodig " "daadwerkelijk verschillende pakketten uploaden indien het de bedoeling is " "dat verschillende distributies andere broncode hebben).\n" "\n" #: ../dgit:2223 #, perl-format msgid "" "Found active distro-specific series file for %s (%s): %s, cannot continue" msgstr "" "Vond een actief distributiespecifiek series-bestand voor %s (%s): %s, kan " "niet voortgaan" #: ../dgit:2254 msgid "Dpkg::Vendor `current vendor'" msgstr "Dpkg::Vendor `current vendor'" #: ../dgit:2256 msgid "(base) distro being accessed" msgstr "(basis)-distributie wordt benaderd" #: ../dgit:2258 msgid "(nominal) distro being accessed" msgstr "(nominale) distributie wordt benaderd" #: ../dgit:2263 #, perl-format msgid "build-products-dir %s is not accessible: %s\n" msgstr "build-products-dir %s is niet toegankelijk: %s\n" #: ../dgit:2301 #, perl-format msgid "%s: multiple representations of similar orig %s:\n" msgstr "%s: meerdere weergaven van soortgelijke oorsprong %s:\n" #: ../dgit:2305 #, perl-format #| msgid "%s: %s: %s\n" msgid " %s: in %s (%s)\n" msgstr " %s: in %s (%s)\n" #: ../dgit:2310 msgid "Duplicate/inconsistent orig tarballs. Delete the spurious ones." msgstr "Dubbele/inconsistente orig-tar-archieven. Verwijder de ongewenste." #: ../dgit:2327 #, perl-format msgid "" "%s: found orig(s) in .. missing from build-products-dir, transferring:\n" msgstr "" "%s: orig(s) gevonden in .. welke ontbreken in build-products-dir, aan het " "overbrengen:\n" #: ../dgit:2331 #, perl-format msgid "check orig file %s in bpd %s: %s" msgstr "controleer orig-bestand %s in bpd %s: %s" #: ../dgit:2333 #, perl-format msgid "check orig file %s in ..: %s" msgstr "controleer orig-bestand %s in ..: %s" #: ../dgit:2336 #, perl-format msgid "check target of orig symlink %s in ..: %s" msgstr "controleer doel van orig-symbolische koppeling %s in ..: %s" #: ../dgit:2345 #, perl-format msgid "%s: cloned orig symlink from ..: %s\n" msgstr "%s: orig-symbolische koppeling gekloond van ..: %s\n" #: ../dgit:2349 #, perl-format msgid "%s: hardlinked orig from ..: %s\n" msgstr "%s: vast gekoppelde orig van ..: %s\n" #: ../dgit:2352 #, perl-format msgid "failed to make %s a hardlink to %s: %s" msgstr "niet gelukt om %s een vaste koppeling naar %s te maken: %s" #: ../dgit:2358 #, perl-format msgid "%s: symmlinked orig from .. on other filesystem: %s\n" msgstr "" "%s: symbolisch gekoppelde orig van .. op een ander bestandssysteem: %s\n" #: ../dgit:2429 #, perl-format msgid "dgit (child): exec %s: %s" msgstr "dgit (dochter): exec %s: %s" #: ../dgit:2491 msgid "package changelog" msgstr "changelog van het pakket" #: ../dgit:2531 msgid "package changelog has no entries!" msgstr "het changelog-bestand van het pakket bevat geen vermeldingen!" #: ../dgit:2600 ../dgit:2605 #, perl-format msgid "accessing %s: %s" msgstr "benaderen van %s: %s" #: ../dgit:2622 ../dgit:2629 #, perl-format msgid "saving %s: %s" msgstr "opslaan van %s: %s" #: ../dgit:2655 ../dgit:6433 msgid "source package" msgstr "broncodepakket" #: ../dgit:2735 #, perl-format msgid "%s: trying slow absurd-git-apply..." msgstr "%s: langzame absurd-git-apply wordt gebruikt..." #: ../dgit:2755 #, perl-format msgid "%s failed: %s\n" msgstr "%s mislukte: %s\n" #: ../dgit:2765 #, perl-format msgid "" "gbp-pq import and dpkg-source disagree!\n" " gbp-pq import gave commit %s\n" " gbp-pq import gave tree %s\n" " dpkg-source --before-build gave tree %s\n" msgstr "" "gbp-pq import en dpkg-source zijn het oneens!\n" " gbp-pq import gaf commit %s\n" " gbp-pq import gaf boom %s\n" " dpkg-source --before-build gaf boom %s\n" #: ../dgit:2785 #, perl-format msgid "synthesised git commit from .dsc %s" msgstr "git commit samengesteld vanuit .dsc %s" #: ../dgit:2789 msgid "Import of source package" msgstr "Importeren van broncodepakket" #: ../dgit:2809 #, perl-format msgid "" "\n" "Version actually in archive: %s (older)\n" "Last version pushed with dgit: %s (newer or same)\n" "%s\n" msgstr "" "\n" "Momenteel in het archief aanwezige versie: %s (oudere)\n" "Laatste versie die met dgit gepusht werd : %s (recentere of dezelfde)\n" "%s\n" #: ../dgit:2851 #, perl-format msgid "using existing %s" msgstr "bestaande %s wordt gebruikt" #: ../dgit:2855 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (perhaps you should delete this " "file?)" msgstr "" "bestand %s heeft hash %s maar .dsc vereist hash %s (moet u misschien dit " "bestand verwijderen?)" #: ../dgit:2859 #, perl-format msgid "need to fetch correct version of %s" msgstr "moet de juiste versie van %s ophalen met fetch" #: ../dgit:2875 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (got wrong file from archive!)" msgstr "" "bestand %s heeft hash %s maar .dsc vereist hash %s (verkreeg een verkeerd " "bestand van het archief!)" #: ../dgit:2970 msgid "too many iterations trying to get sane fetch!" msgstr "te veel pogingen om een foutloze fetch te bekomen!" #: ../dgit:2985 #, perl-format msgid "warning: git ls-remote %s reported %s; this is silly, ignoring it.\n" msgstr "" "waarschuwing: git ls-remote %s rapporteerde %s; dit is onzinnig, wordt " "genegeerd.\n" #: ../dgit:3029 #, perl-format msgid "warning: git fetch %s created %s; this is silly, deleting it.\n" msgstr "" "waarschuwing: git fetch %s creëerde %s; dit is onzinnig, wordt verwijderd.\n" #: ../dgit:3044 #, perl-format msgid "" "--dry-run specified but we actually wanted the results of git fetch,\n" "so this is not going to work. Try running dgit fetch first,\n" "or using --damp-run instead of --dry-run. (Wanted: %s.)\n" msgstr "" "--dry-run werd opgegeven, maar we wilden eigenlijk het resultaat van\n" "git fetch, dus dit zal niet werken. Probeer eerst git fetch uit te voeren,\n" "of --damp-run te gebruiken in plaats van --dry-run. (Gewenst: %s.)\n" #: ../dgit:3049 #, perl-format msgid "" "warning: git ls-remote suggests we want %s\n" "warning: and it should refer to %s\n" "warning: but git fetch didn't fetch that object to any relevant ref.\n" "warning: This may be due to a race with someone updating the server.\n" "warning: Will try again...\n" msgstr "" "waarschuwing: git ls-remote suggereert dat we %s wensen\n" "waarschuwing: en dat het zou moeten verwijzen naar %s\n" "waarschuwing: maar git fetch haalde dat object niet naar een relevante " "ref.\n" "waarschuwing: Is mogelijk te wijten aan een race met iemand die de server\n" "waarschuwing: bijwerkt. Zal later opnieuw proberen...\n" #: ../dgit:3196 #, perl-format msgid "not chasing .dsc distro %s: not fetching %s" msgstr "" "ben niet bezig met achter .dsc van distributie %s aan te gaan: %s wordt niet " "gehaald" #: ../dgit:3201 #, perl-format msgid ".dsc names distro %s: fetching %s" msgstr ".dsc vernoemt distributie %s: %s wordt opgehaald" #: ../dgit:3206 #, perl-format msgid "" ".dsc Dgit metadata is in context of distro %s\n" "for which we have no configured url and .dsc provides no hint\n" msgstr "" "De Dgit-metadata van .dsc zijn in de context van distributie %s\n" "waarvoor we geen geconfigureerde url hebben en .dsc geeft geen aanwijzing\n" #: ../dgit:3216 #, perl-format msgid "" ".dsc Dgit metadata is in context of distro %s\n" "for which we have no configured url;\n" ".dsc provides hinted url with protocol %s which is unsafe.\n" "(can be overridden by config - consult documentation)\n" msgstr "" "De Dgit-metadata van .dsc zijn in de context van distributie %s\n" "waarvoor we geen geconfigureerde url hebben;\n" ".dsc geeft een aanduiding voor een url met het onveilige protocol %s.\n" "(kan door de configuratie overschreven worden - raadpleeg de documentatie)\n" #: ../dgit:3236 msgid "rewrite map" msgstr "modificatieplan (rewrite map)" #: ../dgit:3243 msgid "server's git history rewrite map contains a relevant entry!" msgstr "" "het modificatieplan (rewrite map) van de git-geschiedenis op de server bevat " "een relevant element!" #: ../dgit:3247 msgid "using rewritten git hash in place of .dsc value" msgstr "de gemodificeerde git hash wordt gebruikt in plaats van de .dsc-waarde" #: ../dgit:3249 msgid "server data says .dsc hash is to be disregarded" msgstr "" "de gegevens van de server zeggen dat de .dsc-hash genegeerd moet worden" #: ../dgit:3256 msgid "additional commits" msgstr "extra vastleggingen (commits)" #: ../dgit:3259 #, perl-format msgid "" ".dsc Dgit metadata requires commit %s\n" "but we could not obtain that object anywhere.\n" msgstr "" "De Dgit-metadata uit .dsc vereist commit %s\n" "maar we konden dat object nergens bekomen.\n" #: ../dgit:3284 msgid "last upload to archive" msgstr "laatste upload naar het archief" #: ../dgit:3288 msgid "no version available from the archive" msgstr "geen versie beschikbaar uit het archief" #: ../dgit:3371 msgid "dgit suite branch on dgit git server" msgstr "dgit suite-tak op dgit git-server" #: ../dgit:3378 msgid "dgit client's archive history view" msgstr "dgit - weergave geschiedenis van cliëntarchief" #: ../dgit:3383 msgid "Dgit field in .dsc from archive" msgstr "Dgit-veld in het .dsc uit het archief" #: ../dgit:3411 #, perl-format msgid "" "\n" "Git commit in archive is behind the last version allegedly pushed/uploaded.\n" "Commit referred to by archive: %s\n" "Last version pushed with dgit: %s\n" "%s\n" msgstr "" "\n" "De git commit in het archief loopt achter op de laatste versie die naar\n" "verluidt gepusht/geüpload werd.\n" "Commit waarnaar het archief verwijst: %s\n" "Laatste versie die met dgit gepusht werd: %s\n" "%s\n" #: ../dgit:3424 msgid "archive .dsc names newer git commit" msgstr ".dsc van het archief vermeldt een recentere git commit" #: ../dgit:3427 msgid "archive .dsc names other git commit, fixing up" msgstr ".dsc van het archief vermeldt een andere git commit, wordt gerepareerd" #: ../dgit:3448 #, perl-format msgid "" "\n" "Package not found in the archive, but has allegedly been pushed using dgit.\n" "%s\n" msgstr "" "\n" "Pakket niet gevonden in het archief, maar werd naar verluidt gepusht met " "dgit.\n" "%s\n" #: ../dgit:3457 #, perl-format msgid "" "\n" "Warning: relevant archive skew detected.\n" "Archive allegedly contains %s\n" "But we were not able to obtain any version from the archive or git.\n" "\n" msgstr "" "\n" "Waarschuwing: relevante archiefscheeftrekking vastgesteld.\n" "Archief bevat naar verluidt %s\n" "Maar we konden geen enkele versie bekomen uit het archief of uit git.\n" "\n" #: ../dgit:3542 #, perl-format msgid "" "Record %s (%s) in archive suite %s\n" "\n" "Record that\n" msgstr "" "Gegeven %s (%s) uit de archief-suite %s\n" "\n" "Gegeven dat\n" #: ../dgit:3555 msgid "should be treated as descended from\n" msgstr "behandeld zou moeten worden als afstammend van\n" #: ../dgit:3573 msgid "dgit repo server tip (last push)" msgstr "tip van de dgit-opslagplaats op de server (laatste push)" #: ../dgit:3575 msgid "local tracking tip (last fetch)" msgstr "tip van de lokale kopie (laatste fetch)" #: ../dgit:3586 #, perl-format msgid "" "\n" "Warning: archive skew detected. Using the available version:\n" "Archive allegedly contains %s\n" "We were able to obtain only %s\n" "\n" msgstr "" "\n" "Waarschuwing: archiefscheeftrekking vastgesteld. Beschikbare versie wordt " "gebruikt:\n" "Archief bevat naar verluidt %s\n" "We waren slechts in staat om %s te bekomen\n" "\n" #: ../dgit:3601 msgid "fetched source tree" msgstr "broncodeboom opgehaald" #: ../dgit:3637 msgid "debian/changelog merge driver" msgstr "stuurprogramma voor samenvoeging van debian/changelog" #: ../dgit:3702 msgid "" "[attr]dgit-defuse-attrs already found, and proper, in .git/info/attributes\n" " not doing further gitattributes setup\n" msgstr "" "[attr]dgit-defuse-attrs reeds gevonden in .git/info/attributes, en geschikt\n" " gitattributes wordt niet verder ingesteld\n" #: ../dgit:3716 msgid "# ^ see GITATTRIBUTES in dgit(7) and dgit setup-new-tree in dgit(1)\n" msgstr "# ^ zie GITATTRIBUTES in dgit(7) en dgit setup-new-tree in dgit(1)\n" #: ../dgit:3731 #, perl-format msgid "install %s: %s" msgstr "installeren van %s: %s" #: ../dgit:3758 #, perl-format msgid "" "dgit: warning: %s contains .gitattributes\n" "dgit: .gitattributes not (fully) defused. Recommended: dgit setup-new-" "tree.\n" msgstr "" "dgit: waarschuwing: %s bevat .gitattributes\n" "dgit: .gitattributes niet (volledig) geneutraliseerd. Aanbevolen: dgit " "setup-new-tree.\n" #: ../dgit:3780 #, perl-format msgid "fetching %s..." msgstr "ophalen van %s..." #: ../dgit:3788 #, perl-format msgid "failed to obtain %s: %s" msgstr "verkrijgen van %s mislukte: %s" #: ../dgit:3827 #, perl-format msgid "package %s missing in (base suite) %s" msgstr "pakket %s ontbreekt in (basissuite) %s" #: ../dgit:3859 msgid "local combined tracking branch" msgstr "lokale gecombineerde navolgende tak (tracking branch)" #: ../dgit:3861 msgid "archive seems to have rewound: local tracking branch is ahead!" msgstr "" "het archief lijkt teruggespoeld te hebben: de lokale navolgende tak loopt " "voorop!" #: ../dgit:3900 #, perl-format msgid "" "Combine archive branches %s [dgit]\n" "\n" "Input branches:\n" msgstr "" "Archieftakken %s combineren [dgit]\n" "\n" "Invoertakken:\n" #: ../dgit:3914 msgid "" "\n" "Key\n" " * marks the highest version branch, which choose to use\n" " + marks each branch which was not already an ancestor\n" "\n" msgstr "" "\n" "Legende\n" " * markeert de tak met de hoogste versie, welke voor gebruik gekozen werd\n" " + markeert elke tak die niet reeds een voorouder was\n" "\n" #: ../dgit:3929 #, perl-format msgid "calculated combined tracking suite %s" msgstr "berekende gecombineerde navolgende suite %s" #: ../dgit:3947 #, perl-format msgid "ready for work in %s" msgstr "klaar om te werken in %s" #: ../dgit:3965 msgid "dry run makes no sense with clone" msgstr "dry run is zinloos met clone" #: ../dgit:3980 #, perl-format msgid "create `%s': %s" msgstr "creëren van `%s': %s" #: ../dgit:3992 msgid "fetching existing git history" msgstr "ophalen van bestaande git-geschiedenis" #: ../dgit:3995 msgid "starting new git history" msgstr "starten van een nieuwe git-geschiedenis" #: ../dgit:4020 #, perl-format msgid "" "FYI: Vcs-Git in %s has different url to your vcs-git remote.\n" " Your vcs-git remote url may be out of date. Use dgit update-vcs-git ?\n" msgstr "" "t.k.n.: Vcs-Git in %s bevat een andere url naar uw externe vcs-git.\n" " De url voor uw externe vcs-git zou verouderd kunnen zijn. Misschien dgit " "update-vcs-git gebruiken?\n" #: ../dgit:4025 #, perl-format msgid "fetched into %s" msgstr "opgehaald naar %s" #: ../dgit:4037 #, perl-format msgid "Merge from %s [dgit]" msgstr "Samenvoegen vanuit %s [dgit]" #: ../dgit:4039 #, perl-format msgid "fetched to %s and merged into HEAD" msgstr "opgehaald naar %s samengevoegd naar HEAD" #: ../dgit:4047 #, perl-format msgid "git tree contains %s" msgstr "git-boom bevat %s" #: ../dgit:4058 msgid "you have uncommitted changes to critical files, cannot continue:\n" msgstr "" "u heeft niet-vastgelegde wijzigingen in cruciale bestanden, kan niet " "voortgaan:\n" #: ../dgit:4077 #, perl-format msgid "" "quilt fixup required but quilt mode is `nofix'\n" "HEAD commit%s differs from tree implied by debian/patches%s" msgstr "" "er is een quilt fixup vereist, maar de quilt-modus is `nofix'\n" "HEAD commit%s verschilt van de boom die uit debian/patches%s volgt" #: ../dgit:4094 msgid "nothing quilty to commit, ok." msgstr "niets quilt-achtig vast te leggen, oké." #: ../dgit:4097 msgid " (wanted to commit patch update)" msgstr " (wilde een patch-update vastleggen)" #: ../dgit:4101 msgid "" "Commit Debian 3.0 (quilt) metadata\n" "\n" msgstr "" "Vastleggen van (commit) Debian 3.0 (quilt) metadata\n" "\n" #: ../dgit:4145 #, perl-format msgid "" "Not doing any fixup of `%s' due to ----no-quilt-fixup or --quilt=nocheck" msgstr "" "Opknappen van `%s' wordt niet gedaan, wegens ----no-quilt-fixup of --" "quilt=nocheck" #: ../dgit:4150 #, perl-format msgid "Format `%s', need to check/update patch stack" msgstr "Indeling `%s', moet de patch-stack nakijken/bijwerken" #: ../dgit:4160 #, perl-format msgid "commit id %s" msgstr "vastleggings-id (commit id) %s" #: ../dgit:4166 #, perl-format msgid "and left in %s" msgstr "en achtergelaten in %s" #: ../dgit:4192 #, perl-format msgid "Wanted tag %s (%s) on dgit server, but not found\n" msgstr "Wenste tag %s (%s) op de dgit-server, maar niet gevonden\n" #: ../dgit:4195 #, perl-format msgid "Wanted tag %s (one of: %s) on dgit server, but not found\n" msgstr "Wenste tag %s (één van: %s) op de dgit-server, maar niet gevonden\n" #: ../dgit:4203 #, perl-format msgid "%s (%s) .. %s (%s) is not fast forward\n" msgstr "" "%s (%s) .. %s (%s) is niet fast forward (geen lineaire " "veranderingsgeschiedenis)\n" #: ../dgit:4212 msgid "version currently in archive" msgstr "momenteel in het archief aanwezige versie" #: ../dgit:4221 #, perl-format msgid "Checking package changelog for archive version %s ..." msgstr "" "Het changlog-bestand van het pakket wordt gecontroleerd op archiefversie " "%s ..." #: ../dgit:4230 #, perl-format msgid "%s field from dpkg-parsechangelog %s" msgstr "veld %s van dpkg-parsechangelog %s" #: ../dgit:4241 #, perl-format msgid "Perhaps debian/changelog does not mention %s ?" msgstr "Vermeldt debian/changelog misschien %s niet?" #: ../dgit:4244 #, perl-format msgid "" "%s is %s\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" "%s is %s\n" "Uw boom lijkt gebaseerd op een eerdere (niet geüploade) %s.\n" #: ../dgit:4249 #, perl-format msgid "" "d/changelog entry for %s is unfinalised!\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" "d/changelog-item voor %s is niet afgerond!\n" "Uw boom lijkt gebaseerd op een eerdere (niet geüploade) %s.\n" #: ../dgit:4263 #, perl-format msgid "Declaring that HEAD includes all changes in %s..." msgstr "Verklaren dat HEAD alle wijzigingen uit %s omvat..." #: ../dgit:4319 msgid "Checking that HEAD includes all changes in archive..." msgstr "Controleren dat HEAD alle wijzigingen uit het archief omvat..." #: ../dgit:4328 msgid "maintainer view tag" msgstr "tag weergave pakketonderhouder" #: ../dgit:4330 msgid "dgit view tag" msgstr "tag weergave dgit" #: ../dgit:4331 msgid "current archive contents" msgstr "huidige inhoud van het archief" #: ../dgit:4344 msgid "" "| Not fast forward; maybe --overwrite is needed ? Please see dgit(1).\n" msgstr "" "| Niet fast forward (geen lineaire geschiedenis); is misschien --overwrite " "nodig? Raadpleeg dgit(1).\n" #: ../dgit:4354 #, perl-format msgid "Declare fast forward from %s\n" msgstr "Lineair (fast forward) declareren vanuit %s\n" #: ../dgit:4355 #, perl-format msgid "Make fast forward from %s\n" msgstr "Lineair (fast forward) maken vanuit %s\n" #: ../dgit:4359 #, perl-format msgid "Made pseudo-merge of %s into dgit view." msgstr "Maakte een pseudo-samenvoeging van %s in de dgit-weergave." #: ../dgit:4372 #, perl-format msgid "Declare fast forward from %s" msgstr "Lineair (fast forward) declareren vanuit %s" #: ../dgit:4380 #, perl-format msgid "Make pseudo-merge of %s into your HEAD." msgstr "Pseudo-samenvoeging maken van %s naar uw HEAD." #: ../dgit:4392 #, perl-format msgid "-p specified %s but changelog specified %s" msgstr "-p gaf %s op, maar het changelog-bestand vermeldde %s" #: ../dgit:4414 #, perl-format msgid "%s is for %s %s but debian/changelog is for %s %s" msgstr "%s is voor %s %s maar debian/changelog is voor %s %s" #: ../dgit:4468 #, perl-format msgid "changes field %s `%s' does not match changelog `%s'" msgstr "het changes-veld %s `%s' komt niet overeen met `%s' uit changelog" #: ../dgit:5701 #, perl-format msgid "dgit: cannot represent change: %s: %s\n" msgstr "dgit: kan wijziging niet representeren: %s: %s\n" #: ../dgit:5706 msgid "" "HEAD has changes to .orig[s] which are not representable by `3.0 (quilt)'\n" msgstr "" "HEAD bevat wijzigingen aan .orig[s] welke niet door `3.0 (quilt)' vertolkt " "kunnen worden\n" #: ../dgit:5744 #, perl-format msgid "" "\n" "For full diff showing the problem(s), type:\n" " %s\n" msgstr "" "\n" "Voor een volledig diff met de problemen, typ::\n" " %s\n" #: ../dgit:5751 #, perl-format msgid "" "--quilt=%s specified, implying patches-unapplied git tree\n" " but git tree differs from orig in upstream files." msgstr "" "--quilt=%s opgegeven, wat een patches-unapplied git boom impliceert\n" " maar de git boom verschilt van orig in bovenstroomse bestanden." #: ../dgit:5757 msgid "" "\n" " ... debian/patches is missing; perhaps this is a patch queue branch?" msgstr "" "\n" " ... debian/patches ontbreekt; is dit misschien een patchwachtrijtak?" #: ../dgit:5764 #, perl-format msgid "" "--quilt=%s specified, implying patches-applied git tree\n" " but git tree differs from result of applying debian/patches to upstream\n" msgstr "" "--quilt=%s opgegeven, wat een patches-applied git boom impliceert\n" " maar de git-boom verschilt van wat het toepassen van debian/patches op " "bovenstroom oplevert\n" #: ../dgit:5778 #, perl-format msgid "Combine debian/ with upstream source for %s\n" msgstr "debian/ met bovenstroomse bron van %s combineren\n" #: ../dgit:5786 msgid "dgit view: creating patches-applied version using gbp pq" msgstr "dgit view: een patches-applied versie creëren met gbp pq" #: ../dgit:5797 #, perl-format msgid "" "--quilt=%s specified, implying that HEAD is for use with a\n" " tool which does not create patches for changes to upstream\n" " .gitignores: but, such patches exist in debian/patches.\n" msgstr "" "--quilt=%s opgegeven, wat impliceert dat HEAD bedoeld is voor\n" " gebruik met gereedschap dat geen patches maakt voor wijzigingen in\n" " bovenstroomse .gitignores: maar zulke patches bestaan in debian/patches.\n" #: ../dgit:5805 msgid "dgit view: creating patch to represent .gitignore changes" msgstr "dgit view: patch maken om .gitignore-wijzigingen weer te geven" #: ../dgit:5810 #, perl-format msgid "%s already exists; but want to create it to record .gitignore changes" msgstr "" "%s bestaat reeds; maar wil het maken om .gitignore-wijzigingen op te nemen" #: ../dgit:5815 msgid "" "Subject: Update .gitignore from Debian packaging branch\n" "\n" "The Debian packaging git branch contains these updates to the upstream\n" ".gitignore file(s). This patch is autogenerated, to provide these\n" "updates to users of the official Debian archive view of the package.\n" msgstr "" "Subject: Bijwerken van .gitignore vanuit de Debian verpakkingstak\n" "\n" "De Debian verpakkingstak bevat deze bijwerkingen van bovenstrooms\n" ".gitignore bestand(en). Deze patch wordt automatisch gemaakt, om deze\n" "bijwerkingen te verstrekken aan gebruikers van de weergave van het pakket\n" "in het officiële Debian-archief.\n" #: ../dgit:5837 msgid "Commit patch to update .gitignore\n" msgstr "Patch om .gitignore bij te werken vastleggen\n" #: ../dgit:5907 msgid "maximum search space exceeded" msgstr "maximale zoekruimte overschreden" #: ../dgit:5925 #, perl-format msgid "has %s not %s" msgstr "bevat %s, niet %s" #: ../dgit:5934 msgid "root commit" msgstr "beginvastlegging (root commit)" #: ../dgit:5940 #, perl-format msgid "merge (%s nontrivial parents)" msgstr "samenvoeging (merge) (%s niet-triviale ouders)" #: ../dgit:5952 #, perl-format msgid "changed %s" msgstr "gewijzigd: %s" #: ../dgit:5971 #, perl-format msgid "" "\n" "%s: error: quilt fixup cannot be linear. Stopped at:\n" msgstr "" "\n" "%s: fout: een quilt fixup kan niet lineair zijn. Gestopt bij:\n" #: ../dgit:5978 #, perl-format msgid "%s: %s: %s\n" msgstr "%s: %s: %s\n" #: ../dgit:5990 msgid "quilt history linearisation failed. Search `quilt fixup' in dgit(7).\n" msgstr "" "lineair maken van de quilt-geschiedenis mislukte. Zoek naar `quilt fixup' in " "dgit(7).\n" #: ../dgit:5993 msgid "quilt fixup cannot be linear, smashing..." msgstr "" "de quilt fixup kan niet lineair zijn, de smash strategie wordt gebruikt..." #: ../dgit:6007 #, perl-format msgid "" "Automatically generated patch (%s)\n" "Last (up to) %s git changes, FYI:\n" "\n" msgstr "" "Automatisch gegenereerde patch (%s)\n" "Laatste (tot en met) %s git-wijzigingen, ter informatie:\n" "\n" #: ../dgit:6014 msgid "quiltify linearisation planning successful, executing..." msgstr "linearisatieplanning voor quiltify was succesvol, wordt uitgevoerd..." #: ../dgit:6048 msgid "contains unexpected slashes\n" msgstr "bevat onverwachte slashes\n" #: ../dgit:6049 msgid "contains leading punctuation\n" msgstr "bevat leestekens aan het begin\n" #: ../dgit:6050 msgid "contains bad character(s)\n" msgstr "bevat foutieve teken(s)\n" #: ../dgit:6051 msgid "is series file\n" msgstr "is een series-bestand\n" #: ../dgit:6052 msgid "too long\n" msgstr "te lang\n" #: ../dgit:6056 #, perl-format msgid "quiltifying commit %s: ignoring/dropping Gbp-Pq %s: %s" msgstr "" "quiltifying commit (quiltificerende vastlegging) %s: Gbp-Pq %s wordt " "genegeerd/weggelaten: %s" #: ../dgit:6085 #, perl-format msgid "dgit: patch title transliteration error: %s" msgstr "dgit: fout bij de transliteratie van de patch-titel: %s" #: ../dgit:6160 #, perl-format msgid "" "quilt mode %s does not make sense (or is not supported) with single-debian-" "patch" msgstr "" "quilt modus %s is zinloos (of wordt niet ondersteund) met single-debian-patch" #: ../dgit:6185 msgid "converted" msgstr "omgezet" #: ../dgit:6186 #, perl-format msgid "dgit view: created (%s)" msgstr "dgit-weergave: gecreëerd: (%s)" #: ../dgit:6240 msgid "Commit removal of .pc (quilt series tracking data)\n" msgstr "" "Vastleggingsverwijdering (commit removal) van .pc (quilt-seriegegevens)\n" #: ../dgit:6250 msgid "starting quiltify (single-debian-patch)" msgstr "quiltify wordt gestart (één enkele debian-patch)" #: ../dgit:6286 #, perl-format msgid "regenerating patch using git diff (--quilt=%s)" msgstr "patch opnieuw genereren met git diff (--quilt=%s)" #: ../dgit:6367 msgid "" "warning: package uses dpkg-source include-binaries feature - not all changes " "are visible in patches!\n" msgstr "" "opgelet: pakket gebruikt de functie include-binaries van dpkg-source - niet " "alle wijzigingen zijn zichtbaar in patches!\n" #: ../dgit:6376 #, perl-format msgid "warning: ignoring bad include-binaries file %s: %s\n" msgstr "opgelet: slecht nclude-binaries-bestand %s wordt genegeerd: %s\n" #: ../dgit:6379 #, perl-format msgid "forbidden path component '%s'" msgstr "niet toegelaten pad-component '%s'" #: ../dgit:6389 #, perl-format msgid "path starts with '%s'" msgstr "pad begint met '%s'" #: ../dgit:6399 #, perl-format msgid "path to '%s' not a plain file or directory" msgstr "pad naar '%s' geen gewoon bestand of map" #: ../dgit:6457 #, perl-format msgid "dgit: split brain (separate dgit view) may be needed (--quilt=%s)." msgstr "" "dgit: gespleten brein (aparte dgit-weergave) is mogelijk nodig (--quilt=%s)." #: ../dgit:6489 #, perl-format msgid "dgit view: found cached (%s)" msgstr "dgit-weergave: gecachete (%s) aangetroffen" #: ../dgit:6494 msgid "dgit view: found cached, no changes required" msgstr "dgit-weergave: gecachete aangetroffen, geen wijzigingen vereist" #: ../dgit:6529 #, perl-format msgid "examining quilt state (multiple patches, %s mode)" msgstr "toestand van quilt wordt nagegaan (meerdere patches, %s-modus)" #: ../dgit:6622 msgid "" "failed to apply your git tree's patch stack (from debian/patches/) to\n" " the corresponding upstream tarball(s). Your source tree and .orig\n" " are probably too inconsistent. dgit can only fix up certain kinds of\n" " anomaly (depending on the quilt mode). Please see --quilt= in dgit(1).\n" msgstr "" "toepassen van de patch-stapel (uit debian/patches/) van uw git-boom op het/" "de\n" " overeenkomstig(e) bovenstroomse tar-archie(f)(ven) mislukte.\n" " Uw broncodeboom en .orig zijn wellicht te inconsistent.\n" " dgit can enkel bepaalde soorten anomalieën repareren\n" " (afhankelijk van de quilt-modus). Raadpleeg --quilt= in dgit(1).\n" #: ../dgit:6636 msgid "Tree already contains .pc - will delete it." msgstr "Boom bevat reeds een .pc - zal dit verwijderen." #: ../dgit:6670 msgid "baredebian quilt fixup: could not find any origs" msgstr "baredebian quilt reparatie: kon geen origs vinden" #: ../dgit:6683 msgid "tarball" msgstr "tar-archief" #: ../dgit:6701 #, perl-format msgid "Combine orig tarballs for %s %s" msgstr " Combineren van orig tar-archieven voor %s %s" #: ../dgit:6717 msgid "tarballs" msgstr "tar-archieven" #: ../dgit:6731 msgid "upstream" msgstr "bovenstroom" #: ../dgit:6755 #, perl-format msgid "%s: base trees orig=%.20s o+d/p=%.20s" msgstr "%s: van de basisbomen zijn orig=%.20s en o+d/p=%.20s" #: ../dgit:6765 #, perl-format msgid "" "%s: quilt differences: src: %s orig %s gitignores: %s orig %s\n" "%s: quilt differences: %9.00009s %s o+d/p %9.00009s %s o+d/p" msgstr "" "%s: quilt-verschillen: src: %s orig %s gitignores: %s orig %s\n" "%s: quilt-verschillen: %9.00009s %s o+d/p %9.00009s %s o+d/p" #: ../dgit:6775 msgid "" "This has only a debian/ directory; you probably want --quilt=bare debian." msgstr "Dit bevat enkel een map debian/; wellicht wilt u --quilt=bare debian." #: ../dgit:6779 msgid "This might be a patches-unapplied branch." msgstr "Dit is mogelijk een tak zonder toepassing van patches." #: ../dgit:6782 msgid "This might be a patches-applied branch." msgstr "Dit is mogelijk een tak met toegepaste patches." #: ../dgit:6785 msgid "Maybe you need one of --[quilt=]gbp --[quilt=]dpm --quilt=unapplied ?" msgstr "" "Heeft u mogelijk een van de volgende opties nodig: --[quilt=]gbp --" "[quilt=]dpm --quilt=unapplied ?" #: ../dgit:6788 msgid "Warning: Tree has .gitattributes. See GITATTRIBUTES in dgit(7)." msgstr "" "Waarschuwing: Boom bevat .gitattributes. Zie GITATTRIBUTES in dgit(7)." #: ../dgit:6792 msgid "Maybe orig tarball(s) are not identical to git representation?" msgstr "" "Is/zijn het/de orig-tararchie(f)(ven) misschien niet identiek aan de " "representatie ervan door git?" #: ../dgit:6803 #, perl-format msgid "starting quiltify (multiple patches, %s mode)" msgstr "quiltify wordt gestart (meerdere patches, %s-modus)" #: ../dgit:6842 msgid "" "\n" "dgit: Building, or cleaning with rules target, in patches-unapplied tree.\n" "dgit: Have to apply the patches - making the tree dirty.\n" "dgit: (Consider specifying --clean=git and (or) using dgit sbuild.)\n" "\n" msgstr "" "\n" "dgit: Bouwen of opruimen met het rules-target in de tak patches-unapplied.\n" "dgit: Moet de patches toepassen - hetgeen de boom vervuilt.\n" "dgit: (Overweeg het gebruik van --clean=git en (of) dgit sbuild.)\n" "\n" #: ../dgit:6854 msgid "dgit: Unapplying patches again to tidy up the tree." msgstr "" "dgit: Toepassen van patches terug ongedaan maken om de boom op te schonen." #: ../dgit:6883 msgid "" "If this is just missing .gitignore entries, use a different clean\n" "mode, eg --clean=dpkg-source,no-check (-wdn/-wddn) to ignore them\n" "or --clean=git (-wg/-wgf) to use `git clean' instead.\n" msgstr "" "Indien het enkel ontbrekende .gitignore-items betreft, gebruik dan een " "andere\n" "clean-modus, bijv. --clean=dpkg-source,no-check (-wdn/-wddn) om deze te\n" "negeren, of --clean=git (-wg/-wgf) om in de plaats `git clean' te " "gebruiken.\n" #: ../dgit:6895 msgid "tree contains uncommitted files and --clean=check specified" msgstr "" "de boom bevat niet-vastgelegde bestanden en --clean=check werd opgegeven" #: ../dgit:6898 msgid "tree contains uncommitted files (NB dgit didn't run rules clean)" msgstr "" "de boom bevat niet-vastgelegde bestanden (NB dgit voerde geen rules clean " "uit)" #: ../dgit:6901 msgid "" "tree contains uncommited, untracked, unignored files\n" "You can use --clean=git[-ff],always (-wga/-wgfa) to delete them.\n" "To include them in the build, it is usually best to just commit them." msgstr "" "de boom bevat niet-vastgelegde, niet-gevolgde, niet-genegeerde bestanden\n" "U kunt --clean=git[-ff],always (-wga/-wgfa) gebruiken om ze te verwijderen.\n" "Om ze in de bouw op te nemen, is het gewoonlijk best om ze gewoon vast te " "leggen." #: ../dgit:6915 #, perl-format msgid "" "quilt mode %s (generally needs untracked upstream files)\n" "contradicts clean mode %s (which would delete them)\n" msgstr "" "quilt modus %s (heeft meestal niet gevolgde bovenstroomse bestanden nodig)\n" "is in strijd met clean modus %s (welke deze zou verwijderen)\n" #: ../dgit:6932 msgid "tree contains uncommitted files (after running rules clean)" msgstr "" "de boom bevat niet-vastgelegde bestanden (na het uitvoeren van rules clean)" #: ../dgit:6946 msgid "clean takes no additional arguments" msgstr "met clean kunnen geen extra argumenten opgegeven worden" #: ../dgit:6965 #, perl-format msgid "-p specified package %s, but changelog says %s" msgstr "-p specificeerde pakket %s, maar het changelog-bestand vermeldt %s" #: ../dgit:6975 msgid "" "dgit: --include-dirty is not supported with split view (including with view-" "splitting quilt modes)" msgstr "" "dgit: --include-dirty wordt niet ondersteund bij gesplitste weergave (met " "inbegrip van quilt-modi welke de weergave splitsen)" #: ../dgit:6984 #, perl-format msgid "dgit: --quilt=%s, %s" msgstr "dgit: --quilt=%s, %s" #: ../dgit:6988 msgid "dgit: --upstream-commitish only makes sense with --quilt=baredebian" msgstr "dgit: --upstream-commitish is enkel zinvol met --quilt=baredebian" #: ../dgit:7023 #, perl-format msgid "remove old changes file %s: %s" msgstr "verwijder oud changes-bestand %s: %s" #: ../dgit:7025 #, perl-format msgid "would remove %s" msgstr "zou %s verwijderen" #: ../dgit:7043 #, perl-format msgid "warning: dgit option %s must be passed before %s on dgit command line\n" msgstr "" "waarschuwing: aan de commandoregel van dgit moet de optie %s van dgit " "opgegeven worden voor %s\n" #: ../dgit:7050 #, perl-format msgid "" "warning: option %s should probably be passed to dgit before %s sub-command " "on the dgit command line, so that it is seen by dgit and not simply passed " "to %s\n" msgstr "" "waarschuwing: op de commandoregel van dgit moet optie %s wellicht meegegeven " "worden aan dgit voor het sub-commando %s, zodat het door dgit gezien wordt " "en niet enkel meegegeven wordt aan %s\n" #: ../dgit:7076 msgid "archive query failed (queried because --since-version not specified)" msgstr "" "mislukt verzoek aan het archief (verzoek gedaan omdat --since-version niet " "opgegeven werd)" #: ../dgit:7082 #, perl-format msgid "changelog will contain changes since %s" msgstr "changelog zal wijzigingen sinds %s bevatten" #: ../dgit:7085 msgid "package seems new, not specifying -v" msgstr "pakket lijkt nieuw te zijn, geen vermelding van -v" #: ../dgit:7128 msgid "Wanted to build nothing!" msgstr "Wilde niets bouwen!" #: ../dgit:7166 #, perl-format msgid "only one changes file from build (%s)\n" msgstr "slechts één changes-bestand van bouw (%s)\n" #: ../dgit:7173 #, perl-format msgid "%s found in binaries changes file %s" msgstr "%s aangetroffen in changes-bestand %s van de binaire pakketten" #: ../dgit:7180 #, perl-format msgid "%s unexpectedly not created by build" msgstr "%s tegen de verwachtingen in niet gecreëerd door de bouw" #: ../dgit:7184 #, perl-format msgid "install new changes %s{,.inmulti}: %s" msgstr "installeer nieuw changes %s{,.inmulti}: %s" #: ../dgit:7189 #, perl-format msgid "wrong number of different changes files (%s)" msgstr "fout nummer van verschillende changes-bestanden (%s)" #: ../dgit:7192 #, perl-format msgid "build successful, results in %s\n" msgstr "bouw was succesvol, resultaten in %s\n" #: ../dgit:7205 #, perl-format msgid "" "changes files other than source matching %s already present; building would " "result in ambiguity about the intended results.\n" "Suggest you delete %s.\n" msgstr "" "er zijn reeds andere changes-bestanden aanwezig dan met %s overeenkomende " "broncode,; bouwen zou resulteren in ambiguïteit over het bedoelde " "resultaat.\n" "De suggestie is dat u %s verwijdert.\n" #: ../dgit:7223 msgid "build successful\n" msgstr "de bouw was succesvol\n" #: ../dgit:7231 #, perl-format msgid "" "%s: warning: build-products-dir set, but not supported by dpkg-buildpackage\n" "%s: warning: build-products-dir will be ignored; files will go to ..\n" msgstr "" "%s: waarschuwing: build-products-dir ingesteld, maar niet ondersteund door " "dpkg-buildpackage\n" "%s: waarschuwing: build-products-dir zal genegeerd worden; bestanden zullen " "gaan naar ..\n" #: ../dgit:7342 #, perl-format msgid "remove %s: %s" msgstr "verwijder %s: %s" #: ../dgit:7387 msgid "--include-dirty not supported with --build-products-dir, sorry" msgstr "--include-dirty niet ondersteund met --build-products-dir, sorry" #: ../dgit:7413 #, perl-format msgid "put in place new built file (%s): %s" msgstr "zet nieuw gebouwd bestand (%s) op zijn plaats: %s" #: ../dgit:7426 msgid "build-source takes no additional arguments" msgstr "build-source moet zonder bijkomende argumenten gebruikt worden" #: ../dgit:7430 #, perl-format msgid "source built, results in %s and %s" msgstr "broncodepakket is gebouwd, resultaten in %s en %s" #: ../dgit:7437 msgid "" "dgit push-source: --include-dirty/--ignore-dirty does not makesense with " "push-source!" msgstr "" "dgit push-source: --include-dirty/--ignore-dirty zijn zinloos met push-" "source!" #: ../dgit:7443 msgid "source changes file" msgstr "broncode-changes-bestand" #: ../dgit:7445 msgid "user-specified changes file is not source-only" msgstr "" "door de gebruiker opgegeven changes-bestand is niet 'uitsluitend broncode'" #: ../dgit:7465 ../dgit:7467 #, perl-format msgid "%s (in build products dir): %s" msgstr "%s (in bouwproductenmap): %s" #: ../dgit:7481 msgid "" "perhaps you need to pass -A ? (sbuild's default is to build only\n" "arch-specific binaries; dgit 1.4 used to override that.)\n" msgstr "" "moet u misschien -A opgeven? (sbuild's standaard is om enkel arch-" "specifieke\n" "binaire pakketten te bouwen; dgit 1.4 was gewend dit te overschrijven.)\n" #: ../dgit:7494 msgid "" "you asked for a builder but your debbuildopts didn't ask for any binaries -- " "is this really what you meant?" msgstr "" "u vroeg een bouwprogramma maar uw debbuildopts vroeg geen enkel binair " "pakket - is dit echt wat u bedoelde?" #: ../dgit:7498 msgid "" "we must build a .dsc to pass to the builder but your debbuiltopts forbids " "the building of a source package; cannot continue" msgstr "" "we moeten een .dsc bouwen om door te geven aan het bouwprogramma, maar uw " "debbuiltopts verbiedt het bouwen van een broncodepakket; voortgaan is " "onmogelijk" #: ../dgit:7528 msgid "incorrect arguments to dgit print-unapplied-treeish" msgstr "foutieve argumenten voor dgit print-unapplied-treeish" #: ../dgit:7549 msgid "source tree" msgstr "broncodeboom" #: ../dgit:7551 #, perl-format msgid "dgit: import-dsc: %s" msgstr "dgit: import-dsc: %s" #: ../dgit:7564 #, perl-format msgid "unknown dgit import-dsc sub-option `%s'" msgstr "onbekende onderliggende optie `%s' voor dgit import-dsc" #: ../dgit:7568 msgid "usage: dgit import-dsc .../PATH/TO/.DSC BRANCH" msgstr "gebruik: dgit import-dsc .../PAD/NAAR/.DSC TAK" #: ../dgit:7572 msgid "dry run makes no sense with import-dsc" msgstr "testuitvoering (dry run) is zinloos met import-dsc" #: ../dgit:7589 #, perl-format msgid "%s is checked out - will not update it" msgstr "%s is binnengehaald (checked out) - zal het niet bijwerken" #: ../dgit:7594 #, perl-format msgid "open import .dsc (%s): %s" msgstr "open import-.dsc (%s): %s" #: ../dgit:7596 #, perl-format msgid "read %s: %s" msgstr "lees %s: %s" #: ../dgit:7607 msgid "import-dsc signature check failed" msgstr "controle ondertekening van import-dsc mislukte" #: ../dgit:7610 #, perl-format msgid "%s: warning: importing unsigned .dsc\n" msgstr "%s: waarschuwing: niet-ondertekend .dsc wordt geïmporteerd\n" #: ../dgit:7621 msgid "Dgit metadata in .dsc" msgstr "Dgit-metadata in .dsc" #: ../dgit:7632 msgid "dgit: import-dsc of .dsc with Dgit field, using git hash" msgstr "dgit: import-dsc van .dsc met Dgit-veld, met behulp van git hash" #: ../dgit:7641 #, perl-format msgid "" ".dsc contains Dgit field referring to object %s\n" "Your git tree does not have that object. Try `git fetch' from a\n" "plausible server (browse.dgit.d.o? salsa?), and try the import-dsc again.\n" msgstr "" ".dsc bevat Dgit-veld dat verwijst naar object %s\n" "Uw git-boom bevat dat object niet. Gebruik `git fetch' van een aannemelijke\n" "server (browse.dgit.d.o? salsa?) en probeer import-dsc opnieuw.\n" #: ../dgit:7648 msgid "Not fast forward, forced update." msgstr "Niet lineair (fast forward), gedwongen update." #: ../dgit:7650 #, perl-format msgid "Not fast forward to %s" msgstr "Niet lineair (fast forward) naar %s" #: ../dgit:7655 #, perl-format msgid "updated git ref %s" msgstr "git ref %s geüpdatet" #: ../dgit:7660 #, perl-format msgid "" "Branch %s already exists\n" "Specify ..%s for a pseudo-merge, binding in existing history\n" "Specify +%s to overwrite, discarding existing history\n" msgstr "" "Tak %s bestaat reeds\n" "Geef ..%s op voor een pseudo-samenvoeging, ingepast in bestaande " "geschiedenis\n" "Geef +%s op om te overschrijven en bestaande geschiedenis te verwijderen\n" #: ../dgit:7680 #, perl-format msgid "lstat %s works but stat gives %s !" msgstr "lstat %s werkt maar stat geeft %s !" #: ../dgit:7682 #, perl-format msgid "stat %s: %s" msgstr "stat %s: %s" #: ../dgit:7690 #, perl-format msgid "import %s requires %s, but: %s" msgstr "importeren van %s vereist %s, maar: %s" #: ../dgit:7709 #, perl-format msgid "cannot import %s which seems to be inside working tree!" msgstr "kan %s niet importeren, het lijkt in de werkboom te zitten!" #: ../dgit:7713 #, perl-format msgid "symlink %s to %s: %s" msgstr "symbolische koppeling %s naar %s: %s" #: ../dgit:7714 #, perl-format msgid "made symlink %s -> %s" msgstr "maakte symbolische koppeling %s -> %s" #: ../dgit:7725 msgid "Import, forced update - synthetic orphan git history." msgstr "Importeren, gedwongen update - kunstmatige verweesde git-geschiedenis." #: ../dgit:7727 msgid "Import, merging." msgstr "Importeren, samenvoegen." #: ../dgit:7741 #, perl-format msgid "Merge %s (%s) import into %s\n" msgstr "Invoegen van import %s (%s) in %s\n" #: ../dgit:7750 #, perl-format msgid "results are in git ref %s" msgstr "resultaten staan in git ref %s" #: ../dgit:7757 msgid "need only 1 subpath argument" msgstr "slechts 1 argument met een onderliggend pad nodig" #: ../dgit:7775 msgid "need destination argument" msgstr "bestemmingsargument nodig" #: ../dgit:7780 #, perl-format msgid "exec git clone: %s\n" msgstr "exec git clone: %s\n" #: ../dgit:7788 msgid "no arguments allowed to dgit print-dgit-repos-server-source-url" msgstr "geen argumenten toegelaten bij dgit print-dgit-repos-server-source-url" #: ../dgit:7799 msgid "no arguments allowed to dgit print-dpkg-source-ignores" msgstr "geen argumenten toegelaten bij dgit print-dpkg-source-ignores" #: ../dgit:7805 msgid "no arguments allowed to dgit setup-mergechangelogs" msgstr "geen argumenten toegelaten bij dgit setup-mergechangelogs" #: ../dgit:7812 ../dgit:7818 msgid "no arguments allowed to dgit setup-useremail" msgstr "geen argumenten toegelaten bij dgit setup-useremail" #: ../dgit:7824 msgid "no arguments allowed to dgit setup-tree" msgstr "geen argumenten toegelaten bij dgit setup-tree" #: ../dgit:7871 msgid "" "--initiator-tempdir must be used specify an absolute, not relative, " "directory." msgstr "" "--initiator-tempdir moet gebruikt worden om een absolute, geen relatieve map " "op te geven." #: ../dgit:7910 #, perl-format msgid "%s needs a value" msgstr "%s moet een waarde hebben" #: ../dgit:7914 #, perl-format msgid "bad value `%s' for %s" msgstr "foute waarde `%s' voor %s" #: ../dgit:8014 #, perl-format msgid "%s: warning: ignoring unknown force option %s\n" msgstr "%s: waarschuwing: onbekende force-optie %s wordt genegeerd\n" #: ../dgit:8032 #, perl-format msgid "unknown long option `%s'" msgstr "onbekende lange optie `%s'" #: ../dgit:8087 #, perl-format msgid "unknown short option `%s'" msgstr "onbekende korte optie `%s'" #: ../dgit:8102 #, perl-format msgid "%s is set to something other than SIG_DFL\n" msgstr "%s staat ingesteld op iets anders dan SIG_DFL\n" #: ../dgit:8106 #, perl-format msgid "%s is blocked\n" msgstr "%s is geblokkeerd\n" #: ../dgit:8112 #, perl-format msgid "" "On entry to dgit, %s\n" "This is a bug produced by something in your execution environment.\n" "Giving up.\n" msgstr "" "Bij het binnengaan in dgit, %s\n" "Dit is een bug die veroorzaakt wordt door iets in uw uitvoeringsomgeving.\n" "Er wordt opgegeven.\n" #: ../dgit:8129 #, perl-format msgid "cannot set command for %s" msgstr "kan commando voor %s niet instellen" #: ../dgit:8142 #, perl-format msgid "cannot configure options for %s" msgstr "kan opties voor %s niet configureren" #: ../dgit:8162 #, perl-format msgid "unknown quilt-mode `%s'" msgstr "onbekende quilt-modus `%s'" #: ../dgit:8174 #, perl-format msgid "unknown %s setting `%s'" msgstr "onbekende %s dat `%s' instelt" #: ../dgit:8202 msgid "DRY RUN ONLY\n" msgstr "ENKEL TESTUITVOERING (DRY RUN)\n" #: ../dgit:8203 msgid "DAMP RUN - WILL MAKE LOCAL (UNSIGNED) CHANGES\n" msgstr "" "GETEMPERDE UITVOERING (DAMP RUN) - ZAL LOKALE (NIET-ONDERTEKENDE) " "WIJZIGINGEN MAKEN\n" #: ../dgit:8223 #, perl-format msgid "unknown operation %s" msgstr "onbekende bewerking %s" #: ../git-debrebase:45 msgid "" "usages:\n" " git-debrebase [] [--|-i ]\n" " git-debrebase [] status\n" " git-debrebase [] prepush [--prose=...]\n" " git-debrebase [] quick|conclude\n" " git-debrebase [] new-upstream [
]\n" " git-debrebase [] convert-from-* ...\n" " ...\n" "See git-debrebase(1), git-debrebase(5), dgit-maint-debrebase(7) (in dgit).\n" msgstr "" "gebruik:\n" " git-debrebase [] [--|-i ]\n" " git-debrebase [] status\n" " git-debrebase [] prepush [--prose=...]\n" " git-debrebase [] quick|conclude\n" " git-debrebase [] new-upstream [
]\n" " git-debrebase [] convert-from-* ...\n" " ...\n" "Zie git-debrebase(1), git-debrebase(5), dgit-maint-debrebase(7) (in dgit).\n" #: ../git-debrebase:68 #, perl-format msgid "%s: bad usage: %s\n" msgstr "%s: foutief gebruik: %s\n" #: ../git-debrebase:79 #, perl-format msgid "bad options follow `git-debrebase %s'" msgstr "foutieve opties volgen na `git-debrebase %s'" #: ../git-debrebase:90 #, perl-format msgid "missing required git config %s" msgstr "de vereiste git-configuratie %s ontbreekt" #: ../git-debrebase:363 #, perl-format msgid "%s: snag ignored (-f%s): %s\n" msgstr "%s: moeilijkheid (snag) genegeerd (-f%s): %s\n" #: ../git-debrebase:366 #, perl-format msgid "%s: snag detected (-f%s): %s\n" msgstr "%s: moeilijkheid (snag) gevonden (-f%s): %s\n" #: ../git-debrebase:379 #, perl-format msgid "%s: snags: %d overriden by individual -f options\n" msgstr "" "%s: moeilijkheden (snags): %d overschreven door individuele -f opties\n" #: ../git-debrebase:385 #, perl-format msgid "%s: snags: %d overriden by global --force\n" msgstr "%s: moeilijkheden (snags): %d overschreven door het globale --force\n" #: ../git-debrebase:389 #, perl-format msgid "%s: snags: %d blocker(s) (you could -f, or --force)" msgstr "" "%s: moeilijkheden (snags): %d blokker(s) (u zou -f of --force kunnen " "gebruiken)" #: ../git-debrebase:421 msgid "" "Branch/history seems mangled - no longer in gdr format.\n" "See ILLEGAL OPERATIONS in git-debrebase(5).\n" msgstr "" "Tak/geschiedenis lijkt verknoeid - niet langer in gdr-indeling.\n" "Zie ILLEGAL OPERATIONS (ongeldige bewerkingen) in git-debrebase(5).\n" #: ../git-debrebase:428 #, perl-format msgid "" "%s\n" "Is this meant to be a gdr branch? %s\n" msgstr "" "%s\n" "Zou dit een gdr-tak moeten zijn? %s\n" #: ../git-debrebase:433 #, perl-format msgid "" "%s\n" "%s\n" "Consider git-debrebase scrap, to throw away your recent work.\n" msgstr "" "%s\n" "%s\n" "Overweeg git-debrebase scrap, om uw recent werk weg te gooien.\n" #: ../git-debrebase:439 #, perl-format msgid "" "%s\n" "Branch does not seem to be meant to be a git-debrebase branch?\n" "Wrong branch, or maybe you needed git-debrebase convert-from-*.\n" msgstr "" "%s\n" "Tak lijkt niet bedoeld te zijn als git-debrebase tak?\n" "Foute tak, of misschien had u git-debrebase convert-from-* nodig.\n" #: ../git-debrebase:450 #, perl-format msgid "" "%s\n" "Branch/history mangled, and diverged since last git-debrebase.\n" "Maybe you reset to, or rebased from, somewhere inappropriate.\n" msgstr "" "%s\n" "Tak/geschiedenis verknoeid en uiteengelopen sinds laatste git-debrebase.\n" "Misschien voerde u een reset naar of een rebase van een ongepaste plaats " "uit.\n" #: ../git-debrebase:897 #, perl-format msgid "git-debrebase `anchor' but %s" msgstr "git-debrebase `anker' maar %s" #: ../git-debrebase:899 msgid "has other than two parents" msgstr "heeft iets anders dan twee ouders" #: ../git-debrebase:900 msgid "contains debian/patches" msgstr "bevat debian/patches" #: ../git-debrebase:926 msgid "is an origin commit" msgstr "is een externe vastlegging (origin commit)" #: ../git-debrebase:928 msgid "upstream files differ from left parent" msgstr "bovenstroomse bestanden verschillen van resterende ouder" #: ../git-debrebase:930 msgid "debian/ differs from right parent" msgstr "debian/ verschilt van de rechterouder" #: ../git-debrebase:941 msgid "edits debian/patches" msgstr "bewerkt debian/patches" #: ../git-debrebase:953 msgid "parent's debian is not a directory" msgstr "bij de ouder is debian geen map" #: ../git-debrebase:960 msgid "no changes" msgstr "geen wijzigingen" #: ../git-debrebase:966 msgid "origin commit" msgstr "externe vastlegging (origin commit)" #: ../git-debrebase:1017 #, perl-format msgid "unknown kind of merge from %s" msgstr "onbekend soort samenvoeging vanuit %s" #: ../git-debrebase:1020 msgid "octopus merge" msgstr "meervoudige samenvoeging (octopus merge)" #: ../git-debrebase:1024 msgid "general two-parent merge" msgstr "algemene twee-oudersamenvoeging (two-parent merge)" #: ../git-debrebase:1041 #, perl-format msgid "inconsistent anchors in merged-breakwaters %s" msgstr "strijdige ankers in samengevoegde golfbrekers (merged-breakwaters) %s" #: ../git-debrebase:1081 #, perl-format msgid "branch needs laundering (run git-debrebase): %s" msgstr "tak heeft wasbeurt (laundering) nodig (voer git-debrebase uit): %s" #: ../git-debrebase:1109 #, perl-format msgid "packaging change (%s) follows upstream change" msgstr "wijziging (%s) bij het verpakken volgt de bovenstroomse wijziging" #: ../git-debrebase:1110 #, perl-format msgid " (eg %s)" msgstr " (bijv. %s)" #: ../git-debrebase:1116 msgid "found mixed upstream/packaging commit" msgstr "gemengde toeleveraars-/verpakkings-vastlegging aangetroffen" #: ../git-debrebase:1117 ../git-debrebase:1125 ../git-debrebase:1130 #: ../git-debrebase:1135 ../git-debrebase:1141 ../git-debrebase:1149 #, perl-format msgid " (%s)" msgstr " (%s)" #: ../git-debrebase:1124 #, perl-format msgid "found interchange bureaucracy commit (%s)" msgstr "vastlegging in verband met uitwisselingsbeheer aangetroffen (%s)" #: ../git-debrebase:1129 msgid "found dgit dsc import" msgstr "dsc-import door dgit aangetroffen" #: ../git-debrebase:1134 msgid "found bare dgit dsc import with no prior history" msgstr "" "kale dsc-import door dgit aangetroffen zonder voorafgaande geschiedenis" #: ../git-debrebase:1140 msgid "found vanilla merge" msgstr "standaardsamenvoeging (vanilla merge) aangetroffen" #: ../git-debrebase:1147 #, perl-format msgid "found unprocessable commit, cannot cope: %s" msgstr "niet-verwerkbare vastlegging aangetroffen, kan er niet mee om: %s" #: ../git-debrebase:1215 #, perl-format msgid "found unprocessable commit, cannot cope; %3$s: (commit %1$s) (d.%2$s)" msgstr "" "niet-verwerkbare vastlegging aangetroffen, kan er niet mee om; %3$s: " "(vastlegging %1$s) (d.%2$s)" #: ../git-debrebase:1216 #, perl-format msgid "found unprocessable commit, cannot cope: (commit %1$s) (d.%2$s)" msgstr "" "niet-verwerkbare vastlegging aangetroffen, kan er niet mee om: (vastlegging " "%1$s) (d.%2$s)" #: ../git-debrebase:1337 msgid "bare dgit dsc import" msgstr "kale dsc-import door dgit" #: ../git-debrebase:1677 ../git-debrebase:1680 #, perl-format msgid "mismatch %s ?" msgstr "discrepantie %s ?" #: ../git-debrebase:1683 #, perl-format msgid "mismatch %s != %s ?" msgstr "discrepantie %s != %s ?" #: ../git-debrebase:1693 #, perl-format msgid "internal error %#x %s %s" msgstr "interne fout %#x %s %s" #: ../git-debrebase:1721 #, perl-format msgid "%s: laundered (head was %s)\n" msgstr "%s: gewassen (laundered) (head was %s)\n" #: ../git-debrebase:1735 msgid "you are in the middle of a git-rebase already" msgstr "u bent reeds middenin een git-rebase" #: ../git-debrebase:1761 msgid "launder for rebase" msgstr "wassen (launder) voor rebase" #: ../git-debrebase:1766 msgid "analyse does not support any options" msgstr "analyse ondersteunt geen opties" #: ../git-debrebase:1768 msgid "too many arguments to analyse" msgstr "te veel argumenten om te analyseren" #: ../git-debrebase:1801 #, perl-format msgid "%s already exists" msgstr "%s bestaat reeds" #: ../git-debrebase:1803 msgid "HEAD symref is not to refs/heads/" msgstr "HEAD symref wijst niet naar refs/heads/" #: ../git-debrebase:1826 #, perl-format msgid "OK, you are ahead of %s\n" msgstr "Oké, u bent voor op %s\n" #: ../git-debrebase:1830 #, perl-format msgid "you are behind %s, divergence risk" msgstr "u bent achter op %s, gevaar voor uiteenlopen" #: ../git-debrebase:1834 #, perl-format msgid "you have diverged from %s" msgstr "u bent uiteengelopen van %s" #: ../git-debrebase:1856 msgid "remote dgit branch" msgstr "externe dgit-tak" #: ../git-debrebase:1859 msgid "remote dgit branch for sid" msgstr "externe dgit-tak voor sid" #: ../git-debrebase:1887 msgid "Recorded previous head for preservation" msgstr "Vorige head voor behoud opgetekend" #: ../git-debrebase:1895 #, perl-format msgid "could not record ffq-prev: %s" msgstr "kon ffq-prev niet optekenen: %s" #: ../git-debrebase:1906 #, perl-format msgid "could not check ffq-prev: %s" msgstr "kon ffq-prev niet controleren: %s" #: ../git-debrebase:1926 msgid "fast forward" msgstr "lineair (fast forward)" #: ../git-debrebase:1936 msgid "Declare fast forward / record previous work" msgstr "Afkondigen lineair (fast forward) / optekenen vorig werk" #: ../git-debrebase:1948 msgid "No ffq-prev to stitch." msgstr "Geen ffq-prev om te borduren." #: ../git-debrebase:1965 msgid "need NEW-VERSION [UPS-COMMITTISH]" msgstr "heb NIEUWE-VERSIE [TOEL-COMMITTISH] nodig" #: ../git-debrebase:1970 #, perl-format msgid "bad version number `%s'" msgstr "fout versienummer `%s'" #: ../git-debrebase:1988 #, perl-format msgid "upstream piece `%s'" msgstr "bovenstrooms stuk `%s'" #: ../git-debrebase:1989 msgid "upstream (main piece" msgstr "bovenstrooms (belangrijkste stuk" #: ../git-debrebase:2009 msgid "for each EXTRA-UPS-NAME need EXTRA-UPS-COMMITISH" msgstr "voor elke EXTRA-TOEL-NAAM is een EXTRA-TOEL-COMMITISH nodig" #: ../git-debrebase:2027 msgid "old anchor is recognised due to --anchor, cannot check upstream" msgstr "" "oud anker werd herkend omwille van --anchor, kan bovenstroom niet controleren" #: ../git-debrebase:2043 #, perl-format msgid "" "previous upstream combine %s mentions %d pieces (each implying one parent) " "but has %d parents (one per piece plus maybe a previous combine)" msgstr "" "vorige bovenstroom-bijeenvoeging %s vermeldt %d stukken (hetgeen voor elk " "ervan één ouder impliceert) maar heeft %d ouders (één per stuk plus " "misschien een eerdere bijeenvoeging)" #: ../git-debrebase:2052 #, perl-format msgid "previous upstream combine %s first piece is not `.'" msgstr "eerste stuk van vorige bovenstroom-bijeenvoeging %s is niet `.'" #: ../git-debrebase:2065 #, perl-format msgid "" "previous upstream %s is from git-debrebase but not an `upstream-combine' " "commit" msgstr "" "vorige bovenstroomse %s is van git-debrebase maar geen `upstream-combine'-" "vastlegging" #: ../git-debrebase:2076 #, perl-format msgid "introducing upstream piece `%s'" msgstr "bovenstrooms stuk `%s' wordt ingevoerd" #: ../git-debrebase:2079 #, perl-format msgid "dropping upstream piece `%s'" msgstr "bovenstrooms stuk `%s' wordt weggelaten" #: ../git-debrebase:2082 #, perl-format msgid "not fast forward: %s %s" msgstr "niet lineair (fast forward): %s %s" #: ../git-debrebase:2193 msgid "Previous head already recorded\n" msgstr "Vorige head reeds opgenomen\n" #: ../git-debrebase:2197 #, perl-format msgid "Could not preserve: %s" msgstr "Niet in staat te behouden: %s" #: ../git-debrebase:2202 ../git-debrebase:2208 ../git-debrebase:2214 #: ../git-debrebase:2304 ../git-debrebase:2313 ../git-debrebase:2337 #: ../git-debrebase:2401 msgid "no arguments allowed" msgstr "geen argumenten toegelaten" #: ../git-debrebase:2236 msgid "branch contains furniture (not laundered)" msgstr "tak bevat stoffering (niet gewassen)" #: ../git-debrebase:2237 msgid "branch is unlaundered" msgstr "tak is ongewassen (unlaundered)" #: ../git-debrebase:2238 msgid "branch needs laundering" msgstr "tak heeft wasbeurt nodig" #: ../git-debrebase:2239 msgid "branch not in git-debrebase form" msgstr "tak is niet in git-debrebase-indeling" #: ../git-debrebase:2249 msgid "current branch contents, in git-debrebase terms:\n" msgstr "inhoud van de huidige tak, in git-debrebase-terminologie:\n" #: ../git-debrebase:2251 msgid " branch is laundered\n" msgstr " tak is gewassen\n" #: ../git-debrebase:2267 #, perl-format msgid " %s is not well-defined\n" msgstr " %s is niet goed gedefinieerd\n" #: ../git-debrebase:2273 msgid "key git-debrebase commits:\n" msgstr "kern-git-debrebase-vastleggingen:\n" #: ../git-debrebase:2274 msgid "anchor" msgstr "anker" #: ../git-debrebase:2275 msgid "breakwater" msgstr "golfbreker (breakwater)" #: ../git-debrebase:2280 msgid "branch and ref status, in git-debrebase terms:\n" msgstr "toestand van tak en ref, in git-debrebase-terminologie:\n" #: ../git-debrebase:2287 msgid " unstitched; previous tip was:\n" msgstr " borduursel losgemaakt; vorige tip was:\n" #: ../git-debrebase:2290 msgid " stitched? (no record of git-debrebase work)\n" msgstr " geborduurd? (geen registratie van git-debrebase-werk)\n" #: ../git-debrebase:2292 msgid " stitched\n" msgstr " geborduurd\n" #: ../git-debrebase:2294 msgid " not git-debrebase (diverged since last stitch)\n" msgstr " geen git-debrebase (uiteengelopen sinds laatste borduursel)\n" #: ../git-debrebase:2297 msgid "you are currently rebasing\n" msgstr "u bent momenteel aan het rebasen\n" #: ../git-debrebase:2314 ../git-debrebase:2327 msgid "launder for git-debrebase quick" msgstr "wassen voor git-debrebase quick" #: ../git-debrebase:2321 ../git-debrebase:2351 msgid "No ongoing git-debrebase session." msgstr "Geen lopende git-debrebase-sessie." #: ../git-debrebase:2390 msgid "Commit patch queue (exported by git-debrebase)" msgstr "Vastlegging patch-wachtrij (geëxporteerd door git-debrebase)" #: ../git-debrebase:2407 msgid "No (more) patches to export." msgstr "Geen (andere) patches die geëxporteerd moeten worden." #: ../git-debrebase:2414 #, perl-format msgid "" "Patch export produced patch amendments (abandoned output commit %s). Try " "laundering first." msgstr "" "De patch-export produceerde patch-herzieningen (vastlegging van uitvoer %s " "gestaakt). Probeer eerst een wasbeurt te doen." #: ../git-debrebase:2434 #, perl-format msgid "%s contains comments, which will be discarded" msgstr "%s bevat commentaar die verwijderd zal worden" #: ../git-debrebase:2439 #, perl-format msgid "patch %s repeated in %s !" msgstr "patch %s herhaald in %s !" #: ../git-debrebase:2446 #, perl-format msgid "Unused patch file %s will be discarded" msgstr "Niet gebruikt patch-bestand %s zal verwijderd worden" #: ../git-debrebase:2454 msgid "ffq-prev exists, this is already managed by git-debrebase!" msgstr "ffq-prev bestaat; dit wordt reeds beheerd door git-debrebase!" #: ../git-debrebase:2459 msgid "ahead of debrebase-last, this is already managed by git-debrebase!" msgstr "voorop op debrebase-last; dit wordt reeds beheerd door git-debrebase!" #: ../git-debrebase:2476 msgid "want only 1 optional argument, the upstream git commitish" msgstr "wil slechts 1 facultatief argument, de bovenstroomse git commitish" #: ../git-debrebase:2481 msgid "missing Version from changelog\n" msgstr "Version vanuit de changelog wordt gemist\n" #: ../git-debrebase:2497 #, perl-format msgid "" "upstream (%s) and HEAD are not\n" "identical in upstream files. See diffstat above, or run\n" " git diff %s HEAD -- :!/debian :/\n" msgstr "" "bovenstroom (%s) en HEAD zijn niet\n" "identiek in de bovenstroomse bestanden. Zie diffstat hierboven, of voer dit " "commando uit:\n" " git diff %s HEAD -- :!/debian :/\n" #: ../git-debrebase:2505 #, perl-format msgid "upstream (%s) is not an ancestor of HEAD" msgstr "bovenstroom (%s) is geen voorouder van HEAD" #: ../git-debrebase:2512 #, perl-format msgid "" "history between upstream (%s) and HEAD contains direct changes to upstream " "files - are you sure this is a gbp (patches-unapplied) branch?" msgstr "" "de geschiedenis tussen bovenstroom (%s) en HEAD bevat rechtstreekse " "wijzigingen aan bovenstroomse bestanden - bent u zeker dat dit een gbp-tak " "(patches-unapplied) is?" #: ../git-debrebase:2514 #, perl-format msgid "list expected changes with: %s\n" msgstr "toon verwachte wijzigingen met: %s\n" #: ../git-debrebase:2521 #, perl-format msgid "upstream (%s) contains debian/ directory" msgstr "upstream (%s) bevat een map debian/" #: ../git-debrebase:2539 msgid "neither of the first two changelog entries are released\n" msgstr "" "geen van de eerste twee items uit het changelog-bestand werd uitgebracht\n" #: ../git-debrebase:2545 #, perl-format msgid "could not find suitable maintainer view tag %s\n" msgstr "kon geen geschikte maintainer-weergavetag %s vinden\n" #: ../git-debrebase:2548 #, perl-format msgid "HEAD is not FF from maintainer tag %s!" msgstr "HEAD is niet FF (lineair) vanaf maintainer-tag %s!" #: ../git-debrebase:2551 #, perl-format msgid "dgit view tag %s not found\n" msgstr "dgit-weergavetag %s niet gevonden\n" #: ../git-debrebase:2553 #, perl-format msgid "dgit view tag %s is not FF from maintainer tag %s\n" msgstr "dgit-weergavetag %s is niet FF (lineair) vanaf maintainer-tag %s\n" #: ../git-debrebase:2555 #, perl-format msgid "will stitch in dgit view, %s\n" msgstr "zal borduren in de dgit-weergave, %s\n" #: ../git-debrebase:2562 #, perl-format msgid "" "Cannot confirm dgit view: %s\n" "Failed to stitch in dgit view (see messages above).\n" "dgit --overwrite will be needed on the first dgit push after conversion.\n" msgstr "" "Kan de dgit-weergave niet bevestigen: %s\n" "Borduren in dgit-weergave mislukte (zie bovenstaande berichten).\n" "dgit --overwrite zal nodig zijn bij de eerste dgit push na de omzetting.\n" #: ../git-debrebase:2608 #, perl-format msgid "%s: converted from patched-unapplied (gbp) branch format, OK\n" msgstr "" "%s: omgezet vanuit de indeling van de tak zonder toepassing van patches " "(patched-unapplied) (gbp), Oké\n" #: ../git-debrebase:2637 #, perl-format msgid "" "%s: converted to git-buildpackage branch format\n" "%s: WARNING: do not now run \"git-debrebase\" any more\n" "%s: WARNING: doing so would drop all upstream patches!\n" msgstr "" "%s: omgezet naar de indeling voor een tak van git-buildpackage\n" "%s: WAARSCHUWING: voer \"git-debrebase\" nu niet meer uit\n" "%s: WAARSCHUWING: dat doen zou alle bovenstroomse patches doen wegvallen!\n" #: ../git-debrebase:2658 msgid "takes 1 optional argument, the upstream commitish" msgstr "heeft 1 facultatief argument, de bovenstroomse commitish" #: ../git-debrebase:2666 #, perl-format msgid "%s, from command line" msgstr "%s, van de commandoregel" #: ../git-debrebase:2680 #, perl-format msgid "" "%s: Branch already seems to be in git-debrebase format!\n" "%s: --always-convert-anyway would do the conversion operation anyway\n" "%s: but is probably a bad idea. Probably, you wanted to do nothing.\n" msgstr "" "%s: Tak lijkt reeds in git-debrebase-indeling te zijn!\n" "%s: --always-convert-anyway zou de omzettingsbewerking toch uitvoeren,\n" "%s: maar is wellicht geen goed idee. Vermoedelijk wilde u niets doen.\n" #: ../git-debrebase:2684 msgid "Branch already in git-debrebase format." msgstr "Tak is reeds in git-debrebase-indeling." #: ../git-debrebase:2696 msgid "Considering possible commits corresponding to upstream:\n" msgstr "Mogelijke vastleggingen nagaan die met bovenstroom overeenkomen:\n" #: ../git-debrebase:2704 #, perl-format msgid "git tag %s" msgstr "git tag %s" #: ../git-debrebase:2710 #, perl-format msgid " git tag: no suitable tag found (tried %s)\n" msgstr " git tag: geen geschikte tag gevonden (probeerde %s)\n" #: ../git-debrebase:2719 #, perl-format msgid "opendir build-products-dir %s: %s" msgstr "opendir build-products-dir %s: %s" #: ../git-debrebase:2725 #, perl-format msgid " orig: found what looks like a .orig, %s\n" msgstr " orig: iets wat op een .orig lijkt gevonden, %s\n" #: ../git-debrebase:2756 #, perl-format msgid " orig: no suitable origs found (looked for %s in %s)\n" msgstr " orig: geen geschikte origs gevonden (gezocht naar %s in %s)\n" #: ../git-debrebase:2765 msgid "Evaluating possible commits corresponding to upstream:\n" msgstr "Mogelijke vastleggingen evalueren die met bovenstroom overeenkomen:\n" #: ../git-debrebase:2806 #, perl-format msgid " %s: couldn't apply patches: gbp pq %s" msgstr " %s: kon patches niet toepassen: gbp pq %s" #: ../git-debrebase:2815 #, perl-format msgid " %s: applying patches gives different tree\n" msgstr " %s: patches toepassen geeft een afwijkende boom\n" #: ../git-debrebase:2829 msgid "" "Could not find or construct a suitable upstream commit.\n" "Rerun adding --diagnose after convert-from-dgit-view, or pass a\n" "upstream commmit explicitly or provide suitable origs.\n" msgstr "" "Kon geen geschikte bovenstroomse vastlegging vinden of construeren.\n" "Voer convert-from-dgit-view opnieuw uit met toevoeging van --diagnose,\n" "of geef expliciet een bovenstroomse vastlegging op,\n" "of bezorg geschikte origs.\n" #: ../git-debrebase:2835 #, perl-format msgid "Yes, will base new branch on %s\n" msgstr "Ja, zal nieuwe tak baseren op %s\n" #: ../git-debrebase:2840 #, perl-format msgid "" "Result of applying debian/patches/ onto the upstream is not the same as " "HEAD.\n" "(Applying patches gave the commit %s)\n" "Perhaps the upstream is not right, or not all of the delta is in d/patches.\n" msgstr "" "Resultaat van toepassen van debian/patches/ op bovenstroom is niet gelijk " "met HEAD.\n" "(Toepassen van patches gaf vastlegging %s)\n" "Misschien klopt bovenstroom niet, of zit niet de hele delta in d/patches.\n" #: ../git-debrebase:2848 msgid "Output of conversion does not match input!" msgstr "Uitvoer van conversie komt niet net invoer overeen!" #: ../git-debrebase:2856 msgid "forget-was-ever-debrebase takes no further arguments" msgstr "forget-was-ever-debrebase wordt zonder verdere argumenten gebruikt" #: ../git-debrebase:2860 #, perl-format msgid "Not suitable for recording git-debrebaseness anyway: %s" msgstr "" "Hoe dan ook niet geschikt om de git-debrebase-toestand te registreren: %s" #: ../git-debrebase:2962 msgid "bad options\n" msgstr "foute opties\n" #: ../git-debrebase:2972 #, perl-format msgid "" "%s: with git-debrebase, get-rebase -i option may only be followed by more " "options (as separate arguments)" msgstr "" "%s: met git-debrebase, mag de optie -i van get-rebase enkel door meer opties " "gevolgd worden (als aparte argumenten)" #: ../git-debrebase:3002 #, perl-format msgid "unknown git-debrebase sub-operation %s" msgstr "onbekende onderliggende bewerking van git-debrebase: %s" #: ../Debian/Dgit.pm:299 #, perl-format msgid "error: %s\n" msgstr "fout: %s\n" #: ../Debian/Dgit.pm:325 #, perl-format msgid "getcwd failed: %s\n" msgstr "getcwd mislukte: %s\n" #: ../Debian/Dgit.pm:344 msgid "terminated, reporting successful completion" msgstr "beëindigd, met de melding van een succesvolle voltooiing" #: ../Debian/Dgit.pm:346 #, perl-format msgid "failed with error exit status %s" msgstr "mislukt met de foutmelding %s" #: ../Debian/Dgit.pm:349 #, perl-format msgid "died due to fatal signal %s" msgstr "gestorven vanwege fataal signaal %s" #: ../Debian/Dgit.pm:353 #, perl-format msgid "failed with unknown wait status %s" msgstr "mislukt met ongekende wachttoestand %s" #: ../Debian/Dgit.pm:359 msgid "failed command" msgstr "mislukt commando" #: ../Debian/Dgit.pm:365 #, perl-format msgid "failed to fork/exec: %s" msgstr "fork/exec is mislukt: %s" #: ../Debian/Dgit.pm:367 #, perl-format msgid "subprocess %s" msgstr "onderliggend proces %s" #: ../Debian/Dgit.pm:369 msgid "subprocess produced invalid output" msgstr "onderliggend proces produceerde ongeldige uitvoer" #: ../Debian/Dgit.pm:460 msgid "stat source file: %S" msgstr "stat bronbestand: %S" #: ../Debian/Dgit.pm:470 msgid "stat destination file: %S" msgstr "stat doelbestand: %S" #: ../Debian/Dgit.pm:489 msgid "finally install file after cp: %S" msgstr "tot slot, installeer bestand na cp: %S" #: ../Debian/Dgit.pm:495 msgid "delete old file after cp: %S" msgstr "verwijder oud bestand na cp: %S" #: ../Debian/Dgit.pm:516 msgid "" "not in a git working tree?\n" "(git rev-parse --show-toplevel produced no output)\n" msgstr "" "niet in een git werkboom?\n" "(git rev-parse --show-toplevel gaf geen uitvoer)\n" #: ../Debian/Dgit.pm:519 #, perl-format msgid "chdir toplevel %s: %s\n" msgstr "chdir naar hoogste niveau %s: %s\n" #: ../Debian/Dgit.pm:627 msgid "git index contains changes (does not match HEAD)" msgstr "de index van git bevat wijzigingen (komt niet overeen met HEAD)" #: ../Debian/Dgit.pm:628 msgid "working tree is dirty (does not match HEAD)" msgstr "werkboom is bevuild (komt niet overeen met HEAD)" #: ../Debian/Dgit.pm:653 msgid "using specified upstream commitish" msgstr "opgegeven bovenstroomse commitish wordt gebruikt" #: ../Debian/Dgit.pm:660 #, perl-format msgid "" "Could not determine appropriate upstream commitish.\n" " (Tried these tags: %s)\n" " Check version, and specify upstream commitish explicitly." msgstr "" "Kon geen passende bovenstroomse commitish vaststellen.\n" " (Probeerde deze tags: %s)\n" " Controleer versie en geef bovenstroomse commitish expliciet op." #: ../Debian/Dgit.pm:665 ../Debian/Dgit.pm:667 #, perl-format msgid "using upstream from git tag %s" msgstr "bovenstroom van git tag %s wordt gebruikt" #: ../Debian/Dgit.pm:773 msgid "detached HEAD" msgstr "vrijstaande HEAD (detached HEAD)" #: ../Debian/Dgit.pm:774 msgid "HEAD symref is not to refs/" msgstr "symbolische referentie HEAD is geen referentie naar refs/" #: ../Debian/Dgit.pm:790 #, perl-format msgid "parsing of %s failed" msgstr "ontleden van %s mislukte" #: ../Debian/Dgit.pm:799 #, perl-format msgid "" "control file %s is (already) PGP-signed. Note that dgit push needs to " "modify the .dsc and then do the signature itself" msgstr "" "controlebestand %s heeft (reeds) een PGP-ondertekening. Merk op dat dgit " "push het .dsc moet aanpassen en het dan zelf moet ondertekenen" #: ../Debian/Dgit.pm:813 #, perl-format msgid "open %s (%s): %s" msgstr "open %s (%s): %s" #: ../Debian/Dgit.pm:834 #, perl-format msgid "missing field %s in %s" msgstr "ontbrekend veld %s in %s" #: ../Debian/Dgit.pm:920 msgid "Dummy commit - do not use\n" msgstr "Voorbeeldvastlegging - niet gebruiken\n" #: ../Debian/Dgit.pm:941 #, perl-format msgid "exec %s: %s\n" msgstr "exec %s: %s\n" #: ../Debian/Dgit.pm:969 #, perl-format msgid "Taint recorded at time %s for package %s" msgstr "Bezoedeling geregistreerd op tijdstip %s voor pakket %s" #: ../Debian/Dgit.pm:971 #, perl-format msgid "Taint recorded at time %s for any package" msgstr "Bezoedeling geregistreerd op tijdstip %s voor willekeurig pakket" #: ../Debian/Dgit.pm:973 #, perl-format msgid "Taint recorded for package %s" msgstr "Bezoedeling geregistreerd voor pakket %s" #: ../Debian/Dgit.pm:975 msgid "Taint recorded for any package" msgstr "Bezoedeling geregistreerd voor willekeurig pakket" #: ../Debian/Dgit.pm:987 msgid "Uncorrectable error. If confused, consult administrator.\n" msgstr "" "Niet-corrigeerbare fout. Neem bij verwarring contact op met de beheerder.\n" #: ../Debian/Dgit.pm:990 msgid "Could perhaps be forced using --deliberately. Consult documentation.\n" msgstr "" "Kan misschien geforceerd worden door --deliberately te gebruiken. Raadpleeg " "de documentatie.\n" #: ../Debian/Dgit.pm:993 #, perl-format msgid "Forcing due to %s\n" msgstr "Forceren vanwege %s\n" #: ../Debian/Dgit.pm:1058 #, perl-format msgid "cannot stat %s/.git: %s" msgstr "kan status van %s/.git niet verkrijgen: %s" #: ../Debian/Dgit.pm:1081 #, perl-format msgid "failed to mkdir playground parent %s: %s" msgstr "mkdir van speelplaatsouder %s mislukte: %s" #: ../Debian/Dgit.pm:1089 #, perl-format msgid "failed to mkdir a playground %s: %s" msgstr "mkdir van een speelplaats %s mislukte: %s" #: ../Debian/Dgit.pm:1098 #, perl-format msgid "failed to mkdir the playground %s: %s" msgstr "mkdir van de speelplaats %s mislukte: %s" work/po/part.make0000644000000000000000000000045514761250142011157 0ustar PARTS += ~ POTS += .~.pot mo/~.pot: .~.pot .common.pot $S mkdir -p mo $S msgcat $^ $o mo/~_%.po: %.po mo/~.pot $S cp $*.po $@.tmp $S msgmerge --quiet --previous $@.tmp mo/~.pot -o $@.tmp $S $f .PRECIOUS: mo/~.pot mo/~_%.po # (end of part.make) # dependencies of .~.pot will follow (from sed) work/po/remove-potcdate0000755000000000000000000000023414761250142012371 0ustar #! /usr/bin/perl -n BEGIN { $seen_potcdate = 0; } if (not $seen_potcdate and /^"POT-Creation-Date: .*"/) { $seen_potcdate = 1; next; } print; work/po4a/0000755000000000000000000000000014761250142007573 5ustar work/po4a/.gitignore0000644000000000000000000000006514761250142011564 0ustar translated preview.* .po4a.*.cfg .*.translated *.tmp work/po4a/Makefile0000644000000000000000000001015714761250142011237 0ustar # dgit document translation machinery # # Translators: there is no need to look at this file. It contains # complicated machinery which you do not need to understand :-). # See po/README instead. # Copyright (C)2018 Ian Jackson # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ----- devel docs (translators, pleaee ignore all this) ----- # # We use po4a for everything. # # po4a is nicely automatic for all the po handling, and the config # file makes nice documentation, but it really really likes to dirty # the tree. And we want to automatically list the documents and the # translation languages which it doesn't make easy. # # The approach I have chosen is as follows: # # po4a.cfg # # This is autogenerated. But also, we invite translators to add # their own language to it. The resulting merge # conflict/discrepancy will be just an alphabetical ordering # discrepancy, since our generation script scans the available po # files. # # Generation is done by a shell script, ./list-documents. # # make targets: po4a.cfg # many others imply this # po4a.cfg.check # fails if out of date # # *.pot, *.po # # As far as translators are concerned, generated and maintained by # po4a and committed to git. As for the developers, we update this # occasionally just by running po4a. # # make targets: default } mean # pofiles } the same # # Translations for translators: # # make targets: preview.LANG # translated # # Translated document source-language files (eg, translated pod): # # Like with normal po things, the tools don't like to generate # output without updating (dirtying) the .po files. But with po4a # this is really hard to avoid. So we use a linkfarming technique. # # make targets: translated-only # # Translated output files (roff format, from pod2man): # # We have sort of lost the usual make rule information by now # about targets and what to build. Only po4a knows which # translated files are supposed to exist. So we have a shell # script which reuses the top-level Makefile to run pod2man # where appropriate, and generate a further even-more-output-ish # tree. # # make targets: install # # Check: # # make targets: check # pairwise-pocheck.check default: pofiles include ../i18n-common.make PO4A ?= po4a all update: translated check: po4a.cfg.check pairwise-pocheck.check pofiles: po4a.cfg $(PO4A) --no-translations $< translated: po4a.cfg $(PO4A) $< po4a.cfg: list-documents ./$< $o po4a.cfg.check: list-documents ./$< >$@.tmp diff po4a.cfg $@.tmp pairwise-pocheck.check: ./pairwise-pocheck t = ../.po4a.translated-only p = ../po4a translated-only: po4a.cfg pairwise-pocheck.check rm -rf $t && mkdir $t cd $t && ln -s $p/*.po $p/*.pot $p/po4a.cfg . cd $t && $(PO4A) po4a.cfg ! test -d $t/translated || \ cp -al --remove-destination $t/translated . .po4a.%.cfg: po4a.cfg Makefile $S perl -p -e 's{^(\[po4a_langs\]).*}{$$1 $*};' \ -e 's{:translated/man}{:.$*.translated/man}' \ $< $o .PRECIOUS: .po4a.%.cfg pairwise-pocheck.%.check: @tclsh /dev/null || printf ':;:; Please run apt-get install tcl\n' ./pairwise-pocheck $* preview.%: .po4a.%.cfg pairwise-pocheck.%.check $S $(PO4A) $< $S ./install-documents >/dev/null .$*.translated $@ @ echo '# runes to preview the various final tranlated manpages:' $S find $@ -type f -printf 'man -l %p\n' # We can't really use timestamps to drive po4a .PHONY: preview.% translated install: translated-only ./install-documents translated $(DESTDIR) work/po4a/README0000777000000000000000000000000014761250142012161 2../po/READMEustar work/po4a/dgit-downstream-dsc_7.pot0000644000000000000000000004571514761250142014440 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2019-03-01 16:59+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1253 ../dgit-downstream-dsc.7.pod:150 #, no-wrap msgid "CONFIGURATION" msgstr "" #. type: =item #: ../dgit.1:1267 ../dgit-downstream-dsc.7.pod:286 #, no-wrap msgid "BIB<.distro> I" msgstr "" #. type: =item #: ../dgit.1:1320 ../dgit-downstream-dsc.7.pod:242 #, no-wrap msgid "BIB<.upload-host>" msgstr "" #. type: =head1 #: ../dgit.1:1470 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:126 #: ../dgit-maint-merge.7.pod:491 ../dgit-maint-gbp.7.pod:136 #: ../dgit-maint-debrebase.7.pod:747 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:321 ../git-debrebase.1.pod:619 #: ../git-debrebase.5.pod:678 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:5 ../dgit-maint-native.7.pod:5 #: ../dgit-maint-merge.7.pod:5 ../dgit-maint-gbp.7.pod:5 #: ../dgit-maint-debrebase.7.pod:5 ../dgit-downstream-dsc.7.pod:5 #: ../git-debrebase.1.pod:10 ../git-debrebase.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:3 msgid "dgit-downstream-dsc - setting up dgit push for a new distro" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:7 msgid "" "This document is aimed at downstreams of Debian. It explains how you can " "publish your packages' source code both as traditional Debian source " "packages, and as git branches, using B. Your users will be able " "to get the source with B, or with traditional tools such as " "B." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:16 msgid "" "Note that often it is unnecessary to publish traditional source packages. " "Debian-format source packages can be complex, idiosyncratic and difficult to " "work with. You should avoid them if you can. If you do not need to publish " "source packages, you can work as a Debian downstream purely using git " "branches, (using dgit to get the source from Debian in git form). You can " "build binaries directly from git, and push package source code as a git " "branch to an ordinary git server. See L." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:28 msgid "" "Not every option is covered here. L has a mostly-complete list of " "config options, although not always with useful descriptions." msgstr "" #. type: =head1 #: ../dgit-downstream-dsc.7.pod:32 msgid "NAMES" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:34 msgid "You need to choose some names." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:38 msgid "I name" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:40 msgid "" "dgit understands each thing it interacts with as a B. So in dgit " "terms, you are setting up a distro." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:43 msgid "" "You need a name for yourself (ie for your distro). The name will appear in " "the git tags made by your tools, and in configuration settings. It must be " "globally unique across all people and institutions who use dgit." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:49 msgid "" "You could choose your organisation's domain name, or a part of it if you " "think that is going to be very unique." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:52 msgid "" "The distro name may contain ascii alphanumerics and B<. + ->, although B<-> " "may be confusing and is probably best avoided. Try to avoid uppercase " "letters (and underscore): you will be typing this name a lot." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:57 msgid "" "For example, if you were the Free Software Foundation Europe (fsfe.org) you " "might call your distro fsfe or fsfe.org. In the rest of this document we " "will write I for your distro name." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:63 msgid "I names" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:65 msgid "" "In dgit and Debian archive terminology, a B is a line of development, " "and/or a Debian release. For example, at the time of writing, Debian has " "suites like B aka B, B aka B, and B " "aka B. There are also ancillary suites like B." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:72 msgid "" "If your releases align with Debian's releases, then your suites should " "contain the Debian suite names. B use just the Debian names. That " "will cause confusion. Instead, prepend your organisation's name and a " "hyphen. For example, FSFE might end up with suites like fsfe-stretch." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:79 msgid "" "Suite names end up in git ref and branch names, and on dgit command lines. " "Suite names can contain alphanumerics and C<->. Other characters may work " "but are not recommended." msgstr "" #. type: =head1 #: ../dgit-downstream-dsc.7.pod:86 msgid "SERVICES" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:88 msgid "You will need to run two parallel services:" msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:92 msgid "git server" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:94 msgid "This will hold the git branches accessed by dgit." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:96 msgid "" "Everyone who will use dgit push needs to be able to update BI (note, not BI) on that server, and to " "make tags IBI and BIBI. " "Normally this would be done over ssh." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:103 msgid "" "The server may host other branches and tags too. So this might be your " "ordinary git server, or an instance of a git hosting system." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:107 msgid "" "Everyone who obtains one of your source packages, or who will run B and B, needs to have at least read access to the git " "server. Ideally everything would be published via the git smart https " "protocol." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:113 msgid "" "The git server name, and public git url structure, should be chosen so they " "will not need to change in the future. Best is to give the git server a DNS " "name of its own." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:117 msgid "" "Debian's dgit git server has special access control rules, implemented in " "B and B in the package B. but in most installations this is not needed. If there is " "no or little distinction between (i) developers who are entitled to upload " "(push) and (ii) repository administrators, then it is sufficient to provide " "a git server with a unix account for each user who will be pushing, perhaps " "using ssh restricted commands." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:128 msgid "Debian-format archive (repository)" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:130 msgid "" "This holds the source packages. You will probably use the same archive to " "host your binaries, and point your B at it." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:134 msgid "dgit uses the term B for this." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:136 msgid "" "There are a variety of tools for creating and managing a Debian-format " "archive. In this document we will assume you are using B." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:140 msgid "" "Setting up reprepro is not covered in this tutorial. Instead, we assume you " "already have reprepro working." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:143 msgid "" "You should also write appropriate dput configuration, since dgit uses dput " "to upload packages to the archive. This will involve choosing a dput host " "name. That's probably your distro name, I." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:152 msgid "" "When you have all of the above set up, you are ready to explain to dgit how " "to access your systems." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:155 msgid "" "dgit is configured via git's configuration system, so this is done with git " "configuration. See L." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:159 msgid "" "Below, each heading is one or more git config keys. B is literal text " "and I is things that vary. In the descriptions of the effects of " "config settings, we refer to the config values C." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:167 msgid "BIB<.git-url>, B<.git-url-suffix>" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:169 msgid "" "Specify the publicly accessible git URLs for your dgit git server. The urls " "generated are CBIC" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:173 msgid "" "The url should be stable, and publicly accessible, because its name is " "published in .dsc files. (Note that if you make modified versions of " "packages from Debian, the copyleft licences used for Free Software often " "require you to permit your users, employees, and downstreams to further " "distribute your modified source code.)" msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:181 msgid "BIB" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:183 msgid "The domain name of your git server's ssh interface." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:185 msgid "" "BIB BIB" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:187 msgid "" "Some git hosting systems expect everyone to connect over ssh as the same " "user, often B. If this is the case, set C to that user." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:191 msgid "" "If you have a normal git over ssh arrangement, where people ssh as " "themselves, leave C unset. If a user wishes to override the " "username (for example, if their local username is not the same as on the " "server) they can set C." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:198 msgid "BIB" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:200 msgid "" "Set this to the empty string. This will arrange that push accesses to the " "ssh server will use C, etc." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:204 msgid "BIB B" msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:206 msgid "CIB" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:208 msgid "" "The path to your repositories. dgit push will try to push to C[C|CB<@>]CBIB<.git>" msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:212 msgid "BIB<.git-check>, B<.git-check-suffix>" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:214 msgid "" "dgit clone needs to be able to tell whether there is yet a git repository " "for a particular package." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:217 msgid "" "If you always have a git repository for every package in your archive, " "perhaps because you never use dput/dupload, and always dgit push, set C to B." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:221 msgid "" "Otherwise, set C to a url prefix - ideally, https. dgit clone " "will try to fetch CBIC and expect " "to get either some successful fetch (it doesn't matter what) or a file not " "found error (http 404 status code). Other outcomes are fatal errors." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:228 msgid "" "If your git server runs cgit, then you can set C to the same as " "C, and C to B." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:232 msgid "BIB, B" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:234 msgid "dgit push also needs to be able to check whether the repo exists." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:236 msgid "" "You can set both of these to B, which will use an ssh shell command " "to test repository existence. Or leave them unset, and dgit push will use " "the readonly details. If repositories are created automatically on push, " "somehow, you can set C to B." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:244 msgid "What I value to pass to dput, to upload." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:246 msgid "" "This is a nickname, not the real host name. You need to provide everyone " "who will push with an appropriate dput configuration. See L." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:251 msgid "A good nickname for your upload host is your distro name I." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:253 msgid "BIB<.mirror>" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:255 msgid "" "Set this to the url of your source package archive. This is the same string " "as appears in the 2nd field of each B entry." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:259 msgid "BIB<.archive-query>, B<.archive-query-url>" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:261 msgid "" "If you have a smallish distro, set C to B (with a " "colon)." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:264 msgid "" "If your distro is large (eg, if it contains a substantial fraction of " "Debian) then this will not be very efficient: with this setting, dgit often " "needs to download and update Sources files." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:270 msgid "" "For large distros, it is better to implement the Debian archive ftpmaster " "API. See L, and set C to " "B (with a colon) and C to your API base " "URL. dgit uses these queries: B, BIBI and BI (so you need not implement " "anything else)." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:281 msgid "" "Alternatively, if your system supports the rmadison protocol, you can set " "C to B[I]. dgit will invoke " "B -uI." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:288 msgid "" "Set this for every one of your suites. You will have to update this when " "new suites are created. If you forget, your users can explicitly specify B<-" "d> I to dgit." msgstr "" #. type: =head1 #: ../dgit-downstream-dsc.7.pod:295 msgid "TEMPLATE GIT REPOSITORY" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:297 msgid "" "When dgit push is used for I for the first time, it must create a " "git repository on the git server." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:300 msgid "" "If C is set to B, dgit will use the user's shell access " "to the server to B IB<.git>. So you should " "create B<_template.git> with suitable contents." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:305 msgid "" "Note that the ssh rune invoked by dgit does not do any locking. So if two " "people dgit push the same package at the same time, there will be lossage. " "Either don't do that, or set up B." msgstr "" #. type: =head1 #: ../dgit-downstream-dsc.7.pod:310 msgid "SSH COMMANDS" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:312 msgid "" "When a user who can push runs dgit, dgit uses ssh to access the git server." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:315 msgid "" "To make use of ssh restricted command easier, and for the benefit of dgit-" "repos-server, dgit's ssh commands each start with a parseable commentish " "rune." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:320 msgid "The ssh commands used by dgit are these:" msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:324 msgid "B<: dgit> I B I B<;>..." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:326 msgid "" "Test whether I has a git repo on the server already. Should print " "B<0> or B<1> and a newline, and exit status zero in either case. The rest " "of the command, after B<;>, is a shell implementation of this test. Used " "when C is set to B." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:333 msgid "B<: dgit> I B I B<;>..." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:335 msgid "" "Create the git repository for I on the server. See L, above. The rest of the command is an appropriate invocation of " "cd and cp. Used when C is set to B." msgstr "" #. type: =item #: ../dgit-downstream-dsc.7.pod:340 msgid "B..., B..." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:342 msgid "" "dgit invokes git to access the repository; git then runs these commands. " "Note that dgit push will first do a git fetch over ssh, so you must provide " "upload-pack as well as receive-pack." msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:349 msgid "(There are also other ssh commands which are historical or obscure.)" msgstr "" #. type: textblock #: ../dgit-downstream-dsc.7.pod:354 msgid "dgit(1)" msgstr "" work/po4a/dgit-maint-debrebase_7.pot0000644000000000000000000011723114761250142014521 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 00:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:637 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:5 ../dgit-maint-native.7.pod:5 #: ../dgit-maint-merge.7.pod:5 ../dgit-maint-gbp.7.pod:5 #: ../dgit-maint-debrebase.7.pod:5 ../dgit-downstream-dsc.7.pod:5 #: ../dgit-maint-bpo.7.pod:5 ../git-debrebase.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:37 ../dgit-maint-gbp.7.pod:16 #: ../dgit-maint-debrebase.7.pod:38 msgid "" "Benefit from dgit's safety catches. In particular, ensure that your upload " "always matches exactly your git HEAD." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:47 ../dgit-maint-debrebase.7.pod:61 msgid "INITIAL DEBIANISATION" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:49 ../dgit-maint-debrebase.7.pod:63 msgid "" "This section explains how to start using this workflow with a new package. " "It should be skipped when converting an existing package to this workflow." msgstr "" #. type: =head3 #: ../dgit-maint-merge.7.pod:53 ../dgit-maint-merge.7.pod:385 #: ../dgit-maint-merge.7.pod:464 ../dgit-maint-debrebase.7.pod:67 #: ../dgit-maint-debrebase.7.pod:362 msgid "When upstream tags releases in git" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:55 ../dgit-maint-debrebase.7.pod:69 msgid "" "Suppose that the latest stable upstream release is 1.2.2, and this has been " "tagged '1.2.2' by upstream." msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:60 ../dgit-maint-debrebase.7.pod:74 #, no-wrap msgid "" " % git clone -oupstream https://some.upstream/foo.git\n" " % cd foo\n" " % git verify-tag 1.2.2\n" " % git reset --hard 1.2.2\n" " % git branch --unset-upstream\n" "\n" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:76 ../dgit-maint-debrebase.7.pod:90 #, no-wrap msgid "" " % git remote add -f origin salsa.debian.org:Debian/foo.git\n" " % git push --follow-tags -u origin master\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:93 ../dgit-maint-debrebase.7.pod:102 msgid "Finally, you need an orig tarball:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:97 ../dgit-maint-merge.7.pod:458 #: ../dgit-maint-debrebase.7.pod:106 ../dgit-maint-debrebase.7.pod:429 #, no-wrap msgid "" " % git deborig\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:101 ../dgit-maint-debrebase.7.pod:110 msgid "See git-deborig(1) if this fails." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:103 ../dgit-maint-debrebase.7.pod:112 msgid "" "This tarball is ephemeral and easily regenerated, so we don't commit it " "anywhere (e.g. with tools like pristine-tar(1))." msgstr "" #. type: =head3 #: ../dgit-maint-merge.7.pod:123 ../dgit-maint-debrebase.7.pod:137 msgid "Using untagged upstream commits" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:127 ../dgit-maint-debrebase.7.pod:141 msgid "" "Sometimes upstream does not tag their releases, or you want to package an " "unreleased git snapshot. In such a case you can create your own upstream " "release tag, of the form BI, where I is the upstream " "version you plan to put in I. The B prefix " "ensures that your tag will not clash with any tags upstream later creates." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:134 ../dgit-maint-debrebase.7.pod:148 msgid "" "For example, suppose that the latest upstream release is 1.2.2 and you want " "to package git commit ab34c21 which was made on 2013-12-11. A common " "convention is to use the upstream version number 1.2.2+git20131211.ab34c21 " "and so you could use" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:141 ../dgit-maint-debrebase.7.pod:155 #, no-wrap msgid "" " % git tag -s upstream/1.2.2+git20131211.ab34c21 ab34c21\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:145 ../dgit-maint-debrebase.7.pod:159 msgid "to obtain a release tag, and then proceed as above." msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:151 ../dgit-maint-debrebase.7.pod:165 #, no-wrap msgid "" " % git tag -s upstream/$(git show --date=format:%Y%m%d --pretty=format:\"1.2.2+git%cd.%h\" --quiet upstream/main) upstream/main\n" "\n" msgstr "" #. type: =head3 #: ../dgit-maint-merge.7.pod:157 ../dgit-maint-merge.7.pod:397 #: ../dgit-maint-merge.7.pod:489 ../dgit-maint-debrebase.7.pod:171 #: ../dgit-maint-debrebase.7.pod:374 msgid "When upstream releases only tarballs" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:174 ../dgit-maint-debrebase.7.pod:216 #, no-wrap msgid "" " [DEFAULT]\n" " upstream-branch = upstream\n" " debian-branch = master\n" " upstream-tag = upstream/%(version)s\n" "\n" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:179 ../dgit-maint-debrebase.7.pod:221 #, no-wrap msgid "" " sign-tags = True\n" " pristine-tar = False\n" " pristine-tar-commit = False\n" "\n" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:215 ../dgit-maint-debrebase.7.pod:199 #, no-wrap msgid "" " % git remote add -f origin salsa.debian.org:Debian/foo.git\n" " % git push --follow-tags -u origin master upstream\n" "\n" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:223 ../dgit-maint-debrebase.7.pod:243 msgid "CONVERTING AN EXISTING PACKAGE" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:225 ../dgit-maint-debrebase.7.pod:245 msgid "" "This section explains how to convert an existing Debian package to this " "workflow. It should be skipped when debianising a new package." msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:264 ../dgit-maint-debrebase.7.pod:276 #, no-wrap msgid "" " % git remote add -f upstream https://some.upstream/foo.git\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:277 ../dgit-maint-debrebase.7.pod:330 msgid "" "To achieve this, you might need to delete I. " "One way to have dgit check your progress is to run B." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:358 ../dgit-maint-debrebase.7.pod:482 msgid "BUILDING AND UPLOADING" msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:383 ../dgit-maint-debrebase.7.pod:360 msgid "Obtaining the release" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:389 ../dgit-maint-debrebase.7.pod:366 #, no-wrap msgid "" " % git fetch --tags upstream\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:393 ../dgit-maint-debrebase.7.pod:370 msgid "" "If you want to package an untagged upstream commit (because upstream does " "not tag releases or because you want to package an upstream development " "snapshot), see \"Using untagged upstream commits\" above." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:399 ../dgit-maint-debrebase.7.pod:376 msgid "" "You will need the I from \"When upstream releases only " "tarballs\", above. You will also need your upstream branch. Above, we " "pushed this to B. You will need to clone or fetch from " "there, instead of relying on B/B alone." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:404 ../dgit-maint-debrebase.7.pod:381 msgid "Then, either" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:408 ../dgit-maint-debrebase.7.pod:385 #, no-wrap msgid "" " % gbp import-orig ../foo_1.2.3.orig.tar.xz\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:412 ../dgit-maint-debrebase.7.pod:389 msgid "or if you have a working watch file" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:416 ../dgit-maint-debrebase.7.pod:393 #, no-wrap msgid "" " % gbp import-orig --uscan\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:452 ../dgit-maint-debrebase.7.pod:423 msgid "" "If you obtained a tarball from upstream, you are ready to try a build. If " "you merged a git tag from upstream, you will first need to generate a " "tarball:" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:462 ../dgit-maint-debrebase.7.pod:517 msgid "HANDLING DFSG-NON-FREE MATERIAL" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:491 ../dgit-maint-debrebase.7.pod:591 msgid "" "The easiest way to handle this is to add a B field to " "I, and a B setting in I. " "See uscan(1). Alternatively, see the I<--filter> option detailed in gbp-" "import-orig(1)." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:536 ../dgit-maint-gbp.7.pod:133 #: ../dgit-maint-debrebase.7.pod:596 msgid "INCORPORATING NMUS" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:551 ../dgit-maint-gbp.7.pod:143 #: ../dgit-maint-debrebase.7.pod:796 ../dgit-maint-bpo.7.pod:144 #: ../git-debpush.1.pod:266 msgid "AUTHOR" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:553 ../dgit-maint-debrebase.7.pod:798 msgid "" "This tutorial was written and is maintained by Sean Whitton " ". It contains contributions from other dgit " "contributors too - see the dgit copyright file." msgstr "" #. type: =head1 #: ../dgit-maint-gbp.7.pod:32 ../dgit-maint-debrebase.7.pod:334 msgid "GIT CONFIGURATION" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:3 msgid "" "dgit - tutorial for package maintainers, using a workflow centered around " "git-debrebase(1)" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:7 msgid "" "This document describes elements of a workflow for maintaining a non-native " "Debian package using B. We maintain the Debian delta as a series of " "git commits on our master branch. We use git-debrebase(1) to shuffle our " "branch such that this series of git commits appears at the end of the " "branch. All the public git history is fast-forwarding, i.e., we do not " "rewrite and force-push." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:14 msgid "Some advantages of this workflow:" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:20 msgid "" "Manipulate the delta queue using the full power of git-rebase(1), instead of " "relying on quilt(1), and without having to switch back and forth between " "patches-applied and patches-unapplied branches when committing changes and " "trying to build, as with gbp-pq(1)." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:27 msgid "" "If you are using 3.0 (quilt), provide your delta queue as a properly " "separated series of quilt patches in the source package that you upload to " "the archive (unlike with dgit-maint-merge(7))." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:33 msgid "" "Avoid the git tree being dirtied by the application or unapplication of " "patches, as they are always applied." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:43 msgid "" "Provide your full git history in a standard format on B, where " "it can benefit downstream dgit users, such as people using dgit to do an NMU " "(see dgit-nmu-simple(7) and dgit-user(7))." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:49 msgid "" "Minimise the amount you need to know about 3.0 (quilt) in order to maintain " "Debian source packages which use that format." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:54 msgid "" "This workflow is appropriate for packages where the Debian delta contains " "multiple pieces which interact, or which you don't expect to be able to " "upstream soon. For packages with simple and/or short-lived Debian deltas, " "use of git-debrebase(1) introduces unneeded complexity. For such packages, " "consider the workflow described in dgit-maint-merge(7)." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:82 msgid "" "The final command detaches your master branch from the upstream remote, so " "that git doesn't try to push anything there, or merge unreleased upstream " "commits. To maintain a copy of your packaging branch on B " "in addition to B, you can do something like this:" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:95 msgid "" "Now go ahead and Debianise your package. Make commits on the master branch, " "adding things in the I directory, or patching the upstream source. " "For technical reasons, B " "In other words, make a commit introducing I before patching the " "upstream source." msgstr "" #. type: =head3 #: ../dgit-maint-debrebase.7.pod:115 msgid "Comparing upstream's tarball releases" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:119 msgid "" "The above assumes that you know how to build the package from git and that " "doing so is straightforward." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:122 msgid "" "If, as a user of the upstream source, you usually build from upstream " "tarball releases, rather than upstream git tags, you will sometimes find " "that the git tree doesn't contain everything that is in the tarball." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:127 msgid "" "Additional build steps may be needed. For example, you may need your " "I to run autotools." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:130 msgid "" "You can compare the upstream tarball release, and upstream git tag, within " "git, by importing the tarball into git as described in the next section, " "using a different value for 'upstream-tag', and then using git-diff(1) to " "compare the imported tarball to the release tag." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:161 msgid "" "One can generate such a versioned tag using git show's --pretty option. e.g.:" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:173 msgid "" "Because we want to work in git, we need a virtual upstream branch with " "virtual release tags. gbp-import-orig(1) can manage this for us. To begin" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:179 #, no-wrap msgid "" " % mkdir foo\n" " % cd foo\n" " % git init\n" " % git checkout -b upstream\n" " % gbp import-orig \\\n" " --upstream-branch=upstream --debian-branch=master \\\n" " --upstream-tag='upstream/%(version)s' \\\n" " --sign-tags --no-pristine-tar \\\n" " ../foo_1.2.2.orig.tar.xz\n" " % git branch -f upstream\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:192 msgid "" "This should leave you on the master branch. Next, our upstream branch " "cannot be pushed to B, but since we will need it whenever we " "import a new upstream version, we must push it somewhere. The usual choice " "is B:" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:204 msgid "" "You are now ready to proceed as above, making commits to the I " "directory and to the upstream source. As above, for technical reasons, B In other words, make a " "commit introducing I before patching the upstream source." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:211 msgid "" "A convenient way to ensure this requirement is satisfied is to start by " "creating I:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:225 #, no-wrap msgid "" " [import-orig]\n" " merge = False\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:230 msgid "and commit that:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:234 #, no-wrap msgid "" " % git add debian/gbp.conf && git commit -m \"create gbp.conf\"\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:238 msgid "" "Note that we couldn't create I before now for the same " "technical reasons which require our first commit to introduce I " "without patching the upstream source. That's why we had to pass a lot of " "options to our first call to gbp-import-orig(1)." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:248 msgid "" "If you have an existing git history that you have pushed to an ordinary git " "server like B, we start with that. If you don't already " "have it locally, you'll need to clone it, and obtain the corresponding orig." "tar from the archive:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:255 #, no-wrap msgid "" " % git clone salsa.debian.org:Debian/foo\n" " % cd foo\n" " % dgit setup-new-tree\n" " % origtargz\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:262 msgid "" "If you don't have any existing git history, or you have history only on the " "special B server, we start with B:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:267 #, no-wrap msgid "" " % dgit clone foo\n" " % cd foo\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:272 msgid "Then we make new upstream tags available:" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:280 msgid "" "We now use a B command to convert your " "existing history to the git-debrebase(5) data model. Which command you " "should use depends on some facts about your repository:" msgstr "" #. type: =item #: ../dgit-maint-debrebase.7.pod:286 msgid "(A) There is no delta queue." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:288 msgid "If there do not exist any Debian patches, use" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:292 ../dgit-maint-debrebase.7.pod:304 #, no-wrap msgid "" " % git debrebase convert-from-gbp\n" "\n" msgstr "" #. type: =item #: ../dgit-maint-debrebase.7.pod:296 msgid "(B) There is a delta queue, and patches are unapplied." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:298 msgid "" "This is the standard git-buildpackage(1) workflow: there are Debian patches, " "but the upstream source is committed to git without those patches applied. " "Use" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:308 msgid "" "If you were not previously using dgit to upload your package (i.e. you were " "not using the workflow described in dgit-maint-gbp(7)), and you happen to " "have run B in this clone of the repository, you will need to " "pass I<--fdiverged> to this command." msgstr "" #. type: =item #: ../dgit-maint-debrebase.7.pod:313 msgid "(C) There is a delta queue, and patches are applied." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:315 msgid "Use" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:319 #, no-wrap msgid "" " % git debrebase convert-from-dgit-view\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:325 msgid "" "Finally, you need to ensure that your git HEAD is dgit-compatible, i.e., it " "is exactly what you would get if you deleted .git, invoked B, and then unpacked the resultant source package." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:336 msgid "" "git-debrebase(1) does not yet support using B to merge divergent " "branches of development (see \"OTHER MERGES\" in git-debrebase(5)). You " "should configure git such that B does not try to merge:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:343 #, no-wrap msgid "" " % git config --local pull.rebase true\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:347 msgid "" "Now when you pull work from other Debian contributors, git will rebase your " "work on top of theirs." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:350 msgid "" "If you use this clone for upstream development in addition to Debian " "packaging work, you may not want to set this global setting. Instead, see " "the B and BnameE.rebase> settings " "in git-config(5)." msgstr "" #. type: =head1 #: ../dgit-maint-debrebase.7.pod:355 msgid "IMPORTING NEW UPSTREAM RELEASES" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:357 msgid "" "There are two steps: obtaining git refs that correspond to the new release, " "and importing that release using git-debrebase(1)." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:397 msgid "Importing the release" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:401 #, no-wrap msgid "" " % git debrebase new-upstream 1.2.3\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:405 msgid "" "This invocation of git-debrebase(1) involves a git rebase. You may need to " "resolve conflicts if the Debian delta queue does not apply cleanly to the " "new upstream source." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:409 msgid "" "If all went well, you can now review the merge of the new upstream release:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:414 #, no-wrap msgid "" " git diff debian/1.2.2-1..HEAD -- . ':!debian'\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:418 msgid "" "Also, diff with I<--name-status> and I<--diff-filter=ADR> to see just the " "list of added or removed files, which is useful to determine whether there " "are any new or deleted files that may need accounting for in your copyright " "file." msgstr "" #. type: =head1 #: ../dgit-maint-debrebase.7.pod:433 msgid "EDITING THE DEBIAN PACKAGING" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:435 msgid "Just make commits on master that change the contents of I." msgstr "" #. type: =head1 #: ../dgit-maint-debrebase.7.pod:437 msgid "EDITING THE DELTA QUEUE" msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:439 msgid "Adding new patches" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:441 msgid "" "Adding new patches is straightforward: just make commits touching only files " "outside of the I directory. You can also use tools like git-" "revert(1), git-am(1) and git-cherry-pick(1)." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:445 msgid "Editing patches: starting a debrebase" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:447 msgid "" "git-debrebase(1) is a wrapper around git-rebase(1) which allows us to edit, " "re-order and delete patches. Run" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:452 ../dgit-maint-debrebase.7.pod:759 #, no-wrap msgid "" " % git debrebase -i\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:456 msgid "" "to start an interactive rebase. You can edit, re-order and delete commits " "just as you would during B." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:459 msgid "Editing patches: finishing a debrebase" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:461 msgid "" "After completing the git rebase, your branch will not be a fast-forward of " "the git HEAD you had before the rebase. This means that we cannot push the " "branch anywhere. If you are ready to upload, B (or B) will take care of fixing this up for you." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:467 msgid "" "If you are not yet ready to upload, and want to push your branch to a git " "remote such as B," msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:472 #, no-wrap msgid "" " % git debrebase conclude\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:476 msgid "" "Note that each time you conclude a debrebase you introduce a pseudomerge " "into your git history, which may make it harder to read. Try to do all of " "the editing of the delta queue that you think will be needed for this " "editing session in a single debrebase, so that there is a single debrebase " "stitch." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:484 msgid "" "You can use dpkg-buildpackage(1) for test builds. When you are ready to " "build for an upload, use B, B or B." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:488 msgid "" "Upload with B or B. Remember to pass I<--" "new> if the package is new in the target suite." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:491 msgid "" "In some cases where you used B since the " "last upload, it is not possible for dgit to make your history fast-" "forwarding from the history on B. In such cases you will have " "to pass I<--overwrite> to dgit. git-debrebase will normally tell you if " "this will be needed." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:497 msgid "" "If you want to upload with git-debpush(1), for the first upload you should " "pass the B<--quilt=linear> quilt mode option (see git-debpush(1))." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:501 msgid "" "Right before uploading, if you did not just already do so, you might want to " "have git-debrebase(1) shuffle your branch such that the Debian delta queue " "appears right at the tip of the branch you will push:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:507 #, no-wrap msgid "" " % git debrebase\n" " % dgit push-source\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:512 msgid "Note that this will introduce a new pseudomerge." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:514 msgid "" "After dgit pushing, be sure to git push to B, if you're " "using that." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:519 msgid "Illegal material" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:521 msgid "" "Here we explain how to handle material that is merely DFSG-non-free. " "Material which is legally dangerous (for example, files which are actually " "illegal) cannot be handled this way." msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:525 #, no-wrap msgid "" "If you encounter possibly-legally-dangerous material in the upstream\n" "source code you should seek advice. It is often best not to make a\n" "fuss on a public mailing list (at least, not at first). Instead,\n" "email your archive administrators. For Debian that is\n" " To: dgit-owner@debian.org, ftpmaster@ftp-master.debian.org\n" "\n" msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:531 msgid "DFSG-non-free: When upstream tags releases in git" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:533 msgid "" "Our approach is to maintain a DFSG-clean upstream branch, and create tags on " "this branch for each release that we want to import. We then import those " "tags per \"Importing the release\", above. In the case of a new package, we " "base our initial Debianisation on our first DFSG-clean tag." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:539 msgid "For the first upstream release that requires DFSG filtering:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:543 #, no-wrap msgid "" " % git checkout -b upstream-dfsg 1.2.3\n" " % git rm evil.bin\n" " % git commit -m \"upstream version 1.2.3 DFSG-cleaned\"\n" " % git tag -s 1.2.3+dfsg\n" " % git checkout master\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:551 msgid "" "Now either proceed with \"Importing the release\" on the 1.2.3+dfsg tag, or " "in the case of a new package," msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:556 #, no-wrap msgid "" " % git branch --unset-upstream\n" " % git reset --hard 1.2.3+dfsg\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:561 msgid "and proceed with \"INITIAL DEBIANISATION\"." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:563 msgid "" "For subsequent releases (whether or not they require additional filtering):" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:568 #, no-wrap msgid "" " % git checkout upstream-dfsg\n" " % git merge 1.2.4\n" " % git rm further-evil.bin # if needed\n" " % git commit -m \"upstream version 1.2.4 DFSG-cleaned\" # if needed\n" " % git tag -s 1.2.4+dfsg\n" " % git checkout master\n" " % # proceed with \"Importing the release\" on 1.2.4+dfsg tag\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:578 msgid "" "Our upstream-dfsg branch cannot be pushed to B, but since we " "will need it whenever we import a new upstream version, we must push it " "somewhere. Assuming that you have already set up an origin remote per the " "above," msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:585 #, no-wrap msgid "" " % git push --follow-tags -u origin master upstream-dfsg\n" "\n" msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:589 msgid "DFSG-non-free: When upstream releases only tarballs" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:598 msgid "In the simplest case," msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:602 #, no-wrap msgid "" " % dgit fetch\n" " % git merge --ff-only dgit/dgit/sid\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:607 msgid "" "If that fails, because your branch and the NMUers' work represent divergent " "branches of development, you have a number of options. Here we describe the " "two simplest." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:611 msgid "" "Note that you should not try to resolve the divergent branches by editing " "files in I. Changes there would either cause trouble, or be " "overwritten by git-debrebase(1)." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:615 msgid "Rebasing your work onto the NMU" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:619 #, no-wrap msgid "" " % git rebase dgit/dgit/sid\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:623 msgid "" "If the NMUer added new commits modifying the upstream source, you will " "probably want to debrebase before your next upload to tidy those up." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:626 msgid "" "For example, the NMUer might have used git-revert(1) to unapply one of your " "patches. A debrebase can be used to strip both the patch and the reversion " "from the delta queue." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:630 msgid "Manually applying the debdiff" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:632 msgid "" "If you cannot rebase because you have already pushed to B, " "say, you can manually apply the NMU debdiff, commit and debrebase. The next " "B will require I<--overwrite>." msgstr "" #. type: =head1 #: ../dgit-maint-debrebase.7.pod:637 msgid "HINTS AND TIPS" msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:639 msgid "Minimising pseudomerges" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:641 msgid "" "Above we noted that each time you conclude a debrebase, you introduce a " "pseudomerge into your git history, which may make it harder to read." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:644 msgid "" "A simple convention you can use to minimise the number of pseudomerges is to " "B only right before you upload or push to B." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:648 msgid "" "It is possible, though much less convenient, to reduce the number of " "pseudomerges yet further. We debrebase only (i) when importing a new " "release, and (ii) right before uploading. Instead of editing the existing " "delta queue, you append fixup commits (and reversions of commits) that alter " "the upstream source to the required state. You can push and pull to and " "from B during this. Just before uploading, you debrebase, " "once, to tidy everything up." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:656 msgid "The debian/patches directory" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:658 msgid "" "In this workflow, I is purely an output of git-" "debrebase(1). You should not make changes there. They will either cause " "trouble, or be ignored and overwritten by git-debrebase(1)." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:663 msgid "" "I will often be out-of-date because git-debrebase(1) will " "only regenerate it when it needs to. So you should not rely on the " "information in that directory. When preparing patches to forward upstream, " "you should use git-format-patch(1) on git commits, rather than sending files " "from I." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:669 msgid "Upstream branches" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:671 msgid "In this workflow, we specify upstream tags rather than any branches." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:673 msgid "" "Except when (i) upstream releases only tarballs, (ii) we require DFSG " "filtering, or (iii) you also happen to be involved in upstream development, " "we do not maintain any local branch corresponding to upstream, except " "temporary branches used to prepare patches for forwarding, and the like." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:679 msgid "" "The idea here is that from Debian's point of view, upstream releases are " "immutable points in history. We want to make sure that we are basing our " "Debian package on a properly identified upstream version, rather than some " "arbitrary commit on some branch. Tags are more useful for this." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:685 msgid "" "Upstream's branches remain available as the git remote tracking branches for " "your upstream remote, e.g. I." msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:688 msgid "The first ever dgit push" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:690 msgid "" "If this is the first ever dgit push of the package, consider passing I<--" "deliberately-not-fast-forward> instead of I<--overwrite>. This avoids " "introducing a new origin commit into your git history. (This origin commit " "would represent the most recent non-dgit upload of the package, but this " "should already be represented in your git history.)" msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:696 msgid "Inspecting the history" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:698 msgid "" "The git history made by git-debrebase can seem complicated. Here are some " "suggestions for helpful invocations of gitk and git. They can be adapted " "for other tools like tig(1), git-log(1), magit, etc." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:702 msgid "History of package in Debian, disregarding history from upstream:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:706 #, no-wrap msgid "" " % gitk --first-parent\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:708 msgid "In a laundered branch, the delta queue is at the top." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:712 msgid "History of the packaging, excluding the delta queue:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:714 #, no-wrap msgid "" " % gitk :/debian :!/debian/patches\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:716 msgid "Just the delta queue (i.e. Debian's changes to upstream):" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:718 #, no-wrap msgid "" " % gitk --first-parent -- :/ :!/debian\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:720 msgid "Full history including old versions of the delta queue:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:724 #, no-wrap msgid "" " % gitk --date-order\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:726 msgid "" "The \"Declare fast forward\" commits you see have an older history (usually, " "an older delta queue) as one parent, and a newer history as the other. --" "date-order makes gitk show the delta queues in the right order." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:733 msgid "Complete diff since the last upload:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:737 #, no-wrap msgid "" " % git diff dgit/dgit/sid..HEAD -- :/ :!/debian/patches\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:739 msgid "This includes changes to upstream files." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:743 msgid "Interdiff of delta queue since last upload, if you really want it:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:745 #, no-wrap msgid "" " % git debrebase make-patches\n" " % git diff dgit/dgit/sid..HEAD -- debian/patches\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:748 msgid "And of course there is:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:750 #, no-wrap msgid "" " % git debrebase status\n" "\n" msgstr "" #. type: =head2 #: ../dgit-maint-debrebase.7.pod:752 msgid "Alternative ways to start a debrebase" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:754 msgid "" "Above we started an interactive debrebase by invoking git-debrebase(1) like " "this:" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:763 msgid "It is also possible to perform a non-interactive rebase, like this:" msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:767 #, no-wrap msgid "" " % git debrebase -- [git-rebase options...]\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:772 msgid "" "A third alternative is to have git-debrebase(1) shuffle all the Debian " "changes to the end of your branch, and then manipulate them yourself using " "git-rebase(1) directly. For example," msgstr "" #. type: verbatim #: ../dgit-maint-debrebase.7.pod:778 #, no-wrap msgid "" " % git debrebase\n" " % git rebase -i HEAD~5 # there are 4 Debian patches\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:783 msgid "" "If you take this approach, you should be very careful not to start the " "rebase too early, including before the most recent pseudomerge. git-rebase " "without a base argument will often start the rebase too early, and should be " "avoided. Run git-debrebase instead. See also \"ILLEGAL OPERATIONS\" in git-" "debrebase(5)." msgstr "" #. type: textblock #: ../dgit-maint-debrebase.7.pod:794 msgid "dgit(1), dgit(7), git-debrebase(1), git-debrebase(5)" msgstr "" work/po4a/dgit-maint-gbp_7.pot0000644000000000000000000002055014761250142013352 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 00:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:637 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:5 ../dgit-maint-native.7.pod:5 #: ../dgit-maint-merge.7.pod:5 ../dgit-maint-gbp.7.pod:5 #: ../dgit-maint-debrebase.7.pod:5 ../dgit-downstream-dsc.7.pod:5 #: ../dgit-maint-bpo.7.pod:5 ../git-debrebase.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:222 ../dgit-maint-gbp.7.pod:56 msgid "BUILDING" msgstr "" #. type: textblock #: ../dgit-user.7.pod:449 ../dgit-maint-native.7.pod:127 #: ../dgit-maint-merge.7.pod:549 ../dgit-maint-gbp.7.pod:141 msgid "dgit(1), dgit(7)" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:37 ../dgit-maint-gbp.7.pod:16 #: ../dgit-maint-debrebase.7.pod:38 msgid "" "Benefit from dgit's safety catches. In particular, ensure that your upload " "always matches exactly your git HEAD." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:536 ../dgit-maint-gbp.7.pod:133 #: ../dgit-maint-debrebase.7.pod:596 msgid "INCORPORATING NMUS" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:551 ../dgit-maint-gbp.7.pod:143 #: ../dgit-maint-debrebase.7.pod:796 ../dgit-maint-bpo.7.pod:144 #: ../git-debpush.1.pod:266 msgid "AUTHOR" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:3 msgid "" "dgit - tutorial for package maintainers already using git-buildpackage(1)" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:7 msgid "" "This document explains how B can be incorporated into a git-" "buildpackage(1) package-maintenance workflow. This should be read jointly " "with git-buildpackage(1)'s documentation. Some reasons why you might want " "to incorporate B into your existing workflow:" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:21 msgid "" "Provide a better, more detailed git history to downstream dgit users, such " "as people using dgit to do an NMU (see dgit-nmu-simple(7) and dgit-user(7))." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:27 msgid "" "Note that we assume a patches-unapplied repository: the upstream source " "committed to the git repository is unpatched. git-buildpackage(1) can work " "with patched-applied repositories, but is normally used with patches-" "unapplied." msgstr "" #. type: =head1 #: ../dgit-maint-gbp.7.pod:32 ../dgit-maint-debrebase.7.pod:334 msgid "GIT CONFIGURATION" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:34 msgid "" "If you have configured an I in your gbp.conf, you should tell " "dgit about it:" msgstr "" #. type: verbatim #: ../dgit-maint-gbp.7.pod:39 #, no-wrap msgid "" " % git config --global dgit.default.build-products-dir /home/spwhitton/build-area\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:43 msgid "If you run" msgstr "" #. type: verbatim #: ../dgit-maint-gbp.7.pod:47 #, no-wrap msgid "" " % git config dgit.default.quilt-mode gbp\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:51 msgid "in your repository, you can omit I<--gbp> wherever it occurs below." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:53 msgid "" "Note that this does require that you always work from your gbp master " "branch, never the dgit patches-applied branch." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:58 msgid "You can perform test builds like this:" msgstr "" #. type: verbatim #: ../dgit-maint-gbp.7.pod:62 #, no-wrap msgid "" " % dgit [--include-dirty] gbp-build [OPTIONS]\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:66 msgid "" "where I<--include-dirty> is needed for testing uncommitted changes, and " "I are any further options to be passed on to gbp-buildpackage(1)." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:70 msgid "" "If you are doing a source-only upload, you do not need to prepare a " "I<_source.changes>, as B will take of that on your behalf." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:74 msgid "" "If you need to include binaries with your upload, you will probably want to " "use sbuild(1), pbuilder(1) or cowbuilder(1):" msgstr "" #. type: verbatim #: ../dgit-maint-gbp.7.pod:79 #, no-wrap msgid "" " % dgit --rm-old-changes --gbp sbuild\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:83 msgid "replacing 'sbuild' with 'pbuilder' or 'cowbuilder' if appropriate." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:85 msgid "" "We use I<--rm-old-changes> to ensure that there is exactly one changes file " "corresponding to this package, so we can be confident we're uploading what " "we intend (though B will do some safety checks)." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:90 msgid "" "Note that none of the commands in this section are required to upload with " "dgit. You can invoke gbp-buildpackage(1), pbuilder(1), cowbuilder(1) and " "sbuild(1) directly. However, the defaults for these tools may leave you " "with something that dgit will refuse to upload because it doesn't match your " "git HEAD." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:96 msgid "As a general rule, leave all signing and tagging to dgit." msgstr "" #. type: =head1 #: ../dgit-maint-gbp.7.pod:98 msgid "UPLOADING" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:100 msgid "" "Don't use I<--git-tag>: B will do this for you. To do a source-" "only upload:" msgstr "" #. type: verbatim #: ../dgit-maint-gbp.7.pod:105 ../dgit-sponsorship.7.pod:173 #, no-wrap msgid "" " % dgit --gbp push-source\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:109 msgid "or if you need to include binaries," msgstr "" #. type: verbatim #: ../dgit-maint-gbp.7.pod:113 #, no-wrap msgid "" " % dgit --gbp push\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:117 msgid "" "This will push your git history to the dgit-repos, but you probably want to " "follow it up with a push to salsa." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:120 msgid "" "You will need to pass I<--overwrite> if the previous upload was not " "performed with dgit." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:123 msgid "" "If this is first ever dgit push of the package, consider passing I<--" "deliberately-not-fast-forward> instead of I<--overwrite>. This avoids " "introducing a new origin commit into the dgit view of your git history. " "(This origin commit would represent the most recent non-dgit upload of the " "package, but this should already be represented in your git history.)" msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:130 msgid "" "Alternatively, you can use git-debpush(1). For the first upload you should " "pass the B<--gbp> quilt mode option (see git-debpush(1))." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:135 msgid "" "B can't yet incorporate NMUs into patches-unapplied gbp " "branches. You can just apply the NMU diff the traditional way. The next " "upload will require I<--overwrite>." msgstr "" #. type: textblock #: ../dgit-maint-gbp.7.pod:145 msgid "" "This tutorial was written and is maintained by Sean Whitton " "." msgstr "" work/po4a/dgit-maint-merge_7.pot0000644000000000000000000006474214761250142013714 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 00:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =item #: ../dgit.1:296 ../dgit-maint-merge.7.pod:502 #, no-wrap msgid "1." msgstr "" #. type: =item #: ../dgit.1:297 ../dgit-maint-merge.7.pod:506 #, no-wrap msgid "2." msgstr "" #. type: =item #: ../dgit.1:298 ../dgit-maint-merge.7.pod:511 #, no-wrap msgid "3." msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:637 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:5 ../dgit-maint-native.7.pod:5 #: ../dgit-maint-merge.7.pod:5 ../dgit-maint-gbp.7.pod:5 #: ../dgit-maint-debrebase.7.pod:5 ../dgit-downstream-dsc.7.pod:5 #: ../dgit-maint-bpo.7.pod:5 ../git-debrebase.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: textblock #: ../dgit-user.7.pod:449 ../dgit-maint-native.7.pod:127 #: ../dgit-maint-merge.7.pod:549 ../dgit-maint-gbp.7.pod:141 msgid "dgit(1), dgit(7)" msgstr "" #. type: verbatim #: ../dgit-maint-native.7.pod:106 ../dgit-maint-merge.7.pod:540 #, no-wrap msgid "" " % dgit pull\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:3 msgid "" "dgit - tutorial for package maintainers, using a workflow centered around " "git-merge(1)" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:7 msgid "" "This document describes elements of a workflow for maintaining a non-native " "Debian package using B. The workflow makes the following opinionated " "assumptions:" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:15 msgid "" "Git histories should be the non-linear histories produced by git-merge(1), " "preserving all information about divergent development that was later " "brought together." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:21 msgid "" "Maintaining convenient and powerful git workflows takes priority over the " "usefulness of the raw Debian source package. The Debian archive is thought " "of as an output format." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:25 msgid "" "For example, we don't spend time curating a series of quilt patches. " "However, in straightforward cases, the information such a series would " "contain is readily available from B." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:33 msgid "" "It is more important to have the Debian package's git history be a " "descendent of upstream's git history than to use exactly the orig.tar that " "upstream makes available for download." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:39 msgid "" "This workflow is less suitable for some packages. When the Debian delta " "contains multiple pieces which interact, or which you aren't going to be " "able to upstream soon, it might be preferable to maintain the delta as a " "rebasing patch series. For such a workflow see for example dgit-maint-" "debrebase(7) and dgit-maint-gbp(7)." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:47 ../dgit-maint-debrebase.7.pod:61 msgid "INITIAL DEBIANISATION" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:49 ../dgit-maint-debrebase.7.pod:63 msgid "" "This section explains how to start using this workflow with a new package. " "It should be skipped when converting an existing package to this workflow." msgstr "" #. type: =head3 #: ../dgit-maint-merge.7.pod:53 ../dgit-maint-merge.7.pod:385 #: ../dgit-maint-merge.7.pod:464 ../dgit-maint-debrebase.7.pod:67 #: ../dgit-maint-debrebase.7.pod:362 msgid "When upstream tags releases in git" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:55 ../dgit-maint-debrebase.7.pod:69 msgid "" "Suppose that the latest stable upstream release is 1.2.2, and this has been " "tagged '1.2.2' by upstream." msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:60 ../dgit-maint-debrebase.7.pod:74 #, no-wrap msgid "" " % git clone -oupstream https://some.upstream/foo.git\n" " % cd foo\n" " % git verify-tag 1.2.2\n" " % git reset --hard 1.2.2\n" " % git branch --unset-upstream\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:68 msgid "" "The final command detaches your master branch from the upstream remote, so " "that git doesn't try to push anything there, or merge unreleased upstream " "commits. If you want to maintain a copy of your packaging branch on B in addition to B, you can do something like this:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:76 ../dgit-maint-debrebase.7.pod:90 #, no-wrap msgid "" " % git remote add -f origin salsa.debian.org:Debian/foo.git\n" " % git push --follow-tags -u origin master\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:81 msgid "" "Now go ahead and Debianise your package. Just make commits on the master " "branch, adding things in the I directory. If you need to patch the " "upstream source, just make commits that change files outside of the I directory. It is best to separate commits that touch I from " "commits that touch upstream source, so that the latter can be cherry-picked " "by upstream." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:88 msgid "" "Note that there is no need to maintain a separate 'upstream' branch, unless " "you also happen to be involved in upstream development. We work with " "upstream tags rather than any branches, except when forwarding patches (see " "FORWARDING PATCHES UPSTREAM, below)." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:93 ../dgit-maint-debrebase.7.pod:102 msgid "Finally, you need an orig tarball:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:97 ../dgit-maint-merge.7.pod:458 #: ../dgit-maint-debrebase.7.pod:106 ../dgit-maint-debrebase.7.pod:429 #, no-wrap msgid "" " % git deborig\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:101 ../dgit-maint-debrebase.7.pod:110 msgid "See git-deborig(1) if this fails." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:103 ../dgit-maint-debrebase.7.pod:112 msgid "" "This tarball is ephemeral and easily regenerated, so we don't commit it " "anywhere (e.g. with tools like pristine-tar(1))." msgstr "" #. type: =head3 #: ../dgit-maint-merge.7.pod:106 msgid "Verifying upstream's tarball releases" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:110 msgid "" "It can be a good idea to compare upstream's released tarballs with the " "release tags, at least for the first upload of the package. If they are " "different, you might need to add some additional steps to your I, such as running autotools." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:115 msgid "" "A convenient way to perform this check is to import the tarball as described " "in the following section, using a different value for 'upstream-tag', and " "then use git-diff(1) to compare the imported tarball to the release tag. If " "they are the same, you can use upstream's tarball instead of running git-" "deborig(1)." msgstr "" #. type: =head3 #: ../dgit-maint-merge.7.pod:123 ../dgit-maint-debrebase.7.pod:137 msgid "Using untagged upstream commits" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:127 ../dgit-maint-debrebase.7.pod:141 msgid "" "Sometimes upstream does not tag their releases, or you want to package an " "unreleased git snapshot. In such a case you can create your own upstream " "release tag, of the form BI, where I is the upstream " "version you plan to put in I. The B prefix " "ensures that your tag will not clash with any tags upstream later creates." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:134 ../dgit-maint-debrebase.7.pod:148 msgid "" "For example, suppose that the latest upstream release is 1.2.2 and you want " "to package git commit ab34c21 which was made on 2013-12-11. A common " "convention is to use the upstream version number 1.2.2+git20131211.ab34c21 " "and so you could use" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:141 ../dgit-maint-debrebase.7.pod:155 #, no-wrap msgid "" " % git tag -s upstream/1.2.2+git20131211.ab34c21 ab34c21\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:145 ../dgit-maint-debrebase.7.pod:159 msgid "to obtain a release tag, and then proceed as above." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:147 msgid "" "One can generate such a versioned tag using git show's --pretty option. e." "g.:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:151 ../dgit-maint-debrebase.7.pod:165 #, no-wrap msgid "" " % git tag -s upstream/$(git show --date=format:%Y%m%d --pretty=format:\"1.2.2+git%cd.%h\" --quiet upstream/main) upstream/main\n" "\n" msgstr "" #. type: =head3 #: ../dgit-maint-merge.7.pod:157 ../dgit-maint-merge.7.pod:397 #: ../dgit-maint-merge.7.pod:489 ../dgit-maint-debrebase.7.pod:171 #: ../dgit-maint-debrebase.7.pod:374 msgid "When upstream releases only tarballs" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:159 msgid "" "We need a virtual upstream branch with virtual release tags. gbp-import-" "orig(1) can manage this for us. To begin" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:164 #, no-wrap msgid "" " % mkdir foo\n" " % cd foo\n" " % git init\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:170 msgid "Now create I:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:174 ../dgit-maint-debrebase.7.pod:216 #, no-wrap msgid "" " [DEFAULT]\n" " upstream-branch = upstream\n" " debian-branch = master\n" " upstream-tag = upstream/%(version)s\n" "\n" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:179 ../dgit-maint-debrebase.7.pod:221 #, no-wrap msgid "" " sign-tags = True\n" " pristine-tar = False\n" " pristine-tar-commit = False\n" "\n" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:183 #, no-wrap msgid "" " [import-orig]\n" " merge-mode = merge\n" " merge = False\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:189 msgid "gbp-import-orig(1) requires a pre-existing upstream branch:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:193 #, no-wrap msgid "" " % git add debian/gbp.conf && git commit -m \"create gbp.conf\"\n" " % git checkout --orphan upstream\n" " % git rm -rf .\n" " % git commit --allow-empty -m \"initial, empty branch for upstream source\"\n" " % git checkout -f master\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:201 msgid "Then we can import the upstream version:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:205 #, no-wrap msgid "" " % gbp import-orig --merge --merge-mode=replace ../foo_1.2.2.orig.tar.xz\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:209 msgid "" "Our upstream branch cannot be pushed to B, but since we will " "need it whenever we import a new upstream version, we must push it " "somewhere. The usual choice is B:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:215 ../dgit-maint-debrebase.7.pod:199 #, no-wrap msgid "" " % git remote add -f origin salsa.debian.org:Debian/foo.git\n" " % git push --follow-tags -u origin master upstream\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:220 msgid "" "You are now ready to proceed as above, making commits to both the upstream " "source and the I directory." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:223 ../dgit-maint-debrebase.7.pod:243 msgid "CONVERTING AN EXISTING PACKAGE" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:225 ../dgit-maint-debrebase.7.pod:245 msgid "" "This section explains how to convert an existing Debian package to this " "workflow. It should be skipped when debianising a new package." msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:228 msgid "No existing git history" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:232 #, no-wrap msgid "" " % dgit clone foo\n" " % cd foo\n" " % git remote add -f upstream https://some.upstream/foo.git\n" "\n" msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:238 msgid "Existing git history using another workflow" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:240 msgid "" "First, if you don't already have the git history locally, clone it, and " "obtain the corresponding orig.tar from the archive:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:245 #, no-wrap msgid "" " % git clone git.debian.org:collab-maint/foo\n" " % cd foo\n" " % origtargz\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:251 msgid "Now dump any existing patch queue:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:255 #, no-wrap msgid "" " % git rm -rf debian/patches\n" " % git commit -m \"drop existing quilt patch queue\"\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:260 msgid "Then make new upstream tags available:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:264 ../dgit-maint-debrebase.7.pod:276 #, no-wrap msgid "" " % git remote add -f upstream https://some.upstream/foo.git\n" "\n" msgstr "" #. type: =for #: ../dgit-maint-merge.7.pod:268 msgid "dgit-test dpkg-source-ignores begin" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:270 msgid "" "Now you simply need to ensure that your git HEAD is dgit-compatible, i.e., " "it is exactly what you would get if you ran B and then unpacked the resultant source package." msgstr "" #. type: =for #: ../dgit-maint-merge.7.pod:275 msgid "dgit-test dpkg-source-ignores end" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:277 ../dgit-maint-debrebase.7.pod:330 msgid "" "To achieve this, you might need to delete I. " "One way to have dgit check your progress is to run B." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:281 msgid "" "The first dgit push will require I<--overwrite>. If this is the first ever " "dgit push of the package, consider passing I<--deliberately-not-fast-" "forward> instead of I<--overwrite>. This avoids introducing a new origin " "commit into your git history. (This origin commit would represent the most " "recent non-dgit upload of the package, but this should already be " "represented in your git history.)" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:288 msgid "SOURCE PACKAGE AND GIT WORKING TREE CONFIGURATION" msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:290 msgid "dgit configuration" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:292 msgid "" "We must tell dgit not to try to maintain a linear queue of patches to the " "upstream source:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:297 #, no-wrap msgid "" " git config dgit.default.quilt-mode single\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:301 msgid "" "This affects only this one git tree; your other git trees for this package " "(and co-maintainers) will need it too. Don't set it more globally, because " "the maintainers of any other packages you work on, or send patches for, may " "be offended by its effects." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:309 msgid "unpleasant NMUs" msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:311 msgid "debian/source/options" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:313 msgid "" "We set a source package option to help dpkg handle changes to the upstream " "source:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:319 #, no-wrap msgid "" " auto-commit\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:323 msgid "" "You don't need to create this file if you are using the version 1.0 source " "package format." msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:326 msgid "Sample text for debian/README.source" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:328 msgid "" "It is a good idea to explain how a user can obtain a breakdown of the " "changes to the upstream source:" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:333 msgid "" "The Debian packaging of foo is maintained in git, using the merging workflow " "described in dgit-maint-merge(7). There isn't a patch queue that can be " "represented as a quilt series." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:337 msgid "" "A detailed breakdown of the changes is available from their canonical " "representation - git commits in the packaging repository. For example, to " "see the changes made by the Debian maintainer in the first upload of " "upstream version 1.2.3, you could use:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:345 #, no-wrap msgid "" " % git clone https://git.dgit.debian.org/foo\n" " % cd foo\n" " % git log --oneline 1.2.3..debian/1.2.3-1 -- . ':!debian'\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:351 msgid "" "(If you have dgit, use `dgit clone foo`, rather than plain `git clone`.)" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:354 msgid "A single combined diff, containing all the changes, follows." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:358 ../dgit-maint-debrebase.7.pod:482 msgid "BUILDING AND UPLOADING" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:360 msgid "" "Use B, B, B, B, " "B, and B as detailed in dgit(1). If any " "command fails, dgit will provide a carefully-worded error message explaining " "what you should do. If it's not clear, file a bug against dgit. Remember " "to pass I<--new> for the first upload." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:366 msgid "" "If you want to upload with git-debpush(1), for the first upload you should " "pass the B<--quilt=single> quilt mode option (see git-debpush(1))." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:370 msgid "" "As another alternative to B and friends, you can use a tool like " "gitpkg(1). This works because like dgit, gitpkg(1) enforces that HEAD has " "exactly the contents of the source package. gitpkg(1) is highly " "configurable, and one dgit user reports using it to produce and test " "multiple source packages, from different branches corresponding to each of " "the current Debian suites." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:377 msgid "" "If you want to skip dgit's checks while iterating on a problem with the " "package build (for example, you don't want to commit your changes to git), " "you can just run dpkg-buildpackage(1) or debuild(1) instead." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:381 msgid "NEW UPSTREAM RELEASES" msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:383 ../dgit-maint-debrebase.7.pod:360 msgid "Obtaining the release" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:389 ../dgit-maint-debrebase.7.pod:366 #, no-wrap msgid "" " % git fetch --tags upstream\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:393 ../dgit-maint-debrebase.7.pod:370 msgid "" "If you want to package an untagged upstream commit (because upstream does " "not tag releases or because you want to package an upstream development " "snapshot), see \"Using untagged upstream commits\" above." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:399 ../dgit-maint-debrebase.7.pod:376 msgid "" "You will need the I from \"When upstream releases only " "tarballs\", above. You will also need your upstream branch. Above, we " "pushed this to B. You will need to clone or fetch from " "there, instead of relying on B/B alone." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:404 ../dgit-maint-debrebase.7.pod:381 msgid "Then, either" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:408 ../dgit-maint-debrebase.7.pod:385 #, no-wrap msgid "" " % gbp import-orig ../foo_1.2.3.orig.tar.xz\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:412 ../dgit-maint-debrebase.7.pod:389 msgid "or if you have a working watch file" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:416 ../dgit-maint-debrebase.7.pod:393 #, no-wrap msgid "" " % gbp import-orig --uscan\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:420 msgid "In the following, replace I<1.2.3> with I." msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:422 msgid "Reviewing & merging the release" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:424 msgid "" "It's a good idea to preview the merge of the new upstream release. First, " "just check for any new or deleted files that may need accounting for in your " "copyright file:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:430 #, no-wrap msgid "" " % git diff --name-status --diff-filter=ADR master..1.2.3 -- . ':!debian'\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:434 msgid "You can then review the full merge diff:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:438 #, no-wrap msgid "" " % git merge-tree `git merge-base master 1.2.3` master 1.2.3 | $PAGER\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:442 msgid "Once you're satisfied with what will be merged, update your package:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:446 #, no-wrap msgid "" " % git merge 1.2.3\n" " % dch -v1.2.3-1 New upstream release.\n" " % git add debian/changelog && git commit -m changelog\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:452 ../dgit-maint-debrebase.7.pod:423 msgid "" "If you obtained a tarball from upstream, you are ready to try a build. If " "you merged a git tag from upstream, you will first need to generate a " "tarball:" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:462 ../dgit-maint-debrebase.7.pod:517 msgid "HANDLING DFSG-NON-FREE MATERIAL" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:466 msgid "We create a DFSG-clean tag to merge to master:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:470 #, no-wrap msgid "" " % git checkout -b pre-dfsg 1.2.3\n" " % git rm evil.bin\n" " % git commit -m \"upstream version 1.2.3 DFSG-cleaned\"\n" " % git tag -s 1.2.3+dfsg\n" " % git checkout master\n" " % git branch -D pre-dfsg\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:479 msgid "" "Before merging the new 1.2.3+dfsg tag to master, you should first determine " "whether it would be legally dangerous for the non-free material to be " "publicly accessible in the git history on B." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:484 msgid "" "If it would be dangerous, there is a big problem; in this case please " "consult your archive administrators (for Debian this is the dgit " "administrator dgit-owner@debian.org and the ftpmasters ftpmaster@ftp-master." "debian.org)." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:491 ../dgit-maint-debrebase.7.pod:591 msgid "" "The easiest way to handle this is to add a B field to " "I, and a B setting in I. " "See uscan(1). Alternatively, see the I<--filter> option detailed in gbp-" "import-orig(1)." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:496 msgid "FORWARDING PATCHES UPSTREAM" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:498 msgid "The basic steps are:" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:504 msgid "Create a new branch based off upstream's master branch." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:508 msgid "" "git-cherry-pick(1) commits from your master branch onto your new branch." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:513 msgid "" "Push the branch somewhere and ask upstream to merge it, or use git-format-" "patch(1) or git-request-pull(1)." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:518 msgid "For example (and it is only an example):" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:522 #, no-wrap msgid "" " % # fork foo.git on GitHub\n" " % git remote add -f fork git@github.com:spwhitton/foo.git\n" " % git checkout -b fix-error upstream/master\n" " % git config branch.fix-error.pushRemote fork\n" " % git cherry-pick master^2\n" " % git push\n" " % # submit pull request on GitHub\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:532 msgid "" "Note that when you merge an upstream release containing your forwarded " "patches, git and dgit will transparently handle \"dropping\" the patches " "that have been forwarded, \"retaining\" the ones that haven't." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:536 ../dgit-maint-gbp.7.pod:133 #: ../dgit-maint-debrebase.7.pod:596 msgid "INCORPORATING NMUS" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:544 msgid "" "Alternatively, you can apply the NMU diff to your repository. The next push " "will then require I<--overwrite>." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:551 ../dgit-maint-gbp.7.pod:143 #: ../dgit-maint-debrebase.7.pod:796 ../dgit-maint-bpo.7.pod:144 #: ../git-debpush.1.pod:266 msgid "AUTHOR" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:553 ../dgit-maint-debrebase.7.pod:798 msgid "" "This tutorial was written and is maintained by Sean Whitton " ". It contains contributions from other dgit " "contributors too - see the dgit copyright file." msgstr "" work/po4a/dgit-maint-native_7.pot0000644000000000000000000001374614761250142014101 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 00:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:637 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:5 ../dgit-maint-native.7.pod:5 #: ../dgit-maint-merge.7.pod:5 ../dgit-maint-gbp.7.pod:5 #: ../dgit-maint-debrebase.7.pod:5 ../dgit-downstream-dsc.7.pod:5 #: ../dgit-maint-bpo.7.pod:5 ../git-debrebase.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: textblock #: ../dgit-user.7.pod:449 ../dgit-maint-native.7.pod:127 #: ../dgit-maint-merge.7.pod:549 ../dgit-maint-gbp.7.pod:141 msgid "dgit(1), dgit(7)" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:3 msgid "dgit - tutorial for package maintainers of Debian-native packages" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:7 msgid "" "This document describes elements of a workflow for using B to maintain " "a Debian package that uses one of the native source formats (\"1.0\" & \"3.0 " "(native)\")." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:15 msgid "We expect that your git history is fast-forwarding." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:19 msgid "" "You should be prepared to tolerate a small amount of ugliness in your git " "history in the form of merges which stitch the dgit-generated archive view " "into your maintainer history." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:25 msgid "" "This is to handle uploads that were not made with dgit, such as the uploads " "you made before switching to this workflow, or NMUs." msgstr "" #. type: =head2 #: ../dgit-maint-native.7.pod:31 msgid "Benefits" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:37 ../dgit-maint-gbp.7.pod:16 #: ../dgit-maint-debrebase.7.pod:38 msgid "" "Benefit from dgit's safety catches. In particular, ensure that your upload " "always matches exactly your git HEAD." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:42 msgid "Provide a better, more detailed history to downstream dgit users." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:48 msgid "Incorporate an NMU with one command." msgstr "" #. type: =head1 #: ../dgit-maint-native.7.pod:52 msgid "FIRST PUSH WITH DGIT" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:54 msgid "You do not need to do anything special to your tree to push with dgit." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:57 msgid "Simply prepare your git tree in the usual way, and then:" msgstr "" #. type: verbatim #: ../dgit-maint-native.7.pod:61 #, no-wrap msgid "" " % dgit -wgf --overwrite push-source\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:65 msgid "(Do not make any tags yourself: dgit push will do that.)" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:67 msgid "" "You may use B or B instead of B; see dgit(1) for the syntax of those subcommands." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:71 msgid "" "The --overwrite option tells dgit that you are expecting that your git " "history is not a descendant of the history which dgit synthesised from the " "previous non-dgit uploads." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:76 msgid "" "dgit will make a merge commit on your branch but without making any code " "changes (ie, a pseudo-merge) so that your history, which will be pushed to " "the dgit git server, is fast forward from the dgit archive view." msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:84 msgid "" "Alternatively, if this was the first ever dgit push of the package, you can " "avoid this merge commit by passing C<--deliberately-not-fast-forward> " "instead of C<--overwrite>. This avoids introducing a new origin commit into " "your git history." msgstr "" #. type: =head1 #: ../dgit-maint-native.7.pod:92 msgid "SUBSEQUENT PUSHES" msgstr "" #. type: verbatim #: ../dgit-maint-native.7.pod:96 #, no-wrap msgid "" " % dgit -wgf push-source\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:100 ../dgit-maint-native.7.pod:110 msgid "That's it." msgstr "" #. type: =head1 #: ../dgit-maint-native.7.pod:102 msgid "INCORPORATING AN NMU" msgstr "" #. type: verbatim #: ../dgit-maint-native.7.pod:106 ../dgit-maint-merge.7.pod:540 #, no-wrap msgid "" " % dgit pull\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:112 msgid "Or, if you would prefer to review the changes, you can do this:" msgstr "" #. type: verbatim #: ../dgit-maint-native.7.pod:117 #, no-wrap msgid "" " % dgit fetch\n" " % dgit diff HEAD..dgit/dgit/sid\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-native.7.pod:122 msgid "" "If you do not merge the NMU into your own git history, the next push will " "then require I<--overwrite>." msgstr "" work/po4a/dgit-nmu-simple_7.pot0000644000000000000000000001706514761250142013571 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 00:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:637 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit.7:4 ../dgit-user.7.pod:27 ../dgit-nmu-simple.7.pod:35 #, no-wrap msgid "SUMMARY" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:3 msgid "dgit-nmu-simple - tutorial for DDs wanting to NMU with git" msgstr "" #. type: =head1 #: ../dgit-nmu-simple.7.pod:5 ../dgit-sponsorship.7.pod:5 msgid "INTRODUCTION AND SCOPE" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:7 msgid "" "This tutorial describes how a Debian Developer can do a straightforward NMU " "of a package in Debian, using dgit." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:11 msgid "" "This document won't help you decide whether an NMU is a good idea or whether " "it be well received. The Debian Developers' Reference has some (sometimes " "questionable) guidance on this." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:17 msgid "" "Conversely, you do not need to know anything about the usual maintainer's " "git workflow. If appropriate, you can work on many different packages, " "making similar changes, without worrying about the individual maintainers' " "git practices." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:23 msgid "" "This tutorial only covers changes which can sensibly be expressed as a " "reasonably small number of linear commits (whether to Debian packaging or to " "upstream files or both)." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:28 msgid "" "If you want to do a new upstream version, you probably want to do as the " "maintainer would have done. You'll need to find out what the maintainer's " "git practices are and consult the appropriate C workflow " "tutorial," msgstr "" #. type: verbatim #: ../dgit-nmu-simple.7.pod:39 #, no-wrap msgid "" " % dgit clone glibc jessie\n" " % cd glibc\n" " % git am ~/glibc-security-fix.diff\n" " % dch --nmu \"Apply upstream's fix for foo bug.\"\n" " % git add debian/changelog && git commit -m\"NMU changelog entry\"\n" " % dpkg-buildpackage -uc -b\n" " [ run your tests ]\n" " % dch -r && git add debian/changelog && git commit -m\"Finalise NMU\"\n" " % dgit -wgf sbuild -A -c jessie\n" " [ any final tests on generated .debs ]\n" " % dgit -wgf [--delayed=5] push-source jessie\n" " [ enter your gnupg passphrase as prompted ]\n" " [ see that push and upload are successful ]\n" " [ prepare and email NMU diff (git-diff, git-format-patch) ]\n" "\n" msgstr "" #. type: =head1 #: ../dgit-nmu-simple.7.pod:56 msgid "WHAT KIND OF CHANGES AND COMMITS TO MAKE" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:58 msgid "" "When preparing an NMU, the git commits you make on the dgit branch should be " "simple linear series of commits with good commit messages. The commit " "messages will be published in various ways, including perhaps being used as " "the cover messages for generated quilt patches." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:64 msgid "" "Do not make merge commits. Do not try to rebase to drop patches - if you " "need to revert a change which is actually a Debian patch, use git-revert." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:69 msgid "" "If you need to modify a Debian patch, make a new commit which fixes what " "needs fixing, and explain in the commit message which patch it should be " "squashed with (perhaps by use of a commit message in C format)." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:76 msgid "" "(Of course if you have specific instructions from the maintainer, you can " "follow those instead. But the procedure in this tutorial is legitimate for " "any maintainer, in the sense that it should generate an upload to which the " "maintainer cannot reasonably object.)" msgstr "" #. type: =head1 #: ../dgit-nmu-simple.7.pod:82 msgid "RELEVANT BRANCHES" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:84 msgid "" "dgit clone will put you on a branch like C. There is a pseudo-" "remote called C which also contains a branch like C, so you " "do things like C to see what changes you have made." msgstr "" #. type: =head1 #: ../dgit-nmu-simple.7.pod:90 msgid "KEEPING YOUR WORKING TREE TIDY" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:92 msgid "" "Don't forget to C any new files you create. Otherwise git clean " "(which is requested with the C<-wgf> option in the recipe above) will " "delete them." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:97 msgid "" "Many package builds leave dirty git trees. So, commit before building. " "That way you can use C." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:101 msgid "" "If you follow this approach you don't need to care about the build dirtying " "the tree. It also means you don't care about the package clean target, " "which is just as well because many package clean targets are broken." msgstr "" #. type: =head1 #: ../dgit-nmu-simple.7.pod:107 msgid "OTHER GIT BRANCHES" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:109 msgid "" "The dgit git history (visible in gitk and git log) is not necessarily " "related to the maintainer's or upstream's git history (if any)." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:114 msgid "" "If the maintainer has advertised a git repo with Vcs-Git dgit will set up a " "remote for it, so you can do" msgstr "" #. type: verbatim #: ../dgit-nmu-simple.7.pod:121 #, no-wrap msgid "" " % git fetch vcs-git\n" "\n" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:125 msgid "" "You can cherry pick changes from there, for example. Note that the " "maintainer's git history may not be suitable for use with dgit. For " "example, it might be a patches-unapplied branch or even contain only a " "debian/ directory." msgstr "" #. type: =head1 #: ../dgit-nmu-simple.7.pod:131 msgid "UPLOADING TO DELAYED" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:133 msgid "" "You can use dgit's I<--delayed> option to upload to the DELAYED queue. " "However, you should read the warning about this option in dgit(1)." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:139 msgid "dgit(1), dgit(7), dgit-maint-*(7)" msgstr "" work/po4a/dgit-sponsorship_7.pot0000644000000000000000000003452314761250142014070 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 00:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:637 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit-nmu-simple.7.pod:5 ../dgit-sponsorship.7.pod:5 msgid "INTRODUCTION AND SCOPE" msgstr "" #. type: verbatim #: ../dgit-maint-gbp.7.pod:105 ../dgit-sponsorship.7.pod:173 #, no-wrap msgid "" " % dgit --gbp push-source\n" "\n" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:3 msgid "dgit-sponsorship - tutorial for Debian upload sponsorship, using git" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:7 msgid "" "This tutorial describes how a Debian sponsored contributor and a sponsoring " "DD (or DM) can collaborate and publish using git." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:12 msgid "" "The sponsor must be intending to use dgit for the upload. (If the sponsor " "does not use dgit, it is not possible to properly publish a sponsee's git " "branch.)" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:17 msgid "" "It is best if the sponsee also uses dgit; but also covered (later on) is the " "case where the sponsee provides a proposed upload in source package form, " "but the sponsor would like to work in git." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:22 msgid "" "This tutorial does not provide a checklist for the sponsor's review. Both " "contributors are expected to be familiar with Debian packaging and Debian's " "processes, and with git." msgstr "" #. type: =head1 #: ../dgit-sponsorship.7.pod:26 msgid "SPONSEE WORKFLOW" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:28 msgid "This section is addressed to the sponsee:" msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:30 msgid "General" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:32 msgid "" "You should prepare the package as if you were going to upload it with C or C yourself." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:35 msgid "For a straightforward NMU, consult L." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:37 msgid "" "If you are the (prospective) maintainer, you can adopt any suitable (dgit-" "compatible) git workflow. The L tutorials describe some " "of the possibilities." msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:42 msgid "Upload preparation" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:44 msgid "" "You should go through all of the steps a self-uploading maintainer would do, " "including building for ad hoc tests, and checking via a formal build (eg " "using C) that the package builds on sid (or the target " "release)." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:50 msgid "" "At the point where you would, if you were a DD, do the actual upload by " "running dgit push, you hand off to your sponsor." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:56 msgid "" "If you were going to use one of the C<--quilt=> options to dgit, or C or C, you must specify that in your handoff email - see " "below." msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:62 msgid "git+origs based handoff" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:64 msgid "The elements of the handoff consists of:" msgstr "" #. type: =item #: ../dgit-sponsorship.7.pod:68 ../dgit-sponsorship.7.pod:72 #: ../dgit-sponsorship.7.pod:79 ../dgit-sponsorship.7.pod:84 msgid "*" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:70 msgid "The git branch." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:74 msgid "" "Any .orig tarballs which will be needed, or sample git-archive(1) or gbp-" "buildpackage(1) command(s) to generate them." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:81 msgid "" "A sample dgit push-source command, containing any dgit --quilt=, --gbp or --" "dpm option needed" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:86 msgid "" "Plus of course all the usual information about the state of the package, any " "caveats or areas you would like the sponsor to focus their review, " "constraints about upload timing, etc." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:93 msgid "" "If the handoff is done by email, the elements above should be a in a single, " "signed, message. This could be an RFS submission against the sponsorship-" "requests pseudo-package." msgstr "" #. type: =head3 #: ../dgit-sponsorship.7.pod:98 msgid "git branch" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:102 msgid "" "The sponsee should push their HEAD as a git branch to any suitable git " "server. They can use their own git server; salsa is another possibility." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:107 msgid "" "The branch names used by the sponsee on their local machine, and on the " "server, do not matter." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:110 msgid "" "Instead, the sponsee should include the git commit id of their HEAD in their " "handover email." msgstr "" #. type: =head3 #: ../dgit-sponsorship.7.pod:116 msgid "orig tarballs" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:120 msgid "" "If there are any .origs that are not in the archive already, the sponsor " "will need them as part of the upload." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:123 msgid "" "If the sponsee generated these tarballs with git-archive(1) or gbp-" "buildpackage(1), they can simply include a sample invocation of git-" "archive(1) or ensure that a suitable gbp.conf is present in the source " "package to generate the tarball." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:130 msgid "" "Otherwise, the simplest approach is to commit the orig tarballs with " "pristine-tar(1), e.g." msgstr "" #. type: verbatim #: ../dgit-sponsorship.7.pod:136 #, no-wrap msgid "" " % pristine-tar commit ../foo_1.2.3.orig.tar.xz upstream/1.2.3\n" "\n" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:140 msgid "" "and be sure to push the pristine-tar branch. If you are using git-" "buildpackage(1), just pass I<--git-pristine-tar> and I<--git-pristine-tar-" "commit>." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:144 msgid "" "Alternatively, the sponsee can put them on a suitable webserver, or attach " "to the e-mail, if they are small." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:149 msgid "" "The sponsee should quote sha256sums of the .origs in their handoff email, " "unless they supplied commands to generate them." msgstr "" #. type: =head3 #: ../dgit-sponsorship.7.pod:155 msgid "quilt options" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:159 msgid "" "Some workflows involve git branches which are not natively dgit-compatible. " "Normally dgit will convert them as needed, during push." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:163 msgid "" "Supply a sample \"dgit push-source\" command including any C<--gbp> (aka C<--" "quilt=gbp>), C<--dpm> (aka C<--quilt=dpm>), or other C<--quilt=> option they " "need to use. e.g." msgstr "" #. type: =head1 #: ../dgit-sponsorship.7.pod:179 msgid "SPONSOR WORKFLOW" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:181 ../dgit-sponsorship.7.pod:273 msgid "This part is addressed to the sponsor:" msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:183 msgid "Receiving and validating the sponsorship request" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:185 msgid "You should check the signature on the email." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:187 msgid "" "Use C or C to obtain the git branch prepared by your " "sponsee, and obtain any .origs mentioned by the sponsee (to extract .origs " "committed with pristine-tar, you can use origtargz(1), or use \"gbp clone --" "pristine-tar\".)" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:194 msgid "" "Check the git commit ID of the sponsee's branch tip, and the sha256sums of " "the .origs, against the handoff email." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:198 msgid "Now you can check out the branch tip, and do your substantive review." msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:201 msgid "Dealing with branches that want --quilt=" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:203 msgid "" "If your sponsee mentioned a C<--quilt> option, and you don't want to grapple " "with their preferred tree format, you can convert their tree into the " "standard dgit view:" msgstr "" #. type: verbatim #: ../dgit-sponsorship.7.pod:209 #, no-wrap msgid "" " % dgit -wgf --quilt=foo --dgit-view-save=unquilted quilt-fixup\n" " % git checkout unquilted\n" "\n" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:214 msgid "" "You should check that what you're looking at is a descendant of the " "sponsee's branch." msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:217 msgid "Some hints which may help the review" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:219 msgid "" "C will get you an up-to-date C " "showing what's in the archive already." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:223 msgid "" "C will check that dgit can build an " "appropriate source package." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:226 msgid "" "There is no need to run debdiff. dgit will not upload anything that doesn't " "unpack to exactly the git commit you are pushing, so you can rely on what " "you see in C." msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:231 msgid "Doing the upload" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:233 msgid "" "When you have completed your source review, and use C or similar, to to the build, and then C or C to do " "the upload." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:242 msgid "" "Check whether the sponsee made a debian/I tag. If they did, ensure " "you have their tag in the repository you are pushing from, or pass C<--no-" "dep14tag>. This avoids identically named, non-identical tags, which can be " "confusing." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:249 msgid "" "(It is possible to upload from the quilt-cache dgit view. If you want to do " "this, B pass the C<--quilt> or C<--gbp> or C<--dpm> options again, " "and B pass C<--no-dep14tag>, since the debian/I tag should go " "on the sponsee's branch.)" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:257 msgid "" "If this was the first upload done with dgit, you may need to pass C<--" "overwrite> to dgit." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:262 msgid "" "Alternatively, if this was the first ever dgit push of the package, you can " "pass C<--deliberately-not-fast-forward> instead of C<--overwrite>. This " "avoids introducing a new origin commit into the dgit view of the sponsee's " "git history which is unnecessary and could be confusing." msgstr "" #. type: =head1 #: ../dgit-sponsorship.7.pod:271 msgid "SPONSORING A NON-GIT-USING SPONSEE" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:275 msgid "" "If your sponsee does not use git, you can still do your review with git, and " "use dgit for the upload." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:279 msgid "" "Your sponsee will provide you with a source package: that is, a .dsc and the " "files it refers to. Obtain these files, and check signatures as " "appropriate. Then:" msgstr "" #. type: verbatim #: ../dgit-sponsorship.7.pod:286 #, no-wrap msgid "" " % dgit clone PACKAGE\n" " % cd PACKAGE\n" " % dgit import-dsc /path/to/sponsee's.dsc +sponsee\n" " % git checkout sponsee\n" "\n" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:293 msgid "Or for an entirely new package:" msgstr "" #. type: verbatim #: ../dgit-sponsorship.7.pod:297 #, no-wrap msgid "" " % mkdir PACKAGE\n" " % cd PACKAGE\n" " % git init\n" " % dgit -pPACKAGE import-dsc /path/to/sponsee's.dsc +sponsee\n" "\n" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:304 msgid "" "This will leave you looking at the sponsee's package, formatted as a dgit " "branch." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:307 msgid "" "When you have finished your review and your tests, you can do the dgit push-" "source (or dgit sbuild and dgit push-built) directly from the \"sponsee\" " "branch." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:313 msgid "" "You will need to pass C<--overwrite> to dgit push for every successive " "upload. This disables a safety catch which would normally spot situations " "where changes are accidentally lost. When your sponsee is sending you " "source packages - perhaps multiple source packages with the same version " "number - these safety catches are inevitably ineffective." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:324 msgid "dgit(1), dgit(7), dgit-nmu-simple(7), dgit-maint-*(7)" msgstr "" work/po4a/dgit-user_7.nl.po0000644000000000000000000010533414761250142012702 0ustar # Dutch translations for po package dgit-user_7 # Copyright (C) 2018 Free Software Foundation, Inc. # This file is distributed under the same license as the po package. # Automatically generated, 2018. # Frans Spiesschaert , 2018. # msgid "" msgstr "" "Project-Id-Version: dgit-user_7\n" "POT-Creation-Date: 2019-03-01 16:59+0000\n" "PO-Revision-Date: 2018-11-14 21:22+0100\n" "Last-Translator: Frans Spiesschaert \n" "Language-Team: Debian Dutch l10n Team \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.7\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #, no-wrap msgid "NAME" msgstr "NAAM" #. type: =head1 #: ../dgit.1:1470 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:126 #: ../dgit-maint-merge.7.pod:491 ../dgit-maint-gbp.7.pod:136 #: ../dgit-maint-debrebase.7.pod:747 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:321 ../git-debrebase.1.pod:619 #: ../git-debrebase.5.pod:678 #, no-wrap msgid "SEE ALSO" msgstr "ZIE OOK" #. type: =head1 #: ../dgit.7:4 ../dgit-user.7.pod:27 ../dgit-nmu-simple.7.pod:35 #, no-wrap msgid "SUMMARY" msgstr "SAMENVATTING" #. type: textblock #: ../dgit-user.7.pod:3 msgid "dgit-user - making and sharing changes to Debian packages, with git" msgstr "" "dgit-user - maken en delen van wijzigingen aan Debian-pakketten, met git" #. type: =head1 #: ../dgit-user.7.pod:5 ../dgit-maint-native.7.pod:5 #: ../dgit-maint-merge.7.pod:5 ../dgit-maint-gbp.7.pod:5 #: ../dgit-maint-debrebase.7.pod:5 ../dgit-downstream-dsc.7.pod:5 #: ../git-debrebase.1.pod:10 ../git-debrebase.5.pod:5 msgid "INTRODUCTION" msgstr "INLEIDING" #. type: textblock #: ../dgit-user.7.pod:7 msgid "" "dgit lets you fetch the source code to every package on your system as if " "your distro used git to maintain all of it." msgstr "" "dgit laat u toe de broncode van elk pakket op uw systeem op te halen alsof " "uw distributie gebruik maakte van git om die allemaal te onderhouden." #. type: textblock #: ../dgit-user.7.pod:11 msgid "" "You can then edit it, build updated binary packages (.debs) and install and " "run them. You can also share your work with others." msgstr "" "U kunt deze broncode dan bewerken, bijgewerkte binaire pakketten (.deb's) " "bouwen en ze installeren en uitvoeren. U kunt uw werk ook delen met anderen." #. type: textblock #: ../dgit-user.7.pod:16 msgid "" "This tutorial gives some recipes and hints for this. It assumes you have " "basic familiarity with git. It does not assume any initial familiarity with " "Debian's packaging processes." msgstr "" "Deze handleiding geeft hiervoor enkele procedures en suggesties. Ze gaat " "ervan uit dat u beschikt over basale noties van git. Ze veronderstelt niet " "dat u enigszins vertrouwd bent met de processen van pakketbeheer van Debian." #. type: textblock #: ../dgit-user.7.pod:21 msgid "" "If you are a package maintainer within Debian; a DM or DD; and/or a sponsee: " "this tutorial is not for you. Try L, L, or L and L." msgstr "" "Indien u een pakketonderhouder bent binnen Debian, een Onderhouder (DM -" "Debian Maintainer) of Ontwikkelaar (DD - Debian Developper) van Debian, en/" "of iemand wiens werk gesponsord wordt, dan is deze handleiding niet voor u. " "Raadpleeg in dat geval L, L, of " "L en L." #. type: textblock #: ../dgit-user.7.pod:29 msgid "(These runes will be discussed later.)" msgstr "(Deze runen worden later besproken.)" #. type: verbatim #: ../dgit-user.7.pod:33 #, no-wrap msgid "" " % dgit clone glibc jessie,-security\n" " % cd glibc\n" " % curl 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u\n" " % git commit -a -m 'Fix libc lost output bug'\n" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" " % mk-build-deps --root-cmd=sudo --install\n" " % dpkg-buildpackage -uc -b\n" " % sudo dpkg -i ../libc6_*.deb\n" "\n" msgstr "" " % dgit clone glibc jessie,-security\n" " % cd glibc\n" " % curl 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u\n" " % git commit -a -m 'Reparatie van libc-bug waarbij verlies van uitvoer optreedt'\n" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" " % mk-build-deps --root-cmd=sudo --install\n" " % dpkg-buildpackage -uc -b\n" " % sudo dpkg -i ../libc6_*.deb\n" "\n" #. type: textblock #: ../dgit-user.7.pod:44 msgid "Occasionally:" msgstr "Sporadisch:" #. type: verbatim #: ../dgit-user.7.pod:48 ../dgit-user.7.pod:242 #, no-wrap msgid "" " % git clean -xdf\n" " % git reset --hard\n" "\n" msgstr "" " % git clean -xdf\n" " % git reset --hard\n" "\n" #. type: textblock #: ../dgit-user.7.pod:53 msgid "Later:" msgstr "Later:" #. type: verbatim #: ../dgit-user.7.pod:57 #, no-wrap msgid "" " % cd glibc\n" " % dgit pull jessie,-security\n" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" " % dpkg-buildpackage -uc -b\n" " % sudo dpkg -i ../libc6_*.deb\n" "\n" msgstr "" " % cd glibc\n" " % dgit pull jessie,-security\n" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" " % dpkg-buildpackage -uc -b\n" " % sudo dpkg -i ../libc6_*.deb\n" "\n" #. type: =head1 #: ../dgit-user.7.pod:65 msgid "FINDING THE RIGHT SOURCE CODE - DGIT CLONE" msgstr "DE JUISTE BRONCODE VINDEN - DGIT CLONE" #. type: verbatim #: ../dgit-user.7.pod:69 #, no-wrap msgid "" " % dgit clone glibc jessie,-security\n" " % cd glibc\n" "\n" msgstr "" " % dgit clone glibc jessie,-security\n" " % cd glibc\n" "\n" #. type: textblock #: ../dgit-user.7.pod:74 msgid "" "dgit clone needs to be told the source package name (which might be " "different to the binary package name, which was the name you passed to \"apt-" "get install\") and the codename or alias of the Debian release (this is " "called the \"suite\")." msgstr "" "Aan dgit clone moet de naam van het broncodepakket opgegeven worden (die kan " "verschillen van de naam van het binaire pakket; het was deze laatste naam " "die u opgaf aan \"apt-get install\") en de codenaam of de alias van de " "Debian-release (welke men de \"suite\" noemt)" #. type: =head2 #: ../dgit-user.7.pod:80 msgid "Finding the source package name" msgstr "De naam van het broncodepakket te weten komen" #. type: textblock #: ../dgit-user.7.pod:82 msgid "" "For many packages, the source package name is obvious. Otherwise, if you " "know a file that's in the package, you can look it up with dpkg:" msgstr "" "Bij veel pakketten is de naam van het broncodepakket voor de hand liggend. " "Anders kunt u hem opzoeken met dpkg, indien u een bestand kent dat in het " "pakket zit:" #. type: verbatim #: ../dgit-user.7.pod:88 #, no-wrap msgid "" " % dpkg -S /lib/i386-linux-gnu/libc.so.6 \n" " libc6:i386: /lib/i386-linux-gnu/libc.so.6\n" " % dpkg -s libc6:i386\n" " Package: libc6\n" " Status: install ok installed\n" " ...\n" " Source: glibc\n" "\n" msgstr "" " % dpkg -S /lib/i386-linux-gnu/libc.so.6 \n" " libc6:i386: /lib/i386-linux-gnu/libc.so.6\n" " % dpkg -s libc6:i386\n" " Package (Pakket): libc6\n" " Status (Toestand): install ok installed (geïnstalleerd)\n" " ...\n" " Source (Bron): glibc\n" "\n" #. type: textblock #: ../dgit-user.7.pod:98 msgid "" "(In this example, libc6 is a \"multi-arch: allowed\" package, which means " "that it exists in several different builds for different architectures. " "That's where C<:i386> comes from.)" msgstr "" "(In dit voorbeeld is\n" "libc6 een pakket van het type \"multi-arch: allowed\",\n" "hetgeen betekent dat het voorkomt in verschillende andere vormen/" "compilaties\n" "voor verschillende architecturen.\n" "Daarvandaan komt C<:i386>.)" #. type: =head2 #: ../dgit-user.7.pod:104 msgid "Finding the Debian release (the \"suite\")" msgstr "De Debian-release (de \"suite\") te weten komen" #. type: textblock #: ../dgit-user.7.pod:106 msgid "" "Internally, Debian (and derived) distros normally refer to their releases by " "codenames. Debian also has aliases which refer to the current stable " "release etc. So for example, at the time of writing Debian C " "(Debian 8) is Debian C; and the current version of Ubuntu is " "C (Yakkety Yak, 16.10). You can specify either the codename " "C or the alias C. If you don't say, you get C, which " "is Debian C - the main work-in progress branch." msgstr "" "Intern verwijzen Debian (en de ervan afgeleide distributies) gewoonlijk naar " "hun releases met een codenaam. Debian gebruikt ook aliassen die verwijzen " "naar de huidige stabiele release, enz. Bijvoorbeeld, bij het schrijven van " "deze handleiding was Debian C (Debian 8) Debian C (de " "stabiele uitgave van Debian), en was de actuele versie van Ubuntu C " "(Yakkety Yak, 16.10). U kunt zowel de codenaam C als de alias " "C opgeven. Indien u niets opgeeft, dan krijgt u C, welke Debian " "C is - de centrale tak van de voortgaande ontwikkeling." #. type: textblock #: ../dgit-user.7.pod:117 msgid "If you don't know what you're running, try this:" msgstr "" "Indien u niet weet met welke suite u werkt, kunt u het volgende gebruiken:" #. type: verbatim #: ../dgit-user.7.pod:121 #, no-wrap msgid "" " % grep '^deb' /etc/apt/sources.list\n" " deb http://the.earth.li/debian/ jessie main non-free contrib\n" " ...\n" " %\n" "\n" msgstr "" " % grep '^deb' /etc/apt/sources.list\n" " deb http://the.earth.li/debian/ jessie main non-free contrib\n" " ...\n" " %\n" "\n" #. type: textblock #: ../dgit-user.7.pod:128 msgid "" "For Debian, you should add C<,-security> to the end of the suite name, " "unless you're on unstable or testing. Hence, in our example C " "becomes C. (Yes, with a comma.)" msgstr "" "Voor Debian moet u aan het eind van de naam van de suite C<,-security> " "toevoegen, tenzij u met de suite unstable of testing werkt. Dus in ons " "voorbeeld wordt C C. (Wel degelijk met de komma.)" #. type: =head1 #: ../dgit-user.7.pod:135 msgid "WHAT DGIT CLONE PRODUCES" msgstr "WAT DGIT CLONE AANMAAKT" #. type: =head2 #: ../dgit-user.7.pod:137 msgid "What branches are there" msgstr "Welke takken er zijn" #. type: textblock #: ../dgit-user.7.pod:139 msgid "" "dgit clone will give you a new working tree, and arrange for you to be on a " "branch named like C (yes, with a comma in the branch " "name)." msgstr "" "dgit clone zal voor u een verse werkkopie aanmaken en ervoor zorgen dat u " "zich bevindt op een tak met een naam als C " "(inderdaad, met een komma in de naam van de tak)." #. type: textblock #: ../dgit-user.7.pod:143 msgid "" "For each release (like C) there is a tracking branch for the " "contents of the archive, called C (and similarly " "for other suites). This can be updated with C. This, " "the I, is synthesized by your local copy of dgit. It " "is fast forwarding." msgstr "" "Voor elke release (zoals C) bestaat een meelopende tak voor de " "inhoud van het archief, genoemd C (en net zo voor " "andere suites). Deze kan bijgewerkt worden met C. Deze, " "de I<\"remote\" suitetak>, wordt samengesteld door uw lokale kopie van dgit. " "Een lineaire veranderingsgeschiedenis wordt opgebouwd (N.v.d.V.: fast " "forwarding in git-terminologie)." #. type: textblock #: ../dgit-user.7.pod:152 msgid "" "Debian separates out the security updates, into C<*-security>. Telling dgit " "C means that it should include any updates available in " "C. The comma notation is a request to dgit to track " "jessie, or jessie-security if there is an update for the package there." msgstr "" "De veiligheidsupdates worden door Debian afgezonderd in C<*-security>. Aan " "dgit de opdracht C geven, betekent dat het de eventueel " "in C aanwezige updates moet opnemen. De notatie met de " "komma houdt de vraag aan dgit in om jessie op te volgen of jessie-security " "als zich daarin een update voor het pakket bevindt." #. type: textblock #: ../dgit-user.7.pod:158 msgid "" "(You can also dgit fetch in a tree that wasn't made by dgit clone. If " "there's no C you'll have to supply a C<-p>I " "option to dgit fetch.)" msgstr "" "(U kunt ook het commando dgit fetch gebruiken in een mappenboom die niet " "door git clone aangemaakt werd. Indien daarin geen C " "aanwezig is, zult u met dgit fetch de optie C<-p>I moeten gebruiken.)" #. type: =head2 #: ../dgit-user.7.pod:162 msgid "What kind of source tree do you get" msgstr "Welk soort broncodeboom u verkrijgt" #. type: textblock #: ../dgit-user.7.pod:164 msgid "" "If the Debian package is based on some upstream release, the code layout " "should be like the upstream version. You should find C helpful to " "find where to edit." msgstr "" "Indien het Debian-pakket gebaseerd is op een release van een toeleveraar, " "dan zal de indeling van de broncode eruit zien als die van de versie van de " "toeleveraar. U kunt zich laten helpen door C om uit te zoeken waar " "u met bewerken wilt beginnen." #. type: textblock #: ../dgit-user.7.pod:168 msgid "" "The package's Debian metadata and the scripts for building binary packages " "are under C. C, C and C are the starting points. The Debian Policy Manual has most of the in-" "depth technical details." msgstr "" "De metagegevens van Debian over het pakket en de scripts voor het bouwen van " "de binaire pakketten bevinden zich in C. Aanknopingspunten zijn " "C, C en C. In het " "beleidshandboek van Debian vindt u meestal de nodige diepgaande technische " "informatie." #. type: textblock #: ../dgit-user.7.pod:175 msgid "" "For many Debian packages, there will also be some things in C. It is best to ignore these. Insofar as they are relevant the changes " "there will have been applied to the actual files, probably by means of " "actual comments in the git history. The contents of debian/patches are " "ignored when building binaries from dgitish git branches." msgstr "" "Bij veel Debian-pakketten zijn ook zaken te vinden in C. U " "kunt deze best negeren. Voor zover deze relevant zijn, zullen deze toegepast " "zijn in de eigenlijke bestanden, vermoedelijk via feitelijke commentaren in " "de git-geschiedenis. Wanneer binaire pakketten gebouwd worden vanuit met " "dgit verkregen git-takken, wordt de inhoud van debian/patches genegeerd." #. type: textblock #: ../dgit-user.7.pod:185 msgid "" "(For Debian afficionados: the git trees that come out of dgit are \"patches-" "applied packaging branches without a .pc directory\".)" msgstr "" "(Voor Debian-ingewijden: de git-boomstructuren die met dgit verkregen worden " "zijn \"verpakkingstakken met toegepaste patches, maar zonder .pc-map\".)" #. type: =head2 #: ../dgit-user.7.pod:190 msgid "What kind of history you get" msgstr "Welk soort geschiedenis u verkrijgt" #. type: textblock #: ../dgit-user.7.pod:192 msgid "" "If you're lucky, the history will be a version of, or based on, the Debian " "maintainer's own git history, or upstream's git history." msgstr "" "Indien u geluk heeft, zal de geschiedenis een versie zijn van, of gebaseerd " "zijn op de eigen git-geschiedenis van de pakketonderhouder van Debian, of " "van de git-geschiedenis van de toeleveraar." #. type: textblock #: ../dgit-user.7.pod:197 msgid "" "But for many packages the real git history does not exist, or has not been " "published in a dgitish form. So you may find that the history is a rather " "short history invented by dgit." msgstr "" "Maar van veel pakketten bestaat geen echte git-geschiedenis of werd die niet " "in een dgit-achtige vorm gepubliceerd. Het is dus mogelijk dat u vaststelt " "dat de geschiedenis eerder kort is en door dgit bedacht." #. type: textblock #: ../dgit-user.7.pod:203 msgid "" "dgit histories often contain automatically-generated commits, including " "commits which make no changes but just serve to make a rebasing branch fast-" "forward. This is particularly true of combining branches like C." msgstr "" "dgit-geschiedenissen bevatten vaak automatisch gegenereerde vastleggingen " "(commits), met inbegrip van vastleggingen die geen wijzigingen aanbrengen, " "maar enkel dienen om een zich herintegrerende aftakking in te passen in de " "lineaire vorm van de veranderingsgeschiedenis (N.v.d.V.: \"make a rebasing " "branch fast-forward\" in git-terminologie). Dit is in het bijzonder het " "geval bij gecombineerde takken zoals C." #. type: textblock #: ../dgit-user.7.pod:210 msgid "" "If the package maintainer is using git then after dgit clone you may find " "that there is a useful C remote referring to the Debian package " "maintainer's repository for the package. You can see what's there with " "C. But use what you find there with care: Debian " "maintainers' git repositories often have contents which are very confusing " "and idiosyncratic. In particular, you may need to manually apply the " "patches that are in debian/patches before you do anything else!" msgstr "" "Indien de pakketonderhouder gebruik maakt van git, dan kunt u na een dgit " "clone een handig C remote opmerken, wat verwijst naar het git-" "archief waarvan de pakketonderhouder gebruik maakt voor het pakket. U kunt " "zien wat zich daar bevindt met C. Maar gebruik wat u daar " "vindt met zorg: de git-archieven van onderhouders van Debian bevatten vaak " "zaken die erg verwarrend en zonderling kunnen zijn. In het bijzonder zult u " "mogelijk handmatig de patches moeten toepassen die zich in debian/patches " "bevinden voor u iets anders doet!" #. type: =head1 #: ../dgit-user.7.pod:222 ../dgit-maint-gbp.7.pod:56 msgid "BUILDING" msgstr "BOUWPROCES" #. type: =head2 #: ../dgit-user.7.pod:224 msgid "Always commit before building" msgstr "" "Leg steeds veranderingen vast (N.v.d.V.: \"commit\" in git-terminologie) " "voor u begint te bouwen" #. type: verbatim #: ../dgit-user.7.pod:228 #, no-wrap msgid "" " % wget 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u\n" " % git commit -a -m 'Fix libc lost output bug'\n" "\n" msgstr "" " % wget 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u\n" " % git commit -a -m 'Reparatie van libc-bug waarbij verlies van uitvoer optreedt'\n" "\n" #. type: textblock #: ../dgit-user.7.pod:233 msgid "" "Debian package builds are often quite messy: they may modify files which are " "also committed to git, or leave outputs and temporary files not covered by " "C<.gitignore>." msgstr "" "Het bouwproces van een Debian-pakket verloopt vaak erg rommelig: het kan " "bestanden wijzigen die ook vastgelegd zijn in git of uitvoer en tijdelijke " "bestanden achterlaten die niet door C<.gitignore> afgedekt zijn." #. type: textblock #: ../dgit-user.7.pod:237 msgid "If you always commit, you can use" msgstr "Indien u steeds een vastlegging doet, kunt u gebruik maken van" #. type: textblock #: ../dgit-user.7.pod:247 msgid "" "to tidy up after a build. (If you forgot to commit, don't use those " "commands; instead, you may find that you can use C to help " "commit what you actually wanted to keep.)" msgstr "" "om na het bouwproces een opruimactie te doen. (Indien u vergat vast te " "leggen, gebruik dan deze commando's niet; in de plaats kunt u misschien " "C gebruiken om te helpen vastleggen wat u werkelijk wenst te " "bewaren.)" #. type: textblock #: ../dgit-user.7.pod:252 msgid "" "These are destructive commands which delete all new files (so you B " "remember to say C) and throw away edits to every file (so you " "B remember to commit)." msgstr "" "Dit zijn verwoestende commando's die alle nieuwe bestanden wissen (dus " "B u eraan denken om C) uit te voeren) en elke aanpassing aan " "een bestand weggooien (u B er dus aan denken om een vastlegging uit te " "voeren)." #. type: =head2 #: ../dgit-user.7.pod:257 msgid "Update the changelog (at least once) before building" msgstr "Werk het bestand changelog (minstens eenmaal) bij voor u bouwt" #. type: verbatim #: ../dgit-user.7.pod:261 #, no-wrap msgid "" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" "\n" msgstr "" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" "\n" #. type: textblock #: ../dgit-user.7.pod:265 msgid "" "The binaries you build will have a version number which ultimately comes " "from the C. You want to be able to tell your binaries " "apart from your distro's." msgstr "" "De binaire pakketten welke u bouwt zullen een versienummer hebben dat " "uiteindelijk afkomstig is uit het bestand C. U wilt toch " "uw binaire pakketten kunnen onderscheiden van die van uw distributie." #. type: textblock #: ../dgit-user.7.pod:270 msgid "" "So you should update C to add a new stanza at the top, for " "your build." msgstr "" "En dus moet u C bijwerken en er bovenaan een item " "toevoegen voor u de bouw uitvoert." #. type: textblock #: ../dgit-user.7.pod:274 msgid "" "This rune provides an easy way to do this. It adds a new changelog entry " "with an uninformative message and a plausible version number (containing a " "bit of your git commit id)." msgstr "" "Deze rune geeft een makkelijke manier om dit te doen. Het voegt een nieuw " "item toe aan changelog met een niet-informatieve mededeling en een plausibel " "versienummer (dat een stukje van het id van uw vastlegging bevat)." #. type: textblock #: ../dgit-user.7.pod:279 msgid "" "If you want to be more sophisticated, the package C has a good " "Emacs mode for editing changelogs. Alternatively, you could edit the " "changelog with another text editor, or run C or C with " "different options. Choosing a good version number is slightly tricky and a " "complete treatment is beyond the scope of this tutorial." msgstr "" "Indien u een meer gesofisticeerde manier wilt, biedt het pakket C een goede Emacs-modus voor het bewerken van changelogs. U kunt anders de " "changelog ook bewerken met een andere teksteditor, of C of C " "uitvoeren met verschillende opties. Het kiezen van een goed versienummer is " "een beetje een netelige kwestie en een volledige behandeling van dit " "onderwerp valt buiten het bestek van deze handleiding." #. type: =head2 #: ../dgit-user.7.pod:287 msgid "Actually building" msgstr "Het eigenlijke bouwen" #. type: verbatim #: ../dgit-user.7.pod:291 #, no-wrap msgid "" " % mk-build-deps --root-cmd=sudo --install\n" " % dpkg-buildpackage -uc -b\n" "\n" msgstr "" " % mk-build-deps --root-cmd=sudo --install\n" " % dpkg-buildpackage -uc -b\n" "\n" #. type: textblock #: ../dgit-user.7.pod:296 msgid "" "dpkg-buildpackage is the primary tool for building a Debian source package. " "C<-uc> means not to pgp-sign the results. C<-b> means build all binary " "packages, but not to build a source package." msgstr "" "dpkg-buildpackage is het belangrijkste gereedschap voor het bouwen van een " "Debian-broncodepakket. C<-uc> betekent: geen pgp-ondertekening toevoegen aan " "de resultaten. C<-b> betekent: alle binaire pakketten bouwen, maar geen " "broncodepakket." #. type: =head2 #: ../dgit-user.7.pod:302 msgid "Using sbuild" msgstr "Gebruik maken van sbuild" #. type: textblock #: ../dgit-user.7.pod:304 msgid "" "You can build in an schroot chroot, with sbuild, instead of in your main " "environment. (sbuild is used by the Debian build daemons.)" msgstr "" "In plaats van in uw hoofdomgeving, kunt u de bouw uitvoeren in een \"schroot " "chroot\" met sbuild (sbuild wordt door de build-achtergronddiensten van " "Debian gebruikt.)" #. type: verbatim #: ../dgit-user.7.pod:309 #, no-wrap msgid "" " % git clean -xdf\n" " % sbuild -c jessie -A --no-clean-source \\\n" " --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn'\n" "\n" msgstr "" " % git clean -xdf\n" " % sbuild -c jessie -A --no-clean-source \\\n" " --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn'\n" "\n" #. type: textblock #: ../dgit-user.7.pod:315 msgid "" "Note that this will seem to leave a \"source package\" (.dsc and .tar.gz) " "in the parent directory, but that source package should not be used. It is " "likely to be broken. For more information see Debian bug #868527." msgstr "" "Merk op dat dit een \"broncodepakket\" (.dsc en .tar.gz) lijkt achter te " "laten in de bovenliggende map, maar u moet dit broncodepakket niet " "gebruiken. Waarschijnlijk is het defect. Zie voor bijkomende informatie " "Debian-bug #868527." #. type: =head1 #: ../dgit-user.7.pod:322 msgid "INSTALLING" msgstr "INSTALLEREN" #. type: =head2 #: ../dgit-user.7.pod:324 msgid "Debian Jessie or older" msgstr "Debian Jessie of eerder" #. type: verbatim #: ../dgit-user.7.pod:328 #, no-wrap msgid "" " % sudo dpkg -i ../libc6_*.deb\n" "\n" msgstr "" " % sudo dpkg -i ../libc6_*.deb\n" "\n" #. type: textblock #: ../dgit-user.7.pod:332 msgid "" "You can use C to install the .debs that came out of your package." msgstr "" "U kunt C gebruiken om de .deb-bestanden te installeren die uit uw " "pakket voortkwamen." #. type: textblock #: ../dgit-user.7.pod:335 msgid "" "If the dependencies aren't installed, you will get an error, which can " "usually be fixed with C." msgstr "" "Indien de vereisten niet geïnstalleerd zijn, zult u een foutmelding krijgen " "die gewoonlijk gerepareerd kan worden met C." #. type: =head2 #: ../dgit-user.7.pod:339 msgid "Debian Stretch or newer" msgstr "Debian Stretch of later" #. type: verbatim #: ../dgit-user.7.pod:343 #, no-wrap msgid "" " % sudo apt install ../libc6_*.deb\n" "\n" msgstr "" " % sudo apt install ../libc6_*.deb\n" "\n" #. type: =head1 #: ../dgit-user.7.pod:347 msgid "Multiarch" msgstr "Multiarch" #. type: textblock #: ../dgit-user.7.pod:349 msgid "" "If you're working on a library package and your system has multiple " "architectures enabled, you may see something like this:" msgstr "" "Indien u aan een bibliotheekpakket werkt en op uw systeem multi-" "architectuurondersteuning geactiveerd is, krijgt u mogelijk iets te zien als " "dit:" #. type: verbatim #: ../dgit-user.7.pod:355 #, no-wrap msgid "" " dpkg: error processing package libpcre3-dev:amd64 (--configure):\n" " package libpcre3-dev:amd64 2:8.39-3~3.gbp8f25f5 cannot be configured because libpcre3-dev:i386 is at a different version (2:8.39-2)\n" "\n" msgstr "" " dpkg: fout bij verwerken van pakket libpcre3-dev:amd64 (--configure):\n" " pakket libpcre3-dev:amd64 2:8.39-3~3.gbp8f25f5 kan niet geconfigureerd worden omdat libpcre3-dev:i386 een andere versie (2:8.39-2) heeft\n" "\n" #. type: textblock #: ../dgit-user.7.pod:360 msgid "" "The multiarch system used by Debian requires each package which is present " "for multiple architectures to be exactly the same across all the " "architectures for which it is installed." msgstr "" "Het multi-architectuursysteem dat door Debian toegepast wordt, vereist dat " "elk pakket dat voor meerdere architecturen aanwezig is, exact hetzelfde is " "bij alle architecturen waarvoor het geïnstalleerd is." #. type: textblock #: ../dgit-user.7.pod:364 msgid "" "The proper solution is to build the package for all the architectures you " "have enabled. You'll need a chroot for each of the secondary " "architectures. This is somewhat tiresome, even though Debian has excellent " "tools for managing chroots. C from the " "package of the same name and C from the C " "package are good starting points." msgstr "" "De geëigende oplossing is om het pakket te bouwen voor alle architecturen " "die u geactiveerd heeft. U zult een chroot nodig hebben voor elk van de " "secundaire architecturen. Dit is enigszins vermoeiend, ook al beschikt " "Debian over uitstekende hulpmiddelen voor het beheren van chroots. Goede " "aanknopingspunten zijn C uit het pakket met " "dezelfde naam en C uit het pakket C." #. type: textblock #: ../dgit-user.7.pod:374 msgid "" "Otherwise you could deinstall the packages of interest for those other " "architectures with something like C." msgstr "" "Een andere mogelijkheid is dat u de betreffende pakketten bij de andere " "architecturen de-installeert met iets zoals C." #. type: textblock #: ../dgit-user.7.pod:378 msgid "" "If neither of those are an option, your desperate last resort is to try " "using the same version number as the official package for your own package. " "(The version is controlled by C - see above.) This is not " "ideal because it makes it hard to tell what is installed, and because it " "will mislead and confuse apt." msgstr "" "Indien geen van beide mogelijkheden een optie is, dan is een mogelijke " "laatste wanhoopsdaad, voor uw eigen pakket hetzelfde versienummer gebruiken " "als van het officiële pakket. Dit is niet ideaal omdat dit het moeilijk " "maakt om te weten wat geïnstalleerd is, en omdat het apt zal misleiden en in " "de war brengen." #. type: textblock #: ../dgit-user.7.pod:386 msgid "With the \"same number\" approach you may still get errors like" msgstr "" "Met de \"hetzelfde-nummer\"-benadering kunt u nog steeds foutmeldingen " "krijgen zoals" #. type: textblock #: ../dgit-user.7.pod:390 msgid "" "trying to overwrite shared '/usr/include/pcreposix.h', which is different " "from other instances of package libpcre3-dev" msgstr "" "poging tot overschrijven van gedeelde '/usr/include/pcreposix.h', welke " "verschilt van andere exemplaren van pakket libpcre3-dev" #. type: textblock #: ../dgit-user.7.pod:394 msgid "" "but passing C<--force-overwrite> to dpkg will help - assuming you know what " "you're doing." msgstr "" "maar de optie C<--force-overwrite> meegeven aan dpkg zal helpen - in de " "veronderstelling dat u weet wat u doet." #. type: =head1 #: ../dgit-user.7.pod:397 msgid "SHARING YOUR WORK" msgstr "UW WERK DELEN" #. type: textblock #: ../dgit-user.7.pod:399 msgid "" "The C branch (or whatever) is a normal git branch. " "You can use C to publish it on any suitable git server." msgstr "" "De tak C (of wat dan ook) is een gewone git-tak. U " "kunt C gebruiken om hem te publiceren op elke geschikte git-server." #. type: textblock #: ../dgit-user.7.pod:402 msgid "" "Anyone who gets that git branch from you will be able to build binary " "packages (.deb) just as you did." msgstr "" "Iedereen die deze git-tak van u krijgt, zal in staat zijn om binaire " "pakketten (.deb) te bouwen, zoals u het deed." #. type: textblock #: ../dgit-user.7.pod:406 msgid "" "If you want to contribute your changes back to Debian, you should probably " "send them as attachments to an email to the L (either a followup to an existing bug, or a new bug). Patches " "in C format are usually very welcome." msgstr "" "Indien u uw wijzigingen terug wilt bijdragen aan Debian, dan zult u ze " "wellicht als bijlage bij een e-mail moeten sturen naar het L (ofwel als opvolging van een " "bestaande bug, of als een nieuwe bug). Patches in de indeling C zijn gewoonlijk erg welkom." #. type: =head2 #: ../dgit-user.7.pod:413 msgid "Source packages" msgstr "Broncodepakketten" #. type: textblock #: ../dgit-user.7.pod:415 msgid "" "The git branch is not sufficient to build a source package the way Debian " "does. Source packages are somewhat awkward to work with. Indeed many " "plausible git histories or git trees cannot be converted into a suitable " "source package. So I recommend you share your git branch instead." msgstr "" "De git-tak volstaat niet om een broncodepakket te bouwen volgens de manier " "van Debian. Broncodepakketten zijn wat lastig om ermee te werken. Vele " "aannemelijke git-geschiedenissen of git-bomen kunnen namelijk niet omgezet " "worden naar een geschikt broncodepakket. Dus beveel ik aan om in de plaats " "daarvan uw git-tak te delen." #. type: textblock #: ../dgit-user.7.pod:423 msgid "" "If a git branch is not enough, and you need to provide a source package but " "don't care about its format/layout (for example because some software you " "have consumes source packages, not git histories) you can use this recipe " "to generate a C<3.0 (native)> source package, which is just a tarball with " "accompanying .dsc metadata file:" msgstr "" "Indien een git-tak niet voldoende is en u een broncodepakket moet " "aanleveren, maar het formaat/de indeling ervan niet van belang is " "(bijvoorbeeld omdat u bepaalde software heeft die met broncodepakketten " "werkt en niet met git-geschiedenissen), kunt u deze methode gebruiken om een " "broncodepakket van het type C<3.0 (native)> te genereren. Dit is niet meer " "dan een tar-archief met een bijhorend .dsc-metadatabestand:" #. type: verbatim #: ../dgit-user.7.pod:434 #, no-wrap msgid "" " % echo '3.0 (native)' >debian/source/format\n" " % git commit -m 'switch to native source format' debian/source/format\n" " % dgit -wgf build-source\n" "\n" msgstr "" " % echo '3.0 (native)' >debian/source/format\n" " % git commit -m 'overgang naar de broncode-indeling native' debian/source/format\n" " % dgit -wgf build-source\n" "\n" #. type: textblock #: ../dgit-user.7.pod:440 msgid "" "If you need to provide a good-looking source package, be prepared for a lot " "more work. You will need to read much more, perhaps starting with L, L or L" msgstr "" "Indien u een goed ogend broncodepakket moet aanleveren, dan zult u bereid " "moeten zijn er heel wat meer werk in te investeren. U zult heel wat meer " "moeten lezen, misschien te beginnen bij L, L of L" #. type: textblock #: ../dgit-user.7.pod:449 ../dgit-maint-native.7.pod:128 #: ../dgit-maint-merge.7.pod:493 ../dgit-maint-gbp.7.pod:138 msgid "dgit(1), dgit(7)" msgstr "dgit(1), dgit(7)" work/po4a/dgit-user_7.pot0000644000000000000000000004734414761250142012464 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2019-03-01 16:59+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1470 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:126 #: ../dgit-maint-merge.7.pod:491 ../dgit-maint-gbp.7.pod:136 #: ../dgit-maint-debrebase.7.pod:747 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:321 ../git-debrebase.1.pod:619 #: ../git-debrebase.5.pod:678 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit.7:4 ../dgit-user.7.pod:27 ../dgit-nmu-simple.7.pod:35 #, no-wrap msgid "SUMMARY" msgstr "" #. type: textblock #: ../dgit-user.7.pod:3 msgid "dgit-user - making and sharing changes to Debian packages, with git" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:5 ../dgit-maint-native.7.pod:5 #: ../dgit-maint-merge.7.pod:5 ../dgit-maint-gbp.7.pod:5 #: ../dgit-maint-debrebase.7.pod:5 ../dgit-downstream-dsc.7.pod:5 #: ../git-debrebase.1.pod:10 ../git-debrebase.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: textblock #: ../dgit-user.7.pod:7 msgid "" "dgit lets you fetch the source code to every package on your system as if " "your distro used git to maintain all of it." msgstr "" #. type: textblock #: ../dgit-user.7.pod:11 msgid "" "You can then edit it, build updated binary packages (.debs) and install and " "run them. You can also share your work with others." msgstr "" #. type: textblock #: ../dgit-user.7.pod:16 msgid "" "This tutorial gives some recipes and hints for this. It assumes you have " "basic familiarity with git. It does not assume any initial familiarity with " "Debian's packaging processes." msgstr "" #. type: textblock #: ../dgit-user.7.pod:21 msgid "" "If you are a package maintainer within Debian; a DM or DD; and/or a sponsee: " "this tutorial is not for you. Try L, L, or L and L." msgstr "" #. type: textblock #: ../dgit-user.7.pod:29 msgid "(These runes will be discussed later.)" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:33 #, no-wrap msgid "" " % dgit clone glibc jessie,-security\n" " % cd glibc\n" " % curl 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u\n" " % git commit -a -m 'Fix libc lost output bug'\n" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" " % mk-build-deps --root-cmd=sudo --install\n" " % dpkg-buildpackage -uc -b\n" " % sudo dpkg -i ../libc6_*.deb\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:44 msgid "Occasionally:" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:48 ../dgit-user.7.pod:242 #, no-wrap msgid "" " % git clean -xdf\n" " % git reset --hard\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:53 msgid "Later:" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:57 #, no-wrap msgid "" " % cd glibc\n" " % dgit pull jessie,-security\n" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" " % dpkg-buildpackage -uc -b\n" " % sudo dpkg -i ../libc6_*.deb\n" "\n" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:65 msgid "FINDING THE RIGHT SOURCE CODE - DGIT CLONE" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:69 #, no-wrap msgid "" " % dgit clone glibc jessie,-security\n" " % cd glibc\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:74 msgid "" "dgit clone needs to be told the source package name (which might be " "different to the binary package name, which was the name you passed to \"apt-" "get install\") and the codename or alias of the Debian release (this is " "called the \"suite\")." msgstr "" #. type: =head2 #: ../dgit-user.7.pod:80 msgid "Finding the source package name" msgstr "" #. type: textblock #: ../dgit-user.7.pod:82 msgid "" "For many packages, the source package name is obvious. Otherwise, if you " "know a file that's in the package, you can look it up with dpkg:" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:88 #, no-wrap msgid "" " % dpkg -S /lib/i386-linux-gnu/libc.so.6 \n" " libc6:i386: /lib/i386-linux-gnu/libc.so.6\n" " % dpkg -s libc6:i386\n" " Package: libc6\n" " Status: install ok installed\n" " ...\n" " Source: glibc\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:98 msgid "" "(In this example, libc6 is a \"multi-arch: allowed\" package, which means " "that it exists in several different builds for different architectures. " "That's where C<:i386> comes from.)" msgstr "" #. type: =head2 #: ../dgit-user.7.pod:104 msgid "Finding the Debian release (the \"suite\")" msgstr "" #. type: textblock #: ../dgit-user.7.pod:106 msgid "" "Internally, Debian (and derived) distros normally refer to their releases by " "codenames. Debian also has aliases which refer to the current stable " "release etc. So for example, at the time of writing Debian C " "(Debian 8) is Debian C; and the current version of Ubuntu is " "C (Yakkety Yak, 16.10). You can specify either the codename " "C or the alias C. If you don't say, you get C, which " "is Debian C - the main work-in progress branch." msgstr "" #. type: textblock #: ../dgit-user.7.pod:117 msgid "If you don't know what you're running, try this:" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:121 #, no-wrap msgid "" " % grep '^deb' /etc/apt/sources.list\n" " deb http://the.earth.li/debian/ jessie main non-free contrib\n" " ...\n" " %\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:128 msgid "" "For Debian, you should add C<,-security> to the end of the suite name, " "unless you're on unstable or testing. Hence, in our example C " "becomes C. (Yes, with a comma.)" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:135 msgid "WHAT DGIT CLONE PRODUCES" msgstr "" #. type: =head2 #: ../dgit-user.7.pod:137 msgid "What branches are there" msgstr "" #. type: textblock #: ../dgit-user.7.pod:139 msgid "" "dgit clone will give you a new working tree, and arrange for you to be on a " "branch named like C (yes, with a comma in the branch " "name)." msgstr "" #. type: textblock #: ../dgit-user.7.pod:143 msgid "" "For each release (like C) there is a tracking branch for the " "contents of the archive, called C (and similarly " "for other suites). This can be updated with C. This, " "the I, is synthesized by your local copy of dgit. It " "is fast forwarding." msgstr "" #. type: textblock #: ../dgit-user.7.pod:152 msgid "" "Debian separates out the security updates, into C<*-security>. Telling dgit " "C means that it should include any updates available in " "C. The comma notation is a request to dgit to track " "jessie, or jessie-security if there is an update for the package there." msgstr "" #. type: textblock #: ../dgit-user.7.pod:158 msgid "" "(You can also dgit fetch in a tree that wasn't made by dgit clone. If " "there's no C you'll have to supply a C<-p>I " "option to dgit fetch.)" msgstr "" #. type: =head2 #: ../dgit-user.7.pod:162 msgid "What kind of source tree do you get" msgstr "" #. type: textblock #: ../dgit-user.7.pod:164 msgid "" "If the Debian package is based on some upstream release, the code layout " "should be like the upstream version. You should find C helpful to " "find where to edit." msgstr "" #. type: textblock #: ../dgit-user.7.pod:168 msgid "" "The package's Debian metadata and the scripts for building binary packages " "are under C. C, C and C are the starting points. The Debian Policy Manual has most of the in-" "depth technical details." msgstr "" #. type: textblock #: ../dgit-user.7.pod:175 msgid "" "For many Debian packages, there will also be some things in C. It is best to ignore these. Insofar as they are relevant the changes " "there will have been applied to the actual files, probably by means of " "actual comments in the git history. The contents of debian/patches are " "ignored when building binaries from dgitish git branches." msgstr "" #. type: textblock #: ../dgit-user.7.pod:185 msgid "" "(For Debian afficionados: the git trees that come out of dgit are \"patches-" "applied packaging branches without a .pc directory\".)" msgstr "" #. type: =head2 #: ../dgit-user.7.pod:190 msgid "What kind of history you get" msgstr "" #. type: textblock #: ../dgit-user.7.pod:192 msgid "" "If you're lucky, the history will be a version of, or based on, the Debian " "maintainer's own git history, or upstream's git history." msgstr "" #. type: textblock #: ../dgit-user.7.pod:197 msgid "" "But for many packages the real git history does not exist, or has not been " "published in a dgitish form. So you may find that the history is a rather " "short history invented by dgit." msgstr "" #. type: textblock #: ../dgit-user.7.pod:203 msgid "" "dgit histories often contain automatically-generated commits, including " "commits which make no changes but just serve to make a rebasing branch fast-" "forward. This is particularly true of combining branches like C." msgstr "" #. type: textblock #: ../dgit-user.7.pod:210 msgid "" "If the package maintainer is using git then after dgit clone you may find " "that there is a useful C remote referring to the Debian package " "maintainer's repository for the package. You can see what's there with " "C. But use what you find there with care: Debian " "maintainers' git repositories often have contents which are very confusing " "and idiosyncratic. In particular, you may need to manually apply the " "patches that are in debian/patches before you do anything else!" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:222 ../dgit-maint-gbp.7.pod:56 msgid "BUILDING" msgstr "" #. type: =head2 #: ../dgit-user.7.pod:224 msgid "Always commit before building" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:228 #, no-wrap msgid "" " % wget 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u\n" " % git commit -a -m 'Fix libc lost output bug'\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:233 msgid "" "Debian package builds are often quite messy: they may modify files which are " "also committed to git, or leave outputs and temporary files not covered by " "C<.gitignore>." msgstr "" #. type: textblock #: ../dgit-user.7.pod:237 msgid "If you always commit, you can use" msgstr "" #. type: textblock #: ../dgit-user.7.pod:247 msgid "" "to tidy up after a build. (If you forgot to commit, don't use those " "commands; instead, you may find that you can use C to help " "commit what you actually wanted to keep.)" msgstr "" #. type: textblock #: ../dgit-user.7.pod:252 msgid "" "These are destructive commands which delete all new files (so you B " "remember to say C) and throw away edits to every file (so you " "B remember to commit)." msgstr "" #. type: =head2 #: ../dgit-user.7.pod:257 msgid "Update the changelog (at least once) before building" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:261 #, no-wrap msgid "" " % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:265 msgid "" "The binaries you build will have a version number which ultimately comes " "from the C. You want to be able to tell your binaries " "apart from your distro's." msgstr "" #. type: textblock #: ../dgit-user.7.pod:270 msgid "" "So you should update C to add a new stanza at the top, for " "your build." msgstr "" #. type: textblock #: ../dgit-user.7.pod:274 msgid "" "This rune provides an easy way to do this. It adds a new changelog entry " "with an uninformative message and a plausible version number (containing a " "bit of your git commit id)." msgstr "" #. type: textblock #: ../dgit-user.7.pod:279 msgid "" "If you want to be more sophisticated, the package C has a good " "Emacs mode for editing changelogs. Alternatively, you could edit the " "changelog with another text editor, or run C or C with " "different options. Choosing a good version number is slightly tricky and a " "complete treatment is beyond the scope of this tutorial." msgstr "" #. type: =head2 #: ../dgit-user.7.pod:287 msgid "Actually building" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:291 #, no-wrap msgid "" " % mk-build-deps --root-cmd=sudo --install\n" " % dpkg-buildpackage -uc -b\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:296 msgid "" "dpkg-buildpackage is the primary tool for building a Debian source package. " "C<-uc> means not to pgp-sign the results. C<-b> means build all binary " "packages, but not to build a source package." msgstr "" #. type: =head2 #: ../dgit-user.7.pod:302 msgid "Using sbuild" msgstr "" #. type: textblock #: ../dgit-user.7.pod:304 msgid "" "You can build in an schroot chroot, with sbuild, instead of in your main " "environment. (sbuild is used by the Debian build daemons.)" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:309 #, no-wrap msgid "" " % git clean -xdf\n" " % sbuild -c jessie -A --no-clean-source \\\n" " --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn'\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:315 msgid "" "Note that this will seem to leave a \"source package\" (.dsc and .tar.gz) " "in the parent directory, but that source package should not be used. It is " "likely to be broken. For more information see Debian bug #868527." msgstr "" #. type: =head1 #: ../dgit-user.7.pod:322 msgid "INSTALLING" msgstr "" #. type: =head2 #: ../dgit-user.7.pod:324 msgid "Debian Jessie or older" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:328 #, no-wrap msgid "" " % sudo dpkg -i ../libc6_*.deb\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:332 msgid "" "You can use C to install the .debs that came out of your package." msgstr "" #. type: textblock #: ../dgit-user.7.pod:335 msgid "" "If the dependencies aren't installed, you will get an error, which can " "usually be fixed with C." msgstr "" #. type: =head2 #: ../dgit-user.7.pod:339 msgid "Debian Stretch or newer" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:343 #, no-wrap msgid "" " % sudo apt install ../libc6_*.deb\n" "\n" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:347 msgid "Multiarch" msgstr "" #. type: textblock #: ../dgit-user.7.pod:349 msgid "" "If you're working on a library package and your system has multiple " "architectures enabled, you may see something like this:" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:355 #, no-wrap msgid "" " dpkg: error processing package libpcre3-dev:amd64 (--configure):\n" " package libpcre3-dev:amd64 2:8.39-3~3.gbp8f25f5 cannot be configured because libpcre3-dev:i386 is at a different version (2:8.39-2)\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:360 msgid "" "The multiarch system used by Debian requires each package which is present " "for multiple architectures to be exactly the same across all the " "architectures for which it is installed." msgstr "" #. type: textblock #: ../dgit-user.7.pod:364 msgid "" "The proper solution is to build the package for all the architectures you " "have enabled. You'll need a chroot for each of the secondary " "architectures. This is somewhat tiresome, even though Debian has excellent " "tools for managing chroots. C from the " "package of the same name and C from the C " "package are good starting points." msgstr "" #. type: textblock #: ../dgit-user.7.pod:374 msgid "" "Otherwise you could deinstall the packages of interest for those other " "architectures with something like C." msgstr "" #. type: textblock #: ../dgit-user.7.pod:378 msgid "" "If neither of those are an option, your desperate last resort is to try " "using the same version number as the official package for your own package. " "(The version is controlled by C - see above.) This is not " "ideal because it makes it hard to tell what is installed, and because it " "will mislead and confuse apt." msgstr "" #. type: textblock #: ../dgit-user.7.pod:386 msgid "With the \"same number\" approach you may still get errors like" msgstr "" #. type: textblock #: ../dgit-user.7.pod:390 msgid "" "trying to overwrite shared '/usr/include/pcreposix.h', which is different " "from other instances of package libpcre3-dev" msgstr "" #. type: textblock #: ../dgit-user.7.pod:394 msgid "" "but passing C<--force-overwrite> to dpkg will help - assuming you know what " "you're doing." msgstr "" #. type: =head1 #: ../dgit-user.7.pod:397 msgid "SHARING YOUR WORK" msgstr "" #. type: textblock #: ../dgit-user.7.pod:399 msgid "" "The C branch (or whatever) is a normal git branch. " "You can use C to publish it on any suitable git server." msgstr "" #. type: textblock #: ../dgit-user.7.pod:402 msgid "" "Anyone who gets that git branch from you will be able to build binary " "packages (.deb) just as you did." msgstr "" #. type: textblock #: ../dgit-user.7.pod:406 msgid "" "If you want to contribute your changes back to Debian, you should probably " "send them as attachments to an email to the L (either a followup to an existing bug, or a new bug). Patches " "in C format are usually very welcome." msgstr "" #. type: =head2 #: ../dgit-user.7.pod:413 msgid "Source packages" msgstr "" #. type: textblock #: ../dgit-user.7.pod:415 msgid "" "The git branch is not sufficient to build a source package the way Debian " "does. Source packages are somewhat awkward to work with. Indeed many " "plausible git histories or git trees cannot be converted into a suitable " "source package. So I recommend you share your git branch instead." msgstr "" #. type: textblock #: ../dgit-user.7.pod:423 msgid "" "If a git branch is not enough, and you need to provide a source package but " "don't care about its format/layout (for example because some software you " "have consumes source packages, not git histories) you can use this recipe " "to generate a C<3.0 (native)> source package, which is just a tarball with " "accompanying .dsc metadata file:" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:434 #, no-wrap msgid "" " % echo '3.0 (native)' >debian/source/format\n" " % git commit -m 'switch to native source format' debian/source/format\n" " % dgit -wgf build-source\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:440 msgid "" "If you need to provide a good-looking source package, be prepared for a lot " "more work. You will need to read much more, perhaps starting with L, L or L" msgstr "" #. type: textblock #: ../dgit-user.7.pod:449 ../dgit-maint-native.7.pod:128 #: ../dgit-maint-merge.7.pod:493 ../dgit-maint-gbp.7.pod:138 msgid "dgit(1), dgit(7)" msgstr "" work/po4a/dgit_1.pot0000644000000000000000000024074014761250142011475 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 00:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: TH #: ../dgit.1:2 ../dgit.7:1 #, no-wrap msgid "dgit" msgstr "" #. type: TH #: ../dgit.1:2 ../dgit.7:1 #, no-wrap msgid "Debian Project" msgstr "" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: Plain text #: ../dgit.1:5 msgid "dgit - git integration with the Debian archive" msgstr "" #. type: =head1 #: ../dgit.1:6 ../git-debpush.1.pod:5 #, no-wrap msgid "SYNOPSIS" msgstr "" #. type: Plain text #: ../dgit.1:10 msgid "" "B [I] B [I] I [I] [B<./" ">IBI]" msgstr "" #. type: Plain text #: ../dgit.1:14 msgid "B [I] B|B [I] [I]" msgstr "" #. type: Plain text #: ../dgit.1:18 msgid "" "B [I] B|B|B [I]" msgstr "" #. type: Plain text #: ../dgit.1:22 msgid "B [I] B|B [I]" msgstr "" #. type: Plain text #: ../dgit.1:26 msgid "B [I] B|B [I] [I]" msgstr "" #. type: Plain text #: ../dgit.1:30 msgid "" "B [I] B|B IB<:>I " "[I]" msgstr "" #. type: Plain text #: ../dgit.1:33 msgid "B [I] I ..." msgstr "" #. type: =head1 #: ../dgit.1:33 ../git-debpush.1.pod:9 #, no-wrap msgid "DESCRIPTION" msgstr "" #. type: Plain text #: ../dgit.1:41 msgid "" "B allows you to treat the Debian archive as if it were a git " "repository. Conversely, it allows Debian to publish the source of its " "packages as git branches, in a format which is directly useable by ordinary " "people." msgstr "" #. type: Plain text #: ../dgit.1:44 msgid "This is the command line reference. Please read the tutorial(s):" msgstr "" #. type: tbl table #: ../dgit.1:46 #, no-wrap msgid "dgit-user(7)" msgstr "" #. type: tbl table #: ../dgit.1:46 #, no-wrap msgid "for users: edit, build and share packages" msgstr "" #. type: tbl table #: ../dgit.1:47 #, no-wrap msgid "dgit-nmu-simple(7)" msgstr "" #. type: tbl table #: ../dgit.1:47 #, no-wrap msgid "for DDs: do a straightforward NMU" msgstr "" #. type: tbl table #: ../dgit.1:48 #, no-wrap msgid "dgit-maint-native(7)" msgstr "" #. type: tbl table #: ../dgit.1:48 #, no-wrap msgid "for maintainers of Debian-native packages" msgstr "" #. type: tbl table #: ../dgit.1:49 #, no-wrap msgid "dgit-maint-debrebase(7)" msgstr "" #. type: tbl table #: ../dgit.1:49 #, no-wrap msgid "for maintainers: a pure-git rebasish workflow" msgstr "" #. type: tbl table #: ../dgit.1:50 #, no-wrap msgid "dgit-maint-merge(7)" msgstr "" #. type: tbl table #: ../dgit.1:50 #, no-wrap msgid "for maintainers: a pure-git merging workflow" msgstr "" #. type: tbl table #: ../dgit.1:51 #, no-wrap msgid "dgit-maint-gbp(7)" msgstr "" #. type: tbl table #: ../dgit.1:51 #, no-wrap msgid "for maintainers already using git-buildpackage" msgstr "" #. type: tbl table #: ../dgit.1:52 #, no-wrap msgid "dgit-sponsorship(7)" msgstr "" #. type: tbl table #: ../dgit.1:52 #, no-wrap msgid "for sponsors and sponsored contributors" msgstr "" #. type: tbl table #: ../dgit.1:53 #, no-wrap msgid "dgit-downstream-dsc(7)" msgstr "" #. type: tbl table #: ../dgit.1:53 #, no-wrap msgid "setting up dgit push for a new distro" msgstr "" #. type: Plain text #: ../dgit.1:60 msgid "" "See B for detailed information about the data model, common " "problems likely to arise with certain kinds of package, etc." msgstr "" #. type: SH #: ../dgit.1:60 #, no-wrap msgid "OPERATIONS" msgstr "" #. type: TP #: ../dgit.1:61 #, no-wrap msgid "B I [I] [B<./>IBI]" msgstr "" #. type: Plain text #: ../dgit.1:74 msgid "" "Consults the archive and dgit-repos to construct the git view of history for " "I in I (B by default) in a new directory (named B<./" ">I by default); also, downloads any necessary orig tarballs." msgstr "" #. type: Plain text #: ../dgit.1:85 msgid "" "The suite's git tip is left on the local branch BI ready for " "work, and on the corresponding dgit remote tracking branch. The B " "remote will be set up to point to the package's dgit-repos tree for the " "distro to which I belongs." msgstr "" #. type: Plain text #: ../dgit.1:90 msgid "" "I may be a combination of several underlying suites in the form " "IB<,>I...; see COMBINED SUITES in dgit(7)." msgstr "" #. type: Plain text #: ../dgit.1:97 msgid "" "For your convenience, the B remote will be set up from the " "package's Vcs-Git field, if there is one - but note that in the general case " "the history found there may be different to or even disjoint from dgit's " "view. (See also dgit update-vcs-git.)" msgstr "" #. type: TP #: ../dgit.1:97 #, no-wrap msgid "B [I]" msgstr "" #. type: Plain text #: ../dgit.1:110 msgid "" "Consults the archive and git-repos to update the git view of history for a " "specific suite (and downloads any necessary orig tarballs), and updates the " "remote tracking branch BI. If the current branch " "is BI then dgit fetch defaults to I; otherwise it " "parses debian/changelog and uses the suite specified there. suite may be a " "combined suite, as for clone." msgstr "" #. type: TP #: ../dgit.1:110 #, no-wrap msgid "B [I]" msgstr "" #. type: Plain text #: ../dgit.1:116 msgid "" "Does dgit fetch, and then merges the new head of the remote tracking branch " "BI into the current branch." msgstr "" #. type: TP #: ../dgit.1:116 #, no-wrap msgid "B I" msgstr "" #. type: Plain text #: ../dgit.1:120 msgid "Checks out the local branch BI." msgstr "" #. type: Plain text #: ../dgit.1:127 msgid "" "If the branch does not exist, dgit checkout creates it, and sets it up the " "same way as dgit clone would. In that case, if the archive remote tracking " "branch does not exist, dgit checkout will do a dgit fetch first." msgstr "" #. type: Plain text #: ../dgit.1:132 msgid "" "NB: dgit checkout will only do a fetch if it has to. If you already have " "the suite branch, and want to merge your branch with updates from the " "archive, use dgit pull." msgstr "" #. type: Plain text #: ../dgit.1:137 msgid "" "dgit checkout will normally need to access the archive server, to " "canonicalise the provided suite name. The exception is if you specify the " "canonical name, and the branch (or tracking branch) already exists." msgstr "" #. type: TP #: ../dgit.1:137 #, no-wrap msgid "B ..." msgstr "" #. type: Plain text #: ../dgit.1:146 msgid "" "Runs B with some suitable options. Options and arguments " "after build will be passed on to dpkg-buildpackage. It is not necessary to " "use dgit build when using dgit; it is OK to use any approach which ensures " "that the generated source package corresponds to the relevant git commit." msgstr "" #. type: Plain text #: ../dgit.1:148 ../dgit.1:196 ../dgit.1:236 msgid "Tagging, signing and actually uploading should be left to dgit push." msgstr "" #. type: Plain text #: ../dgit.1:152 msgid "" "dgit's build operations access the network, to get the -v option right. See " "-v, below." msgstr "" #. type: TP #: ../dgit.1:152 #, no-wrap msgid "B ..." msgstr "" #. type: Plain text #: ../dgit.1:161 msgid "" "Builds the source package, and a changes file for a prospective source-only " "upload, using B. The output is left in " "IB<_>IB<.dsc> and IB<_>IB<_source." "changes>." msgstr "" #. type: Plain text #: ../dgit.1:164 msgid "" "Tagging, signing and actually uploading should be left to dgit push-source, " "or dgit push." msgstr "" #. type: TP #: ../dgit.1:164 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:168 msgid "" "Cleans the current working tree (according to the --clean= option in force)." msgstr "" #. type: TP #: ../dgit.1:168 #, no-wrap msgid "B [I|B<.>] [B<-->] [I]" msgstr "" #. type: TQ #: ../dgit.1:170 #, no-wrap msgid "B [IB<.>] B<->" msgstr "" #. type: Plain text #: ../dgit.1:175 msgid "" "Sets up, or updates the url of, the vcs-git remote, and (unless B<-> was " "specified) runs git fetch on it." msgstr "" #. type: Plain text #: ../dgit.1:182 msgid "" "By default, the Vcs-Git field of the .dsc from Debian sid is used, as that " "is probably most up to date. Another suite may be specified, or B<.> to " "indicate that the Vcs-Git of the cwd's debian/control should be used instead." msgstr "" #. type: TP #: ../dgit.1:182 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:185 ../dgit.1:1346 msgid "Print a usage summary." msgstr "" #. type: TP #: ../dgit.1:185 #, no-wrap msgid "B ..." msgstr "" #. type: Plain text #: ../dgit.1:194 msgid "" "Constructs the source package, uses B to do a binary build, and uses " "mergechanges to merge the source and binary changes files. Options and " "arguments after sbuild will be passed on to sbuild. The output is left in " "IB<_>IB<_multi.changes>." msgstr "" #. type: TP #: ../dgit.1:196 #, no-wrap msgid "B [I]" msgstr "" #. type: Plain text #: ../dgit.1:204 msgid "" "Constructs the source package, uses B to do a binary build, and " "uses mergechanges to merge the source and binary changes files. The output " "is left in IB<_>IB<_multi.changes>." msgstr "" #. type: Plain text #: ../dgit.1:207 msgid "" "You should ensure that your dgit --build-products-dir setting matches your " "pbuilder --buildresult." msgstr "" #. type: Plain text #: ../dgit.1:213 msgid "" "The I are passed to pbuilder using its --debbuildopts option. " "If you want to pass other options to pbuilder, use the B<--pbuilder:> dgit " "option as described below (remember that dgit options should appear between " "B and B)." msgstr "" #. type: Plain text #: ../dgit.1:219 msgid "" "You should ensure that in your pbuilderrc you do B have the setting " "B as this may cause trouble." msgstr "" #. type: TP #: ../dgit.1:219 #, no-wrap msgid "B [I]" msgstr "" #. type: Plain text #: ../dgit.1:225 msgid "Like B, but uses B instead of B" msgstr "" #. type: TP #: ../dgit.1:225 #, no-wrap msgid "B ..." msgstr "" #. type: Plain text #: ../dgit.1:231 msgid "" "Runs B with some suitable options. Options and arguments " "after gbp-build will be passed on to git-buildpackage." msgstr "" #. type: Plain text #: ../dgit.1:234 msgid "" "By default this uses --quilt=gbp, so HEAD should be a git-buildpackage style " "branch, not a patches-applied branch." msgstr "" #. type: TP #: ../dgit.1:236 #, no-wrap msgid "B [I]" msgstr "" #. type: Plain text #: ../dgit.1:241 msgid "" "Does an `upload': sends the current HEAD to dgit-repos (as git commits), and " "to the archive (as a source package, built by dgit push-source)." msgstr "" #. type: Plain text #: ../dgit.1:243 msgid "This is the usual way to upload to Debian." msgstr "" #. type: Plain text #: ../dgit.1:254 msgid "" "In more detail: dgit push-source builds a source package from HEAD. It then " "pushes the HEAD to the suite's dgit-repos branch, adjusts the .changes to " "include any .origs which the archive lacks and exclude .origs which the " "archive has (so -sa and -sd are not needed when building for dgit push), " "makes a signed git tag, edits the .dsc to contain the dgit metadata field, " "runs debsign to sign the upload (.dsc and .changes), pushes the signed tag, " "and finally uses dput to upload the .changes to the archive." msgstr "" #. type: Plain text #: ../dgit.1:258 msgid "" "dgit push always uses the package, suite and version specified in the debian/" "changelog and the .dsc, which must agree. If the command line specifies a " "suite then that must match too." msgstr "" #. type: Plain text #: ../dgit.1:263 msgid "" "When used on a git-debrebase branch, dgit calls git-debrebase to prepare the " "branch for source package upload and push." msgstr "" #. type: Plain text #: ../dgit.1:267 msgid "" "With B<-C>, dgit push-source performs a dgit push-built, additionally " "ensuring that no binary packages are uploaded." msgstr "" #. type: TP #: ../dgit.1:267 #, no-wrap msgid "B [I]" msgstr "" #. type: Plain text #: ../dgit.1:274 msgid "" "Does an `upload' of a previously built package, possibly including " "binaries. Sends the current HEAD to dgit-repos (as git commits); and, sends " "the previously built source package and binaries to the archive." msgstr "" #. type: Plain text #: ../dgit.1:281 msgid "" "The package must already have been built ready for upload, with the .dsc " "and .changes left in the parent directory. It is normally best to do the " "build with dgit too (eg with dgit sbuild): some existing build tools pass " "unhelpful options to dpkg-source et al by default, which can result in the " "built source package not being identical to the git tree." msgstr "" #. type: Plain text #: ../dgit.1:286 msgid "" "dgit will check that the .dsc corresponds exactly to the current HEAD, " "ensuring that all users whether of the dgit git view, or of the traditional " "archive, see the same source package." msgstr "" #. type: TP #: ../dgit.1:286 #, no-wrap msgid "B|B IB<:>I [I]" msgstr "" #. type: Plain text #: ../dgit.1:293 msgid "" "Pushes the contents of the specified directory on a remote machine. This is " "like running dgit push on build-host with src-dir as the current directory; " "however, signing operations are done on the invoking host. This allows you " "to do a push when the system which has the source code (and any built " "binaries) has no access to the key:" msgstr "" #. type: =item #: ../dgit.1:296 ../dgit-maint-merge.7.pod:502 #, no-wrap msgid "1." msgstr "" #. type: tbl table #: ../dgit.1:296 #, no-wrap msgid "Clone on build host (dgit clone)" msgstr "" #. type: =item #: ../dgit.1:297 ../dgit-maint-merge.7.pod:506 #, no-wrap msgid "2." msgstr "" #. type: tbl table #: ../dgit.1:297 #, no-wrap msgid "Edit code on build host (edit, git commit)" msgstr "" #. type: =item #: ../dgit.1:298 ../dgit-maint-merge.7.pod:511 #, no-wrap msgid "3." msgstr "" #. type: tbl table #: ../dgit.1:298 #, no-wrap msgid "Build package on build host (dgit build)" msgstr "" #. type: tbl table #: ../dgit.1:299 #, no-wrap msgid "4." msgstr "" #. type: tbl table #: ../dgit.1:299 #, no-wrap msgid "Test package on build host or elsewhere (dpkg -i, test)" msgstr "" #. type: tbl table #: ../dgit.1:300 #, no-wrap msgid "5." msgstr "" #. type: tbl table #: ../dgit.1:300 #, no-wrap msgid "Upload by invoking dgit rpush on host with your GPG key." msgstr "" #. type: Plain text #: ../dgit.1:306 msgid "" "However, the build-host must be able to ssh to the dgit repos. If this is " "not already the case, you must organise it separately, for example by the " "use of ssh agent forwarding." msgstr "" #. type: Plain text #: ../dgit.1:310 msgid "" "The remaining arguments are treated just as dgit push-source or dgit push-" "built would handle them." msgstr "" #. type: Plain text #: ../dgit.1:315 msgid "" "build-host and build-dir can be passed as separate arguments; this is " "assumed to be the case if the first argument contains no : (except perhaps " "one in [ ], to support IPv6 address literals)." msgstr "" #. type: Plain text #: ../dgit.1:319 msgid "" "You will need similar enough versions of dgit on the build-host and the " "invocation host. The build-host needs gnupg installed, with your public key " "in its keyring (but not your private key, obviously)." msgstr "" #. type: TP #: ../dgit.1:319 #, no-wrap msgid "B|B I<...>" msgstr "" #. type: Plain text #: ../dgit.1:330 msgid "" "Configurable aliases for B and B, which " "will in the future change to mean B and B, and therefore currently generate a warning." msgstr "" #. type: Plain text #: ../dgit.1:334 msgid "" "The behaviour of dgit push is controlled by the B " "git config option:" msgstr "" #. type: tbl table #: ../dgit.1:336 #, no-wrap msgid "B" msgstr "" #. type: tbl table #: ../dgit.1:336 #, no-wrap msgid "runs B" msgstr "" #. type: tbl table #: ../dgit.1:336 #, no-wrap msgid "future default" msgstr "" #. type: tbl table #: ../dgit.1:337 #, no-wrap msgid "B" msgstr "" #. type: tbl table #: ../dgit.1:337 #, no-wrap msgid "and runs B" msgstr "" #. type: tbl table #: ../dgit.1:338 #, no-wrap msgid "B" msgstr "" #. type: tbl table #: ../dgit.1:338 #, no-wrap msgid "warns, and runs B" msgstr "" #. type: tbl table #: ../dgit.1:338 #, no-wrap msgid "current default" msgstr "" #. type: tbl table #: ../dgit.1:339 #, no-wrap msgid "B" msgstr "" #. type: tbl table #: ../dgit.1:339 #, no-wrap msgid "fails" msgstr "" #. type: Plain text #: ../dgit.1:350 msgid "" "For dgit rpush, the behaviour is controlled by B, " "falling back to B if that is not set. Because " "dgit rpush is not typically run in a git working tree, only global git " "config options (and B<-c> command line options) are relevant." msgstr "" #. type: Plain text #: ../dgit.1:360 msgid "" "These settings can safely be passed to older dgit (via B<-c);> the value " "B will be supported indefinitely. This should be used in scripts " "that need to work with both old versions of dgit (that don't have B) and new versions (where B is the default)." msgstr "" #. type: TP #: ../dgit.1:360 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:376 msgid "" "Configure the current working tree the way that dgit clone would have set it " "up. Like running B, B and " "B (but only does each thing if dgit is configured to do " "it automatically). You can use these in any git repository, not just ones " "used with the other dgit operations. Does B run B (as " "that requires Debian packaging information)." msgstr "" #. type: TP #: ../dgit.1:376 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:382 msgid "" "Set the working tree's user.name and user.email from the distro-specific " "dgit configuration (BIB<.user-name> and B<.user-" "email>), or DEBFULLNAME or DEBEMAIL." msgstr "" #. type: TP #: ../dgit.1:382 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:388 msgid "" "Configures a git merge helper for the file B which uses " "B." msgstr "" #. type: TP #: ../dgit.1:388 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:403 msgid "" "Set up the working tree's B<.git/info/attributes> to disable all " "transforming attributes for all files. This is done by defining a macro " "attribute, B and applying it to B<*>. For why, see " "B in B. Note that only attributes affecting the " "working tree are suppressed. git-archive may remain exciting." msgstr "" #. type: Plain text #: ../dgit.1:411 msgid "" "If there is an existing macro attribute line B<[attr]dgit-defuse-attrs> in ." "git/info/attributes, but it is insufficient, because it was made by an " "earlier version of dgit and git has since introduced new transforming " "attributes, this modifies the macro to disable the newer transformations." msgstr "" #. type: Plain text #: ../dgit.1:422 msgid "" "(If there is already a macro attribute line B<[attr]dgit-defuse-attrs> in ." "git/info/attributes which does what dgit requires (whatever files it " "effects), this operation does nothing further. This fact can be used to " "defeat or partially defeat dgit setup-gitattributes and hence dgit setup-new-" "tree.)" msgstr "" #. type: TP #: ../dgit.1:422 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:429 msgid "" "`3.0 (quilt)' format source packages need changes representing not only in-" "tree but also as patches in debian/patches. dgit quilt-fixup checks whether " "this has been done; if not, dgit will make appropriate patches in debian/" "patches and also commit the resulting changes to git." msgstr "" #. type: Plain text #: ../dgit.1:431 msgid "This is normally done automatically by dgit build and dgit push." msgstr "" #. type: Plain text #: ../dgit.1:437 msgid "" "dgit will try to turn each relevant commit in your git history into a new " "quilt patch. dgit cannot convert nontrivial merges, or certain other kinds " "of more exotic history. If dgit can't find a suitable linearisation of your " "history, by default it will fail, but you can ask it to generate a single " "squashed patch instead." msgstr "" #. type: Plain text #: ../dgit.1:446 msgid "" "When used with a git-debrebase branch, dgit will ask git-debrebase to " "prepare patches. However, dgit can make patches in some situations where " "git-debrebase fails, so dgit quilt-fixup can be useful in its own right. To " "always use dgit's own patch generator instead of git-debrebase make-patches, " "pass --git-debrebase=true to dgit." msgstr "" #. type: Plain text #: ../dgit.1:451 msgid "See B in B." msgstr "" #. type: TP #: ../dgit.1:451 #, no-wrap msgid "B [I] I<../path/to/.dsc> [B<+>|B<..>]branch" msgstr "" #. type: Plain text #: ../dgit.1:457 msgid "" "Import a Debian-format source package, specified by its .dsc, into git, the " "way dgit fetch would do." msgstr "" #. type: Plain text #: ../dgit.1:468 msgid "" "This does about half the work of dgit fetch: it will convert the .dsc into a " "new, orphan git branch. Since dgit has no access to a corresponding source " "package archive or knowledge of the history it does not consider whether " "this version is newer than any previous import or corresponding git " "branches; and it therefore does not make a pseudomerge to bind the import " "into any existing git history." msgstr "" #. type: Plain text #: ../dgit.1:478 msgid "" "Because a .dsc can contain a Dgit field naming a git commit (which you might " "not have), and specifying where to find that commit (and any history rewrite " "table), import-dsc might need online access. If this is a problem (or " "dgit's efforts to find the commit fail), consider --no-chase-dsc-distro or --" "force-import-dsc-with-dgit-field." msgstr "" #. type: Plain text #: ../dgit.1:480 msgid "There is only one sub-option:" msgstr "" #. type: Plain text #: ../dgit.1:486 msgid "" "B<--require-valid-signature> causes dgit to insist that the signature on " "the .dsc is valid (using the same criteria as dpkg-source -x). Otherwise, " "dgit tries to verify the signature but the outcome is reported only as " "messages to stderr." msgstr "" #. type: Plain text #: ../dgit.1:505 msgid "" "If I is prefixed with B<+> then if it already exists, it will be " "simply overwritten, no matter its existing contents. If I is " "prefixed with B<..> then if it already exists and dgit actually imports the " "dsc (rather than simply reading the git commit out of the Dgit field), dgit " "will make a pseudomerge so that the result is necessarily fast forward from " "the existing branch. Otherwise, if I already exists, dgit will stop " "with an error message." msgstr "" #. type: Plain text #: ../dgit.1:509 msgid "If I does not start with refs/, refs/heads/ is prepended." msgstr "" #. type: TP #: ../dgit.1:509 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:512 msgid "Prints version information and exits." msgstr "" #. type: TP #: ../dgit.1:512 #, no-wrap msgid "BI< destdir>" msgstr "" #. type: Plain text #: ../dgit.1:516 msgid "" "Tries to fetch a copy of the source code for the dgit-repos-server, as " "actually being used on the dgit git server, as a git tree." msgstr "" #. type: TP #: ../dgit.1:516 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:521 msgid "" "Prints the url used by dgit clone-dgit-repos-server. This is hopefully " "suitable for use as a git remote url. It may not be useable in a browser." msgstr "" #. type: TP #: ../dgit.1:521 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:528 msgid "" "Prints the -i and -I arguments which must be passed to dpkg-souce to cause " "it to exclude exactly the .git directory and nothing else. The separate " "arguments are unquoted, separated by spaces, and do not contain spaces." msgstr "" #. type: TP #: ../dgit.1:528 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:539 msgid "" "Constructs a tree-ish approximating the patches-unapplied state of your 3.0 " "(quilt) package, and prints the git object name to stdout. This requires " "appropriate .orig tarballs. This tree object is identical to your .origs as " "regards upstream files. The contents of the debian subdirectory is not " "interesting and should not be inspected; except that debian/patches will be " "identical to your HEAD." msgstr "" #. type: Plain text #: ../dgit.1:546 msgid "" "To make this operate off-line, the access configuration key which is used to " "determine the build-products-dir is the uncanonicalised version of the suite " "name from the changelog, or (of course) dgit.default.build-products-dir. " "See ACCESS CONFIGURATION, below." msgstr "" #. type: Plain text #: ../dgit.1:548 msgid "This function is primarily provided for the benefit of git-debrebase." msgstr "" #. type: =head1 #: ../dgit.1:548 ../git-debrebase.1.pod:477 #, no-wrap msgid "OPTIONS" msgstr "" #. type: TP #: ../dgit.1:549 #, no-wrap msgid "B<-k>I" msgstr "" #. type: Plain text #: ../dgit.1:558 msgid "" "Use I for signing the tag and the upload. The default comes from the " "distro's B config setting (see CONFIGURATION, below), or failing " "that, the uploader trailer line in debian/changelog." msgstr "" #. type: TP #: ../dgit.1:558 #, no-wrap msgid "B<--no-sign>" msgstr "" #. type: Plain text #: ../dgit.1:561 msgid "does not sign tags or uploads (meaningful only with push)." msgstr "" #. type: TP #: ../dgit.1:562 #, no-wrap msgid "B<-p>I" msgstr "" #. type: Plain text #: ../dgit.1:568 msgid "" "Specifies that we should process source package I rather than " "looking in debian/control or debian/changelog. Valid with dgit fetch and " "dgit pull, only." msgstr "" #. type: TP #: ../dgit.1:568 #, no-wrap msgid "B<--clean=git> | B<-wg>" msgstr "" #. type: Plain text #: ../dgit.1:574 msgid "" "Use B to clean the working tree, rather than running the " "package's rules clean target." msgstr "" #. type: Plain text #: ../dgit.1:577 msgid "" "This will delete all files which are not tracked by git. (Including any " "files you forgot to git add.)" msgstr "" #. type: Plain text #: ../dgit.1:582 msgid "" "B<--clean=>I<...> options other than dpkg-source are useful when the " "package's clean target is troublesome, or to avoid needing the build-" "dependencies." msgstr "" #. type: Plain text #: ../dgit.1:589 msgid "" "dgit will only actually clean the tree if it needs to (because it needs to " "build the source package or binaries from your working tree). Otherwise it " "will just check that there are no untracked unignored files. See --" "clean=git[-ff],always, below." msgstr "" #. type: TP #: ../dgit.1:589 #, no-wrap msgid "B<--clean=git-ff> | B<-wgf>" msgstr "" #. type: Plain text #: ../dgit.1:598 msgid "" "Use B to clean the working tree. Like git clean -xdf but " "it also removes any subdirectories containing different git trees (which " "only unusual packages are likely to create)." msgstr "" #. type: TP #: ../dgit.1:598 #, no-wrap msgid "B<--clean=git>[B<-ff>]B<,always> | B<-wga> | B<-wgfa>" msgstr "" #. type: Plain text #: ../dgit.1:602 msgid "" "Like --clean=git, but always does the clean and not just a check, deleting " "any untracked un-ignored files." msgstr "" #. type: TP #: ../dgit.1:602 #, no-wrap msgid "B<--clean=check> | B<--clean=check,ignores> | B<-wc> | B<-wci>" msgstr "" #. type: Plain text #: ../dgit.1:608 msgid "" "Merely check that the tree is clean (does not contain uncommitted files). " "Avoids running rules clean, and can avoid needing the build-dependencies." msgstr "" #. type: Plain text #: ../dgit.1:619 msgid "" "With B<,ignores> or B<-wci>, untracked files covered by .gitignore are " "tolerated, so only files which show up as B in git status (ie, ones you " "maybe forgot to git add) are treated as a problem." msgstr "" #. type: TP #: ../dgit.1:619 #, no-wrap msgid "B<--clean=none> | B<-wn>" msgstr "" #. type: Plain text #: ../dgit.1:627 msgid "" "Do not clean the tree, nor check that it is clean. Avoids running rules " "clean, and can avoid needing the build-dependencies. If there are files " "which are not in git, or if the build creates such files, a subsequent dgit " "push will fail." msgstr "" #. type: TP #: ../dgit.1:627 #, no-wrap msgid "B<--clean=dpkg-source>[B<-d>] | B<-wd> | B<-wdd>" msgstr "" #. type: Plain text #: ../dgit.1:632 msgid "" "Use dpkg-buildpackage to do the clean, so that the source package is cleaned " "by dpkg-source running the package's clean target. --clean=dpkg-source is " "the default." msgstr "" #. type: Plain text #: ../dgit.1:636 msgid "Without the extra B, requires the package's build dependencies." msgstr "" #. type: Plain text #: ../dgit.1:646 msgid "" "With B<...>-d or B<-wdd>, the build-dependencies are not checked (due to " "passing B<-d> to dpkg-buildpackage), which violates policy, but may work in " "practice." msgstr "" #. type: Plain text #: ../dgit.1:653 msgid "" "The rules clean target will only be run if it is needed: when dgit is going " "to build source or binary packages from your working tree, rather than from " "your git branch (for example because of --include-dirty or because the " "binary package build uses your working tree)." msgstr "" #. type: Plain text #: ../dgit.1:663 msgid "" "In all cases, dgit will check that there are (after rules clean, if " "applicable) no untracked un-ignored files, in case these are files you " "forgot to git add. (Except that this check is not done for a `3.0 (quilt)' " "package when dgit has to apply patches, dirtily, to the working tree.) If " "your package does not have a good .gitignore you will probably need --" "clean=dpkg-source,no-check aka -wdn." msgstr "" #. type: TP #: ../dgit.1:663 #, no-wrap msgid "B<--clean=dpkg-source>[B<-d>]B<,no-check> | B<-wdn> | B<-wddn>" msgstr "" #. type: Plain text #: ../dgit.1:667 msgid "" "Like --clean=dpkg-source, but does not care about untracked un-ignored files." msgstr "" #. type: TP #: ../dgit.1:667 #, no-wrap msgid "B<--clean=dpkg-source>[B<-d>]B<,all-check> | B<-wda> | B<-wdda>" msgstr "" #. type: Plain text #: ../dgit.1:672 msgid "" "Like --clean=dpkg-source, but fails even on ignored untracked files. This " "could perhaps be used to detect bugs in your rules clean target." msgstr "" #. type: TP #: ../dgit.1:672 #, no-wrap msgid "B<-N> | B<--new>" msgstr "" #. type: Plain text #: ../dgit.1:678 msgid "" "The package is, or may be, new in this suite. Without this, dgit will " "refuse to push. Needing --new is not unusual; for example, it is frequently " "needed for uploading to Debian experimental." msgstr "" #. type: Plain text #: ../dgit.1:684 msgid "" "Note that dgit may be unable to access the git history for an entirely new " "package which has not been accepted by the archive. So for an entirely new " "package you need to properly coordinate with anyone else who might upload." msgstr "" #. type: TP #: ../dgit.1:684 #, no-wrap msgid "B<--include-dirty>" msgstr "" #. type: Plain text #: ../dgit.1:692 msgid "" "Do not complain if the working tree does not match your git HEAD, and when " "building, include the changes from your working tree. This can be useful " "with build, if you plan to commit later. (dgit push will still ensure that " "the .dsc you upload and the git tree you push are identical, so this option " "won't make broken pushes.)" msgstr "" #. type: Plain text #: ../dgit.1:704 msgid "" "Note that this does B prevent dgit from cleaning your tree, so if the " "changes in your working tree are in the form of untracked files, those might " "still be deleted, especially with --clean=git. If you want to include " "untracked files in the build, you can use --clean=none or --clean=dpkg-" "source[-d] in addition to --include-dirty. Note that this combination can " "fail if the untracked files are under I." msgstr "" #. type: TP #: ../dgit.1:704 #, no-wrap msgid "B<--ignore-dirty>" msgstr "" #. type: Plain text #: ../dgit.1:707 msgid "Deprecated alias for --include-dirty." msgstr "" #. type: TP #: ../dgit.1:707 #, no-wrap msgid "B<--overwrite>[=I]" msgstr "" #. type: Plain text #: ../dgit.1:718 msgid "" "Declare that your HEAD really does contain all the (wanted) changes from all " "versions listed in its changelog; or, all (wanted) changes from I. This promise is needed when your git branch is not a descendant " "of the version in the archive according to the git revision history." msgstr "" #. type: Plain text #: ../dgit.1:725 msgid "" "It is safer not to specify I, and usually it's not " "needed. Just say B<--overwrite>, unless you know what you are doing." msgstr "" #. type: Plain text #: ../dgit.1:731 msgid "" "This option is useful if you are the maintainer, and you have incorporated " "NMU changes into your own git workflow in a way that doesn't make your " "branch a fast forward from the NMU. It can also be useful when there was an " "upload made without dgit since the most recent upload made with dgit." msgstr "" #. type: Plain text #: ../dgit.1:737 msgid "" "This option is also usually necessary the first time a package is pushed " "with dgit push to a particular suite. See BI<*>B<(7)>." msgstr "" #. type: Plain text #: ../dgit.1:751 msgid "" "If I is not specified, dgit will check that the version in " "the archive is mentioned in your debian/changelog. (This will avoid losing " "changes, even with B<--overwrite>, unless someone committed to git a " "finalised changelog entry, and then made later changes to that version.) If " "I is specified, it ought to be the version currently in " "the archive." msgstr "" #. type: Plain text #: ../dgit.1:757 msgid "" "dgit push --overwrite will, if necessary, make a pseudo-merge (that is, " "something that looks like the result of git merge -s ours) to stitch the " "archive's version into your own git history, so that your push is a fast " "forward from the archive." msgstr "" #. type: Plain text #: ../dgit.1:762 msgid "" "(In quilt mode B, B, B or B*, implying a " "split between the dgit view and the maintainer view, the pseudo-merge will " "appear only in the dgit view.)" msgstr "" #. type: TP #: ../dgit.1:762 #, no-wrap msgid "B<--delayed>=I" msgstr "" #. type: Plain text #: ../dgit.1:765 msgid "Upload to a DELAYED queue." msgstr "" #. type: Plain text #: ../dgit.1:775 msgid "" "B If the maintainer responds by cancelling your upload from the " "queue, and does not make an upload of their own, this will not rewind the " "git branch on the dgit git server. Other dgit users will then see your push " "(with a warning message from dgit) even though the maintainer wanted to " "abolish it. Such users might unwittingly reintroduce your changes." msgstr "" #. type: Plain text #: ../dgit.1:780 msgid "" "If this situation arises, someone should make a suitable dgit push to update " "the contents of dgit-repos to a version without the controversial changes." msgstr "" #. type: TP #: ../dgit.1:780 #, no-wrap msgid "B<--no-chase-dsc-distro>" msgstr "" #. type: Plain text #: ../dgit.1:786 msgid "" "Tells dgit not to look online for additional git repositories containing " "information about a particular .dsc being imported. Chasing is the default." msgstr "" #. type: Plain text #: ../dgit.1:796 msgid "" "For most operations (such as fetch and pull), disabling chasing means dgit " "will access only the git server for the distro you are directly working " "with, even if the .dsc was copied verbatim from another distro. For import-" "dsc, disabling chasing means dgit will work completely offline." msgstr "" #. type: Plain text #: ../dgit.1:804 msgid "" "Disabling chasing can be hazardous: if the .dsc names a git commit which has " "been rewritten by those in charge of the distro, this option may prevent " "that rewrite from being effective. Also, it can mean that dgit fails to " "find necessary git commits." msgstr "" #. type: TP #: ../dgit.1:804 #, no-wrap msgid "B<--save-dgit-view=>I|I" msgstr "" #. type: Plain text #: ../dgit.1:814 msgid "" "Specifies that when split view is in operation, and dgit calculates (or " "looks up in its cache) a dgit view corresponding to your HEAD, the dgit " "view will be left in I. The specified ref is unconditionally " "overwritten, so don't specify a branch you want to keep." msgstr "" #. type: Plain text #: ../dgit.1:818 msgid "" "This option is effective only with the following operations: quilt-fixup; " "push; all builds. And it is only effective when split view is actually in " "operation." msgstr "" #. type: Plain text #: ../dgit.1:822 msgid "" "If ref does not start with refs/ it is taken to be a branch - i.e. refs/" "heads/ is prepended." msgstr "" #. type: Plain text #: ../dgit.1:826 msgid "B<--dgit-view-save> is a deprecated alias for --save-dgit-view." msgstr "" #. type: TP #: ../dgit.1:826 #, no-wrap msgid "B<--deliberately->I" msgstr "" #. type: Plain text #: ../dgit.1:840 msgid "" "Declare that you are deliberately doing I. This can be used to " "override safety catches, including safety catches which relate to distro-" "specific policies. The use of --deliberately is declared and published in " "the signed tags generated for you by dgit, so that the archive software can " "give effect to your intent, and for the benefit of humans looking at the " "history. The meanings of Is understood in the context of Debian " "are discussed below:" msgstr "" #. type: TP #: ../dgit.1:840 #, no-wrap msgid "B<--deliberately-not-fast-forward>" msgstr "" #. type: Plain text #: ../dgit.1:846 msgid "" "Declare that you are deliberately rewriting history. This could be because " "your branch is not fast forward from the dgit server history, or not fast " "forward from a locally-synthesised dsc import." msgstr "" #. type: Plain text #: ../dgit.1:852 msgid "" "When pushing to Debian, use this only when you are making a renewed upload " "of an entirely new source package whose previous version was not accepted " "for release from NEW because of problems with copyright or " "redistributibility; or, exceptionally, for the very first upload with dgit." msgstr "" #. type: Plain text #: ../dgit.1:863 msgid "" "When split view is in operation, this also prevents the construction by dgit " "of a pseudomerge to make the dgit view fast forwarding. Normally only one " "of --overwrite (which creates a suitable pseudomerge) and --deliberately-" "not-fast-forward (which suppresses the pseudomerge and the fast forward " "checks) should be needed; --overwrite is usually better." msgstr "" #. type: TP #: ../dgit.1:863 #, no-wrap msgid "B<--deliberately-include-questionable-history>" msgstr "" #. type: Plain text #: ../dgit.1:872 msgid "" "Declare that you are deliberately including, in the git history of your " "current push, history which contains a previously-submitted version of this " "package which was not approved (or has not yet been approved) by the " "ftpmasters. When pushing to Debian, only use this option after verifying " "that: none of the rejected-from-NEW (or never-accepted) versions in the git " "history of your current push, were rejected by ftpmaster for copyright or " "redistributability reasons." msgstr "" #. type: TP #: ../dgit.1:872 #, no-wrap msgid "B<--deliberately-fresh-repo>" msgstr "" #. type: Plain text #: ../dgit.1:877 msgid "" "Declare that you are deliberately rewriting history and want to throw away " "the existing repo. Not relevant when pushing to Debian, as the Debian " "server will do this automatically when necessary." msgstr "" #. type: =item #: ../dgit.1:877 ../git-debpush.1.pod:114 #, no-wrap msgid "B<--quilt=linear>" msgstr "" #. type: Plain text #: ../dgit.1:884 msgid "" "With format `3.0 (quilt)', insist on a linear patch stack: one new patch for " "each relevant commit. If such a stack cannot be generated, fail. This is " "the default for Debian." msgstr "" #. type: Plain text #: ../dgit.1:889 msgid "" "HEAD should be a series of plain commits (not touching debian/patches/), and " "pseudomerges, with as ancestor a patches-applied branch." msgstr "" #. type: TP #: ../dgit.1:889 #, no-wrap msgid "B<--quilt=try-linear>" msgstr "" #. type: Plain text #: ../dgit.1:899 msgid "" "With format `3.0 (quilt)', prefer a linear patch stack (as with --" "quilt=linear) but if that doesn't seem possible, try to generate a single " "squashed patch for all the changes made in git (as with --quilt=smash). " "This is not a good idea for an NMU in Debian." msgstr "" #. type: =item #: ../dgit.1:899 ../git-debpush.1.pod:120 #, no-wrap msgid "B<--quilt=smash>" msgstr "" #. type: Plain text #: ../dgit.1:905 msgid "" "With format `3.0 (quilt)', assume patches-applied (as obtained from dgit " "clone) and generate a single additional patch for all the changes made in " "git. This is not a good idea for an NMU in Debian." msgstr "" #. type: Plain text #: ../dgit.1:911 msgid "" "(If HEAD has any in-tree patches already, they must apply cleanly. This " "will be the case for any trees produced by dgit fetch or clone; if you do " "not change the upstream version nor make changes in debian/patches, it will " "remain true.)" msgstr "" #. type: TP #: ../dgit.1:911 #, no-wrap msgid "B<--quilt=single>" msgstr "" #. type: Plain text #: ../dgit.1:918 msgid "" "With format `3.0 (quilt)', assume patches-applied (as obtained from dgit " "clone), delete all the existing patches, and then generate a single patch " "for all the changes made in git. This is not a good idea for an NMU in " "Debian." msgstr "" #. type: Plain text #: ../dgit.1:927 msgid "" "Use this instead of the B dpkg-source format option. " "That dpkg-source option cannot handle certain changes to the tree that dpkg-" "source otherwise permits, and in some cases it can generate strange source " "packages that dpkg-source appears to accept but which become corrupted when " "people later try to modify them." msgstr "" #. type: =item #: ../dgit.1:927 ../git-debpush.1.pod:131 #, no-wrap msgid "B<--quilt=nofix>" msgstr "" #. type: Plain text #: ../dgit.1:937 msgid "" "With format `3.0 (quilt)', assume patches-applied (as obtained from dgit " "clone), and check that the patch metadata is up to date. If it isn't, fail; " "you must then fix the metadata yourself somehow before pushing. (NB that " "dpkg-source --commit will not work because the dgit git tree does not have a " "B<.pc> directory.)" msgstr "" #. type: TP #: ../dgit.1:937 #, no-wrap msgid "B<--quilt=nocheck> | B<--no-quilt-fixup>" msgstr "" #. type: Plain text #: ../dgit.1:944 msgid "" "With format `3.0 (quilt)', assume that the tree is patches-applied (as " "obtained from dgit clone), and I that the patch metadata is up to " "date. If you use this option and the patch metadata is out of date, dgit " "push will fail." msgstr "" #. type: TP #: ../dgit.1:944 #, no-wrap msgid "B<-->[B]B | B<-->[B]B | B<--quilt=unapplied> | B<-->[B]B[B<+git>|B<+tarball>]" msgstr "" #. type: Plain text #: ../dgit.1:951 msgid "" "Tell dgit that you are using a nearly-dgit-compatible git branch, aka a " "B, and do not want your branch changed by dgit." msgstr "" #. type: Plain text #: ../dgit.1:955 msgid "" "These quilt modes are known as B. See --split-view, " "below." msgstr "" #. type: Plain text #: ../dgit.1:963 msgid "" "B<--gbp> (short for B<--quilt=gbp>) is for use with git-buildpackage. Your " "HEAD is expected to be a patches-unapplied git branch, except that it might " "contain changes to upstream .gitignore files. This is the default for dgit " "gbp-build." msgstr "" #. type: Plain text #: ../dgit.1:971 msgid "" "B<--dpm> (short for B<--quilt=dpm>) is for use with git-dpm. Your HEAD is " "expected to be a patches-applied git branch, except that it might contain " "changes to upstream .gitignore files." msgstr "" #. type: Plain text #: ../dgit.1:976 msgid "" "B<--quilt=unapplied> specifies that your HEAD is a patches-unapplied git " "branch (and that any changes to upstream .gitignore files are represented as " "patches in debian/patches)." msgstr "" #. type: Plain text #: ../dgit.1:990 msgid "" "B<--quilt=baredebian> (or its alias B<--quilt=baredebian+git>) specifies " "that your HEAD contains only a debian/ directory, with any changes to " "upstream files represented as patches in debian/patches. The upstream " "source must be available in git, by default, in a suitably named git tag; " "see --upstream-commitish. In this mode, dgit cannot check that all edited " "upstream files are properly represented as patches: dgit relies on debian/" "patches being correct." msgstr "" #. type: Plain text #: ../dgit.1:1001 msgid "" "B<--quilt=baredebian+tarball> is like --quilt=baredebian, but is used when " "there is no appropriate upstream git history. To construct the dgit view, " "dgit will import your orig tarballs' contents into git. In this mode, dgit " "cannot check that the upstream parts of your upload correspond to what you " "intend: dgit relies on the right orig tarball(s) existing, and debian/" "patches being correct." msgstr "" #. type: Plain text #: ../dgit.1:1019 msgid "" "With --quilt=gbp|dpm|unapplied|baredebian*, dgit push (or precursors like " "quilt-fixup and build) will automatically generate a conversion of your git " "branch into the right form. dgit push will push the dgit-compatible form " "(the B) to the dgit git server. The dgit view will be visible " "to you in the dgit remote tracking branches, but your own branch will not be " "modified. dgit push will create a tag BI for the " "maintainer view, and the dgit tag BI for the dgit " "view. dgit quilt-fixup will merely do some checks, and cache the maintainer " "view." msgstr "" #. type: Plain text #: ../dgit.1:1028 msgid "" "B This is because it is not always possible to tell: a " "patches-unapplied git branch of a package with one patch, for example, looks " "very like a patches-applied branch where the user has used git revert to " "undo the patch, expecting to actually revert it. However, if you fail to " "specify the right --quilt option, and you aren't too lucky, dgit will notice " "the problem and stop, with a useful hint." msgstr "" #. type: TP #: ../dgit.1:1028 #, no-wrap msgid "B<-d>I | B<--distro=>I" msgstr "" #. type: Plain text #: ../dgit.1:1037 msgid "" "Specifies that the suite to be operated on is part of distro I. " "This overrides the default value found from the git config option BIB<.distro>. The only effect is that other configuration " "variables (used for accessing the archive and dgit-repos) used are BIB<.*>." msgstr "" #. type: Plain text #: ../dgit.1:1043 msgid "" "If your suite is part of a distro that dgit already knows about, you can use " "this option to make dgit work even if your dgit doesn't know about the " "suite. For example, specifying B<-ddebian> will work when the suite is an " "unknown suite in the Debian archive." msgstr "" #. type: Plain text #: ../dgit.1:1048 msgid "" "To define a new distro it is necessary to define methods and URLs for " "fetching (and, for dgit push, altering) a variety of information both in the " "archive and in dgit-repos. How to set this up is not yet documented." msgstr "" #. type: TP #: ../dgit.1:1048 #, no-wrap msgid "B<--split-view=auto>|B|B" msgstr "" #. type: Plain text #: ../dgit.1:1053 msgid "" "Controls whether dgit operates a split view, separating your own branch (as " "Debian maintainer) from that shown to users of dgit clone and dgit fetch." msgstr "" #. type: Plain text #: ../dgit.1:1061 msgid "" "When split view is in operation dgit will not make or merge any commits onto " "your own branch. Specifically, only the dgit view will contain dgit's " "pseudomerges, which bring into the git history previous uploads made with " "dgit push, and any commits in debian/patches required to make a correct `3.0 " "(quilt)' source package." msgstr "" #. type: Plain text #: ../dgit.1:1067 msgid "" "B is the default, and splits the view only when needed: i.e., when you " "are working with a `3.0 (quilt)' source package and a splitting quilt mode: " "--[quilt=]gbp, dpm, unpatched or baredebian*." msgstr "" #. type: Plain text #: ../dgit.1:1070 msgid "" "B splits the view regardless of the source format and the quilt mode." msgstr "" #. type: Plain text #: ../dgit.1:1073 msgid "B will cause dgit to fail if split view is needed." msgstr "" #. type: Plain text #: ../dgit.1:1081 msgid "" "When split view is in operation, the dgit view is visible in your local git " "clone, but only in refs specific to dgit: notably BI and BIBI." msgstr "" #. type: Plain text #: ../dgit.1:1084 msgid "" "Note that split view does not affect dgit fetch, and is not compatible with " "dgit pull." msgstr "" #. type: TP #: ../dgit.1:1084 #, no-wrap msgid "B<-C>I" msgstr "" #. type: Plain text #: ../dgit.1:1089 msgid "" "Specifies the .changes file which is to be uploaded. By default dgit push " "looks for a single .changes file in the parent directory whose filename " "suggests it is for the right package and version." msgstr "" #. type: Plain text #: ../dgit.1:1098 msgid "" "If the specified I pathname contains slashes, the directory " "part is also used as the value for B<--build-products-dir>; otherwise, the " "changes file is expected in that directory (by default, in B<..>)." msgstr "" #. type: TP #: ../dgit.1:1098 #, no-wrap msgid "B<--upstream-commitish=>I" msgstr "" #. type: Plain text #: ../dgit.1:1106 msgid "" "For use with --quilt=baredebian only. Specifies the commit containing the " "upstream source. This commit must be identical to your .orig tarball. The " "default is to look for one of the git tags IB< v>IB< upstream/>I " "(in that order), where U is the upstream version." msgstr "" #. type: TP #: ../dgit.1:1106 #, no-wrap msgid "B<--rm-old-changes>" msgstr "" #. type: Plain text #: ../dgit.1:1118 msgid "" "When doing a build, delete any changes files matching " "IB<_>IB<_*.changes> before starting. This ensures that " "dgit push (and dgit sbuild) will be able to unambiguously identify the " "relevant changes files from the most recent build, even if there have been " "previous builds with different tools or options. The default is not to " "remove, but B<--no-rm-old-changes> can be used to override a previous --rm-" "old-changes or the .rm-old-changes configuration setting." msgstr "" #. type: Plain text #: ../dgit.1:1121 msgid "" "Note that B will always find the right .changes, " "regardless of this option." msgstr "" #. type: TP #: ../dgit.1:1121 #, no-wrap msgid "B<--build-products-dir=>I" msgstr "" #. type: Plain text #: ../dgit.1:1125 msgid "" "Specifies where to find and create tarballs, binary packages, source " "packages, .changes files, and so on." msgstr "" #. type: Plain text #: ../dgit.1:1128 msgid "By default, dgit uses the parent directory (B<..>)." msgstr "" #. type: Plain text #: ../dgit.1:1137 msgid "" "Changing this setting may necessitate moving .orig tarballs to the new " "directory, so it is probably best to use the B configuration setting (see CONFIGURATION, below) which this command " "line option overrides)." msgstr "" #. type: TP #: ../dgit.1:1137 #, no-wrap msgid "B<--no-rm-on-error>" msgstr "" #. type: Plain text #: ../dgit.1:1140 msgid "Do not delete the destination directory if clone fails." msgstr "" #. type: TP #: ../dgit.1:1140 #, no-wrap msgid "B<--dep14tag>" msgstr "" #. type: Plain text #: ../dgit.1:1147 msgid "" "Generates a DEP-14 tag (eg BI) as well as a dgit tag (eg " "BI). This is the default." msgstr "" #. type: TP #: ../dgit.1:1147 #, no-wrap msgid "B<--no-dep14tag>" msgstr "" #. type: Plain text #: ../dgit.1:1150 msgid "Do not generate a DEP-14 tag, except when split view is in operation." msgstr "" #. type: TP #: ../dgit.1:1150 #, no-wrap msgid "B<--always-dep14tag>" msgstr "" #. type: Plain text #: ../dgit.1:1153 msgid "Obsolete alias for --dep14tag, retained for compatibility." msgstr "" #. type: TP #: ../dgit.1:1153 #, no-wrap msgid "B<-D>" msgstr "" #. type: Plain text #: ../dgit.1:1157 msgid "" "Prints debugging information to stderr. Repeating the option produces more " "output (currently, up to -DDDD is meaningfully different)." msgstr "" #. type: TP #: ../dgit.1:1157 #, no-wrap msgid "B<-c>IB<=>I" msgstr "" #. type: Plain text #: ../dgit.1:1161 msgid "" "Specifies a git configuration option, to be used for this run. dgit itself " "is also controlled by git configuration options." msgstr "" #. type: TP #: ../dgit.1:1161 #, no-wrap msgid "B<-v>I|B<_> | B<--since-version=>versionI<|>B<_>" msgstr "" #. type: Plain text #: ../dgit.1:1170 msgid "" "Specifies the B<-v>I option to pass to dpkg-genchanges, during " "builds. Changes (from debian/changelog) since this version will be included " "in the built changes file, and hence in the upload. If this option is not " "specified, dgit will query the archive and use the latest version uploaded " "to the intended suite." msgstr "" #. type: Plain text #: ../dgit.1:1176 msgid "" "Specifying B<_> inhibits this, so that no -v option will be passed to dpkg-" "genchanges (and as a result, only the last stanza from debian/changelog will " "be used for the build and upload)." msgstr "" #. type: TP #: ../dgit.1:1176 #, no-wrap msgid "B<-m>I" msgstr "" #. type: Plain text #: ../dgit.1:1179 msgid "Passed to dpkg-genchanges (eventually)." msgstr "" #. type: TP #: ../dgit.1:1179 #, no-wrap msgid "B<--ch:>I config when B, " "or when pushing and B." msgstr "" #. type: TP #: ../dgit.1:1580 #, no-wrap msgid "BIB<.git-url>" msgstr "" #. type: TP #: ../dgit.1:1582 #, no-wrap msgid "BIB<.git-url>[B<-suffix>]" msgstr "" #. type: TP #: ../dgit.1:1584 #, no-wrap msgid "BIB<.git-proto>" msgstr "" #. type: TP #: ../dgit.1:1586 #, no-wrap msgid "BIB<.git-path>" msgstr "" #. type: TP #: ../dgit.1:1588 #, no-wrap msgid "BIB<.git-check> B|B|B|B" msgstr "" #. type: TP #: ../dgit.1:1590 #, no-wrap msgid "BIB<.git-check-suffix>" msgstr "" #. type: TP #: ../dgit.1:1592 #, no-wrap msgid "BIB<.policy-query-supported-ssh>I< >BI<|>BI<|>B" msgstr "" #. type: TP #: ../dgit.1:1594 #, no-wrap msgid "BIB<.diverts.divert> B|BI" msgstr "" #. type: TP #: ../dgit.1:1596 #, no-wrap msgid "BIB<.git-create>I< >BI<|>B" msgstr "" #. type: TP #: ../dgit.1:1598 #, no-wrap msgid "BIB<.archive-query> B | BI | BI | BIB<@>IB<:>IB< >|B< aptget:>" msgstr "" #. type: TP #: ../dgit.1:1600 #, no-wrap msgid "BIB<.archive-query->(B|B|B)" msgstr "" #. type: TP #: ../dgit.1:1602 #, no-wrap msgid "BIB<.madison-distro>" msgstr "" #. type: TP #: ../dgit.1:1604 #, no-wrap msgid "BIB<.archive-query-default-component>" msgstr "" #. type: TP #: ../dgit.1:1606 #, no-wrap msgid "BIB<.dep14tag> B|B[|B]" msgstr "" #. type: TP #: ../dgit.1:1608 #, no-wrap msgid "BIB<.ssh>" msgstr "" #. type: TP #: ../dgit.1:1610 #, no-wrap msgid "BIB<.sshpsql-dbname>" msgstr "" #. type: TP #: ../dgit.1:1612 #, no-wrap msgid "BIB<.>(B|B)B<->(B|B|B)" msgstr "" #. type: TP #: ../dgit.1:1614 #, no-wrap msgid "BIB<.backports-quirk>" msgstr "" #. type: TP #: ../dgit.1:1616 #, no-wrap msgid "BIB<.rewrite-map-enable>" msgstr "" #. type: TP #: ../dgit.1:1618 #, no-wrap msgid "BIB<.source-only-uploads> B|B|B|B" msgstr "" #. type: TP #: ../dgit.1:1620 #, no-wrap msgid "B" msgstr "" #. type: TP #: ../dgit.1:1622 #, no-wrap msgid "BI" msgstr "" #. type: TP #: ../dgit.1:1624 #, no-wrap msgid "B" msgstr "" #. type: TP #: ../dgit.1:1626 #, no-wrap msgid "B" msgstr "" #. type: TP #: ../dgit.1:1628 #, no-wrap msgid "BI< >BI<|>BI<|>B" msgstr "" #. type: Plain text #: ../dgit.1:1632 msgid "Controls the behaviour of B." msgstr "" #. type: TP #: ../dgit.1:1632 #, no-wrap msgid "B I[B<;>...]" msgstr "" #. type: SH #: ../dgit.1:1634 #, no-wrap msgid "ENVIRONMENT VARIABLES" msgstr "" #. type: TP #: ../dgit.1:1635 #, no-wrap msgid "B, B" msgstr "" #. type: Plain text #: ../dgit.1:1644 msgid "" "specify an alternative default program (and perhaps arguments) to use " "instead of ssh. DGIT_SSH is consulted first and may contain arguments; if " "it contains any whitespace will be passed to the shell. GIT_SSH specifies " "just the program; no arguments can be specified, so dgit interprets it the " "same way as git does. See also the --ssh= and --ssh: options." msgstr "" #. type: TP #: ../dgit.1:1644 #, no-wrap msgid "B, B" msgstr "" #. type: Plain text #: ../dgit.1:1648 msgid "" "Default git user.email and user.name for new trees. See B." msgstr "" #. type: TP #: ../dgit.1:1648 #, no-wrap msgid "B, B..., B, B, [B]B, B" msgstr "" #. type: Plain text #: ../dgit.1:1653 msgid "" "and other subprograms and modules used by dgit are affected by various " "environment variables. Consult the documentation for those programs for " "details." msgstr "" #. type: SH #: ../dgit.1:1653 #, no-wrap msgid "BUGS" msgstr "" #. type: Plain text #: ../dgit.1:1660 msgid "" "There should be a `dgit rebase-prep' command or some such to turn a fast-" "forwarding branch containing pseudo-merges back into a rebasing patch " "stack. It might have to leave a note for a future dgit push." msgstr "" #. type: Plain text #: ../dgit.1:1666 msgid "" "If the dgit push fails halfway through, it is not necessarily restartable " "and idempotent. It would be good to check that the proposed signing key is " "available before starting work." msgstr "" #. type: Plain text #: ../dgit.1:1671 msgid "" "dgit's build functions, and dgit push, may make changes to your current " "HEAD. Sadly this is necessary for packages in the `3.0 (quilt)' source " "format. This is ultimately due to what I consider design problems in quilt " "and dpkg-source." msgstr "" #. type: Plain text #: ../dgit.1:1676 msgid "" "--dry-run does not always work properly, as not doing some of the git " "fetches may result in subsequent actions being different. Doing a non-dry-" "run dgit fetch first will help. --damp-run is likely to work much better." msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:637 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: Plain text #: ../dgit.1:1685 msgid "" "B(7), B(7), B(1), B(1), B(1), B(1), B(1), B(1)," msgstr "" #. type: Plain text #: ../dgit.1:1686 msgid "https://browse.dgit.debian.org/" msgstr "" work/po4a/dgit_7.pot0000644000000000000000000006664414761250142011514 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 00:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: TH #: ../dgit.1:2 ../dgit.7:1 #, no-wrap msgid "dgit" msgstr "" #. type: TH #: ../dgit.1:2 ../dgit.7:1 #, no-wrap msgid "Debian Project" msgstr "" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:637 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: Plain text #: ../dgit.7:4 msgid "dgit - principles of operation" msgstr "" #. type: =head1 #: ../dgit.7:4 ../dgit-user.7.pod:27 ../dgit-nmu-simple.7.pod:35 #, no-wrap msgid "SUMMARY" msgstr "" #. type: Plain text #: ../dgit.7:14 msgid "" "B treats the Debian archive as a version control system, and " "bidirectionally gateways between the archive and git. The git view of the " "package can contain the usual upstream git history, and will be augmented by " "commits representing uploads done by other developers not using dgit. This " "git history is stored in a canonical location known as B which " "lives on a dedicated git server." msgstr "" #. type: Plain text #: ../dgit.7:23 msgid "" "git branches suitable for use with dgit can be edited directly in git, and " "used directly for building binary packages. They can be shared using all " "conventional means for sharing git branches. It is not necessary to use " "dgit to work with dgitish git branches. However, dgit is (usually) needed " "in order to convert to or from Debian-format source packages." msgstr "" #. type: TP #: ../dgit.7:24 #, no-wrap msgid "B(1)" msgstr "" #. type: Plain text #: ../dgit.7:27 msgid "Reference manual and documentation catalogue." msgstr "" #. type: TP #: ../dgit.7:27 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:30 msgid "Tutorials and workflow guides. See dgit(1) for a list." msgstr "" #. type: SH #: ../dgit.7:30 #, no-wrap msgid "MODEL" msgstr "" #. type: Plain text #: ../dgit.7:33 msgid "" "You may use any suitable git workflow with dgit, provided you satisfy dgit's " "requirements:" msgstr "" #. type: Plain text #: ../dgit.7:38 msgid "" "dgit maintains a pseudo-remote called B, with one branch per suite. " "This remote cannot be used with plain git." msgstr "" #. type: Plain text #: ../dgit.7:45 msgid "" "The B repository for each package contains one ref per suite " "named BI. These should be pushed to only by dgit. They " "are fast forwarding. Each push on this branch corresponds to an upload (or " "attempted upload)." msgstr "" #. type: Plain text #: ../dgit.7:49 msgid "" "However, it is perfectly fine to have other branches in dgit-repos; normally " "the dgit-repos repo for the package will be accessible via the remote name " "`origin'." msgstr "" #. type: Plain text #: ../dgit.7:55 msgid "" "dgit push-* will also make signed tags called BI " "(with version encoded a la DEP-14) and push them to dgit-repos. These are " "used at the server to authenticate pushes." msgstr "" #. type: Plain text #: ../dgit.7:65 msgid "" "Uploads made by dgit contain an additional field B in the source " "package .dsc. (This is added by dgit push-*.) This specifies: a commit (an " "ancestor of the dgit/suite branch) whose tree is identical to the unpacked " "source upload; the distro to which the upload was made; a tag name which can " "be used to fetch the git commits; and a url to use as a hint for the dgit " "git server for that distro." msgstr "" #. type: Plain text #: ../dgit.7:77 msgid "" "Uploads not made by dgit are represented in git by commits which are " "synthesised by dgit. The tree of each such commit corresponds to the " "unpacked source; there is a commit with the contents, and a pseudo-merge " "from last known upload - that is, from the contents of the dgit/suite " "branch. Depending on the source package format, the contents commit may " "have a more complex structure, but ultimately it will be a convergence of " "stubby branches from origin commits representing the components of the " "source package." msgstr "" #. type: Plain text #: ../dgit.7:82 msgid "" "dgit expects trees that it works with to have a B (pseudo) remote. " "This refers to the dgit-created git view of the corresponding archive." msgstr "" #. type: Plain text #: ../dgit.7:91 msgid "" "The dgit archive tracking view is synthesised locally, on demand, by each " "copy of dgit. The tracking view is always a descendant of the dgit-repos " "suite branch (if one exists), but may be ahead of it if uploads have been " "done without dgit. The archive tracking view is always fast forwarding " "within each suite." msgstr "" #. type: Plain text #: ../dgit.7:94 msgid "" "dgit push-* can operate on any commit which is a descendant of the suite " "tracking branch." msgstr "" #. type: Plain text #: ../dgit.7:105 msgid "" "dgit does not make a systematic record of its imports of orig tarball(s). " "So it does not work by finding git tags or branches referring to orig " "tarball(s). The orig tarballs are downloaded (by dgit clone) into the " "parent directory, as with a traditional (non-gitish) dpkg-source workflow. " "You need to retain these tarballs in the parent directory for dgit build and " "dgit push-*. (They are not needed for purely-git-based workflows.)" msgstr "" #. type: Plain text #: ../dgit.7:112 msgid "" "dgit repositories could be cloned with standard (git) methods. However, the " "dgit repositories do not contain uploads not made with dgit. And for " "sourceful builds / uploads the orig tarball(s) will need to be present in " "the parent directory." msgstr "" #. type: Plain text #: ../dgit.7:119 msgid "" "To a user looking at the archive, changes pushed in a simple NMU using dgit " "look like reasonable changes made in an NMU: in a `3.0 (quilt)' package the " "delta from the previous upload is recorded in new patch(es) constructed by " "dpkg-source." msgstr "" #. type: SH #: ../dgit.7:119 #, no-wrap msgid "COMBINED SUITES" msgstr "" #. type: Plain text #: ../dgit.7:124 msgid "" "dgit can synthesize a combined view of several underlying suites. This is " "requested by specifying, for I a comma-separated list:" msgstr "" #. type: Plain text #: ../dgit.7:126 msgid "IB<,>I..." msgstr "" #. type: Plain text #: ../dgit.7:128 msgid "This facility is available with dgit clone, fetch and pull, only." msgstr "" #. type: Plain text #: ../dgit.7:138 msgid "" "dgit will fetch the same package from each specified underlying suite, " "separately (as if with dgit fetch). dgit will then generate a pseudomerge " "commit on the tracking branch BI which has the " "tip of each of the underlying suites as an ancestor, and which contains the " "same as the suite which has the highest version of the package." msgstr "" #. type: Plain text #: ../dgit.7:141 msgid "" "The package must exist in mainsuite, but need not exist in the subsuites." msgstr "" #. type: Plain text #: ../dgit.7:145 msgid "If a specified subsuite starts with B<-> then mainsuite is prepended." msgstr "" #. type: Plain text #: ../dgit.7:153 msgid "" "So, for example, B means to look for the package in " "stable, and stable-security, taking whichever is newer. If stable is " "currently jessie, dgit clone would leave you on the branch B." msgstr "" #. type: Plain text #: ../dgit.7:161 msgid "" "Combined suites are not supported by the dgit build operations. This is " "because those options are intended for building for uploading source " "packages, and look in the changelog to find the relevant suite. It does not " "make sense to name a dgit-synthesised combined suite in a changelog, or to " "try to upload to it." msgstr "" #. type: Plain text #: ../dgit.7:166 msgid "" "When using this facility, it is important to always specify the same suites " "in the same order: dgit will not make a coherent fast-forwarding history " "view otherwise." msgstr "" #. type: Plain text #: ../dgit.7:170 msgid "" "The history generated by this feature is not normally suitable for merging " "back into upstreams, as it necessarily contains unattractive pseudomerges." msgstr "" #. type: SH #: ../dgit.7:170 #, no-wrap msgid "LIMITATIONS" msgstr "" #. type: Plain text #: ../dgit.7:183 msgid "" "Because the synthesis of the suite tracking branches is done locally based " "only on the current archive state, it will not necessarily see every upload " "not done with dgit. Also, different versions of dgit (or the software it " "calls) might import the same .dscs differently (although we try to minimise " "this). As a consequence, the dgit tracking views of the same suite, made by " "different instances of dgit, may vary. They will have the same contents, " "but may have different history." msgstr "" #. type: Plain text #: ../dgit.7:192 msgid "" "There is no uniform linkage between the tracking branches for different " "suites. The Debian infrastructure does not do any automatic import of " "uploads made without dgit. It would be possible for a distro's " "infrastructure to do this; in that case, different dgit client instances " "would see exactly the same history." msgstr "" #. type: Plain text #: ../dgit.7:200 msgid "" "There has been no bulk import of historical uploads into Debian's dgit " "infrastructure. To do this it would be necessary to decide whether to " "import existing vcs history (which might not be faithful to dgit's " "invariants) or previous non-Dgit uploads (which would not provide a very " "rich history)." msgstr "" #. type: Plain text #: ../dgit.7:211 msgid "" "git represents only file executability. git does not represent empty " "directories, or any leaf objects other than plain files and symlinks. The " "behaviour of Debian source package formats on objects with unusual " "permissions is complicated. Some pathological Debian source packages will " "no longer build if empty directories are pruned (or if other things not " "reproduced by git are changed). Such sources cannot be worked with properly " "in git, and therefore not with dgit either." msgstr "" #. type: SH #: ../dgit.7:211 #, no-wrap msgid "READ-ONLY DISTROS" msgstr "" #. type: Plain text #: ../dgit.7:215 msgid "" "Distros which do not maintain a set of dgit history git repositories can " "still be used in a read-only mode with dgit. Currently Ubuntu is configured " "this way." msgstr "" #. type: SH #: ../dgit.7:215 #, no-wrap msgid "GITATTRIBUTES" msgstr "" #. type: Plain text #: ../dgit.7:223 msgid "" "git has features which can automatically transform files as they are being " "copied between the working tree and the git history. The attributes can be " "specified in the source tree itself, in B<.gitattributes>. See " "B(5)." msgstr "" #. type: Plain text #: ../dgit.7:232 msgid "" "These transformations are context-sensitive and not, in general, reversible, " "so dgit operates on the principle that the dgit git history contains the " "actual contents of the package. (When dgit is manipulating a .dsc, it does " "so in a private area, where the transforming gitattributes are defused, to " "achieve this.)" msgstr "" #. type: Plain text #: ../dgit.7:241 msgid "" "If transforming gitattributes are used, they can cause trouble, because the " "working tree files can differ from the git revision history (and therefore " "from the source packages). dgit warns if it finds a .gitattributes file (in " "a package being fetched or imported), unless the transforming gitattributes " "have been defused." msgstr "" #. type: Plain text #: ../dgit.7:252 msgid "" "dgit clone and dgit setup-new-tree disable transforming gitattributes by " "default, by creating a suitable .git/info/attributes. See B and B in dgit(1)." msgstr "" #. type: Plain text #: ../dgit.7:262 msgid "" "Note that dgit does not disable gitattributes unless they would actually " "interfere with your work on dgit branches. In particular, gitattributes " "which affect B are not disabled, so .origs you generate by hand " "can be wrong. You should consider using B which gets this " "right, suppressing the attributes." msgstr "" #. type: SH #: ../dgit.7:262 #, no-wrap msgid "PACKAGE SOURCE FORMATS" msgstr "" #. type: Plain text #: ../dgit.7:267 msgid "" "If you are not the maintainer, you do not need to worry about the source " "format of the package. You can just make changes as you like in git. If " "the package is a `3.0 (quilt)' package, the patch stack will usually not be " "represented in the git history." msgstr "" #. type: SH #: ../dgit.7:267 #, no-wrap msgid "FILE EXECUTABILITY" msgstr "" #. type: Plain text #: ../dgit.7:274 msgid "" "Debian source package formats do not always faithfully reproduce changes to " "executability. But dgit insists that the result of dgit clone is identical " "(as far as git can represent - see Limitations, above) to the result of " "dpkg-source -x." msgstr "" #. type: Plain text #: ../dgit.7:280 msgid "" "So files that are executable in your git tree must be executable in the " "result of dpkg-source -x (but often aren't). If a package has such " "troublesome files, they have to be non-executable in dgit-compatible git " "branches." msgstr "" #. type: SH #: ../dgit.7:280 #, no-wrap msgid "FORMAT 3.0 (QUILT)" msgstr "" #. type: Plain text #: ../dgit.7:284 msgid "" "For a format `3.0 (quilt)' source package, dgit may have to make a commit on " "your current branch to contain metadata used by quilt and dpkg-source." msgstr "" #. type: Plain text #: ../dgit.7:291 msgid "" "This is because `3.0 (quilt)' source format represents the patch stack as " "files in debian/patches/ actually inside the source tree. This means that, " "taking the whole tree (as seen by git or ls) (i) dpkg-source cannot " "represent certain trees, and (ii) packing up a tree in `3.0 (quilt)' and " "then unpacking it does not always yield the same tree." msgstr "" #. type: Plain text #: ../dgit.7:296 msgid "" "dgit will automatically work around this for you when building and pushing. " "The only thing you need to know is that dgit build, sbuild, etc., may make " "new commits on your HEAD. If you're not a quilt user this commit won't " "contain any changes to files you care about." msgstr "" #. type: Plain text #: ../dgit.7:303 msgid "" "Simply committing to source files (whether in debian/ or not, but not to " "patches) will result in a branch that dgit quilt-fixup can linearise. " "Other kinds of changes, including editing patches or merging, cannot be " "handled this way." msgstr "" #. type: Plain text #: ../dgit.7:306 msgid "" "You can explicitly request that dgit do just this fixup, by running dgit " "quilt-fixup." msgstr "" #. type: Plain text #: ../dgit.7:313 msgid "" "If you are a quilt user you need to know that dgit's git trees are `patches " "applied packaging branches' and do not contain the .pc directory (which is " "used by quilt to record which patches are applied). If you want to " "manipulate the patch stack you probably want to be looking at tools like git-" "debrebase, gbp pq, or git-dpm." msgstr "" #. type: SS #: ../dgit.7:314 #, no-wrap msgid "quilt fixup error messages" msgstr "" #. type: Plain text #: ../dgit.7:316 msgid "When dgit's quilt fixup fails, it prints messages like this:" msgstr "" #. type: Plain text #: ../dgit.7:322 #, no-wrap msgid "" "dgit: base trees orig=5531f03d8456b702eab6 o+d/p=135338e9cc253cc85f84\n" "dgit: quilt differences: src: == orig ## gitignores: == orig ##\n" "dgit: quilt differences: HEAD ## o+d/p HEAD ## o+d/p\n" "starting quiltify (multiple patches, linear mode)\n" msgstr "" #. type: Plain text #: ../dgit.7:325 #, no-wrap msgid "" "dgit: error: quilt fixup cannot be linear. Stopped at:\n" "dgit: 696c9bd5..84ae8f96: changed debian/patches/test-gitignore\n" msgstr "" #. type: TP #: ../dgit.7:327 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:333 msgid "" "is an import of the .orig tarballs dgit found, with the debian/ directory " "from your HEAD substituted. This is a git tree object, not a commit: you " "can pass its hash to git-diff but not git-log." msgstr "" #. type: TP #: ../dgit.7:334 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:339 msgid "" "is another tree object, which is the same as orig but with the patches from " "debian/patches applied." msgstr "" #. type: TP #: ../dgit.7:340 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:343 msgid "is of course your own git HEAD." msgstr "" #. type: TP #: ../dgit.7:344 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:353 msgid "" "shows whether each of the these trees differs from the others (i) in " "upstream files excluding .gitignore files; (ii) in upstream .gitignore " "files. B<==> indicates equality; B<##> indicates inequality." msgstr "" #. type: Plain text #: ../dgit.7:360 msgid "" "dgit quilt-fixup --quilt=linear walks commits backwards from your HEAD " "trying to construct a linear set of additional patches, starting at the " "end. It hopes to eventually find an ancestor whose tree is identical to o+d/" "p in all upstream files." msgstr "" #. type: Plain text #: ../dgit.7:371 msgid "" "In the error message, 696c9bd5..84ae8f96 is the first commit child-parent " "edge which cannot sensibly be either ignored, or turned into a patch in " "debian/patches. In this example, this is because it itself changes files in " "debian/patches, indicating that something unusual is going on and that " "continuing is not safe. But you might also see other kinds of troublesome " "commit or edge." msgstr "" #. type: Plain text #: ../dgit.7:390 msgid "" "Your appropriate response depends on the cause and the context. If you have " "been freely merging your git branch and do not need need a pretty linear " "patch queue, you can use B<--quilt=single> or B<--quilt=smash>. (Don't use " "the B dpkg source format option; it has strange " "properties.) If you want a pretty linear series, and this message is " "unexpected, it can mean that you have unwittingly committed changes that are " "not representable by dpkg-source (such as some mode changes). Or maybe you " "just forgot a necessary B<--quilt=> option." msgstr "" #. type: Plain text #: ../dgit.7:396 msgid "" "Finally, this problem can occur if you have provided Debian git tooling such " "as git-debrebase, git-dpm or git-buildpackage with upstream git commit(s) or " "tag(s) which are not 100% identical to your orig tarball(s)." msgstr "" #. type: SH #: ../dgit.7:396 #, no-wrap msgid "SPLIT VIEW AND SPLITTING QUILT MODES" msgstr "" #. type: Plain text #: ../dgit.7:403 msgid "" "When working with git branches intended for use with the `3.0 (quilt)' " "source format dgit can automatically convert a suitable maintainer-provided " "git branch (in one of a variety of formats) into a dgit branch." msgstr "" #. type: Plain text #: ../dgit.7:410 msgid "" "When a splitting quilt mode is selected dgit build commands and dgit push-* " "will, on each invocation, convert the user's HEAD into the dgit view, so " "that it can be built and/or uploaded." msgstr "" #. type: Plain text #: ../dgit.7:416 msgid "" "Split view mode can also be enabled explicitly with the --split-view command " "line option and the .split-view access configuration key." msgstr "" #. type: Plain text #: ../dgit.7:429 msgid "" "When split view is in operation, regardless of the quilt mode, any dgit-" "generated pseudomerges and any quilt fixup commits will appear only in the " "dgit view. dgit push-* will push the dgit view to the dgit git server. The " "dgit view is always a descendant of the maintainer view. dgit push-* will " "also make a maintainer view tag according to DEP-14 and push that to the " "dgit git server." msgstr "" #. type: Plain text #: ../dgit.7:437 msgid "" "Splitting quilt modes must be enabled explicitly (by the use of the " "applicable command line options, subcommands, or configuration). This is " "because it is not possible to reliably tell (for example) whether a git " "tree for a dpkg-source `3.0 (quilt)' package is a patches-applied or patches-" "unapplied tree." msgstr "" #. type: Plain text #: ../dgit.7:441 msgid "" "Split view conversions are cached in the ref dgit-intern/quilt-cache. This " "should not be manipulated directly." msgstr "" #. type: SH #: ../dgit.7:441 #, no-wrap msgid "FILES IN THE ORIG TARBALL BUT NOT IN GIT - AUTOTOOLS ETC." msgstr "" #. type: Plain text #: ../dgit.7:444 msgid "" "This section is mainly of interest to maintainers who want to use dgit with " "their existing git history for the Debian package." msgstr "" #. type: Plain text #: ../dgit.7:450 msgid "" "Some developers like to have an extra-clean git tree which lacks files which " "are normally found in source tarballs and therefore in Debian source " "packages. For example, it is conventional to ship ./configure in the source " "tarball, but some people prefer not to have it present in the git view of " "their project." msgstr "" #. type: Plain text #: ../dgit.7:456 msgid "" "dgit requires that the source package unpacks to exactly the same files as " "are in the git commit on which dgit push-* operates. So if you just try to " "dgit push-* directly from one of these extra-clean git branches, it will " "fail." msgstr "" #. type: Plain text #: ../dgit.7:458 msgid "As the maintainer you therefore have the following options:" msgstr "" #. type: TP #: ../dgit.7:458 ../dgit.7:469 ../dgit.7:518 ../dgit.7:526 #, no-wrap msgid "\\(bu" msgstr "" #. type: Plain text #: ../dgit.7:469 msgid "" "Delete the files from your git branches, and your Debian source packages, " "and carry the deletion as a delta from upstream. (With `3.0 (quilt)' this " "means representing the deletions as patches. You may need to pass --include-" "removal to dpkg-source --commit, or pass corresponding options to other " "tools.) This can make the Debian source package less useful for people " "without Debian build infrastructure." msgstr "" #. type: Plain text #: ../dgit.7:475 msgid "" "Persuade upstream that the source code in their git history and the source " "they ship as tarballs should be identical. Of course simply removing the " "files from the tarball may make the tarball hard for people to use." msgstr "" #. type: Plain text #: ../dgit.7:481 msgid "" "One answer is to commit the (maybe autogenerated) files, perhaps with some " "simple automation to deal with conflicts and spurious changes. This has the " "advantage that someone who clones the git repository finds the program just " "as easy to build as someone who uses the tarball." msgstr "" #. type: Plain text #: ../dgit.7:486 msgid "" "Of course it may also be that the differences are due to build system bugs, " "which cause unintended files to end up in the source package. dgit will " "notice this and complain. You may have to fix these bugs before you can " "unify your existing git history with dgit's." msgstr "" #. type: SH #: ../dgit.7:487 #, no-wrap msgid "FILES IN THE SOURCE PACKAGE BUT NOT IN GIT - DOCS, BINARIES ETC." msgstr "" #. type: Plain text #: ../dgit.7:491 msgid "" "Some upstream tarballs contain build artifacts which upstream expects some " "users not to want to rebuild (or indeed to find hard to rebuild), but which " "in Debian we always rebuild." msgstr "" #. type: Plain text #: ../dgit.7:501 msgid "" "Examples sometimes include crossbuild firmware binaries and documentation. " "To avoid problems when building updated source packages (in particular, to " "avoid trying to represent as changes in the source package uninteresting or " "perhaps unrepresentable changes to such files) many maintainers arrange for " "the package clean target to delete these files." msgstr "" #. type: Plain text #: ../dgit.7:509 msgid "" "dpkg-source does not (with any of the commonly used source formats) " "represent deletion of binaries (outside debian/) present in upstream. Thus " "deleting such files in a dpkg-source working tree does not actually result " "in them being deleted from the source package. Thus deleting the files in " "rules clean sweeps this problem under the rug." msgstr "" #. type: Plain text #: ../dgit.7:515 msgid "" "However, git does always properly record file deletion. Since dgit's " "principle is that the dgit git tree is the same of dpkg-source -x, that " "means that a dgit-compatible git tree always contains these files." msgstr "" #. type: Plain text #: ../dgit.7:518 msgid "" "For the non-maintainer, this can be observed in the following suboptimal " "occurrences:" msgstr "" #. type: Plain text #: ../dgit.7:526 msgid "" "The package clean target often deletes these files, making the git tree " "dirty trying to build the source package, etc. This can be fixed by using " "B aka B<--clean=git>, so that the package clean target is never " "run." msgstr "" #. type: Plain text #: ../dgit.7:533 msgid "" "The package build modifies these files, so that builds make the git tree " "dirty. This can be worked around by using `git reset --hard' after each " "build (or at least before each commit or push)." msgstr "" #. type: Plain text #: ../dgit.7:543 msgid "" "From the maintainer's point of view, the main consequence is that to make a " "dgit-compatible git branch it is necessary to commit these files to git. " "The maintainer has a few additional options for mitigation: for example, it " "may be possible for the rules file to arrange to do the build in a temporary " "area, which avoids updating the troublesome files; they can then be left in " "the git tree without seeing trouble." msgstr "" #. type: SH #: ../dgit.7:543 #, no-wrap msgid "PROBLEMS WITH PACKAGE CLEAN TARGETS ETC." msgstr "" #. type: Plain text #: ../dgit.7:551 msgid "" "A related problem is other unexpected behaviour by a package's B " "target. If a package's rules modify files which are distributed in the " "package, or simply forget to remove certain files, dgit will complain that " "the tree is dirty." msgstr "" #. type: Plain text #: ../dgit.7:559 msgid "" "Again, the solution is to use B aka B<--clean=git>, which " "instructs dgit to use git clean instead of the package's build target, along " "with perhaps B before each build." msgstr "" #. type: Plain text #: ../dgit.7:563 msgid "" "This is 100% reliable, but has the downside that if you forget to git add or " "to commit, and then use B or B, your changes may " "be lost." msgstr "" work/po4a/git-debrebase_1.pot0000644000000000000000000007452514761250142013251 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2022-12-29 11:56+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:548 ../git-debrebase.1.pod:477 #, no-wrap msgid "OPTIONS" msgstr "" #. type: =head1 #: ../dgit.1:1676 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:547 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:322 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:647 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:261 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:3 msgid "" "git-debrebase - tool to maintain series of Debian changes to upstream source" msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:5 msgid "SYNOPSYS" msgstr "" #. type: verbatim #: ../git-debrebase.1.pod:7 #, no-wrap msgid "" " git-debrebase [] [-- ]\n" " git-debrebase [] [\n" "\n" msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:10 msgid "QUICK REFERENCE" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:12 msgid "These are most of the commands you will regularly need:" msgstr "" #. type: verbatim #: ../git-debrebase.1.pod:14 #, no-wrap msgid "" " git debrebase -i # edit the patch queue\n" " git debrebase conclude && git push # push to eg salsa\n" " git debrebase conclude && dgit push-source # source-only upload\n" " git debrebase new-upstream 1.2.3-1 [-i] # uses tag, eg \"v1.2.3\"\n" " dpkg-buildpackage -uc -b # get test debs, at any time\n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:20 msgid "" "To add patches, or edit the packaging, just make git commits. Ignore " "anything that may appear in debian/patches. Avoid using \"git pull\" and " "\"git merge\" without \"--ff-only\"." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:24 msgid "" "git-debrebase has a special branch format, so see \"CONVERTING AN EXISTING " "PACKAGE\" in L." msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:27 msgid "GUIDE TO DOCUMENTATION" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:29 msgid "" "This is the command line reference. There is also a detailed workflow " "tutorial at L (on which the above \"QUICK REFERENCE" "\" is based). For background, theory of operation, and definitions see " "L." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:36 msgid "" "You should read this manpage in conjunction with L, which defines many important terms used here." msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:40 msgid "PRINCIPAL OPERATIONS" msgstr "" #. type: =item #: ../git-debrebase.1.pod:44 msgid "git-debrebase [-- ]" msgstr "" #. type: =item #: ../git-debrebase.1.pod:46 msgid "git-debrebase [-i ]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:48 msgid "" "Unstitches and launders the branch. (See L " "below.)" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:51 msgid "" "Then, if any git-rebase options were supplied, edits the Debian delta queue, " "using git-rebase, by running" msgstr "" #. type: verbatim #: ../git-debrebase.1.pod:55 #, no-wrap msgid "" " git rebase \n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:57 msgid "" "Do not pass a base branch argument: git-debrebase will supply that. Do not " "use --onto, or --fork-point. Useful git-rebase options include -i and --" "autosquash." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:62 msgid "" "If git-rebase stops for any reason, you may git-rebase --abort, --continue, " "or --skip, as usual. If you abort the git-rebase, the branch will still " "have been laundered, but everything in the rebase will be undone." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:68 msgid "" "The options for git-rebase must either start with C<-i>, or be prececded by " "C<-->, to distinguish them from options for git-debrebase." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:72 msgid "" "It is hazardous to use plain git-rebase on a git-debrebase branch, because " "git-rebase has a tendency to start the rebase too far back in history, and " "then drop important commits. See L" msgstr "" #. type: =item #: ../git-debrebase.1.pod:78 msgid "git-debrebase status" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:80 msgid "" "Analyses the current branch, both in terms of its contents, and the refs " "which are relevant to git-debrebase, and prints a human-readable summary." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:85 msgid "" "Please do not attempt to parse the output; it may be reformatted or " "reorganised in the future. Instead, use one of the L described below." msgstr "" #. type: =item #: ../git-debrebase.1.pod:91 msgid "git-debrebase conclude" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:93 msgid "" "Finishes a git-debrebase session, tidying up the branch and making it fast " "forward again." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:96 msgid "" "Specifically: if the branch is unstitched, launders and restitches it, " "making a new pseudomerge. Otherwise, it is an error, unless --noop-ok." msgstr "" #. type: =item #: ../git-debrebase.1.pod:102 msgid "git-debrebase quick" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:104 msgid "" "Unconditionally launders and restitches the branch, consuming any ffq-prev " "and making a new pseudomerge." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:108 msgid "If the branch is already laundered and stitched, does nothing." msgstr "" #. type: =item #: ../git-debrebase.1.pod:110 msgid "git-debrebase prepush [--prose=]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:112 msgid "If the branch is unstitched, stitches it, consuming ffq-prev." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:116 msgid "" "This is a good command to run before pushing to a git server. You should " "consider using B instead, because that launders the branch too." msgstr "" #. type: =item #: ../git-debrebase.1.pod:120 msgid "git-debrebase stitch [--prose=]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:122 msgid "Stitches the branch, consuming ffq-prev." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:125 msgid "If there is no ffq-prev, it is an error, unless --noop-ok." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:127 msgid "You should consider using B or B instead." msgstr "" #. type: =item #: ../git-debrebase.1.pod:129 msgid "git-debrebase scrap" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:131 msgid "" "Throws away all the work since the branch was last stitched. This is done " "by resetting you to ffq-prev and discarding all working tree changes." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:135 msgid "If you are in the middle of a git-rebase, will abort that too." msgstr "" #. type: =item #: ../git-debrebase.1.pod:137 msgid "" "git-debrebase new-upstream [...] [--|-i ]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:139 msgid "Rebases the delta queue onto a new upstream version. In detail:" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:142 msgid "" "Firstly, checks that the proposed rebase seems to make sense: It is a snag " "unless the new upstream(s) are fast forward from the previous upstream(s) " "as found in the current breakwater anchor. And, in the case of a multi-" "piece upstream (a multi-component upstream, in dpkg-source terminology), if " "the pieces are not in the same order, with the same names." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:150 msgid "If all seems well, unstitches and launders the branch." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:152 msgid "" "Then, generates (in a private working area) a new anchor merge commit, on " "top of the breakwater tip, and on top of that a commit to update the version " "number in debian/changelog." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:160 msgid "Finally, starts a git-rebase of the delta queue onto these new commits." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:164 msgid "" "That git-rebase may complete successfully, or it may require your " "assistance, just like a normal git-rebase." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:168 msgid "" "If you git-rebase --abort, the whole new upstream operation is aborted, " "except for the laundering." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:172 msgid "" " may be a whole new Debian version, including revision, or just " "the upstream part, in which case -1 will be appended to make the new Debian " "version." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:178 msgid "The are, optionally, in order:" msgstr "" #. type: =item #: ../git-debrebase.1.pod:182 msgid "" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:184 msgid "" "The new upstream branch (or commit-ish). The default is to look for one of " "these tags, in this order: U vU upstream/U; where U is the new upstream " "version. (This is the same algorithm as L.)" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:190 msgid "" "It is a snag if the upstream contains a debian/ directory; if forced to " "proceed, git-debrebase will disregard the upstream's debian/ and take (only) " "the packaging from the current breakwater." msgstr "" #. type: =item #: ../git-debrebase.1.pod:195 msgid " " msgstr "" #. type: textblock #: ../git-debrebase.1.pod:197 msgid "Specifies that this is a multi-piece upstream. May be repeated." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:200 msgid "" "When such a pair is specified, git-debrebase will first combine the pieces " "of the upstream together, and then use the result as the combined new " "upstream." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:205 msgid "" "For each , the tree of the becomes " "the subdirectory in the combined new upstream (supplanting any " "subdirectory that might be there in the main upstream branch)." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:212 msgid "" " has a restricted syntax: it may contain only ASCII " "alphanumerics and hyphens." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:215 msgid "" "The combined upstream is itself recorded as a commit, with each of the " "upstream pieces' commits as parents. The combined commit contains an " "annotation to allow a future git-debrebase new upstream operation to make " "the coherency checks described above." msgstr "" #. type: =item #: ../git-debrebase.1.pod:221 msgid "" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:223 msgid "These will be passed to git rebase." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:225 msgid "" "If the upstream rebase is troublesome, -i may be helpful. As with plain git-" "debrebase, do not specify a base, or --onto, or --fork-point." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:231 msgid "" "If you are planning to generate a .dsc, you will also need to have, or " "generate, actual orig tarball(s), which must be identical to the rev-" "spec(s) passed to git-debrebase. git-debrebase does not concern itself " "with source packages so neither helps with this, nor checks it. L, L, L and L may be " "able to help." msgstr "" #. type: =item #: ../git-debrebase.1.pod:242 msgid "git-debrebase make-patches [--quiet-would-amend]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:244 msgid "" "Generate patches in debian/patches/ representing the changes made to " "upstream files." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:247 msgid "" "It is not normally necessary to run this command explicitly. When uploading " "to Debian, dgit and git-debrebase will cooperate to regenerate patches as " "necessary. When working with pure git remotes, the patches are not needed." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:254 msgid "" "Normally git-debrebase make-patches will require a laundered branch. (A " "laundered branch does not contain any patches.) But if there are already " "some patches made by git-debrebase make-patches, and all that has happened " "is that more changes to upstream files have been committed, running it again " "can add the missing patches." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:263 msgid "" "If the patches implied by the current branch are not a simple superset of " "those already in debian/patches, make-patches will fail with exit status 7, " "and an error message. (The message can be suppressed with --quiet-would-" "amend.) If the problem is simply that the existing patches were not made by " "git-debrebase, using dgit quilt-fixup instead should succeed." msgstr "" #. type: =item #: ../git-debrebase.1.pod:272 msgid "git-debrebase convert-from-unapplied []" msgstr "" #. type: =item #: ../git-debrebase.1.pod:274 msgid "git-debrebase convert-from-gbp []" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:276 msgid "Converts any of the following into a git-debrebase interchange branch:" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:282 msgid "a gbp patches-unapplied branch (but not a gbp pq patch-queue branch)" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:286 msgid "" "a patches-unapplied git packaging branch containing debian/patches, as used " "with quilt" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:291 msgid "" "a git branch for a package which has no Debian delta - ie where upstream " "files are have not been modified in Debian, so there are no patches" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:297 msgid "(These two commands operate identically and are simply aliases.)" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:299 msgid "" "The conversion is done by generating a new anchor merge, converting any " "quilt patches as a delta queue, and dropping the patches from the tree." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:303 msgid "" "The upstream commit-ish should correspond to the upstream branch or tag, if " "there is one. It is a snag if it is not an ancestor of HEAD, or if the " "history between the upstream and HEAD contains commits which make changes to " "upstream files. If it is not specified, the same algorithm is used as for " "git-debrebase new-upstream." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:311 msgid "" "It is also a snag if the specified upstream has a debian/ subdirectory. " "This check exists to detect certain likely user errors, but if this " "situation is true and expected, forcing it is fine." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:317 msgid "" "git-debrebase will try to look for the dgit archive view of the most recent " "release, and if it finds it will make a pseduomerge so that your new git-" "debrebase view is appropriately fast forward." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:322 msgid "" "The result is a well-formed git-debrebase interchange branch. The result is " "also fast-forward from the original branch." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:325 msgid "" "It is a snag if the new branch looks like it will have diverged, just as for " "a laundering/unstitching call to git-debrebase; See L, below." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:329 msgid "" "Note that it is dangerous not to know whether you are dealing with a (gbp) " "patches-unapplied branch containing quilt patches, or a git-debrebase " "interchange branch. At worst, using the wrong tool for the branch format " "might result in a dropped patch queue!" msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:338 msgid "UNDERLYING AND SUPPLEMENTARY OPERATIONS" msgstr "" #. type: =item #: ../git-debrebase.1.pod:342 msgid "git-debrebase breakwater" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:344 msgid "" "Prints the breakwater tip commitid. If your HEAD branch is not fully " "laundered, prints the tip of the so-far-laundered breakwater." msgstr "" #. type: =item #: ../git-debrebase.1.pod:348 msgid "git-debrebase anchor" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:350 msgid "Prints the breakwater anchor commitid." msgstr "" #. type: =item #: ../git-debrebase.1.pod:352 msgid "git-debrebase analyse" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:354 msgid "" "Walks the history of the current branch, most recent commit first, back " "until the most recent anchor, printing the commit object id, and commit type " "and info (ie the semantics in the git-debrebase model) for each commit." msgstr "" #. type: =item #: ../git-debrebase.1.pod:362 msgid "git-debrebase record-ffq-prev" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:364 msgid "" "Establishes the current branch's ffq-prev, as discussed in L, but does not launder the branch or move HEAD." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:368 msgid "" "It is an error if the ffq-prev could not be recorded. It is also an error " "if an ffq-prev has already been recorded, unless --noop-ok." msgstr "" #. type: =item #: ../git-debrebase.1.pod:372 msgid "git-debrebase launder-v0" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:374 msgid "" "Launders the branch without recording anything in ffq-prev. Then prints " "some information about the current branch. Do not use this operation; it " "will be withdrawn soon." msgstr "" #. type: =item #: ../git-debrebase.1.pod:379 msgid "git-debrebase convert-to-gbp" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:381 msgid "" "Converts a laundered branch into a gbp patches-unapplied branch containing " "quilt patches. The result is not fast forward from the interchange branch, " "and any ffq-prev is deleted." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:386 msgid "" "This is provided mostly for the test suite and for unusual situations. It " "should only be used with care and with a proper understanding of the " "underlying theory." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:391 msgid "" "Be sure to not accidentally treat the result as a git-debrebase branch, or " "you will drop all the patches!" msgstr "" #. type: =item #: ../git-debrebase.1.pod:395 msgid "git-debrebase convert-from-dgit-view [] [upstream]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:397 msgid "" "Converts any dgit-compatible git branch corresponding to a (possibly " "hypothetical) 3.0 quilt dsc source package into a git-debrebase-compatible " "branch." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:401 msgid "" "This operation should not be used if the branch is already in git-debrebase " "form. Normally git-debrebase will refuse to continue in this case (or " "silently do nothing if the global --noop-ok option is used)." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:406 msgid "" "Some representation of the original upstream source code will be needed. If " "I is supplied, that must be a suitable upstream commit. By " "default, git-debrebase will look first for git tags (as for new-upstream), " "and then for orig tarballs which it will ask dgit to process." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:412 msgid "" "The upstream source must be exactly right and all the patches in debian/" "patches must be up to date. Applying the patches from debian/patches to the " "upstream source must result in exactly your HEAD." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:417 msgid "" "The output is laundered and stitched. The resulting history is not " "particularly pretty, especially if orig tarball(s) were imported to produce " "a synthetic upstream commit." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:422 msgid "" "The available convert-options are as follows. (These must come after " "convert-from-dgit-view.)" msgstr "" #. type: =item #: ../git-debrebase.1.pod:427 msgid "--[no-]diagnose" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:429 msgid "" "Print additional error messages to help diagnose failure to find an " "appropriate upstream. --no-diagnose is the default." msgstr "" #. type: =item #: ../git-debrebase.1.pod:433 msgid "--build-products-dir" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:435 msgid "" "Directory to look in for orig tarballs. The default is the git config " "option dgit.default.build-products-dir or failing that, C<..>. Passed on to " "dgit, if git-debrebase invokes dgit." msgstr "" #. type: =item #: ../git-debrebase.1.pod:441 msgid "--[no-]origs" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:443 msgid "" "Whether to try to look for or use any orig tarballs. --origs is the default." msgstr "" #. type: =item #: ../git-debrebase.1.pod:446 msgid "--[no-]tags" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:448 msgid "" "Whether to try to look for or use any upstream git tags. --tags is the " "default." msgstr "" #. type: =item #: ../git-debrebase.1.pod:451 msgid "--always-convert-anyway" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:453 msgid "" "Perform the conversion operation, producing unpleasant extra history, even " "if the branch seems to be in git-debrebase form already. This should not be " "done unless necessary, and it should not be necessary." msgstr "" #. type: =item #: ../git-debrebase.1.pod:461 msgid "git-debrebase forget-was-ever-debrebase" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:463 msgid "" "Deletes the ffq-prev and debrebase-last refs associated with this branch, " "that git-debrebase and dgit use to determine whether this branch is managed " "by git-debrebase, and what previous head may need to be stitched back in." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:469 msgid "" "This can be useful if you were just playing with git-debrebase, and have " "used git-reset --hard to go back to a commit before your experiments." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:473 msgid "Do not use this if you expect to run git-debrebase on the branch again." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:479 msgid "" "This section documents the general options to git-debrebase (ie, the ones " "which immediately follow git-debrebase or git debrebase on the command " "line). Individual operations may have their own options which are docuented " "under each operation." msgstr "" #. type: =item #: ../git-debrebase.1.pod:491 msgid "-f" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:493 msgid "Turns snag(s) with id into warnings." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:495 msgid "" "Some troublesome things which git-debrebase encounters are Bs. (The " "specific instances are discussed in the text for the relevant operation.)" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:500 msgid "" "When a snag is detected, a message is printed to stderr containing the snag " "id (in the form C<-f>), along with some prose." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:505 msgid "" "If snags are detected, git-debrebase does not continue, unless the relevant -" "f is specified, or --force is specified." msgstr "" #. type: =item #: ../git-debrebase.1.pod:509 msgid "--force" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:511 msgid "Turns all snags into warnings. See the -f option." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:514 msgid "" "Do not invoke git-debrebase --force in scripts and aliases; instead, specify " "the particular -f for expected snags." msgstr "" #. type: =item #: ../git-debrebase.1.pod:517 msgid "--noop-ok" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:519 msgid "" "Suppresses the error in some situations where git-debrebase does nothing, " "because there is nothing to do." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:523 msgid "" "The specific instances are discussed in the text for the relvant operation." msgstr "" #. type: =item #: ../git-debrebase.1.pod:526 msgid "--anchor=" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:528 msgid "" "Treats as an anchor. This overrides the usual logic which " "automatically classifies commits as anchors, pseudomerges, delta queue " "commits, etc." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:532 msgid "" "It also disables some coherency checks which depend on metadata extracted " "from its commit message, so it is a snag (C<-fanchor-treated>) if is the anchor for the previous upstream version in git-debrebase new-" "upstream operations. You have to check yourself that the new upstream is " "fast forward from the old one, and has the right components (as if " "applicable)." msgstr "" #. type: =item #: ../git-debrebase.1.pod:542 msgid "--dgit=" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:544 msgid "" "Run , instead of dgit from PATH, when invocation of dgit is " "necessary. This is provided mostly for the benefit of the test suite." msgstr "" #. type: =item #: ../git-debrebase.1.pod:548 msgid "-D" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:550 msgid "Requests (more) debugging. May be repeated." msgstr "" #. type: =item #: ../git-debrebase.1.pod:552 msgid "--experimental-merge-resolution" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:554 msgid "" "Enable experimental code for handling general merges (see L)." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:557 msgid "" "If using this option succeeds, the output is likely to be correct, although " "it would be a good idea to check that it seems sane." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:561 msgid "If it fails, your tree should be left where it was." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:563 msgid "" "However, there may be lossage of various kinds, including misleading error " "messages, and references to nonexistent documentation. On merge failure, it " "might invite you to delve into an incomprehensible pile of multidimensional " "merge wreckage, which is supposed to be left in special refs invented for " "the purpose (so, not your working tree, or HEAD)." msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:575 msgid "UNSTITCHING AND LAUNDERING" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:577 msgid "" "Several operations unstitch and launder the branch first. In detail this " "means:" msgstr "" #. type: =head2 #: ../git-debrebase.1.pod:580 msgid "Establish the current branch's ffq-prev" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:582 msgid "" "If ffq-prev is not yet recorded, git-debrebase checks that the current " "branch is ahead of relevant remote tracking branches. The relevant branches " "depend on the current branch (and its git configuration) and are as follows:" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:594 msgid "" "The branch that git would merge from (remote..merge, remote.." "remote);" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:599 msgid "" "The branch git would push to, if different (remote..pushRemote etc.);" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:604 msgid "For local dgit suite branches, the corresponding tracking remote;" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:609 msgid "If you are on C, remotes/dgit/dgit/sid." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:614 msgid "" "The apparently relevant ref names to check are filtered through branch." ".ffq-ffrefs, which is a semicolon-separated list of glob patterns, " "each optionally preceded by !; first match wins." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:619 msgid "" "In each case it is a snag if the local HEAD is behind the checked remote, or " "if local HEAD has diverged from it. All the checks are done locally using " "the remote tracking refs: git-debrebase does not fetch anything from " "anywhere." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:625 msgid "" "If these checks pass, or are forced, git-debrebse then records the current " "tip as ffq-prev." msgstr "" #. type: =head2 #: ../git-debrebase.1.pod:629 msgid "Examine the branch" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:631 msgid "" "git-debrebase analyses the current HEAD's history to find the anchor in its " "breakwater, and the most recent breakwater tip." msgstr "" #. type: =head2 #: ../git-debrebase.1.pod:636 msgid "Rewrite the commits into laundered form" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:638 msgid "" "Mixed debian+upstream commits are split into two commits each. Delta queue " "(upstream files) commits bubble to the top. Pseudomerges, and quilt patch " "additions, are dropped." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:644 msgid "" "This rewrite will always succeed, by construction. The result is the " "laundered branch." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:649 msgid "git-debrebase(1), dgit-maint-debrebase(7), dgit(1), gitglossary(7)" msgstr "" work/po4a/git-debrebase_5.pot0000644000000000000000000010050614761250142013242 0ustar # SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2019-09-06 23:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: =head1 #: ../dgit.1:3 ../dgit.7:2 ../dgit-user.7.pod:1 ../dgit-nmu-simple.7.pod:1 #: ../dgit-maint-native.7.pod:1 ../dgit-maint-merge.7.pod:1 #: ../dgit-maint-gbp.7.pod:1 ../dgit-maint-debrebase.7.pod:1 #: ../dgit-downstream-dsc.7.pod:1 ../dgit-sponsorship.7.pod:1 #: ../dgit-maint-bpo.7.pod:1 ../git-debrebase.1.pod:1 ../git-debrebase.5.pod:1 #: ../git-debpush.1.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1568 ../dgit.7:23 ../dgit-user.7.pod:447 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:126 #: ../dgit-maint-merge.7.pod:521 ../dgit-maint-gbp.7.pod:136 #: ../dgit-maint-debrebase.7.pod:778 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:321 ../dgit-maint-bpo.7.pod:134 #: ../git-debrebase.1.pod:633 ../git-debrebase.5.pod:678 #: ../git-debpush.1.pod:254 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: =head1 #: ../dgit-user.7.pod:5 ../dgit-maint-native.7.pod:5 #: ../dgit-maint-merge.7.pod:5 ../dgit-maint-gbp.7.pod:5 #: ../dgit-maint-debrebase.7.pod:5 ../dgit-downstream-dsc.7.pod:5 #: ../dgit-maint-bpo.7.pod:5 ../git-debrebase.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: =head1 #: ../dgit-maint-bpo.7.pod:11 ../git-debrebase.5.pod:37 msgid "TERMINOLOGY" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:3 msgid "git-debrebase - git data model for Debian packaging" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:7 msgid "" "git-debrebase is a tool for representing in git, and manpulating, Debian " "packages based on upstream source code." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:11 msgid "" "The Debian packaging has a fast forwarding history. The delta queue " "(changes to upstream files) is represented as a series of individual git " "commits, which can worked on with rebase, and also shared." msgstr "" #. type: =head2 #: ../git-debrebase.5.pod:18 msgid "DISCUSSION" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:20 msgid "" "git-debrebase is designed to work well with dgit. git-debrebase can also be " "used in workflows without source packages, for example to work on Debian-" "format packages outside or alongside Debian." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:24 msgid "" "git-debrebase itself is not very suitable for use by Debian derivatives, to " "work on packages inherited from Debian, because it assumes that you want to " "throw away any packaging provided by your upstream. However, use of git-" "debrebase in Debian does not make anything harder for derivatives, and it " "can make some things easier." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:32 msgid "" "When using gitk on branches managed by git-debrebase, B, " "B and B (or B) produce more useful " "output than the default." msgstr "" #. type: =item #: ../git-debrebase.5.pod:41 msgid "Pseudomerge" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:43 msgid "" "A merge which does not actually merge the trees; instead, it is constructed " "by taking the tree from one of the parents (ignoring the contents of the " "other parents). These are used to make a rewritten history fast forward " "from a previous tip, so that it can be pushed and pulled normally. Manual " "construction of pseudomerges can be done with C but is " "not normally needed when using git-debrebase." msgstr "" #. type: =item #: ../git-debrebase.5.pod:54 msgid "Packaging files" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:56 msgid "" "Files in the source tree within B, excluding anything in B." msgstr "" #. type: =item #: ../git-debrebase.5.pod:59 msgid "Upstream" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:61 msgid "" "The version of the package without Debian's packaging. Typically provided " "by the actual upstream project, and sometimes tracked by Debian contributors " "in a branch C." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:65 msgid "" "Upstream contains upstream files, but some upstreams also contain packaging " "files in B. Any such non-upstream files found in upstream are " "thrown away by git-debrebase each time a new upstream version is " "incorporated." msgstr "" #. type: =item #: ../git-debrebase.5.pod:71 msgid "Upstream files" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:73 msgid "" "Files in the source tree outside B. These may include unmodified " "source from upstream, but also files which have been modified or created for " "Debian." msgstr "" #. type: =item #: ../git-debrebase.5.pod:77 msgid "Delta queue" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:79 msgid "Debian's changes to upstream files: a series of git commits." msgstr "" #. type: =item #: ../git-debrebase.5.pod:82 msgid "Quilt patches" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:84 msgid "" "Files in B generated for the benefit of dpkg-source's 3.0 " "(quilt) .dsc source package format. Not used, often deleted, and " "regenerated when needed (such as when uploading to Debian), by git-debrebase." msgstr "" #. type: =item #: ../git-debrebase.5.pod:90 msgid "Interchange branch; breakwater; stitched; laundered" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:92 msgid "See L." msgstr "" #. type: =item #: ../git-debrebase.5.pod:94 msgid "Anchor; Packaging" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:96 msgid "See L." msgstr "" #. type: =item #: ../git-debrebase.5.pod:98 msgid "ffq-prev; debrebase-last" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:100 msgid "See L." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:104 msgid "DIAGRAM" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:106 #, no-wrap msgid "" " ------/--A!----/--B3!--%--/--> interchange view\n" " / / / with debian/ directory\n" " % % % entire delta queue applied\n" " / / / 3.0 (quilt) has debian/patches\n" " / / 3* \"master\" on Debian git servers\n" " / / /\n" " 2* 2* 2\n" " / / /\n" " 1 1 1 breakwater branch, merging baseline\n" " / / / unmodified upstream code\n" " ---@-----@--A----@--B--C plus debian/ (but no debian/patches)\n" " / / / no ref refers to this: we\n" " --#-----#-------#-----> upstream reconstruct its identity by\n" " inspecting interchange branch\n" " Key:\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:122 #, no-wrap msgid "" " 1,2,3 commits touching upstream files only\n" " A,B,C commits touching debian/ only\n" " B3 mixed commit (eg made by an NMUer)\n" " # upstream releases\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:127 #, no-wrap msgid "" " -@- anchor merge, takes contents of debian/ from the\n" " / previous `breakwater' commit and rest from upstream\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:130 #, no-wrap msgid "" " -/- pseudomerge; contents are identical to\n" " / parent lower on diagram.\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:133 #, no-wrap msgid "" " % dgit- or git-debrebase- generated commit of debian/patches.\n" " `3.0 (quilt)' only; generally dropped by git-debrebase.\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:136 #, no-wrap msgid "" " * Maintainer's HEAD was here while they were editing,\n" " before they said they were done, at which point their\n" " tools made -/- (and maybe %) to convert to\n" " the fast-forwarding interchange branch.\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:141 #, no-wrap msgid "" " ! NMUer's HEAD was here when they said `dgit push'.\n" " Rebase branch launderer turns each ! into an\n" " equivalent *.\n" "\n" msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:145 msgid "BRANCHES AND BRANCH STATES - OVERVIEW" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:147 msgid "" "git-debrebase has one primary branch, the B. This " "branch is found on Debian contributors' workstations (typically, a " "maintainer would call it B), in the Debian dgit git server as the " "suite branch (B) and on other git servers which support " "Debian work (eg B on salsa)." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:155 msgid "" "The interchange branch is fast-forwarding (by virtue of pseudomerges, where " "necessary)." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:158 msgid "" "It is possible to have multiple different interchange branches for the same " "package, stored as different local and remote git branches. However, " "divergence should be avoided where possible - see L." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:164 msgid "" "A suitable interchange branch can be used directly with dgit. In this case " "each dgit archive suite branch is a separate interchange branch." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:168 msgid "" "Within the ancestry of the interchange branch, there is another important, " "implicit branch, the B. The breakwater contains unmodified " "upstream source, but with Debian's packaging superimposed (replacing any " "C directory that may be in the upstream commits). The breakwater " "does not contain any representation of the delta queue (not even debian/" "patches). The part of the breakwater processed by git-debrebase is the part " "since the most recent B, which is usually a special merge generated " "by git-debrebase." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:181 msgid "" "When working, locally, the user's branch can be in a rebasing state, known " "as B. While a branch is unstitched, it is not in interchange " "format. The previous interchange branch tip is recorded, so that the " "previous history and the user's work can later be stitched into the fast-" "forwarding interchange form." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:193 msgid "" "An unstitched branch may be in B state, which means it has a more " "particular special form convenient for manipulating the delta queue." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:199 msgid "BRANCH CONTENTS - DETAILED SPECIFICATION" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:201 msgid "" "It is most convenient to describe the B branch first. A " "breakwater is B, but is not usually named by a ref. It " "contains B (ancestors first):" msgstr "" #. type: =item #: ../git-debrebase.5.pod:210 msgid "Anchor" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:212 msgid "An B commit, which is usually a special two-parent merge:" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:215 msgid "" "The first parent contains the most recent version, at that point, of the " "Debian packaging (in debian/); it also often contains upstream files, but " "they are to be ignored. Often the first parent is a previous breakwater tip." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:222 msgid "" "The second parent is an upstream source commit. It may sometimes contain a " "debian/ subdirectory, but if so that is to be ignored. The second parent's " "upstream files are identical to the anchor's. Anchor merges always contain " "C<[git-debrebase anchor: ...]> as a line in the commit message." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:232 msgid "" "Alternatively, an anchor may be a single-parent commit which introduces the " "C directory and makes no other changes: ie, the start of Debian " "packaging." msgstr "" #. type: =item #: ../git-debrebase.5.pod:237 msgid "Packaging" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:239 msgid "" "Zero or more single-parent commits containing only packaging changes. (And " "no quilt patch changes.)" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:245 msgid "" "The B branch state is B. A laundered branch is based " "on a breakwater but also contains, additionally, B the breakwater, a " "representation of the delta queue:" msgstr "" #. type: =item #: ../git-debrebase.5.pod:255 msgid "Delta queue commits" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:257 msgid "" "Zero or more single-parent commits containing only changes to upstream files." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:262 msgid "" "The merely B (ie, unstitched but unlaundered) branch state is " "also B. It has the same contents as the laundered state, except " "that it may contain, additionally, B:" msgstr "" #. type: =item #: ../git-debrebase.5.pod:273 msgid "Linear commits to the source" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:275 msgid "" "Further commit(s) containing changes to to upstream files and/or to " "packaging, possibly mixed within a single commit. (But not quilt patch " "changes.)" msgstr "" #. type: =item #: ../git-debrebase.5.pod:282 msgid "Quilt patch addition for `3.0 (quilt)'" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:284 msgid "" "Commit(s) which add patches to B, and add those patches to " "the end of B." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:287 msgid "" "These are only necessary when working with packages in C<.dsc 3.0 (quilt)> " "format. For git-debrebase they are purely an output; they are deleted when " "branches are laundered. git-debrebase takes care to make a proper patch " "series out of the delta queue, so that any resulting source packages are " "nice." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:297 msgid "" "Finally, an B branch is B. It has the same " "contents as an unlaundered branch state, but may (and usually will) " "additionally contain (in some order, possibly intermixed with the extra " "commits which may be found on an unstitched unlaundered branch):" msgstr "" #. type: =item #: ../git-debrebase.5.pod:309 msgid "Pseudomerge to make fast forward" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:311 msgid "" "A pseudomerge making the branch fast forward from previous history. The " "contributing parent is itself in interchange format. Normally the " "overwritten parent is a previous tip of an interchange branch, but this is " "not necessary as the overwritten parent is not examined." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:319 msgid "" "If the two parents have identical trees, the one with the later commit date " "(or, if the commit dates are the same, the first parent) is treated as the " "contributing parent." msgstr "" #. type: =item #: ../git-debrebase.5.pod:326 msgid "dgit dsc import pseudomerge" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:328 msgid "" "Debian .dsc source package import(s) made by dgit (during dgit fetch of a " "package most recently uploaded to Debian without dgit, or during dgit import-" "dsc)." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:334 msgid "" "git-debrebase requires that each such import is in the fast-forwarding " "format produced by dgit: a two-parent pseudomerge, whose contributing parent " "is in the non-fast-forwarding dgit dsc import format (not described further " "here), and whose overwritten parent is the previous interchange tip (eg, the " "previous tip of the dgit suite branch)." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:347 msgid "STITCHING, PSEUDO-MERGES, FFQ RECORD" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:349 msgid "" "Whenever the branch C is unstitched, the previous head is recorded " "in the git ref C." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:352 msgid "" "Unstiched branches are not fast forward from the published interchange " "branches [1]. So before a branch can be pushed, the right pseudomerge must " "be reestablished. This is the stitch operation, which consumes the ffq-prev " "ref." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:359 msgid "" "When the user has an unstitched branch, they may rewrite it freely, from the " "breakwater tip onwards. Such a git rebase is the default operation for git-" "debrebase. Rebases should not go back before the breakwater tip, and " "certainly not before the most recent anchor." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:366 msgid "" "Unstitched branches must not be pushed to interchange branch refs (by the " "use of C or equivalent). It is OK to share an unstitched " "branch in similar circumstances and with similar warnings to sharing any " "other rebasing git branch." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:372 msgid "" "[1] Strictly, for a package which has never had a Debian delta queue, the " "interchange and breakwater branches may be identical, in which case the " "unstitched branch is fast forward from the interchange branch and no " "pseudomerge is needed." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:378 msgid "" "When ffq-prev is not present, C records some ancestor " "of refs/B, (usually, the result of last stitch). This is used for status " "printing and some error error checks - especially for printing guesses about " "what a problem is. To determine whether a branch is being maintained in git-" "debrebase form it is necessary to walk its history." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:387 msgid "OTHER MERGES" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:389 msgid "" "Note that the representation described here does not permit general merges " "on any of the relevant branches. For this reason the tools will try to help " "the user avoid divergence of the interchange branch." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:394 msgid "" "See dgit-maint-debrebase(7) for a discussion of what kinds of behaviours " "should be be avoided because they might generate such merges." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:400 msgid "" "Automatic resolution of divergent interchange branches (or laundering of " "merges on the interchange branch) is thought to be possible, but there is " "no tooling for this yet:" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:405 msgid "" "Nonlinear (merging) history in the interchange branch is awkward because it " "(obviously) does not preserve the linearity of the delta queue. Easy " "merging of divergent delta queues is a research problem." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:410 msgid "" "Nonlinear (merging) history in the breakwater branch is in principle " "tolerable, but each of the parents would have to be, in turn, a breakwater, " "and difficult questions arise if they don't have the same anchor." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:416 msgid "" "We use the commit message annotation to distinguish the special anchor " "merges from other general merges, so we can at least detect unsupported " "merges." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:420 msgid "LEGAL OPERATIONS" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:422 msgid "" "The following basic operations follow from this model (refer to the diagram " "above):" msgstr "" #. type: =item #: ../git-debrebase.5.pod:427 msgid "Append linear commits" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:429 msgid "" "No matter the branch state, it is always fine to simply git commit (or " "cherry-pick etc.) commits containing upstream file changes, packaging " "changes, or both." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:435 msgid "(This may make the branch unlaundered.)" msgstr "" #. type: =item #: ../git-debrebase.5.pod:437 msgid "Launder branch" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:439 msgid "" "Record the previous head in ffq-prev, if we were stitched before (and delete " "debrebase-last)." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:443 msgid "" "Reorganise the current branch so that the packaging changes come first, " "followed by the delta queue, turning C<-@-A-1-2-B3> into C<...@-A-B-1-2-3>." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:448 msgid "Drop pseudomerges and any quilt patch additions." msgstr "" #. type: =item #: ../git-debrebase.5.pod:450 msgid "Interactive rebase" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:452 msgid "" "With a laundered branch, one can do an interactive git rebase of the delta " "queue." msgstr "" #. type: =item #: ../git-debrebase.5.pod:455 msgid "New upstream rebase" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:457 msgid "" "Start rebasing onto a new upstream version, turning C<...#..@-A-B-1-2-3> " "into C<(...#..@-A-B-, ...#'-)@'-1-2>." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:460 msgid "" "This has to be a wrapper around git-rebase, which prepares @' and then tries " "to rebase 1 2 onto @'. If the user asks for an interactive rebase, @' " "doesn't appear in the commit list, since @' is the newbase of the rebase " "(see git-rebase(1))." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:466 msgid "" "Note that the construction of @' cannot fail because @' simply copies " "debian/ from B and and everything else from #'. (Rebasing A and B is " "undesirable. We want the debian/ files to be non-rebasing so that git log " "shows the packaging history.)" msgstr "" #. type: =item #: ../git-debrebase.5.pod:472 msgid "Stitch" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:474 msgid "" "Make a pseudomerge, whose contributing parent is the unstitched branch and " "whose overwritten parent is ffq-prev, consuming ffq-prev in the process (and " "writing debrebase-last instead). Ideally the contributing parent would be a " "laundered branch, or perhaps a laundered branch with a quilt patch addition " "commit." msgstr "" #. type: =item #: ../git-debrebase.5.pod:483 msgid "Commit quilt patches" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:485 msgid "" "To generate a tree which can be represented as a 3.0 (quilt) .dsc source " "package, the delta queue must be reified inside the git tree in B. These patch files can be stripped out and/or regenerated as " "needed." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:493 msgid "ILLEGAL OPERATIONS" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:495 msgid "" "Some git operations are not permitted in this data model. Performing them " "will break git-debrebase." msgstr "" #. type: =item #: ../git-debrebase.5.pod:500 msgid "General merges" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:502 msgid "See L, above." msgstr "" #. type: =item #: ../git-debrebase.5.pod:504 msgid "git-rebase starting too soon, or without base argument" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:506 msgid "" "git-rebase must not be invoked in such a way that the chosen base is before " "the anchor, or before the last pseudomerge. This is because git-rebase " "mangles merges. git rebase --preserve-merges is also dangerous." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:512 msgid "git-rebase without a base argument will often start too early." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:514 msgid "" "For these reasons, it is better to use git-debrebase and let it choose the " "base for your rebase. If you do realise you have made this mistake, it is " "best to use the reflog to recover to a suitable good previous state." msgstr "" #. type: =item #: ../git-debrebase.5.pod:522 msgid "Editing debian/patches" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:524 msgid "" "debian/patches is an output from git-debrebase, not an input. If you edit " "patches git-debrebase will complain and refuse to work. If you add patches " "your work is likely to be discarded." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:530 msgid "" "Instead of editing patches, use git-debrebase to edit the corresponding " "commits." msgstr "" #. type: =item #: ../git-debrebase.5.pod:533 msgid "Renaming (etc.) branch while unstitched" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:535 msgid "" "The previous HEAD, which will be pseudomerged over by operations like git-" "debrebase stitch, is recorded in a ref name dervied from your branch name." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:540 msgid "" "If you rename unstitched branches, this information can get out of step." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:543 msgid "" "Conversely, creating a new branch from an unstitched branch is good for " "making a branch to play about in, but the result cannot be stitched." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:550 msgid "COMMIT MESSAGE ANNOTATIONS" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:552 msgid "" "git-debrebase makes annotations in the messages of commits it generates." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:555 msgid "The general form is" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:557 #, no-wrap msgid "" " [git-debrebase COMMIT-TYPE [ ARGS...]: PROSE, MORE PROSE]\n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:559 msgid "" "git-debrebase treats anything after the colon as a comment, paying no " "attention to PROSE." msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:562 #, no-wrap msgid "" "The full set of annotations is:\n" " [git-debrebase split: mixed commit, debian part]\n" " [git-debrebase split: mixed commit, upstream-part]\n" " [git-debrebase convert dgit import: debian changes]\n" " [git-debrebase anchor: convert dgit import, upstream changes]\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:568 #, no-wrap msgid "" " [git-debrebase upstream-combine . PIECE[ PIECE...]: new upstream]\n" " [git-debrebase anchor: new upstream NEW-UPSTREAM-VERSION, merge]\n" " [git-debrebase changelog: new upstream NEW-UPSTREAM-VERSION]\n" " [git-debrebase make-patches: export and commit patches]\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:573 #, no-wrap msgid "" " [git-debrebase convert-from-gbp: drop patches]\n" " [git-debrebase anchor: declare upstream]\n" " [git-debrebase pseudomerge: stitch]\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:577 #, no-wrap msgid "" " [git-debrebase merged-breakwater: constructed from vanilla merge]\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:579 #, no-wrap msgid "" " [git-debrebase convert-to-gbp: commit patches]\n" " [git-debrebase convert-from-dgit-view upstream-import-convert: VERSION]\n" " [git-debrebase convert-from-dgit-view drop-patches]\n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:583 msgid "" "Only anchor merges have the C<[git-debrebase anchor: ...]> tag. Single-" "parent anchors are not generated by git-debrebase, and when made manually " "should not contain any C<[git-debrebase ...]> annotation." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:588 msgid "" "The C and C tags are added to the " "pre-existing commit message, when git-debrebase rewrites the commit." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:592 msgid "APPENDIX - DGIT IMPORT HANDLING" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:594 msgid "" "The dgit .dsc import format is not documented or specified (so some of the " "following terms are not defined anywhere). The dgit import format it is " "defined by the implementation in dgit, of which git-debrebase has special " "knowledge." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:599 msgid "Consider a non-dgit NMU followed by a dgit NMU:" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:601 #, no-wrap msgid "" " interchange --/--B3!--%--//----D*-->\n" " / /\n" " % 4\n" " / 3\n" " / 2\n" " / 1\n" " 2 &_\n" " / /| \\\n" " 1 0 00 =XBC%\n" " /\n" " /\n" " --@--A breakwater\n" " /\n" " --#--------> upstream\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:617 #, no-wrap msgid "" " Supplementary key:\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:619 #, no-wrap msgid "" " =XBC% dgit tarball import of .debian.tar.gz containing\n" " Debian packaging including changes B C and quilt patches\n" " 0 dgit tarball import of upstream tarball\n" " 00 dgit tarball import of supplementary upstream piece\n" " &_ dgit import nearly-breakwater-anchor\n" " // dgit fetch / import-dsc pseudomerge to make fast forward\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:626 #, no-wrap msgid "" " &' git-debrebase converted import (upstream files only)\n" " C' git-debrebase converted packaging change import\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:629 #, no-wrap msgid "" " * ** before and after HEAD\n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:631 msgid "We want to transform this into:" msgstr "" #. type: =item #: ../git-debrebase.5.pod:635 msgid "I. No new upstream version" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:637 #, no-wrap msgid "" " (0 + 00 eq #)\n" " --/--B3!--%--//-----D*-------------/-->\n" " / / /\n" " % 4 4**\n" " / 3 3\n" " / 2 2\n" " / 1 1\n" " 2 &_ /\n" " / /| \\ /\n" " 1 0 00 =XBC% /\n" " / /\n" " / /\n" " --@--A-----B---------------------C'---D\n" " /\n" " --#----------------------------------------->\n" "\n" msgstr "" #. type: =item #: ../git-debrebase.5.pod:653 msgid "II. New upstream" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:655 #, no-wrap msgid "" " (0 + 00 neq #)\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:657 #, no-wrap msgid "" " --/--B3!--%--//-----D*-------------/-->\n" " / / /\n" " % 4 4**\n" " / 3 3\n" " / 2 2\n" " / 1 1\n" " 2 &_ /\n" " / /| \\ /\n" " 1 0 00 =XBC% /\n" " / /\n" " / /\n" " --@--A-----B-----------------@---C'---D\n" " / /\n" " --#--------------------- - - / - - --------->\n" " /\n" " &'\n" " /|\n" " 0 00\n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:680 msgid "git-debrebase(1), dgit-maint-rebase(7), dgit(1)" msgstr "" work/po4a/install-documents0000755000000000000000000000064014761250142013166 0ustar #!/bin/bash set -e srcdir=$1; shift destdir=$1; shift mkdir -p "$srcdir" docs=( $( ( cd "$srcdir" && find man -type f ) | sed 's#\.pod$##' ) ) echo ${docs[*]} x () { echo "+ $*"; "$@" } if [ "${#docs}" = 0 ]; then exit 0; fi x ${MAKE-make} -s -C "$srcdir" -f ../../Makefile ${docs[@]} mandest=$destdir/usr/share for f in "${docs[@]}"; do mkdir -p "$mandest/${f%/*}" x cp "$srcdir/$f" "$mandest/$f" done work/po4a/list-documents0000755000000000000000000000174614761250142012503 0ustar #!/bin/bash set -e set -o pipefail fail () { "echo >&2 $0: $*"; exit 1; } langs=( $( { ! test -f *.po || ls *.po; } \ | sed 's#\.po$##; s#.*\.##' \ | LC_COLLATE=C.UTF-8 sort -u) ) cat < TESTSCRIPTS ?= $(shell tests/enumerate-tests) TESTNAMES := $(notdir $(TESTSCRIPTS)) all: $(foreach t,$(TESTNAMES),tests/tmp/$t.ok) @echo "ALL PASSED$${DGIT_TESTS_PROGRESSIVE+ AT SOME POINT}" tests/tmp/%.ok: tests/tests/% ifeq ($(DGIT_TEST_RETRY_COUNT),) $(DGIT_TEST_RUN_PFX) tests/tests/$* >tests/tmp/$*.log 2>&1 else @for retry in $$( seq 1 $(DGIT_TEST_RETRY_COUNT) ); do \ echo "[$$retry] $*"; \ $(DGIT_TEST_RUN_PFX) tests/tests/$* >tests/tmp/$*.$$retry.log 2>&1; \ rc=$$?; \ if [ $$rc = 0 ]; then exit 0; fi; \ echo >&2 "[$$retry] $* TEST FAILED $$rc"; \ done; exit $$rc endif @touch $@ work/tests/adhoc0000755000000000000000000000174514761250142011105 0ustar #!/bin/bash # # usage: # after tests/tests/some-test has been run (and maybe failed) # cd tests/tmp/some-test/blah # ../../adhoc ../../../dgit some options # or # after tests/tests/some-test has been run (and maybe failed) # cd tests/tmp/some-test/blah # ../../adhoc some rune run by some piece of infrastructure # # effects: # directly sets the env variables which arrange to use # programs etc. from the working tree ourname=adhoc case $0 in */$ourname) : ${DGIT_TEST_INTREE:=$(realpath "${0%/$ourname}/..")} ;; *) echo >&2 "$ourname must be invoked as .../$ourname not $0" exit 127 ;; esac export DGIT_TEST_INTREE . $DGIT_TEST_INTREE/tests/lib-core t-set-intree pwd=$(realpath "$(pwd)") basis=$DGIT_TEST_INTREE/tests/tmp case "$pwd" in "$basis" | "$basis"/*) testname=${pwd/"$basis/"/} testname=${testname%%/*} tmp="$basis/$testname" ;; *) fail "$ourname pwd must be inside some test (in $basis), not $pwd" ;; esac export ADTTMP=$tmp t-set-using-tmp exec "$@" work/tests/drs-git-ext0000755000000000000000000000063114761250142012167 0ustar #!/bin/sh set -e tmp=$DGIT_TEST_TMP : ${DGIT_DRS_DEBUG:=1} export DGIT_DRS_DEBUG echo >&2 '((((((((((((((((((((((((((((((((((((((((' set -x export SSH_ORIGINAL_COMMAND="$*" ${DGIT_REPOS_SERVER_TEST-dgit-repos-server} \ test-dummy $tmp/distro=test-dummy \ $tmp/dd.gpg,a:$tmp/dm.gpg,m$tmp/dm.txt \ --repos=$tmp/git --suites=$tmp/suites \ --${DGIT_DRS_MODE-ssh} : '))))))))))))))))))))))))))))))))))))))))' work/tests/dsd-ssh0000755000000000000000000000070514761250142011367 0ustar #!/bin/sh set -e echo >&2 '((((((((((((((((((((((((((((((((((((((((' set -x tmp=$DGIT_TEST_TMP cd / userhost="$1"; shift export SSH_ORIGINAL_COMMAND="$*" # undoes PERLLIB so that we rely on dgit-ssh-dispatch setting it # we have to compensate with -I so that dgit-ssh-dispatch finds Dgit.pm unset PERLLIB ${DGIT_TEST_INTREE+perl -I}$DGIT_TEST_INTREE \ ${DGIT_SSH_DISPATCH_TEST-dgit-ssh-dispatch} -D $tmp : '))))))))))))))))))))))))))))))))))))))))' work/tests/enumerate-tests0000755000000000000000000000547014761250142013153 0ustar #!/bin/bash set -e . tests/lib-core . tests/lib-restricts mode=$1 test-begin- () { whynots='' } restriction- () { set +e whynot=$(t-restriction-$r) rc=$? whynot="${whynot// / / }" set -e case "$rc.$whynot" in 0.) ;; 1.?*) whynots="$whynots${whynots:+; }$whynot" ;; *) fail "restriction $r for $t gave $rc $whynot !" esac } dependencies- () { : } test-done- () { case "$whynots" in '') echo $t ;; ?*) echo >&2 "SKIP $t $whynots" ;; esac } finish- () { : } test-begin-gencontrol () { restrictions='' dependencies='dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl' } gencontrol-add-things () { local varname=$1; shift local delim=$1; shift local thing eval ' for thing in "$@"; do case " $'$varname$delim '" in *" "$thing"'$delim' "*) continue ;; esac '$varname'+="${'$varname':+'$delim' }$thing" done ' } restriction-gencontrol () { if [ $r = x-dgit-out-of-tree-only ]; then return; fi gencontrol-add-things restrictions '' "$r" } gencontrol-add-deps () { gencontrol-add-things dependencies , "$@" } dependencies-gencontrol () { for dep in "$deps"; do case "$dep" in NO-DGIT) dependencies='chiark-utils-bin, faketime' ;; NO-DEFAULT) dependencies='' ;; GDR) gencontrol-add-deps \ git-debrebase git-buildpackage ;; DEBORIG) gencontrol-add-deps \ devscripts libdpkg-perl \ libgit-wrapper-perl liblist-compare-perl \ libstring-shellquote-perl libtry-tiny-perl \ # NB git-deborig is not compatible with # t-tstunt-parsechangelog ;; *) gencontrol-add-deps "$dep" ;; esac done } test-done-gencontrol () { stanza=$( add_Depends="$dependencies" \ perl \).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } pari-extra.git/hooks/pre-rebase.sample0000775000175000017500000001144212242157267016406 0ustar ianian#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END pari-extra.git/hooks/pre-applypatch.sample0000775000175000017500000000061612242157267017313 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : pari-extra.git/hooks/update.sample0000775000175000017500000000703312242157267015644 0ustar ianian#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 pari-extra.git/hooks/prepare-commit-msg.sample0000775000175000017500000000232712242157267020073 0ustar ianian#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" pari-extra.git/hooks/pre-commit.sample0000775000175000017500000000325012242157267016433 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- pari-extra.git/config0000664000175000017500000000010212242157267013207 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = true pari-extra.git/info/0000775000175000017500000000000014164202404012746 5ustar ianianpari-extra.git/info/refs0000664000175000017500000000027614164202404013635 0ustar ianianc6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 refs/dgit/sid d7f949a6455f8ce2230bd5df778bdd9faf091bc5 refs/tags/test-dummy/3-1 c6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 refs/tags/test-dummy/3-1^{} pari-extra.git/info/exclude0000664000175000017500000000036012242157267014334 0ustar ianian# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ pari-extra.git/HEAD0000664000175000017500000000002712242157267012451 0ustar ianianref: refs/heads/master pari-extra.git/packed-refs0000664000175000017500000000032114164202404014116 0ustar ianian# pack-refs with: peeled fully-peeled sorted c6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 refs/dgit/sid d7f949a6455f8ce2230bd5df778bdd9faf091bc5 refs/tags/test-dummy/3-1 ^c6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 pari-extra.git/description0000664000175000017500000000011112242157267014265 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. pari-extra.git/objects/0000775000175000017500000000000014164202404013444 5ustar ianianpari-extra.git/objects/pack/0000775000175000017500000000000014164202404014362 5ustar ianianpari-extra.git/objects/pack/pack-f78438af55214ab2e04c6baf980f32df0e71ca44.pack0000444000175000017500000000663514164202404023656 0ustar ianianPACK xN0~#f*̌@Hf^ƾI,N;}{T,زts#3Zג5}ѭron뮧9!XGk8fy(urCM.=nBk{{h],+oa'R:l .z6]UB\)\ncp#͞*S x%M0@}O1{RZ@c @[RDn˷xIhLk8C-jIr[k鰭86<1RW*~ 7̴g?j^^t1beʮܦ ]SK)PblQ jEaH3:OO>nx31Ԥ<* /3 .Vy x340031QrutusIMLcs?3ZvM>)!DarFb^zjN~:u _7hpGf{f䟚 S[X_\]9-jםu+)aI~$oߏGTeg0IEeKrV*3>pž}E3sV93xmS]o0|Wcr!k.IHUtMp6G]太wgfgZj`GB{Uz $ 5`A )MAuΞ^<vcG@CM; *:5V \NpN 'Ԗ> g6%nz0լ*>IjOM S(]''Y4Ak#VP H˔,:>m:q cCX:۔*C@4*dO#B ,M竒d S r$񝕃F70)ԋ5=u4؋H֒Frq?v_w߷фTo|QZVkەXlN_@XlJ!E^P\%|/<Q#`xxn@yz(AI5mzx'fulC$BE;{5;;7LɌ3 zM%orTԋV ngBɲ#Ч `}Q,Ƕ K20N){$gS@s> n3ZuT>c[j#O{#A97>rMZM|QSs4VPvsN ppɖpqAVFÀt:0RXJ]L8x?eF[MԈ6}0 Jp1qZvA|Һ#,()-BX+TV7seAƔ<'6@?2G*Dô7Hd}4nsWGd( j|}=l29 †7wXfM]IHmfD( xK sD^(ⷯP:N;TrGԅZX*tΩ=Mr4"pqU<.?6ׂ-nd;E5ID͘l@kKBQ_'LNH&NQ[m0.M6h4+>m:^HXVCDoޚ%:#BL*a96Nيn}Yk߫8 0ܮ?ީ(MP6cu $맴=V{+$'7Q4a̬JKduè*9XcVAmJW鐇UR/?a3x34nQxmSM@ ϯî ā VXV(pwfdh> gT]@j&{.yIk+z6i@V5(;2y~RIFzyܐ_Q_kjc`ck^8˨m|{-B`^UϫgBPcNG<QȖˆƜ?ɯ^+}j[ 1N`z6_CƴT{"PhB6ĩB@8jEfH\ p[ `bNL!`S6bGΏpѠ V묙1SE&K,2x}RQk0~~ō>;ice + c=:ۢΜe$>tn5F^6~FZu`muX0Bu1J$݀跻Ghh8#$;q c[Zb4 Zskj=ǟg K_^ch{ I$8uK#k JC$ž~?^G_U'Z)aLƲZ$ :ZqLSI9WQE-$E%47M؈wl08|d(#dՄ--SǻL}}jќ^ur)g`ȋ8Zgj eAdǂ'\1%vNo%~?8U!JLk2qDpari-extra.git/objects/pack/pack-f78438af55214ab2e04c6baf980f32df0e71ca44.idx0000444000175000017500000000251014164202404023510 0ustar ianiantOc ,cm  `!5LJZ09qhLohu;a`d( YhKOei=/7٦ _7tH/r~o[A8}D{D$ұlNTLD^}Hɕ$`1MM 2BtK;WIE_# wݟ DG O}wE]g ek<_)7A"w  * V8U!JLk2qD)C[.90pari-extra.git/objects/info/0000775000175000017500000000000014164202404014377 5ustar ianianpari-extra.git/objects/info/packs0000664000175000017500000000015314164202404015422 0ustar ianianP pack-20ed040fb05ed3747488b3707fb51d0b44bcf061.pack P pack-f78438af55214ab2e04c6baf980f32df0e71ca44.pack work/tests/git-template.tar0000644000000000000000000007400014761250142013177 0ustar _template/0000775000175000017500000000000012242157267011142 5ustar ianian_template/info/0000775000175000017500000000000012242157267012075 5ustar ianian_template/info/exclude0000664000175000017500000000036012242157267013450 0ustar ianian# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ _template/objects/0000775000175000017500000000000012242157267012573 5ustar ianian_template/objects/info/0000775000175000017500000000000012242157267013526 5ustar ianian_template/objects/pack/0000775000175000017500000000000012242157267013511 5ustar ianian_template/branches/0000775000175000017500000000000012242157267012727 5ustar ianian_template/description0000664000175000017500000000011112242157267013401 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. _template/hooks/0000775000175000017500000000000012242157267012265 5ustar ianian_template/hooks/applypatch-msg.sample0000775000175000017500000000070412242157267016425 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : _template/hooks/prepare-commit-msg.sample0000775000175000017500000000232712242157267017207 0ustar ianian#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" _template/hooks/post-update.sample0000775000175000017500000000027512242157267015744 0ustar ianian#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info _template/hooks/pre-rebase.sample0000775000175000017500000001144212242157267015522 0ustar ianian#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END _template/hooks/update.sample0000775000175000017500000000703312242157267014760 0ustar ianian#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 _template/hooks/commit-msg.sample0000775000175000017500000000160012242157267015544 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } _template/hooks/pre-commit.sample0000775000175000017500000000325012242157267015547 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- _template/hooks/pre-applypatch.sample0000775000175000017500000000061612242157267016427 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : _template/HEAD0000664000175000017500000000002712242157267011565 0ustar ianianref: refs/heads/master _template/config0000664000175000017500000000010212242157267012323 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = true _template/refs/0000775000175000017500000000000012242157267012101 5ustar ianian_template/refs/tags/0000775000175000017500000000000012242157267013037 5ustar ianian_template/refs/heads/0000775000175000017500000000000012242157267013165 5ustar ianianwork/tests/gnupg/0000755000000000000000000000000014761250142011212 5ustar work/tests/gnupg/dd.gpg0000644000000000000000000000226414761250142012304 0ustar  R# 5.Z^Q}Hd!:OE vw}*a!~\ |f8"R   9=6"$_uUރ)GZo={S+4 =ٹvX&rRl>|PAEXi_3XߐYg?lGdxyGw[ig_0@,$24JF֭yp#$qjQDLUQ/bPe$IP3ԐIO Nb*@AFa4g%ҬlnP-G.QP}+iIá*lˍ%G RyA-b([=JgwwЬvŹl=fУ#d("g1>|zc C!Wd~s3zi@W g N7E,+C#`M4CFaI%.ٍY/FswLg+Zuj*ѤS^d'ñhNl3 VVF4z>4Mbēa R 9=%5=R܏f=۱_سI,- !sF%C8"RT   *u%)C|KW]^i֯#4Xgꪈݬ̍R<⢊.lnnx *Z:X*G=f:Cȑ ] U!l'1EMńzR)캑j\8d#H>%4 /E՝_9Zx==R/ yi RTQݩꤷA3|]cs[D $:d'/.6-R4j#hGA^4[<$+ĝbd|'u{B]VL36OsF޹lz%] iNqS5el}0^9;w;nEo:+<enY8t$GB,O{>ά:tWlom2%ذy*ݑGԯ7iӝ:` RT *u% Rw4nS6:Mv c\drtO.NI- [9pfZ6ܞEJn,Z$]j /eԨ`#RИ d:pm 4"ox!C,3nrMsȝduBK8.85_~k3f" /؆u8Cx¼sAD۪XʖH3u7yxXBDyTENl work/tests/gnupg/dm.txt0000644000000000000000000026764614761250142012400 0ustar Fingerprint: A7830CCABA4AFF02E50213FE8F32B4422F52107F Uid: Adrian Knoth Allow: a2jmidid (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), ardour (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), ardour3 (218EE0362033C87B6C135FA4A3BABAE2408DD6CF), calf (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), jack-audio-connection-kit (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), jackd-defaults (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), jackd2 (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), kmidimon (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), libdrumstick (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), libffado (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), midisport-firmware (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), qjackctl (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C), zita-at1 (04160004A8276E40BB9890FBE8A48AE5311D765A) Fingerprint: 834C97925D15D2A573C2478777013C58233007A7 Uid: Ahmed Toulan Allow: gdigi (9F73032EEAC9F7AD951F280ECB668E29A3FD0DF7) Fingerprint: 487FCD050895105F43C206089B2E6B82752DB03B Uid: Alberto Luaces Fernández Allow: openscenegraph (2A8E80505C486298430DD0937F7606A445DCA80E) Fingerprint: 2875F6B1C2D27A4F0C8AF60B2A714497E37363AE Uid: Aleksey Kravchenko Allow: rhash (75FFFC9F717B526296A20609BDD933B785FEC17F) Fingerprint: 3224C4469D7DF8F3D6F41A02BBC756DDBE595F6B Uid: Alexander Chernyakhovsky Allow: byobu (51892A7D16D049BB046BDC7797325DD8F9FDD506), config-package-dev (51892A7D16D049BB046BDC7797325DD8F9FDD506), hesiod (198F5EAE4F00F3D1E9A7BC50B1CA92E8A7D86B95) Fingerprint: 085C34EAC00FC1E6615982C13C13A8C2D9012EC1 Uid: Alexander Golovko Allow: bacula (C331BA3F75FB723B5873785B06EAA066E397832F), bacula-doc (C331BA3F75FB723B5873785B06EAA066E397832F) Fingerprint: B1A51EB2779DD01743CC19BA1CF792111B5228B0 Uid: Alexandre Mestiashvili Allow: bowtie2 (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), cufflinks (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), libdancer-session-cookie-perl (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), libpam-abl (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), pycorrfit (6D2EB3CAF6BCD06EEF42247F60305B31C09FD35A), seq-gen (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), tophat (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), transtermhp (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1) Fingerprint: 800A1489C2F186F57C3D41C734705168FE9F0236 Uid: Alexandre Raymond Allow: password-gorilla (710F265D7B816542F23CE054D4B7DDF7B16CCA95), restartd (710F265D7B816542F23CE054D4B7DDF7B16CCA95) Fingerprint: 5B76E76B4AAD389A76F9BCF99688FFC1C78102DF Uid: Allison Randal Allow: parrot (A4F455C3414B10563FCC9244AFA51BD6CDE573CB) Fingerprint: 7FEB617A87114E1BDE8C89C92713E679084651AF Uid: Andrea Colangelo Allow: fortune-mod (8F049AD82C92066C7352D28A7B585B30807C2A87), key-mon (66B4DFB68CB24EBBD8650BC4F4B4B0CC797EBFAB), tennix (DDC53E5130FD08223F98945649086AD3EBE2F31F) Fingerprint: 0BCA751BEEB81FBC7661BEA5C412AF7E994376FD Uid: Andreas Hildebrandt Allow: ball (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1) Fingerprint: 1662F3FE0EF53DE5E6CE0031B446EEA8329A945A Uid: Andreas Noteng Allow: checkinstall (218EE0362033C87B6C135FA4A3BABAE2408DD6CF), transgui (374FF2AD0A12935FD0B0C84F1B132E01CEC6AD46) Fingerprint: DB306E4B10FFD98EF4DB55D7194B631AB2DA2888 Uid: Andreas Rönnquist Allow: devilspie2 (B3131A451DBFDF7CA05B4197054BBB9F7D806442), sciteproj (B3131A451DBFDF7CA05B4197054BBB9F7D806442) Fingerprint: 34CA12A3C6F8B15672C2D0D7D286CE0C0C62B791 Uid: Andrew Ruthven Allow: mythtv-status (8C470B2A0B31568E110D432516281F2E007C98D1) Fingerprint: 3E02FD6656295952110BAB99F51B18C720248224 Uid: Apollon Oikonomopoulos Allow: beanstalkc (A9592C521CB904077D6598009D0B5E5B1EEC8F0E), beanstalkd (A9592C521CB904077D6598009D0B5E5B1EEC8F0E), ganeti (4C951CEC98B44B68A286FF458489B14D8807529B), ioping (A9592C521CB904077D6598009D0B5E5B1EEC8F0E), python-hiredis (A9592C521CB904077D6598009D0B5E5B1EEC8F0E), redsocks (A9592C521CB904077D6598009D0B5E5B1EEC8F0E), ruby-hiredis (A9592C521CB904077D6598009D0B5E5B1EEC8F0E), xmobar (A9592C521CB904077D6598009D0B5E5B1EEC8F0E) Fingerprint: C1FABEE40A628709CCFB7D2C964D005C0CA7686C Uid: Artur R. Czechowski Allow: imms (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), lwatch (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), rrdcollect (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06) Fingerprint: AF031CB8DFFB7DC5E1EEEB04A7C9FF063F3D2E03 Uid: Axel Wagner Allow: shellex (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D) Fingerprint: D6E01EC516A5DFCEF71956D3775079E5B850BC93 Uid: Bernhard Schmidt Allow: torrus (A3C282024F979BAD6ED484D18196A5446BBA3C84) Fingerprint: EC9F905D866DBE46A896C827BE0C924203F4552D Uid: ChangZhuo Chen Allow: ibus-chewing (374FF2AD0A12935FD0B0C84F1B132E01CEC6AD46), libchewing (374FF2AD0A12935FD0B0C84F1B132E01CEC6AD46) Fingerprint: 1DE86AB01897A330D973D77C50DD5A29FB099999 Uid: Chris Boot Allow: ppp (1F2232EEE56FD048EAEFE47F1467F0D8E1EE3FB1), ulogd2 (0A55B7C51223394286EC74C35394479DD3524C51) Fingerprint: 7D1ACFFAD9E0806C9C4CD3925C13D6DB93052E03 Uid: Christian Hofstaedtler Allow: boot-info-script (556509901902AF06ADC6E01C04AAE5B397F1AAAC), bundler (556509901902AF06ADC6E01C04AAE5B397F1AAAC), cciss-vol-status (556509901902AF06ADC6E01C04AAE5B397F1AAAC), gist (556509901902AF06ADC6E01C04AAE5B397F1AAAC), grml-debootstrap (556509901902AF06ADC6E01C04AAE5B397F1AAAC), grml-rescueboot (556509901902AF06ADC6E01C04AAE5B397F1AAAC), grml2usb (556509901902AF06ADC6E01C04AAE5B397F1AAAC), pbundler (556509901902AF06ADC6E01C04AAE5B397F1AAAC), ruby-mechanize (556509901902AF06ADC6E01C04AAE5B397F1AAAC), salt (556509901902AF06ADC6E01C04AAE5B397F1AAAC) Fingerprint: 08F084DA146C873C361AAFA8E76004C5CEF0C94C Uid: Christian Kastner Allow: diveintopython3 (CDB5A1243ACDB63009AD07212D4EB3A6015475F5) Fingerprint: 08CD6D1255FA3A875C1FB096398D1112D3A4BDE1 Uid: Christian M. Amsüss Allow: openscad (9A57344C54D3C8610A5F22FCBAA569D0CBF12A6A) Fingerprint: 3688337C0D3E372594ECE4018D52CDE95117E119 Uid: Christian Welzel Allow: typo3-src (B8BF54137B09D35CF026FE9D091AB856069AAA1C) Fingerprint: 7062DAA4F001B9C6616700CF68C287DFC6A80226 Uid: Colin King Allow: eventstat (73EE922658C2E07340EA9613E7F710555409E422), powerstat (73EE922658C2E07340EA9613E7F710555409E422), thermald (73EE922658C2E07340EA9613E7F710555409E422) Fingerprint: 709F54E4ECF3195623326AE3F82E5CC04B2B2B9E Uid: Daniel Baumann Allow: clzip (65A12DF4FE31AD6BAC4D76AE3355F4D63B5821CC), criu (A4AD7A700EE5F70F31B16FA32127371B9BB23062), dosfstools (A4AD7A700EE5F70F31B16FA32127371B9BB23062), foxtrotgps (A4AD7A700EE5F70F31B16FA32127371B9BB23062), fuse (A4AD7A700EE5F70F31B16FA32127371B9BB23062), gfxboot (A4AD7A700EE5F70F31B16FA32127371B9BB23062), gfxboot-examples (A4AD7A700EE5F70F31B16FA32127371B9BB23062), gfxboot-themes (A4AD7A700EE5F70F31B16FA32127371B9BB23062), git-stuff (A4AD7A700EE5F70F31B16FA32127371B9BB23062), gnu-efi (A4AD7A700EE5F70F31B16FA32127371B9BB23062), irker (A4AD7A700EE5F70F31B16FA32127371B9BB23062), libcgroup (A4AD7A700EE5F70F31B16FA32127371B9BB23062), live-boot (A4AD7A700EE5F70F31B16FA32127371B9BB23062), live-build (A4AD7A700EE5F70F31B16FA32127371B9BB23062), live-config (A4AD7A700EE5F70F31B16FA32127371B9BB23062), live-debconfig (A4AD7A700EE5F70F31B16FA32127371B9BB23062), live-images (A4AD7A700EE5F70F31B16FA32127371B9BB23062), live-manual (A4AD7A700EE5F70F31B16FA32127371B9BB23062), live-tools (A4AD7A700EE5F70F31B16FA32127371B9BB23062), lunzip (65A12DF4FE31AD6BAC4D76AE3355F4D63B5821CC), lxc (A4AD7A700EE5F70F31B16FA32127371B9BB23062), lzd (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), lzip (A4AD7A700EE5F70F31B16FA32127371B9BB23062), lziprecover (65A12DF4FE31AD6BAC4D76AE3355F4D63B5821CC), lzlib (A4AD7A700EE5F70F31B16FA32127371B9BB23062), ntfs-3g (A4AD7A700EE5F70F31B16FA32127371B9BB23062), pdlzip (65A12DF4FE31AD6BAC4D76AE3355F4D63B5821CC), plymouth (A4AD7A700EE5F70F31B16FA32127371B9BB23062), plzip (65A12DF4FE31AD6BAC4D76AE3355F4D63B5821CC), python-irc (A4AD7A700EE5F70F31B16FA32127371B9BB23062), syslinux (A4AD7A700EE5F70F31B16FA32127371B9BB23062), tftp-hpa (A4AD7A700EE5F70F31B16FA32127371B9BB23062), vsftpd (A4AD7A700EE5F70F31B16FA32127371B9BB23062), zutils (65A12DF4FE31AD6BAC4D76AE3355F4D63B5821CC) Fingerprint: 160853D573C1690115FA4B78B012AD8CF19F599F Uid: Darren Salt Allow: glbsp (93005DC27E876C37ED7BCA9A98083544945348A4), gxine (93005DC27E876C37ED7BCA9A98083544945348A4), mercurial-buildpackage (93005DC27E876C37ED7BCA9A98083544945348A4), playmidi (93005DC27E876C37ED7BCA9A98083544945348A4), pngmeta (93005DC27E876C37ED7BCA9A98083544945348A4), rfkill (93005DC27E876C37ED7BCA9A98083544945348A4), xine-lib (93005DC27E876C37ED7BCA9A98083544945348A4), xine-lib-1.2 (93005DC27E876C37ED7BCA9A98083544945348A4), xine-ui (93005DC27E876C37ED7BCA9A98083544945348A4) Fingerprint: AE0DBF5A92A5ADE49481BA6F8A3171EF366150CE Uid: David Steele Allow: gnome-gmail (467348C85F3A5A9B2B0D169EBF1E9D1F76D52AC4) Fingerprint: 126064058E7A80FE7D0672298F342172F407DB73 Uid: Devid Antonio Filoni Allow: gexiv2 (DDC53E5130FD08223F98945649086AD3EBE2F31F), granite (DDC53E5130FD08223F98945649086AD3EBE2F31F), ircp-tray (DDC53E5130FD08223F98945649086AD3EBE2F31F), libraw (DDC53E5130FD08223F98945649086AD3EBE2F31F), msn-pecan (DDC53E5130FD08223F98945649086AD3EBE2F31F), shotwell (DDC53E5130FD08223F98945649086AD3EBE2F31F), sqlheavy (DDC53E5130FD08223F98945649086AD3EBE2F31F), sushi (DDC53E5130FD08223F98945649086AD3EBE2F31F) Fingerprint: 1AFC09386700D1A8F05C65ADE5AB5F161CDD0D98 Uid: Diane Trout Allow: ktp-accounts-kcm (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-approver (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-auth-handler (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-call-ui (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-contact-list (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-contact-runner (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-desktop-applets (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-filetransfer-handler (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-kded-integration-module (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-send-file (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), ktp-text-ui (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), meta-kde-telepathy (12DDFA84AC23B2BBF04B313CAB645F406286A7D0) Fingerprint: 6EE50664D18E4E0CB8B43DF700E89439F228292B Uid: Dima Kogan Allow: feedgnuplot (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), libdogleg (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), liblbfgs (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), tcpflow (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), vlfeat (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), xcscope-el (E50AFD55ADD27AAB97163A8B21D20589974B3E96) Fingerprint: 2626C74FA4EA17DF304B1EF2A03F52085D424895 Uid: Dimitrios Eftaxiopoulos Allow: freefem++ (20691DFCC2C98C47952984EE00018C22381A7594), mathgl (20691DFCC2C98C47952984EE00018C22381A7594) Fingerprint: 3A82860837A0CD32470F91E62AC1E075F5ED1B25 Uid: The Roman People Allow: not-a-package (BCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A), pari-extra (BCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A) Fingerprint: F24299FF1BBC9018B906A4CB6026936D2F1C8AE0 Uid: Dmitry Shachnev Allow: mathjax (6EB223D7D71E67A53C93A7DA3B56E2BBD53FDCB1), mathjax-docs (6EB223D7D71E67A53C93A7DA3B56E2BBD53FDCB1), pymarkups (6EB223D7D71E67A53C93A7DA3B56E2BBD53FDCB1), pyqt5 (7523647B95E5047547EC2BBA1DA8DA33DDCD686A), python-gdata (6EB223D7D71E67A53C93A7DA3B56E2BBD53FDCB1), python-markdown (ECA1E3F28E112432D485DD95EB36171A6FF9435F), python-qt4 (7523647B95E5047547EC2BBA1DA8DA33DDCD686A), python-secretstorage (6EB223D7D71E67A53C93A7DA3B56E2BBD53FDCB1), retext (6EB223D7D71E67A53C93A7DA3B56E2BBD53FDCB1), sip4 (7523647B95E5047547EC2BBA1DA8DA33DDCD686A), sphinx (6EB223D7D71E67A53C93A7DA3B56E2BBD53FDCB1), woff-tools (6EB223D7D71E67A53C93A7DA3B56E2BBD53FDCB1) Fingerprint: 71B8F031E648BCD95EAC18FA47712171F2ED62FB Uid: Elmar Heeb Allow: autocutsel (F067EA2726B9C3FC1486202EC09E1D8995930EDE) Fingerprint: 64CF7C59E56B38F04CA6F861C9F1CBF56351F719 Uid: Elías Alejandro Año Mendoza Allow: fdclone (04160004A8276E40BB9890FBE8A48AE5311D765A), gpick (04160004A8276E40BB9890FBE8A48AE5311D765A), uget (04160004A8276E40BB9890FBE8A48AE5311D765A) Fingerprint: 5201B8B5039F3F03E628F16B826355E260F7BCB2 Uid: Emile Joubert Allow: rabbitmq-server (325A3DD1F8D5E51C5D1D83725EB9E72A228A3AE4) Fingerprint: 1D68927B7F2964590BB000F0AE0C84BB0A2368F0 Uid: Emilien Klein Allow: nautilus-image-manipulator (E1D8579682144687E416948C859FEF67258E26B1) Fingerprint: B8CE4DE21080DCF903E16C40F513C419E4B9D0AC Uid: Emmanuel Bourg Allow: ant (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ant-contrib (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ant1.7 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), antlr (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), antlr-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), antlr3 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), apache-log4j1.2 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), apache-pom (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), asm (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), asm2 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), asm3 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), aspectj-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), avalon-framework (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), axis (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), batik (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), bcel (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), bouncycastle (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), build-helper-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), cglib (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), checkstyle (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-beanutils (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-configuration (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-csv (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-daemon (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-exec (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-httpclient (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-io (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-javaflow (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-jci (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-math (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-math3 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-parent (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-pool (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), commons-vfs (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), derby (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), dom4j (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), doxia-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ehcache (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), excalibur-logger (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), excalibur-logkit (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), exec-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-bundlerepository (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-framework (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-gogo-command (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-gogo-runtime (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-gogo-shell (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-main (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-osgi-obr (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-shell (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-shell-tui (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), felix-utils (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), fop (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), guava-libraries (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), hessian (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), hsqldb (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), hsqldb1.8.0 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), httpcomponents-client (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), httpcomponents-core (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ivy (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jakarta-jmeter (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jakarta-log4j (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jakarta-taglibs-standard (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jarjar-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jasperreports (E50AFD55ADD27AAB97163A8B21D20589974B3E96), jasperreports3.7 (E50AFD55ADD27AAB97163A8B21D20589974B3E96), java3d (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), javacc (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), javacc-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jcifs (E50AFD55ADD27AAB97163A8B21D20589974B3E96), jenkins-dom4j (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jmock (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), joda-convert (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jsch (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jsoup (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), junit (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), junit4 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), jzlib (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libapache-poi-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libasm4-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-attributes-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-cli-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-codec-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-collections-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-collections3-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-compress-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-dbcp-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-digester-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-discovery-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-el-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-fileupload-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-jexl-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-jexl2-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-jxpath-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-lang-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-lang3-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-launcher-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-logging-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-modeler-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-net-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-net1-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-net2-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-openpgp-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libcommons-validator-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libfreemarker-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libhamcrest-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libhibernate3-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libitext-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libitext5-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libj2ssh-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libjgroups-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libjoda-time-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libjtype-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libmiglayout-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libmx4j-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), liboro-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libproxool-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), librelaxng-datatype-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libswingx-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libswingx1-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libws-commons-util (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libws-commons-util-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libxalan2-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libxerces2-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libxml-security-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), libxmpcore-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libxstream-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), lucene-solr (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), lucene2 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-antrun-extended-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-antrun-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-assembly-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-bundle-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-clean-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-compiler-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-dependency-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-ear-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-ejb-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-hpi-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-install-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-invoker-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-jar-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-javadoc-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-plugin-tools (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-project-info-reports-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-resources-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-shade-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-site-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-source-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-stapler-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven-war-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven2 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), maven2-core (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), mina (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), mina2 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), munge-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), mysql-connector-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ognl (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), opencsv (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), plexus-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), properties-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), sitemesh (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), substance (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), surefire (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), tagsoup (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), uima-addons (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), uima-as (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), uimaj (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), vecmath (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), velocity (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), velocity-tools (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), xml-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), xmlbeans-maven-plugin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), xmlunit (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), xz-java (DEE63CAACE54B9B27DDCD34A88E5D733DD899610) Fingerprint: F6258DF2BFF9A73F5B1E15C306456DD791E95791 Uid: Emmanuel Kasper Kasprzyk Allow: mame (73ED4244FD43588620AC2644258494BA917A225E), mess (73ED4244FD43588620AC2644258494BA917A225E) Fingerprint: FC3D302E02E469C30AA89067F7D931D4B882EBD7 Uid: Eric Cooper Allow: approx (58EB0999C64E897EE894B8037853DA4D49881AD3), ocaml-sha (02054829E12D0F2A8E648E62745C4766D4CACDFF) Fingerprint: 73571E85C19F4281D8C97AA86CA41A7743B8D6C8 Uid: Erik de Castro Lopo Allow: libsamplerate (B2F9C5E313771B0DC8B0F6B503C0023E05410E97), libsndfile (B2F9C5E313771B0DC8B0F6B503C0023E05410E97), sndfile-tools (B2F9C5E313771B0DC8B0F6B503C0023E05410E97) Fingerprint: 11DD7D0BBA65B6AE507DD59200AB067AE47B79A4 Uid: Eugen Dedu Allow: ekiga (75FFFC9F717B526296A20609BDD933B785FEC17F), opal (75FFFC9F717B526296A20609BDD933B785FEC17F), ptlib (75FFFC9F717B526296A20609BDD933B785FEC17F) Fingerprint: 4D60D518D9ADC00459A27B1CD7D3402E0106630C Uid: Eugene Zhukov Allow: epubcheck (693367FFAECD8EAACD1F063B0171E1828AE09345), xml-maven-plugin (693367FFAECD8EAACD1F063B0171E1828AE09345) Fingerprint: ECA5F5232FE1F8E3B1303ACB5E326303C98B5D5D Uid: Federico Ceratto Allow: cmd2 (2BABC6254E66E7B8450AC3E1E6AA90171392B174), debtags (66B4DFB68CB24EBBD8650BC4F4B4B0CC797EBFAB), easyzone (2BABC6254E66E7B8450AC3E1E6AA90171392B174), freshen (2BABC6254E66E7B8450AC3E1E6AA90171392B174), gitmagic (2BABC6254E66E7B8450AC3E1E6AA90171392B174), pudb (2BABC6254E66E7B8450AC3E1E6AA90171392B174), pymongo (2BABC6254E66E7B8450AC3E1E6AA90171392B174), python-bottle (2BABC6254E66E7B8450AC3E1E6AA90171392B174), python-enum (2BABC6254E66E7B8450AC3E1E6AA90171392B174), python-nmap (2BABC6254E66E7B8450AC3E1E6AA90171392B174), python-xattr (2BABC6254E66E7B8450AC3E1E6AA90171392B174), runsnakerun (2BABC6254E66E7B8450AC3E1E6AA90171392B174), squaremap (2BABC6254E66E7B8450AC3E1E6AA90171392B174), tgmochikit (2BABC6254E66E7B8450AC3E1E6AA90171392B174), turbojson (2BABC6254E66E7B8450AC3E1E6AA90171392B174), turbokid (2BABC6254E66E7B8450AC3E1E6AA90171392B174), uncertainties (2BABC6254E66E7B8450AC3E1E6AA90171392B174) Fingerprint: CAF85751553EAC43538D56487F3805C7D82FB9C8 Uid: Felix Zielcke Allow: grub (AC0A4FF12611B6FCCF01C111393587D97D86500B), grub-installer (AC0A4FF12611B6FCCF01C111393587D97D86500B), grub2 (AC0A4FF12611B6FCCF01C111393587D97D86500B), libaal (AC0A4FF12611B6FCCF01C111393587D97D86500B), reiser4progs (AC0A4FF12611B6FCCF01C111393587D97D86500B), reiserfsprogs (AC0A4FF12611B6FCCF01C111393587D97D86500B) Fingerprint: 0FB1803BC91D1B601E2A2C22702A26DB4CCB3FFC Uid: Floris Bruynooghe Allow: omniorb-dfsg (4B74F71B1C2272344249BF53CF62D79438E68E0E), python-omniorb (4B74F71B1C2272344249BF53CF62D79438E68E0E) Fingerprint: 25F3B67F038187D3ADF60A3329E36B9A01ED3AC7 Uid: Frank Habermann Allow: ckeditor (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), fckeditor (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), knowledgeroot (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), prototypejs (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), scriptaculous (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tinymce (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), zendframework (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E) Fingerprint: B5BCBDDE7CA813D4F6A3D135A7771D09B55C9C2B Uid: Gabriele Giacone <1o5g4r8o@gmail.com> Allow: critterding (E50AFD55ADD27AAB97163A8B21D20589974B3E96), gnash (E50AFD55ADD27AAB97163A8B21D20589974B3E96), jedit (E50AFD55ADD27AAB97163A8B21D20589974B3E96), jxplorer (E50AFD55ADD27AAB97163A8B21D20589974B3E96), pidgin-skype (DDC53E5130FD08223F98945649086AD3EBE2F31F), sunflow (E50AFD55ADD27AAB97163A8B21D20589974B3E96), sweethome3d (65A12DF4FE31AD6BAC4D76AE3355F4D63B5821CC), sweethome3d-furniture (E50AFD55ADD27AAB97163A8B21D20589974B3E96), sweethome3d-furniture-editor (E50AFD55ADD27AAB97163A8B21D20589974B3E96), sweethome3d-furniture-nonfree (E50AFD55ADD27AAB97163A8B21D20589974B3E96), sweethome3d-textures-editor (E50AFD55ADD27AAB97163A8B21D20589974B3E96), ubiquity-extension (A62D2CFBD50B9B5BF360D54B159EB5C4EFC8774C) Fingerprint: 2985B56E5FBC9D9C21E9597B8B6EF2528F075E1D Uid: Gianfranco Costamagna Allow: boinc (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), boinc-app-milkyway (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), boinc-app-seti (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), docbook2x (B5E7DDCA01B39BEE841B1E199B46F1FB088F6B8C), hedgewars (1B23D4F88EC0D9020555E438AB8C00CFF8E26537), qviaggiatreno (E5D870FFBB267D90D52C56B5347A7D93176015ED) Fingerprint: 05D0169C26E41593418129DF199A64FADFB500FF Uid: Gregor Jasny Allow: c-ares (3BDC04824EA81277AE46EA72F98825AC26B47B9F), v4l-utils (3BDC04824EA81277AE46EA72F98825AC26B47B9F) Fingerprint: 519B6955BF534A43E3D60827554297EDF9CCA585 Uid: Guo Yixuan Allow: boinc (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), boinc-app-seti (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), gcc-4.4-doc-non-dfsg (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), gcc-4.6-doc (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), gcc-4.7-doc (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), gcc-4.8-doc (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), gcc-doc-defaults (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), pod2pdf (36E2EDDEC21FEC8F77B87436D362B62A54B99890) Fingerprint: 4656B626E481EE4E7EC572DA46CC5C63F318A56A Uid: Helge Kreutzmann Allow: asclock (F849E2025D1C194DE62BC6C829BE5D2268FD549F), goobox (F849E2025D1C194DE62BC6C829BE5D2268FD549F), linuxinfo (F849E2025D1C194DE62BC6C829BE5D2268FD549F) Fingerprint: DF2494F9FA1BDEFC1A718FFCD350BB0228F60193 Uid: Hsin-Yi Chen Allow: python-ucltip (DA06F3E341E999EC18C376DDA108FBC534A26946), python-vsgui (DA06F3E341E999EC18C376DDA108FBC534A26946) Fingerprint: 7405E745574809734800156DB65019C47F7A36F8 Uid: IOhannes m zmölnig Allow: assimp (5E61C8780F86295CE17D86779F0FE587374BBE81), gem (5E61C8780F86295CE17D86779F0FE587374BBE81), pd-iemambi (5E61C8780F86295CE17D86779F0FE587374BBE81), pd-iemmatrix (5E61C8780F86295CE17D86779F0FE587374BBE81), pd-iemnet (5E61C8780F86295CE17D86779F0FE587374BBE81), pd-osc (5E61C8780F86295CE17D86779F0FE587374BBE81), pd-readanysf (5E61C8780F86295CE17D86779F0FE587374BBE81), pd-zexy (5E61C8780F86295CE17D86779F0FE587374BBE81), pdp (5E61C8780F86295CE17D86779F0FE587374BBE81), puredata (5E61C8780F86295CE17D86779F0FE587374BBE81), v4l2loopback (5E629EE5232197357B84CF4332247FBB40AD1FA6) Fingerprint: 9D5CEE01334F46CE2FEF6DC6EC63699779074FA8 Uid: Ian Campbell Allow: flash-kernel (B60EBF2984453C70D74CF478FF914AF0C2B35520), qcontrol (F849E2025D1C194DE62BC6C829BE5D2268FD549F), xserver-xorg-video-ivtvdev (33B18B87928138D4E7AE88FF7867D53C747935DD) Fingerprint: 068B8122734EF48428A2E477BC2CB1A2686FF87F Uid: Ignace Mouzannar Allow: lshell (F8921D3A7404C86E11352215C7197699B29B232A) Fingerprint: B11E2D9D2861F45188B200A158B29F8CF74EC6C8 Uid: Iulian Udrea Allow: haskell-adjunctions (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-algebra (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-bifunctors (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-categories (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-comonad (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-comonad-transformers (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-comonads-fd (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-contravariant (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-data-lens (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-distributive (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-free (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-keys (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-maths (4E469519ED677734268FBD958F7BF8FC4A11C97A), haskell-representable-functors (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-representable-tries (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-semigroupoids (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), haskell-void (3D0EFB95E7B5237F16E82258E352D5C51C5041D4) Fingerprint: 7BF5F6AC36431F5D40DC137A4CF2B218F54DAE3D Uid: Jakob Haufe Allow: blogofile (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D), glabels (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D), minitube (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D) Fingerprint: 80887BA0E28203ADC125E0049D50E144E6357327 Uid: James Hunt Allow: procenv (D764F6CC2AB59A38B1147D73887B60618B3C16AE), utfout (D764F6CC2AB59A38B1147D73887B60618B3C16AE) Fingerprint: B65D085B94117B813160B659ED34CEABE27BAABC Uid: Jameson Graef Rollins Allow: assword (0EE5BE979282D80B9F7540F1CCD2ED94D21739E9) Fingerprint: 0896F05999C906DBB3BCD04BF1E30FE50CA6B4AA Uid: Jan Beyer Allow: bibus (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), gwyddion (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1) Fingerprint: 4617E5FBC56DACB67C8CDE643A4CB2701A89CC23 Uid: Jan-Pascal van Best Allow: spotweb (D53A815A3CB7659AF882E3958EEDCC1BAA1F32FF) Fingerprint: 4A543513D2DF6351A8178EA35B019455E2B84FA5 Uid: Jaromír Mikeš Allow: aliki (04160004A8276E40BB9890FBE8A48AE5311D765A), amb-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), ambdec (04160004A8276E40BB9890FBE8A48AE5311D765A), ardour3 (218EE0362033C87B6C135FA4A3BABAE2408DD6CF), brp-pacu (04160004A8276E40BB9890FBE8A48AE5311D765A), caps (218EE0362033C87B6C135FA4A3BABAE2408DD6CF), clthreads (04160004A8276E40BB9890FBE8A48AE5311D765A), clxclient (04160004A8276E40BB9890FBE8A48AE5311D765A), composite (04160004A8276E40BB9890FBE8A48AE5311D765A), dataquay (04160004A8276E40BB9890FBE8A48AE5311D765A), drc (04160004A8276E40BB9890FBE8A48AE5311D765A), drumkv1 (04160004A8276E40BB9890FBE8A48AE5311D765A), ebumeter (04160004A8276E40BB9890FBE8A48AE5311D765A), eq10q (04160004A8276E40BB9890FBE8A48AE5311D765A), faustworks (04160004A8276E40BB9890FBE8A48AE5311D765A), fil-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), garmindev (5701F1D0D18B87E61AA31F3DC073D2287FFB9E9B), gmidimonitor (04160004A8276E40BB9890FBE8A48AE5311D765A), gtklick (04160004A8276E40BB9890FBE8A48AE5311D765A), gwc (04160004A8276E40BB9890FBE8A48AE5311D765A), gxtuner (04160004A8276E40BB9890FBE8A48AE5311D765A), invada-studio-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), invada-studio-plugins-lv2 (04160004A8276E40BB9890FBE8A48AE5311D765A), ir.lv2 (04160004A8276E40BB9890FBE8A48AE5311D765A), jaaa (04160004A8276E40BB9890FBE8A48AE5311D765A), jack-capture (04160004A8276E40BB9890FBE8A48AE5311D765A), jack-midi-clock (04160004A8276E40BB9890FBE8A48AE5311D765A), jalv (04160004A8276E40BB9890FBE8A48AE5311D765A), japa (04160004A8276E40BB9890FBE8A48AE5311D765A), jconvolver (04160004A8276E40BB9890FBE8A48AE5311D765A), jkmeter (04160004A8276E40BB9890FBE8A48AE5311D765A), jmeters (04160004A8276E40BB9890FBE8A48AE5311D765A), jnoise (04160004A8276E40BB9890FBE8A48AE5311D765A), jnoisemeter (04160004A8276E40BB9890FBE8A48AE5311D765A), klick (04160004A8276E40BB9890FBE8A48AE5311D765A), ladspa-sdk (218EE0362033C87B6C135FA4A3BABAE2408DD6CF), libinstpatch (04160004A8276E40BB9890FBE8A48AE5311D765A), libltc (04160004A8276E40BB9890FBE8A48AE5311D765A), lv2-c++-tools (04160004A8276E40BB9890FBE8A48AE5311D765A), lv2core (04160004A8276E40BB9890FBE8A48AE5311D765A), lv2dynparam1 (04160004A8276E40BB9890FBE8A48AE5311D765A), lv2fil (04160004A8276E40BB9890FBE8A48AE5311D765A), mcp-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), meterbridge (04160004A8276E40BB9890FBE8A48AE5311D765A), midisnoop (04160004A8276E40BB9890FBE8A48AE5311D765A), nekobee (04160004A8276E40BB9890FBE8A48AE5311D765A), paulstretch (04160004A8276E40BB9890FBE8A48AE5311D765A), petri-foo (04160004A8276E40BB9890FBE8A48AE5311D765A), phat (04160004A8276E40BB9890FBE8A48AE5311D765A), plotmm (04160004A8276E40BB9890FBE8A48AE5311D765A), pyliblo (04160004A8276E40BB9890FBE8A48AE5311D765A), qlandkartegt (5701F1D0D18B87E61AA31F3DC073D2287FFB9E9B), qmidiarp (04160004A8276E40BB9890FBE8A48AE5311D765A), qmidiroute (04160004A8276E40BB9890FBE8A48AE5311D765A), rev-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), rubberband (04160004A8276E40BB9890FBE8A48AE5311D765A), samplv1 (04160004A8276E40BB9890FBE8A48AE5311D765A), showq (04160004A8276E40BB9890FBE8A48AE5311D765A), sineshaper (04160004A8276E40BB9890FBE8A48AE5311D765A), slv2 (04160004A8276E40BB9890FBE8A48AE5311D765A), sonic-visualiser (04160004A8276E40BB9890FBE8A48AE5311D765A), sooperlooper (04160004A8276E40BB9890FBE8A48AE5311D765A), specimen (04160004A8276E40BB9890FBE8A48AE5311D765A), swami (04160004A8276E40BB9890FBE8A48AE5311D765A), synthv1 (04160004A8276E40BB9890FBE8A48AE5311D765A), tap-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), tap-plugins-doc (04160004A8276E40BB9890FBE8A48AE5311D765A), vamp-plugin-sdk (04160004A8276E40BB9890FBE8A48AE5311D765A), vco-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), wah-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), x42-plugins (04160004A8276E40BB9890FBE8A48AE5311D765A), xjadeo (04160004A8276E40BB9890FBE8A48AE5311D765A), yoshimi (04160004A8276E40BB9890FBE8A48AE5311D765A), zita-ajbridge (218EE0362033C87B6C135FA4A3BABAE2408DD6CF), zita-alsa-pcmi (04160004A8276E40BB9890FBE8A48AE5311D765A), zita-at1 (04160004A8276E40BB9890FBE8A48AE5311D765A), zita-convolver (04160004A8276E40BB9890FBE8A48AE5311D765A), zita-lrx (04160004A8276E40BB9890FBE8A48AE5311D765A), zita-mu1 (04160004A8276E40BB9890FBE8A48AE5311D765A), zita-resampler (04160004A8276E40BB9890FBE8A48AE5311D765A), zita-rev1 (04160004A8276E40BB9890FBE8A48AE5311D765A), zynaddsubfx (04160004A8276E40BB9890FBE8A48AE5311D765A) Fingerprint: E8CDDDFCE25A166FAF617CB647D23A6E56164AC2 Uid: Jean-Michel Vourgère Allow: mdbtools (1EBA24A7DAAE662C6FF34B37C7F521C122B282CA) Fingerprint: 0D80EABB04476E542C9408E10ADB299C1F137C9F Uid: Jeroen Dekkers Allow: sbjson (F1F3A87ED983DFAD791ADAD83DAF54A21EEF5276), sogo (F1F3A87ED983DFAD791ADAD83DAF54A21EEF5276), sope (F1F3A87ED983DFAD791ADAD83DAF54A21EEF5276) Fingerprint: 5E787F8DB58F02AF5C63C9DD4A2254641FE1B08B Uid: Joachim Wiedorn Allow: backup2l (73471499CC60ED9EEE805946C5BD6C8F2295D502), duply (B2FF1D95CE8F7A22DF4CF09BA73E0055558FB8DD), fox1.6 (820F6308F2B08DA24D3EC20E750807B5551BE447), lilo (B3131A451DBFDF7CA05B4197054BBB9F7D806442), squidguard (D5C2F9BFCA128BBA22A77218872F702C4D6E25A8), xfe (9FED5C6CE206B70A585770CA965522B9D49AE731) Fingerprint: 1D75E212B34CF4BFA9E0D0D8DE6DE039C1CFC265 Uid: Joao Eriberto Mota Filho Allow: album (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), album-data (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), bittwist (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), chaosreader (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), core-network (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), diskscan (B2DEE66036C40829FCD0F10CFC0DB1BBCD460BDE), ext4magic (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), f3 (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), gconjugue (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), hapm (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), hlbr (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), hlbrw (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), iceweasel-linky (5818BF0C98A32B8382BFD3B4564126F229F19BD1), jp2a (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), libpcapnav (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), lime-forensics (B2DEE66036C40829FCD0F10CFC0DB1BBCD460BDE), linky (5818BF0C98A32B8382BFD3B4564126F229F19BD1), mac-robber (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), netmate (B2DEE66036C40829FCD0F10CFC0DB1BBCD460BDE), pacman4console (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), pcapfix (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), pdfcrack (B2DEE66036C40829FCD0F10CFC0DB1BBCD460BDE), phpwebcounter (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), phpwebcounter-extra (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), sentinella (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F), vokoscreen (B2DEE66036C40829FCD0F10CFC0DB1BBCD460BDE), volatility (B2DEE66036C40829FCD0F10CFC0DB1BBCD460BDE), volatility-profiles (B2DEE66036C40829FCD0F10CFC0DB1BBCD460BDE), yara (B2DEE66036C40829FCD0F10CFC0DB1BBCD460BDE) Fingerprint: 102E2FE7D5141DBD12B260FCB09E40B0F2AE6AB9 Uid: Joe Healy Allow: salt (2CCB26BC5C49BC221F20794255C9882D999BBCC4) Fingerprint: B3F8B98212122A2015555F1E8B1344DE9F807F14 Uid: Johannes Ring Allow: doconce (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), dolfin (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), fenics (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ferari (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ffc (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), fiat (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), instant (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), preprocess (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ptex2tex (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), scitools (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), syfi (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ufc (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ufl (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), viper (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), vmtk (DEE63CAACE54B9B27DDCD34A88E5D733DD899610) Fingerprint: CACE80AE01512F9AE8AB80D61C01F443C9C93C5A Uid: John Stamp Allow: kcometen4 (7A33ECAA188B96F27C917288B3464F896AA15948), lastfm (8F049AD82C92066C7352D28A7B585B30807C2A87), liblastfm (8F049AD82C92066C7352D28A7B585B30807C2A87) Fingerprint: CFC5B232C0D082CAE6B3A166F04CEFF6016CFFD0 Uid: Jonas Genannt Allow: gitalist (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), graphite-carbon (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), graphite-web (F607B30B062EA443D33C70E0396DA361FE5F1D7F), libalgorithm-dependency-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libapp-cache-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libaudio-mixer-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libcatalyst-plugin-unicode-encoding-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libcatalyst-view-component-subinclude-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libcrypt-hcesha-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libdatetime-format-duration-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libdbd-ldap-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libfile-flat-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libgit-pure-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libjavascript-rpc-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libmoosex-types-iso8601-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libparams-util-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libpasswd-unix-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libpod-tests-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libprefork-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libtemplate-plugin-cycle-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libtemplate-plugin-utf8decode-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libtest-classapi-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libtest-inline-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), libtest-utf8-perl (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), mcollective (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), python-ceres (F607B30B062EA443D33C70E0396DA361FE5F1D7F), python-whisper (F607B30B062EA443D33C70E0396DA361FE5F1D7F), ruby-gelf (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), ruby-stomp (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E) Fingerprint: 6150F716E9FEE0D115B073EB156EEC0737AD3296 Uid: Jonathan McCrohan Allow: dtv-scan-tables (26C0976C594BE3C7A5A392DDF7180D26AEDAA642), figlet (3BE16591C78C2AA431DDAEEF640602273516D372), lcd4linux (93005DC27E876C37ED7BCA9A98083544945348A4), nyancat (CDB5A1243ACDB63009AD07212D4EB3A6015475F5), transmission-remote-cli (8AE6CDFF6535192FB5B659212262D36F7ADF9466), wavemon (843E5FA61E6063389876D2E5EE4AFD69EC65108F) Fingerprint: 8B77BA48391B3CE51C22953132CC4AAC028756FF Uid: Julian Taylor Allow: fftw3 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ipython (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), keepass2 (3D0EFB95E7B5237F16E82258E352D5C51C5041D4), libmatheval (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), node-marked (03C4E7ABB880F524306E48156611C05EDD39F374), pycxx (7523647B95E5047547EC2BBA1DA8DA33DDCD686A), python-scipy (0C19C882237D25D43B8A41BE70373CF1290DB9CE), pyzmq (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645) Fingerprint: C11CA58C0175C240D58C30C8D27DDE1140A2F113 Uid: KURASHIKI Satoru Allow: bzr-email (58E1222F9696C885A3CD104C5D328D082AAAB140), e2wm (678AC67A3C5A16058122D62171A802D0BCD1BC92), emacs-calfw (5E629EE5232197357B84CF4332247FBB40AD1FA6), emacs-window-layout (5E629EE5232197357B84CF4332247FBB40AD1FA6), goldencheetah (031C623D94EF1F3EF17B1C84E5EFAB90080EA63C), howm (5E629EE5232197357B84CF4332247FBB40AD1FA6), hyperestraier (5E629EE5232197357B84CF4332247FBB40AD1FA6), mha4mysql-manager (5E629EE5232197357B84CF4332247FBB40AD1FA6), mha4mysql-node (5E629EE5232197357B84CF4332247FBB40AD1FA6), mysqltuner (5E629EE5232197357B84CF4332247FBB40AD1FA6), qdbm (5E629EE5232197357B84CF4332247FBB40AD1FA6), ruby-serverspec (0B29D88E42E6B765B8D8EA507839619DD439668E), ruby-specinfra (0B29D88E42E6B765B8D8EA507839619DD439668E), yaskkserv (031C623D94EF1F3EF17B1C84E5EFAB90080EA63C), yatex (0B29D88E42E6B765B8D8EA507839619DD439668E) Fingerprint: B1A47069121F6642BB3D7F3E20B7283AFE254C69 Uid: Keith Winstein Allow: mosh (FBE01342FCEFD379D3DCE61764959FE9838DF19C) Fingerprint: 770B5CDBFB4B868B61434845C617869F1478504E Uid: Keng-Yu Lin Allow: codecgraph (DA06F3E341E999EC18C376DDA108FBC534A26946), ibus-array (DA06F3E341E999EC18C376DDA108FBC534A26946), urfkill (DA06F3E341E999EC18C376DDA108FBC534A26946) Fingerprint: DF603D3A3C151B2CDF1952F418DD4D72F2CBCA06 Uid: Kiwamu Okabe Allow: carettah (5E629EE5232197357B84CF4332247FBB40AD1FA6), ghc-mod (5E629EE5232197357B84CF4332247FBB40AD1FA6), haskell-hcwiid (5E629EE5232197357B84CF4332247FBB40AD1FA6), howm (5E629EE5232197357B84CF4332247FBB40AD1FA6), jhc (0B29D88E42E6B765B8D8EA507839619DD439668E), uim (0B29D88E42E6B765B8D8EA507839619DD439668E) Fingerprint: 281C6E4D93EFF746CAA9C2E8E40215299C840E81 Uid: Koichi Akabe Allow: bzr-search (5E629EE5232197357B84CF4332247FBB40AD1FA6), bzr-stats (5E629EE5232197357B84CF4332247FBB40AD1FA6), bzr-upload (5E629EE5232197357B84CF4332247FBB40AD1FA6), glogic (5E629EE5232197357B84CF4332247FBB40AD1FA6), hts-voice-nitech-jp-atr503-m001 (5E629EE5232197357B84CF4332247FBB40AD1FA6), htsengine (5E629EE5232197357B84CF4332247FBB40AD1FA6), ngraph-gtk (5E629EE5232197357B84CF4332247FBB40AD1FA6), open-jtalk (5E629EE5232197357B84CF4332247FBB40AD1FA6), py3cairo (5E629EE5232197357B84CF4332247FBB40AD1FA6), python-twitter (5E629EE5232197357B84CF4332247FBB40AD1FA6), qr-tools (58E1222F9696C885A3CD104C5D328D082AAAB140), xflr5 (58E1222F9696C885A3CD104C5D328D082AAAB140) Fingerprint: 0F65B88F1EB8928A3DF9D76C28466F1A54C2A185 Uid: Laurent Léonard Allow: gtk-vnc (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426), kio-ftps (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426), ocaml-libvirt (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426), virt-manager (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426), virt-top (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426), virt-viewer (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426), virt-what (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426), virtinst (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426) Fingerprint: FA9A6C62AEA901A663C7A0160A4B6370D2318442 Uid: Lifeng Sun Allow: cernlib (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), clhep (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), fastjet (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), fflas-ffpack (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), geant321 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), givaro (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), hepmc (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), herwig++ (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), lhapdf (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), looptools (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), mclibs (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), ntl (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), paw (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), pythia8 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), rivet (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), root-system (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), siscone (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), thepeg (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), yaml-cpp (DEE63CAACE54B9B27DDCD34A88E5D733DD899610) Fingerprint: FBFC21C78686E0451268694738548517DAD3D5EE Uid: Luis Uribe Allow: phpunit-story (E4F0EDDF374F2C50D4735EC097833DC998EF9A49) Fingerprint: B97BD6A80CAC4981091AE547FE558C72A67013C3 Uid: Maarten Lankhorst Allow: glw (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libdrm (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libfontenc (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libfs (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libglu (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libice (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libpciaccess (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libsm (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libx11 (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxau (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxaw (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxcomposite (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxcursor (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxdamage (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxdmcp (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxext (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxfixes (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxfont (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxi (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxinerama (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxkbcommon (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxkbfile (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxmu (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxp (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxpm (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxrandr (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxrender (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxres (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxss (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxt (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxtst (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxv (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxvmc (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxxf86dga (7B27A3F1A6E18CD9588B4AE8310180050905E40C), libxxf86vm (7B27A3F1A6E18CD9588B4AE8310180050905E40C), mesa (7B27A3F1A6E18CD9588B4AE8310180050905E40C), mesa-demos (7B27A3F1A6E18CD9588B4AE8310180050905E40C), pixman (7B27A3F1A6E18CD9588B4AE8310180050905E40C), wayland (7B27A3F1A6E18CD9588B4AE8310180050905E40C), weston (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11-xserver-utils (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-bigreqs (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-composite (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-core (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-damage (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-dmx (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-dri2 (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-fixes (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-fonts (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-gl (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-input (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-kb (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-print (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-randr (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-record (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-render (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-resource (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-scrnsaver (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-video (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-xcmisc (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-xext (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-xf86bigfont (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-xf86dga (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-xf86dri (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-xf86vidmode (7B27A3F1A6E18CD9588B4AE8310180050905E40C), x11proto-xinerama (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xft (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xorg (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xorg-server (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-acecad (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-aiptek (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-elographics (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-evdev (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-joystick (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-keyboard (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-mouse (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-mutouch (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-synaptics (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-vmmouse (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-input-void (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-ati (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-cirrus (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-dummy (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-fbdev (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-intel (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-mach64 (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-mga (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-modesetting (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-neomagic (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-nouveau (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-openchrome (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-qxl (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-r128 (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-s3 (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-savage (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-siliconmotion (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-sis (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-sisusb (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-tdfx (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-trident (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-vesa (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xserver-xorg-video-vmware (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xtrans (7B27A3F1A6E18CD9588B4AE8310180050905E40C) Fingerprint: C98D9133762ACACB50A0E8B13A8336743AF72612 Uid: Maia Kozheva Allow: smplayer (04160004A8276E40BB9890FBE8A48AE5311D765A), smplayer-themes (04160004A8276E40BB9890FBE8A48AE5311D765A) Fingerprint: 861486250177633EE01392AD26CAA901117A251E Uid: Marcin Juszkiewicz Allow: vboot-utils (6A41FE6D5D7B2911D0E47FE80CE33C910F9CB28F) Fingerprint: 549D24B3A7CD941FAEE117F162955F6B9B1F5883 Uid: Markus Frosch Allow: icinga-web (CC992DDDD39E75B0B0AAB25CD35BBC99BC7D020A), nagvis (6E3966C1E1D15DB973D05B491E45F8CA9DE23B16) Fingerprint: ACF3D088EF32EDEF6A1A835FD9AD14B9513B51E4 Uid: Markus Koschany Allow: angrydd (62FF8A7584E029569546000674263B37F5B5F913), berusky2 (62FF8A7584E029569546000674263B37F5B5F913), berusky2-data (62FF8A7584E029569546000674263B37F5B5F913), box2d (D53A815A3CB7659AF882E3958EEDCC1BAA1F32FF), bullet (62FF8A7584E029569546000674263B37F5B5F913), byzanz (62FF8A7584E029569546000674263B37F5B5F913), easymock (E50AFD55ADD27AAB97163A8B21D20589974B3E96), foobillardplus (62FF8A7584E029569546000674263B37F5B5F913), freeorion (62FF8A7584E029569546000674263B37F5B5F913), gamazons (55043B43EFEB282F587CF5816598789058A23DE9), gtkatlantic (62FF8A7584E029569546000674263B37F5B5F913), iftop (50BC7CF939D20C272A6B065652B6BBD953968D1B), libgetopt-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libjide-oss-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), lincity-ng (62FF8A7584E029569546000674263B37F5B5F913), marsshooter (62FF8A7584E029569546000674263B37F5B5F913), mediathekview (FBDF66F84CAC5E588EC477E49FCF2CCD3F3E6426), mockito (E50AFD55ADD27AAB97163A8B21D20589974B3E96), opencity (D53A815A3CB7659AF882E3958EEDCC1BAA1F32FF), osmo (62FF8A7584E029569546000674263B37F5B5F913), performous (D53A815A3CB7659AF882E3958EEDCC1BAA1F32FF), pyblosxom (62FF8A7584E029569546000674263B37F5B5F913), xarchiver (62FF8A7584E029569546000674263B37F5B5F913) Fingerprint: ED6762360784E331E25303D6025AFE95AC9DF31B Uid: Markus Wanner Allow: asio (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), flightgear (9A57344C54D3C8610A5F22FCBAA569D0CBF12A6A), flightgear-data (9A57344C54D3C8610A5F22FCBAA569D0CBF12A6A), monotone (23499FA0AE0DE2BA9E18560DC7D930259DFFAAD4), postgis (FED969C79E6721F57D9552706864730DF095E5E4), simgear (9A57344C54D3C8610A5F22FCBAA569D0CBF12A6A) Fingerprint: AC297E5C46B9D0B61C717681D6D09BE48405BBF6 Uid: Mathias Behrle Allow: hgnested (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), openoffice-python (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), python-sql (6D2EB3CAF6BCD06EEF42247F60305B31C09FD35A), pywebdav (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), relatorio (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), suds (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-client (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-meta (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-account (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-account-be (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-account-de-skr03 (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-account-invoice (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-account-invoice-history (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-account-invoice-line-standalone (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-account-product (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-account-statement (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-analytic-account (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-analytic-invoice (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-analytic-purchase (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-analytic-sale (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-calendar (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-calendar-classification (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-calendar-scheduling (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-calendar-todo (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-company (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-company-work-time (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-country (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-currency (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-dashboard (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-google-maps (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-ldap-authentication (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-ldap-connection (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-party (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-party-siret (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-party-vcarddav (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-product (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-product-cost-fifo (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-product-cost-history (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-product-price-list (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-project (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-project-plan (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-project-revenue (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-purchase (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-purchase-invoice-line-standalone (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-sale (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-sale-opportunity (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-sale-price-list (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-stock (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-stock-forecast (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-stock-inventory-location (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-stock-location-sequence (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-stock-lot (6D2EB3CAF6BCD06EEF42247F60305B31C09FD35A), tryton-modules-stock-product-location (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-stock-supply (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-stock-supply-day (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-modules-timesheet (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-neso (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-proteus (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), tryton-server (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), vatnumber (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E) Fingerprint: 20BB3CCECFE50A6139A57E9A1BB375334D750376 Uid: Mats Erik Andersson Allow: netsed (7C0717F9FA2B2B9D788B141BA6DC24D9DA2493D1) Fingerprint: 95FAA648DE7D0AECC8DDCB984E9018E0A329126B Uid: Matteo Cypriani Allow: astyle (00C3E184E8AF12711856DFD280D0A42FF2C850CA), pyfeed (5F35F67BAFA8B6D581CA08EBD003852FBD52529E), salutatoi (5F35F67BAFA8B6D581CA08EBD003852FBD52529E), urwid-satext (5F35F67BAFA8B6D581CA08EBD003852FBD52529E), xmlelements (5F35F67BAFA8B6D581CA08EBD003852FBD52529E) Fingerprint: 4E8E810A6B445FDE68DAD0258062398983B2CF7A Uid: Matteo F. Vescovi Allow: babl (73ED4244FD43588620AC2644258494BA917A225E), blender (04160004A8276E40BB9890FBE8A48AE5311D765A), entangle (6D2EB3CAF6BCD06EEF42247F60305B31C09FD35A), gegl (73ED4244FD43588620AC2644258494BA917A225E), glew (04160004A8276E40BB9890FBE8A48AE5311D765A), gtkpod (04160004A8276E40BB9890FBE8A48AE5311D765A), libebml (04160004A8276E40BB9890FBE8A48AE5311D765A), libmatroska (04160004A8276E40BB9890FBE8A48AE5311D765A), mp4v2 (04160004A8276E40BB9890FBE8A48AE5311D765A), opencolorio (04160004A8276E40BB9890FBE8A48AE5311D765A), openimageio (2BABC6254E66E7B8450AC3E1E6AA90171392B174), totalopenstation (04160004A8276E40BB9890FBE8A48AE5311D765A), yafaray (04160004A8276E40BB9890FBE8A48AE5311D765A), yafaray-exporter (04160004A8276E40BB9890FBE8A48AE5311D765A) Fingerprint: 7F6A9F44282018E218DE24AACF49D0E68A2FAFBC Uid: Matthijs Kooijman Allow: catcodec (73ED4244FD43588620AC2644258494BA917A225E), grfcodec (73ED4244FD43588620AC2644258494BA917A225E), nforenum (73ED4244FD43588620AC2644258494BA917A225E), nml (73ED4244FD43588620AC2644258494BA917A225E), openttd (73ED4244FD43588620AC2644258494BA917A225E), openttd-opengfx (73ED4244FD43588620AC2644258494BA917A225E), openttd-openmsx (73ED4244FD43588620AC2644258494BA917A225E), openttd-opensfx (73ED4244FD43588620AC2644258494BA917A225E) Fingerprint: D8812F4065320B8DCA3CEF18694CADEF51C7B5B6 Uid: Michael Fladischer Allow: cairosvg (A9592C521CB904077D6598009D0B5E5B1EEC8F0E), django-countries (CDB5A1243ACDB63009AD07212D4EB3A6015475F5), django-floppyforms (A9592C521CB904077D6598009D0B5E5B1EEC8F0E), django-markupfield (CDB5A1243ACDB63009AD07212D4EB3A6015475F5), django-nose (CDB5A1243ACDB63009AD07212D4EB3A6015475F5), django-picklefield (CDB5A1243ACDB63009AD07212D4EB3A6015475F5), django-reversion (F78CBA07817BB149A11D339069F2FC516EA71993), sorl-thumbnail (A9592C521CB904077D6598009D0B5E5B1EEC8F0E) Fingerprint: DD66EBB6F93FAA322F0CB74E49F47A3A48F81543 Uid: Michael Ziegler Allow: mumble-django (8A306ED1C122B4D524D05137A780421C68021CE4), python-django-extdirect (DDC53E5130FD08223F98945649086AD3EBE2F31F), python-django-piston (DDC53E5130FD08223F98945649086AD3EBE2F31F), python-django-rosetta (DDC53E5130FD08223F98945649086AD3EBE2F31F) Fingerprint: D003326F93F33345EF9ADC4BD61360421C9B1AE5 Uid: Michele Cane Allow: lyz (C331BA3F75FB723B5873785B06EAA066E397832F), zotero-standalone-build (C331BA3F75FB723B5873785B06EAA066E397832F) Fingerprint: 4CB7FE1E280ECC90F29A597E6E608B637D8967E9 Uid: Miguel Landaeta Allow: codenarc (E50AFD55ADD27AAB97163A8B21D20589974B3E96), eclipselink (E50AFD55ADD27AAB97163A8B21D20589974B3E96), euca2ools (E50AFD55ADD27AAB97163A8B21D20589974B3E96), gant (E50AFD55ADD27AAB97163A8B21D20589974B3E96), gmetrics (E50AFD55ADD27AAB97163A8B21D20589974B3E96), groovy (E50AFD55ADD27AAB97163A8B21D20589974B3E96), hawtjni (E50AFD55ADD27AAB97163A8B21D20589974B3E96), jansi (E50AFD55ADD27AAB97163A8B21D20589974B3E96), jansi-native (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libhibernate-jbosscache-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libhibernate3-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libjsr166y-java (B3131A451DBFDF7CA05B4197054BBB9F7D806442), libjsr305-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libspring-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libspring-security-2.0-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libspring-webflow-2.0-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), libswarmcache-java (E50AFD55ADD27AAB97163A8B21D20589974B3E96), openjpa (E50AFD55ADD27AAB97163A8B21D20589974B3E96), pyzmq (E50AFD55ADD27AAB97163A8B21D20589974B3E96), svnkit (E50AFD55ADD27AAB97163A8B21D20589974B3E96), tomcat7 (E50AFD55ADD27AAB97163A8B21D20589974B3E96), xpra (E50AFD55ADD27AAB97163A8B21D20589974B3E96) Fingerprint: 930750035A15E27C3830740728FA801A43BDD637 Uid: Mike Miller Allow: cdargs (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D), deltarpm (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D), network-manager-openconnect (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D), openconnect (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D), rlwrap (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D), vpnc-scripts (424E14D703E7C6D43D9D6F364E7160ED4AC8EE1D) Fingerprint: F532DA10E563EE84440977A19D0470BDA6CDC457 Uid: Neutron Soutmun Allow: flvmeta (32CC490E5A70B23DD6AA5AB2A2EBAED1B6F90241), ipset (3BE9A67148F348F23E1E2076C72B51EE9D80F36D), xiterm+thai (32CC490E5A70B23DD6AA5AB2A2EBAED1B6F90241) Fingerprint: A9272E9AB03BF2D1DC4C99D4C4DCB25AD71A5972 Uid: Nicolas Bourdaud Allow: cinnamon (A7ADD22D796EA275C7C9D1033036AD8EA51A4FDD), muffin (A7ADD22D796EA275C7C9D1033036AD8EA51A4FDD) Fingerprint: BAFC6C85F7CB143FEEB6FB157115AFD07710DCF7 Uid: Ole Streicher Allow: cpl (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), cpl-plugin-amber (BCADFB52B41998D74D99D98E93945348E0DC2840), cpl-plugin-fors (BCADFB52B41998D74D99D98E93945348E0DC2840), cpl-plugin-giraf (BCADFB52B41998D74D99D98E93945348E0DC2840), cpl-plugin-hawki (BCADFB52B41998D74D99D98E93945348E0DC2840), cpl-plugin-kmos (BCADFB52B41998D74D99D98E93945348E0DC2840), cpl-plugin-sinfo (BCADFB52B41998D74D99D98E93945348E0DC2840), cpl-plugin-uves (BCADFB52B41998D74D99D98E93945348E0DC2840), cpl-plugin-xsh (BCADFB52B41998D74D99D98E93945348E0DC2840), esorex (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), fitsverify (BCADFB52B41998D74D99D98E93945348E0DC2840), ftools-fv (2CA20F848E5C29E3E410438221C747D36A461052), funtools (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), iausofa-c (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), python-astropy (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), python-cpl (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), python-pyds9 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), python-pywcs (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), saods9 (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), sextractor (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), skycat (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), starlink-ast (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), starlink-pal (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), tcl-fitstcl (2CA20F848E5C29E3E410438221C747D36A461052), tcl-signal (2CA20F848E5C29E3E410438221C747D36A461052), tk-html3 (2CA20F848E5C29E3E410438221C747D36A461052), tk-table (2CA20F848E5C29E3E410438221C747D36A461052), wcslib (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), wcstools (DEE63CAACE54B9B27DDCD34A88E5D733DD899610), xpa (2CA20F848E5C29E3E410438221C747D36A461052) Fingerprint: 2EE7A7A517FC124CF115C354651EEFB02527DF13 Uid: Peter Pentchev Allow: bomstrip (AEA0C44ECB056E93630D9D33DBBE9D4D99D2A004), cookietool (80E976F14A508A48E9CA3FE9BC372252CA1CF964), donkey (E90F0889545E78C82A9DE74EAF2283AA76E2AC7B), freealut (80E976F14A508A48E9CA3FE9BC372252CA1CF964), gtkcookie (D1E1316E93A760A8104D85FABB3A68018649AA06), mbuffer (E90F0889545E78C82A9DE74EAF2283AA76E2AC7B), mdk (D1E1316E93A760A8104D85FABB3A68018649AA06), prips (E50AFD55ADD27AAB97163A8B21D20589974B3E96), qliss3d (E90F0889545E78C82A9DE74EAF2283AA76E2AC7B), tina (E90F0889545E78C82A9DE74EAF2283AA76E2AC7B) Fingerprint: 1B49F933916A37A3F45A1812015F4DD4A70FB705 Uid: Phillip Susi Allow: gparted (C6045C813887B77C2DFF97A57C56ACFE947897D8) Fingerprint: 0CA75D987B8ECF6EA9443AD839091E8123CE1C09 Uid: Prach Pongpanich Allow: doodle (32CC490E5A70B23DD6AA5AB2A2EBAED1B6F90241), php-cache-lite (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), php-calendar (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), php-html-template-it (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), php-http (E0D3FAAA6F50A5DA9D5B293833961588E1C21845), php-mdb2-driver-mysql (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), php-mdb2-driver-pgsql (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), php-net-dime (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), php-net-ldap (E0D3FAAA6F50A5DA9D5B293833961588E1C21845), php-net-sieve (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), php-net-socket (E0D3FAAA6F50A5DA9D5B293833961588E1C21845), php-net-url (E0D3FAAA6F50A5DA9D5B293833961588E1C21845), php-services-weather (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), php-soap (E4F0EDDF374F2C50D4735EC097833DC998EF9A49), ruby-bson (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-bson-ext (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-mongo (30414D81DC28290C25686DE3DA4958F611E149E9) Fingerprint: A5F9C48C4059B6886CC57A426F7818A9B98F62B1 Uid: Ralph Amissah Allow: diakonos (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), rant (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), sisu (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E), sisu-markup-samples (709F54E4ECF3195623326AE3F82E5CC04B2B2B9E) Fingerprint: B51A517CB49EFC4F07E0E79CA49E7C3CDE3CCE66 Uid: Reto Buerki Allow: ahven (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), apq (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), apq-postgresql (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), dbusada (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), libalog (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), pcscada (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06) Fingerprint: 24093F016FFE8602EF449BB84C8EF3DA3FD37230 Uid: Reuben Thomas Allow: libpaper (655426C9FA10C1D1D3D199C221672570174FEE35), plptools (655426C9FA10C1D1D3D199C221672570174FEE35), psutils (655426C9FA10C1D1D3D199C221672570174FEE35) Fingerprint: AE927C799353DB4609B273BC085A9B327C2CAEB8 Uid: Rogério Theodoro de Brito Allow: avr-evtd (C42623B760FA5999693F0782690D6214A504FECA), cdparanoia (C42623B760FA5999693F0782690D6214A504FECA), dvd+rw-tools (C42623B760FA5999693F0782690D6214A504FECA), dvdisaster (C42623B760FA5999693F0782690D6214A504FECA), fontforge (C42623B760FA5999693F0782690D6214A504FECA), fontforge-doc (C42623B760FA5999693F0782690D6214A504FECA), fonts-anonymous-pro (C42623B760FA5999693F0782690D6214A504FECA), fonts-linuxlibertine (C42623B760FA5999693F0782690D6214A504FECA), handbrake (C42623B760FA5999693F0782690D6214A504FECA), libtorrent (C42623B760FA5999693F0782690D6214A504FECA), parallel (C42623B760FA5999693F0782690D6214A504FECA), rtorrent (C42623B760FA5999693F0782690D6214A504FECA), tunesviewer (C42623B760FA5999693F0782690D6214A504FECA), usbmount (C42623B760FA5999693F0782690D6214A504FECA), vrms (C42623B760FA5999693F0782690D6214A504FECA), youtube-dl (C42623B760FA5999693F0782690D6214A504FECA) Fingerprint: 0386CF054A81948D6D9FA7EA94842BC86E511C31 Uid: Rolf Leggewie Allow: bugz (3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB), ffgtk (E50AFD55ADD27AAB97163A8B21D20589974B3E96), fslint (3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB), gbirthday (3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB), gjots2 (E50AFD55ADD27AAB97163A8B21D20589974B3E96), isdnutils (3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB), kasumi (3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB), n2n (E50AFD55ADD27AAB97163A8B21D20589974B3E96), pastebinit (3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB), polipo (E50AFD55ADD27AAB97163A8B21D20589974B3E96), scim (3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB), scim-anthy (3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB) Fingerprint: 42E2C8DE8C173AB102F52C6E7E60A3A686AE8D98 Uid: Ryan Finnie Allow: 2ping (8A46ADB3FC4B4B24DF1728BACCDFE49B0A0AC927), digitemp (8A46ADB3FC4B4B24DF1728BACCDFE49B0A0AC927), grepcidr (8A46ADB3FC4B4B24DF1728BACCDFE49B0A0AC927), isomd5sum (8A46ADB3FC4B4B24DF1728BACCDFE49B0A0AC927), robotfindskitten (8A46ADB3FC4B4B24DF1728BACCDFE49B0A0AC927) Fingerprint: 3412EA181277354B991BC869B2197FDB5EA01078 Uid: Sam Morris Allow: pymsnt (6ADD5093AC6D1072C9129000B1CCD97290267086), sensors-applet (22D52C906D6677F159F10030001CDE6A6B79D401) Fingerprint: 0EED77DC41D760FDE44035FF5556A34E04A3610B Uid: Sascha Steinbiss Allow: aragorn (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), genometools (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), ltrsift (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), mussort (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1) Fingerprint: 218F6A654090B4086FD42E9AA35A4E6EF00175CA Uid: Sebastien NOEL Allow: cksfv (7E0ED3D2B34A03B15F9F3121C7F7F9660D82A682), oss4 (7E0ED3D2B34A03B15F9F3121C7F7F9660D82A682) Fingerprint: DB667AE2E7C792EF6374EFDF39C9A0B640262AF0 Uid: Sergey B Kirpichev Allow: festvox-ru (1B23D4F88EC0D9020555E438AB8C00CFF8E26537), libapache2-mod-bw (1B23D4F88EC0D9020555E438AB8C00CFF8E26537), libapache2-mod-qos (3E4FB7117877F589DBCF06D6E619045DF2AC729A), libapache2-mod-rpaf (7C0717F9FA2B2B9D788B141BA6DC24D9DA2493D1), monit (63CB1DF1EF12CF2AC0EE5A329C27B31342B7511D), parser (1B23D4F88EC0D9020555E438AB8C00CFF8E26537), parser-mysql (1B23D4F88EC0D9020555E438AB8C00CFF8E26537), php-geoip (1B23D4F88EC0D9020555E438AB8C00CFF8E26537), php-memcache (C644D0B392F48FE44662B5411558944599E81DA0), php-memcached (C644D0B392F48FE44662B5411558944599E81DA0) Fingerprint: 19FBC4D3DAE94406B13A9DDE19755664855E7273 Uid: Simon Chopin Allow: alot (8F049AD82C92066C7352D28A7B585B30807C2A87), pytest (F78CBA07817BB149A11D339069F2FC516EA71993) Fingerprint: 0424D4EE81A0E3D119C6F835EDA21E94B565716F Uid: Simon Josefsson Allow: gss (E784364E8DDE7BB370FBD9EAD15D313882004173), libidn (C6045C813887B77C2DFF97A57C56ACFE947897D8), libidn2-0 (C6045C813887B77C2DFF97A57C56ACFE947897D8), libntlm (DF813B226DD39A2C530F6F7D0ABA650372FD9571), oath-toolkit (A28411A596193171331802C0B65A4871CA19D717), python-pyhsm (A28411A596193171331802C0B65A4871CA19D717), python-yubico (A28411A596193171331802C0B65A4871CA19D717), shishi (E784364E8DDE7BB370FBD9EAD15D313882004173), ykclient (A28411A596193171331802C0B65A4871CA19D717), yubico-pam (A28411A596193171331802C0B65A4871CA19D717), yubikey-ksm (0EE5BE979282D80B9F7540F1CCD2ED94D21739E9), yubikey-personalization (A28411A596193171331802C0B65A4871CA19D717), yubikey-personalization-gui (A28411A596193171331802C0B65A4871CA19D717), yubikey-val (0EE5BE979282D80B9F7540F1CCD2ED94D21739E9) Fingerprint: 50713992E9A91E77240128915675ADD39CF02226 Uid: Simone Rossetto Allow: qsapecng (FED969C79E6721F57D9552706864730DF095E5E4) Fingerprint: 4C004DF209F263ABFD8638C795DE059D8D7FCA91 Uid: Stefan Potyra Allow: faucc (1B954398F362AD2DC5E6718BBAB12CF0C7C58F7C), fauhdlc (1B954398F362AD2DC5E6718BBAB12CF0C7C58F7C), faumachine (1B954398F362AD2DC5E6718BBAB12CF0C7C58F7C), invaders (1B954398F362AD2DC5E6718BBAB12CF0C7C58F7C), min12xxw (1B954398F362AD2DC5E6718BBAB12CF0C7C58F7C), trigger-rally (1B954398F362AD2DC5E6718BBAB12CF0C7C58F7C), trigger-rally-data (1B954398F362AD2DC5E6718BBAB12CF0C7C58F7C) Fingerprint: 3C0B6EB0AB2729E8CE2255A7385AE490868EFA66 Uid: Stefan Völkel Allow: dtach (CC992DDDD39E75B0B0AAB25CD35BBC99BC7D020A), revelation (CC992DDDD39E75B0B0AAB25CD35BBC99BC7D020A) Fingerprint: 522D7163831C73A635D12FE5EC371482956781AF Uid: Sven Eckelmann Allow: batctl (B8BF54137B09D35CF026FE9D091AB856069AAA1C), batmand (B8BF54137B09D35CF026FE9D091AB856069AAA1C), exactimage (693367FFAECD8EAACD1F063B0171E1828AE09345), g3dviewer (B8BF54137B09D35CF026FE9D091AB856069AAA1C), libg3d (B8BF54137B09D35CF026FE9D091AB856069AAA1C), mupen64plus (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-audio-sdl (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-core (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-input-sdl (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-rsp-hle (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-rsp-z64 (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-ui-console (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-video-arachnoid (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-video-glide64 (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-video-rice (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), mupen64plus-video-z64 (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), s3d (B8BF54137B09D35CF026FE9D091AB856069AAA1C) Fingerprint: 285F2178A82FE496A2E69E103B106E718D6B31AC Uid: Sven Joachim Allow: autoconf-dickey (5D2FB320B825D93904D205193938F96BDF50FEA5), ncurses (5D2FB320B825D93904D205193938F96BDF50FEA5), xserver-xorg-video-nouveau (7B27A3F1A6E18CD9588B4AE8310180050905E40C), xterm (7B27A3F1A6E18CD9588B4AE8310180050905E40C) Fingerprint: 1C17166DC55780466188885142EE72DAC27319AD Uid: Thomas Bechtold Allow: check (2B12EC0512C01AE25D559F3F4BA00E72145B6966), d-feet (09B3AC2ECB169C904345CC546AE1DF0D608F22DC) Fingerprint: 0D86778C9DDFC4600BBBDB1710A46FFB90D53618 Uid: Thomas Friedrichsmeier Allow: rkward (73471499CC60ED9EEE805946C5BD6C8F2295D502) Fingerprint: 76040205597FA696F1313BCA07FC4891042BA65A Uid: Thomas Koch Allow: maven-debian-helper (E50AFD55ADD27AAB97163A8B21D20589974B3E96), maven-repo-helper (E50AFD55ADD27AAB97163A8B21D20589974B3E96) Fingerprint: F69AFC03593F5D866B748D908BDEAA5952784983 Uid: Thomas Krennwallner Allow: clasp (467348C85F3A5A9B2B0D169EBF1E9D1F76D52AC4), coala (467348C85F3A5A9B2B0D169EBF1E9D1F76D52AC4), depqbf (467348C85F3A5A9B2B0D169EBF1E9D1F76D52AC4), gringo (467348C85F3A5A9B2B0D169EBF1E9D1F76D52AC4), runlim (467348C85F3A5A9B2B0D169EBF1E9D1F76D52AC4) Fingerprint: 92429807C9853C0744A68B9AAE07828059A53CC1 Uid: Thomas Leonard Allow: zeroinstall-injector (3BE9A67148F348F23E1E2076C72B51EE9D80F36D) Fingerprint: E4D7FFE905DC76C272F331D5381D2AC78124B100 Uid: Thomas Müller Allow: owncloud (B73B7544AA9E528E838E88F9241061CA50064181), php-sabredav (B73B7544AA9E528E838E88F9241061CA50064181), quassel (09B3AC2ECB169C904345CC546AE1DF0D608F22DC) Fingerprint: D5EA745C0B1FA932EB5CF7DA771750766E1C720B Uid: Thomas Pierson Allow: clementine (12DDFA84AC23B2BBF04B313CAB645F406286A7D0), libqxt (ECF2DEA89EB90C612440B2B84814DEC22B307C3C) Fingerprint: 752DE27C4DEB17019B4B6623CB703165A88984DC Uid: Timo Aaltonen Allow: ding-libs (7E0ED3D2B34A03B15F9F3121C7F7F9660D82A682), libwacom (90750D0B5211C8962AD67137853575EC4A08B2FE), sssd (7E0ED3D2B34A03B15F9F3121C7F7F9660D82A682) Fingerprint: 8CCC1BA8590FF029D17C708FC1BCD3C72AA28B6B Uid: Tobias Stefan Richter Allow: nexus (B66CD97ACE820575D38E8B7B79B0126693701EEF) Fingerprint: 9E932D1E0B31CF850AFC799E6F3E6153163E0577 Uid: Tom Jampen Allow: rt-authen-externalauth (A4AD7A700EE5F70F31B16FA32127371B9BB23062), texstudio (A4AD7A700EE5F70F31B16FA32127371B9BB23062) Fingerprint: 9E81ED79FA81D45C0F830E139FB9262724B17D29 Uid: Tomasz Buchert Allow: miredo (BBBD45EA818AB86FF67E7285D3E17383CFA7FF06), stellarium (8C470B2A0B31568E110D432516281F2E007C98D1), verbiste (8C470B2A0B31568E110D432516281F2E007C98D1) Fingerprint: A481824E7DD39C0EC40A488EC654FB332AD59860 Uid: Tomasz Rybak Allow: pycuda (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), pyopencl (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), pytools (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645) Fingerprint: CC7A536FE267C679439BE8C429572B2F500BF4A2 Uid: Tshepang Lekhonkhobe Allow: wajig (344C9EC6707AFA176FE260B1099491F791B0D3B7) Fingerprint: 0D2511F322BFAB1C1580266BE2DCDD9132669BD6 Uid: Uwe Kleine-König Allow: rt-tests (EE01B7C2126C2847EADFC720C24B65A2672C8B12) Fingerprint: C517C25DE408759D98A4C96B6C8F74AE87700B7E Uid: Vasudev Kamath Allow: aspell-kn (190A8C7607743E3130603836A1183F8ED1028C8D), ctpp2 (9FE3E9C36691A69FF53CC6842C7C3146C1A00121), dwm (190A8C7607743E3130603836A1183F8ED1028C8D), editorconfig-core (9FE3E9C36691A69FF53CC6842C7C3146C1A00121), fonts-beng (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-beng-extra (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-deva (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-deva-extra (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-eeyek (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-font-awesome (9BFBAEE86C0AA5FFBF2207829AF46B3025771B31), fonts-gubbi (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-gujr (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-gujr-extra (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-guru (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-guru-extra (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-indic (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-johnsmith-induni (D5C2F9BFCA128BBA22A77218872F702C4D6E25A8), fonts-knda (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-knda-extra (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lato (D5C2F9BFCA128BBA22A77218872F702C4D6E25A8), fonts-lohit-beng-assamese (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-beng-bengali (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-deva (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-gujr (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-guru (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-knda (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-mlym (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-orya (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-taml (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-taml-classical (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-lohit-telu (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-mlym (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-nakula (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-navilu (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-orya (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-orya-extra (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-pagul (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-sahadeva (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-samyak (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-smc (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-taml (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-taml-tamu (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-taml-tscu (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-telu (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-telu-extra (190A8C7607743E3130603836A1183F8ED1028C8D), fonts-teluguvijayam (190A8C7607743E3130603836A1183F8ED1028C8D), pugixml (9FE3E9C36691A69FF53CC6842C7C3146C1A00121), pypdflib (190A8C7607743E3130603836A1183F8ED1028C8D), ttf-indic-fonts (190A8C7607743E3130603836A1183F8ED1028C8D), zimlib (9FE3E9C36691A69FF53CC6842C7C3146C1A00121) Fingerprint: D53A815A3CB7659AF882E3958EEDCC1BAA1F32FF Uid: Vincent Cheng Allow: 0ad (314E3B2D605A6EB35A7D8119F628EB934743206C), 0ad-data (314E3B2D605A6EB35A7D8119F628EB934743206C), ardentryst (7A33ECAA188B96F27C917288B3464F896AA15948), bumblebee (693367FFAECD8EAACD1F063B0171E1828AE09345), cherrytree (3A9E7D149697510A3E37CD95C38E8160A17841FE), conky (A6C7B88B9583046A11C5403E0B00FB6CEBE2D002), conky-all (A6C7B88B9583046A11C5403E0B00FB6CEBE2D002), dbus-c++ (7A33ECAA188B96F27C917288B3464F896AA15948), exaile (7A33ECAA188B96F27C917288B3464F896AA15948), gnote (7A33ECAA188B96F27C917288B3464F896AA15948), irrlicht (9FED5C6CE206B70A585770CA965522B9D49AE731), mailnag (3A9E7D149697510A3E37CD95C38E8160A17841FE), mangler (7CE3D0F2EE36C94FAEF6139C721A2B30C154998C), primus (693367FFAECD8EAACD1F063B0171E1828AE09345), pygame (F58548B594504CC6AD853EC3F41FED8E33FC40A4), supertuxkart (9FED5C6CE206B70A585770CA965522B9D49AE731), wesnoth-1.10 (5393ACF308011A978845026331FCE7E7DD079461), wesnoth-1.11 (5393ACF308011A978845026331FCE7E7DD079461) Fingerprint: 081CB7CDFF042BA994EA36B28B7F7D30CAF14EFC Uid: Wolodja Wentland Allow: leiningen (8F049AD82C92066C7352D28A7B585B30807C2A87), robert-hooke (8F049AD82C92066C7352D28A7B585B30807C2A87) Fingerprint: 11F4DE9F1FAF6581F2BA3496548662D00E41645E Uid: Xavier Grave Allow: liblog4ada (23499FA0AE0DE2BA9E18560DC7D930259DFFAAD4), libxmlezout (23499FA0AE0DE2BA9E18560DC7D930259DFFAAD4), music123 (23499FA0AE0DE2BA9E18560DC7D930259DFFAAD4), polyorb (23499FA0AE0DE2BA9E18560DC7D930259DFFAAD4), python-gnatpython (23499FA0AE0DE2BA9E18560DC7D930259DFFAAD4) Fingerprint: B4F77FC8667E12B6587FE893DE39E437F2CC5398 Uid: Xiangfu Liu Allow: fped (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1), xburst-tools (84C1977A89E7EFED3E5CA62E2FD8BEDAC020EED1) Fingerprint: B86CB5487CC4B58F0CA3856E7EE852DEE6B78725 Uid: Yauheni Kaliuta Allow: dictem (A8DF13269E5D9A38E57CFAC29D20F6503E338888) Fingerprint: 66A4EA704FE240558D6AC2E69394F354891D7E07 Uid: Youhei SASAKI Allow: cairo-dock (5E629EE5232197357B84CF4332247FBB40AD1FA6), cairo-dock-plug-ins (5E629EE5232197357B84CF4332247FBB40AD1FA6), cmigemo (5E629EE5232197357B84CF4332247FBB40AD1FA6), coderay (0B29D88E42E6B765B8D8EA507839619DD439668E), howm (0B29D88E42E6B765B8D8EA507839619DD439668E), jekyll (30414D81DC28290C25686DE3DA4958F611E149E9), pry (0B29D88E42E6B765B8D8EA507839619DD439668E), rabbit (0B29D88E42E6B765B8D8EA507839619DD439668E), rail (0B29D88E42E6B765B8D8EA507839619DD439668E), rake-compiler (30414D81DC28290C25686DE3DA4958F611E149E9), rttool (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-albino (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-bacon (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-bluefeather (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-classifier (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-directory-watcher (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-eim-xml (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-fast-stemmer (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-fftw3 (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-grib (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-hdfeos5 (6D2EB3CAF6BCD06EEF42247F60305B31C09FD35A), ruby-hikidoc (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-kramdown (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-lapack (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-mathml (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-method-source (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-multibitnums (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-narray (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-narray-miss (6D2EB3CAF6BCD06EEF42247F60305B31C09FD35A), ruby-net-irc (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-netcdf (6D2EB3CAF6BCD06EEF42247F60305B31C09FD35A), ruby-ole (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-pgplot (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-posix-spawn (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-rack (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-rack-protection (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-rack-test (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-redcarpet (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-sdl (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-sinatra (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-slop (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-tilt (30414D81DC28290C25686DE3DA4958F611E149E9), ruby-unf-ext (30414D81DC28290C25686DE3DA4958F611E149E9) Fingerprint: 816790FE0A75677E2A6C22C814135D277B88D7E5 Uid: YunQiang Su Allow: brise (3A9E7D149697510A3E37CD95C38E8160A17841FE), chmsee (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-anthy (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-chewing (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-cloudpinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-configtool (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-fbterm (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-googlepinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-hangul (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-libpinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-m17n (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-qt5 (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-rime (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-sayura (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-sunpinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-table-extra (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-table-other (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-ui-light (3A9E7D149697510A3E37CD95C38E8160A17841FE), fcitx-unikey (3A9E7D149697510A3E37CD95C38E8160A17841FE), ibus-googlepinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), ibus-sunpinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), ibus-table (3A9E7D149697510A3E37CD95C38E8160A17841FE), kcm-fcitx (3A9E7D149697510A3E37CD95C38E8160A17841FE), libchewing (3A9E7D149697510A3E37CD95C38E8160A17841FE), libcitygml (3A9E7D149697510A3E37CD95C38E8160A17841FE), libgooglepinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), libpinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), libpyzy (3A9E7D149697510A3E37CD95C38E8160A17841FE), librime (3A9E7D149697510A3E37CD95C38E8160A17841FE), lunar-date (3A9E7D149697510A3E37CD95C38E8160A17841FE), nam (3A9E7D149697510A3E37CD95C38E8160A17841FE), ns2 (3A9E7D149697510A3E37CD95C38E8160A17841FE), ns3 (3A9E7D149697510A3E37CD95C38E8160A17841FE), open-gram (3A9E7D149697510A3E37CD95C38E8160A17841FE), opencc (3A9E7D149697510A3E37CD95C38E8160A17841FE), otcl (3A9E7D149697510A3E37CD95C38E8160A17841FE), savi (3A9E7D149697510A3E37CD95C38E8160A17841FE), sheepdog (3A9E7D149697510A3E37CD95C38E8160A17841FE), sunpinyin (3A9E7D149697510A3E37CD95C38E8160A17841FE), tclcl (3A9E7D149697510A3E37CD95C38E8160A17841FE) Fingerprint: 8206A19620847E6D0DF8B176BC196A94EDDDA1B7 Uid: أحمد المحمودي Allow: covered (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), dico (6ADD5093AC6D1072C9129000B1CCD97290267086), drawtiming (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), fonts-hosny-amiri (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), fribidi (C644D0B392F48FE44662B5411558944599E81DA0), geda-gaf (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), geda-xgsch2pcb (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), gnucap (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), gst123 (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), gtkwave (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), gwave (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), harfbuzz (90750D0B5211C8962AD67137853575EC4A08B2FE), hijra (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), islamic-menus (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), itools (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), iverilog (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), libitl (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), libitl-gobject (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), monajat (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), othman (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), pcb (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), pyfribidi (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), python-whoosh (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), sl-modem (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), thawab (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF), verilator (41352A3B4726ACC590940097F0A98A4C4CD6E3D2), xpra (1D2FA89858DAAF6217862DF7AEF6F1A2A7457645), zekr (BD838A2BAAF9E3408BD9646833BE1A0A8C2ED8FF) work/tests/gnupg/pubring.gpg0000644000000000000000000000703014761250142013357 0ustar  R# 5.Z^Q}Hd!:OE vw}*a!~\ |f8"R   9=6"$_uUރ)GZo={S+4 =ٹvX&rRl>|PAEXi_3XߐYg?lGdxyGw[ig_0@,$24JF֭yp#$qjQDLUQ/bPe$IP3ԐIO Nb*@AFa4g%ҬlnP-G.QP}+iIá*lˍ%G RyA-b([=JgwwЬvŹl=fУ#d("g1>|zc C!Wd~s3zi@W g N7E,+C#`M4CFaI%.ٍY/FswLg+Zuj*ѤS^d'ñhNl3 VVF4z>4Mbēa R 9=%5=R܏f=۱_سI,- !sF%C8"RT   *u%)C|KW]^i֯#4Xgꪈݬ̍R<⢊.lnnx *Z:X*G=f:Cȑ ] U!l'1EMńzR)캑j\8d#H>%4 /E՝_9Zx==R/ yi RTQݩꤷA3|]cs[D $:d'/.6-R4j#hGA^4[<$+ĝbd|'u{B]VL36OsF޹lz%] iNqS5el}0^9;w;nEo:+<enY8t$GB,O{>ά:tWlom2%ذy*ݑGԯ7iӝ:` RT *u% Rw4nS6:Mv c\drtO.NI- [9pfZ6ܞEJn,Z$]j /eԨ`#RИ d:pm 4"ox!C,3nrMsȝduBK8.85_~k3f" /؆u8Cx¼sAD۪XʖH3u7yxXBDyTENl  R嚑!VtcYԳD iD`߸)_e;b塖L"HFo:EU+V-e3'z~M#T/oi*(9kJVհKaäp?M5_0c']q9p|%"7P#goRX2n8z|HޱnFLyǚSIu8Rގ 2uPӏixIz9*Hannibal (test key) 8"R嚑   h;9'`N>qz8OĔ]HvǷvAiGϏG۝q J@)SQܚF%tN[p{]_ɧ(삁 Ɵս?2N~ QfHt`PkF7>ɸNn  G-2L1 o3`;Osϒ,PiV(na`qnZ)I\N|[Rˆ? {(ÓߙŇ05^\aS R嚑kǰ]Ab;W<~\5m-O?j% ד,&;VԸ9`9qNiXƖ!2b}*,uzPNa,$lK9Av̶rLq'l$fDqXDbS=<PY A)tO4驪+8ba 8@ށ<8s#Tў:k~,$'ދ% R嚑 h;9zzWjN)N.*ΛX3<ÆL>%5gSְ~5?}K!Wx #KRg Lf }SFBimoY"] =_˺}8Wbq+_~ 4wzeaE@EE&4<9MԢ/؆n/nZP,$7Q rѳYz:iצۘGqsNY[e ,23{s9ͥ;/SR+work/tests/gnupg/random_seed0000644000000000000000000000113014761250142013410 0ustar 'v5ut?Uzlj@2ՃxқA!\ 6(aFYaten~rЖ@^Od 1[_=j@Q/\,d[#n=<.8*.0qDXg>/<v~h2k>`!-r1jH&O nhD2렻w '} /ڍmpɮgkHwӧ몇"CvL#`H<}BOў F~'Ј:2q@){0FVōԆ#`? uD?b ەQ>FҲ- FẀH XRvn Hv~O!B7 Ƌn~s %;jd6RQk pr͚(ɅH]lI2cErr^|NnB B/9~Qt ʪ;XBGʯ C9p=k,N~*g- Gc/++5mkFOlW"G!cdmJ'Kwork/tests/gnupg/secring.gpg0000644000000000000000000001653214761250142013352 0ustar R# 5.Z^Q}Hd!:OE vw}*a!~\ |f=95|UNxoFDJyQ5mV:¦Ձ·a*Z9}0&з'u%?:8c]SŽeaBa g滜8 s/g|Z}' HZT Nf/w0|#Քtg黂H^mSG@qEp"q+'(" 9´-Senatus Romanus (test key) 8"R   9=6"$_uUރ)GZo={S+4 =ٹvX&rRl>|PAEXi_3XߐYg?lGdxyGw[ig_0@,$24JF֭yp#$qjQDLUQ/bPe$IP3ԐIO Nb*@AFa4g%ҬlnP-G.QP}+iIá*lˍ%GRyA-b([=JgwwЬvŹl=fУ#d("g1>|zc C!Wd~s3zi@W g N7E,+C#`M4CFaI%.ٍY/FswLg+Zuj*ѤS^d'ñhNl3 VVF4z>4Mbēa9. 󖽆IIBƮ pt$(XZjGP:&Fwn{Q$SIe~0S5>qQ#GZ`ÁE'hJl!C_o>Ax^ₓ#Ņo(s|(?[00A{A3c'I&:) cԆZ111'=a[AeNΛߖLIa%3E¢_(xpcƆ 1@Tw80SÇjT rL#$ =Ab$/k&0vO[[)Mk} ; F0`xj;F2t9}{vA[9%DU7[)C7E+%QΤo[BMۀpx*JdeƦHA;'\$qc 54W)"zymx*y7Qh9: ^]b,u{?w3J0 R 9=%5=R܏f=۱_سI,- !sF%Ce%YT:t "T9&iĜ-OXΦ[2^7\-9lCy3 4PO7<-0 ,Populus Romanus (test key) 8"RT   *u%)C|KW]^i֯#4Xgꪈݬ̍R<⢊.lnnx *Z:X*G=f:Cȑ ] U!l'1EMńzR)캑j\8d#H>%4 /E՝_9Zx==R/ yiRTQݩꤷA3|]cs[D $:d'/.6-R4j#hGA^4[<$+ĝbd|'u{B]VL36OsF޹lz%] iNqS5el}0^9;w;nEo:+<enY8t$GB,O{>ά:tWlom2%ذy*ݑGԯ7iӝ:`ER},1c1"Ro#{pT N҄Cć]v9 3]2¸U&]΢g]2wH.0lQ26F>}b3=A}GIbN]bʩbSsv kj<Έ R yR,) Yz\3.3ދ+ uJf'#`m0-*B*¡Nļˋ#-&^ೣAde$WM`#OZe) m("(z洹%J"hVQocsNt>ao))°S/$^Hbh;`%=x1] =ڔݽɗ9vw"m0_놨t&p'i,QD~I=Qɱq&f:n6oA  }\#3ՇǞKT\g53{[ F#BQV ,:FzTm(+ט(S]jlh 0I{xl`K s cS_~jPSS?՞cgܴ'A}§?; /*C5މ RT *u% Rw4nS6:Mv c\drtO.NI- [9pfZ6ܞEJn,Z$]j /eԨ`#RИ d:pm 4"ox!C,3nrMsȝduBK8.85_~k3f" /؆u8Cx¼sAD۪XʖH3u7yxXBDyTENl R嚑!VtcYԳD iD`߸)_e;b塖L"HFo:EU+V-e3'z~M#T/oi*(9kJVհKaäp?M5_0c']q9p|%"7P#goRX2n8z|HޱnFLyǚSIu8Rގ 2uPӏixIz9 5:d|)!J4ʶ5\ f7$g l]}H]ý r<"3toۗ" ,k٢K ӻA5 Ӿ?jLp 2m.16? OOJA68v&|]KBf[nVS|LtHb |̌A85p}0qV/nRfa/sS$pRݚIwxRGm'HjD++I ϬWx$1Ґ{ ɮCh68IK"ŅI+lf1 :nX٤``} ఢ+8[ =x튙m_8x) 8z#'Ra{=Y ܑ<Dݸ-Cϙe )<Y^ފm= b =N'kG,[}hVǭ*/l^ҤhH+Hea}?o^y QGH|²9¯pQWx+}_IID:9 O dnNM)I1*A!ȡ&NfNW+3e[6aHGaVl$΋w*`RC j999*Hannibal (test key) 8"R嚑   h;9'`N>qz8OĔ]HvǷvAiGϏG۝q J@)SQܚF%tN[p{]_ɧ(삁 Ɵս?2N~ QfHt`PkF7>ɸNn  G-2L1 o3`;Osϒ,PiV(na`qnZ)I\N|[Rˆ? {(ÓߙŇ05^\aSR嚑kǰ]Ab;W<~\5m-O?j% ד,&;VԸ9`9qNiXƖ!2b}*,uzPNa,$lK9Av̶rLq'l$fDqXDbS=<PY A)tO4驪+8ba 8@ށ<8s#Tў:k~,$'ދ%%@Ew>\89o5|-((s:B5䥏^Z;nCƥ?DT A Ucvb9 P YN : f)WSFq Kn4Exl{/a$ ;]$ϲ'}CttIgJ@d/xEؕ&"LK}x+hMd91㲔5:\Oju>yFa ]o55W}=>kˆ,&ڦ FQ@qIT*! V=T'yc=l-;ģ'#Xtt?ŮaQ#0AʹaP,M^nAHT\jv-9 R嚑 h;9zzWjN)N.*ΛX3<ÆL>%5gSְ~5?}K!Wx #KRg Lf }SFBimoY"] =_˺}8Wbq+_~ 4wzeaE@EE&4<9MԢ/؆n/nZP,$7Q rѳYz:iצۘGqsNY[e ,23{s9ͥ;/SR+work/tests/gnupg/trustdb.gpg0000644000000000000000000000264014761250142013402 0ustar gpgR "  ,2C=>9= QF{b3 :72G*u%! vбs 7/`^\dBzf ;? \h;9# port-file tests/tmp/$thing/aq # # Will write the allocated port number to port-file. # Then we fork and the parent exits 0. # If port-file is unlinked, we exit. use strict; use IO::Handle; our ($webroot) = @ARGV; our $port = ''; # HTTP::Server::Simple handles requests in the main process so it # must redirect and close STDOUT. So transplant STDOUT to CHECK. open CHECK, ">& STDOUT" or die $!; open STDOUT, ">/dev/null" or die $!; sub stat_type_check () { die "[$port, $webroot] stdout not ta plain file" unless -f _; } stat CHECK or die $!; stat_type_check(); sub start_polling_fstat () { our $polling_pid = $$; $SIG{ALRM} = sub { return unless $$ = $polling_pid; stat CHECK or die $!; my $nlink = (stat _)[3]; exit 0 unless $nlink; stat_type_check(); # doesn't seem possible to fail but check anyway alarm(1); }; alarm(1); } package ServerClass; use strict; use Socket qw(AF_INET SOCK_STREAM); use Socket qw(AF_INET SOCK_STREAM unpack_sockaddr_in); use IO::Handle; use base qw(HTTP::Server::Simple::CGI); use HTTP::Server::Simple::Static; sub handle_request { my ($self, $cgi) = @_; if (!$self->serve_static($cgi, $::webroot)) { print "HTTP/1.0 404 Not found\r\n"; print $cgi->header, $cgi->start_html('Not found'), $cgi->h1('Not found'), $cgi->end_html; } } sub port () { return 0; } sub after_setup_listener () { my $sn = getsockname HTTP::Server::Simple::HTTPDaemon or die $!; ($main::port,) = unpack_sockaddr_in $sn; print main::CHECK $port, "\n" or die $!; flush main::CHECK or die $!; my $c = fork // die $!; exit 0 if $c; ::main::start_polling_fstat(); } package main; our $server = ServerClass->new(); $server->run(); work/tests/lib0000644000000000000000000006651114761250142010574 0ustar # exec 2>&1 set -x set -o pipefail . tests/lib-core . tests/lib-restricts t-report-failure () { set +x rc=$1 cat <&2 TEST FAILED cwd: $PWD funcs: ${FUNCNAME[*]} lines: ${BASH_LINENO[*]} files: ${BASH_SOURCE[*]} END t-save-artifacts exit 16 } trap ' rc=$? set +x test $rc = 0 || echo " %%%%%%%%%%%%%%%%%%%% EXITING $rc %%%%%%%%%%%%%%%%%%%% Most relevant logs are just before assignment rc=$rc Will now do cleanup etc. " set -x set +e pwd [ "x$DGIT_TEST_KEEP_MUSTCLEAN" != x ] || \ [ "x$DGIT_TEST_TMP" = x ] || rm -rf $DGIT_TEST_TMP/must-clean set -e test $rc = 0 || t-report-failure ' EXIT t-filter-out-git-hyphen-dir t-set-intree : ${DGIT_TEST_DEBUG=-D} export DGIT_TEST_DEBUG : ${DGIT_TEST_DEBPUSH_DEBUG=x} export DGIT_TEST_DEBPUSH_DEBUG : ${DGIT_TEST_DISTRO+ ${distro=${DGIT_TEST_DISTRO}}} export GIT_COMMITTER_DATE='1530000000 +0100' export GIT_AUTHOR_DATE='1530000000 +0100' export LC_CTYPE=C.UTF-8 unset CDPATH # We use git-filter-branch in various tests. # Nowadays it has a warning with associated sleep. export FILTER_BRANCH_SQUELCH_WARNING=1 root=`pwd` troot=$root/tests testname="${DGIT_TEST_TESTNAME-${0##*/}}" export DGIT_TEST_TROOT=$troot bpd=.. tmp=$ADTTMP if [ x"$tmp" = x ]; then export DGIT_TEST_BYHAND=1 mkdir -p tests/tmp tmpbase=$troot/tmp tmp=tests/tmp/$testname rm -rf $tmp mkdir $tmp elif [ "x$DGIT_TEST_TMPBASE" != x ]; then tmpbase="$DGIT_TEST_TMPBASE" fi cd $tmp tmp=`pwd` t-set-using-tmp test -f $tmp/.save-env || \ env -0 >$tmp/.save-env ln -sf $troot/ssh ssh export DEBCHANGE_VENDOR=dpkg unset VISUAL unset GIT_EDITOR mkdir -p $tmp/must-clean # must-clean is usually removed after each test, on success or failure. # But this must not be relied on for correctness, only for garbage # collection etc. mkdir -p $tmp/incoming cat <$tmp/dput.cf [test-dummy] method = local incoming = $tmp/incoming run_dinstall = 0 END schroot=${DGIT_SCHROOT_CHROOT:-build} # Pretty much any Debian sid snapshot schroot will do. : ${t_archive_method:=aq} : ${tagpfx:=archive/test-dummy} : ${suitespecs:=sid:unstable} t-git-next-date () { GIT_COMMITTER_DATE="$(( ${GIT_COMMITTER_DATE%% *} + 1 )) ${GIT_COMMITTER_DATE#* }" GIT_AUTHOR_DATE="$GIT_COMMITTER_DATE" } t-expect-fail () { local mpat="$1"; shift set +o pipefail LC_MESSAGES=${expect_fail_lcmessages-C} \ LANGUAGE=${expect_fail_lcmessages-C} \ "$@" 2>&1 | tee $tmp/t.output local ps="${PIPESTATUS[*]}" set -o pipefail case $ps in "0 0") fail "command unexpectedly succeeded (instead of: $mpat)" ;; *" 0") ;; *) fail "tee failed" ;; esac t-grep-mpat "$mpat" $tmp/t.output } t-grep-mpat () { local mpat="$1" local file="$2" local grepper=fgrep case "$mpat" in [A-Z]:*) case "$mpat" in E:*) grepper=egrep ;; F:*) grepper=fgrep ;; *) fail "bad mpat prefix in $mpat";; esac mpat=${mpat#[A-Z]:} ;; esac $grepper -e "$mpat" "$file" || fail "message not found" } t-expect-push-fail () { local mpat="$1"; shift local triedpush; triedpush=`git rev-parse HEAD` t-reporefs pre-push t-expect-fail "$mpat" "$@" cp $tmp/t.output $tmp/t.push-output t-reporefs post-push diff $tmp/show-refs.{pre,post}-push t-git-objects-not-present '' $triedpush eval "$t_expect_push_fail_hook" } t-expect-push-fail-retriably () { t-expect-push-fail "$@" grep 'You can retry the push, after fixing the problem, if you like' \ $tmp/t.push-output } t-expect-push-fail-tainted () { # t-expect-push-fail-local-and-remote $m $push_args... # Message is implicitly prefixed with 'E:^' # to avoid spotting them in protocol debug output etc. # Same message is expected from the remote. local m="$1"; shift t-expect-push-fail-retriably "E:^$m" "$@" t-expect-push-fail "E:^remote: $m" "$@" --force-push-tainted } t-git-objects-not-present () { # t-git-objects-not-present GITDIR|'' OBJID [...] # specifying '' means the repo for package $p local gitdir="${1-$dgitrepo}" local obj if ! [ -e "$gitdir" ]; then return; fi for obj in "$@"; do GIT_DIR=$gitdir \ t-expect-fail 'unable to find' \ git cat-file -t $obj done } t-reporefs () { local whichoutput=$1; shift local whichrepo=${1-$dgitrepo} local outputfile="$tmp/show-refs.$whichoutput" (set -e exec >"$outputfile" if test -d $whichrepo; then cd $whichrepo git show-ref |t-sort fi) } t-untar () { local tarfile=$1.tar local edittree=$1.edit if test -d "$edittree"; then cp -a "$edittree"/* . else tar xf "$tarfile" fi } t-worktree () { rm -rf $p t-untar $troot/worktrees/${p}_$1 } t-select-package () { p=$1 dgitrepo=$tmp/git/$p.git } t-git () { t-select-package $1 v=$2 mkdir -p $tmp/git local gs=$troot/git-srcs/${p}_$v.git (set -e; cd $tmp/git; t-untar $gs) } t-git-none () { mkdir -p $tmp/git (set -e; cd $tmp/git; tar xf $troot/git-template.tar) } t-salsa-add-remote () { local d=$tmp/salsa/$p mkdir -p $d (set -e; cd $d; git init --bare) git remote add ${1-origin} $d } t-git-merge-base () { git merge-base $1 $2 || test $? = 1 } t-has-ancestor () { # t-has-ancestor ANCESTOR # (CHILD is implicit, HEAD) local now; now=`git rev-parse HEAD` local ancestor; ancestor=`git rev-parse $1^{}` local mbase; mbase=`t-git-merge-base $ancestor $now` if [ x$mbase != x$ancestor ]; then fail "not ff $ancestor..$now, $mbase != $ancestor" fi } t-has-parent-or-is () { # t-has-parent-or-is CHILD PARENT local child=$1 local parent=$2 local parents parents=$(git show --pretty=format:' %P %H ' "$child") parent=$(git rev-parse "$parent~0") case "$parents" in *" $parent "*) ;; *) fail "child $child lacks parent $parent" ;; esac } t-prep-newpackage () { t-select-package $1 v=$2 t-archive-none $p t-git-none t-worktree $v cd $p if ! git show-ref --verify --quiet refs/heads/master; then git branch -m dgit/sid master git remote rm dgit fi cd .. } t-archive-none () { t-select-package $1 t-archive-none-$t_archive_method } t-archive-none-aq () { mkdir -p $tmp/aq/dsc_in_suite $tmp/mirror/pool/main : >$tmp/aq/suites local jsondelim="[" local suitespec for suitespec in $suitespecs; do local suite=${suitespec%%:*} local sname=${suitespec#*:} >$tmp/aq/package.$suite.$p t-aq-archive-updated $suite $p >$tmp/aq/package.new.$p t-aq-archive-updated new $p ln -sf $suite $tmp/aq/dsc_in_suite/$sname cat <>$tmp/aq/suites $jsondelim { "archive" : "ftp-master", "codename" : "$suite", "components" : [ "main", "contrib", "non-free" ], "name" : "$sname", "dakname" : "$sname" END jsondelim=" }," done cat <>$tmp/aq/suites } ] END } t-aq-archive-updated () { local suite=$1 local p=$2 local suitedir=$tmp/aq/dsc_in_suite/$suite mkdir -p $suitedir perl <$tmp/aq/package.$suite.$p >$suitedir/$p -wne ' use JSON; use strict; our @v; m{^(\S+) (\w+) ([^ \t/]+)/(\S+)} or die; push @v, { "version" => "$1", "sha256sum" => "$2", "component" => "$3", "filename" => "$4", }; END { my $json = JSON->new->canonical(); print $json->encode(\@v) or die $!; } ' } t-archive-process-incoming () { local suite=$1 mv $tmp/incoming/${p}_* $tmp/mirror/pool/main/ t-archive-query "$suite" } t-archive-query () { local suite=${1-sid} local dscf=main/${p}_${v}.dsc t-archive-query-$t_archive_method "$suite" "$p" "$v" "$dscf" } t-archive-query-aq () { local suite=$1 local p=$2 local v=$3 local dscf=$4 local sha; sha=`sha256sum <$tmp/mirror/pool/$dscf` echo "${v} ${sha% -} $dscf" >>$tmp/aq/package.$suite.${p} t-aq-archive-updated $suite $p } t-archive () { t-archive-none $1 v=$2 local dscf=${p}_$2.dsc rm -f $tmp/mirror/pool/main/${p}_* ${t_archive_ln_s-ln -s} \ $troot/pkg-srcs/${p}_${2%-*}* $tmp/mirror/pool/main/ t-archive-query $suite rm -rf $tmp/extract mkdir $tmp/extract (set -e; cd $tmp/extract; dpkg-source -x ../mirror/pool/main/$dscf) } t-git-dir-time-passes () { touch -d 'last year' $dgitrepo } t-git-dir-check () { local gitdir=$dgitrepo case "$1" in enoent) if test -e "$gitdir"; then fail "$gitdir exists"; fi return ;; public) wantstat='7[75]5' ;; secret) wantstat='7[70]0' ;; *) fail "$1 t-git-dir-check ?" ;; esac gotstat=`stat -c%a $gitdir` case "$gotstat" in *$wantstat) return ;; *) fail "$gitdir has mode $gotstat, expected $wantstat" ;; esac } t-expect-fsck-fail () { echo >>$tmp/fsck.expected-errors "$1" } t-git-fsck () { local fsckerrs=$(git rev-parse --git-dir)/dgit-test-fsck.errs set +e LC_MESSAGES=C git fsck --no-dangling --strict 2>&1 \ | tee $fsckerrs ps="${PIPESTATUS[*]}" set -e local pats if [ -f $tmp/fsck.expected-errors ]; then pats=(-w -f $tmp/fsck.expected-errors) else test "$ps" = "0 0" fi pats+=(-e 'notice: HEAD points to an unborn branch') pats+=(-e 'notice: No default references') set +e grep -v "${pats[@]}" $fsckerrs rc=$? set -e case $rc in 1) ;; # no unexpected errors 0) fail "unexpected messages from git-fsck" ;; *) fail "grep of git-fsck failed" ;; esac t-output "" git log --all --grep '^\[dgit .*INTERNAL.*]' } t-check-only-bpd () { if [ "$bpd" = .. ]; then return; fi t-files-notexist \ $tmp/*.{deb,changes,dsc,buildinfo} \ $tmp/*.{tar,diff}.* } t-fscks () { ( shopt -s nullglob for d in $tmp/*/.git $tmp/git/*.git; do cd "${d%/.git}" t-git-fsck done ) } t-ok () { : '========================================' t-check-only-bpd t-fscks t-save-artifacts echo ok. } t-save-artifacts () { artifacts="$AUTOPKGTEST_ARTIFACTS" if [ x"$artifacts" = x ]; then return; fi if [ x"tmp" = x ]; then return; fi GZIP=-1v tar -C "$tmp" -zc -f "$artifacts/${0##*/}.tar.gz" \ --exclude=\*.tar . } t-rm-dput-dropping () { rm -f $tmp/${p}_${v}_*.upload } t-dgit () { local dgit=${DGIT_TEST-dgit} pwd >&2 : ' {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{' $dgit --dgit=$dgit --dget:-u --dput:--config=$tmp/dput.cf \ ${dgit_config_debian_alias-"--config-lookup-explode=dgit-distro.debian.alias-canon"} \ ${DGIT_GITDEBREBASE_TEST+--git-debrebase=}${DGIT_GITDEBREBASE_TEST} \ ${distro+${distro:+-d}}${distro--dtest-dummy} \ $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \ -kBCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A $t_dgit_xopts "$@" : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ' } t-non-dgit-upload () { t-dgit -wgf build-source cd .. c=${p}_${v}_source.changes debsign -kBCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A $c dput -c $tmp/dput.cf test-dummy $c t-archive-process-incoming sid t-git-next-date cd $p } t-dgit-manpage () { local section=$1 local page=$2 (export LC_ALL=C.UTF-8 if [ "$DGIT_TEST_INTREE" ]; then make -C $DGIT_TEST_INTREE $page.$section.view else man $section $page fi) } t-diff-nogit () { diff --exclude=.git --exclude=.pc -ruN $* } t-files-notexist () { local f for f in "$@"; do if [ -e $f ]; then fail "$f exists!" fi done } t-cloned-fetched-good () { t-diff-nogit ../extract/$p-${v%-*} . t-clean-on-branch dgit/sid t-refs-same-start t-refs-same \ refs/heads/dgit/sid \ refs/remotes/dgit/dgit/sid t-refs-notexist refs/dgit/unstable refs/remotes/dgit/dgit/unstable } t-output () { printf "%s${1:+\n}" "$1" >$tmp/t.want shift "$@" >$tmp/t.got diff $tmp/t.want $tmp/t.got } t-clean-on-branch () { t-output "## $1" git status -b --porcelain } t-setup-done () { local savevars=$1 local savedirs=$2 local importeval=$3 local import=IMPORT.${DGIT_TEST_TESTNAME-${0##*/}} exec 4>$tmp/$import.new local vn for vn in $savevars; do perl >&4 -"I$root" -MDebian::Dgit -e ' printf "%s=%s\n", $ARGV[0], shellquote $ARGV[1] ' $vn "$(eval "printf '%s\n' \"\$$vn\"")" done perl >&4 -"I$root" -MDebian::Dgit -we ' foreach my $vn (grep m/^DGIT_TEST_REAL_/, keys %ENV) { print STDERR "saving-exporting $vn\n"; printf "export %s=%s\n", $vn, shellquote $ENV{$vn} or die $!; } ' (set -e; cd $tmp; tar cf $import.tar $savedirs) printf >&4 "\n%s\n" "$importeval" mv -f $tmp/$import.new $tmp/$import } t-setup-import () { local setupname=$1 local setupsrc local lock if [ "x$tmpbase" = x ]; then # ADTTMP was set on entry to tests/lib, so we # are not sharing tmp area between tests setupsrc="$tmp" lock="$tmp/.dummy.lock" else setupsrc="$tmpbase/$setupname" lock="$setupsrc.lock" fi local simport="$setupsrc/IMPORT.$setupname" if ! [ -e "$simport" ]; then with-lock-ex -w "$lock" \ xargs -0 -a $tmp/.save-env \ bash -xec ' cd "$1"; shift setupname="$1"; shift simport="$1"; shift if [ -e "$simport" ]; then exit 0; fi env - "$@" \ "tests/setup/$setupname" ' x "$root" "$setupname" "$simport" fi if [ "x$setupsrc" != "x$tmp" ]; then (set -e; cd $tmp; tar xf "$simport.tar") fi mkdir -p $tmp/must-clean . "$simport" } t-git-get-ref-exact () { local ref=$1 # does not dereference, unlike t-git-get-ref case "$ref" in refs/*) ;; *) fail "t-git-get-ref-exact bad $ref" ;; esac git for-each-ref --format='%(objectname)' "[r]efs/${ref#refs/}" } t-git-get-ref () { local ref=$1 case "$ref" in refs/*) ;; *) fail "t-git-get-ref bad $ref" ;; esac (git show-ref -d $1 || test $? = 1) | perl -ne ' $x = $1 if m#^(\w+) \Q'$1'\E(?:\^\{\})?$#; END { print "$x\n" if length $x; } ' } t-ref-same-exact () { local name="$1" local val; val=`t-git-get-ref-exact $name` t-ref-same-val "$name" $val } t-ref-same () { local name="$1" local val; val=`t-git-get-ref $name` t-ref-same-val "$name" $val } t-ref-head () { local val; val=`git rev-parse HEAD` t-ref-same-val HEAD $val } t-ref-same-val () { local name="$1" local val=$2 case "${t_ref_val-unset}" in unset) ;; "$val") ;; *) fail "ref varies: ($name)\ ${val:-nothing} != ${t_ref_val:-nothing} (${t_ref_names[*]})" ;; esac t_ref_val="$val" t_ref_names+=("$name") } t-refs-same-start () { unset t_ref_val t_ref_names=() } t-refs-same () { local g for g in $*; do t-ref-same $g done } t-refs-notexist () { local val for g in $*; do val=`t-git-get-ref $g` if [ "x$val" != x ]; then fail "ref $g unexpectedly exists ($val)" fi done } t-v-tag () { echo refs/tags/$tagpfx/${v//\~/_} } t-format-ref () { git log -n1 --pretty=format:"$1" "$2" } t-sametree-parent () { local ref=$1 local parent local ctree; ctree=$(t-format-ref '%T' "$ref") while :; do local psame='' for parent in $(t-format-ref '%P' "$ref"); do local ptree; ptree=$(t-format-ref '%T' "$parent") if [ "x$ptree" = "x$ctree" ]; then psame+=" $parent" fi done case "$psame" in ""|" * *") break ;; esac ref="${psame# }" done echo "$ref" } t-check-pushed-master () { local master; master=`t-git-get-ref refs/heads/master` if [ x$master = x$t_ref_val ]; then return; fi if [ x$master = x ]; then fail "failed to push master"; fi # didn't update master, it must be not FF local mbase; mbase=`t-git-merge-base $master $t_ref_val` if [ x$mbase = x$master ]; then fail "failed to ff master"; fi } t-push-was-source-only () { local f t-files-notexist $tmp/incoming/${p}_${v}_*.deb \ $tmp/incoming/${p}_${v}_*.udeb # we permit _source.buildinfo files; see test_changes_source_only() for f in $tmp/incoming/${p}_${v}_*.buildinfo; do if [ -e $f ]; then case "$f" in *_source.buildinfo) ;; *) fail "non-source-only file $f exists!" ;; esac fi done } t-push-included () { for f in $@; do stat $tmp/incoming/$f done } t-pushed-good () { local branch=$1 local suite=${2:-sid} t-refs-same \ refs/heads/$branch t-pushed-good-core } t-pushed-good-core () { t-ref-dsc-dgit t-refs-same \ `t-v-tag` \ refs/remotes/dgit/dgit/$suite t-refs-notexist \ refs/heads/dgit/unstable \ refs/remotes/dgit/dgit/unstable (set -e; cd $dgitrepo t-refs-same \ refs/dgit/$suite \ `t-v-tag` ${t_check_pushed_master:- : NOT-DRS-NO-CHECK-PUSHED-MASTER} t-refs-notexist \ refs/dgit/unstable ) git verify-tag `t-v-tag` } t-pushed-good-check-changes () { changes_filename="$tmp/incoming/${p}_${v}_*.changes" grep -E "^Distribution: $suite" $changes_filename grep -E "^Version: $v" $changes_filename } t-splitbrain-pushed-good--unpack () { cd $tmp rm -rf t-unpack mkdir t-unpack cd t-unpack ln -s $tmp/mirror/pool/main/*.orig*.tar* . ln -s $tmp/incoming/*.orig*.tar* . ||: ln -s $incoming_dsc . ln -s ${incoming_dsc/.dsc/.debian.tar}* . ln -s ${incoming_dsc/.dsc/.tar}* . ||: dpkg-source "$@" -x *.dsc cd */. git init git fetch ../../$p "refs/tags/*:refs/tags/*" } t-splitbrain-pushed-good--checkprep () { git add -Af . git rm --cached -r --ignore-unmatch .pc } t-splitbrain-pushed-good--checkdiff () { local tag=$1 t-splitbrain-pushed-good--checkprep t-output "" git diff --stat --cached $tag } t-splitbrain-pushed-good-start () { dep14tag=refs/tags/test-dummy/${v//\~/_} dgittag=$(t-v-tag) t-output "" git status --porcelain t-ref-head t-refs-same $dep14tag (set -e; cd $dgitrepo; t-refs-same $dep14tag) git merge-base --is-ancestor $dep14tag $dgittag t-refs-same-start t-ref-same refs/heads/split.p local split_b=$(t-git-get-ref refs/heads/split.b) case "$split_b" in "$t_ref_val") ;; "$(git rev-parse refs/heads/split.p^0)") ;; "$(git rev-parse refs/heads/split.p^1)") ;; *) fail "bad b/p (b=$split_b)" ;; esac t-pushed-good-core t-incoming-dsc t-splitbrain-pushed-good--unpack t-splitbrain-pushed-good--checkdiff $dgittag } t-splitbrain-pushed-good-end-made-dep14 () { t-splitbrain-pushed-good--checkdiff $dep14tag cd $tmp/$p } t-splitbrain-rm-1-patch () { local patchname=$1 perl -i -pe ' next unless $_ eq "'"$patchname"'\n"; die if $counter++; chomp; rename "debian/patches/$_", "../t-'"$patchname"'" or die $!; $_ = ""; ' debian/patches/series } t-splitbrain-rm-gitignore-patch () { t-splitbrain-rm-1-patch auto-gitignore } t-gbp-pushed-good () { local suite=${1:-sid} t-splitbrain-pushed-good-start # Right, now we want to check that the maintainer tree and # the dgit tree differ in exactly the ways we expect. We # achieve this by trying to reconstruct the maintainer tree # from the dgit tree. # So, unpack it withut the patches applied t-splitbrain-pushed-good--unpack --skip-patches # dgit might have added a .gitignore patch, which we need to # drop and remove t-splitbrain-rm-gitignore-patch # Now the result should differ only in non-debian/ .gitignores t-splitbrain-pushed-good--checkprep git diff --cached --name-only $dep14tag >../changed perl -ne ' next if !m#^debian/# && m#(^|/)\.gitignore#; die "$_ mismatch"; ' <../changed # If we actually apply the gitignore patch by hand, it # should be perfect: if [ -f ../t-auto-gitignore ]; then patch --backup-if-mismatch -p1 -u <../t-auto-gitignore fi t-splitbrain-pushed-good-end-made-dep14 } t-unapplied-pushed-good () { local suite=${1:-sid} t-splitbrain-pushed-good-start t-splitbrain-pushed-good--unpack --skip-patches t-splitbrain-pushed-good-end-made-dep14 } t-dpm-pushed-good () { local suite=${1:-sid} t-splitbrain-pushed-good-start t-splitbrain-pushed-good--unpack t-splitbrain-rm-gitignore-patch t-splitbrain-pushed-good-end-made-dep14 } t-split-unchanged-pushed-good () { local suite=${1:-sid} t-splitbrain-pushed-good-start t-splitbrain-pushed-good--unpack t-splitbrain-pushed-good-end-made-dep14 } t-commit-build-push-expect-log () { local msg=$1 local mpat=$2 t-commit "$msg" t-dgit build LC_MESSAGES=C \ t-dgit push-built --new 2>&1 |tee $tmp/push.log t-grep-mpat "$mpat" $tmp/push.log } t-822-field () { local file=$1 local field=$2 perl -e ' use Dpkg::Control::Hash; my $h = new Dpkg::Control::Hash allow_pgp=>1; $h->parse(\*STDIN,"'"$file"'"); my $val = $h->{"'$field'"},"\n"; die "'"$file $field"'" unless defined $val; print $val,"\n"; ' <$file } t-defdistro () { export DGIT_TEST_DISTRO='' distro='' t-git-config dgit-suite.unstable.distro test-dummy } t-stunt-envvar () { local var=$1 local tstunt=$2 eval ' case "$'$var'" in "$tstunt:"*) ;; *":$tstunt:"*) ;; "") '$var'="$tstunt" ;; *) '$var'="$tstunt:$'$var'" ;; esac export '$var' ' } t-tstunt--save-real () { local f="$1" case "$f" in */*) return ;; esac local rc local real set +e real=$( p=":$PATH:" p="${p/:"$tmp/tstunt":/:}" p="${p%:}" p="${p#:}" PATH="$p" type -p "$f" ) rc=$? set -e case $rc in 1) return ;; 0) ;; *) fail "did not find $f on PATH $PATH" ;; esac local varname=${f//[^_0-9a-zA-Z]/_} varname=DGIT_TEST_REAL_${varname^^} eval " : \${$varname:=\$real} export $varname " } t-tstunt () { local tstunt=$tmp/tstunt t-stunt-envvar PATH $tstunt t-stunt-envvar PERLLIB $tstunt local f for f in "$@"; do t-tstunt--save-real $f f="./$f" local d="$tstunt/${f%/*}" mkdir -p $d ln -sf "$troot/tstunt/$f" "$d"/. done } t-tstunt-parsechangelog () { t-tstunt dpkg-parsechangelog Dpkg/Changelog/Parse.pm } t-tstunt-lintian () { t-tstunt lintian } t-tstunt-debuild () { t-tstunt debuild } t-incoming-dsc () { local dsc=${p}_${v}.dsc incoming_dsc=$tmp/incoming/$dsc } t-ref-dsc-dgit () { t-incoming-dsc local val; val=`t-822-field $incoming_dsc Dgit` val=$( perl -e ' $_=shift @ARGV; die "Dgit $_ ?" unless m/^\w+\b/; print $&,"\n" or die $!; ' "$val") t-ref-same-val $incoming_dsc "$val" } t-apply-diff () { local v1=$1 local v2=$2 (cd $troot/pkg-srcs; debdiff ${p}_${v1}.dsc ${p}_${v2}.dsc || test $? = 1) \ | patch -p1 -u } t-gbp-unapplied-pq2qc () { # does `gbp pq export' # commits the resulting debian/patches on qc/BRANCH # leaves us on qc/BRANCH (eg "qc/quilt-tip")) # qc/BRANCH is not fast-forwarding gbp pq export branch=`git symbolic-ref HEAD` branch=${branch#refs/heads/} case "$branch" in */*) fail "unexpected branch $branch" ;; esac git branch -f qc/$branch git checkout qc/$branch git add debian/patches git commit -m 'Commit patch queue' } t-git-pseudo-merge () { # like git merge -s ours if [ ! "$git_pseuomerge_opts" ]; then if git merge --help \ | grep -q allow-unrelated-histories; then git_pseuomerge_opts='--allow-unrelated-histories' fi git_pseuomerge_opts+=' -s ours' fi git merge $git_pseuomerge_opts "$@" } t-gbp-example-prep-no-ff () { t-archive example 1.0-1 t-git-none t-worktree 1.0 cd example t-dgit fetch git checkout -b patch-queue/quilt-tip-2 patch-queue/quilt-tip gbp pq rebase echo '/* some comment */' >>src.c git add src.c git commit -m 'Add a comment to an upstream file' t-gbp-unapplied-pq2qc t-commit 'some updates' 1.0-2 } t-gbp-example-prep () { t-gbp-example-prep-no-ff t-git-pseudo-merge \ -m 'Pseudo-merge to make descendant of archive' \ remotes/dgit/dgit/sid } t-make-badcommit () { badcommit=$( git cat-file commit HEAD | \ perl -pe 's/^committer /commiter /' | \ git hash-object -w -t commit --stdin ) t-expect-fsck-fail $badcommit } t-make-orig () { # leaves ust set to filename of orig tarball local p=$1 local v=$2 local tag=${3-v$2} ust=${p}_${v}.orig.tar.gz GZIP=-1 git archive -o $bpd/$ust --prefix=${p}-${v}/ $tag } t-merge-conflicted-stripping-conflict-markers () { local otherbranch=$1 local file=$2 t-expect-fail F:"Merge conflict in $file" \ git merge $otherbranch perl -i~ -ne 'print unless m{^(?:\<\<\<|\>\>\>|===)}' "$file" git add "$file" git commit --no-edit } t-commit () { local msg=$1 v=${2:-${majorv:-1}.$revision} t-debchange \ --force-distribution -v$v --distribution ${3:-unstable} "$1" git add debian/changelog debcommit revision=$(( ${revision-0} + 1 )) } t-dch-r-rune () { local cmd="$1"; shift local suite=${1-unstable} $cmd -r -D "$suite" '' } t-dch-commit-r () { t-dch-r-rune t-dch-commit "$@" } t-dch-commit () { t-debchange "$@" git commit -m "dch $*" debian/changelog } t-debchange () { DEBEMAIL=dgit-tests@example.org $troot/tstunt/debchange "$@" } t-git-config () { git config --global "$@" } t-drs () { t-git-config dgit-distro.test-dummy.git-url "ext::$troot/drs-git-ext %S " t-git-config dgit-distro.test-dummy.git-check true t-git-config dgit-distro.test-dummy.git-create true cp $troot/gnupg/{dd.gpg,dm.gpg,dm.txt} $tmp/. cp $troot/suites $tmp/. cp $troot/suites $tmp/suites-master export t_check_pushed_master=t-check-pushed-master drs_dispatch=$tmp/distro=test-dummy mkdir $drs_dispatch if [ "x$DGIT_TEST_INTREE" != x ]; then ln -sf "$DGIT_TEST_INTREE" $drs_dispatch/dgit-live fi ln -sf $tmp/git $drs_dispatch/repos ln -sf $tmp/suites $tmp/suites-master $tmp/dm.txt $drs_dispatch/ mkdir -p $drs_dispatch/keyrings ln -sf $tmp/dd.gpg $drs_dispatch/keyrings/debian-keyring.gpg ln -sf $tmp/dm.gpg $drs_dispatch/keyrings/debian-maintainers.gpg ln -sf /bin/true $drs_dispatch/policy-hook } t-dsd () { t-drs t-git-config dgit-distro.test-dummy.ssh "$troot/dsd-ssh" t-git-config dgit-distro.test-dummy.git-check ssh-cmd t-git-config dgit-distro.test-dummy.git-create true t-git-config dgit-distro.test-dummy.git-url \ "ext::$troot/dsd-ssh X %S /dgit/test-dummy/repos" t-git-config dgit-distro.test-dummy.diverts.drs /drs t-git-config dgit-distro.test-dummy/drs.ssh "$troot/ssh" t-git-config dgit-distro.test-dummy/drs.git-url $tmp/git t-git-config dgit-distro.test-dummy/drs.git-check ssh-cmd t-git-config dgit-distro.test-dummy/drs.git-create ssh-cmd echo 'no-such-package* drs' >$drs_dispatch/diverts } t-policy-admin () { : '((((((((((((((((((((((((((((((((((((((((' ${DGIT_INFRA_PFX}dgit-repos-admin-debian --repos $tmp/git "$@" : '))))))))))))))))))))))))))))))))))))))))' } t-policy-nonexist () { ln -sf no-such-file-or-directory $drs_dispatch/policy-hook } t-make-hook-link () { local hook=$1 # in infra/ local linkpath=$2 hook=${DGIT_INFRA_PFX}$hook case $hook in */*) ;; *) hook=`type -P $hook` ;; esac ln -sf "$hook" $linkpath } t-policy () { local policyhook=$1 t-make-hook-link $policyhook $drs_dispatch/policy-hook } t-debpolicy () { t-dsd t-policy dgit-repos-policy-debian mkdir -p $tmp/git t-policy-admin create-db } t-policy-periodic () { : '((((((((((((((((((((((((((((((((((((((((' ${DGIT_REPOS_SERVER_TEST-dgit-repos-server} \ test-dummy $drs_dispatch '' --cron : '))))))))))))))))))))))))))))))))))))))))' } t-tagupl-settings () { export DGIT_DRS_EMAIL_NOREPLY=noreply@example.org export DGIT_DRS_SENDMAIL=$troot/tstunt/sendmail export DGIT_DRS_DGIT=$troot/tstunt/dgit t-chain-test-somehow mkdir ../pretend-salsa (set -e; cd ../pretend-salsa; git init --bare) git remote add salsa $tmp/pretend-salsa # git branch --set-upstream-to complains, so git config branch.master.remote salsa git config branch.master.merge refs/heads/master } t-tagupl-run-drs () { local source=$1 cd .. cd tagupl DGIT_DRS_ANY_URL=1 \ DGIT_DRS_MODE="tag2upload $source $tagname" \ $troot/drs-git-ext cd $tmp/$p } t-tagupl-test () { ${DGIT_DEBPUSH_TEST-git debpush} \ --distro=test-dummy -u Senatus "$@" mkdir ../tagupl t-tagupl-run-drs $tmp/pretend-salsa cd ../pretend-salsa t-refs-same refs/heads/master cd ../$p t-dgit fetch } t-buildproductsdir-config () { bpd=$tmp/bpd t-git-config dgit.default.build-products-dir $bpd mkdir -p $bpd cat <>$tmp/.gbp.conf [buildpackage] export-dir = $bpd END } t-restrict () { local restriction=$1 (cd $root; t-restriction-$restriction >&2) } t-dependencies () { : "Hopefully installed: $*" } t-chain-test-somehow () { export DGIT_TEST_TESTNAME="$testname" export DGIT_TEST_TMPBASE="$tmpbase" export ADTTMP=$tmp } t-chain-test () { t-chain-test-somehow local ct=$1 local d=${0%/*} cd $root exec "$d/$ct" } t-alt-test () { local t=${0##*/} t-${t%%-*} t-chain-test "${t#*-}" } t-git-config dgit.default.old-dsc-distro test-dummy t-git-config dgit-distro.test-dummy.policy-query-supported-ssh true for import in ${autoimport-gnupg}; do case "$0" in */$import) ;; *) t-setup-import $import ;; esac done work/tests/lib-baredebian0000644000000000000000000000444514761250142012644 0ustar # baredebian-test-vars () { quiltmode=baredebian v=1.0-1 suite=sid uv=${v%-*} uvtag=v$uv origbase=${p}_${uv}.orig xorigcomps='' } baredebian-tarball-mode () { git tag -d $uvtag uvtag='' quiltmode=baredebian+tarball } baredebian-test-minimum () { t-expect-fail 'contradicts clean mode git-ff' \ t-dgit -wgf --dgit-view-save=split.f1 --$quiltmode quilt-fixup t-dgit -wn --dgit-view-save=split.f1 --$quiltmode quilt-fixup } baredebian-test-core-prepush () { tar --strip-components=1 -axf ../$origbase.tar.* for comp in $xorigcomps; do mkdir $comp cd $comp tar --strip-components=1 -axf ../../$origbase-$comp.tar.* cd .. done cd debian git clean -xdff git checkout HEAD -- . cd .. # Now we are in this insane state that people seem to expect export QUILT_PATCHES=debian/patches quilt push -a git add -Af . git reset .pc git diff --cached --exit-code split.f1 -- :/ :!/debian git diff --exit-code HEAD..split.f1 -- :/debian git reset quilt new made-with-quilt quilt add src.c echo //omg >>src.c quilt refresh git add debian/patches/. t-commit 'extra patch made with quilt' 1.0-2 t-refs-same-start t-ref-head t-dgit -wn --quilt=$quiltmode --dgit-view-save=split.b quilt-fixup t-ref-head } baredebian-test-core-push () { dpkg-buildpackage -uc -us --build=source # ^ Do this by hand here not because we expect users to do this # (rather than dgit build), but so that we can check that our # output is the same as users are used to. t-dgit -wn --quilt=$quiltmode --dgit-view-save=split.p --new \ push-built } baredebian-test-core-postpush () { git merge-base --is-ancestor HEAD split.p if [ "$uvtag" ]; then git merge-base --is-ancestor $uvtag split.p set +e; git merge-base HEAD $uvtag; rc=$?; set -e; [ $rc = 1 ] fi git clean -xdff # t-pushed-good-* wants a clean tree to start with, but this # workflow expects a mess t-splitbrain-pushed-good-start t-splitbrain-pushed-good--unpack find . -mindepth 1 -maxdepth 1 \ \! -path ./debian \ \! -path ./.git \ -print0 \ | xargs -0r rm -rf -- t-splitbrain-pushed-good-end-made-dep14 } baredebian-test-core () { baredebian-test-core-prepush baredebian-test-core-push baredebian-test-core-postpush } baredebian-test () { baredebian-test-vars baredebian-test-minimum baredebian-test-core } work/tests/lib-build-modes0000644000000000000000000001564414761250142012777 0ustar bm-prep-ownpackage-branches () { cat <<'END' >$tmp/stunt-git #!/bin/sh -e case "$*" in *clean*) echo >&2 "BUILD-MODES PROGRAM git $*" ;; esac exec git "$@" END chmod +x $tmp/stunt-git bm_branches="$1" } bm-prep () { t-tstunt-parsechangelog t-tstunt dpkg-deb t-prep-newpackage example 1.0 cd $p git checkout -b bad-build-deps indep-arch perl -pe 's/Build-Depends.*/$&, x-dgit-no-such-package/' \ -i debian/control git commit -a -m bad-build-deps bm-prep-ownpackage-branches 'indep-arch bad-build-deps' if zgrep 'dpkg-buildpackage: Make dependency checks fatal for -S' \ /usr/share/doc/dpkg-dev/changelog.gz; then dpkgbuildpackage_deps_for_clean=true else dpkgbuildpackage_deps_for_clean=false fi cleanmodes_default="git none" cleanmodes_default+=" dpkg-source$cleanmodes_dpkgsource_extra" cleanmodes_default+=" dpkg-source-d$cleanmodes_dpkgsource_extra" cleanmodes_all="$cleanmodes_default git-ff check" cleanmodes_all+=" git,always git,always" cleanmodes="$cleanmodes_default" } bm-gbp-example-acts () { t-gbp-example-prep t-tstunt-parsechangelog git checkout -b for-build-modes qc/quilt-tip-2 # build-modes cannot cope with branches containing / bm-prep-ownpackage-branches for-build-modes cleanmodes='git dpkg-source,no-check' for act in "$@"; do bm-guess-e-source-e-targets "$act" real_act="--quilt=gbp $act" case "$act" in sbuild*) bm_quirk_after_act=bm-quirk-sbuild-after-act ;; gbp-*) real_act="$real_act --git-ignore-branch" ;; *) bm_quirk_after_act='' ;; esac bm-act-iterate done } bm-guess-e-source-e-targets () { local some_act=$1 case "$some_act" in sbuild*" --no-arch-all"*) e_source=true; e_targets='build-arch binary-arch' ;; build-source) e_source=true; e_targets='' ;; *" -b") e_source=false; e_targets='build binary' ;; *" -B") e_source=false; e_targets='build-arch binary-arch' ;; *" -A") e_source=false; e_targets='build-indep binary-indep' ;; *" -S") e_source=true; e_targets=' ' ;; *" -F") e_source=true; e_targets='build binary' ;; *" -G") e_source=true; e_targets='build-arch binary-arch' ;; *" -g") e_source=true; e_targets='build-indep binary-indep' ;; *) e_source=true; e_targets='build binary' ;; esac } bm-quirk-sbuild-after-act () { # sbuild likes to run the package clean target in the chroot, # which isn't necessary in our case. We don't disable it in # dgit because we want to do what sbuild does, in case there # are packages which don't build unless their clean target was # run. We know it must be running it in the chroot because we # provide sbuild with the dsc, not the tree, so we simply # ignore all executions of the clean target by schroot. local arch; arch=$(dpkg-architecture -qDEB_BUILD_ARCH) local sblog=$bpd/example_${v}_$arch.build if [ -e $sblog ]; then sed ' s/^EXAMPLE RULES TARGET clean/HOOK SUPPRESSED &/; ' <$sblog >>$bmlog else echo "SBUILD LOG FILE ($sblog) MISSING" fi } bm-report-test () { local desc=$1; shift if "$@"; then echo >&4 "$desc EXISTS" else echo >&4 "$desc MISSING" fi } bm-build-deps-ok () { case "$branch" in *bad-build-deps*) return 1 ;; *) return 0 ;; esac } bm-compute-expected () { require_fail=unexpect # or required tolerate_fail=unexpect # or tolerate exec 4>$bmexp echo >&4 "$heading" local eff_cleanmode=$cleanmode case "$e_targets" in *[^\ ]*) ;; *) # if no build is going to be run, dgit will only check # cleanliness rather than actually cleaning eff_cleanmode=C$cleanmode ;; esac case "$act" in sbuild*) # dgit sbuild will only check cleanliness # because it doesn't need to to make a .dsc for sbuild eff_cleanmode=C$cleanmode ;; esac # we are running the builder in-tree ? # when we have --include-dirty, we will want to check # that too and reset eff_cleanmode to $cleanmode case $eff_cleanmode in git|Cgit,always) echo >&4 'BUILD-MODES PROGRAM git clean -xdf' ;; git-ff|Cgit-ff,always) echo >&4 'BUILD-MODES PROGRAM git clean -xdff' ;; check|Ccheck) echo >&4 'BUILD-MODES PROGRAM git clean -dn -x' ;; dpkg-source-d|dpkg-source-d,no-check) echo >&4 "EXAMPLE RULES TARGET clean" ;; dpkg-source|dpkg-source,no-check) bm-build-deps-ok || tolerate_fail=tolerate echo >&4 "EXAMPLE RULES TARGET clean" ;; none|Cnone) ;; Cdpkg-source*) ;; # handled below Cgit|Cgit-ff) echo >&4 'BUILD-MODES PROGRAM git clean -dn' ;; *) fail "t-compute-expected-run $cleanmode ??" ;; esac case $eff_cleanmode in dpkg-source|Cdpkg-source|dpkg-source-d|Cdpkg-source-d) echo >&4 'BUILD-MODES PROGRAM git clean -dn' ;; dpkg-source*,no-check|Cdpkg-source*,no-check) ;; Cdpkg-source*) fail "t-compute-expected-run wd $cleanmode ??" ;; esac if [ "x$e_targets" != x ]; then # e_targets can be " " to mean `/may/ fail due to b-d' bm-build-deps-ok || tolerate_fail=tolerate fi for t in $e_targets; do bm-build-deps-ok || require_fail=required echo >&4 "EXAMPLE RULES TARGET $t" done bm-report-test "SOURCE FILE" $e_source bm-report-test "SOURCE IN CHANGES" $e_source bm-report-test "DEBS IN CHANGES" expr "$e_targets" : '.*binary.*' exec 4>&- } bm-run-one () { local args="$DGIT_TEST_BM_BASEARGS --clean=$cleanmode $real_act" bmid="$act,$cleanmode,$branch" bmid=${bmid// /_} rm -f $bpd/${p}_{v}_*.changes heading="===== [$bmid] dgit $args =====" bmlog=$tmp/run.$bmid.output bmexp=$tmp/run.$bmid.expected bmgot=$tmp/run.$bmid.results bm-compute-expected git checkout $branch git clean -xdf # since we might not do any actual cleaning dsc="$bpd/example_$v.dsc" rm -f $dsc set +o pipefail t-dgit --rm-old-changes --git=$tmp/stunt-git $args 2>&1 | tee $bmlog local ps="${PIPESTATUS[*]}" set -o pipefail $bm_quirk_after_act exec 4>$bmgot echo >&4 "$heading" case $ps in "0 0") actual_status=success ;; *" 0") actual_status=failure; echo >&4 "OPERATION FAILED"; ;; *) fail "tee failed" ;; esac case "$require_fail-$tolerate_fail-$actual_status" in required-********-failure) echo >>$bmexp "REQUIRED FAILURE" ;; ********-tolerate-failure) echo >>$bmexp "TOLERATED FAILURE" ;; unexpect-********-success) ;; *) fail "RF=$require_fail TF=$tolerate_fail AS=$actual_status" ;; esac egrep >&4 '^EXAMPLE RULES TARGET|^BUILD-MODES' $bmlog || [ $? = 1 ] bm-report-test "SOURCE FILE" [ -e $dsc ] if [ $actual_status = success ]; then local changes; changes=$(echo $bpd/example_${v}_*.changes) case "$changes" in *' '*) fail "build generated ambiguous .changes: $changes" ;; esac perl -ne 'print if m/^files:/i ... m/^\S/' \ <$changes >$changes.files bm-report-test "SOURCE IN CHANGES" grep '\.dsc$' $changes.files bm-report-test "DEBS IN CHANGES" grep '\.deb$' $changes.files fi exec 4>&- $bm_quirk_before_diff [ $actual_status = failure ] || diff -U10 $bmexp $bmgot } bm-act-iterate () { for cleanmode in $cleanmodes; do for branch in $bm_branches; do bm-run-one done done : bm-act-iterate done. } bm-buildproductsdir-nonworking () { t-git-config dgit.default.build-products-dir ../bpd-dummy } work/tests/lib-core0000644000000000000000000000321314761250142011510 0ustar # fail () { echo >&2 "failed: $*" exit 1 } t-set-intree () { if [ "x$DGIT_TEST_INTREE" = x ]; then return; fi : ${DGIT_TEST:=$DGIT_TEST_INTREE/dgit} : ${DGIT_BADCOMMIT_FIXUP:=$DGIT_TEST_INTREE/dgit-badcommit-fixup} : ${DGIT_REPOS_SERVER_TEST:=$DGIT_TEST_INTREE/infra/dgit-repos-server} : ${DGIT_SSH_DISPATCH_TEST:=$DGIT_TEST_INTREE/infra/dgit-ssh-dispatch} : ${DGIT_MIRROR_SSH_WRAP_TEST:=$DGIT_TEST_INTREE/infra/dgit-mirror-ssh-wrap} : ${DGIT_DEBPUSH_TEST:=$DGIT_TEST_INTREE/git-debpush} : ${DGIT_INFRA_PFX:=$DGIT_TEST_INTREE${DGIT_TEST_INTREE:+/infra/}} : ${DGIT_GITDEBREBASE_TEST:=$DGIT_TEST_INTREE/git-debrebase} : ${DGIT_MANPAGES_SOURCE_DIR:=$DGIT_TEST_INTREE} : ${DEBPUSH_GIT_PLAYTREE_SETUP:=$DGIT_TEST_INTREE/git-playtree-setup} export DGIT_TEST DGIT_BADCOMMIT_FIXUP export DGIT_REPOS_SERVER_TEST DGIT_SSH_DISPATCH_TEST export DGIT_MIRROR_SSH_WRAP_TEST export DGIT_MANPAGES_SOURCE_DIR DEBPUSH_GIT_PLAYTREE_SETUP export PERLLIB="$DGIT_TEST_INTREE${PERLLIB:+:}${PERLLIB}" } t-set-using-tmp () { export HOME=$tmp export DGIT_TEST_DUMMY_DIR=$tmp export DGIT_TEST_TMP=$tmp export GNUPGHOME=$tmp/nonexistent export DEBFULLNAME='dgit test git user' git config --global user.email 'dgit-test@debian.example.net' git config --global user.name "$DEBFULLNAME" git config --global protocol.ext.allow always git config --global dgit.default.push-subcmd reject } t-filter-out-git-hyphen-dir () { local pathent; pathent=$(type -p git-rev-parse ||:) case "$pathent" in '') return ;; esac pathent=${pathent%/*} local path=":$PATH:" path="${path//:$pathent:/}" path="${path#:}" path="${path%:}" PATH="$path" } t-sort () { LC_COLLATE=C sort "$@" } work/tests/lib-gdr0000644000000000000000000001666314761250142011351 0ustar # : ${GDR_TEST_DEBUG=-D} export GDR_TEST_DEBUG t-tstunt debchange t-git-debrebase () { local gdr=${DGIT_GITDEBREBASE_TEST-git-debrebase} : ' {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{' $gdr "--dgit=${DGIT_TEST-dgit}" $GDR_TEST_OPTS \ $GDR_TEST_DEBUG $t_gdr_xopts "$@" : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ' } t-gdr-good () { local state=$1 local beforetag=$2 # say HEAD to skip this check # state should be one of # laundered # stitched # pushed case $state in pushed*) t-gdr-made-patches ;; esac git diff --quiet ${beforetag-t.before} -- ':.' ':!debian/patches' LC_MESSAGES=C t-git-debrebase status >../status.check case $state in laundered*) egrep '^ *branch is laundered' ../status.check ;; stitched*|pushed*) egrep \ '^ *branch contains furniture|^ *branch is unlaundered|^ *branch needs laundering' ../status.check egrep '^ stitched$' ../status.check ;; esac t-gdr-good-analyse HEAD $state } t-gdr-good-analyse () { local head=$1 local state=$2 local wsfx=$3 local etypes bwtip # etypes is either a type, # or PseudoMerge- # or AddPatches- case $state in laundered) etypes=Upstream bwtip=Y:`t-git-debrebase breakwater` ;; stitched) etypes=Pseudomerge-Upstream ;; pushed) etypes=AddPatches-Pseudomerge-Upstream ;; pushed-interop) etypes=Pseudomerge-AddPatchesInterop-Upstream ;; breakwater) etypes=Packaging ;; *) fail-unknown-state-$state ;; esac anal=../anal$wsfx t-git-debrebase analyse $head >$anal.check expect=`git rev-parse $head` exec <$anal.check local cid ctype info nparents while read cid ctype info; do : ===== $cid $ctype $info ===== test $cid = $expect local cetype=${etypes%%-*} if [ "x$ctype" = "x$cetype" ]; then cetype=SAME; fi local parents="`git log -n1 --pretty=format:%P $cid`" expect="$parents" enparents=1 : "$ctype/$cetype" "$parents" case "$ctype/$cetype" in Pseudomerge/SAME) ;; Packaging/SAME) ;; Packaging/Upstream) ;; MergedBreakwaters/Packaging) ;; MergedBreakwaters/Upstream) ;; AddPatches/SAME) ;; AddPatches/AddPatchesInterop) ;; Changelog/Packaging) ;; Changelog/Upstream) ;; Upstream/SAME) ;; Anchor/Upstream) ;; Anchor/Packaging) ;; *) fail "etypes=$etypes ctype=$ctype cetype=$cetype $cid" ;; esac case "$ctype/$etypes" in Packaging/Upstream|\ Changelog/Upstream) if [ "x$bwtip" != x ]; then test "$bwtip" = "Y:$cid" bwtip='' fi esac case "$cetype" in AddPatchesInterop) git log -n1 --pretty=format:%B \ | grep '^\[git-debrebase[ :]' ;; esac case "$ctype" in Pseudomerge) expect=${info#Contributor=} expect=${expect%% *} enparents=2 git diff --quiet $expect..$cid etypes=${etypes#*-} : 'reject pointless pseudomerges' local overwritten=${parents/$expect/} overwritten=${overwritten// /} t-git-debrebase analyse $overwritten >$anal.overwr local ocid otype oinfo read <$anal.overwr ocid otype oinfo case "$otype" in Pseudomerge) test "x$info" != "x$oinfo" ;; esac ;; Packaging) git diff --quiet $expect..$cid -- ':.' ':!debian' git diff --quiet $expect..$cid -- ':debian/patches' etypes=Packaging ;; AddPatches) git diff --quiet $expect..$cid -- \ ':.' ':!debian/patches' etypes=${etypes#*-} ;; Changelog) git diff --quiet $expect..$cid -- \ ':.' ':!debian/changelog' etypes=Packaging ;; Upstream/SAME) git diff --quiet $expect..$cid -- ':debian' ;; MergedBreakwaters) enparents=2 ;; Anchor) break ;; esac local cnparents=`printf "%s" "$parents" | wc -w` test $cnparents = $enparents local cndparents=` for f in $parents; do echo $f; done | t-sort -u | wc -w ` test $cndparents = $cnparents case "$parents" in *"$expect"*) ;; *) fail 'unexpected parent' ;; esac case "$ctype" in MergedBreakwaters) local f local parent_ix=0 for f in $parents; do t-gdr-good-analyse $f breakwater \ $wsfx-mp$parent_ix parent_ix=$(( $parent_ix + 1 )) done return ;; esac done } t-some-changes () { local token=$1 local which=${2:-dum} local fsuffix=$3 t-git-next-date case "$which" in *d*) echo >>debian/zorkmid$fsuffix "// debian $token" git add debian/zorkmid$fsuffix git commit -m "DEBIAN add zorkmid$fsuffix ($token)" ;; esac case "$which" in *u*) echo >>src$fsuffix.c "// upstream $token" git add src$fsuffix.c git commit -m "UPSTREAM edit src$fsuffix.c ($token)" ;; esac case "$which" in *m*) for f in debian/zorkmid$fsuffix src$fsuffix.c; do echo "// both! $token" >>$f git add $f done git commit -m "MIXED add both($fsuffix) ($token)" ;; esac t-git-next-date } t-make-new-upstream-tarball () { local uv=$1 git checkout make-upstream echo "upstream $uv" >>docs/README git commit -a -m "upstream $uv tarball" t-make-orig example $uv make-upstream } t-nmu-upload-1 () { # usage: # v= # nmu-upload-1 # gbp pq import or perhaps other similar things # nmu-upload-2 # maybe make some dgit-covertible commits # nmu-upload-3 t-git-next-date nmubranch=$1 git checkout -f -b $nmubranch t-git-debrebase t-git-debrebase convert-to-gbp t-git-next-date # now we are on a gbp patched-unapplied branch } t-nmu-upload-2 () { t-git-next-date t-dch-commit -v $v -m "nmu $nmubranch $v" } t-nmu-upload-3 () { t-dch-commit-r t-non-dgit-upload git checkout master } t-nmu-commit-an-upstream-change () { echo >>newsrc.c "// more upstream" git add newsrc.c git commit -m 'UPSTREAM NMU' } t-maintainer-commit-some-changes () { t-dch-commit -v$v -m "start $v" t-some-changes "maintainer $v" t-git-debrebase t-git-debrebase stitch git branch did.maintainer t-git-next-date } t-nmu-causes-ff-fail () { t-dgit fetch t-expect-fail E:'Not.*fast-forward' \ git merge --ff-only dgit/dgit/sid t-expect-fail E:'-fdiverged.*refs/remotes/dgit/dgit/sid' \ t-git-debrebase } t-nmu-reconciled-good () { local nmutree=$1 : 'check that what we have is what is expected' git checkout -b compare.nmu origin/master~0 git checkout $nmutree . git rm -rf debian/patches git commit -m 'rm patches nmu' git checkout -b compare.maintainer origin/master~0 git checkout did.maintainer . git rm -rf --ignore-unmatch debian/patches git commit --allow-empty -m 'rm patches maintainer' git merge compare.nmu git diff --quiet master : 'check that dgit still likes it' git checkout master t-dgit -wgf quilt-fixup } t-gdr-prep-new-upstream () { uv=$1 t-git-next-date git checkout make-upstream git reset --hard upstream t-make-new-upstream-tarball $uv git push . make-upstream:upstream git checkout master t-git-next-date } t-gdr-gbp-import-core () { p=example t-worktree 1.1 cd example : 'fake up some kind of upstream' git checkout -b upstream quilt-tip rm -rf debian mkdir debian echo junk >debian/rules git add debian git commit -m "an upstream retcon ($0)" git tag v1.0 } t-gdr-gbp-import-core-with-queue () { t-gdr-gbp-import-core : 'fake up that our quilt-tip was descended from upstream' git checkout quilt-tip git merge --no-edit -s ours upstream : 'fake up that our quilt-tip had the patch queue in it' git checkout patch-queue/quilt-tip gbp pq export git add debian/patches git commit -m "patch queue update ($0)" : 'make branch names more conventional' git branch -D master git branch -m quilt-tip master } t-gdr-made-patches () { git log -n1 --'pretty=format:%B' \ | egrep '^\[git-debrebase' } work/tests/lib-import-chk0000644000000000000000000000404714761250142012643 0ustar t-import-chk-authorship () { perl -ne 'print $1,"\n" if m/^ -- (\S.*\>) /' debian/changelog \ | t-sort -u \ > $tmp/authorship.changelog ${import_chk_changelog_massage:-:} $tmp/authorship.changelog git log --pretty=format:'%an <%ae>%n%cn <%ce>' \ | t-sort -u \ > $tmp/authorship.commits diff $tmp/authorship.{changelog,commits} } t-import-chk1 () { p=$1 v=$2 t-archive $p $v } t-import-chk2() { t-git-none rm -rf $p t-dgit --no-rm-on-error clone $p # And now we make an update using the same orig tarball, and # check that the orig import is stable. cd $p t-import-chk-authorship git branch first-import m='Commit for import check' echo "$m" >>import-check v=${v%-*}-99 dch -v $v -D unstable -m "$m" git add import-check debian/changelog git commit -m "$m" t-dgit -wgf quilt-fixup t-dgit -wgf build-source # The resulting .dsc does not have a Dgit line (because dgit push # puts that in). So we just shove it in the archive now ln $bpd/${p}_${v}.* $tmp/mirror/pool/main/ t-archive-query t-dgit fetch git branch first-2nd-import remotes/dgit/dgit/sid t-git-next-date git update-ref refs/remotes/dgit/dgit/sid first-import t-dgit fetch t-refs-same-start t-ref-same refs/remotes/dgit/dgit/sid t-ref-same refs/heads/first-2nd-import for orig in $bpd/${p}_${v%-*}.orig*.tar.*; do tar -atf $orig | t-sort >$bpd/files.o pfx=$(perl <$bpd/files.o -ne ' while (<>) { m#^([^/]+/)# or exit 0; $x //= $1; $x eq $1 or exit 0; } print "$x\n"; ') perl -i~ -pe ' s#^\Q'"$pfx"'\E##; $_="" if m/^$/ || m#/$# || m#^\.git/#; ' $bpd/files.o orig=${orig#$bpd/} pat="^Import ${orig//./\\.}\$" t-refs-same-start for start in first-import first-2nd-import; do git log --pretty='tformat:%H' --grep "$pat" $start \ >$bpd/t.imp test $(wc -l <$bpd/t.imp) = 1 imp=$(cat $bpd/t.imp) t-ref-same-val "$orig $start" "$imp" done git ls-tree -r --name-only "$t_ref_val:" \ | t-sort >$bpd/files.g diff $bpd/files.{o,g} done cd .. } t-import-chk() { t-import-chk1 "$@"; t-import-chk2; } work/tests/lib-mirror0000644000000000000000000000154714761250142012102 0ustar t-mirror-setup () { # p must be set already reposmirror=$tmp/git-mirror pmirror=$reposmirror/$p.git queuedir=$tmp/git/_mirror-queue mkdir $reposmirror mirror_hook=$drs_dispatch/mirror-hook t-make-hook-link dgit-mirror-rsync $mirror_hook >$drs_dispatch/mirror-settings t-mirror-set remoterepos="$reposmirror" t-mirror-hook setup } t-mirror-set () { echo >>$drs_dispatch/mirror-settings "$1" } t-mirror-hook () { : '((((((((((((((((((((((((((((((((((((((((' "$mirror_hook" "$drs_dispatch" "$@" : '))))))))))))))))))))))))))))))))))))))))' } t-check-mirrored () { t-reporefs master t-reporefs mirror $pmirror diff $tmp/show-refs.{master,mirror} cat $queuedir/$p.log ||: t-files-notexist $queuedir/$p.{n,a,lock,err} } t-check-not-mirrored () { # uses previous t-reporefs-master t-reporefs mirror $pmirror diff $tmp/show-refs.{master,mirror} } work/tests/lib-orig-include-exclude0000644000000000000000000000164514761250142014577 0ustar # designed to be .'d t-tstunt-parsechangelog t-archive example 1.0-1 t-git-none t-dgit clone $p origs='orig orig-docs' usvsns='1.0 1.1' for o in $origs; do cp ${p}_{1.0,1.1}.${o}.tar.gz done mkdir -p "$tmp/aq/file_in_archive/%" cd $p test-push-1 () { v=$1 ch=$2 suite=$3 t-commit $v $v $suite t-dgit $ch build } test-push-2 () { $test_push_2_hook t-dgit $ch "$@" push-built } test-push-1 1.0-2 --ch:-sa grep orig ../${p}_${v}_*.changes test-push-2 origs_findls () { find $tmp/mirror -name '*orig*' -ls \ | perl -pe 's/^(\s*\d+\s+\d+\s+\S+\s)\s*\d+(\s)/$1$2/' } # check that dgit stripped out the orig update origs_findls >../before t-archive-process-incoming sid origs_findls >../after diff -u ../before ../after test-push-1 1.1-1.2 --ch:-sd test-push-2 t-archive-process-incoming sid cd .. mkdir get cd get t-dgit clone $p # ^ checks that all the origs are there, ie that dgit added the origs cd .. work/tests/lib-reprepro0000644000000000000000000000330414761250142012417 0ustar # -*- bash -*- t-reprepro () { t_archive_method=reprepro t-reprepro-cfg } t-reprepro-cfg () { local rrinst=$1 local rrdistro=${2:-test-dummy} local etcapt=$tmp/${rrinst}etc-apt local mir=$tmp/${rrinst}mirror t-git-config dgit-distro.$rrdistro.archive-query aptget: t-git-config dgit-distro.$rrdistro.mirror file://$mir/ mkdir $etcapt cat >$etcapt/conf <han.pgp fakeroot apt-key add $rrc/distributions local arch; arch=`dpkg --print-architecture` for suitespec in $suitespecs; do local suite=${suitespec%%:*} local sname=${suitespec#*:} mkdir -p $mir/dists if [ $sname != $suite ]; then rm -f $mir/dists/$sname ln -s $suite $mir/dists/$sname fi cat >&3 <&1 >/dev/null || return 1 } t-restriction-x-dgit-unfinished () { echo 'unfinished test, or unfinished feature' return 1 } t-restriction-hint-testsuite-triggers () { : } work/tests/pkg-srcs/0000755000000000000000000000000014761250142011623 5ustar work/tests/pkg-srcs/example_1.0-1+absurd.debian.tar.xz0000644000000000000000000000277014761250142017645 0ustar 7zXZִF!t/O]2Hm^*OAh [ӽ lig6k @#ϐ < .l94UO$.IiR#hKip= *'^{Uk8>(t=I^xXB8-cvd7!)ʂAæVQdyM ~xYnbR$1OI'_<9e(Hr ̫ݤ>*B_Y 8<81}u,ҀhZ3|4y&Bv ׭,p⩴ӁiZ|%R$$;k d醥n˛AU:f6sz/X?\sW'I8 R,q =dbq.#)3Kgfx!IJDA;7F4bb+/{my=eJNlL5E:%a'&?qD'8#\k\R[xNV+KEjiy*"dom~b;:b,k=Tn6 OB>t 6j~p.EP}ሠ Xڿʜ8f<& .Y+Ƹ4;E]Ы!ET5du5pd;ל}K,oxNғ*3L\ Kfhdt TSC.;8Qt)o~fr0~f4"3q6C=5:_ +?y >FbAf 0^1kC-W1\@qd:.P _F%MP)\Zivs6eϑAީMغPàQ1s1D:iJߜ!HB%wo# ;>,iȮG?P4{7PZtq7 agYZwork/tests/pkg-srcs/example_1.0-1+absurd.dsc0000644000000000000000000000200314761250142015734 0ustar Format: 3.0 (quilt) Source: example Binary: example Architecture: all Version: 1.0-1+absurd Maintainer: Ian Jackson Standards-Version: 3.9.4.0 Build-Depends: debhelper (>= 8) Package-List: example deb devel extra arch=all Checksums-Sha1: 2bc730f941db49de57e9678fb0b07bd95507bb44 236 example_1.0.orig-docs.tar.gz 4bff9170ce9b10cb59937195c5ae2c73719fe150 373 example_1.0.orig.tar.gz 6ee4c2149fecb1924ffde88c034deefe6a4cee9d 1528 example_1.0-1+absurd.debian.tar.xz Checksums-Sha256: ad9671f6b25cdd9f0573f803f702448a45a45183db1d79701aa760bccbeed29c 236 example_1.0.orig-docs.tar.gz a3ef7c951152f3ec754f96fd483457aa88ba06df3084e6f1cc7c25b669567c17 373 example_1.0.orig.tar.gz 79702097c21c31773f7fa3b5d0f4e535e6d6a66952075185b81915bfb27a62a8 1528 example_1.0-1+absurd.debian.tar.xz Files: cb0cb5487b1e5bcb82547396b4fe93e5 236 example_1.0.orig-docs.tar.gz 599f47808a7754c66aea3cda1b3208d6 373 example_1.0.orig.tar.gz ed26c7be15f59fafbacffb505365731a 1528 example_1.0-1+absurd.debian.tar.xz work/tests/pkg-srcs/example_1.0-1+brokenmeta.debian.tar.xz0000644000000000000000000000243014761250142020505 0ustar 7zXZִF!t/O]2Hm^*OAh [ӽ4'–"D?۟1pi:o䇹6}]eUدr  D^Pf"u},EXCgK;Uo\0NZ+0q5$ ;Dl&#vi,M63\@s`Ua|=B+YbL:=k FϨ[K9oND7 |ZcraM8N-0{D^f:tKPFGEzb* %l/Ax֤ 0L诂 yDafz)kbY0Hca >-dN[m[ejw"qͥ7%cB h`lk"/ 5E"*mbH̖! jJF/:=jXV~IFYvP& %lX;dNEȾxڬ:o-s߉}]ԀbdZ;7aF $}:`Soz2/V,#t@t2[ _H$i,gjcN & B!+ pcZY@ !e[[lXO6ioe ,{e4 ,0U~Ri?hjj lwgz^v >{1; yvX5Lbۦq9yA&DvK=@=e Xrv5,vƣ#kX[>7p l#)<’ v9bP>u. A_oC3=ny52N$q<ĴWIɿ8$7g'g2֩-H Yl i@nO~%MK)Y) b%[W@ntp0y/8$F` ILJ FRƮ&l(ڠ"aHB~:nbLg z=Y.d[b?ASaox!CHhI@xobg8?q<69`+5.K׸p*ڄzhBB1U HAOt}w#WHg{L3yi1G hw&eO0BYyxk|9R(+зoC0a2&/7wyJ47  7|mgYZwork/tests/pkg-srcs/example_1.0-1+brokenmeta.dsc0000644000000000000000000000202314761250142016605 0ustar Format: 3.0 (quilt) Source: example Binary: example Architecture: all Version: 1.0-1+brokenmeta Maintainer: Ian Jackson Standards-Version: 3.9.4.0 Build-Depends: debhelper (>= 8) Package-List: example deb devel extra arch=all Checksums-Sha1: 2bc730f941db49de57e9678fb0b07bd95507bb44 236 example_1.0.orig-docs.tar.gz 4bff9170ce9b10cb59937195c5ae2c73719fe150 373 example_1.0.orig.tar.gz 0b7117415e1b3c2e3a9084ef07872c95085ec0aa 1304 example_1.0-1+brokenmeta.debian.tar.xz Checksums-Sha256: ad9671f6b25cdd9f0573f803f702448a45a45183db1d79701aa760bccbeed29c 236 example_1.0.orig-docs.tar.gz a3ef7c951152f3ec754f96fd483457aa88ba06df3084e6f1cc7c25b669567c17 373 example_1.0.orig.tar.gz 9383ffabb2a169c252529f2dea098c55d0956fdadba34a8617bfbff47091ac7f 1304 example_1.0-1+brokenmeta.debian.tar.xz Files: cb0cb5487b1e5bcb82547396b4fe93e5 236 example_1.0.orig-docs.tar.gz 599f47808a7754c66aea3cda1b3208d6 373 example_1.0.orig.tar.gz 48308be2bfae98f989e724fb3c52b397 1304 example_1.0-1+brokenmeta.debian.tar.xz work/tests/pkg-srcs/example_1.0-1.100.debian.tar.xz0000644000000000000000000000415414761250142016666 0ustar 7zXZִF!t/o,]2Hm^*OAh [ӽ?G 5^Ч=43Ҝ8\ti԰#ײ%U+Ԕ-g )qDI!J»xI%iRUniV"q$, ~.pDul>e^ rt f 4%ï_gWS9  ncdҕu'CNF\ZhQ2y>0`wcaޗF5_~fi{3M2$H\UOv>GoD."܋NjU`4Ą J_;0݁XwUrocV.n+5Q]e"38jnxuNKzHڻG /DJ|d&O-ԧu\೔yKl]oޛ6{>%!`{+UMwEP֗b5uRq1 "VND(5|A1(צ;zNH'?y554j~IWZbѢFF̯g+Y@][.Antk`rD긋 #| )\rUq.%a4 X_!NA q*RnuOx#D"/<0N&+Ͽ;AqϴJϷqYsh_b'b4jt&d&2_;7f+RjyY-p{x (=p4 )Bb09CS : cn~( ?|UQJfQ@2A~٠$g`cKrk-R$}d.R>ʮ[8'/m=uSkk]5iqHnj B{ i>dތ0*s0T4,1 +IS:%<bp]Dף~??#`%'}(D6kD"W=xNΓg685vk5L@4#fjڍFDH|Vn𣑟kUR\,(ӔBߖBg!ͪ2ӀٝÌk{4l H²NRQ j68!|Shi` oo(|^bݫ^ ~rG1=63p|_ [q>hyGTFӕ[91DilIe_C YB#9]alp]be?8wƕl7OkRUZ|8Zg\U3eQ9Yg<-'12>JgGGV}Pk"u7k&Q oK)#{e\aDI=f%F+z &3&IEYR?z%<}JڻSʄ`>U*`.@i_P\7eo`0i1V7e<;W9&$Y 3+r"brS_3-r(4I\R)32 1c ^J.6zA@Ԓtۦ@ "чBHt"Y |m^6U@mŢBZɭӉ2|DLLn9D{ͷcV-ɘPhtzPZ";Dy@rSaB LQRH #[LVZ,TgcXoV2[rs*0`%h PgYZwork/tests/pkg-srcs/example_1.0-1.100.dsc0000644000000000000000000000176714761250142014777 0ustar Format: 3.0 (quilt) Source: example Binary: example Architecture: all Version: 1.0-1.100 Maintainer: Ian Jackson Standards-Version: 3.9.4.0 Build-Depends: debhelper (>= 8) Package-List: example deb devel extra arch=all Checksums-Sha1: 2bc730f941db49de57e9678fb0b07bd95507bb44 236 example_1.0.orig-docs.tar.gz 4bff9170ce9b10cb59937195c5ae2c73719fe150 373 example_1.0.orig.tar.gz 94dbd51291d7534a9e50a2cebfb1f484999e877b 2156 example_1.0-1.100.debian.tar.xz Checksums-Sha256: ad9671f6b25cdd9f0573f803f702448a45a45183db1d79701aa760bccbeed29c 236 example_1.0.orig-docs.tar.gz a3ef7c951152f3ec754f96fd483457aa88ba06df3084e6f1cc7c25b669567c17 373 example_1.0.orig.tar.gz 1d76c05cc52b1bc517defb336b7d1e8e59651fc19cd6e303b88be45558adca08 2156 example_1.0-1.100.debian.tar.xz Files: cb0cb5487b1e5bcb82547396b4fe93e5 236 example_1.0.orig-docs.tar.gz 599f47808a7754c66aea3cda1b3208d6 373 example_1.0.orig.tar.gz 7f30fd213f0e30613615b2c196c48635 2156 example_1.0-1.100.debian.tar.xz work/tests/pkg-srcs/example_1.0-1.debian.tar.xz0000644000000000000000000000242414761250142016365 0ustar 7zXZִF!t/O]2Hm^*OAh [Ӽ]R,.x(V|jJe'{3[yΰFSŋ:*oxz*liUDŧN8n]wK#B[輀lP㋾?px/8_;3$e+ S=a>Jv-e4x%^A:B7LW/3;.jνQeimx`I=GQ=YG5GjՉzKͦc"*Vdez +vBr4%yfJzБWz&Gٽ^KT\sy LN/}q.ٿb )ƾ5t#ćiJP2}uɳ1? OD GU08/: B$5w ޔJzk.PCUWLF)h@n'l-Hd%,̝Qv <)>OBrU/9$MWh8f%>T,ҩl/Bg@O=pyƫ~5 @D0Ԓ|;G+4%S'?ͬXu}R_bdjJK+miO=2i mE=;fՉ/ڻk-w~ #rUf%QB=t"pcC(I[ *p< Standards-Version: 3.9.4.0 Build-Depends: debhelper (>= 8) Package-List: example deb devel extra arch=all Checksums-Sha1: 2bc730f941db49de57e9678fb0b07bd95507bb44 236 example_1.0.orig-docs.tar.gz 4bff9170ce9b10cb59937195c5ae2c73719fe150 373 example_1.0.orig.tar.gz 8d131c4fd924859e3462e48a33f669da15684992 1300 example_1.0-1.debian.tar.xz Checksums-Sha256: ad9671f6b25cdd9f0573f803f702448a45a45183db1d79701aa760bccbeed29c 236 example_1.0.orig-docs.tar.gz a3ef7c951152f3ec754f96fd483457aa88ba06df3084e6f1cc7c25b669567c17 373 example_1.0.orig.tar.gz 1bc840ae1b76b95ab375c962508a3b14f6958f9766e67c0ef06f5e7dd249d1c7 1300 example_1.0-1.debian.tar.xz Files: cb0cb5487b1e5bcb82547396b4fe93e5 236 example_1.0.orig-docs.tar.gz 599f47808a7754c66aea3cda1b3208d6 373 example_1.0.orig.tar.gz 593103737fe55b5fafcdc0eda5e7f761 1300 example_1.0-1.debian.tar.xz work/tests/pkg-srcs/example_1.0.orig-docs.tar.gz0000644000000000000000000000035414761250142016652 0ustar RdV 0]{hM즞jy(}͘g3-7F,SW[[_VWBQ } 5JH8[ۺI+)Eh?:+[lwdѻs]KЌB'? 'o W6ȯY#ONfr ->!         0{(work/tests/pkg-srcs/example_1.0.orig.tar.gz0000644000000000000000000000056514761250142015730 0ustar dV;O0=W?f6f@b"yTI@FQYj "9;9ڼͪ6 ؘmZKb;%ݒk*\DDŽq&T6fX=JOs93?Av>V ̈́njʂf??rauY ^iK_b:]Jݼ[U/s(?{aj/.?`=,'3/LfO8aOk|[Dc0':{f^LA7ZnUa@@@@@@@@@@@@78[(work/tests/pkg-srcs/example_1.1.orig.tar.gz0000644000000000000000000000062414761250142015725 0ustar LkY=O0=WPs1w@ TbNZIK+)@H $El&ʖ H0ֲ^AKy=@ +@ €)JFNQ>f?/ d8N06_V&S !8kfUQ^-_K.4Zsoˋ yP&=3M گ[RE9>_ʹ_c*2Tdͯ_^Qn?3?Ac/&']?_WBbo'46ԙXt\erS]+c6d_.s#   ȿ g,(work/tests/pkg-srcs/pari-extra_3-1.diff.gz0000644000000000000000000000446514761250142015541 0ustar Xr ;z tҙ:'%َK?.N Ef$TZ,) &7gWǥ  FЏz3Pjm?~y% ޔܱ%DI˄4 +d̢Fqzrxq¥<.eo{y5Ϸ021]p27ܨlͤm.`W -Ģ |97>Q2\:Ny t4k}E[ -3/&,[wZ `ƣ(hGh dgjb$Zz0Z&A Ji,W(5fA}s~NvˮAE0 "k[b/ }\HjQѰ>~[.$kbw2/ݔ)iSI8 ^"_]XWއ+E=rl̫? x4BfF#@Y ˅Pdu@׆ȅ1B.{1PlMVq)%L"Fo<LSbD Nwx}~]9w$Dk9deʡM'0WB_ <|Mdu,>JYh xL o* 8o}dJKĦ΋-69 c njQ0~bk̍\QAqhVAH|pkB$.& 0=\ccv^wbq )DxUx y)ԧ2xȠDtX=4*ADHcR^i;l:,̸\+%AÄ;ţ.pQNlpÚp"d?Fass);Bo~ $k11M> _HÝ?/>I?)Pfܒ{V['BJ?Zj˕ 2/jAC^<nۙi++p;x'w\a8 7 3'Kn,K-\pqW* QLM혤hx"=_$a8DFUJ{ ɧ7%cpt{~أS*j%^?yV ApGI94*Sօ + AsH5BzjͻMl Q@Ps716K%w)j 3!_T5VX\Hх/vL|=<7e- Standards-Version: 3.9.2.0 Build-Depends: debhelper (>= 5) Package-List: pari-extra deb math optional arch=all Checksums-Sha1: ff281e103ab11681324b0c694dd3514d78436c51 121 pari-extra_3.orig.tar.gz ca13e48c1b8e063bd33a8c897c44b2fa54c7b607 2357 pari-extra_3-1.diff.gz Checksums-Sha256: ac1ef39f9da80b582d1c0b2adfb09b041e3860ed20ddcf57a0e922e3305239df 121 pari-extra_3.orig.tar.gz 90b5f4bdda25d1bf39530cc14310f51d88c8696eef2589f4a7f5991596fe7b1d 2357 pari-extra_3-1.diff.gz Files: 76bcf03be979d3331f9051aa88439b8b 121 pari-extra_3.orig.tar.gz 264a508299ea6d57c6a386e26d9d6f49 2357 pari-extra_3-1.diff.gz work/tests/pkg-srcs/pari-extra_3-2~dummy1.diff.gz0000644000000000000000000000466614761250142017100 0ustar Xrܸ}|RNU!*.]mkdo*O AD @j4J'ߑiH[#[*[" 4OwF,F0<0 Yxz~U, F?L׿ÖڰZZpO^Kk"afV2R+(Sa!]]^`خqY% ,&g#ǐزi}t$>boyRXpU4Vu+I1)+#~^ |#wxܜ! Rci^:gi*aho+t1dg!;1"/(h8l6aƋ .ay=!]eIz YԱx=?e"T!S+66l ro@2*IzrFiA<ɟŠξ0h git9yw~!pE  "^D nP$e^t,u:) O zƾ(\ಫmĖy#m SВ=Y8rX);JS- >Ʉ[f썑6gGMF1Ϣh6ed4emj%Rڙw+Zz0:[.XlA8o_zb?SZļX+Y!l!*d(IJJ[ (e@w~?[&iGP6%ZOFp+کޏ]*A+ `s H5 kĞNfwb69`G!gl #3^G%@zqQ|^1fw2-.Q_Ф`|Hsi8v;|CWbڢ$"AϠq-W2+E %'Tk9)XUDCl _0%b,Nt@!\( 챭㑤~I nZ3s& }ꓥFŶ4R,טԘF{,+Q8([kt +dWk#NX*!B4`C6$}BZJ:BwBpX T'pPj6-;'s@XZOjKX^w:i?!03v,RX=X iF-i ,AHx׏7b`lPr7/w.bv]]j~Hjn]wME1^fҰ`/x?FU{9+Z3Ѭ_C Wy4{KjXV],ݵ42XT.0/۰9IImjZc(zu0tB ą#p*/쭻JZO{䓪.hTH(O@ٛH:(< -*HR }kms J>work/tests/pkg-srcs/pari-extra_3-2~dummy1.dsc0000644000000000000000000000142614761250142016311 0ustar Format: 1.0 Source: pari-extra Binary: pari-extra Architecture: all Version: 3-2~dummy1 Maintainer: Bill Allombert Standards-Version: 3.9.2.0 Build-Depends: debhelper (>= 5), package-does-not-exist Package-List: pari-extra deb math optional arch=all Checksums-Sha1: ff281e103ab11681324b0c694dd3514d78436c51 121 pari-extra_3.orig.tar.gz 335afa3b9e4b671a67d00e699be080df44fe08fa 2486 pari-extra_3-2~dummy1.diff.gz Checksums-Sha256: ac1ef39f9da80b582d1c0b2adfb09b041e3860ed20ddcf57a0e922e3305239df 121 pari-extra_3.orig.tar.gz 2365210b7a21a28659747188464ae1b5869accc714212f6d5d0c6632899c2ca0 2486 pari-extra_3-2~dummy1.diff.gz Files: 76bcf03be979d3331f9051aa88439b8b 121 pari-extra_3.orig.tar.gz 5a4ffde2059a1c4c7280bf63ca99991d 2486 pari-extra_3-2~dummy1.diff.gz work/tests/pkg-srcs/pari-extra_3.orig.tar.gz0000644000000000000000000000017114761250142016206 0ustar ;N1 @=^ MD576Z%{)ujswymSG92[HRsvOCyob yY~p'{(work/tests/pkg-srcs/ruby-rails-3.2_3.2.6-1.debian.tar.xz0000644000000000000000000000431414761250142017473 0ustar 7zXZִF!t/O]2Hm^*OAh [Ӽ]-_?;CڬS,tch$uM$M)P=a٩X+wN>υv,Ic#XNܠsnS;fXꎞT? V럃ESPğ1, zROԗKȧӮ9, A#;XW}z(3x#~P?:{y72so\ Y-aST/8T/[QNa)/E'F~D@&4R(˜PܺnDh`1>ۆH|4V S%7xX<)$pYXRW}yx$|s Sޗ.ǦBʋN;]ۚN03.0\HRdbdJz⦹٨(F?m#cMWN ZHեe?[gdrI.u*4:0X GQtx>faR w%h=7+ЃeЕOgHҦoet(݄|9ab iAY$γL9:aT 5dB2+7ɑ WHtk@AKxC@E|r.{Qnx5[=$O?ba0^(k̖)&ճ`)_:DaerP VbKhc]kiބ|b:'Kz (19ݒr~[H[N3) ߡ2% .X%t>irKWhԺPnK23 $vI&26/$ ǞZM8u_ٻ$;2p w7x܆1 Ji:>`Y<4դqL:qJyhu#a/P[ҸÛ?+zx+f:wBX UPލد8HN'ͅbAId>W?`jL}deU߻ޭJtxi&_ p bwuQ(ڰĄ)G-9yE3_|/r(Gh7i@aKYS =S ҏYQ .~v~X4kB#쭚gX7PƕO:?E % 0pY_z?'F81ڇ 붡f_v#FgYZwork/tests/pkg-srcs/ruby-rails-3.2_3.2.6-1.dsc0000644000000000000000000000225214761250142015574 0ustar Format: 3.0 (quilt) Source: ruby-rails-3.2 Binary: ruby-rails-3.2, rails3 Architecture: all Version: 3.2.6-1 Maintainer: Debian Ruby Extras Maintainers Uploaders: Antonio Terceiro Homepage: http://www.rubyonrails.org Standards-Version: 3.9.3 Vcs-Browser: http://git.debian.org/?p=pkg-ruby-extras/ruby-rails.git;a=summary Vcs-Git: git://git.debian.org/pkg-ruby-extras/ruby-rails-3.2.git Build-Depends: debhelper (>= 7.0.50~), gem2deb (>= 0.3.0~) Package-List: rails3 deb ruby optional arch=all ruby-rails-3.2 deb ruby optional arch=all Checksums-Sha1: f36c3866b22de8ff6875fdbbfbcfb8d18e1f5a89 953 ruby-rails-3.2_3.2.6.orig.tar.gz 5a6ca14c46eb4b9297f024675d43002751d560e7 2252 ruby-rails-3.2_3.2.6-1.debian.tar.xz Checksums-Sha256: 207cfb1ef70aa9458c776deeda8e38ac977cbc852209828793b27d55bebc7bea 953 ruby-rails-3.2_3.2.6.orig.tar.gz ab65b0fe41fff9abb87b538b5d526c2b47af27f784cf4cf2e8c01e399cde7b00 2252 ruby-rails-3.2_3.2.6-1.debian.tar.xz Files: 05a3954762c2a2101a10dd2efddf7000 953 ruby-rails-3.2_3.2.6.orig.tar.gz e1c519bb58a39d01f4dc6828985057fe 2252 ruby-rails-3.2_3.2.6-1.debian.tar.xz Ruby-Versions: all work/tests/pkg-srcs/ruby-rails-3.2_3.2.6.orig.tar.gz0000644000000000000000000000167114761250142017035 0ustar lOWM6Yb H[ 4!h!E!f-*Iqk[^g2AERC̛!5TO8H' !!3fy$,iM'ate6LL j a_S p:>,'%Y45x7;wr&<Œ/x <̡OoJ`Y_bzCBVq٠0qq>#ff!UCI: # GZ +$qe5ιʁ^qZ?=rD000EQ(9] 9b]Jex`F{4ҐNRvyR `elZ}oދ!=sX'A;= Z6W0Sdsݿ^)ZVGs6񕩫nr&WeGߑNo'CC(Tٝ6O/hff65)"h2Ѡ^yݕdfTRK<@=r}5lq EnZ9 +*KzPbmK٢m/\yVa._ PfK0G*.9iRVdǂmbIbC6[$b yv(ОL9Th]eV\ibPÏXvƪ?S_BU,(5hd-٘ʘ6n}Hj^Ҫ)ԦhYkUa/ dyn^df>yY=ͱu?oܧ%6K'cJүskzK]:mYcOT-ָ#1=dOwM|iՇqkAʿA 雰÷(@c(work/tests/pkg-srcs/sunxi-tools_1.2-2.~~dgittest.debian.tar.xz0000644000000000000000000001143414761250142021464 0ustar 7zXZִF!t/]2Hm^*OAh [Ӽłq`tPSh}ɋ#mU^Br 6UF1{7C㿳Śf$b[zC4Ul!Q=` n7" XmBƩ}]&f\U&?D`ih& C {PVtvBM.zl0҄0*X/wxKG%*f-+\M6;@rS2-F".pRY-t}tٛL^WmXQl(3hczV={^Vo`4cO|Q*㹢dH^+CIz YkD|XFΕE;`ƪ+?߈?gd,҉-dB23 rx{i:V.-'lV1C2mIT10Onw,Fóm:C2TmK:4};Ȗ_%C@@h5;BȪC]Y,a٧7-E0!0kGѦ GQfUCd5$;JNŕG1mGpOL fpD 9#pA.)br5{n-Jk~K3OIU#}hPIҶʠd[\7 (=&)O]Y9ٹRG}έ'x/Z  ‚Cأk -)Whb_ݠ5IڨFT,0d3ܟ]ec.(A崔|z-Lz"T% IP + }wrV|v/b, m Qf.ԝkX?`]MXG+.r4ihDu"$w'VJ/'Omy?U~5"R91vAXaIU$wBgQ 5\k@ {xF`+\<5X*[ :+15E\cZF4ny#سG%+SXq!9ZXG,a ,yj89dtP}DhF>M6'^[?Et)+X؂eHL ؚ4h>5BœJ|m@V싘I^:)jPOr=Q{me`ָ7r(ltk [z]i~DhW%;~MNτx`G1t:,m)< F{Чʳzy(Ykl2rٿ^z&ZγlHU?L%x[z$Ո!+bu},ȤJ;4IQ'~`D: zA|eK5aL1OVsVVnm`GG3!j$vGJc`h. use&d00V+ ktI0IC)rݵ]ރZHSdzEqebL~9+#-էYAl; )Hpi؞ /u&y^z)MnxGO[>C7T6-luFlaE"<&L FD18g$Ռ؋-7Via?c*!X7,ỗUb ,^J<%πcE_x|g?% ."8RQ4ikcU\˗ޭf;̈JRLQW A l9Q9Éh<^էjc4 sΪ5y6zPcDШBԢ"Y=NoY$6O">jϩRw;:.h&e.Uȟndqc0Bȿ+fܲD FРШu˸]UsRWN"6ZqaQ\+PC[Wi^F=/7O!(dAlu SKHJiₔl*_nf˒RA=Q4٢́=fڃse8J>dH,9nZO1oK!1qײ2p=u͓f-y< _1"9٠ŚUL-  -[~CId8;\vϰvr9ZK]74@{%+[SE?k"TqzHn y@o)I+|3ώlW<u,&i2@5̵tiŸ5;-Y^{)Rt<@`WseeU Xym`gGa!h$"z3FU?1%#pB2s_I*z;w.I@\s|x} F%XRyG a,5lYJ(mC%VΣds,3CqX".7( ', aK'vk]!587+b6Y~G?S*C2Qdh`K'U>Lqcj*IJE+ WS1 ӞsfQ×9LOHf ;KsD[5!ͱmR`K:dҞE/O]$YMw9،j#RqF*-$3uR>Ԥ8Gς]P*r;NM!4"džP/ŷ .(7['Lf 8tχ^Q/ 6$]ݫcKhg,.ɘ@5e66)3 ԋ[/c}F:/Rp=n=8vevVTq̽DpH3f?ЇOs!֘ഌ`IT􈈿\⹠(hYjv2pӦs3Z]%{ -HT3vp=~W1Z`N㾨9qOM:?")۶1;,]O:7d9԰\oҲ0|8nvu h<( !! c_Hn" g8d?? ۫q5@G:l0Sf>6:PdM*;JGgcy⢠Wk-dIZeq,@ƟrR*NGDY\k9Ub% ^03``07Ywr5%gYZwork/tests/pkg-srcs/sunxi-tools_1.2-2.~~dgittest.dsc0000644000000000000000000000203014761250142017556 0ustar Format: 3.0 (quilt) Source: sunxi-tools Binary: sunxi-tools Architecture: any Version: 1.2-2.~~dgittest Maintainer: Ian Campbell Homepage: http://linux-sunxi.org/Sunxi-tools Standards-Version: 3.9.5 Vcs-Browser: http://git.debian.org/?p=collab-maint/sunxi-tools.git Vcs-Git: git://git.debian.org/collab-maint/sunxi-tools.git Build-Depends: debhelper (>= 9), pkg-config, libusb-1.0-0-dev, u-boot-tools Package-List: sunxi-tools deb utils optional arch=any Checksums-Sha1: 2457216dbbf5552c413753f7211f7be3db6aff54 35076 sunxi-tools_1.2.orig.tar.gz 491322a7e377365cf53104b5dda6a30ede0c01f7 4892 sunxi-tools_1.2-2.~~dgittest.debian.tar.xz Checksums-Sha256: 03a63203ff79389e728d88ad705e546aa6362a6d08b9901392acb8639998ef95 35076 sunxi-tools_1.2.orig.tar.gz 33b627e8958f1bc6d2a9bf1d1a042ac808924d860c09272989067fd57b9fb8e6 4892 sunxi-tools_1.2-2.~~dgittest.debian.tar.xz Files: dbc55f60559f9db497559176c3c753dd 35076 sunxi-tools_1.2.orig.tar.gz 528d6bb421ba55aa1cec176298f8f14c 4892 sunxi-tools_1.2-2.~~dgittest.debian.tar.xz work/tests/pkg-srcs/sunxi-tools_1.2.orig.tar.gz0000644000000000000000000010440414761250142016600 0ustar []sF)DE3,I\(w%J!8~!x1d{{ڤn21>ZG_Hi}iS|޾}7^:;sߟ]\^Z>-Gy^~k=f\dx;oS|nlt]x]W}c>ʾ&w42IIIgy4_LUßDijhdiVB^'6YX./%M^ji%GL8.Z_mLV%b}Q)Vw;db9jQEz Q[G3i~WD@ՕtIUmҴ'-ZShgbLtTc:@seB|QD+i\z,sUY)H:+^;d-f9ln`P`,lR{ҳ(c^7Zha;-lZ&/D_H,TOHA n ٩Z8 >T(;4*(2z}ؙN`KPc3ɜ/]t$ϴIUh)X` +6g-c= gB%m̼^ņv_7iOK;CΖ3Jz@!IȈlaLXV)d0MƞphE夕`eUWM)hF%o>3EaXa2MR}hgګPȉɜ̗EqkZXVV!!SW02`#>Z/g[eF ,Wr#M/wl:慧*<ӃIt%LkVi(b0))W g%{:-N8WIlKfO ?3 [,ddajps΂3KP{B0WN1\AaF)-lhA ש ļx`yN̡$(@+NEW3!siI 4zBr;,XW%'1[zn:|Hr D̍I%Rsrfaw[9{)}~D0Oqݹ ǻ( 13C;:$-&Y mвX3oUMN7B\U#z=1q7 A1!_a9H15)9=CScD&qEM :G1⓮$hGFVTi/K$T3FYWMG*Z6ԐzCM:CVH P14`Xhɬ+9afMl&08"U4y4JV 0b̚\,A=%Y Q܊RԚ Pbo֊0ljEC`V|`s(͡]qj֒=dA]n,#uv-k79I9И]!k1_}4[yc9U`|tMIdÊJ=;.C{;cLESi}#. O"Er$9lYۙa)O-1Gv(rPaC& 6<չ 3?e4VuZﬤ:k+:c|NQ ^!FDR{cR.d@OZ>g+iTVUQBq#"lR{Rdzz!#$sQi \%|AJP"{ʲBt.KF7p_. ࢘xVۇ~^p=>b^ڬ.aa\5imsb^b" יp%V.Iux ukKK k#A<7~층YD=^\2͕l S%5aX>TZ+zf!DGd qWQ8`[AT b vŽ&=i+q#[GS*ԖhHoszS"T&mS8x,-T[ nZ#R X%W;+Rmd!|UET_(KKl;5QʭNN@ƩTa ˤ+ ֽҒ(nj )}MDH ;h.Ά^$U(EIoJფo# 8>"'H?iE9^[*6AhZP'QmIͷ6 S)ԣJQ7~87J7_5w4kQ0ϜOI{hSo&AߥS]!e΃+xkD০8^%մa;Ͱ[_&Q0#`=Dة.gQO;9J2KK _|iT8 l:;͖43c\.|@j;$,%mO?NYͣ %+SYALgQ Z2gŸk]̹$"%n"PңkB4rȥWS"}\Ze&HCLh+BQǪΜ.\׶]A|9z5CH4jח.G=TJ]ZY.L"kYap ̓,+Yn"Y2%l6ꖧi#p&SvmXc?ue ׎=(;=5 _;]ngh"=4~cE3:=/0c 4O 9nl =& mPTq \jr-=$Zv'xܸ6:S؝v#w-]jj[:B3Qy`7ÃqU`e+J҅j b{nϥǹZf NME02\4H@ҬA-t!hiA %Jk>H.6X! OIWLb|mUJ($T^~ұbaw.%Ђ`}ĩ ca-QuCr߼J%IґUw)]XkE˭&Ԓl9ncm>abp\P/Mk!P uJ}!S8TF(+nLRiR_:q%kFȸ[[c^k\<7z议ᮕ'X!ca#α!*?$M>i&[>ґ6eJsx]pPz4ɪJF9d`eUxi蒛k.(7&v"z&Rq2B|*a `?OPo9y}.XbMkpӾHCXu$cU^S<˦ >UwX _ \pӏKZ2qJ OR/oA86)frԖ7&p`&UIOߦE ĄTx,ݟZuUprf*_ m*Sݸw̞kI )7.Hq/[Vo\AC;>7TCL/ l떊wJ)H_p57I`Z߳MtZTZ;_H![;.W`y&nˁZfA,K]Zחmi?!=QyGZGy73zdj9\g6DuEXr+Tf/gicG?xCΣZw{-L-b'I H~C#_r28-F[>_ؠr<&7"RnٛJ{~~FvWy]ӯ`CHBI_>OѨ7|f8uiד}8z0QnCCF}ZESX:'?L&=>b]_>A_chO3P &ސFsG'Mt~Q?FA@/6SG1>ҟOxb76tt}_a=(`x}tãWa0Hէ' m+ïA0},ڟyzm0:{W$+3`@ Ttӻ};6>ڍw=]߉TE??DNbЩ|lmmgoqs]=pȤb}էգbw]_?Z5'8`JQ/{`to{юd[l|aЃ[uiO{ϲǑre탣 8= pIAdE==zG=xfF/͗#* a̬GWO%A(Dt#*+++*3;j?``*ރb#NiFKs 5pc ZI# { 0ªb #ŅؔX[j.q–O2*8mB3Gz52&)? qHJO Ƚ} iGSEEbxubo2'l[k_QVVaЅ͛8A&7΄;gdQ[0&E>G)ÎkYrH~b!*Ce'd' ?E"e W}O I|Ċҫ9SCn=d]^# gzPI$GHvAN0 ()s~`ĭI]1Gxz'!x7G7ǠQ"5O90 =8a02MuGc0D lЃ8S VjY:aqЈPRSQg.g7|anȃm) z#V:]]QZ!(&,@4:_42-q/ J ='$&x[8Pɣ Xi^fuBף&(2\ P8ՁaJC~cCsUq u\" /sﲑPEҌ8݊)yOޢv)CM)IkR Ndc1hM_]X*(^_zk7kKOdvlw6‹y3Gkǡ%soCv:;0s _t76u0qƎ^x[XAV |8D9&"1q<xi3v7h8{ޥ8u݇;: M&ӱ\0*}P|W| c{ '@"]5 CfUt9X 4\Њ8Ŋ?Lص ÐW\e$N10 U“Q|8ߥ26Ϩ k`*K$_Lh 0v>> x?WDZWQγɱ K2gC׋X,l,ġzxa(-T%P ^3nU_*zUz5Ȇ hQ ik>6vef&~uEl/Hbj6j6XV *b:w614&|\74KJ>CRpi0έ1- -#o'ecd~׾|1Ԇ( O~UcJŃ$$p_j> `SX|m\gE1zrc2!1lBǘ6f5Xr8):G)| SSE9_Q8&c9MQlL$ }ܩHg$h+{:ij]eIAӁn:_P:n+,6QPԣ HyMajZ[ɢ8;כVμ=+k kc#켶_o^9Ut~OSP{tOYǂc67?>=\Guv:;{?4[Vٜ]FGÀb\;{8'Q VC8/2 ;s}XFƊ ^IRo=l9^\n@xyPIgnp.| ݁7Hq0fU(1J?`x_ٝ`7HuxWO*y/f؋W!d8ռV26B~+=Î> |x7,H?#}diG^GxgyKqw!0xnqn kcLG=VqB頰$QbJ +O>jthy'"9Yax9" jm>|,p͊^s/hD:9c4ʏ Ϝl@AchMw[C{1vEu xZz?>7iU P.Q7Gnm Br-lhh̃PvZivy`pQφ{~IJr qxv/5.y,fr KN9 :G~kp5;C[:*~Zoe,R=#]Ut⣟p|~hQ~f7.yd'uᇠ W'eZBIL\uk'ą GL Ujn]l; : :ETm2(\qfv?F7uJ_@Hd0R[ƽVG|~fG_C(SK /LЁDxQ0 O~⬩)9,P7T5O#IST|Z9IIjWM`O|A)J"sJbDI%m ƋX׌ M~v{9y]b%xNa1]*@tFxm2N2i>1> ;E& gn8c[Q&퓏3IA/:~&vf@XKl%6[yL3iyАXZ|L9ytv8r]K&n ^7r<_{i"iVli#ENI)vy?Sї uw{`ZX^<.$ѫg-}IQ #EKCoOOKZ/LdITN$~Q%'ГIP f\ qjC+(v$9X4Lx'")Qb┞KLI,A"_u2X^ZTz3an{Ӱ8ݡ[awC艒x]⫠(_%'(G Hr%r$k4x4rqL8W:/ <&F#єLde%/)CT/aoq{v`q{3H|T{uSUWRh(cZ&&rꙜ:LT$a) PHRda;;o;>{ݝ{ZY<T ҡNBb hE}y #' e܍uxz!j_o^Q+FYbsRA©?»F/tRFe6wk|o'8RQD^&oKd@Zo{EzQR4XDo9ȷ!\'\( -^>/x&Eh@\Ǫ;$D.- ٖ֬,/u/l}Y*[_X[b:jE-tJ3/>*w B܃{[8 fvsJ 'UM@Jv,1==LgRf&IigR2)OY XŌ쵈/irs=lR|GDh肑x"YʩBALVwYW3j@d2Q}OjcnpLHGgTɩc"5YV4elV4'2|BorLЙe^/2QQXS$SzYk A/@4h\hNѼDKњu =D{< y ̺DCјq 9D3Ú'4FOeSkE* V_ss.&m ݽn̺96LN7h[NA  VlnS(( ƪHɵc>A ˉbrxW|Xjx\yQ` dlWe57UǀH[i~uש`fy-JуJq$*XT7$"dX|[NF ]Vu 6WWC_?* M1ri8~{^&wVǼߑw|̉w]HڪqDUԗH~n#+ᛕ֨f&HKq3 ϣqq;h`^4%RCa76+o%kQ\Rώ*}r<4IaLn/({sd2WO@ λC ^R'6,TZ ҜjNM4? dK:CLc4`oH:AG-Iݖ55T΍ բ^Y!1A$쾤AI2nQ ֮(ʈ w. +π޸Ҭ::? CD9UPGO(=\cYMwE*i=rF!v~JʁA I|(tZ@ 5)ŋTcl?(yT?ۦ۾`a$ -:ԼLV{v9/hA?ՄȟNwy"!hu`  E0nt ls@h1jPg4)429g̿ @AḓPĨIQ_ Hҽ[_g"Pnj<:(?qR]BV@q|B̚| EDGI .xOtX\䀨} a5 N!#*}}wZ$F'Gq A/ZaCl2kکˢACu;K IpJA.1{Y2bTCt'e#JVtKX_q'CoX\-O7V};VU= |sIE*PX* KU\2\1˶2R ۩p[G;S[X+KH9$ Q@yrUTn=߽6/M}ֿ\_ZZ_)L?N7_QIJ1Lq4]`i b_Oj mgMSOPkNiV "Ԁ?ؚ  /!,_ #Lѻ뿴t^Ko(ݸ0} 6Un5:_ z_T<=&V@1N[s&?I>b-I4S{Un?cFPʟHɠkwBAЦڮҭ(g^|89A] {ƞI&RebX)CP,'`0@T\ Y};@" #="5epùfp@7mzvZi*?zR1ޮ<*h謹4 r Xq+q+2֧لyp騷 &WEp[9K:5  iI9|<|j 9 +i%Rpɟf;JM (͈HZ)T hICZμyl$XZXTX߯.)DpDѶtLƩD*Na9xJi^2b3U$2DG#Si<f2P%+0CE,uQ R􁐷d=kJȧP0v&V`~F܅~Hda`S0/WhXHOO6̲ YtY,z`LrB']:>­'L?C.R.S$  FJF3Di,8V-BߋN,]e膘89@Q^zx$X2lC@d-1V@Ўtš#ֆ2=w?} u`BQ08&,AD8cfy DegḘ̌WXߓ4˖LXRUʥE`{a4Ĝp`s͌l0/3#;cw?Z˷$65!&ЂX"2rX}Lk"&|>oPW/z7V@OJg:oˤM>C^,Ϯ9z\pB~B<#Nѧ:yG Z65ͳ45wBS(uq54r>we{ޟZZCTVQI|ʸuhTjxzI0a  zK`^SX3>o386\)rG8ֿ!: OQ_, K<`(YA4<>G(-29Yn͜l}=Bul[jPINc:8<#–oa"lQjB\L9t}C9IdjbYtu=9ԂU7hH/<Ʀ82zLӠf ESMaFݴF=h%438''ԍUr[eo od 3z{LJ"l撉;'6ҩ>>t5ʀ3QL{\Rk+9"wsуd wQ*5_UF H3aI[< v|k,B'}t2SgFւ^fLcīPUm$ɺnKKhZfɅqL@Suzi(+HW);LcjCPNs2;WqL]ֶή#@dnk`?B ԁ@ݻ\rilT/Gc󩭾QG`܂ipU'O,b,Վa)H_#';j4KhީSߖ$1U}Ԕ=LQ.'Xԗ \M!:>Cw\זN^!BU>f/ 7Ai\{JԽ?_bR5q3hBAe`td?p p:l6s.n4P LKU];+ooo?ě>cT~ ܄E\]8oOǙ;y]/ *x$40H>cN|u!%ؓ BZqȇ淜FΊBQ4WI!UqmD9q*_~rm1#w#"O3~>e{my/o >$Fl-kl+K:H⊏p04 G}%dz>!W>Q#Ȅ8X{yL \66g7B5"1zۓ#d܋jo駎ݐF͠sv2*"{ػ}W|?;[6eJy]I yg%nt"^[1ʡ)a xR*a(`'Md {MiHPC[ Y]kZxV(Ug5)kMCk|'[5 H3!WRڌ1YDWٯH[cU)2g\:/><ư!؜lXDD!RxpPq'(QnšZE14B6$e_R6WasUiR|w4U& /mhBn8aoşiv%2IcWi"ZKP.Zd55Vsu܌pO6ab$iopi#[m=] &dr7ԗ]21][ra!y^|Fj6S*yfy!/Lz'0ȪqΛ JȔ`BWR! i0iۜ0}.}HJm|nevgLHx |l66 Dh*aʢ17㹡mwm$N0zԎ?IYQ}:lH·|)oL~JE|[ZT٭FV{LJ GK. d1I.wXUvd`2ȥA.#0:0|mi͎1T+тQ.tӮS֬9=nxLB`Hq5 ,mq5B5sԇ`4JI j r}$0@4gBA{UEJyf-ZE(Z:tXQRѵ6B+NOB!nNt!r_+09C+(IJo_ۼGgoz?_9xNpoAʭƗ'ϲ`g!G'[* 7873FBf;o,OjC>SˋaBi4oO1Nۻw6w+[{<<]Ѽ3&.Ǐ+a-6~K+&jw_;A+, 5 wR6rdCWfw.tn:hP'X}'g7[+Q+i_|}`LnW.2U?pJB:رSK N]Yԕ%HJ}U*VW +=v"99jQDP0RboJCU|ܖ_ZZ+SϷG⿔ĿJlJs9=]pi14 G~ b׋b vߑ/Nq_p(@ 0isAIGVRb)9/VDjbw2 |BU=+W3F'1- ?a! 1tk"Aq\藉Bti_xa#ɫ[+ϥEL}\E1x[sXNDd~m~*eTvwe7y'H0mzWLMOj Ow:?i;/k-\76 % U= \vh]]UjbIIG:dt"8 0]nM? 'N̉fgBQ_0&}XP(yfAiuN,GXCͪp*?6)Iy_yb D ͷvDbr2U5 ~V9Zp7{W2|#]{{H"Ϋ'EB[{Y}<+KIOTkO]Y)}pn>|3.Q,$BENw6 p*CcZy`g敥LFpuJ.̋draAHGUTvE0I;F[ @P,T6z?=W"G7{@ޛБݷmomo!;:ޡ?HS[o<&[gHbA &֯ v&TԎF@Vzpu 7r>s\rApOI>q5<9$`;rЭyԌ`L}VhV9vQ5a8M;^h{aᓿ΋_ŋ_O?O?|_'?zj~㟿~:<*>ŕcC+oH cLGY2ȓp p R%NoyY`*D{x~VUNh0PM. n^/hh'*Cb6wG.:.H02}ek< 2I/,J(O+>d{EloSKnI[YMTSx4N+JRˤf+DS%˥Rs!MPΧHP[X^~AN|ş/'Ƕki|=u1z[8F`DΦr\?uT#?[85O4xNz]<^'O_;~uh[eO/VG|(}w#N_?10/~} 3/L5rH-ic'dSK#kQ{L-w?o?~Bɞ M`EL{k6c#c2>1wP?̹B 6iN w1y/\W`+Y`ɱs=bzq#?G +ߋOS>?W/iLH(Jy2jc^/Ѵ (CˋsCT@e?,C[dRrCREJcJdzr1g, ġ:{-bESuQ7A'UwXw@&NO?|_x U'2A>7/??g4PA2s3(5s]ǠE+_~ߠLPyVaqE4Ś\3C]ٟOO;9ioZ>@/d׿+_>-4~ԠA0~O$ei]QdǶ66V= /ؿ.]X0/^__ſ$Ɔ%b% D:U^ptƒsǃ *4KW\@+$ q_ TBJ&WjaKI913e1z㮤`At |F]@T"]e's΀ÓGQQ`A N`Q0~v[ X L hv(\Q)hONv,9;sM ,_4nA φc䃒ꯌ ܐI K7*pN+C_*4K\ s:!퐜l.Y$Քb)ql'WA9l,j_'߭/[Y\/NoO+ޚ)5AvPh2 ޠn.ɣ՗6j)*V|fN>=tB4cKjӌ:߾ݾOOl0fx[2($бѨ`a'~zC@ b\}ӆ3YW%*9d,lܓ,)P9RDhGAV-vg8F +]>OPn39c0Y߶gX4CǶ5s7 :cOp%q|1qP 4y] i>$ [N֜(,(ahdbHl>#LZɬ\,*(uMNJ f/΂\2N=rՇqMi_Qd̜ n&5 5mOQ@aD.L&EMb05)-Ϛp9ПgtP/BQ3 x{ !d\}yiAx7`2 r3`3S a@vj#v 1FEG .ǘu `4@N ä`<֌ඬ7Ya+iΙ%$cҢfo;_5 ̃b2JC1zl&T#9n<#*ka4*$Hqd7xiz#m`m#sv,EWw_S<*o7v3!?a*}ZKQ1~sYx>,N:PqTq0[x?o @dЂxPHP/%x2=h cDAұlYm@Ho!OWTDk3}Ѱ X9$WY iw|| P=vsxd }Ԍ]>аLf%D(sH: c' ӆ0H\h3Z?X,0,jx0v棌eMh<-bIuUv䱞E~: Duc_߬st XXI&e;a%o_6AK4˶r8gt{`z햷W8Ǜs!ݠƗjN $օ̐mIsJzЄz}8F퇉0ͬ:bu5lh6t:AyYANqS& c?(/l ujqk7a zvA EޓmBg+tݦ~%n}wغ EMъvLYZ-!oomWXy#$%c=0h= Kp=SDV_* EpVb)]hLlxj̒76ދqAqf(Dހ?o-_`J^QVJPC>LsRՇARDzPz ۤ"R`ӛֱ>̅$=6Y/VT-YHO9( j 0>+ av_v)Ҧ6"h:=;pS;7m| v 7>6I ,e !ഓp|K!?iBP .@9(vP:4\eWA? Eur]~K"՗Uݻޞ̬ggf6k#~Nlw~!GrkdcT ⣏乆 $LmIjȄyLo9IMj0#+ '@;(9s( 6NB5t$<y;-Lމ=1pY} aF~WmEZB `f""\#A +rv](!CSlCQ$*ˠVXxS%3fIB 4;\o}eƖ$ўU豣 7=8<[&=#B?԰7lS6pocHluڍasT4ނY'dD,~{ZEVAAAfDMo`+Vk6Rj ȉOX|ד d {9QX9Q\ G)O,aQGIОXXowxgoJγD`hw1G-'".{^RfҕYf];E:ρ ҍ-U>)zR:ݦu)Av^aN.kcе_v>"w5pwOyFrEh\yfy*gcxU+ wiBe4.͠'C1EF(m硳ddã;lgt9~!saÜxgq9*${C09o;ӹuOPºҔ9g%64fBM}`eӘw6Ľrf*2ܷװkB&=n m`RՕZ +7`흐sN4;v~ D~[Բ ʈN3>w!F< cȰӀ;2W_J7jׯ͚yT^^,-O>`-x'=k{4kߩů1F!j#KMbo7eՊsK]3Dg!/:a'*! læu&*$.Ə'!D=aBX[վ;f\hZXG9*e٩zн\QT=r}['r߫*A?YyYxjCzy%+b pް]{8zh/6&kop9NQ ?ξ_ ]YT!{v M Oğh)?yY73|'xط4d,SE;ܣyCMKzy"H{ ~6G1cQM|"wW>)9ū5ߜTǝLk2VeiWeN"Sݶ~5 ǣ-WFӕ*~h'=.8K]o*E{&ٚjTY.Cҝ$EG.d)zCY'b9=,).wVv𛏷AQ}vݽ⣏f,Ǖ;܇*B&) =xX!vRzZ#ɑdY'LJ<9@Dl6~Χal3M"K4G2鵛~cx_sݦp T{j7e='iGӵ.SuRTa!nb<%(<1|<^m;2`u#'[נos!CH [RTYHk]o<,f`Jx޻}6X Gh5W [Lf(5I17455ITv%O|_"AûcH“OMg!눾&.l԰6 teS@MZ3)Uty+5Ieb;VÖBtGRGo1?gwSXY*݋,?gך = Q9xNpoAEno \w+l(.)ҮtMu_4\x]uڂjL=2V$I+Zd=`@Rc}ji>i½ w<:aUǗM2/U݇SZ0 K86B=T㚵헶$(+DZd5PI4Olk65s+}2un`lϵ"ZJ>Jؔ] ^GU/WG.pT\!\-o[3^D2g:4@i KU]M4qWU p 'Z.}1! lZw]jh5X)ol{b&gvYN;YW9׃>YՃ35OWs^#/d/bfJQ _!'T*Jue1dXSfwz:鐨 :RaVU\no t]\?0՟2N۫`UZmj退j֘׃cP6F'T(1RfB$FB_LǔMFk[9NǠFք8)p\pݑ֢t}r0+ڣv;\;N"-Dzn=}sO}"בBXfP%wʌ9l5Z)T*ȺCOlՙ.VL!Pn5Ty= BՈfLNGQS=Rg>Z=WJ\:̨3!syRY8* M <`&g_Lj&_nWORdfO:ueN5%f=Zߣ~ύFi10/'cDDLٴ!6]T,zzU K4kkŕ+L"آ|=ȘxN$?c2PL])HϲG"aH妦,& #I19U1J$E[m5OM69E8rqGQ"YtUH5}sǎrVZiʞJF'W5yiS{]Y5m ~,Ri`,Ф-[GJBǘLjRL~/f"lku.eY%((琐0p2]24ⲱaKt` J:6U7E\tp&b\vюUV`AxN=h!Vs LםP!\]}Kyc`}Ϥc~ 9a`HB/>8dΕMlK]!'Z${h#,f>_rIuZo;BsGOx a:~&S= V?(ؠƍ4&3 #dgV8b}o(f˙xx)ޅʥ4ЦOΈ;F-8K7>sBT:"ݎOaL?7@ A0{AAꠉz02H$(wDxX6!o[*ȭvk > F' {d,SpD+ @@:-[8h3*snF/ߞ ճFpy{KQ^i*M忩7&F%M8b6~gʣDiyyQ8%}om{pR dRJ{HEג s6Vn{b|¬Xɀ>|nDs 'e <=⥓b.^' h?쯉[Q/5E W^NAqe7G2(,VPw؈l rRI)[ꟃI{t:-Iޠ[A_?gdp g͊jo~WN0e4xn`%ZrZ=?V'D \H<WeT+U )Y{2|z'KClJBa"| JLmSy}Q7/~e x(ƫ] uNZw1FvBqgfpK(GY1R9c"ƨK*Sp9S^B_QL˘xsXOjMI2ڲ0lHx{f}$ 6Fk7[=CG]jg^&^EJ+.\j03B)A59&oJBڹ&slhn,h=X+ÞFqө5yWB]Z#h"ҋΘFIDyeQx> UqB{²:6/FL7jdGEWɍ9bi<9>,zXGX`}R Y(D뮳Uv]Gڵ$'jĦpLsˈ VTRAHcsEy,:OÌ ?Tn$z.==P"f"gT촒H bknm?3LEÃb:~Nf-[zSг  aiO`Fєg0WT % қȐp".4?D"ДM_)g-22X{PQQ/QۯX&|ۋNIfy.s&Mj6R6vfT5gAW ͘ ڡ 횔֧IpOcDTX)0ARlHuJȺl%K ҁk(㼥 Ϲސ''6!$] IwuC Io^ Iέ/$ߴ'c=3, uX^p"T_ԟpt{0cDϷn5 >*9}J(~V(-/Gx!'*ErV=3o{|iDg.N1Ŝa0[fCِ]'8l}kjЃv]x6kW` \! U4a@V.l n8^kc7Yo7„/21 \jDR#"yV V# ãMS)?QXĈĆss3h;"ԲɐOxl:L\E;BO_o6JQ%?:$"iC<vfYܬa)Qj1)Dt V0_\!V0ȞF|޵$Z %U]ܲ, pl*hLGN{mlLɂ2ۺ [mc:AoEt(R@!Xj<3pކ5C|EA2<;։W/9] Fތj Z76;Nk$01?uEֹq Zt ``;}T}2UKK\N=wJ휞A}\r2I7Τ{b>6 ye͢nYd$SLY˳<_iǑ:BIGG尝Lxdqz9''3{ϊ'1e{˱? 0_),4 3Nw^$>GD5ny\EN&YG_/!M|ۚ'<_ӠZrp.j-cK`d2|C.a ͜Hr tRSq$e0YbLɠ_9 DѴTv )6bN*_ &}H _й߁AVi LBRvY|tM}g&+ET!! nE81@'\bT̥**@##RULtDfjH`۟,X}\J EQ.B͈fTj֩衁(\5RNpғVta&ޭ6${֬#AGt sVyʠlTe,J JUQ f W+U4 dM@K [+0*A9(LzEoo7Mӿo7Mӿo7Mӿo72work/tests/playtree-save-refs0000755000000000000000000000034614761250142013541 0ustar #!/bin/bash set -e set -o pipefail find -name .git -type d -exec sh -xec ' cd "$1" git for-each-ref \ --format='\''update refs/dgit-test-keep/g%(objectname) %(objectname)'\'' \ ' x "{}" \; | \ sort -u | git update-ref --stdin work/tests/pretend-pbuilder0000755000000000000000000000125414761250142013267 0ustar #!/usr/bin/perl use strict; use warnings; use Getopt::Long; my $operation = shift; die "pbuilder: you should use me only to build, dgit" unless ($operation eq "build" || $operation eq "b"); my $debbuildopts = undef; my $distribution = undef; GetOptions('debbuildopts=s' => \$debbuildopts, 'distribution=s' => \$distribution) or die; # ignore user args; last argument has to be the .dsc filename my $dsc = $ARGV[-1]; die "pbuilder: last argument has wrong file extension" unless ($dsc =~ m/^(.*)_.*\.dsc$/); system "dpkg-source -x $dsc pbuilder"; chdir 'pbuilder'; system <&2 "run-all: unknown option $1"; exit 20 ;; *) break ;; esac done ncpus=$(nproc || echo 1) jcpus=-j$(( ncpus * 167 / 100 )) if [ "x$DGIT_TESTS_TMPDIR" != x ]; then tmpdir="$PWD" tmpdir="${tmpdir#/}" tmpdir="${tmpdir//!/!#!}" tmpdir="${tmpdir//\//!}" tmpdir="$DGIT_TESTS_TMPDIR/$tmpdir" rm -f tests/tmp ln -ns -- "$tmpdir" tests/tmp else tmpdir=tests/tmp fi case "$DGIT_TESTS_PROGRESSIVE" in ''|n) rm -rf -- "$tmpdir" ;; esac mkdir -p -- "$tmpdir" case "$1" in :) shift if [ $# = 0 ]; then exit 0; fi ;; esac if [ $# != 0 ]; then set TESTSCRIPTS="$*" fi export DGIT_GNUPG_STUNT_ERRLOG=$( tty -s ||: ) ( set -x exec make $jcpus -k -f tests/Makefile "$@" ) 2>&1 |tee tests/tmp/run-all.log work/tests/setup/0000755000000000000000000000000014761250142011232 5ustar work/tests/setup/baredebian0000755000000000000000000000102214761250142013227 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-gdr t-dependencies GDR DEBORIG quilt t-archive-none example t-git-none t-gdr-gbp-import-core-with-queue git-deborig for b in \ patch-queue/quilt-tip \ gitish-only \ quilt-tip-1.1 \ quilt-tip-2 \ indep-arch \ ; do git branch -D $b done git rm -rf . # yikes git checkout HEAD -- debian t=$(git write-tree) t=$(git commit-tree -m 'Convert to bare debian' $t) git reset --hard $t t-setup-done '' "$(echo $p*) git mirror aq" ' t-select-package example t-git-next-date ' work/tests/setup/examplegit0000755000000000000000000000135714761250142013325 0ustar #!/bin/bash set -e . tests/lib suitespecs+=' stable testing' t-tstunt-parsechangelog t-prep-newpackage example 1.0 cd $p revision=1 push-to () { t-refs-same-start t-ref-head t-dgit build t-dgit push-built --new $2 t-pushed-good $1 $2 t-archive-process-incoming $2 } echo ancestor >which git add which t-commit Ancestor '' stable push-to master stable git checkout -b stable echo stable >which git add which t-commit Stable '' stable push-to stable stable git checkout master majorv=2 revision=0 echo sid >which git add which t-commit Sid push-to master sid echo sid-again >>which git add which t-commit Sid push-to master sid git clean -xdff t-setup-done 'v suitespecs majorv revision' "aq git mirror $p" " t-select-package $p " work/tests/setup/gbp0000755000000000000000000000147114761250142011733 0ustar #!/bin/bash set -e . tests/lib t-archive-none example t-git-none t-worktree 1.0 cd $p : '----- construct an unpatched branch with patches -----' git checkout patch-queue/quilt-tip gbp pq export : 'now on quilt-tip' git add debian/patches git commit -m 'Commit patch queue' : '----- construct an upstream branch -----' git checkout --orphan upstream git reset --hard git clean -xdf tar --strip-components=1 -xf $troot/pkg-srcs/${p}_1.0.orig.tar.gz mkdir docs cd docs tar --strip-components=1 -xf $troot/pkg-srcs/${p}_1.0.orig-docs.tar.gz cd .. git add -Af . git commit -m 'Import 1.0' git tag upstream/1.0 git checkout quilt-tip t-git-pseudo-merge -m 'gbp-orig pseudomerge' upstream v=1.0-1 git checkout -B master cd .. t-setup-done 'v' "$(echo $p*) git mirror aq" ' t-select-package example t-git-next-date ' work/tests/setup/gdr-convert-gbp0000755000000000000000000000365014761250142014164 0ustar #!/bin/bash set -e autoimport= . tests/lib . $troot/lib-gdr $ifarchive t-setup-import gnupg t-dependencies GDR t-tstunt-parsechangelog not-gdr-processable () { git branch gdr-unprocessable/$1 t-git-debrebase analyse | grep 'Unknown Unprocessable' } t-gdr-gbp-import-core-with-queue not-gdr-processable origin : 'fake up an upstream 2.0' git branch make-upstream upstream t-make-new-upstream-tarball 2.0 for b in \ quilt-tip-2 \ gitish-only \ quilt-tip-1.1 \ patch-queue/quilt-tip \ indep-arch \ ; do git branch -D $b done : 'see what gbp import-orig does' git checkout master gbp import-orig --upstream-version=2.0 ../$ust not-gdr-processable merge t-dch-commit -v 2.0-1 -m 'new upstream (did gbp import-orig)' t-dch-commit-r echo garbage >debian/patches/garbage git add debian/patches/garbage git commit -m 'add garbage' debian/patches/garbage $ifarchive t-archive-none $p $ifarchive t-git-none $ifarchive t-dgit -wgf --gbp push-source --new t-salsa-add-remote git push --set-upstream origin master # OK now this looks like something more normal. # We have: # maintainer (gbp) view dgit view # master # debian/2.0-1 archive/debian/2.0-1 # remotes/origin/master remotes/dgit/dgit/sid t-expect-fail E:'identical in upstream files' \ t-git-debrebase -fupstream-has-debian convert-from-gbp upstream/2.0~ t-expect-fail E:'Unused patch file garbage will be discarded' \ t-git-debrebase -fupstream-has-debian convert-from-gbp t-git-debrebase -fupstream-has-debian -funused-patches convert-from-gbp git branch converted-from-gbp v=2.0-2 t-dch-commit -v $v -m 'switch to git-debrebase, no other changes' t-dch-commit-r $ifarchive t-dgit -wgf push-source --new git push cd .. $ifarchive t-archive-process-incoming sid t-setup-done '' "$(echo $p*) salsa $($ifarchive echo git mirror aq)" ' . $troot/lib-gdr t-tstunt-parsechangelog p=example t-git-next-date ' work/tests/setup/gdr-convert-gbp-noarchive0000755000000000000000000000020114761250142016125 0ustar #!/bin/bash autoimport= set -e . tests/lib . $troot/lib-gdr t-dependencies GDR export ifarchive=: t-chain-test gdr-convert-gbp work/tests/setup/gnupg0000755000000000000000000000127414761250142012304 0ustar #!/bin/bash set -e . tests/lib mkdir -p $tmp/gnupg cp $troot/gnupg/* $tmp/gnupg chmod go-rw $tmp/gnupg/* export DGIT_TEST_GNUPG_GLOBAL_LOCK=$tmp/gnupg/dgit-test-global-lock export DGIT_TEST_GNUPG_LOG=$tmp/gnupg-workarounds.log setup=' export GNUPGHOME=$tmp/gnupg export DGIT_TEST_GNUPG_GLOBAL_LOCK DGIT_TEST_GNUPG_LOG cat >$tmp/gnupg/gpg-agent.conf <$tmp/must-clean/git-check.port $tmp/git read <$tmp/must-clean/git-check.port git_check_port t-git-config --global dgit-distro.test-dummy.git-check url t-git-config --global dgit-distro.test-dummy.git-check-suffix .git/HEAD t-git-config --global dgit-distro.test-dummy.git-check-url \ http://127.0.0.1:$git_check_port ' work/tests/ssh0000755000000000000000000000007314761250142010615 0ustar #!/bin/sh set -e cd / userhost="$1"; shift exec sh -c "$*" work/tests/suites0000644000000000000000000000000414761250142011323 0ustar sid work/tests/tartree-edit0000755000000000000000000001120014761250142012403 0ustar #!/bin/sh set -e fail () { echo >&2 "$0: $*"; exit 1; } play=.git/tartree-edit-work git_manip_play () { local wd; wd=$(pwd) case "$wd" in *.edit) fail "bad idea to run gitfetchinfo into a .edit tree!" ;; esac rm -rf $play mkdir $play } gitfetchdiff_list () { git for-each-ref --format '%(refname) %(objectname)' \ refs/remotes/"$1" \ | sed 's/^refs\/remotes\/[^\/]*\///' \ | t-sort >"$play/$2" } gitfetchdiff () { local how="$1" local a="$2" local b="$3" git_manip_play rrab=refs/remotes/"$a+$b" ulf=\ "delete refs/remotes/$a/%l delete refs/remotes/$b/%l " case "$how" in diff) git for-each-ref --format 'delete %(refname)' $rrab \ | git update-ref --stdin ;; merge) ulf=\ "create $rrab/%l $ulf" ;; *) fail "internal error bad how ($how)" ;; esac gitfetchdiff_list "$a" a gitfetchdiff_list "$b" b diff --old-line-format='' --new-line-format='' \ --unchanged-line-format="$ulf" \ $play/a $play/b >$play/updates \ || test $? = 1 git update-ref --stdin <$play/updates exit 0 } case "$#.$1" in 2.edit|2.done) mode="$1"; arg="$2" ;; 3.gitfetchinfo) mode="$1"; arg="$2"; remote="$3" ;; 3.gitfetchinfo-diff) gitfetchdiff diff "$2" "$3" ;; 3.gitfetchinfo-merge) gitfetchdiff merge "$2" "$3" ;; ?.-*) fail "no options understood" ;; *) fail "usage: tartree-edit edit|done DIRECTORY|TARBALL tartree-edit gitfetchinfo DIRECTORY|TARBALL REMOTE tartree-edit gitfetchinfo-merge REMOTE-A REMOTE-B" ;; # we don't document gitfetchinfo-diff because it's rather poor esac case "$arg" in *.tar) base=${arg%.tar} ;; *.edit) base=${arg%.edit} ;; *) base=${arg} ;; esac tryat_pre () { local b="$1" rm -rf "$b.tmp" if test -f "$b.tar" && test -f "$b.edit"; then echo "$b.edit exists, deleting possibly-obsolete $b.tar" rm "$b.tar" fi } tryat_edit () { local b="$1" if test -d "$b.edit"; then echo "$b.edit already exists" exit 0 fi if test -f "$b.tar"; then mkdir "$b.tmp" (set -e; cd "$b.tmp"; tar xf "$b.tar") mv "$b.tmp" "$b.edit" rm "$b.tar" echo "$b.edit ready" exit 0 fi } gitfetchinfo_perhaps_commit () { local m="$1" set +e git diff --cached --quiet --exit-code HEAD local rc=$? set -e case "$rc" in 0) return ;; 1) git commit --allow-empty --author='tartree-edit <>' -m "$m" ;; *) fail "git diff failed ($rc)" ;; esac } tryat_gitfetchinfo () { git_manip_play if test -d "$b.edit"; then cp -a "$b.edit"/. "$play"/. else exec 3<"$b.tar" tar -C $play -f - <&3 -x exec 3<&- fi local innerwd; innerwd="$(echo $play/*)" git for-each-ref --format='%(refname)' refs/remotes >$play/l perl -w -ne ' our %remerge; use strict; chomp; next unless m#^refs/remotes/([^/]+)/#; my $old = $_; my $ab = $1; my $rhs = $'\''; my @ab = split /\+/, $ab; next unless @ab == 2; next unless (grep { $_ eq "'"$remote"'" } @ab) == 1; $remerge{"@ab"} = 1; print "update refs/remotes/$_/$rhs $old\n" or die $! foreach @ab; print "delete $old\n" or die $!; END { open REMERGE, ">&3" or die $!; print REMERGE "$_\n" or die $! foreach sort keys %remerge; close REMERGE or die $!; } ' <$play/l >$play/unmerge 3>$play/remerge git update-ref --stdin <$play/unmerge git remote remove "$remote" 2>/dev/null ||: git remote add "$remote" $innerwd git fetch --no-tags -p "$remote" \ +"HEAD:refs/remotes/$remote/TT-HEAD" cd $innerwd GIT_AUTHOR_DATE=$(git log -n1 --pretty=format:'%ai') GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE export GIT_COMMITTER_DATE GIT_AUTHOR_DATE git checkout -b WORKTREE gitfetchinfo_perhaps_commit 'UNCOMMITTED INDEX' git add -Af . gitfetchinfo_perhaps_commit 'UNCOMMITTED WORKING TREE' cd ../../.. git fetch --no-tags "$remote" --refmap \ +"refs/*:refs/remotes/$remote/*" \ +"refs/*:refs/remotes/$remote/*" exec 3<$play/remerge # $play will be destroyed by what follows, but we have # an fd open onto remerge, so this will work while read <&3 a b; do echo "Updating gitfetchinfo-merge $a $b" "$0" gitfetchinfo-merge $a $b done exit 0 } tryat_done () { local b="$1" if test -d "$b.edit"; then (set -e; cd "$b.edit"; tar cf "$b.tmp" *) mv "$b.tmp" "$b.tar" mv "$b.edit" "$b.tmp" rm -rf "$b.tmp" echo "$b.tar regenerated" exit 0 fi if test -f "$b.tar"; then echo "$b.tar already exists and $b.edit doesn't" exit 0 fi } tryat () { local b="$1" if ! test -f "$b.tar" && ! test -d "$b.edit"; then return fi tryat_pre "$b" tryat_$mode "$b" fail "unexpected situation in $b.*" } case "$arg" in /*) tryat "$base" ;; *) pwd=`pwd` tryat "$pwd/$base" tryat "$pwd/git-srcs/$base" tryat "$pwd/tests/git-srcs/$base" fail "could not find $base..." ;; esac work/tests/tests/0000755000000000000000000000000014761250142011234 5ustar work/tests/tests/absurd-gitapply0000755000000000000000000000034714761250142014275 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-archive example 1.0-1+absurd t-git-none t-expect-fail 'gbp pq import failed' \ t-dgit --force-import-gitapply-no-absurd clone $p t-dgit clone $p cd $p grep moo moo t-ok work/tests/tests/alternating-dgit0000755000000000000000000000047014761250142014420 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit t-setup-import http-git-check cd $p git checkout -b nondgit t-commit 'non-dgit upload' t-non-dgit-upload cd .. t-dgit clone $p ./$p.2 cd $p.2 t-commit 'now a dgit upload again' t-dgit -wgf push-source t-refs-same-start t-pushed-good dgit/sid t-ok work/tests/tests/badcommit-rewrite0000755000000000000000000000224314761250142014601 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit t-tstunt-parsechangelog cd $tmp/git/$p.git git config core.sharedRepository true chmod -R g+w objects umask 022 cd $tmp/example suite=stable t-commit 'No changes, just send to stable' '' stable t-make-badcommit git reset --hard $badcommit t-dgit -wgf build t-dgit push-built --overwrite=1.2 stable t-archive-process-incoming stable rstable=refs/remotes/dgit/dgit/stable t-dgit fetch stable t-has-parent-or-is $rstable $badcommit fixup=${DGIT_BADCOMMIT_FIXUP-dgit-badcommit-fixup} cd $tmp/git/$p.git git gc --aggressive --prune=all rmdir objects/* ||: $fixup --real cd $tmp/$p git symbolic-ref HEAD >../sym.before git rev-parse HEAD >../ref.before $fixup --real git symbolic-ref HEAD >../sym.after git rev-parse HEAD >../ref.after diff ../sym.before ../sym.after set +e; diff ../ref.before ../ref.after; rc=$?; set -e; test $rc = 1 t-dgit fetch stable t-expect-fail "child $rstable lacks parent $badcommit" \ t-has-parent-or-is $rstable $badcommit check_shared () { find "$1" -perm -200 \! -perm -020 -ls |tee $tmp/badperm test -f $tmp/badperm -a ! -s $tmp/badperm } check_shared $tmp/git/$p.git/objects t-ok work/tests/tests/baredebian-multitar0000755000000000000000000000146314761250142015101 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-baredebian t-dependencies quilt t-setup-import baredebian t-tstunt-parsechangelog cd $p baredebian-test-vars baredebian-tarball-mode rm -f ../example_1.0.orig.tar.* cp $troot/pkg-srcs/${p}_${uv}.orig*.tar.* .. xorigcomps=docs git tag -d $uvtag baredebian-test-minimum baredebian-test-core combine=$( git log --pretty=format:%H \ --grep "Combine orig tarballs for example $uv" split.p ) parentnum=0 for comp in '' $xorigcomps; do parentnum=$(( $parentnum + 1 )) fn=${origbase}${comp:+-}${comp}.tar.gz git checkout --orphan imp$parentnum git rm -rf . tar --strip-components=1 -axf ../$fn git add -Af . git commit -m P$parentnum git diff --stat --exit-code $combine^$parentnum count=$(git log $combine^$parentnum | grep -Fc $fn) [ $count = 2 ] done t-ok work/tests/tests/baredebian-plusgit0000755000000000000000000000032414761250142014722 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-baredebian t-dependencies quilt t-setup-import baredebian t-tstunt-parsechangelog cd $p baredebian-test-vars quiltmode=baredebian+git baredebian-test-minimum t-ok work/tests/tests/baredebian-push0000755000000000000000000000023514761250142014213 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-baredebian t-dependencies quilt t-setup-import baredebian t-tstunt-parsechangelog cd $p baredebian-test t-ok work/tests/tests/baredebian-tarball0000755000000000000000000000055314761250142014660 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-baredebian t-dependencies quilt t-setup-import baredebian t-tstunt-parsechangelog cd $p baredebian-test-vars baredebian-tarball-mode t-expect-fail 'Could not determine appropriate upstream commitish' \ t-dgit -wn --dgit-view-save=split.g --baredebian quilt-fixup baredebian-test-minimum baredebian-test-core t-ok work/tests/tests/build-modes0000755000000000000000000000055714761250142013375 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-build-modes bm-buildproductsdir-nonworking bm-prep for act in \ 'build' \ 'build -S' \ 'build -b' \ 'build -B' \ 'build -A' \ 'build -F' \ 'build -g' \ 'build -G' \ ; do bm-guess-e-source-e-targets "$act" cleanmodes="$cleanmodes_default" real_act="$act" bm-act-iterate done t-ok work/tests/tests/build-modes-gbp0000755000000000000000000000132714761250142014137 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-build-modes t-dependencies git-buildpackage t-buildproductsdir-config quirk-clean-fixup () { case $cleanmode in dpkg-source*) # git-buildpackage runs the clean target twice somehow perl -i.unfixed -ne ' print unless $_ eq $last && $_ eq "EXAMPLE RULES TARGET clean\n"; $last = $_; ' $bmgot ;; esac } bm_quirk_before_diff=quirk-clean-fixup cleanmodes_dpkgsource_extra=,no-check bm-prep for act in \ 'gbp-build -S' \ 'gbp-build -b' \ 'gbp-build -B' \ 'gbp-build -A' \ 'gbp-build -F' \ 'gbp-build -g' \ 'gbp-build -G' \ ; do bm-guess-e-source-e-targets "$act" real_act="$act --git-ignore-branch" bm-act-iterate done t-ok work/tests/tests/build-modes-long0000755000000000000000000000105414761250142014323 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-build-modes bm-prep for build in \ 'source' \ 'any' \ 'all' \ 'binary' \ 'full' \ 'source,any' \ 'all,any' \ ; do act="build --build=$build" case "$build" in *source*|*full*) e_source=true ;; *) e_source=false ;; esac case "$build" in *binary*|*any*all*|*all*any*) e_targets='build binary' ;; *any*) e_targets='build-arch binary-arch' ;; *all*) e_targets='build-indep binary-indep' ;; esac cleanmodes="$cleanmodes_default" real_act="$act" bm-act-iterate done t-ok work/tests/tests/build-modes-sbuild0000755000000000000000000000046114761250142014647 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-build-modes t-dependencies sbuild t-restrict x-dgit-schroot-build t-buildproductsdir-config bm_quirk_after_act=bm-quirk-sbuild-after-act bm-prep act="sbuild -c $schroot --no-arch-all" real_act="$act" bm-guess-e-source-e-targets "$act" bm-act-iterate t-ok work/tests/tests/build-modes-source0000755000000000000000000000033114761250142014661 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-build-modes bm-prep for act in \ build-source \ ; do bm-guess-e-source-e-targets "$act" cleanmodes="$cleanmodes_all" real_act="$act" bm-act-iterate done t-ok work/tests/tests/checkout0000755000000000000000000000173114761250142012771 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-setup-import examplegit now-on () { local branch=$(git symbolic-ref HEAD) test "$branch" = "refs/heads/$1" } p=example mkdir $p.2 cd $p.2 git init t-dgit setup-new-tree t-dgit checkout -p $p unstable now-on dgit/sid t-refs-same-start t-ref-head t-ref-same refs/tags/test-dummy/$v t-dgit checkout -p $p stable now-on dgit/stable t-dgit checkout -d no-such-distro sid t-ref-head now-on dgit/sid t-dgit checkout stable now-on dgit/stable git branch -D dgit/sid t-dgit checkout -d no-such-distro sid t-ref-head now-on dgit/sid git reflog --pretty=tformat:%gs >../reflog.got cat >../reflog.expect <../refs.got cat >../refs.expect <$tmp/must-clean/mirror.port $tmp/mirror read <$tmp/must-clean/mirror.port mirror_port t-git-config --global dgit-distro.test-dummy.mirror \ http://127.0.0.1:$mirror_port/ t_archive_ln_s=cp t-archive example 1.0-1 t-git-none perl -i -ne ' print or die $!; s/1.0-1/1.0-1+0.1/g; s/ \w/ sprintf " %x", $& ^ 1 /e; print or die $!; ' $tmp/aq/package.sid.$p t-aq-archive-updated sid $p LC_MESSAGES=C \ t-dgit clone $p 2>&1 |tee got.message grep 'Warning: archive skew detected.' got.message egrep 'We were able to obtain only *1.0-1$' got.message cd $p t-cloned-fetched-good t-ok work/tests/tests/debpolicy-dbretry0000755000000000000000000000237114761250142014610 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-debpolicy t-prep-newpackage example 1.0 cd $p revision=1 git tag start echo DUMMY >some-file git add some-file git commit -m some-file taint=`git rev-parse HEAD` t-policy-admin taint --global $taint dummy git reset --hard HEAD~ t-commit 'Make something to autotaint' t-dgit build t-dgit push-built --new autotaint=`t-git-get-ref "refs/tags/$tagpfx/$v"` git reset --hard start t-commit 'Thing which will autotaint' t-dgit build fifo=$tmp/sqlite-cmds mkfifo $fifo exec 3<>$fifo sqlite3 -interactive $tmp/git/policy.sqlite3 0<$fifo 3>&- & sqlite3_pid=$! taintsout=$tmp/sqlite3.taints-out echo >&3 'begin;'; echo >&3 ".output $taintsout" echo >&3 'select * from taints;'; echo >&3 'create table dummy (x text);' t-dgit build while ! grep $taint $taintsout; do sleep 0.1; done DGIT_RPD_TEST_DBLOOP_HOOK=' print STDERR "DBLOOP HOOK $sleepy\n"; $poldbh->sqlite_busy_timeout(2500); if ($sleepy > 2) { system '\'' set -ex echo >'"$fifo"' "rollback;" touch '"$tmp/sqlite3.rolled-back"' '\'' and die "$? $!"; } ' \ t-dgit push-built --deliberately-not-fast-forward exec 3>&- wait $sqlite3_pid ls $tmp/sqlite3.rolled-back t-policy-admin list-taints | tee $tmp/taints-list | grep $autotaint t-ok work/tests/tests/debpolicy-newreject0000755000000000000000000000667714761250142015140 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-debpolicy t-prep-newpackage example 1.0 cd $p revision=1 git tag start t-dgit setup-mergechangelogs git config dgit.default.push-subcmd built echo FORBIDDEN >debian/some-file git add debian/some-file t-commit 'Commit a forbidden thing' bad=`git rev-parse HEAD:debian/some-file` t-policy-admin taint --global "$bad" "forbidden for testing" t-policy-admin taint --global "$bad" "forbidden for testing - again" t_expect_push_fail_hook+=' t-git-objects-not-present "" $bad ' t-dgit build t-expect-push-fail-tainted \ 'Reason: forbidden for testing' \ t-dgit push --new t-git-dir-check enoent git reset --hard start t-commit 'will vanish from NEW' vanished=$v t-dgit build t-dgit push --new t-git-dir-check secret t-policy-periodic t-git-dir-check secret # pretend it vanished from new: rm $tmp/incoming/* t-archive-none example t-git-dir-time-passes t-policy-periodic t-git-dir-check enoent t-commit 'should require --deliberately...questionable' t-dgit build t-expect-push-fail-tainted \ "Reason: tag $tagpfx/${vanished//./\\.} referred to this object.*all previously pushed versions were found to have been removed" \ t-dgit push --new t-git-dir-check enoent vanished=$v t-dgit push --new --deliberately-include-questionable-history \ --force-reusing-version t-git-dir-check secret t-policy-periodic t-git-dir-check secret t-archive-process-incoming new t-git-dir-time-passes t-policy-periodic t-git-dir-check secret oldobj=`git rev-parse HEAD` git reset --hard start t-commit 'should require --deliberately..not-ff' t-dgit build # Rewound, without passing the option t-expect-push-fail-retriably \ E:"^dgit: error: .* HEAD is not a descendant of the archive's version" \ t-dgit push # Rewound, passing stunt option to defeat local checks # so we check that remote check is effective. t-expect-push-fail \ E:"^remote: Package is in NEW and has not been accepted or rejected yet" \ t-dgit --deliberately-TEST-dgit-only-not-fast-forward push t-dgit --deliberately-not-fast-forward --force-reusing-version push cd $dgitrepo t-expect-fail "Not a valid object name" \ git cat-file -p $oldobj cd $tmp/$p t-commit 'Still not accepted, will override taint' t-dgit build t-expect-push-fail-tainted \ "Package is in NEW and has not been accepted or rejected yet" \ t-dgit push t-dgit push --deliberately-include-questionable-history \ --force-reusing-version t-archive-process-incoming sid t-commit 'Check taint is no longer there' t-dgit build t-dgit push git checkout -b stoats $tagpfx/$vanished t-commit 'Simulate accidentally building on rejected version' t-dgit build t-expect-push-fail \ E:"^dgit: error:.* HEAD is not a descendant of the archive's version" \ t-dgit push : "check that uploader can't force it now" t-expect-push-fail \ E:"^remote: .*: reject: not fast forward on dgit branch" \ t-dgit --deliberately-not-fast-forward push \ --deliberately-include-questionable-history \ --force-push-tainted # Ideally ^ this would be detected locally first, in which case we would # use t-expect-push-fail-tainted or something like it. But it isn't. t-dgit pull t-dgit build t-expect-push-fail-tainted \ 'Reason: rewound suite sid; --deliberately-not-fast-forward specified' \ t-dgit --force-reusing-version push : "override the previous taint check" t-dgit --force-reusing-version push-source \ --deliberately-include-questionable-history t-commit 'Check taint is truly gone' t-dgit push-source t-ok work/tests/tests/debpolicy-quilt-gbp0000755000000000000000000000005214761250142015033 0ustar #!/bin/bash set -e . tests/lib t-alt-test work/tests/tests/debpolicy-taintrm0000755000000000000000000000246114761250142014613 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-debpolicy t-prep-newpackage example 1.0 cd $p revision=1 git tag start t-dgit setup-mergechangelogs : upload t-dgit push-source --new t-commit 'edit after first push' t-expect-push-fail-tainted \ 'Package is in NEW and has not been accepted or rejected yet' \ t-dgit push-source --new : cut rm $tmp/incoming/* t-archive-none example touch -d 'now -1 day' $tmp/git/example* t-policy-periodic # xxx maybe want test both with and without this : edit t-commit 'edit after cut' : push, needs --deliberately t-expect-push-fail-tainted \ 'Reason:.* all previously pushed versions were found to have been removed from NEW' \ t-dgit push-source --new t-expect-push-fail-tainted \ 'Reason:.* all previously pushed versions were found to have been removed from NEW' \ t-dgit push-source --new --deliberately-not-fast-forward \ --force-reusing-version t-dgit push-source --new --deliberately-include-questionable-history \ --force-reusing-version t-archive-process-incoming new # : t-policy-periodic # maybe want test with this : accept mv -f $tmp/aq/package.{new,sid}.$p t-aq-archive-updated sid $p # : t-policy-periodic # maybe want test with this t-git-dir-time-passes : 3rd push, no deliberately t-commit 'edit after accept' t-dgit push-source t-ok work/tests/tests/defdistro-dsd-clone-drs0000755000000000000000000000053614761250142015605 0ustar #!/bin/bash . tests/lib t-restrict x-dgit-intree-only t-restrict x-dgit-git-only export DGIT_TEST_DSD_CLONE_DRS_HOOK=' t-git-config dgit.default.distro test-dummy url=$(git config dgit-distro.test-dummy.git-url) t-git-config dgit-distro.test-dummy/push.git-url "$url" t-git-config dgit-distro.test-dummy.git-url nosuchprotocol:// ' t-alt-test work/tests/tests/defdistro-mirror0000755000000000000000000000007714761250142014461 0ustar #!/bin/bash set -e . tests/lib t-dependencies rsync t-alt-test work/tests/tests/defdistro-rpush0000755000000000000000000000005214761250142014301 0ustar #!/bin/bash set -e . tests/lib t-alt-test work/tests/tests/defdistro-setup0000755000000000000000000000040214761250142014277 0ustar #!/bin/bash . tests/lib t-defdistro t-select-package example t-worktree 1.0 cd example t-git-config dgit-suite.DGIT-SETUP-TREE.distro test-dummy t-dgit setup-useremail t-dgit setup-mergechangelogs t-dgit setup-gitattributes t-dgit setup-new-tree t-ok work/tests/tests/distropatches-reject0000755000000000000000000000274714761250142015322 0ustar #!/bin/bash set -e . tests/lib t-archive ruby-rails-3.2 3.2.6-1 t-git-none cp $troot/pkg-srcs/${p}_3.2.6.orig.tar.gz . t-worktree test cd $p t-dgit --quilt=try-linear -wgf quilt-fixup build () { t-dgit -wg --dpkg-buildpackage:-d build } expect-fail-distro-series () { local why=$1; shift t-expect-fail \ E:"Found active distro-specific series file.*(.*$why.*)" \ "$@" } mkdir -p debian/patches cat >debian/patches/boo <<'END' Description: add boo Author: Ian Jackson --- --- a/boo +++ b/boo @@ -0,0 +1 @@ +content END echo boo >debian/patches/test-dummy.series git add debian/patches/boo git add debian/patches/test-dummy.series t-commit 'Add boo (on test-dummy)' 3.2.6-2 expect-fail-distro-series 'distro being accessed' \ build defaultvendor=$(perl -we ' use Dpkg::Vendor; print lc Dpkg::Vendor::get_current_vendor ') git mv debian/patches/test-dummy.series \ debian/patches/$defaultvendor.series t-commit 'Move boo (to default vendor)' 3.2.6-3 expect-fail-distro-series 'current vendor' \ build git mv debian/patches/$defaultvendor.series \ debian/patches/test-dummy-aside.series t-commit 'Move boo (to test-dummy-aside)' 3.2.6-4 build DEB_VENDOR=test-dummy-aside \ expect-fail-distro-series DEB_VENDOR \ t-dgit push-built t-dgit push-built cd .. perl -i~ -pe 's/^Dgit:.*\n//' incoming/${p}_${v}.dsc t-archive-process-incoming sid rm -rf $p DEB_VENDOR=test-dummy-aside \ expect-fail-distro-series DEB_VENDOR \ t-dgit clone $p t-ok work/tests/tests/downstream-gitless0000755000000000000000000000361414761250142015021 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-reprepro t-dependencies reprepro t-setup-import examplegit t-tstunt-parsechangelog # rewrite some things, so we test the rewriting code mkdir map cd map git init cd .. record-map () { old=$(t-git-get-ref-exact "refs/original/$r") new=$(t-git-get-ref-exact "$r") if [ "$old" = "$new" ]; then return; fi echo >>$tmp/map/map "$old $new" } filter () { git filter-branch \ --msg-filter 'sed s/Sid/Spong/' \ --tag-name-filter cat \ ^archive/test-dummy/2.0 \ "$@" for r in "$@"; do record-map "$r" done } cd $p filter \ refs/heads/master \ refs/remotes/dgit/dgit/sid t-ref-head cd ../git/$p.git filter \ refs/dgit/sid cd $tmp/map git add map git commit -m 'by test suite' git push $tmp/git/$p.git master:refs/dgit-rewrite/map cd .. suitespecs=avon t-reprepro-cfg ds- downstream t-reprepro-setup ds- distro='' dscf=$tmp/mirror/pool/main/example_1.1.dsc t-reprepro-includedsc avon $dscf ds- t-reprepro-regen ds- mkdir $p.import cd $p.import git init t-dgit import-dsc $dscf x cd .. t-git-config dgit-suite.avon.distro downstream t-git-config dgit-distro.downstream.git-check false t-dgit clone example avon example.avon perl -i -pe 's/ test-dummy / unknown-distro / if m/^Dgit:/' $dscf cd $p.import t-expect-fail 'hinted url with protocol file which is unsafe' \ t-dgit import-dsc $dscf xunk t-git-config dgit.dsc-url-proto-ok.file true t-dgit import-dsc $dscf xunk cd .. dscf=$tmp/mirror/pool/main/example_2.1.dsc t-reprepro-includedsc avon $dscf ds- t-reprepro-regen ds- cd $p.avon t-dgit fetch t-ref-same refs/remotes/dgit/dgit/avon cd ../$p.import git init t-dgit import-dsc $dscf +x t-ref-same refs/heads/x git show x | grep Spong t-expect-fail 'Your git tree does not have that object' \ t-dgit --no-chase-dsc-distro import-dsc $dscf +y cd ../$p t-dgit --no-chase-dsc-distro import-dsc $dscf +y git show y | grep Sid t-ok work/tests/tests/dpkgsourceignores-correct0000755000000000000000000000174214761250142016362 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-archive example 1.0-1 t-git-none t-dgit --no-rm-on-error clone $p cd $p bad-dpkg-source () { t-expect-fail E:"dpkg-source:.*unexpected upstream changes" \ t-dgit --quilt=nofix -wgf build-source find * -name .git -print0 | xargs -0r rm -- } ignores=$(t-dgit print-dpkg-source-ignores) spurious-git-must-be-excluded () { dpkg-source $ignores -b . mkdir check cd check dpkg-source -x ../../${p}_${v}.dsc cd ${p}-${v%-*} find -name .git >../bad diff /dev/null ../bad cd ../.. find * -name .git -print0 | xargs -0r rm -rf -- git clean -xdff } mkdir docs/.git echo hi >docs/.git/ho spurious-git-must-be-excluded echo hi >docs/.git spurious-git-must-be-excluded mkdir not-really.git echo fee >not-really.git/something echo fi >not-really.gitfoo echo fo >some.git echo fum >some.gitfoo git add . git commit -m 'want these' t-dgit --quilt=smash -wgf build-source t-dgit --force-uploading-old-version -wgf push-built t-ok work/tests/tests/dpkgsourceignores-docs0000755000000000000000000000162614761250142015652 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-intree-only # we need the .pod source, which is not shipped cd $tmp : ----- extract args from document ----- perl -ne ' BEGIN { print "\n=head1 dgit-test-title\n\n"; } next unless m/^=for dgit-test dpkg-source-ignores begin/.. m/^=for dgit-test dpkg-source-ignores end/; next unless m/dpkg-buildpackage.*-i.*-I/; s/\s*dpkg-buildpackage\s+//; s/\s+-S\s*//; print; ' $root/dgit-maint-merge.7.pod >doc.pod pod2text doc.pod >doc.txt perl -ne ' next unless m/\S/; next if m/dgit-test-title/; print "for arg in "; print; print " do\n"; ' doc.txt >doc.sh cat >>doc.sh <<'END' printf "%s\n" "$arg" done END chmod +x doc.sh ./doc.sh >doc.args : ----- extract args from dgit ----- args=$( t-dgit print-dpkg-source-ignores ) >dgit.args for arg in $args; do printf >>dgit.args "%s\n" "$arg" done : ----- compare ----- diff -u dgit.args doc.args t-ok work/tests/tests/drs-clone-nogit0000755000000000000000000000005214761250142014163 0ustar #!/bin/bash set -e . tests/lib t-alt-test work/tests/tests/drs-push-masterupdate0000755000000000000000000000157414761250142015432 0ustar #!/bin/bash set -e . tests/lib t-drs t-tstunt-parsechangelog t-prep-newpackage example 1.0 cd $p git tag common-ancestor revision=1 t-dgit build t-dgit push-built --new push_and_check () { git push $dgitrepo $1 oldmaster=`cd $dgitrepo && t-git-get-ref refs/heads/master` t-refs-same-start git checkout master t-commit 'Empty update' t-dgit build t-dgit push-built --new t-pushed-good master } t-check-master-undisturbed () { local master; master=`t-git-get-ref refs/heads/master` if [ x$master != x$oldmaster ]; then fail "bad update to master"; fi } t_check_pushed_master=t-check-master-undisturbed git checkout -b divergent common-ancestor git commit --allow-empty -m 'Has common ancestor' git push $dgitrepo HEAD:master push_and_check HEAD:master git checkout --orphan newroot git commit --allow-empty -m 'Has no common ancestor' push_and_check +HEAD:master t-ok work/tests/tests/drs-push-rejects0000755000000000000000000001105614761250142014367 0ustar #!/bin/bash set -e . tests/lib t-drs t-git-none t-select-package pari-extra t-worktree drs cd $p git remote set-url origin \ "ext::$troot/drs-git-ext %S /pari-extra.git" mustfail () { local mpat="$1"; shift t-expect-push-fail "$mpat" \ git push origin "$@" } mustsucceed () { t-reporefs pre-push git push origin "$@" t-reporefs post-push if diff $tmp/show-refs.{pre,post}-push >$tmp/show-refs.diff; then fail "no refs updated" fi } prep () { local suite=$1 csuite=$2 cp $tmp/masters/* $tmp/. tag_signer='-u Senatus' tag_message="$p release $version for $suite ($csuite) [dgit]" re-prep } re-prep () { tag_name=$tagpfx/$version push_spec1="HEAD:refs/dgit/$csuite" push_spec2="refs/tags/$tag_name" push_spec="$push_spec1 $push_spec2" } mktag () { t-git-next-date git tag -f $tag_signer -m "$tag_message" $tag_name "$@" } mkdir $tmp/masters cp $tmp/d[dm].* $tmp/masters version=3-2_dummy1 prep unstable sid tag_signer='-a' mktag mustfail 'missing signature' $push_spec git cat-file tag $tag_name >goodtag for h in object type tag; do for how in missing dupe; do case $how in missing) perl -pe 's/^tag /wombat$&/ if 1..m/^$/' badtag ;; dupe) perl -pe 'print if 1..m/^$/ and m/^'$h' /' badtag ;; esac rm -f badtag.asc gpg --detach-sign --armor -u Senatus badtag cat badtag.asc >>badtag set +e LC_MESSAGES=C git hash-object -w -t tag badtag >badtag.hash 2>badtag.err rc=$? set -e if [ $rc = 128 ] && grep 'fatal: corrupt tag' badtag.err; then continue elif [ $rc != 0 ]; then cat badtag.err fail "could not make tag" fi read $tmp/suites mustfail 'unknown suite' $push_spec cp $root/tests/suites $tmp/. # fixme: # or reject "command string not understood"; # reject "unknown method" unless $mainfunc; prep unstable sid mktag cp $tmp/dm.gpg $tmp/dd.gpg mustfail 'key not found in keyrings' $push_spec prep unstable sid mktag HEAD~ mustfail 'tag refers to wrong commit' $push_spec prep unstable sid mktag HEAD~: mustfail 'tag refers to wrong kind of object' $push_spec prep unstable sid tag_name=$tagpfx/wombat mktag #git update-ref $tagpfx/$version $tagpfx/wombat mustfail 'tag name in tag is wrong' \ refs/tags/$tagpfx/wombat:refs/tags/$tagpfx/$version $push_spec1 t-make-badcommit git checkout -b broken $badcommit prep unstable sid mktag mustfail "corrupted object $badcommit" $push_spec git checkout dgit/sid prep unstable sid mktag mustsucceed $push_spec # succeeds mktag mustfail 'push is missing head ref update' $push_spec1 +$push_spec2 git commit --allow-empty -m 'Dummy update' mktag mustfail 'not replacing previously-pushed version' +$push_spec1 +$push_spec2 re-prep mktag mustfail 'not replacing previously-pushed version' +$push_spec1 +$push_spec2 git reset --hard HEAD~ prep_dm_mangle () { prep unstable sid perl -i.bak -pe ' next unless m/^fingerprint: 3A82860837A0CD32/i../^$/; ' -e "$1" $tmp/dm.txt tag_signer='-u Populus' mktag } git commit --amend --message 'Make it not a fast forward' version=3-2_dummy2 prep unstable sid mktag mustfail 'not fast forward on dgit branch' +$push_spec1 +$push_spec2 git checkout v2 version=3-2_dummy2 prep_dm_mangle '' perl -i.bak -ne 'print if 1..s/(pari-extra).*\n/$1/' $tmp/dm.txt mustfail '' $push_spec # malformed (truncated) dm.txt; don't care about msg prep_dm_mangle 's/allow:/asponge:/i' mustfail 'missing Allow section in permission' $push_spec prep_dm_mangle 's/\bpari-extra\b/sponge/i' mustfail "package $p not allowed for key" $push_spec prep_dm_mangle 'y/0-9/5-90-4/ if m/^fingerprint:/i' mustfail "not in permissions list although in keyring" $push_spec prep_dm_mangle '' mustsucceed $push_spec # succeeds t-ok work/tests/tests/dsd-clone-drs0000755000000000000000000000035414761250142013622 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-intree-only t-restrict x-dgit-git-only t-dsd eval "$DGIT_TEST_DSD_CLONE_DRS_HOOK" cd $tmp t-dgit clone-dgit-repos-server drs-cloned cd drs-cloned ls -al infra/dgit-repos-server t-ok work/tests/tests/dsd-clone-nogit0000755000000000000000000000005214761250142014145 0ustar #!/bin/bash set -e . tests/lib t-alt-test work/tests/tests/dsd-divert0000755000000000000000000000020414761250142013223 0ustar #!/bin/bash set -e . tests/lib t-dsd rm $drs_dispatch/repos echo '* drs' >>$drs_dispatch/diverts t-chain-test fetch-somegit-notlast work/tests/tests/fetch-localgitonly0000755000000000000000000000054014761250142014750 0ustar #!/bin/bash set -e . tests/lib t-archive pari-extra 3-2~dummy1 t-git-none t-worktree 3-1 cd $p old=`git rev-parse HEAD` # pretend that we previously fetched 3-1 (otherwise, dgit # is entitled to, and will, make a new history) git update-ref refs/remotes/dgit/dgit/sid refs/heads/dgit/sid t-dgit pull t-cloned-fetched-good t-has-ancestor $old t-ok work/tests/tests/fetch-somegit-notlast0000755000000000000000000000025014761250142015377 0ustar #!/bin/bash set -e . tests/lib t-git pari-extra 3-1 t-archive pari-extra 3-2~dummy1 t-dgit clone $p cd $p t-cloned-fetched-good t-has-ancestor test-dummy/3-1 t-ok work/tests/tests/forcesplit-linear0000755000000000000000000000142114761250142014602 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-buildproductsdir-config t-archive example 1.0-1 t-select-package example t-git-none t-dgit clone $p cd $p echo '/* More patch */' >>src.c git add src.c t-commit 'More patch' 1.0-2 t-refs-same-start t-ref-head t-dgit --split-view push-source t-ref-head t-commit 'More more patch' 1.0-3 t-dgit --split-view --save-dgit-view=split.b quilt-fixup git reflog expire --expire=all refs/dgit-intern/quilt-cache test "x$(git reflog refs/dgit-intern/quilt-cache)" = x t-refs-same-start t-ref-head t-dgit --split-view --save-dgit-view=split.p push-source t-ref-head suite=sid t-splitbrain-pushed-good-start t-splitbrain-pushed-good--unpack t-splitbrain-rm-1-patch more-patch.patch t-splitbrain-pushed-good-end-made-dep14 t-ok work/tests/tests/forcesplit-overwrite0000755000000000000000000000113714761250142015362 0ustar #!/bin/bash set -e . tests/lib # This tests a native package with split view, including that the # pseudomerges end up in the right place. t-setup-import examplegit cd $p suite=stable t-commit 'No changes, just send to stable' '' stable t-refs-same-start t-ref-head try () { t-dgit -wgf --split-view "$@" --dgit-view-save=split.p \ push-source stable } t-expect-fail E:'maintainer view tag.*not fast forward' \ try t-expect-fail F:'debian/changelog does not mention 1.2' \ try --overwrite try --overwrite=1.2 git branch -f split.b split.p t-ref-head t-split-unchanged-pushed-good $suite t-ok work/tests/tests/ftpmasterapi-http0000755000000000000000000000064014761250142014636 0ustar #!/bin/bash set -e . tests/lib t-archive-none example t-dependencies libhttp-server-simple-static-perl $troot/http-static-server >$tmp/must-clean/api.port $tmp/aq read <$tmp/must-clean/api.port api_port t-git-config --global dgit-distro.test-dummy.archive-query ftpmasterapi: t-git-config --global dgit-distro.test-dummy.archive-query-url \ http://127.0.0.1:$api_port/ t-dgit archive-api-query suites t-ok work/tests/tests/gbp-orig0000755000000000000000000000151314761250142012670 0ustar #!/bin/bash set -e . tests/lib t-setup-import gbp cd $p t-tstunt-parsechangelog t-tstunt-debuild t-tstunt-lintian git config --global diff.noprefix true : '----- let gbp build a .orig for comparison -----' gbp buildpackage --git-no-sign-tags -us -uc mkdir ../gbp-output mv ../*1.0* ../gbp-output/. rm -f ../*.changes : '----- now do it ourselves -----' t-dgit -wgf --dgit-view-save=split.b gbp-build --git-ignore-branch t-dgit -wgf --quilt=gbp clean # gbp leaves dirty trees :-/ t-dgit -wgf --dgit-view-save=split.p --quilt=gbp push-built --new t-gbp-pushed-good : '----- check .origs are the same -----' # if gbp weren't weird about .gitignore we could just debdiff the .dscs for d in . gbp-output; do cd $tmp/$d mkdir tar-x cd tar-x tar zxf ../${p}_${v%-*}.orig.tar.gz done cd $tmp diff -ruN gbp-output/tar-x tar-x t-ok work/tests/tests/gdr-diverge-nmu0000755000000000000000000000167014761250142014162 0ustar #!/bin/bash set -e . tests/lib t-dependencies GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp cd $p t-dgit setup-mergechangelogs : 'maintainer' v=2.0-3 t-maintainer-commit-some-changes t-git-next-date : 'non-dgit upload (but we prepare it with dgit anyway)' t-git-next-date git checkout origin/master v=2.0-2+nmu1 t-nmu-upload-1 nmu gbp pq import t-nmu-upload-2 t-nmu-commit-an-upstream-change t-nmu-upload-3 : 'ad hocery' t-git-next-date git checkout master t-nmu-causes-ff-fail git cherry-pick 'dgit/dgit/sid^{/UPSTREAM NMU}' t-expect-fail 'Automatic merge failed; fix conflicts' \ git merge --squash -m 'Incorporate NMU' dgit/dgit/sid git rm -rf debian/patches git commit -m 'Incorporate NMU' git merge -s ours -m 'Declare incorporate NMU' dgit/dgit/sid : 'right, how are we' t-git-next-date t-git-debrebase t-gdr-good laundered t-git-debrebase stitch t-gdr-good stitched t-nmu-reconciled-good patch-queue/nmu t-ok work/tests/tests/gdr-diverge-nmu-dgit0000755000000000000000000000131614761250142015104 0ustar #!/bin/bash set -e . tests/lib t-dependencies GDR t-setup-import gdr-convert-gbp cd $p t-dgit setup-mergechangelogs : 'maintainer' git checkout master v=2.0-3 t-maintainer-commit-some-changes t-git-next-date : 'nmu' git checkout -b nmu origin/master~0 t-git-next-date v=2.0-2+nmu1 t-nmu-commit-an-upstream-change t-dch-commit -v$v -m finalise t-dch-commit-r t-dgit -wgf push-source t-archive-process-incoming sid : 'rebase nmu onto our branch' t-git-next-date git checkout master t-nmu-causes-ff-fail git checkout dgit/dgit/sid # detach t-expect-fail 'E:CONFLICT.*Commit patch queue' \ git rebase master git rebase --skip git push . HEAD:master git checkout master t-nmu-reconciled-good nmu t-ok work/tests/tests/gdr-edits0000755000000000000000000000153414761250142013047 0ustar #!/bin/bash set -e . tests/lib t-dependencies GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp git config --global init.defaultBranch trunk cd $p v=2.0-3 t-dch-commit -v $v -m testing t-git-debrebase analyse |tee ../anal.1 cat ../anal.1 t-some-changes edits t-dch-commit-r git tag t.before t-git-debrebase t-gdr-good laundered t-dgit push-source t-gdr-good pushed-interop t-expect-fail E:'add a new changelog stanza.*and try again' \ t-dgit push-source git branch before-noop t-git-next-date t-git-debrebase t-git-debrebase stitch t-gdr-good pushed-interop t-refs-same-start t-ref-same refs/heads/before-noop t-ref-head git checkout -b some-new-branch t-some-changes 2nd-maintainer t-dgit quilt-fixup t-gdr-made-patches # NB quilt-fixup doesn't always manage to call gdr; # push does, since it will make the pseudomerge first t-ok work/tests/tests/gdr-fresh0000755000000000000000000000143214761250142013043 0ustar #!/bin/bash set -e autoimport= . tests/lib . $troot/lib-gdr t-dependencies GDR t-gdr-gbp-import-core t-git-next-date # leaves us on upstream git rm debian/rules git commit -m 'strip upstream rules' git tag -f v1.0 git branch -m master master.old git checkout -b master t-git-next-date git checkout quilt-tip debian git commit -m 'initial debianisation' t-make-orig example 1.0 dgit-quilt-fixup-uses-dgit-linear () { t-git-next-date DGIT_TEST_DEBUG=-DD t-dgit quilt-fixup 2>&1 |tee ../fixup.out grep '^branch_is_gdr .* unmarked BreakwaterStart NO$' ../fixup.out t-dgit --quilt=nofix quilt-fixup } dgit-quilt-fixup-uses-dgit-linear git checkout --detach patch-queue/quilt-tip git rebase master git push . HEAD:master git checkout master dgit-quilt-fixup-uses-dgit-linear t-ok work/tests/tests/gdr-import-dgit0000755000000000000000000000212414761250142014172 0ustar #!/bin/bash set -e . tests/lib t-dependencies GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp t-setup-import http-git-check cd $p : 'non-dgit upload (but we prepare it with dgit anyway)' v=2.0-2+nmu1 t-nmu-upload-1 nmu gbp pq import t-nmu-upload-2 t-some-changes $numbranch t-nmu-upload-3 : 'done the nmu, switching back to the maintainer hat' nmu-fold () { t-git-next-date t-dgit fetch t-git-next-date git merge --ff-only dgit/dgit/sid git diff --exit-code patch-queue/$nmubranch git branch unlaundered.$nmubranch t-git-debrebase t-gdr-good laundered t-git-debrebase stitch t-gdr-good stitched } nmu-fold v=2.0-3 t-dch-commit -v $v -m "incorporate nmu" t-dch-commit-r t-dgit -wgf push-source : 'now test a new upstream' t-make-new-upstream-tarball 2.1 git checkout master v=2.1-0+nmu1 t-nmu-upload-1 nmu2 gbp import-orig --upstream-version=2.1 --debian-branch=nmu2 ../$ust t-dch-commit -v $v -m "new upstream $v" gbp pq import #t-dgit -wgf build-source t-nmu-upload-2 t-some-changes $numbranch t-nmu-upload-3 : 'done the nmu, back to the maintainer' nmu-fold t-ok work/tests/tests/gdr-import-dgitview0000755000000000000000000000223114761250142015064 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-gdr t-dependencies GDR t-tstunt-parsechangelog t-archive example 1.0-1 t-git-none t-dgit clone $p cd $p t-git-debrebase status t-expect-fail E:'bare dgit dsc import' \ t-git-debrebase LC_MESSAGES=C t-git-debrebase status |tee ../bare-output grep 'bare dgit dsc import with no prior history' ../bare-output git branch before t-expect-fail E:'Could not find or construct a suitable upstream commit' \ t-git-debrebase convert-from-dgit-view $GDR_DIAGNOSE --no-origs t-git-debrebase convert-from-dgit-view $GDR_DIAGNOSE t-gdr-good laundered t-expect-fail E:'already seems to be in git-debrebase format' \ t-git-debrebase convert-from-dgit-view $GDR_DIAGNOSE t-refs-same-start t-ref-head t-git-debrebase --noop-ok convert-from-dgit-view $GDR_DIAGNOSE t-ref-head t-expect-fail E:'Output of conversion does not match input' \ t-git-debrebase -falready-converted convert-from-dgit-view $GDR_DIAGNOSE \ --always-convert-anyway t-git-debrebase make-patches t-git-debrebase -falready-converted convert-from-dgit-view $GDR_DIAGNOSE \ --always-convert-anyway t-expect-fail E:'ref varies' t-ref-head t-gdr-good laundered t-ok work/tests/tests/gdr-import-nostitch0000755000000000000000000000113614761250142015100 0ustar #!/bin/bash set -e autoimport= . tests/lib . $troot/lib-gdr t-dependencies GDR t-tstunt-parsechangelog t-gdr-gbp-import-core-with-queue git checkout master git tag -m synthetic debian/1.0-1 echo '# comment' >>debian/patches/series git add debian/patches/series git commit -m 'add a comment' t-expect-fail F:-fseries-comments \ t-git-debrebase -fupstream-has-debian -funused-patches convert-from-gbp t-git-debrebase -fupstream-has-debian -funused-patches -fseries-comments \ convert-from-gbp \ 2>&1 | tee ../convert-msg grep -e 'dgit --overwrite will be needed' ../convert-msg >/dev/null t-ok work/tests/tests/gdr-makepatches70000755000000000000000000000163114761250142014311 0ustar #!/bin/bash set -e . tests/lib t-dependencies GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp cd $p git checkout upstream/2.0 echo '*patch*' >>.gitignore git commit -m nasty .gitignore git tag v2.1 t-make-orig $p 2.1 git checkout master t-git-debrebase new-upstream 2.1-1 t-some-changes for-rebase-fixup m t-git-debrebase t-git-debrebase make-patches t-some-changes for-dgit-fixup m t-git-debrebase t-expect-fail 'dgit: failed command: false' \ t-dgit -wgf --git-debrebase=false quilt-fixup git branch before-gdr-true t-dgit -wgf --git-debrebase=true quilt-fixup git reset --hard before-gdr-true t-dgit -wgf --git-debrebase=no-such-command-exists quilt-fixup t-some-changes for-make-patches-fails-then-dgit-fixup m t-expect-fail 'Patch export produced patch amendments' \ t-git-debrebase make-patches t-dgit -wgf quilt-fixup t-refs-same-start t-ref-head t-dgit -wg quilt-fixup t-ref-head t-ok work/tests/tests/gdr-merge0000755000000000000000000000215314761250142013034 0ustar #!/bin/bash set -e autoimport= . tests/lib t-dependencies GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp-noarchive cd $p t-gdr-prep-new-upstream 2.1 git tag v2.1 upstream t-some-changes before t-git-debrebase quick : ----- prepare LH branch ----- git checkout -b other t-some-changes other '' -other echo 'other-conflict' >>debian/zorkmid git commit -m 'other-conflict' debian/zorkmid : ----- prepare RH branch ----- git checkout master t-some-changes us-1 '' -us t-git-debrebase new-upstream 2.1 t-some-changes us-2 '' -us echo 'us-conflict' >>debian/zorkmid git commit -m 'us-conflict' debian/zorkmid t-git-debrebase quick : ----- introduce a vanilla merge ----- t-merge-conflicted-stripping-conflict-markers other debian/zorkmid t-expect-fail E:'general two-parent merge' \ t-git-debrebase t_gdr_xopts+=' --experimental-merge-resolution' : ----- expect to be able to merge ----- t-git-debrebase t-gdr-good laundered t-refs-same-start t-ref-head t-git-debrebase t-ref-head t-git-debrebase scrap t-some-changes after t-git-debrebase t-gdr-good laundered t-dgit quilt-fixup t-gdr-made-patches t-ok work/tests/tests/gdr-merge-conflicts0000755000000000000000000000511414761250142015016 0ustar #!/bin/bash set -e autoimport= . tests/lib t-dependencies NO-DGIT GDR quilt t-tstunt-parsechangelog t-tstunt debchange t-setup-import gdr-convert-gbp-noarchive t_gdr_xopts+=' --experimental-merge-resolution' wreckage-before () { junkref=refs/debrebase/wreckage/junk git update-ref $junkref v2.1 } wreckage-after () { test '' = "$(t-git-get-ref-exact $junkref)" git for-each-ref refs/debrebase/wreckage | egrep . } no-wreckage () { if git for-each-ref refs/debrebase/wreckage | egrep .; then fail wreckage fi } : ----- prepare the baseline ----- cd $p t-gdr-prep-new-upstream 2.1 git tag v2.1 upstream t-some-changes before t-git-debrebase quick : ===== early failure in walk ===== : ----- prepare other ----- git checkout -b other t-some-changes other '' -other git branch other-before-new-upstream t-git-debrebase new-upstream 2.1 t-git-next-date : ----- prepare master ----- git checkout master t-git-debrebase new-upstream 2.1 t-git-next-date git branch master-before-merge : ----- make the merge ----- git merge --no-edit -s ours other # we have to do a little dance to make this not a pseudomerge t-git-next-date t-debchange -a 'Merge, only conflict was in debian/changelog' t-dch-r-rune t-debchange git commit -a --amend --no-edit wreckage-before t-expect-fail F:'divergent anchors' \ t-git-debrebase wreckage-after : ===== late failure in apply ===== git checkout other git reset --hard other-before-new-upstream echo other-upstream-confict >>docs/README git commit -m 'other-upstream-conflict' docs/README t-git-debrebase quick no-wreckage : ----- make the merge ----- git checkout master git reset --hard master-before-merge t-merge-conflicted-stripping-conflict-markers other docs/README t-git-debrebase stitch : ----- expect failure ----- wreckage-before t-expect-fail F:'docs/README' \ t-git-debrebase wreckage-after : ===== resolve the conflict ===== # omg quilt_faff_before () { git checkout -b fix$1 debrebase/wreckage/merged-patchqueue QUILT_PATCHES=debian/patches quilt push -a } quilt_faff_after () { QUILT_PATCHES=debian/patches quilt refresh git add debian/patches git commit -m FIX git reset --hard git clean -xdff t-git-debrebase record-resolved-merge git checkout master } : ----- badly ----- quilt_faff_before 1 quilt_faff_after t-expect-fail E:'upstream files are not the same' \ t-git-debrebase t-git-debrebase scrap no-wreckage : ----- well ----- t-expect-fail F:'docs/README' \ t-git-debrebase wreckage-after quilt_faff_before 2 git checkout master docs/README git reset docs/README quilt_faff_after t-git-debrebase t-gdr-good laundered t-ok work/tests/tests/gdr-newupstream0000755000000000000000000000420414761250142014306 0ustar #!/bin/bash set -e autoimport= . tests/lib t-dependencies NO-DGIT GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp-noarchive cd $p : 'upstream hat' t-gdr-prep-new-upstream 2.1 : 'maintainer hat' git branch startpoint v=2.1-1 git checkout master t-expect-fail F:'Could not determine appropriate upstream commitish' \ t-git-debrebase new-upstream $v git tag v2.1 upstream git branch before-new-upstream clog-check-1 () { before=$1 date=$(git log --format=%aD -n1 debian/changelog) date=$(date -R -d "$date") git show $before:debian/changelog >../clog.before m=" * Update to new upstream version ${v%-*}." e="dgit test git user $date" } clog-check-2 () { diff -u ../clog.expected debian/changelog } : ----- ordinary new upstream test ----- t-git-debrebase new-upstream ${v%-*} clog-check-1 before-new-upstream cat - <../clog.expected example ($v) UNRELEASED; urgency=medium $m -- $e END clog-check-2 t-gdr-good laundered git reflog | egrep 'debrebase new-upstream.*checkout' t-git-debrebase stitch t-gdr-good stitched git branch ordinary : ----- 'with --anchor' ----- git checkout -b with-anchor startpoint t-git-debrebase analyse >../anal.anch anchor=$(perl <../anal.anch -ne ' next unless m/^(\w+) Anchor\s/; print $1,"\n"; exit; ') GIT_REFLOG_ACTION='STUNT-RLA' \ t-git-debrebase --anchor=$anchor -fanchor-treated new-upstream $v upstream t-gdr-good laundered git reflog | egrep 'STUNT-RLA: debrebase new-upstream' git reflog | egrep 'STUNT-RLA: debrebase: launder for new upstream' t-git-debrebase stitch t-gdr-good stitched git diff --quiet ordinary : ----- with pre-existing changes ----- git checkout -b with-preexisting before-new-upstream t-dch-commit drivel-in-changelog git branch before-new-upstream-with-changes t-git-next-date t-git-debrebase new-upstream ${v%-*} clog-check-1 before-new-upstream-with-changes perl -pe <../clog.before >../clog.expected ' BEGIN { ($m,$e,@ARGV) = @ARGV; } next unless 1..m/^ --/; s/\([^()]+\)/('$v')/ if m/^example /; $_ .= "$m\n" if m/^ \* drivel-in-changelog/; $_ = " -- $e\n" if m/^ -- /; ' "$m" "$e" clog-check-2 t-ok work/tests/tests/gdr-subcommands0000755000000000000000000001304114761250142014246 0ustar #!/bin/bash set -e . tests/lib t-dependencies GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp cd $p t-dgit setup-mergechangelogs mix-it () { t-git-next-date local m=$(git symbolic-ref HEAD) t-some-changes "subcommands $m 1" # we want patches mde by dgit, not gdr, for our test cases t-dgit --git-debrebase=true -wgf quilt-fixup t-git-next-date t-some-changes "subcommands $m 2" t-git-next-date } git checkout -b raw-converted-from-gbp converted-from-gbp test "$(git diff --stat HEAD^2)" git diff --exit-code --stat HEAD^1 git reset --hard HEAD^1 git checkout -b stitched-laundered master mix-it t-git-debrebase quick t-gdr-good stitched HEAD git checkout -b stitched-mixed master mix-it git checkout -b unstitched-laundered master mix-it git branch before-unstitch/unstitched-laundered t-git-debrebase t-gdr-good laundered git checkout -b unstitched-mixed master git branch before-unstitch/unstitched-mixed t-git-debrebase mix-it t-git-next-date git show-ref subcmd () { local subcmd=$1 shift for startbranch in {stitched,unstitched}-{laundered,mixed} \ raw-converted-from-gbp; do work="work-$subcmd-$startbranch" : "---------- $subcmd $startbranch ----------" git for-each-ref "**/$startbranch"{,/**} \ --format='create %(refname) %(objectname)' \ | sed "s/$startbranch/$work/" \ | git update-ref --stdin git checkout $work checkletters=$1; shift before=before-$work git branch $before local xopts='' case "$checkletters" in XX*) fail "$checkletters" # for debugging ;; esac case "$checkletters" in X*) t-expect-fail E:'snags: [0-9]* blockers' \ t-git-debrebase $xopts $subcmd xopts+=' --force' next_checkletter ;; esac case "$checkletters" in N*) t-expect-fail E:. \ t-git-debrebase $xopts $subcmd xopts+=' --noop-ok' next_checkletter ;; esac case "$checkletters" in [EF]:*) t-expect-fail "$checkletters" \ t-git-debrebase $xopts $subcmd continue ;; *) t-git-debrebase $xopts $subcmd ;; esac peel=peel-$subcmd-$startbranch git checkout -b $peel t-clean-on-branch $peel : "---------- $subcmd $startbranch $checkletters ----------" while [ "x$checkletters" != x ]; do : "---- $subcmd $startbranch ...$checkletters ----" make_check "$checkletters" checkletters="${checkletters#?}" done done } next_checkletter () { checkletters="${checkletters#?}" } make_check () { case "$1" in [Nn]*) t-refs-same-start t-refs-same refs/heads/$before refs/heads/$peel ;; U*) t-refs-same-start t-refs-same refs/heads/$before refs/ffq-prev/heads/$work make_check u ;; u*) t-git-get-ref refs/ffq-prev/heads/$work t-refs-notexist refs/debrebase-last/heads/$work ;; V*) t-refs-same-start t-refs-same refs/ffq-prev/heads/$work \ refs/ffq-prev/heads/$startbranch t-refs-notexist refs/debrebase-last/heads/$work ;; s*) t-refs-notexist refs/ffq-prev/heads/$work t-refs-same-start t-refs-same refs/debrebase-last/heads/$work \ refs/debrebase-last/heads/$startbranch t-has-ancestor HEAD refs/debrebase-last/heads/$work ;; S*) t-refs-notexist refs/ffq-prev/heads/$work t-refs-same-start refs/debrebase-last/heads/$work t-ref-head git diff --quiet HEAD^1 git diff HEAD^2 | grep $startbranch git reset --hard HEAD^1 ;; P*) t-dgit -wgf --quilt=nofix quilt-fixup git diff HEAD~ debian/patches | egrep . t-gdr-made-patches git diff --quiet HEAD~ -- ':.' ':!debian/patches' git reset --hard HEAD~ ;; l*) git diff --quiet HEAD refs/heads/$before -- ':.' ':!debian/patches' t-gdr-good laundered ;; A*) t-refs-notexist \ refs/ffq-prev/heads/$work \ refs/debrebase-last/heads/$work ;; t*) git diff --quiet HEAD refs/heads/$before ;; f*) t-has-ancestor HEAD refs/heads/$before ;; Z*) t-refs-same-start t-refs-same refs/heads/$peel t-refs-same refs/heads/before-unstitch/$startbranch t-ref-head ;; *) fail "$1" ;; esac } Ec="F:No ongoing git-debrebase session" Ep="F:Patch export produced patch amendments" # input state: # stitched? st'd st'd unst'd unst'd convert # laundered? laund'd mixed laund'd mixed -from-gbp # # "mixed" means an out of order branch # containing mixed commits and patch additions, # but which needs even more patches # subcmd '' Ult Ull Vlt Vl nU subcmd stitch Ns Nu Sltf Stf Ns subcmd prepush ns nu Sltf Stf ns subcmd quick ns Sl Sltf Sl n subcmd conclude "$Ec" "$Ec" Sltf Sl N subcmd scrap Ns Ns Z Z N subcmd make-patches sPft "$Ep" uPft "$Ep" Pn subcmd forget-was-ever-debrebase nA nA nA nA nA # # result codes, each one is a check: # E:$pat } this is an error (must come first) # F:$pat } arg is passed to expect-fail # # X should fail due to snags, but succeed when forced # XX crash out of script for manual debugging # # N this is a noop, error unless --noop-ok # n this is a silent noop # both of these imply tf; but, specify also one of u s # # should normally specify one of these: # U just unstiched: ffq-prev is exactly previous HEAD; implies u # u result is unstitched # V ffq-prev remains unchanged; implies also u # s result is stitched, debrebase-last exists and is unchanged # S result is stitch just made, remaining letters apply to result~ # Z result is rewind to before changes made # A no ffq-prev or debrebase-last refs ("Amnesia") # # P result is add-patches, remaining letters apply to result~ # # should normally specify one or both of these: # l result is laundered, tree is same as before minus d/patches # t tree is exactly same as before # # f result is ff from previous HEAD t-ok work/tests/tests/gdr-unprocessable0000755000000000000000000000163514761250142014606 0ustar #!/bin/bash set -e . tests/lib t-dependencies GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp cd $p t-dgit setup-mergechangelogs subcmd () { cmd=("$@") branch merge 'general two-parent merge' branch origin 'origin commit' } branch () { branch=$1 git checkout gdr-unprocessable/$branch msgcore=$2 expected-$expected } cmd () { t-git-debrebase "${cmd[@]}" } expected- () { t-expect-fail E:"$(printf "$mfmt" "$msgcore")" \ cmd } expected-ok () { f=../out.$branch."${cmd/[^-a-zA-Z//_}" cmd | tee $f for mfmt in "${mfmts[@]}"; do grep "$(printf "$mfmt" "$msgcore")" $f done } mfmt='found unprocessable commit.*%s' subcmd subcmd quick subcmd new-upstream 2.0 upstream/2.0 subcmd make-patches subcmd breakwater subcmd anchor expected=ok mfmts=(' Unprocessable (%s)') subcmd analyse mfmts=('branch not in git-debrebase form' 'found unprocessable commit, cannot cope: %s') subcmd status t-ok work/tests/tests/gdr-unprocessable-hints0000755000000000000000000000141014761250142015720 0ustar #!/bin/bash set -e . tests/lib t-dependencies GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp cd $p b=gdr-unprocessable/origin git checkout $b t-expect-fail E:'maybe you needed git-debrebase convert-from' \ t-git-debrebase quick git update-ref refs/ffq-prev/heads/$b master t-expect-fail E:'Consider git-debrebase scrap' \ t-git-debrebase quick git update-ref -d refs/ffq-prev/heads/$b master git update-ref refs/debrebase-last/heads/$b HEAD t-expect-fail E:'Branch/history seems mangled' \ t-git-debrebase quick test "$(grep 'git-debrebase scrap' ../t.output)" = "" git update-ref refs/debrebase-last/heads/$b master t-expect-fail E:'Branch/history mangled, and diverged' \ t-git-debrebase quick test "$(grep 'git-debrebase scrap' ../t.output)" = "" t-ok work/tests/tests/gdr-viagit0000755000000000000000000000144114761250142013217 0ustar #!/bin/bash set -e autoimport= . tests/lib t-dependencies NO-DGIT GDR t-tstunt-parsechangelog t-setup-import gdr-convert-gbp-noarchive : 'set up so t-git-debrebase runs gdr via git' case "$DGIT_GITDEBREBASE_TEST" in ''|git-debrebase) ;; *) t-tstunt st=$tmp/tstunt/git-debrebase export DGIT_GITDEBREBASE_TEST_REAL="$DGIT_GITDEBREBASE_TEST" cat <<'END' >$st #!/bin/sh set -x exec "$DGIT_GITDEBREBASE_TEST_REAL" "$@" END chmod +x $st ;; esac DGIT_GITDEBREBASE_TEST='git debrebase' : 'do a simple test' cd $p t-some-changes t-git-debrebase t-gdr-good laundered t-git-debrebase stitch --prose=wombat t-gdr-good stitched : ----- test scrap ----- t-refs-same-start t-ref-head t-git-debrebase t-gdr-good laundered t-some-changes t-git-debrebase scrap t-gdr-good stitched t-ref-head t-ok work/tests/tests/gitattributes0000755000000000000000000001207714761250142014063 0ustar #!/bin/bash set -e . tests/lib t-dependencies bsdgames t-dependencies man-db git-man t-tstunt-parsechangelog t-archive-none example t-git-none bv=1.0 t-worktree $bv : ----- prepare badnesses ----- mkdir af badattr1 () { local filename=$1 local attrspec=$2 echo >>af/$filename "Test file with $attrspec" printf >>af/$filename 'crlf: \r\n' echo >>af/$filename 'id $Id: $' echo >>af/$filename 'id $Id: SPLARK $' printf >>af/$filename '\xEF\xBB\xBF <- UTF-8 BOM\n' echo >>gitattrs "af/$filename" "$attrspec" } badattr () { attrname=$1; shift case "$attrname" in working-tree-encoding) ;; *) badattr1 $attrname-set $attrname ;; esac badattr1 $attrname-unset -$attrname badattr1 $attrname-unspec \!$attrname local val for val in "$@"; do badattr1 $attrname=$val $attrname=$val done } # todo: want to make each of these files into a quilt patch t-git-config core.eol crlf printf >>.dotfile-attr 'dotfiles too?\n' echo >>gitattrs '.dotfile-attr filter=dgit-test-crazy-f' badattr text auto badattr eol lf crlf badattr ident t-git-config filter.dgit-test-crazy-f.smudge '/usr/games/rot13 2' t-git-config filter.dgit-test-crazy-f.clean '/usr/games/rot13 24' t-git-config filter.dgit-test-crazy-f.requrired true badattr filter dgit-test-crazy-f badattr diff badattr merge text binary union badattr whitespace badattr export-ignore badattr export-subst badattr delta badattr encoding no-such-encoding badattr working-tree-encoding ISO-8859-1 UTF-16 man gitattributes \ | perl -ne 'print $1,"\n" if m/^ *(\w[-a-z]*)$/' \ > grepped-attrs exec sums # ----- common to source formats ----- sfmt_setup () { v=$1 sfmt=$2 pdb=$p.$sfmt local addpatch=${sfmt}_addpatch local convert=${sfmt}_convert cp -a $p $pdb-edit cd $pdb-edit $convert dch -v $v -m convert rm -rf .git cp ../gitattrs .gitattributes $addpatch gitattrs cp -a ../af ../.dotfile-attr . $addpatch files cp ../sums . $addpatch sums dpkg-source -b . cd .. } sums_check () { # caller should cd into working directory, set # $sums $branch # and check out $branch sha256sum .dotfile-attr af/* >../$sums.checkout diff -U0 ../sums ../$sums.checkout for f in .dotfile-attr af/*; do git cat-file blob "refs/heads/$branch:$f" \ | sha256sum \ | sed -e 's#-$#'$f'#' \ >>../$sums done diff -U0 ../sums ../$sums } sums_check_broken () { # caller should cd into working directory, set # $sums # and check out the broken branch sha256sum .dotfile-attr af/* >../$sums.broken for s in ../sums ../$sums.broken; do sed 's/[0-9a-f]* //' $s >$s.nosums done diff -U0 ../sums.nosums ../$sums.broken.nosums set +e diff -U0 ../sums ../$sums.broken rc=$? set -e test $rc = 1 } t-dgit-warn-check () { local warnok=$1; shift # warnok should be 0 if the warning is expected # 1 if the warning is NOT expected local err=stderr.$wd LC_MESSAGES=C t-dgit "$@" 2>&1 |tee ../$err set +e egrep 'warning: .* contains \.gitattributes' ../$err rc=$? set -e test "$rc" = "$warnok" } sfmt_import () { inst=$1 dgitargs=$2 branch="import.$sfmt-$inst" dscf=${p}_${v}.dsc sums=sums.$sfmt-$inst wd=$pdb-import-$inst mkdir $wd cd $wd git init t-dgit-warn-check 0 $dgitargs import-dsc ../$dscf +$branch.broken git checkout $branch.broken sums_check_broken t-dgit setup-new-tree t-dgit-warn-check 1 $dgitargs import-dsc ../$dscf +$branch git checkout $branch touch .dotfile-attr af/* git reset --hard sums_check cd .. } : ----- generate the orig ----- origtar=${p}_${bv}.orig.tar.gz tar --exclude=debian --exclude=.git -zcf $origtar $p : ----- test 1.0 native ----- native_addpatch () { :; } native_convert () { :; } sfmt_setup 1.1 native sfmt_import norm : ----- test 1.0 diff ----- diff_addpatch () { :; } diff_convert () { :; } sfmt_setup 1.1 diff sfmt_import norm : ----- test "3.0 (quilt)" ----- quilt_addpatch () { pname=$1 cat >../editor.pl <debian/source/format } sfmt_setup 1.0-1 quilt sfmt_import norm sfmt_import absurd --force-import-gitapply-absurd : ----- 'test clone (with "3.0 (quilt)")' ----- mv $origtar ${dscf%.dsc}.* $tmp/mirror/pool/main/ t-archive-query sid t-dgit-warn-check 0 -cdgit.default.setup-gitattributes=false \ clone $p sid $p.clone.broken cd $p.clone.broken sums=sums.broken sums_check_broken cd .. t-dgit-warn-check 1 clone $p sid $p.clone cd $p.clone sums=sums.clone branch=dgit/sid sums_check cd .. t-dgit-warn-check 0 -cdgit.default.setup-gitattributes=false \ clone $p sid $p.clone.old cd $p.clone.old mkdir -p .git/info cat >.git/info/attributes <<'END' * dgit-defuse-attrs [attr]dgit-defuse-attrs -text -eol -crlf -ident -filter # ^ see GITATTRIBUTES in dgit(7) and dgit setup-new-tree in dgit(1) END t-dgit setup-gitattributes git reset --hard sums=sums.old sums_check cd .. t-ok work/tests/tests/gitconfig0000755000000000000000000000143314761250142013134 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-prep-newpackage example 1.0 cd $p t-dgit clean | tee ../t.output grep 'EXAMPLE RULES TARGET clean' ../t.output t-git-config dgit.default.clean-mode git t-dgit clean | tee ../t.output set +e grep 'EXAMPLE RULES TARGET clean' ../t.output rc=$? set -e test $rc = 1 git config dgit.default.clean-mode dpkg-source-d t-dgit clean | tee ../t.output grep 'EXAMPLE RULES TARGET clean' ../t.output t-git-config dgit.default.opts-dpkg-buildpackage --dgit-fail-global git config --add dgit.default.opts-dpkg-buildpackage --dgit-fail-foo git config --add dgit.default.opts-dpkg-buildpackage --dgit-fail-bar t-expect-fail '--dgit-fail-global --dgit-fail-foo --dgit-fail-bar' \ t-dgit clean t-dgit -cdgit.default.clean-mode=none clean t-ok work/tests/tests/gitworktree0000755000000000000000000000061414761250142013531 0ustar #!/bin/bash set -e . tests/lib t-archive example 1.0-1 t-git-none t-dgit --no-rm-on-error clone $p mv $p maintree cd maintree git branch -m maintree-head git worktree add ../$p cd ../$p t-dgit fetch t-dgit setup-new-tree echo hi >>modification git add modification git commit -m 'want this' t-dgit -wgf quilt-fixup t-dgit -wgf --quilt=nofix push-source --force-uploading-old-version t-ok work/tests/tests/hint-testsuite-triggers0000755000000000000000000000030214761250142015772 0ustar #!/bin/bash set -e . tests/lib : "exists only to trigger ci.debian.net retests for some indirect deps" t-restrict hint-testsuite-triggers t-dependencies NO-DEFAULT gnupg patch diffutils t-ok work/tests/tests/i18n-messages0000755000000000000000000000215414761250142013550 0ustar #!/bin/bash set -e autoimport= . tests/lib t-dependencies NO-DGIT GDR t-restrict x-dgit-out-of-tree-only # We don't run this test in-tree because: # 1. The .mo files that we would use might need to be built # and would certainly have to be `installed' somewhere we # could reference them. We could do that here maybe, # but it would risk dirtying the tree because the i18n # machinery is dirtying, and also: # 2. The locale system does not provide a path-like variable # we could use to point to our not-yet-installed .mo files. # There is LOCPATH but setting it breaks everything because # it disables `locale archives' and those are what provides # important infrastructure. t-setup-import gdr-convert-gbp-noarchive cd $p t-gdr-prep-new-upstream 2.1 git tag v2.1 upstream git branch startpoint v=2.1-1 git checkout master anchor=$(t-git-debrebase anchor) t-expect-fail F:'old anchor is recognised' \ t-git-debrebase --anchor=$anchor new-upstream 2.1 expect_fail_lcmessages=en_US.UTF-8 t-expect-fail F:'old anchor is recognized' \ t-git-debrebase --anchor=$anchor new-upstream 2.1 t-ok work/tests/tests/i18n-po4a-uptodate0000755000000000000000000000015014761250142014421 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-git-only cd $root make -C po4a po4a.cfg.check t-ok work/tests/tests/import-dsc0000755000000000000000000000414114761250142013243 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-setup-import examplegit p=example check-import () { path=$1 v=$2 opts=$3 branch=t.$v dsc=${path}/${p}_${v}.dsc t-dgit $opts import-dsc $dsc $branch git checkout $branch check-imported $dsc } check-imported () { local dsc=$1 ( rm -rf ../t.unpack mkdir ../t.unpack cd ../t.unpack dpkg-source -x $dsc ) git checkout HEAD~0 git branch -D u.$v ||: git checkout -b u.$v $branch git rm -rf . git clean -xdf cp -al ../t.unpack/*/. . git add -Af . git diff --stat --exit-code } cd $p check-import ../mirror/pool/main 1.2 dgit12=`git rev-parse HEAD` dsc2=../mirror/pool/main/${p}_2.0.dsc git checkout $branch t-expect-fail 'is checked out - will not update' \ t-dgit import-dsc $dsc2 $branch git checkout HEAD~0 t-expect-fail 'Not fast forward' \ t-dgit import-dsc $dsc2 $branch t-expect-fail 'Not fast forward' \ t-dgit import-dsc $dsc2 ..$branch t-dgit import-dsc $dsc2 +$branch check-imported $dsc2 dsc3=$troot/pkg-srcs/example_1.0-1+brokenmeta.dsc t-dgit import-dsc $dsc3 +$branch check-imported $dsc3 cd .. mkdir $p.2 cd $p.2 git init check-import $troot/pkg-srcs 1.0-1 cd .. v=1.0-1+absurd rm -f ${p}_* dsc=$troot/pkg-srcs/${p}_${v}.dsc cd $p.2 cp $dsc .. t-expect-fail 'No such file or directory' \ check-import .. $v mkdir ../enoents cp $dsc ../enoents t-expect-fail 'No such file or directory' \ check-import ../enoents $v cd .. rm -f ${p}_${v}.dsc dget -du file://$dsc cd $p.2 check-import .. $v t-expect-fail "Your git tree does not have that object" \ check-import ../mirror/pool/main 1.2 --no-chase-dsc-distro check-import ../mirror/pool/main 1.2 --force-import-dsc-with-dgit-field v=1.0-1.100 dsc2=$troot/pkg-srcs/${p}_${v}.dsc t-expect-fail E:'Branch.*already exists' \ t-dgit import-dsc $dsc2 $branch git branch merge-reset t-dgit import-dsc $dsc2 ..$branch t-has-ancestor merge-reset $branch git push . +merge-reset:$branch t-dgit import-dsc $dsc2 +$branch mb=$(t-git-merge-base merge-reset $branch) test "x$mb" = x t-expect-fail 'signature check failed' \ t-dgit import-dsc --require-valid-signature $dsc2 +$branch t-ok work/tests/tests/import-linkorigs0000755000000000000000000000217014761250142014473 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-import-chk t-dependencies xz-utils t-tstunt-parsechangelog t-archive-none example v=1.0-1 link_src_files () { mkdir $1 cp $troot/pkg-srcs/${p}_* $1 dscfn=$1/$dscleaf } combo () { case $bpdhow in none) bpd=.. ;; abs) bpd=$tmp/$subdir/bpd ;; rel) bpd=../bpd ;; *) x-unknown-bpdhow $bpdhow ;; esac mkdir -p $bpd git config --local dgit.default.build-products-dir $bpd dscleaf=${p}_${v}.dsc dscfn=$troot/pkg-srcs/$dscleaf case $dschow in abs) ;; rel) link_src_files ../copies ;; bpd) link_src_files $bpd ;; *) x-unknown-dschow $dschow ;; esac t-dgit import-dsc $dscfn +import git reset --hard import t-dch-commit -v$v.1 -m 'New version' t-dch-commit-r t-dgit build-source } for bpdhow in none rel abs; do for dschow in rel abs; do subdir=$bpdhow-$dschow mkdir $subdir cd $subdir mkdir $p cd $p git init combo cd ../.. done done rm -rf dupes cp -a rel-rel dupes cd dupes orig=${p}_${v%-*}.orig.tar zcat bpd/$orig.gz | xz -1 >$orig.xz cd $p ls -al ../bpd t-expect-fail 'Duplicate/inconsistent orig tarballs' \ t-dgit build-source t-ok work/tests/tests/import-maintmangle0000755000000000000000000000123114761250142014763 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-import-chk t-tstunt-parsechangelog t-select-package example v=1.0 t-worktree $v cd $p dsc=${p}_${v}.dsc chk () { local perl="$1" local unperl="$2" git checkout master~0 perl -i -pe "next unless m/^ -- /; $perl" debian/changelog git commit --allow-empty -a -m "perl $perl" (cd ..; dpkg-source -i\.git -I.git -b $p) t-dgit import-dsc ../$dsc +x git checkout x~0 t-import-chk-authorship } massage () { perl -i~ -pe "$unperl" "$1" } import_chk_changelog_massage=massage chk chk 's/Ian Jackson/Ian Jackson, SPQR/' \ 's/Ian Jackson, SPQR/Ian Jackson SPQR/' chk 's/Ian Jackson/"Ian Jackson, SPQR"/' t-ok work/tests/tests/import-native0000755000000000000000000000210314761250142013754 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit t-tstunt-parsechangelog mkdir $tmp/aside versions="" for f in $(find $tmp/mirror -name \*.dsc | t-sort); do perl -i -pe ' $_="" if m/^-----BEGIN PGP SIGNED/..!m/\S/; $_="" if m/^-----BEGIN PGP SIGNATURE/..0; $_="" if m/^Dgit: /; ' $f mv $f $tmp/aside/. version="${f%.dsc}" version="${version##*/${p}_}" versions+=" $version" done echo $versions rm -rf $tmp/git/$p.git t-archive-none $p cd $p lrref=refs/remotes/dgit/dgit/sid git update-ref -d $lrref for v in $versions; do git show-ref mv $tmp/aside/${p}_${v}.dsc $tmp/mirror/pool/main/ t-archive-query t-dgit fetch set +e git merge-base HEAD remotes/dgit/dgit/sid rc=$? set -e test $rc = 1 t-refs-same-start t-ref-same-exact refs/tags/$p/$v: t-ref-same-exact refs/remotes/dgit/dgit/sid: first_imp=first-import/$v git tag first-import/$v $lrref if [ "$lastv_imp" ]; then git update-ref $lrref $lastv_imp t-git-next-date t-dgit fetch t-refs-same-start t-ref-same $first_imp t-ref-same $lrref fi lastv_imp=$this_imp done t-ok work/tests/tests/import-nonnative0000755000000000000000000000050114761250142014467 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-import-chk t-tstunt-parsechangelog t-buildproductsdir-config # 1.0 with diff t-import-chk pari-extra 3-1 # 3.0 (quilt), multiple patches, multiple origs t-import-chk example 1.0-1 # 3.0 (quilt), single-debian-patch, one orig t-import-chk sunxi-tools 1.2-2.~~dgittest t-ok work/tests/tests/import-pushold0000755000000000000000000000115314761250142014150 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog p=example old=1.0-1 current=1.0-1.100 t-archive $p $current t-git-none mkdir $p cd $p git init t-dgit import-dsc $troot/pkg-srcs/${p}_${old}.dsc main git checkout main t-dgit fetch : "attempt push of old" t-expect-fail 'trying to push an old version' \ t-dgit push-source --deliberately-not-fast-forward --overwrite : "attempt push of current" t-dgit checkout sid t-expect-fail 'trying to push an old version' \ t-dgit push-source --deliberately-not-fast-forward --overwrite t-dgit push-source --force-uploading-old-version t-pushed-good dgit/sid t-ok work/tests/tests/import-tarbomb0000755000000000000000000000143614761250142014124 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-import-chk t-tstunt-parsechangelog mangle1 () { rm -f ${1}_* t-import-chk1 "$@" cd $tmp/mirror/pool/main dpkg-source -x ${p}_${v}.dsc td orig=${p}_${v%-*}.orig.tar.gz tar zxf $orig rm $orig ${p}_${v}.* cd $p mkdir urk echo urk >urk/urk export GZIP=-1 } mangle2 () { cd .. dpkg-source -b td rm -rf $p td cd $tmp t-archive-none $p t-archive-query t-import-chk2 } # 3.0 (quilt), multiple patches, tarbomb orig mangle1 example 1.0-1 tar zvcf ../$orig * mangle2 # 3.0 (quilt), multiple patches, tarbomb orig with dot mangle1 example 1.0-1 tar zvcf ../$orig . mangle2 # 3.0 (quilt), multiple patches, tarbomb orig with dot and .git and .pc mangle1 example 1.0-1 git init mkdir .pc echo SPONG >.pc/SPONG tar zvcf ../$orig . mangle2 t-ok work/tests/tests/inarchivecopy0000755000000000000000000000256014761250142014030 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit t-tstunt-parsechangelog cd $p git checkout -b dgit/stable dgit/dgit/stable cd .. t-inarchive-copy () { local vm=$1 local from=${2:-sid} local to=${3:-stable} egrep "^${vm//./\\.}" aq/package.$from.$p >>aq/package.$to.$p t-aq-archive-updated $to $p } copy-check-good () { git diff $vtag t-refs-same refs/remotes/dgit/dgit/$tosuite t-ref-head t-has-parent-or-is HEAD $vtag } copy-check () { local vm=$1 local tosuite=${2:-stable} t-inarchive-copy $vm '' $tosuite vtag=$(v=$vm t-v-tag) cd $p t-refs-same-start t-dgit fetch $tosuite git merge --ff-only dgit/dgit/$tosuite copy-check-good local fetched; fetched=$(t-sametree-parent HEAD) cd .. rm -rf example.cloned t-dgit clone $p $tosuite example.cloned cd example.cloned t-refs-same-start copy-check-good local cloned; cloned=$(t-sametree-parent HEAD) cd .. rm -rf example.initd mkdir example.initd cd example.initd git init t-refs-same-start t-dgit -p $p fetch $tosuite git reset --hard refs/remotes/dgit/dgit/$tosuite copy-check-good local initd; initd=$(t-sametree-parent HEAD) cd .. t-refs-same-start t-ref-same-val fetched $fetched t-ref-same-val cloned $cloned t-ref-same-val initd $initd } copy-check 2.0 copy-check 2.1 cd $p git checkout -b dgit/testing $(v=1.1 t-v-tag) cd .. copy-check 2.1 testing t-ok work/tests/tests/manpages-format0000755000000000000000000000250114761250142014241 0ustar #!/bin/bash set -e autoimport= . tests/lib t-dependencies man-db make groff git-debrebase git-debpush cd $root printenv |grep MAKE ||: |t-sort manpages=$(MAKEFLAGS= MAKELEVEL= make list-manpages) export MANWIDTH=80 run_man () { if [ "x${DGIT_MANPAGES_SOURCE_DIR}" = x ]; then cmd='man --warnings "$@" $section $page' else make $roff >&2 cmd='man --warnings "$@" -l $roff' fi eval "$cmd 2>&1 >/dev/null |tee $errs" } cat >$tmp/always-expected <<'END' ERROR.* END for roff in $manpages; do for fmt in txt ps; do cat $tmp/always-expected >$tmp/$roff.$fmt-expected done done expected () { cat >>$tmp/$2.$1-expected } not_egrep_vxPf () { # egrep -vxPf does not work, so we reimplement it perl -ne ' BEGIN () { open PATS, shift @ARGV or die $!; $re = join "|", map { chomp; qr{^(?:$_)$} } qr{^(?=a)b}, ; print STDERR "RE $re\n"; } next if m{$re}; print STDERR "unexpected: $_"; $bad = 1; END { die "unexpected errors\n" if $bad; } ' "$@" } expected txt dgit.1 <<'END' .* # table wider than line width END prep () { fmt=$1 errs=$tmp/$roff.$fmt-errs } check () { perl -0777 -i~ -pe 's/\n[ \t]+/ # /' $errs not_egrep_vxPf $tmp/$roff.$fmt-expected $errs } for roff in $manpages; do section=${roff##*.} page=${roff%.*} prep txt run_man check prep ps run_man -Tps check done t-ok work/tests/tests/mirror0000755000000000000000000000244514761250142012501 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-mirror t-dependencies rsync t-drs : ---- "basic test" ---- t-tstunt-parsechangelog t-prep-newpackage example 1.0 t-mirror-setup cd $p revision=1 t-dgit build t-dgit push-built --new t-check-mirrored : ---- "stunt ssh test" ---- sentinel=$tmp/stunt-ssh-sentinel cat <$tmp/stunt-ssh #!/bin/sh set -ex : $sentinel cat >&2 $sentinel shift # eat HOST export SSH_ORIGINAL_COMMAND="\$*" exec \${DGIT_MIRROR_SSH_WRAP_TEST-dgit-mirror-ssh-wrap} \ '$tmp/git-mirror/' .git -- END chmod +x $tmp/stunt-ssh t-mirror-set rsyncssh=$tmp/stunt-ssh t-mirror-set remoterepos=HOST:$reposmirror # mirror should fail due to lack of stunt-ssh-sentinel t-commit-build-push-expect-log "stunt ssh test" \ E:'mirror hook failed: .*exited' ls -al $queuedir/$p.a t-check-not-mirrored touch $sentinel t-mirror-hook backlog t-check-mirrored : ----- "stall timeout test" ----- rm -f $sentinel mkfifo $sentinel t-mirror-set hooktimeout=5 t-commit-build-push-expect-log "stall timeout test" \ E:'mirror hook failed: .*timeout' t-check-not-mirrored exec 3<>$sentinel exec 3>&- attempts=100 while [ -f $queuedir/$p.lock ]; do if [ $attempts = 0 ]; then \ fail "timed out waiting for lock to go away" fi attempts=$(( $attempts - 1 )) sleep 0.1 done t-check-mirrored t-ok work/tests/tests/mirror-debnewgit0000755000000000000000000000041414761250142014441 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-mirror t-dependencies rsync t-debpolicy t-archive pari-extra 3-1 t-git-none t-mirror-setup t-dgit clone $p cd $p t-cloned-fetched-good t-commit 'test commit' 3-2 t-dgit build t-dgit push-built t-check-mirrored t-ok work/tests/tests/mirror-private0000755000000000000000000000053614761250142014150 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-mirror t-dependencies rsync t-debpolicy t-tstunt-parsechangelog t-prep-newpackage example 1.0 t-mirror-setup cd $p revision=1 t-reporefs master t-dgit push-source --new t-check-not-mirrored t-files-notexist $reposmirror/$p.* t-archive-process-incoming sid t-policy-periodic t-check-mirrored t-ok work/tests/tests/mismatches-contents0000755000000000000000000000055314761250142015155 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-prep-newpackage example 1.0 ln -s $troot/pkg-srcs/${p}_${v%-*}.orig.tar.* . cd $p v=1.0-1 t-debchange -v $v -D unstable -m 'Make a revision' echo foo >us-file git add us-file debian/changelog git commit -m "Commit $v" t-dgit build-source t-expect-fail 'debian/TRASH' \ t-dgit push-built --new t-ok work/tests/tests/mismatches-dscchanges0000755000000000000000000000101214761250142015411 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-prep-newpackage example 1.0 cd $p revision=1 check () { local fext=$1 local emsgpat=$2 t-dgit -wgf build-source perl -i~ -pe 's/^ ([0-9a-f])/ sprintf " %x", (hex $1)^1 /e' \ ../*.$fext t-expect-fail "$emsgpat" \ t-dgit -wgf push-built --new } check dsc E:'dpkg-source.*error.*checksum' check changes E:'dgit.*hash or size.*varies' # and finally check that our test is basically working t-dgit -wgf build-source t-dgit -wgf push-built --new t-ok work/tests/tests/multisuite0000755000000000000000000000175014761250142013371 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit t-tstunt-parsechangelog cd $p rsta=$(t-git-get-ref refs/remotes/dgit/dgit/stable) rsid=$(t-git-get-ref refs/remotes/dgit/dgit/sid) multi-good () { t-refs-same-start t-refs-same refs/remotes/dgit/dgit/stable t-ref-same-val "previous stable" $rsta t-refs-same-start t-refs-same refs/remotes/dgit/dgit/sid t-ref-same-val "previous sid" $rsid t-refs-same-start t-refs-same refs/remotes/dgit/dgit/stable,sid t-ref-same-val "previous combined" $rcombined } t-dgit fetch stable,unstable rcombined=$(t-git-get-ref refs/remotes/dgit/dgit/stable,sid) multi-good cd .. t-dgit clone $p stable,unstable ./$p.clone cd $p.clone multi-good t-commit bogus 3.0 stable,unstable t-expect-fail "does not support multiple" \ t-dgit -wgf build cd .. t-dgit clone --no-rm-on-error $p stable ./$p.pull cd $p.pull git checkout -b x git commit --allow-empty -m X t-dgit pull stable,unstable multi-good t-has-parent-or-is HEAD $rcombined t-ok work/tests/tests/orig-include-exclude0000755000000000000000000000047114761250142015174 0ustar #!/bin/bash set -e . tests/lib suitespecs+=' stable' . $troot/lib-orig-include-exclude ofb=example_1.1.orig.tar zcat $ofb.gz >$ofb.SPONG gzip -1Nv $ofb.SPONG mv $ofb.SPONG.gz $ofb.gz cd $p test-push-1 1.1-1.3 '' stable t-expect-fail E:'archive contains .* with different checksum' \ test-push-2 --new t-ok work/tests/tests/orig-include-exclude-chkquery0000755000000000000000000000137314761250142017027 0ustar #!/bin/bash set -e . tests/lib t-git-config dgit-distro.test-dummy.archive-query ftpmasterapi: # ^ that will crash if it gets unexpected file_in_archive queries # orig-include-exclude will set origs and usvsns update-files_in_archive () { for o in $origs; do for usvsn in $usvsns; do \ of=${p}_${v%-*}.${o}.tar.gz pat="%/${of//_/\\_}" # curl url-decodes these things so we have to have literals find $tmp/mirror -name $of | \ xargs -r sha256sum | \ perl -pe ' BEGIN { print "["; } chomp; s/^/{"sha256sum":"/; s/ /","filename":"/; s/$/"}$delim/; $delim=","; END { print "]\n"; } ' \ >$tmp/aq/"file_in_archive/$pat" done; done } test_push_2_hook=update-files_in_archive . $troot/lib-orig-include-exclude t-ok work/tests/tests/overwrite-chkclog0000755000000000000000000000204414761250142014620 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit cd example suite=stable t-commit 'No changes, just send to stable' '' stable t-dgit -wgf build t-expect-fail 'Perhaps debian/changelog does not mention' \ t-dgit push-built --overwrite stable t-dgit setup-mergechangelogs t-expect-fail 'fix conflicts and then commit the result' \ git merge dgit/dgit/stable git checkout master which EDITOR=: git commit perl -i~ -pe 's/^(\w+ \(\S+\)) stable/$1 UNRELEASED/ if $.>1' debian/changelog git add debian/changelog git commit -m 'UNRELEASED changelog' t-dgit -wgf build t-expect-fail E:'Distribution.*is UNRELEASED' \ t-dgit push-built --overwrite stable git revert --no-edit 'HEAD^{/UNRELEASED changelog}' t-dgit -wgf build perl -i~ -pe 's/^(\w+ \(\S+)(\) stable)/$1+X$2/ if $.>1' debian/changelog git add debian/changelog git commit -m 'Break changelog' t-expect-fail 'Perhaps debian/changelog does not mention' \ t-dgit push-built --overwrite stable git revert --no-edit 'HEAD^{/Break changelog}' t-dgit push-built --overwrite stable t-ok work/tests/tests/overwrite-junk0000755000000000000000000000052614761250142014160 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit cd example suite=stable t-commit 'No changes, just send to stable' '' stable t-dgit -wgf build ( : "make a bit of a wrongness, which we still want to be able to overwrite" cd $tmp/git/$p.git; git tag -f $tagpfx/1.2 $tagpfx/1.1 ) t-dgit push-built --overwrite=1.2 stable t-ok work/tests/tests/overwrite-splitbrains0000755000000000000000000000063114761250142015540 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-gbp-example-prep-no-ff t-dgit --quilt=gbp --dgit-view-save=split.b build-source t-dgit fetch t-refs-same-start t-ref-head t-expect-fail 'maybe --overwrite is needed' \ t-dgit --quilt=gbp --dgit-view-save=split.p push-built t-refs-same-start t-ref-head t-dgit --quilt=gbp --dgit-view-save=split.p --overwrite push-built t-gbp-pushed-good t-ok work/tests/tests/overwrite-version0000755000000000000000000000042214761250142014671 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit cd example suite=stable t-commit 'No changes, just send to stable' '' stable t-dgit -wgf build t-expect-fail 'HEAD is not a descendant' \ t-dgit push-built stable t-dgit push-built --overwrite=1.2 stable t-ok work/tests/tests/package-build0000755000000000000000000000027614761250142013657 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-git-only mkdir $tmp/dgit cd $root git ls-files -z |xargs -0 cp --parents -t $tmp/dgit cd $tmp/dgit dpkg-buildpackage -nc -uc -b echo ok. work/tests/tests/pbuilder0000755000000000000000000000243214761250142012771 0ustar #!/bin/bash set -e . tests/lib suitespecs+=' stable' t-buildproductsdir-config t-prep-newpackage example 1.0 cd $p t-commit "make a commit" 1.1 stable t-tstunt pbuilder t-expect-fail "dgit: error: you asked for a builder but your debbuildopts didn't ask for any binaries -- is this really what you meant?" \ t-dgit -v0 --pbuilder="$troot/pretend-pbuilder" pbuilder -S t-expect-fail "dgit: error: we must build a .dsc to pass to the builder but your debbuiltopts forbids the building of a source package; cannot continue" \ t-dgit -v0 --pbuilder="$troot/pretend-pbuilder" pbuilder -b # it would be nice to try passing -g on the end of the following line # to confirm it gets massaged into -A, but the example package is # RC-buggy in that it doesn't build with -A .. t-dgit -v0 --pbuilder="$troot/pretend-pbuilder" --pbuilder!:--no-source-only-changes pbuilder t-dgit -wgf push-built --new t-pushed-good master stable t-pushed-good-check-changes # check we actually built binaries t-push-included example_1.1_all.deb # this purpose of this is to check that the _source.changes that was # merged is the one that dgit made, not something pbuilder made (this # works because the -v$v in the above is handled by dgit and not # passed on to pbuilder) grep -F "example (1.0)" $changes_filename t-ok work/tests/tests/protocol-compat0000755000000000000000000000214014761250142014301 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-reprepro t-setup-import examplegit t-tstunt-parsechangelog t-git-config dgit.default.distro foreign t-git-config dgit-distro.foreign.cmd-git false prep () { dscf=$tmp/mirror/pool/main/example_$v.dsc } check () { pd=$p.$suite t-refs-same-start t-archive-none $p t-archive-query $suite t-dgit clone $p $suite $pd cd $pd t-ref-head $1 local distro='' t-dgit import-dsc $dscf +imported t-ref-same refs/heads/imported cd .. } reset () { cd .. rm -rf $pd mkdir $pd cd $pd git init } : ---------- newer ---------- suite=sid v=2.1 prep perl -i~ -pe 's/^Dgit: .*/$& EXTRA DATA\n TO BE IGNORED/' $dscf check reset : ---------- newline ---------- suite=testing v=2.0 prep perl -i~ -pe 's/^(Dgit: \w+ \S+ \S+) (.*)/$1\n $2 EXTRA/' $dscf check reset : ---------- older ---------- suite=stable v=1.2 prep perl -i -pe 's/^(Dgit: \w+).*/$1/' $dscf check : ---------- expect fail ---------- pd=$p.fail t-git-config dgit.default.old-dsc-distro downstream t-expect-fail 'no configured url and .dsc provides no hint' \ t-dgit clone $p $suite $pd t-ok work/tests/tests/push-buildproductsdir0000755000000000000000000000076514761250142015531 0ustar #!/bin/bash set -e . tests/lib t-archive pari-extra 3-1 t-git pari-extra 3-1 t-dgit clone $p cd $p t-cloned-fetched-good v=3-2~dummy1 t-apply-diff 3-1 $v debcommit -a t-refs-same-start t-ref-head t-dgit --dpkg-buildpackage:-d build cd .. mkdir bpd mv $p*_* bpd/ mv bpd/*orig* . cd $p t-dgit --build-products-dir=../bpd push-built t-pushed-good dgit/sid cd .. for f in ${p}_*.orig.*; do in_ddd=$( stat -c %D:%i -L $f ) in_bpd=$( stat -c %D:%i -L bpd/$f ) test $in_ddd = $in_bpd done t-ok work/tests/tests/push-newpackage0000755000000000000000000000066014761250142014246 0ustar #!/bin/bash set -e . tests/lib t-prep-newpackage pari-extra 3-1 cd $p t-refs-same-start t-ref-head t-expect-push-fail 'package appears to be new in this suite' \ t-dgit push-built t-dgit build git checkout bogus set +e (set -e; DGIT_TEST_DEBUG=' ' t-dgit push-built --new) rc=$? set -e if [ $rc = 0 ]; then fail "push succeeded when tree mismatch"; fi git checkout master t-dgit push-built --new t-pushed-good master t-ok work/tests/tests/push-newrepeat0000755000000000000000000000063714761250142014137 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-prep-newpackage example 1.0 cd $p git checkout quilt-tip cp $troot/pkg-srcs/${p}_1.0.orig.tar.gz .. t-dgit --quilt=smash build-source t-expect-fail E:'Push failed, while updating the remote git repository' \ t-dgit -cdgit-distro.test-dummy.git-url=file:///dev/enoent/fail \ push-built --new t-dgit push-built --new --force-reusing-version t-ok work/tests/tests/push-nextdgit0000755000000000000000000000043714761250142013771 0ustar #!/bin/bash set -e . tests/lib t-archive pari-extra 3-1 t-git pari-extra 3-1 t-dgit clone $p cd $p t-cloned-fetched-good v=3-2~dummy1 t-apply-diff 3-1 $v debcommit -a t-refs-same-start t-ref-head t-dgit --dpkg-buildpackage:-d build t-dgit push-source t-pushed-good dgit/sid t-ok work/tests/tests/push-source0000755000000000000000000000042014761250142013433 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-buildproductsdir-config t-prep-newpackage example 1.0 cd $p git config --global dgit.default.push-subcmd source t-refs-same-start t-ref-head t-dgit push --new t-pushed-good master t-push-was-source-only t-ok work/tests/tests/push-source-with-changes0000755000000000000000000000127114761250142016017 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-prep-newpackage example 1.0 cd $p t-refs-same-start t-ref-head # (1) try pushing a changes file containing binaries t-dgit build -F t-expect-push-fail 'user-specified changes file is not source-only' \ t-dgit -C ../${p}_1.0_multi.changes push-source --new # (2) try pushing a source-only changes file t-expect-fail F:'tree contains uncommitted files' \ t-dgit build-source cp debian/rules{,~} git clean -df ls debian/rules~ t-expect-fail F:'tree contains uncommitted files' \ t-dgit -wdda build-source t-dgit build-source t-dgit -C ../${p}_1.0_source.changes push-source --new t-pushed-good master t-push-was-source-only t-ok work/tests/tests/quilt0000755000000000000000000000374114761250142012325 0ustar #!/bin/bash set -e . tests/lib t-archive ruby-rails-3.2 3.2.6-1 t-git-none mkdir -p incoming cd incoming t-worktree test cd .. t-dgit clone $p cd $p t-cloned-fetched-good git fetch $tmp/incoming/$p dgit/sid:incoming dummy=0 iteration () { dummy=$(( $dummy + 1)) v=3.2.6-2~dummy${dummy} t-refs-same-start t-dgit --dpkg-buildpackage:-d build t-dgit push-built t-pushed-good dgit/sid } git cherry-pick -x incoming~1; iteration git cherry-pick -x incoming~0; iteration git fetch $tmp/incoming/$p incoming-branch:branch git checkout branch git rebase --onto dgit/sid incoming git checkout dgit/sid git merge branch iteration diff <../this.cmp # normalise perl -i~$compare~ -0777 -pe ' s/\n+$//; $_ .= "\n"; s/^(?:committer|parent|tree) .*\n//gm; s/\n+(\(cherry picked from .*\)\n)\n*/\n\n/m and s/$/$1/; s/\n+$//; $_ .= "\n"; ' ../this.cmp if test -f ../last.cmp; then diff -u ../last.cmp ../this.cmp fi mv ../this.cmp ../last.cmp done t-ok work/tests/tests/quilt-gbp0000755000000000000000000000353214761250142013071 0ustar #!/bin/bash set -e . tests/lib # `dgit build-source` cleans before applying patches. However, the # clean targets of 3.0 (quilt) packages are allowed to assume that # patches are applied. If they are not, the clean targets can # misbehave in basically two ways: # # - fail to clean everything # - error out and stop the build # # In this test, what we want to see is whether dgit detects that quilt # fixup cannot be linear because the user has failed to pass --gbp. # So we need to ensure the package's clean target does not error out, # because that blocks dgit attempting quilt linearisation. This # environment variable tells the example package's clean target not to # error out if it notices that patches have not yet been applied. export DGIT_TEST_TOLERATE_UNPATCHED_CLEAN=true t-tstunt-parsechangelog t-gbp-example-prep git config --global init.defaultBranch trunk t-expect-fail 'quilt fixup cannot be linear' \ t-dgit build-source t-dgit --quilt=gbp --dgit-view-save=split.b1 build-source git rev-parse split.b1 t-dgit --quilt=gbp --gbp-pq=no-such-command-gbp build-source echo spong >debian/pointless-for-dgit-test git add debian/pointless-for-dgit-test git commit -m Pointless t-expect-fail no-such-command-gbp \ t-dgit --quilt=gbp --clean=git --gbp-pq=no-such-command-gbp build-source test-push-1 () { t-refs-same-start t-ref-head } test-push-2 () { t-dgit --quilt=gbp --dgit-view-save=split.p push-built t-gbp-pushed-good } test-push-1 t-dgit --quilt=gbp --clean=git --dgit-view-save=split.b build-source t-expect-fail "HEAD specifies a different tree to $p" \ t-dgit push-built test-push-2 echo wombat >>debian/pointless-for-dgit-test git add debian/pointless-for-dgit-test git commit -m 'Pointless 2' t-commit 'Check pseudomerge' 1.0-3 test-push-1 t-dgit --quilt=gbp --clean=git --dgit-view-save=split.b build-source test-push-2 t-ok work/tests/tests/quilt-gbp-build-modes0000755000000000000000000000027114761250142015270 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-build-modes bm-gbp-example-acts \ 'build-source' \ 'build -b' \ 'build -S' \ 'gbp-build -S' \ 'gbp-build -b' \ t-ok work/tests/tests/quilt-gbp-build-modes-sbuild0000755000000000000000000000026314761250142016551 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-build-modes t-dependencies sbuild t-restrict x-dgit-schroot-build bm-gbp-example-acts \ "sbuild -c $schroot --arch-all" \ t-ok work/tests/tests/quilt-include-binaries0000755000000000000000000000432314761250142015535 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog p=example mkdir example cd example git init r=1 v0=1.0-$r t-dgit import-dsc $troot/pkg-srcs/${p}_${v0}.dsc +import git reset --hard import cat >debian/source/include-binaries <../$f done git add debian/source/include-binaries git commit -m 'specify include binaries' t-prep () { local m=$1 git checkout -B work master t-git-next-date r=$(( $r + 1 )) v=1.0-$r t-dch-commit -v$v -m "$1" } t-make-some-bin () { local file="$1" perl -e ' use autodie; print pack "H*", "d41d8cd98f00b204e9800998ecf8427e"; print "\n'"$file $r"'\n"; ' >"$file" } t-try-build-source () { LC_MESSAGES=C LANGUAGE=C \ t-dgit --quilt=nofix --since-version=$v0 "$@" build-source } t-roundtrips-1 () { t-try-build-source "$@" 2>&1 | tee ../build-source-out.$r t-dgit import-dsc ../${p}_${v}.dsc +reimport set +e git --no-pager grep SHOULD-NOT-APPEAR reimport -- rc=$? set -e test $rc = 1 git diff --exit-code work reimport -- } t-roundtrips () { t-roundtrips-1 t-roundtrips-1 --include-dirty } t-prep 'straightforward' mkdir bins t-make-some-bin bins/file git add bins/file git commit -m 'add bin' t-roundtrips for wrongness in \ "forbidden path component '..'" \ "path starts with '.git'" \ ; do grep "$wrongness" ../build-source-out.$r done t-prep 'bin via link' linktarget="$tmp" : 'make a new orig, gnagh' mkdir ../repack cd ../repack tar axf $troot/pkg-srcs/${p}_1.0.orig.tar.gz ln -s "$linktarget" example/bins tar zcf ../${p}_1.1.orig.tar.gz example cd ../example cp ../${p}_1.{0,1}.orig-docs.tar.gz v=1.1-$r t-dch-commit -v$v -m 'update upstream' ln -s "$linktarget" bins git add bins git commit -m 'add bins' t-roundtrips t-prep 'ignored weird file' mkdir bins mkfifo bins/file t-roundtrips-1 -wdn grep "'bins/file' not a plain file or directory" ../build-source-out.$r t-expect-fail E:'dpkg-source: error: *new version is named pipe' \ t-try-build-source -wdn --ignore-dirty t-ok work/tests/tests/quilt-singlepatch0000755000000000000000000000126414761250142014622 0ustar #!/bin/bash set -e . tests/lib t-archive sunxi-tools 1.2-2.~~dgittest t-git-none t-dgit clone $p cd $p t-cloned-fetched-good echo EXTRA-LINE-1 >>fel.c echo EXTRA-LINE-2 >>fel.c echo EXTRA-LINE-3 >>.gitignore git add fel.c .gitignore t-commit 'commit our stuff' 1.2-3 t-dgit -wgf quilt-fixup t-refs-same-start t-ref-head t-dgit -wgf build-source t-dgit push-built t-pushed-good dgit/sid diff <$pf < Subject: Add .gitignore --- END git diff /dev/null .gitignore >>$pf || test $? = 1 echo ${pf##*/} >>debian/patches/series git add debian/patches git rm -f .gitignore git commit -m 'Turn gitignore into a debian patch' gitigncommit=`git rev-parse HEAD` t-commit unapplied 1.0-3 echo "----- testing tree suitable for --quilt=unapplied (only) -----" t-expect-fail 'git tree differs from result of applying' \ t-dgit -wgf --quilt=dpm build-source t-expect-fail 'gitignores: but, such patches exist' \ t-dgit -wgf --quilt=gbp build-source t-expect-fail 'This might be a patches-unapplied branch' \ t-dgit -wgf build-source # Check that push-built regenerates the cache if necessary want_success_pre_push_hook='git update-ref -d refs/dgit-intern/quilt-cache' want-success unapplied -wgf want_success_pre_push_hook='' echo "===== making fully-applied tree suitable for --quilt-check =====" git checkout master git merge --ff-only dgit/dgit/sid t-commit vanilla 1.0-4 echo "----- testing fully-applied tree suitable for --quilt-check -----" t-expect-fail 'gitignores: but, such patches exist' \ t-dgit --quilt=dpm build-source t-expect-fail 'git tree differs from orig in upstream files' \ t-dgit --quilt=gbp build-source t-expect-fail 'git tree differs from orig in upstream files' \ t-dgit --quilt=unapplied build-source t-dgit --quilt=nofix build-source t-refs-same-start t-ref-head t-dgit --quilt=nofix push-built t-pushed-good-core echo "===== making tree suitable for --quilt=dpm (only) =====" git checkout master git merge --ff-only dgit/dgit/sid git revert --no-edit $gitigncommit t-commit dpmish 1.0-5 echo "----- testing tree suitable for --quilt=dpm (only) -----" t-expect-fail 'git tree differs from orig in upstream files' \ t-dgit -wgf --quilt=gbp build-source t-expect-fail 'git tree differs from orig in upstream files' \ t-dgit -wgf --quilt=unapplied build-source t-expect-fail 'This might be a patches-applied branch' \ t-dgit -wgf build-source want-success dpm suite=stable t-commit dpmish-stable 1.0-6 $suite want-success dpm --new t-ok work/tests/tests/quilt-useremail0000755000000000000000000000056314761250142014310 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-archive example 1.0-1 t-worktree 1.0 t-git-none cd $p git checkout quilt-tip-2 t-dgit -wgf fetch oe=other.email@example.com on='Hannibal Barca' git config --local user.email "$oe" git config --local user.name "$on" t-dgit -wgf --quilt=smash quilt-fixup git show | fgrep "$oe" git show | fgrep "$on" t-ok work/tests/tests/rpush0000755000000000000000000000153414761250142012326 0ustar #!/bin/bash set -e . tests/lib t-archive pari-extra 3-1 t-git pari-extra 3-1 t-dgit clone $p cd $p t-cloned-fetched-good v=3-2~dummy1 t-apply-diff 3-1 $v debcommit -a t-refs-same-start t-ref-head t-dgit-rpush () { t-dgit "$@" --ssh=$troot/ssh rpush somehost:$tmp/$p } mkdir $tmp/empty cd $tmp/empty t-expect-fail F:'error: looked for .dsc' \ t-dgit-rpush -cdgit.default.rpush-subcmd=built t-expect-fail F:'error: looked for .dsc' \ t-dgit-rpush -cdgit.default.push-subcmd=built cd $tmp/$p t-dgit --dpkg-buildpackage:-d build cd $tmp/empty t-expect-fail F:'dgit rpush, but dgit.default.[r]push-subcmd set to reject' \ t-dgit-rpush -cdgit.default.rpush-subcmd=reject t-expect-fail F:'dgit rpush, but dgit.default.[r]push-subcmd set to reject' \ t-dgit-rpush t-dgit-rpush -cdgit.default.rpush-subcmd=built cd $tmp/$p t-pushed-good dgit/sid t-ok work/tests/tests/rpush-quilt0000755000000000000000000000045414761250142013462 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-gbp-example-prep t-dgit -wgf --quilt=gbp --dgit-view-save=split.b build-source mkdir $tmp/empty cd $tmp/empty t-dgit --quilt=gbp --dgit-view-save=split.p \ --ssh=$troot/ssh rpush-built somehost:$tmp/$p cd $tmp/$p t-gbp-pushed-good t-ok work/tests/tests/rpush-source0000755000000000000000000000051014761250142013615 0ustar #!/bin/bash set -e . tests/lib t-archive pari-extra 3-1 t-git pari-extra 3-1 t-dgit clone $p cd $p t-cloned-fetched-good v=3-2~dummy1 t-apply-diff 3-1 $v debcommit -a t-refs-same-start t-ref-head mkdir $tmp/empty cd $tmp/empty t-dgit --ssh=$troot/ssh rpush-source somehost:$tmp/$p cd $tmp/$p t-pushed-good dgit/sid t-ok work/tests/tests/sbuild-gitish0000755000000000000000000000131214761250142013726 0ustar #!/bin/bash set -e . tests/lib t-dependencies sbuild man-db t-restrict x-dgit-schroot-build t-tstunt-parsechangelog t-prep-newpackage example 1.1 buildrune=$( t-dgit-manpage 7 dgit-user | \ perl -ne ' next unless m/^ +Using sbuild$/ .. 0; next unless m/^ +\%/ .. 0; next if !m/\S/ .. 0; s/^ +\%//; $fixchr += s/(\s-c\s*)jessie(\s|$)/$1'"$schroot"'$2/; s/^\s*sbuild/$& -v/m; print or die $!; END { $fixchr == 1 or die $fixchr; } ' ) cd $p build () { eval "$buildrune" } git checkout quilt-tip-1.1~0 build git checkout gitish-only~0 cat <<'END' >clean-target-hook #!/bin/sh set -ex test "$SCHROOT_SESSION_ID" END git add clean-target-hook git commit -m 'insist on schroot' build t-ok work/tests/tests/sourceonlypolicy0000755000000000000000000000131314761250142014602 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-prep-newpackage example 1.0 cd $p revision=1 dgit-with-policy () { local policy=$1; shift t-dgit -cdgit-distro.test-dummy.source-only-uploads=$policy "$@" } t-expect-fail E:'source-only.*entirely NEW' \ dgit-with-policy not-wholly-new push-source --new t-expect-fail E:'source-only.*requires \.debs' \ dgit-with-policy never push-source --new dgit-with-policy always push-source --new t-archive-process-incoming sid t-commit 'Now with binaries' t-dgit -wgf build t-expect-fail E:'uploading binaries.*source only' \ dgit-with-policy always push-built --new t-commit 'Source-only not NEW' dgit-with-policy not-wholly-new push-source --new t-ok work/tests/tests/spelling0000755000000000000000000000021014761250142012770 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-git-only cd $root set +e git grep -q -i 'ps[u]edo' rc=$? set -e test $rc = 1 t-ok work/tests/tests/tag-updates0000755000000000000000000000076114761250142013404 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-prep-newpackage example 1.0 cd $p revision=1 t-dgit push-source --new tagref=`t-v-tag` tagname=${tn#refs/tags} (set -e cd $dgitrepo git tag -m UNWANTED unwanted dgit/sid) fetch-check () { t-dgit fetch t-ref-same-exact $tagref t-refs-notexist refs/tags/unwanted } t-ref-same-exact $tagref fetch-check git tag -d $tagname fetch-check git tag -f -m BOGUS $tagname HEAD t-refs-same-start t-ref-same-exact $tagref fetch-check t-ok work/tests/tests/tagupl0000755000000000000000000001040614761250142012457 0ustar #!/bin/bash set -e . tests/lib t-dependencies DEBORIG git-debpush t-debpolicy t-archive-none example t-git-none t-worktree 1.0 v=1.0-1 cd $p git checkout -b native git checkout --orphan upstream quilt-tip-2 git rm -rf debian git commit -m 'pseudo-upstream' upstreamtag=UPSTREAM/RELEASE/1.0 git tag $upstreamtag git checkout -B master quilt-tip-2 echo foo >bar git add bar git commit -m"corrupt the upstream source to test upstream-nonidentical check" t-tagupl-settings tagname=test-dummy/$v t-expect-fail "the upstream source in tag $upstreamtag is not identical to the upstream source in refs/heads/master" \ t-tagupl-test --quilt=gbp --upstream=$upstreamtag git reset --hard HEAD~1 t-expect-fail "upstream tag $upstreamtag is not an ancestor of refs/heads/master" \ t-tagupl-test --quilt=gbp --upstream=$upstreamtag t-expect-fail "upstream tag $upstreamtag is not an ancestor of refs/heads/master" \ t-tagupl-test --quilt=gbp --force=suite --force=no-such-force-option --upstream=$upstreamtag t-tagupl-test --quilt=gbp --force=suite --force=no-such-force-option-1 \ --force=upstream-nonancestor,no-such-force-option-2 \ --upstream=$upstreamtag t-pushed-good master # todo: test each miss/rejection ident=ok git cat-file tag $tagname >../basetag v=1.0-2 tagname=test-dummy/$v perl -i -ne ' next if $.==1../^$/; next if m/^----/..0; s/\b1\.0-1\b/1.0-2/g; print or die $!; ' ../basetag mv-ident () { local f=$tmp/$1 if test -e $f; then mv $f $f--$ident fi } next-mangle () { mv-ident tagupl/overall.log mv-ident sendmail.log ident=$1 } with-mangled () { local perl=$1 perl <../basetag >../badtag-$ident -pe "$perl" git tag -u Senatus -f -s -m "$(cat ../badtag-$ident)" "$tagname" LC_MESSAGES=C \ t-tagupl-run-drs $tmp/$p } expect-quit () { next-mangle "$1" local perl=$2 local mregexp=$3 with-mangled "$perl" egrep ": $mregexp" ../tagupl/overall.log } expect-email () { next-mangle "$1" local perl=$2 local mregexp=$3 with-mangled "$perl" egrep 'Was not successful' ../sendmail.log egrep "$mregexp" ../sendmail.log egrep ": failed, emailed" ../tagupl/overall.log } raw-mangled () { git update-ref refs/tags/$tagname \ $(git hash-object -w -t tag ../tagobj-$ident) t-tagupl-run-drs $tmp/$p } tagname=test-dummy/1.2 t-expect-fail E:'failed command: git fetch' \ t-tagupl-run-drs $tmp/$p tagname=splorf/$v ; expect-quit baddistro '' 'tag name not for us' tagname=test-dummy/1,2; expect-quit badver '' 'tag name not for us' tagname=test-dummy/$v expect-quit noplease s/please-upload/plunk/ 'tag missing please-upload' expect-email vermatch 's/^example release /$&3/' 'reject: version mismatch' expect-email unkinfo 's/^\[dgit please-upload/$& Rejectme/' \ 'unknown dgit info in tag' expect-quit unkdistro 's/test-dummy/ubuntu/ if m/^\[dgit/' \ 'not for this distro' expect-email notsplit 's/ split / no-split /' 'reject: missing "split"' expect-email upsnot1 's/ upstream=/ uxstream=/' \ 'reject: upstream tag and not commitish' expect-email upsnot2 's/ upstream-tag=/ uxstream-tag=/' \ 'reject: upstream tag and not commitish' expect-email bupstag1 's/ upstream-tag=/$&:/' \ "failed command: git check-ref-format" expect-email bupstag2 's/ upstream-tag=/$&x/' \ "[Cc]ouldn't find remote ref refs/tags/xUPSTREAM" expect-email wrongver '' 'mismatch: changelog Version' v=1.0-2 t-dch-commit -v $v -m bump expect-email upsmism 's/ upstream=/$&3/' \ "but tag refers to" expect-email wrongpkg 's/^example /explosive /' 'mismatch: changelog Source' # we are going to trash $p because it will contain corrupted objects # which makes our end-of-test fsck fail cp -al ../$p ../$p.save cd ../$p git cat-file tag $tagname >../raw-base next-mangle sigfail perl -pe <../raw-base >../tagobj-$ident 's/ split / split ignoreme /' raw-mangled grep 'gpgv: BAD signature' ../sendmail.log next-mangle nosig perl -ne <../raw-base >../tagobj-$ident 'print unless m/^-----/..0' raw-mangled grep 'missing signature' ../sendmail.log git cat-file tag test-dummy/1.0-1 >../raw-base next-mangle badtagger perl -pe <../raw-base ' s/\+\d+$/xyz/ if m/^tagger /; exit 0 if m/^$/; ' >../tagobj-$ident echo >>../tagobj-$ident cat ../basetag >>../tagobj-$ident raw-mangled grep 'failed to fish tagger out of tag' ../tagupl/overall.log cd .. rm -rf $p mv $p.save $p t-ok work/tests/tests/tagupl-baredebian0000755000000000000000000000134214761250142014530 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-baredebian t-dependencies quilt git-debpush t-debpolicy t-setup-import baredebian cd $p baredebian-test-vars t-tagupl-settings baredebian-test-minimum baredebian-test-core-prepush sed -i '15icorruption' debian/patches/0002-Edit-the-.c-file.patch git add debian/patches/0002-Edit-the-.c-file.patch git commit -m"corrupt a quilt patch to test the patches-applicable check" tagname=test-dummy/$v t-expect-fail "'git apply' failed to apply patch 0002-Edit-the-.c-file.patch ('patches-applicable' check)" \ t-tagupl-test --baredebian git reset --hard HEAD~1 t-tagupl-test --baredebian git branch split.p dgit/dgit/sid # we didn't generate this here baredebian-test-core-postpush t-ok work/tests/tests/tagupl-gbp0000755000000000000000000000055314761250142013227 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-baredebian t-dependencies git-debpush DEBORIG t-setup-import gbp t-debpolicy cd $p git deborig t-dgit -wgf --quilt=gbp --dgit-view-save=split.b quilt-fixup t-tagupl-settings tagname=test-dummy/$v t-tagupl-test --gbp git branch split.p dgit/dgit/sid # we didn't generate this here t-gbp-pushed-good sid t-ok work/tests/tests/tagupl-native0000755000000000000000000000060214761250142013740 0ustar #!/bin/bash set -e . tests/lib t-dependencies git-debpush t-debpolicy t-archive-none example t-git-none t-worktree 1.1 v=1.0-1 cd $p git checkout -B master t-tagupl-settings printf '%s\n' -sn >debian/source/options git add debian/source/options git rm -f debian/source/format git commit -m 'convert to 1.0 native' tagname=test-dummy/$v t-tagupl-test t-pushed-good master t-ok work/tests/tests/test-list-uptodate0000755000000000000000000000037114761250142014736 0ustar #!/bin/bash set -e autoimport= . tests/lib t-dependencies NO-DEFAULT git : "just verifies internal consistency of test suite" cd $root $troot/enumerate-tests gencontrol >$tmp/control-expected diff debian/tests/control $tmp/control-expected t-ok work/tests/tests/trustingpolicy-replay0000755000000000000000000000345014761250142015555 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-dependencies dput-ng t-git-config dgit.default.dep14tag no t-dsd t-policy dgit-repos-policy-trusting t-prep-newpackage example 1.0 cd $p revision=1 git tag start t-dgit push-source --new t-rm-dput-dropping t-commit 'Prep v1.1 which will be rewound' t-dgit push-source git checkout $tagpfx/1.0 t-dgit push-source --deliberately-fresh-repo --force-reusing-version remote="`git config dgit-distro.test-dummy.git-url`/$p.git" t-expect-push-fail 'Replay of previously-rewound upload' \ git push "$remote" \ $tagpfx/1.1 \ $tagpfx/1.1~0:refs/dgit/sid git checkout master : "More subtle replay prevention checks" prepare-replay () { delib=$1 # We have to stop the pushes succeeding because if they work they # record the tag, which prevents the replays. We are simulating # abortive pushes (since we do want to avoid a situation where # dangerous old signed tags can exist). t-policy-nonexist t-commit "request with $delib that we will replay" t-dgit build t-expect-push-fail 'system: No such file or directory' \ t-dgit -cdgit-distro.test-dummy.policy-query-supported-ssh=false \ push-source $delib t-policy dgit-repos-policy-trusting replayv=$v } attempt-replay () { local mpat=$1 git show $tagpfx/$replayv | grep -e $delib t-expect-push-fail "$mpat" \ git push "$remote" \ $tagpfx/$replayv \ +$tagpfx/$replayv~0:refs/dgit/sid } prepare-replay --deliberately-fresh-repo # simulate some other thing that we shouldn't delete git push $dgitrepo +master:refs/heads/for-testing attempt-replay 'does not declare previously heads/for-testing' prepare-replay --deliberately-not-fast-forward t-commit 'later version to stop not fast forward rewinding' t-dgit push-source attempt-replay "does not declare previously tags/$tagpfx/$v" t-ok work/tests/tests/unrepresentable0000755000000000000000000000461714761250142014370 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-prep-newpackage example 1.1 ln -s $troot/pkg-srcs/${p}_${v%-*}.orig.tar.* . cd $p make_singlepatch () { git checkout quilt-tip-1.1 echo >debian/source/options single-debian-patch git add debian/source/options git commit -m single-debian-patch debian/source/options } quilt_mode=smash case $DGIT_TEST_TESTNAME in *-single-dpkg) make_singlepatch ;; *-single-git) quilt_mode=single ;; *-*) fail 'unknown test name' ;; *) ;; esac quilt-fixup () { t-dgit -wgf --quilt=$quilt_mode quilt-fixup } build-source () { t-dgit --quilt=nofix -wgf build-source } run-push () { t-dgit -wgf --dry-run push-built --new } badly-raw () { wrongmsg=$1 t-expect-fail "$1" \ quilt-fixup } badly-late-raw () { quilt-fixup build-source t-expect-fail "$1" \ run-push } good () { quilt-fixup build-source run-push } start () { path=$1 git checkout quilt-tip-1.1~0; } finish () { case "$DGIT_TEST_TESTNAME" in *-single-dpkg) expected=${2-$1} ;; *) expected=$1 ;; esac case "$expected" in NOTHING) ;; *) git commit -m "$expected" ;; esac case "$expected" in GOOD:*|NOTHING) good ;; EP:*) wrongmsg="${expected#*:}" badly-raw E:"cannot represent change: $wrongmsg .*: $path" ;; LATE-EP:*) # quilt-fixup and dpkg-source succeeded, but dgit push failed. # This is rather a poor outcome. case "$DGIT_TEST_TESTNAME" in *-single-dpkg) ;; *) fail 'push failure, other than with single-debina-patch' ;; esac wrongmsg="${expected#*:}" badly-late-raw "E:$wrongmsg.*: $path" ;; E:* | [^A-Z]*) badly-raw "$expected" ;; *) fail 'bad pattern' ;; esac } start orig-symlink ln -sf NEWTARGET orig-symlink git add orig-symlink finish EP:'modified symlink' 'new version is symlink' start orig-symlink git rm -f orig-symlink finish EP:'deletion of symlink' LATE-EP:'Mode change from 20000 to 000000' start new ln -s hi new git add new finish EP:'creation .* symlink' 'new version is symlink' start src.c git rm src.c finish GOOD:deleted start orig-exec git rm orig-exec finish GOOD:'deleted exec' start orig-unwriteable git rm -f orig-unwriteable finish GOOD:'deleted unwritable' start src.c chmod +x src.c git add src.c finish GOOD:chmod LATE-EP:'Mode change from 644 to 755' start newx echo hi >newx chmod 755 newx git add newx finish GOOD:add-755 LATE-EP:'Mode change from 644 to 755' start nothing finish NOTHING NOTHING t-ok work/tests/tests/unrepresentable-single-dpkg0000755000000000000000000000007414761250142016563 0ustar #!/bin/bash set -e . tests/lib t-chain-test unrepresentable work/tests/tests/unrepresentable-single-git0000755000000000000000000000007414761250142016421 0ustar #!/bin/bash set -e . tests/lib t-chain-test unrepresentable work/tests/tests/version-opt0000755000000000000000000000102514761250142013445 0ustar #!/bin/bash set -e . tests/lib # NOT t-tstunt-parsechangelog # because that doesn't honour the perl option corresponding to -v t-debpolicy t-prep-newpackage example 1.0 cd $p revision=1 git tag start t-dgit setup-mergechangelogs t-dgit push-source --new --overwrite t-archive-process-incoming sid for v in 1.1 1.2; do dch -v $v -D unstable -m "Update to version $v" git add debian/changelog git commit -m "Commit changelog for $v" t-dgit build-source done fgrep 'Update to version 1.1' ../${p}_${v}_source.changes t-ok work/tests/tstunt/0000755000000000000000000000000014761250142011433 5ustar work/tests/tstunt/Dpkg/0000755000000000000000000000000014761250142012320 5ustar work/tests/tstunt/Dpkg/Changelog/0000755000000000000000000000000014761250142014207 5ustar work/tests/tstunt/Dpkg/Changelog/Parse.pm0000644000000000000000000000406014761250142015617 0ustar # -*- perl -*- # # Copyright (C) 2015-2016 Ian Jackson # # Some bits stolen from the proper Dpkg::Changelog::Parse # (from dpkg-dev 1.16.16): # # Copyright (C) 2005, 2007 Frank Lichtenheld # Copyright (C) 2009 Raphael Hertzog # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . package Dpkg::Changelog::Parse; use strict; use warnings; our $VERSION = "1.00"; use Dpkg::Control::Changelog; use base qw(Exporter); our @EXPORT = qw(changelog_parse); die +(join " ", %ENV)." ?" if $ENV{'DGIT_NO_TSTUNT_CLPARSE'}; sub changelog_parse { my (%options) = @_; # largely ignored #use Data::Dumper; #print STDERR "CLOG PARSE ", Dumper(\%options); # # We can't do this because lots of things use `since' which # we don't implement, and it's the test cases that arrange that # the since value happens to be such that we are to print one output. # # foreach my $k (keys %options) { # my $v = $options{$k}; # if ($k eq 'file') { } # elsif ($k eq 'offset') { die "$v ?" unless $v <= 1; } # wtf, 1==0 ? # elsif ($k eq 'count') { die "$v ?" unless $v == 1; } # else { die "$k ?"; } # } $options{'file'} //= 'debian/changelog'; open P, "dpkg-parsechangelog -l$options{'file'} |" or die $!; my $fields = Dpkg::Control::Changelog->new(); $fields->parse(\*P, "output of stunt changelog parser"); #use Data::Dumper; #print STDERR "PARSE $0 ", Dumper($fields); close P or die "$! $?"; return $fields; } 1; work/tests/tstunt/debchange0000755000000000000000000000051714761250142013264 0ustar #!/bin/sh set -e spec=$(date --rfc-3339=seconds -d @"${GIT_AUTHOR_DATE% *}") spec=${spec%+*} # The nonsense with TZ is to work around #907264 tz_set=${TZ+set} if ! test "$tz_set"; then tz_undef=-u; fi set -x exec \ env TZ=UTC \ faketime -f "$spec" \ env $tz_undef TZ${tz_set:+=}"$TZ" \ "${DGIT_TEST_REAL_DEBCHANGE-debchange}" "$@" work/tests/tstunt/debuild0000755000000000000000000000020014761250142012761 0ustar #!/bin/bash set -e echo "DGIT TEST STUNT DEBUILD $*" >&2 "${DGIT_TEST_REAL_DEBUILD}" --preserve-env --preserve-envvar PATH "$@" work/tests/tstunt/dgit0000755000000000000000000000027114761250142012310 0ustar #!/bin/bash # NB This requires use of t-chain-test-somehow. set -ex oldpwd=$(pwd) cd "$DGIT_TEST_TROOT/.." . tests/lib cd "$oldpwd" trap '' EXIT # preserves our exit status t-dgit "$@" work/tests/tstunt/dpkg-deb0000755000000000000000000000010114761250142013026 0ustar #!/bin/sh set -x exec \ "${DGIT_TEST_REAL_DPKG_DEB}" -Znone "$@" work/tests/tstunt/dpkg-parsechangelog0000755000000000000000000000304514761250142015270 0ustar #!/usr/bin/perl -w # # In an example: # # $ time dpkg-parsechangelog >/dev/null # # real 0m0.712s # user 0m0.656s # sys 0m0.048s # $ time ~/things/Dgit/dgit/tests/tstunt/dpkg-parsechangelog >/dev/null # # real 0m0.016s # user 0m0.000s # sys 0m0.012s # $ $SIG{__WARN__} = sub { die $_[0]; }; # no use of system, so we avoid #793471 my $infile = "debian/changelog"; #print STDERR ">@ARGV<\n"; my @orgargv = @ARGV; if (@ARGV && $ARGV[0] =~ s/^-l//) { $infile = shift @ARGV; } if (@ARGV) { my $strip = $0; $strip =~ s#/[^/]+$## or die "$0 ?"; foreach my $k (qw(PATH PERLLIB)) { my @opath = defined $ENV{$k} ? split /\:/, $ENV{$k} : (); my @npath = grep { $_ ne $strip } @opath; @npath != @opath or die "$0 $k ".($ENV{$k}//"(undef)")." ?"; $ENV{$k} = join ':', @npath; delete $ENV{$k} if !@npath; } die if $ENV{'DGIT_NO_TSTUNT_CLPARSE'}++; exec 'dpkg-parsechangelog', @orgargv; } use strict; open C, $infile or die $!; $!=0; $_ = ; m/^(\S+) \(([^()]+)\) (\S+)\; urgency=(\S+)$/ or die "$!, $_ ?"; print <; if (m/^ -- ([^<>]+\<\S+\>) (\w[^<>]+\w)$/) { print <&2 2>>"$DGIT_TEST_GNUPG_LOG" rc=$? if [ $rc = 0 ]; then exit 0; fi if [ "x$DGIT_TEST_BYHAND" != x ]; then echo >&2 "BYHAND, not dumping $DGIT_TEST_GNUPG_LOG" else echo >&2 "########################################" echo >&2 "$DGIT_TEST_GNUPG_LOG" sed '\''s/^/\[gnupg-workarounds] /'\'' >&2 \ "$DGIT_TEST_GNUPG_LOG" echo >&2 "end of $DGIT_TEST_GNUPG_LOG" echo >&2 "########################################" fi exit $rc ' x \ "$DGIT_TEST_TROOT"/tstunt/gpg-withagent "$@" work/tests/tstunt/gpg-agent0000755000000000000000000000013714761250142013233 0ustar #!/bin/sh set -e exec \ $DGIT_TEST_REAL_GPG_AGENT \ --debug-quick-random \ "$@" work/tests/tstunt/gpg-locked0000755000000000000000000000150414761250142013375 0ustar #!/bin/sh set -e for attempt in '' ' ' exec; do case "$*" in *" --batch --import") # ^ apt-key's invocation if [ "x$stdin_tmp" = x ]; then stdin_tmp="$GNUPGHOME"/dgit-stdin-tmp cat >$stdin_tmp stdin_tmp_bytes=$(wc -c <$stdin_tmp) fi exec <$stdin_tmp ;; esac set +e $attempt \ $DGIT_TEST_REAL_GPG \ --agent-program=$DGIT_STUNT_AGENT \ "$@" rc=$? set -e if [ $rc != 2 ]; then exit $rc; fi echo >&2 "WARNING - GNUPG FAILED $rc - STUNT GNUPG $attempt $stdin_tmp_bytes $*" if [ "$stdin_tmp_bytes" = 0 ]; then sleep 5 else sh -ec ' if [ "x$DGIT_GNUPG_STUNT_ERRLOG" != x ]; then exec >"$DGIT_GNUPG_STUNT_ERRLOG" else exec 2>/dev/null fi exec >/dev/tty printf "%s\n" "$*" ' x "GNUPG WRAPPER - TROUBLE - $HOME $GNUPGHOME - FAILED $rc $attempt $stdin_tmp_bytes $*" ||: sleep 10 fi done exit 127 work/tests/tstunt/gpg-withagent0000755000000000000000000000205014761250142014123 0ustar #!/bin/sh set -ex d () { date --iso-8601=ns >&2 ps -ef | grep gpg-agent >&2 ||: } d retry_until_ok () { sleeptime=0 d while ! "$@"; do d case $sleeptime in ??.*) echo >&2 "$0: GPG AGENT STARTP $@ TIMED OUT" exit 127 ;; esac sleep $sleeptime sleeptime=$(echo "($sleeptime + 0.001) * 2" | bc -l) done } kill_agent_not_running () { LC_MESSAGES=C gpg-connect-agent --no-autostart &1 \ | tee -a /dev/stderr \ | grep 'no gpg-agent running' >&2 } echo >&2 'GPG-WITHAGENT... PRE-STOPPING' retry_until_ok kill_agent_not_running agent_is_running () { gpg-connect-agent --no-autostart &1 \ | grep dgit-gpg-agent-ok >&2 } $DGIT_STUNT_AGENT --daemon &2 retry_until_ok agent_is_running echo >&2 'GPG-WITHAGENT... RUNNING' d set +e $DGIT_TEST_REAL_GPG \ --agent-program=$DGIT_STUNT_AGENT "$@" 2>&9 rc=$? set -e d echo >&2 'GPG-WITHAGENT... STOPPING' retry_until_ok kill_agent_not_running echo >&2 'GPG-WITHAGENT... DONE' d exit $rc work/tests/tstunt/lintian0000755000000000000000000000012114761250142013011 0ustar #!/bin/sh echo >&2 'W: dgit test suite stunt lintian detects no problems' exit 0 work/tests/tstunt/sendmail0000755000000000000000000000025014761250142013152 0ustar #!/bin/sh set -e exec >>"$DGIT_TEST_TMP/sendmail.log" echo '----------------------------------------------------------------' date printf "sendmail %s\n" "$*" cat echo work/tests/update-dh-compat0000755000000000000000000000435514761250142013163 0ustar #!/bin/bash # dgit # Integration between git and Debian-style archives # # Copyright (C)2013-2021 Ian Jackson # Copyright (C)2017-2019 Sean Whitton # Copyright (C)2019 Matthew Vernon / Genome Research Limited # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e # This ad-hoc script was wrtten to deal with #1002927. export FILTER_BRANCH_SQUELCH_WARNING=1 toplevel=$PWD cd_fresh_d () { cd "$toplevel" rm -rf d mkdir d cd d } adjust="$toplevel"/tests/update-dh-compat-adjust adjust () { "$adjust"; } git_filter_strip_origs () { git for-each-ref refs/original \ --format '%(refname)' | xargs -rn1 git update-ref -d } adjust_git_filter () { # this is the dgit origin commit; this check may stop # us rewriting our normal dgit tree set +e git cat-file -e 06fb75074c0bebccdcf86385b8d248fd127ed66d rc=$? set -e test $rc = 1 git_filter_strip_origs git filter-branch \ --tree-filter "$adjust" \ --tag-name-filter cat \ -- --all git_filter_strip_origs git gc --aggressive --prune=all } cd "$toplevel" for f in tests/pkg-srcs/*.dsc; do cd_fresh_d dpkg-source -x ../$f p cd p adjust dpkg-source -b . cd .. dcmd rm ../$f dcmd mv *.dsc ../tests/pkg-srcs/ cd .. done cd "$toplevel" for f in tests/git-srcs/*.tar; do cd_fresh_d tar xf ../$f p=$(echo *) cd $p adjust_git_filter cd .. tar cf ../$f $p cd .. done cd "$toplevel" for f in tests/worktrees/*.tar; do cd_fresh_d tar xf ../$f p=$(echo *) cd $p adjust_git_filter adjust cd .. tar cf ../$f $p cd .. done cd "$toplevel" rm -rf d echo ok. work/tests/update-dh-compat-adjust0000755000000000000000000000171514761250142014450 0ustar #!/bin/sh # dgit # Integration between git and Debian-style archives # # Copyright (C)2013-2021 Ian Jackson # Copyright (C)2017-2019 Sean Whitton # Copyright (C)2019 Matthew Vernon / Genome Research Limited # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # See update-dh-compat # This ad-hoc script was wrtten to deal with #1002927. set -e perl -i -pe 's/^5$/12/' debian/compat work/tests/using-intree0000755000000000000000000000052114761250142012427 0ustar #!/bin/bash # # usage: # cd .../dgit.git # tests/using-intree tests/test/some-test # or # cd .../dgit.git # tests/using-intree tests/run-all # # effects: # sets DGIT_TEST_INTREE which causes tests/lib to have test scripts # using programs etc. from the working tree set -e pwd=`pwd` export DGIT_TEST_INTREE="$pwd" exec "$@" work/tests/worktrees/0000755000000000000000000000000014761250142012117 5ustar work/tests/worktrees/example_1.0.tar0000644000000000000000000021400014761250142014635 0ustar example/0000755000175000017500000000000014164202405010607 5ustar ianianexample/.git/0000755000175000017500000000000014164202405011450 5ustar ianianexample/.git/branches/0000755000175000017500000000000012524730531013241 5ustar ianianexample/.git/addp-hunk-edit.diff~0000644000175000017500000000116313132702165015301 0ustar ianian# Manual hunk edit mode -- see bottom for a quick guide @@ -10,6 +10,8 @@ binary binary-arch: dh_builddeb build build-indep build-arch: + ./new-exec + test ! -L orig-symlink @echo EXAMPLE RULES TARGET $@ clean: # --- # To remove '-' lines, make them ' ' lines (context). # To remove '+' lines, delete them. # Lines starting with # will be removed. # # If the patch applies cleanly, the edited hunk will immediately be # marked for staging. If it does not apply cleanly, you will be given # an opportunity to edit again. If all lines of the hunk are removed, # then the edit is aborted and the hunk is left unchanged. example/.git/gitk.cache0000644000175000017500000000233412731532431013400 0ustar ianian1 7 e8ebd035c2fac6acefd55deb0828ba0c32dc5f10 375318dd0f259e87a782de41c345e5dc580845f1 {43f2c23c6e74307004a8f20204cdda9d9edd0e15 a103675e4d6fe403595b42494dd00839c11c252b 0105b8c602fa51e9e947a7d1b6fd0d1203036a42 055a9f9be26f0387799626f6b8f392cdaae0c31e 375318dd0f259e87a782de41c345e5dc580845f1} 3cbf5af06a2e70022517cff5664b490d86915b4f 375318dd0f259e87a782de41c345e5dc580845f1 375318dd0f259e87a782de41c345e5dc580845f1 375318dd0f259e87a782de41c345e5dc580845f1 1986506b09aedf1864a4e3228284a58c3db6ac7a 1986506b09aedf1864a4e3228284a58c3db6ac7a d6025bb5f4cd5e5d7748f3fad2240e3e73c74ed7 1986506b09aedf1864a4e3228284a58c3db6ac7a {3045c3ba616707b425268847b13642f0f3b0fcae cc1e63c8af689a8b73852b999319ebf810ff4404 1986506b09aedf1864a4e3228284a58c3db6ac7a} 1986506b09aedf1864a4e3228284a58c3db6ac7a 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 {ccfa28ce24478c3336e77e709106a16a158ac7eb 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9} e2157295db63affb0fdc90c11c60b5f279aaa587 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 2767dfd053a8a3be1e7df2406b5a68ad913a661d {a26f8e83ba01707d830f942dc143a46140a87643 4d8f0e7980e2454b960fbd44cf76d11996098caa 2767dfd053a8a3be1e7df2406b5a68ad913a661d} 1 example/.git/refs/0000755000175000017500000000000012524730531012413 5ustar ianianexample/.git/refs/tags/0000755000175000017500000000000012524730531013351 5ustar ianianexample/.git/refs/heads/0000755000175000017500000000000014164202405013473 5ustar ianianexample/.git/refs/heads/qc/0000755000175000017500000000000012724643135014107 5ustar ianianexample/.git/refs/heads/patch-queue/0000755000175000017500000000000014164202405015714 5ustar ianianexample/.git/hooks/0000755000175000017500000000000012524730531012577 5ustar ianianexample/.git/hooks/applypatch-msg.sample0000755000175000017500000000070412524730531016737 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : example/.git/hooks/post-update.sample0000755000175000017500000000027512524730531016256 0ustar ianian#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info example/.git/hooks/commit-msg.sample0000755000175000017500000000160012524730531016056 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } example/.git/hooks/pre-rebase.sample0000755000175000017500000001144212524730531016034 0ustar ianian#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END example/.git/hooks/pre-applypatch.sample0000755000175000017500000000061612524730531016741 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : example/.git/hooks/update.sample0000755000175000017500000000703312524730531015272 0ustar ianian#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 example/.git/hooks/prepare-commit-msg.sample0000755000175000017500000000232712524730531017521 0ustar ianian#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" example/.git/hooks/pre-commit.sample0000755000175000017500000000325012524730531016061 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- example/.git/config0000644000175000017500000000013412724643135012647 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true example/.git/info/0000755000175000017500000000000014164202405012403 5ustar ianianexample/.git/info/refs0000664000175000017500000000070414164202405013270 0ustar ianian2b2ddc8b3f713d535acaa8da51346c46c68281a5 refs/heads/gitish-only e2157295db63affb0fdc90c11c60b5f279aaa587 refs/heads/indep-arch 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 refs/heads/master d6025bb5f4cd5e5d7748f3fad2240e3e73c74ed7 refs/heads/patch-queue/quilt-tip 1986506b09aedf1864a4e3228284a58c3db6ac7a refs/heads/quilt-tip 7fc34be828b8d7e20864ef74c08303033134326d refs/heads/quilt-tip-1.1 99fcab4e49e6fd71091f30d30760c3600e291263 refs/heads/quilt-tip-2 example/.git/info/exclude0000644000175000017500000000036012524730531013762 0ustar ianian# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ example/.git/logs/0000755000175000017500000000000014164202405012414 5ustar ianianexample/.git/logs/refs/0000755000175000017500000000000012524731655013367 5ustar ianianexample/.git/logs/refs/heads/0000755000175000017500000000000014164202405014437 5ustar ianianexample/.git/logs/refs/heads/master0000664000175000017500000000000014164202405015645 0ustar ianianexample/.git/logs/refs/heads/indep-arch0000664000175000017500000000000014164202405016364 0ustar ianianexample/.git/logs/refs/heads/qc/0000755000175000017500000000000012724643135015053 5ustar ianianexample/.git/logs/refs/heads/quilt-tip-1.10000664000175000017500000000000014164202405016577 0ustar ianianexample/.git/logs/refs/heads/quilt-tip0000664000175000017500000000000014164202405016302 0ustar ianianexample/.git/logs/refs/heads/gitish-only0000664000175000017500000000000014164202405016620 0ustar ianianexample/.git/logs/refs/heads/quilt-tip-20000664000175000017500000000000014164202405016441 0ustar ianianexample/.git/logs/refs/heads/patch-queue/0000755000175000017500000000000014164202405016660 5ustar ianianexample/.git/logs/refs/heads/patch-queue/quilt-tip0000664000175000017500000000000014164202405020523 0ustar ianianexample/.git/logs/HEAD0000664000175000017500000000000014164202405013030 0ustar ianianexample/.git/COMMIT_EDITMSG0000644000175000017500000000053613221513142013537 0ustar ianianrules: check we are patched # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Ian Jackson # Date: Sat Jun 4 22:12:36 2016 +0100 # # On branch quilt-tip-2 # Changes to be committed: # modified: debian/rules # example/.git/HEAD0000644000175000017500000000002713221513145012072 0ustar ianianref: refs/heads/master example/.git/packed-refs0000664000175000017500000000076214164202405013566 0ustar ianian# pack-refs with: peeled fully-peeled sorted 2b2ddc8b3f713d535acaa8da51346c46c68281a5 refs/heads/gitish-only e2157295db63affb0fdc90c11c60b5f279aaa587 refs/heads/indep-arch 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 refs/heads/master d6025bb5f4cd5e5d7748f3fad2240e3e73c74ed7 refs/heads/patch-queue/quilt-tip 1986506b09aedf1864a4e3228284a58c3db6ac7a refs/heads/quilt-tip 7fc34be828b8d7e20864ef74c08303033134326d refs/heads/quilt-tip-1.1 99fcab4e49e6fd71091f30d30760c3600e291263 refs/heads/quilt-tip-2 example/.git/ORIG_HEAD0000644000175000017500000000005113132706650012715 0ustar ianiane2123a9c45ab450a3a4bbbfe532d7d67bbca790a example/.git/description0000644000175000017500000000011112524730531013713 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. example/.git/objects/0000755000175000017500000000000014164202405013101 5ustar ianianexample/.git/objects/pack/0000755000175000017500000000000014164202405014017 5ustar ianianexample/.git/objects/pack/pack-75ffcc397c7b1c2b670feec9d7f104e054b889aa.idx0000444000175000017500000000573014164202405023342 0ustar ianiantOc  !!""""""""#####$$%%%%%%'((((((((++++++,,,,,,,,--........////////////00000145555666679999:;;;;;<<==>?????????@AABBBBBCDDDFFFFFFC|WyY\=jlj^8X$D]51 LMggT [zusNG"8t/1`::O#_2]'G}*FNתZ׉:Pk d"=z NfFv.%}#kCN5 &͗q'gS}@kZh:f+C'yS"^-6+-܋?q=SZʨQ4lFƂ0Eúag%&G6B4 m tjwRу59`.94'Ѱfbk=ܞ2(Y>L&^%.E3w2Qe@ͨFmǤ~~EBh^AcneJFu"gI6\AUI|hH]#;eN:B@r *8@iH>'yBU ZF)|n=vrtEuۆ@dMLh\h)bq1z}JMyEKDv T|7nF/ .Y Vh_@6{Z 5"kj) %r~flM+$n.,doh0h~`ݲ/Z!Ytx"R orK(dt142mhѷ-Uu{|No8WsuOעv2譙5)-,n,֥kU4S2(58vK]0HXzN;NIq 0``)c(0'Fk$A:op}-Ca@vC]ൺeKL\35ݢpvHƐ??  `OKhЮ0L1d3%3\YFbp)8p-X9ڎ 8c o%OT9qoUku\ůCb5(~cȯhs+Dæt"R\($G36~pjf?ΎOgd HQ1Rgk~<&/&^5p`g?4s[^]wH$>sNa}Yr5CP3&{~2'M+̗N쟲Eo&5iW|401=Ψ֡frcܐ`y jd7vf]F1ztcQ o(9ۓђc׭kg-9sQ|+x1CS;7fQŀ> ߈#BF9_cΘLDHgz#(EVO% B`h{1Agbʋ-!2ng >XvPDO;dR)mp`>.& "oL|d# uƑ!1~P3+Nt7Av`1Nǖʚ{!^SC6"|F~D=yoϡ}GM6am±w2a7;v=%N:h`ZTPϽb1&n SlW;`0;Y?֦`wYN\R8#2QK)%@4 mx\  ~-U9 I  Ut ; / x  q !&{ n9 DJfu9|{+gT{|?hexample/.git/objects/pack/pack-75ffcc397c7b1c2b670feec9d7f104e054b889aa.pack0000444000175000017500000001505514164202405023475 0ustar ianianPACKFx=n0 Ew}$SE];t)&v\ˆ,#_zs9"ޱ՚ٰ4cDS fi?$]MH(F$O'V2|/ǖm?Len,9u[u<`p^ZsRK{jt'^˴JS8.8t)Z*6v' ބPwx=n0 @]^K@dmoASt*YrHNM^o"9c(rJ&Y?yLQ098'Qځ-&C-{'A<{_?Tᗸ{]g^Vje<2 M×6Z+޷m]a@c/nr.Y=wT-xMN0 @}O=RЈ-qi)L*8># ؽէ7*$b)X_Ϧ"k X[8铻K)5ʙP#JKv1֒FXe zuAV_sqdC'46 ">A*;4V9<Ԭ ]yh~EVxMJ1BmI3K$fx7'|̐F$LFF C&ybq$E9Ji I^cjNz+J(M[oWo\ۍFݏqK{~Q - č^A?N ZPͲG'+7^ }vYmxJ0@}b6 V>$&%>"bC)h i9X)MTqƠcpV"R:8i S0hCKr= xް; _eűAVd7ym/R2(xRZ)oH|;hsξz q ܡ;e>+a\vxAN =I3 ]-:Zxx}xw?*!@1.C"sQŒsԬK:#qI c".3d} WFαRSh^z&}nAպLߦsK1GOhMnDZ6˪1eV sSxA Eb&Ph 1n\-ahJ mxy 1HK8`=r "ɠ9$zQҀYhQ'&>xSO[ W*p#^[cKvHV@[p}3&%mR~ QN{xK 0@9셒_ Ro1L֦SGZ5lE&Z@LaT40Cè# gg-Zcr<J)mpJk-?;Du߃"^m>>zߣF/*2&ԉa{ZZ OQvjQxA Eb֚ictôŦ`__˯"gybbc]эа'9&x©@mjq#2Q+uk?xB? <|\G7Z/\ڃ)\ylW֎8h8AycHCP3%ָ\X|dOxMj0:7/m'[u"!ׯBY |L+D Rj< _{n4v``V^*o rP/BH+m.faۖ \1>:$J~e3ss~ѿAau#ᴱ&'m9oIϵ 0jCR\PAJ\a|>F8W8m~,'Ox;0ާpWB6Ttk{B8TO*tڂBo8l`CQ7UMj>M @fdŇj 8:@WUgr,oO~tυA机Rn_/RY =jy bٶ5;$]|Is xxQ(5U! ,$--2,24,514hb-Ĺn@JA+3 b3xӪxλN@_1ex$hDƾ8w}(c!*)f4OƁ0ʔf,1n;вӃˮ( %FXGYdBc L~w:ťeglwsz^YXCrf`Xmn`leo h]K<8&#?7/4}kְje4_dTx;ȓZ[ag0dFY2x|CxuJ1 }0EЃvtӒv}{;;AC 3I@xȑ@r<}Q4[\3P6=+${\Gg%o;+3TKNZN+8nCeNS̤pzKc͍e)'ma0F 8`| Je gؼr9'51 .'xSVO/JMWP*,V<Ԋ܂T%.O }xj100644 .gitignore\YFbp)8p40000 debian]ൺeKL\35100755 exampleS2(58v[- x340031QHHKOOgX1%م \oxx(? um |_*w~2b24םTaU>Ԋ܂T̼ĜӡKWn99T㴼L.RsSSҜbiLO 'M @8(9am:זfmyOMR[STxxq"Gj2<*[Ng%2q" +xθQD!9#1/=5'?A[䳳ze[g}W5[{Dcx340031QK,L/JeW3?sekBJjRfbCֵ_5n)1ad;/ҶB'3}YVE4OWx MMR+s rR&_ ~~ӎu,␜$djoM3?110=_iPy庥%Ei@]+_qiwq)@%M9#myz?&\iiuxxq„{xxqaVo+W 6+?'xθqso-v68dzةUNtW 7xӪm x340031QHHKOOg08Q&}'Q[EGB$0.]ź8K%RWWRpOFL }5UZ[W\p:vM1G;'jTjnjPTZԚvXWOe,^jb Eɩ 7mӹ4o[ͳ/| }lYgx;8qw 5x340031QH/M,aZ۴xؽϨop5 ^Q?k`++/,IML:nǗ,x-PW4!#(Y/չ&ʕ#|d+4xtiBPv(>7͚yʊ+X3YD xSVO/JMW1V[?x+K-T-/*I+0}Ixxq"L Kojul*x;ʴiɉ] {:xtq rw slxtiBL}k <#TuO;)axbćJLxxq"IYqg-6-hx!kj(8q"Ȅ :Ex´i(&e&10+}8XcCU VK<'> r]xxQD!9#1/=5'?!?|F]ƻED)n99QumZx+LQH+K.(4kb>;xsLIQHTHIcU=xM(LѬ"irxθq„{ x340031QK,L/Je#C~ãnk ִ(xab )Iy Y~|ĄU(K U\̰K}gY[}?^540075UHH-Ie|1WL;֙Nos2CCXk\)?Zw۬G.xj100644 .gitignore\YFbp)8p40000 debianCS;7fQŀ> 100755 exampleS2(58v=-4x340031QHHKOOg^aYߕztV6*-H,ap]vqߗJ]"(?AY2yk s$"1 'U7(9C/3$1'tҕbwN28-/S7 M}f^Jj! 榦 E9 &9s9v5l*?tWSY^x[qBRf^bQnf^JjDݜ)9y\ xj100644 .gitignore\YFbp)8p40000 debiantx"R or100755 exampleS2(58v ,QxƸq" 2/;g=cUc .x;4qD'щen\9yV\E Ei )Iy9\Bq8x83%#>9'51 0xj100644 .gitignore\YFbp)8p40000 debian_cΘLDHgz#(100755 exampleS2(58vv+MCxƸq"x{Wo_beR6 xj100644 .gitignore\YFbp)8p40000 debian2'M+̗N쟲Eo100755 exampleS2(58v1-jix8qĀ4Ru9|{+gTexample/.git/objects/info/0000755000175000017500000000000014164202405014034 5ustar ianianexample/.git/objects/info/packs0000664000175000017500000000015314164202405015061 0ustar ianianP pack-903cba0e846f744706a41774e6861b278d2376aa.pack P pack-75ffcc397c7b1c2b670feec9d7f104e054b889aa.pack example/.git/COMMIT_EDITMSG~0000644000175000017500000000057713132702305013744 0ustar ianiancheck symlinks can be deleted Signed-off-by: Ian Jackson # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Sun Jul 16 16:21:55 2017 +0100 # # On branch gitish-only # Changes to be committed: # modified: debian/rules # deleted: orig-symlink # example/.git/FETCH_HEAD0000644000175000017500000000016312631152426013011 0ustar ianian3ae19a7996340f1ce74004d6e84f2de7d6670742 branch 'master' of /home/ian/things/Dgit/dgit/tests/pkg-srcs/example-1.0 example/.git/index0000664000175000017500000000122014164202405012477 0ustar ianianDIRCa9BZFe=\YFbp)8p .gitignorea9BZFe`+C'yS"^-6debian/changeloga9BUSbEuۆ@dM debian/compata9BUdLh\h)bq1z}Jdebian/controla9BUaUku\ůCb5(~debian/example.installa9BZFec AUI|hH]#;eN: debian/rulesa9BUS=$S2(58vexampleTREE87 1 >L&^%.E3w2Qedebian5 0 ]ൺeKL\35ݘWlH"KfE'Fexample/.gitignore0000644000175000017500000000000313221513145012567 0ustar ianian*~ example/example0000755000175000017500000000004412524704751012177 0ustar ianian#!/bin/sh echo "this is an example" example/debian/0000755000175000017500000000000014164202405012031 5ustar ianianexample/debian/rules0000755000175000017500000000041413221513145013107 0ustar ianian#!/usr/bin/make -f binary-indep: @echo EXAMPLE RULES TARGET $@ binary binary-arch: @echo EXAMPLE RULES TARGET $@ dh_install dh_gencontrol dh_builddeb build build-indep build-arch: @echo EXAMPLE RULES TARGET $@ clean: @echo EXAMPLE RULES TARGET $@ dh_clean example/debian/compat0000644000175000017500000000000214164202405013227 0ustar ianian8 example/debian/example.install0000644000175000017500000000002012555314271015053 0ustar ianianexample usr/bin example/debian/control0000644000175000017500000000036612555314271013450 0ustar ianianSource: example Section: devel Priority: extra Maintainer: Ian Jackson Standards-Version: 3.9.4.0 Build-Depends: debhelper (>= 8) Package: example Architecture: all Description: Example package for dgit testing example/debian/changelog0000644000175000017500000000021413221513145013677 0ustar ianianexample (1.0) unstable; urgency=low * Test package. -- Ian Jackson Wed, 13 May 2015 21:26:42 +0100 work/tests/worktrees/example_1.1.tar0000644000000000000000000024000014761250142014635 0ustar example/0000755000175000017500000000000014164202405010607 5ustar ianianexample/lib.c0000664000175000017500000000002613340053221011514 0ustar ianianvoid function(void){} example/.git/0000755000175000017500000000000014164202405011450 5ustar ianianexample/.git/branches/0000755000175000017500000000000012524730531013241 5ustar ianianexample/.git/addp-hunk-edit.diff~0000644000175000017500000000116313132702165015301 0ustar ianian# Manual hunk edit mode -- see bottom for a quick guide @@ -10,6 +10,8 @@ binary binary-arch: dh_builddeb build build-indep build-arch: + ./new-exec + test ! -L orig-symlink @echo EXAMPLE RULES TARGET $@ clean: # --- # To remove '-' lines, make them ' ' lines (context). # To remove '+' lines, delete them. # Lines starting with # will be removed. # # If the patch applies cleanly, the edited hunk will immediately be # marked for staging. If it does not apply cleanly, you will be given # an opportunity to edit again. If all lines of the hunk are removed, # then the edit is aborted and the hunk is left unchanged. example/.git/gitk.cache0000644000175000017500000000207013340053052013367 0ustar ianian1 6 99fcab4e49e6fd71091f30d30760c3600e291263 1986506b09aedf1864a4e3228284a58c3db6ac7a 1986506b09aedf1864a4e3228284a58c3db6ac7a 2b2ddc8b3f713d535acaa8da51346c46c68281a5 1986506b09aedf1864a4e3228284a58c3db6ac7a {ccc3a6caccf3aa148474d422f3c5525cb4c6e5aa f6cddf88fab20e827f23b58bbb0442461c39b5ca 7fc34be828b8d7e20864ef74c08303033134326d 1986506b09aedf1864a4e3228284a58c3db6ac7a} d6025bb5f4cd5e5d7748f3fad2240e3e73c74ed7 1986506b09aedf1864a4e3228284a58c3db6ac7a {3045c3ba616707b425268847b13642f0f3b0fcae cc1e63c8af689a8b73852b999319ebf810ff4404 1986506b09aedf1864a4e3228284a58c3db6ac7a} 1986506b09aedf1864a4e3228284a58c3db6ac7a 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 {ccfa28ce24478c3336e77e709106a16a158ac7eb 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9} e2157295db63affb0fdc90c11c60b5f279aaa587 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 2767dfd053a8a3be1e7df2406b5a68ad913a661d {a26f8e83ba01707d830f942dc143a46140a87643 4d8f0e7980e2454b960fbd44cf76d11996098caa 2767dfd053a8a3be1e7df2406b5a68ad913a661d} 1 example/.git/refs/0000755000175000017500000000000012524730531012413 5ustar ianianexample/.git/refs/tags/0000755000175000017500000000000012524730531013351 5ustar ianianexample/.git/refs/heads/0000755000175000017500000000000014164202405013473 5ustar ianianexample/.git/refs/heads/qc/0000755000175000017500000000000012724643135014107 5ustar ianianexample/.git/refs/heads/patch-queue/0000775000175000017500000000000014164202405015716 5ustar ianianexample/.git/hooks/0000755000175000017500000000000012524730531012577 5ustar ianianexample/.git/hooks/applypatch-msg.sample0000755000175000017500000000070412524730531016737 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : example/.git/hooks/post-update.sample0000755000175000017500000000027512524730531016256 0ustar ianian#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info example/.git/hooks/commit-msg.sample0000755000175000017500000000160012524730531016056 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } example/.git/hooks/pre-rebase.sample0000755000175000017500000001144212524730531016034 0ustar ianian#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END example/.git/hooks/pre-applypatch.sample0000755000175000017500000000061612524730531016741 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : example/.git/hooks/update.sample0000755000175000017500000000703312524730531015272 0ustar ianian#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 example/.git/hooks/prepare-commit-msg.sample0000755000175000017500000000232712524730531017521 0ustar ianian#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" example/.git/hooks/pre-commit.sample0000755000175000017500000000325012524730531016061 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- example/.git/config0000644000175000017500000000013412724643135012647 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true example/.git/info/0000755000175000017500000000000014164202405012403 5ustar ianianexample/.git/info/refs0000664000175000017500000000070414164202405013270 0ustar ianian2b2ddc8b3f713d535acaa8da51346c46c68281a5 refs/heads/gitish-only e2157295db63affb0fdc90c11c60b5f279aaa587 refs/heads/indep-arch 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 refs/heads/master d843a68be8a2a560041e4c8fc4b045c4d2ff32ed refs/heads/patch-queue/quilt-tip 1986506b09aedf1864a4e3228284a58c3db6ac7a refs/heads/quilt-tip 7fc34be828b8d7e20864ef74c08303033134326d refs/heads/quilt-tip-1.1 99fcab4e49e6fd71091f30d30760c3600e291263 refs/heads/quilt-tip-2 example/.git/info/exclude0000644000175000017500000000036012524730531013762 0ustar ianian# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ example/.git/logs/0000755000175000017500000000000014164202405012414 5ustar ianianexample/.git/logs/refs/0000755000175000017500000000000012524731655013367 5ustar ianianexample/.git/logs/refs/heads/0000755000175000017500000000000014164202405014437 5ustar ianianexample/.git/logs/refs/heads/master0000664000175000017500000000000014164202405015645 0ustar ianianexample/.git/logs/refs/heads/indep-arch0000664000175000017500000000000014164202405016364 0ustar ianianexample/.git/logs/refs/heads/qc/0000755000175000017500000000000012724643135015053 5ustar ianianexample/.git/logs/refs/heads/quilt-tip-1.10000664000175000017500000000000014164202405016577 0ustar ianianexample/.git/logs/refs/heads/quilt-tip0000664000175000017500000000000014164202405016302 0ustar ianianexample/.git/logs/refs/heads/gitish-only0000664000175000017500000000000014164202405016620 0ustar ianianexample/.git/logs/refs/heads/quilt-tip-20000664000175000017500000000000014164202405016441 0ustar ianianexample/.git/logs/refs/heads/patch-queue/0000755000175000017500000000000014164202405016660 5ustar ianianexample/.git/logs/refs/heads/patch-queue/quilt-tip0000664000175000017500000000000014164202405020523 0ustar ianianexample/.git/logs/HEAD0000664000175000017500000000000014164202405013030 0ustar ianianexample/.git/COMMIT_EDITMSG0000644000175000017500000000052513340053337013544 0ustar ianianAdd another new upstream file Gbp-Pq: Topic subdir Gbp-Pq: Name addnewups # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Sat Jun 4 22:09:32 2016 +0100 # # On branch patch-queue/quilt-tip # Changes to be committed: # new file: lib.c # example/.git/HEAD0000664000175000017500000000004613340053221012071 0ustar ianianref: refs/heads/patch-queue/quilt-tip example/.git/packed-refs0000664000175000017500000000076214164202405013566 0ustar ianian# pack-refs with: peeled fully-peeled sorted 2b2ddc8b3f713d535acaa8da51346c46c68281a5 refs/heads/gitish-only e2157295db63affb0fdc90c11c60b5f279aaa587 refs/heads/indep-arch 17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 refs/heads/master d843a68be8a2a560041e4c8fc4b045c4d2ff32ed refs/heads/patch-queue/quilt-tip 1986506b09aedf1864a4e3228284a58c3db6ac7a refs/heads/quilt-tip 7fc34be828b8d7e20864ef74c08303033134326d refs/heads/quilt-tip-1.1 99fcab4e49e6fd71091f30d30760c3600e291263 refs/heads/quilt-tip-2 example/.git/ORIG_HEAD0000644000175000017500000000005113132706650012715 0ustar ianiane2123a9c45ab450a3a4bbbfe532d7d67bbca790a example/.git/description0000644000175000017500000000011112524730531013713 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. example/.git/objects/0000755000175000017500000000000013340056274013107 5ustar ianianexample/.git/objects/pack/0000755000175000017500000000000014164202405014017 5ustar ianianexample/.git/objects/pack/pack-9c9203df30e15e5315ccde612b5f1d17e2a6bf12.pack0000444000175000017500000001513314164202405023273 0ustar ianianPACKFxJ0}Œ{ZѕB\'X4׷w7 F 1V'nQɦ(L¡(z6lT:(MP;vBY-OS Gk',akÜ-|Pġp,w 5i$\q9 u]so(# Kic{#\!boׯ7V`?||c# ؽէ7*$b)X_Ϧ"k X[8铻K)5ʙP#JKv1֒FXe zuAV_sqdC'46 ">A*;4V9<Ԭ ]yh~EVxMJ1BmI3K$fx7'|̐F$LFF C&ybq$E9Ji I^cjNz+J(M[oWo\ۍFݏqK{~Q - č^A?N ZPͲG'+7^ }vYmxJ0@}b6 V>$&%>"bC)h i9X)MTqƠcpV"R:8i S0hCKr= xް; _eűAVd7ym/R2(xRZ)oH|;hsξz q ܡ;e>+a\vxA Eb&Ph 1n\-ahJ mxy 1HK8`=r "ɠ9$zQҀYhQ'&>xSO[ W*p#^[cKvHV@[p}3&%mR~ QN{xK 0@9셒_ Ro1L֦SGZ5lE&Z@LaT40Cè# gg-Zcr<J)mpJk-?;Du߃"^m>>zߣF/*2&ԉa{ZZ OQvjQxA Eb֚ictôŦ`__˯"gybbc]эа'9&x©@mjq#2Q+uk?xB? <|\G7Z/\ڃ)\ylW֎8h8AycHCP3%ָ\X|dOxMj0:7/m'[u"!ׯBY |L+D Rj< _{n4v``V^*o rP/BH+m.faۖ \1>:$J~e3ss~ѿAau#ᴱ&'m9oIϵ 0jCR\PAJ\a|>F8W8m~,'Ox;0ާpWB6Ttk{B8TO*tڂBo8l`CQ7UMj>M @fdŇj 8:@WUgr,oO~tυA机Rn_/RY =jy bٶ5;$]|Is xxQ(5U! ,$--2,24,514hb-Ĺn@JA+3 b7xӪmxλN@_1ex$hDƾ8w}(c!*)f4OƁ0ʔf,1n;вӃˮ( %FXGYdBc L~w:ťeglwsz^YXCrf`Xmn`leo h]K<8&#?7/4}kְje4_dgTx;8qw 52x|CxuJ1 }0EЃvtӒv}{;;AC 3I@xȑ@r<}Q4[\3P6=+${\Gg%o;+3TKNZN+8nCeNS̤pzKc͍e)'ma0F 8`| Je gؼr9'51 .';xsLIQHTHIcU=xM(LѬ"x340031QK,L/JeW3?sekBJjRfbCֵ_5n)1ad;/ҶB'3}YVE4OWx MMR+s rR&_ ~~ӎu,␜$djoM3?110=_iPy庥%Ei@]+_qiwq)@%M9#myz?&\i˧ x340031QHHKOOg08Q&}'Q[EGB$0.]ź8K%RWWRpOFL }5UZ[W\p:vM1G;'jTjnjPTZH TsQMǙXeߩ?DL @8(9am:זfmyOMWx340031QH/M,aZ۴xؽϨop5 x340031Qrutue;!cnᖽBӓNu* 3i"xxq„{xxqaVo+W 6+?'xθqso-v68dzةUNtW xxq"֌m źz*cD։ڿ 9xMЬ:x340031QK,L/JeW3?sek*$&$fg38&3J6T)ݳ PHIMLciWzzOt{E7Jv@'3}YVE4OWxV$2L+ L'YݷkTI^jnjEj2Vg@eQdv XQqenNf^6;Č>^Q?k`++/,IML:nǗ,x-PW4!#(Y/չ&ʕ#|d+4xtiBPv(>7͚yʊ+X3YD xSVO/JMW1V[ x340031QHHKOOgX1%م \oxx(? um |_*w~2b24םTaU>Ԋ܂T̼ĜӡKWn99T㴼L.RsSSҜbiLO 'M @8(9am:זfmyOMR[S?x+K-T-/*I+0}lxxq"L Kojulx;ʴiɉ] {:xtq rw s@xtiBL}k <#TuO;)axbćJoxxq"IYqg-6-hx!kj(8q"Ȅ :x´i(&e&10+}8XcCU VK<'> rTxxq"Gj2<*[Ng%2q" ixθq„{ x340031QK,L/Je#C~ãnk ִ(xab )Iy Y~|ĄU(K U\̰K}gY[}?^540075UHH-Ie|1WL;֙Nos2CCXk\)?Zw۬G.3xӪxj100644 .gitignore\YFbp)8p40000 debianCS;7fQŀ> 100755 exampleS2(58v=-4x340031QHHKOOg^aYߕztV6*-H,ap]vqߗJ]"(?AY2yk s$"1 'U7(9C/3$1'tҕbwN28-/S7 M}f^Jj! 榦 E9 &9s9v5l*?tWSY^Qx;ȓZ[ag0dFYLx[qBRf^bQnf^JjDݜ)9y\ xj100644 .gitignore\YFbp)8p40000 debian]ൺeKL\35100755 exampleS2(58v[-xAV"Lh\h)bq1z}J100644 example*AUI|hH]#;eN:xj100644 .gitignore\YFbp)8p40000 debiantx"R or100755 exampleS2(58v ,GxƸq" 2/;g=cUc ?x;4qD'щen\9yV\E Ei )Iy9\Bq8x83%#>9'51 0xj100644 .gitignore\YFbp)8p40000 debian_cΘLDHgz#(100755 exampleS2(58vv+M9xƸq"x{Wo_beR6 xj100644 .gitignore\YFbp)8p40000 debian2'M+̗N쟲Eo100755 exampleS2(58v1-jix8qĀ4R0^Sa+_⦿example/.git/objects/pack/pack-9c9203df30e15e5315ccde612b5f1d17e2a6bf12.idx0000444000175000017500000000573014164202405023143 0ustar ianiantOc  !!""""""""#####$$%%%%%%'((((((((++++++,,,,,,,,--........////////////00000145555666678899:;;;;;<<==>?????????@AABBBBBCDDDFFFFFFC|WyY\=jlj^8X$D]51 LMggT [zusNG"8t/1`::O#_2]'G}*FNתZ׉:Pk d"=z NfFv.%}#kCN5 &͗q'gS}@kZh:f+C'yS"^-6+-܋?q=SZʨQ4lFƂ0Eúag%&G6B4 m tjwRу59`.94'Ѱfbk=ܞ2(Y>L&^%.E3w2Qe@ͨFmǤ~~EBh^AcneJFu"gI6\AUI|hH]#;eN:B@r *8@iH>'yBU ZF)|n=vrtEuۆ@dMLh\h)bq1z}JMyEKDv T|7nF/ .Y Vh_@6{Z 5"kj) %r~flM+$n.,doh0h~`ݲ/Z!Ytx"R orK(dt142mhѷ-Uu{|No8WsuOעv2譙5)-,n,֥kU4S2(58vK]0HXzN;NIq 0``)c(0'Fk$A:op}-Ca@vC]ൺeKL\35ݢpvHƐ??  `OKhЮ0L1d3%3\YFbp)8p-X9ڎ 8c o%OT9qoUku\ůCb5(~cȯhs+Dæt"R\($G36~pjf?ΎOgd HQ1Rgk~<&/&^5p`g?4sa}YrC袥`LİE25CP3&{~2'M+̗N쟲Eo&5iW|401=Ψ֡frcܐ`y jd7vf]F1ztcQ o(9ۓђc׭kg-9sQ|+x1CS;7fQŀ> ߈#BF9_cΘLDHgz#(EVO% B`h{1Agbʋ-!2ng >3}DO;dľmp0>.& ;0S|d# uƑ!1~P3+N17Av`1Nǖʚ" SC6װH |F~DQyoϡ}yG6am:{/w2a7;v=%N:h`ZTPϽb1&n L" ;`z\]0;Y?֦`wDN\R8#2QT)%@4  7 7+AdW ,  ?  XY F& >Mh T* 6 *3kX"30^Sa+_⦿J1l5A }~ƞU\example/.git/objects/info/0000755000175000017500000000000014164202405014034 5ustar ianianexample/.git/objects/info/packs0000664000175000017500000000015314164202405015061 0ustar ianianP pack-8b9ce6a40d3917e4d05c85d653061b77df1549be.pack P pack-9c9203df30e15e5315ccde612b5f1d17e2a6bf12.pack example/.git/COMMIT_EDITMSG~0000644000175000017500000000053313340053333013735 0ustar ianianAdd another new upstream file Gbp-Pq: Topic subdir Gbp-Pq: Name addnewups.patch # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Sat Jun 4 22:09:32 2016 +0100 # # On branch patch-queue/quilt-tip # Changes to be committed: # new file: lib.c # example/.git/FETCH_HEAD0000644000175000017500000000016312631152426013011 0ustar ianian3ae19a7996340f1ce74004d6e84f2de7d6670742 branch 'master' of /home/ian/things/Dgit/dgit/tests/pkg-srcs/example-1.0 example/.git/index0000664000175000017500000000212514164202405012504 0ustar ianianDIRC a M[V=ka}Yr .gitignorea M[Vfoh0h~`ݲ/Z!Ydebian/changeloga MUSaEuۆ@dM debian/compata MUeLh\h)bq1z}Jdebian/controla MUdUku\ůCb5(~debian/example.installa MZFe` AUI|hH]#;eN: debian/rulesa M[Vc :O#_2]'Gdebian/source/formata M[V^`h{1Agbʋ-! docs/READMEa MUS=$S2(58vexamplea M[V&5iW|401=Ψ֡flib.ca M[V=e pvHƐ??  new-upstream-filea M[V= lM+$n.,dsrc.cTREEu12 2 EVO% Bdocs1 0 -X9ڎ 8c debian6 1 j) %r~fsource1 0 n,֥kU47Omܘ46Ð=example/new-upstream-file0000664000175000017500000000001313340053221014065 0ustar ianianAdd a file example/docs/0000775000175000017500000000000013340053221011534 5ustar ianianexample/docs/README0000664000175000017500000000003413340053221012411 0ustar ianianSome document might be here example/.gitignore0000664000175000017500000000000713340053221012571 0ustar ianian*~ *.o example/example0000755000175000017500000000004412524704751012177 0ustar ianian#!/bin/sh echo "this is an example" example/src.c0000664000175000017500000000001513340053221011533 0ustar ianianmain(void){} example/debian/0000755000175000017500000000000014164202405012031 5ustar ianianexample/debian/rules0000755000175000017500000000041413221513145013107 0ustar ianian#!/usr/bin/make -f binary-indep: @echo EXAMPLE RULES TARGET $@ binary binary-arch: @echo EXAMPLE RULES TARGET $@ dh_install dh_gencontrol dh_builddeb build build-indep build-arch: @echo EXAMPLE RULES TARGET $@ clean: @echo EXAMPLE RULES TARGET $@ dh_clean example/debian/compat0000644000175000017500000000000214164202405013227 0ustar ianian8 example/debian/source/0000775000175000017500000000000013340053221013326 5ustar ianianexample/debian/source/format0000664000175000017500000000001413340053221014534 0ustar ianian3.0 (quilt) example/debian/example.install0000644000175000017500000000002012555314271015053 0ustar ianianexample usr/bin example/debian/control0000644000175000017500000000036612555314271013450 0ustar ianianSource: example Section: devel Priority: extra Maintainer: Ian Jackson Standards-Version: 3.9.4.0 Build-Depends: debhelper (>= 8) Package: example Architecture: all Description: Example package for dgit testing example/debian/changelog0000664000175000017500000000021613340053221013677 0ustar ianianexample (1.0-1) unstable; urgency=low * Test package. -- Ian Jackson Wed, 13 May 2015 21:26:42 +0100 work/tests/worktrees/pari-extra_3-1.tar0000644000000000000000000021400014761250142015260 0ustar pari-extra/0000775000175000017500000000000014164202405011232 5ustar ianianpari-extra/.git/0000775000175000017500000000000014164202405012073 5ustar ianianpari-extra/.git/branches/0000775000175000017500000000000012242154443013663 5ustar ianianpari-extra/.git/dgit/0000775000175000017500000000000012242154445013027 5ustar ianianpari-extra/.git/refs/0000775000175000017500000000000014164202405013032 5ustar ianianpari-extra/.git/refs/remotes/0000775000175000017500000000000012242154445014515 5ustar ianianpari-extra/.git/refs/remotes/dgit/0000775000175000017500000000000012242154445015444 5ustar ianianpari-extra/.git/refs/remotes/dgit/dgit/0000775000175000017500000000000012754122662016377 5ustar ianianpari-extra/.git/refs/original/0000775000175000017500000000000014164202405014636 5ustar ianianpari-extra/.git/refs/tags/0000775000175000017500000000000012242154443013773 5ustar ianianpari-extra/.git/refs/heads/0000775000175000017500000000000014164202405014116 5ustar ianianpari-extra/.git/refs/heads/dgit/0000775000175000017500000000000014164202405015045 5ustar ianianpari-extra/.git/hooks/0000775000175000017500000000000012242154443013221 5ustar ianianpari-extra/.git/hooks/applypatch-msg.sample0000775000175000017500000000070412242154443017361 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : pari-extra/.git/hooks/post-update.sample0000775000175000017500000000027512242154443016700 0ustar ianian#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info pari-extra/.git/hooks/commit-msg.sample0000775000175000017500000000160012242154443016500 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } pari-extra/.git/hooks/pre-rebase.sample0000775000175000017500000001144212242154443016456 0ustar ianian#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END pari-extra/.git/hooks/pre-applypatch.sample0000775000175000017500000000061612242154443017363 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : pari-extra/.git/hooks/update.sample0000775000175000017500000000703312242154443015714 0ustar ianian#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 pari-extra/.git/hooks/prepare-commit-msg.sample0000775000175000017500000000232712242154443020143 0ustar ianian#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" pari-extra/.git/hooks/pre-commit.sample0000775000175000017500000000325012242154443016503 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- pari-extra/.git/config0000664000175000017500000000043413037165317013274 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "dgit"] fetch = +refs/dgit/*:refs/remotes/dgit/dgit/* [remote "origin"] url = /nonexistent/dgit/tests/tmp/clone-nogit/git/pari-extra.git fetch = +refs/heads/*:refs/remotes/origin/* pari-extra/.git/info/0000775000175000017500000000000014164202405013026 5ustar ianianpari-extra/.git/info/refs0000664000175000017500000000016714164202405013714 0ustar ianian0bfc46797e1ed174335f693335a96f431ff4e0c5 refs/heads/bogus c6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 refs/heads/dgit/sid pari-extra/.git/info/exclude0000664000175000017500000000036012242154443014404 0ustar ianian# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ pari-extra/.git/logs/0000775000175000017500000000000014164202405013037 5ustar ianianpari-extra/.git/logs/refs/0000775000175000017500000000000012242154445014003 5ustar ianianpari-extra/.git/logs/refs/remotes/0000775000175000017500000000000012242154445015461 5ustar ianianpari-extra/.git/logs/refs/remotes/dgit/0000775000175000017500000000000012242154445016410 5ustar ianianpari-extra/.git/logs/refs/remotes/dgit/dgit/0000775000175000017500000000000012754122662017343 5ustar ianianpari-extra/.git/logs/refs/heads/0000775000175000017500000000000014164202405015062 5ustar ianianpari-extra/.git/logs/refs/heads/dgit/0000775000175000017500000000000014164202405016011 5ustar ianianpari-extra/.git/logs/refs/heads/dgit/sid0000664000175000017500000000000014164202405016501 0ustar ianianpari-extra/.git/logs/refs/heads/bogus0000664000175000017500000000000014164202405016112 0ustar ianianpari-extra/.git/logs/HEAD0000664000175000017500000000000014164202405013451 0ustar ianianpari-extra/.git/COMMIT_EDITMSG0000664000175000017500000000003612367464122014172 0ustar ianianAdd bogus text to Description pari-extra/.git/HEAD0000664000175000017500000000003112367464177012534 0ustar ianianref: refs/heads/dgit/sid pari-extra/.git/packed-refs0000664000175000017500000000024514164202405014203 0ustar ianian# pack-refs with: peeled fully-peeled sorted 0bfc46797e1ed174335f693335a96f431ff4e0c5 refs/heads/bogus c6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 refs/heads/dgit/sid pari-extra/.git/DGIT_ARCHIVE0000664000175000017500000000005112242154445013707 0ustar ianian1d7060a0b5714db1132e98611963e65edc766762 pari-extra/.git/description0000664000175000017500000000011112242154443014335 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. pari-extra/.git/objects/0000775000175000017500000000000014164202405013524 5ustar ianianpari-extra/.git/objects/pack/0000775000175000017500000000000014164202405014442 5ustar ianianpari-extra/.git/objects/pack/pack-5a56ba3cdae1890c53175d98a55cdde74f44863f.pack0000444000175000017500000000703614164202405023755 0ustar ianianPACK xj0aفZQM o0aFW36f5*H)94Zp]%$^G."OΆqk>~ V^j~eT xN0~#f*̌@Hf^ƾI,N;}{T,زts#3Zג5}ѭron뮧9!XGk8fy(urCM.=nBk{{h],+oa'R:l .z6]UB\)\ncp#͞*S3xmS]o0|Wcr!k.IHUtMp6G]太wgfgZj`GB{Uz $ 5`A )MAuΞ^<vcG@CM; *:5V \NpN 'Ԗ> g6%nz0լ*>IjOM S(]''Y4Ak#VP H˔,:>m:q cCX:۔*C@4*dO#B ,M竒d S r$񝕃F70)ԋ5=u4؋H֒Frq?v_w߷фTo|QZVkەXlN_@XlJ!E^P\%|/<Q#`xxn@yz(AI5mzx'fulC$BE;{5;;7LɌ3 zM%orTԋV ngBɲ#Ч `}Q,Ƕ K20N){$gS@s> n3ZuT>c[j#O{#A97>rMZM|QSs4VPvsN ppɖpqAVFÀt:0RXJ]L8x?eF[MԈ6}0 Jp1qZvA|Һ#,()-BX+TV7seAƔ<'6@?2G*Dô7Hd}4nsWGd( j|}=l29 †7wXfM]IHmfD( xK sD^(ⷯP:N;TrGԅZX*tΩ=Mr4"pqU<.?6ׂ-nd;E5ID͘l@kKBQ_'LNH&NQ[m0.M6h4+>m:^HXVCDoޚ%:#BL*a96Nيn}Yk߫8 0ܮ?ީ(MP6cu $맴=V{+$'7Q4a̬JKduè*9XcVAmJW鐇UR/?a3x34nQxmSMo@ﯘVJ q @5"-:۫wH0ډR@J373[% :i.@V%(;2y8|\lIFzxܐ__P_KXkc`ek^8˨m|{)B7`^UϫgBlP>`NG<QɖˆƜ>ɯ^+mj[ 1,`zoV_o^oCʴT{"PhB6ıB@kEfH<@ &EAŜBml*ĎAy?Plj HV"A&PU$8nS-]!|$#IVNd;`m+A% u $ZSdcGz}k}~EQV*Ss13bmנ#[xuO啎#WܰL[~ iAbeJp\%fx{X`hN3{ѣaL >XUezeU;͓Q% !-'Rh{ P,c;W&K#'}u 4;x7O-|wzcKih=*\Z^o;_;8i@x5k?+# xmN0 SƁ 4iwm#$r-YO*NA8 J% ְv)0)~LeIMa~ ; WyY y1 #JlupN:,Τ E V묙1SE&K,2x}RQk0~~ō>;ice + c=:ۢΜe$>tn5F^6~FZu`muX0Bu1J$݀跻Ghh8#$;q c[Zb4 Zskj=ǟg K_^ch{ I$8uK#k JC$ž~?^G_U'Z)aLƲZ$ :ZqLSI9WQE-$E%47M؈wl08|d(#dՄ--SǻL}}jќ^ur)g`ȋ8Zgj eAdǂ'\1%vNo%~?x31Ԥ<* /3 .Vy x340031QrutusIMLcs?3ZvM>)!DarFb^zjN~:u _7hpGf{f䟚 S[X_\]9-jםu+)aI~$oߏGTeg0IEeKrV*3>pž}E3sV9x31Ԥ< lٻ3{=}{xxqBE.J?;Ruz$U߂ZV< S]\OD?pari-extra/.git/objects/pack/pack-5a56ba3cdae1890c53175d98a55cdde74f44863f.idx0000444000175000017500000000263414164202405023622 0ustar ianiantOc ,cm  `!5LJZ Fy~t3_i35oC/JdS|_8njϤ 09qhLohu;a`d( YhKOei=/7٦ _7tH/r~o[A8}D{`ܴ{?$5bD$ұlNTLD^}Hɕ$`1MM 2BtK;W8mD"}RUeb%(僜P}zO}wE]g mek<_)7A't    ZV< S]\OD?Ў(Pzʒ|pari-extra/.git/objects/info/0000775000175000017500000000000014164202405014457 5ustar ianianpari-extra/.git/objects/info/packs0000664000175000017500000000006614164202405015505 0ustar ianianP pack-5a56ba3cdae1890c53175d98a55cdde74f44863f.pack pari-extra/.git/index0000664000175000017500000000111014164202405013116 0ustar ianianDIRCa3@R%w?LD^}Hdebian/README.Debiana3@R%{;a`d( YhKOeidebian/changeloga9?aa9?axH/r~o[A8}D{ debian/compata3@Shz ,cm  `!5LJZdebian/controla3@R%yD$ұlNTdebian/copyrighta3@R%v+09qhLohu debian/rulesTREE86 1 =/7٦ _7tdebian6 0 $`1MM 6K'KD^<0pari-extra/debian/0000775000175000017500000000000014164202405012454 5ustar ianianpari-extra/debian/rules0000775000175000017500000000145312242154445013544 0ustar ianian#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Modified for pari-extra by Bill Allombert 2001 # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 build: build-stamp build-stamp: dh_testdir touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp dh_clean install: build dh_testdir dh_testroot dh_prep dh_installdirs # Build architecture-independent files here. binary-arch: build install binary-indep: build install dh_testdir dh_testroot dh_installdocs dh_installexamples dh_installchangelogs dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install pari-extra/debian/README.Debian0000664000175000017500000000147712242154445014533 0ustar ianianpari-extra for Debian ---------------------- This package used to contains optional data files fo PARI/GP. It is now a dummy package and it is replaced by 3 packages: pari-galdata: Galois Resolvant files for the polgalois function for degrees 8, 9, 10 and 11 pari-elldata: PARI version of the Elliptic curve data by J. E. Cremona, , for use with ellsearch, ellidentity and ellgenerators. pari-seadata: modular polynomials for p < 500, for use with ellap. These polynomials were extracted from the ECHIDNA databases available at and computed by David R. Kohel (kohel@maths.usyd.edu.au) University of Sydney Feel free to remove it. -- Bill Allombert Fri, 05 Aug 2011 14:18:43 +0200 pari-extra/debian/compat0000664000175000017500000000000314164202405013653 0ustar ianian12 pari-extra/debian/copyright0000664000175000017500000000066712242154445014425 0ustar ianianThis package was debianized by Bill Allombert ballombe@debian.org on Fri, 17 Nov 2000 17:59:46 +0100. It was downloaded from ftp://pari.math.u-bordeaux.fr/pub/pari/packages Copyright: PARI/GP is copyright 1989-2006 by the PARI group and distributed under the terms of the GNU General Public License. On Debian GNU/Linux systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL'. pari-extra/debian/control0000664000175000017500000000242012367464177014100 0ustar ianianSource: pari-extra Build-Depends: debhelper (>=5) Section: math Priority: optional Maintainer: Bill Allombert Standards-Version: 3.9.2.0 Package: pari-extra Architecture: all Depends: pari-galdata, pari-elldata, pari-seadata, ${misc:Depends} Suggests: pari-gp, pari-galpol Description: PARI/GP Computer Algebra System extra data files PARI/GP is a widely used computer algebra system designed for fast computations in number theory (factorizations, algebraic number theory, elliptic curves...), but also contains a large number of other useful functions to compute with mathematical entities such as matrices, polynomials, power series, algebraic numbers, etc., and a lot of transcendental functions. PARI is also available as a C library to allow for faster computations. . Originally developed by Henri Cohen and his co-workers (University Bordeaux I, France), PARI is now under the GPL and maintained by Karim Belabas with the help of many volunteer contributors. . This is a dummy package which depends on pari-galdata: the Galois resolvants for the polgalois function. pari-elldata: the elliptic curves database for the ellsearch function. pari-seadata: the modular polynomials for the ellap function. It can be safely removed after the upgrade. pari-extra/debian/changelog0000664000175000017500000000361412242154445014337 0ustar ianianpari-extra (3-1) unstable; urgency=low * This package is now a dummy packages, replaced by pari-galdata and pari-elldata. * debian/control: - Depends on pari-galdata, pari-elldata and pari-seadata. - Suggests: galpol * Bump standard version to 3.9.2 * Move to debhelper v5 (May JoeyH dream of swirls). -- Bill Allombert Fri, 05 Aug 2011 14:07:02 +0200 pari-extra (2.1-1) unstable; urgency=low * New upstream bugfix release - elldata was missing some curves. * debian/watch: removed (cannot work). -- Bill Allombert Wed, 4 Oct 2006 17:36:44 +0200 pari-extra (2-1) unstable; urgency=low * New upstream release - this release is not compatible with PARI/GP 2.1. - this release include galdata and elldata. * Bump standard version to 3.7.2. * Update description. * Move to debhelper v4 (May JoeyH dream of swirls). -- Bill Allombert Sat, 3 Jun 2006 16:48:44 +0200 pari-extra (1-4) unstable; urgency=low * Bump standard version to 3.6.1. * update FTP site in debian/watch and debian/copyright. * description: Rename Université to University to avoid trouble with non latin-1 charsets. Thanks Denis Barbier. Closes: #245594. -- Bill Allombert Tue, 27 Apr 2004 19:04:04 +0200 pari-extra (1-3) unstable; urgency=low * Bump standard version to 3.5.9. * Rebuild with new debhelper to remove the /usr/share/doc transition code. * Clean up debian/rules. -- Bill Allombert Sun, 6 Apr 2003 17:10:00 +0200 pari-extra (1-2) unstable; urgency=low * Improved description. -- Bill Allombert Wed, 17 Oct 2001 19:35:11 +0200 pari-extra (1-1) unstable; urgency=low * Initial Release. Closes: BUG#99173 -- Bill Allombert Fri, 9 Mar 2001 14:49:27 +0100 Local variables: mode: debian-changelog End: work/tests/worktrees/pari-extra_drs.tar0000644000000000000000000033400014761250142015553 0ustar pari-extra/0000775000175000017500000000000014164202406011233 5ustar ianianpari-extra/.git/0000775000175000017500000000000014164202406012074 5ustar ianianpari-extra/.git/branches/0000775000175000017500000000000012301222477013662 5ustar ianianpari-extra/.git/dgit/0000775000175000017500000000000012301222530013012 5ustar ianianpari-extra/.git/dgit/tag.tmp0000664000175000017500000000030612301222530014306 0ustar ianianobject b270d9bebf4b063fb6808ce4bebee4c8af65b806 type commit tag debian/3-2_dummy1 tagger Senatus Romanus 1384698857 +0000 pari-extra release 3-2~dummy1 for unstable (sid) [dgit] pari-extra/.git/dgit/tag.tmp.asc0000664000175000017500000000075212301222530015060 0ustar ianian-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQEcBAABAgAGBQJTBSVYAAoJEKPby8A5sT2K6BgIAIB9R/QElsiNL5X223eR8bBP K0AefPlhuzjCW6HoX/QgaY/nGMUqjDwWgUbGzePQQ77fYqVQAxWJGKTGJkjpBQIR SU0K/WYSjfkCJ57gEggt9wjSZp+R4hrc03ld5Z+/gStxk9dj+eqo3VPAu6QdfSeL j+pug/x3cyEREr6Dkz2BgLe1HLR4VXCneqBTpzs7GIPpxq9v/Iu2eYspETIXeRYC cu9wB1jz67ScTzSgctickECQ47BvdHfFNNbmCGh5ugNOb2TbiZ5Whhjg8fxKZ/yJ HQ5BL+QlUTRcuriMfqBjZdty38AjFIMUF7UReoY7cdALZa9gxx4QVs1Ceqix5ms= =Y0on -----END PGP SIGNATURE----- pari-extra/.git/dgit/tag.signed.tmp0000664000175000017500000000126012301222530015556 0ustar ianianobject b270d9bebf4b063fb6808ce4bebee4c8af65b806 type commit tag debian/3-2_dummy1 tagger Senatus Romanus 1384698857 +0000 pari-extra release 3-2~dummy1 for unstable (sid) [dgit] -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQEcBAABAgAGBQJTBSVYAAoJEKPby8A5sT2K6BgIAIB9R/QElsiNL5X223eR8bBP K0AefPlhuzjCW6HoX/QgaY/nGMUqjDwWgUbGzePQQ77fYqVQAxWJGKTGJkjpBQIR SU0K/WYSjfkCJ57gEggt9wjSZp+R4hrc03ld5Z+/gStxk9dj+eqo3VPAu6QdfSeL j+pug/x3cyEREr6Dkz2BgLe1HLR4VXCneqBTpzs7GIPpxq9v/Iu2eYspETIXeRYC cu9wB1jz67ScTzSgctickECQ47BvdHfFNNbmCGh5ugNOb2TbiZ5Whhjg8fxKZ/yJ HQ5BL+QlUTRcuriMfqBjZdty38AjFIMUF7UReoY7cdALZa9gxx4QVs1Ceqix5ms= =Y0on -----END PGP SIGNATURE----- pari-extra/.git/dgit/unpack/0000775000175000017500000000000012301222527014301 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/0000775000175000017500000000000012301222527016515 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/0000775000175000017500000000000012301222527017356 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/branches/0000775000175000017500000000000012301222527021143 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/refs/0000775000175000017500000000000012301222527020315 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/refs/tags/0000775000175000017500000000000012301222527021253 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/refs/heads/0000775000175000017500000000000012301222527021401 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/0000775000175000017500000000000012301222527020501 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/applypatch-msg.sample0000775000175000017500000000070412301222527024641 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : pari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/post-update.sample0000775000175000017500000000027512301222527024160 0ustar ianian#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info pari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/commit-msg.sample0000775000175000017500000000160012301222527023760 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } pari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/pre-rebase.sample0000775000175000017500000001144212301222527023736 0ustar ianian#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END pari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/pre-applypatch.sample0000775000175000017500000000061612301222527024643 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : pari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/update.sample0000775000175000017500000000703312301222527023174 0ustar ianian#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 pari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/prepare-commit-msg.sample0000775000175000017500000000232712301222527025423 0ustar ianian#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" pari-extra/.git/dgit/unpack/pari-extra-3/.git/hooks/pre-commit.sample0000775000175000017500000000325012301222527023763 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- pari-extra/.git/dgit/unpack/pari-extra-3/.git/config0000664000175000017500000000013412301222527020544 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true pari-extra/.git/dgit/unpack/pari-extra-3/.git/info/0000775000175000017500000000000012301222527020311 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/info/exclude0000664000175000017500000000036012301222527021664 0ustar ianian# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ pari-extra/.git/dgit/unpack/pari-extra-3/.git/HEAD0000664000175000017500000000002712301222527020001 0ustar ianianref: refs/heads/master pari-extra/.git/dgit/unpack/pari-extra-3/.git/description0000664000175000017500000000011112301222527021615 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. pari-extra/.git/dgit/unpack/pari-extra-3/.git/objects0000777000175000017500000000000012301222527023355 2../../../../objectsustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/.git/index0000664000175000017500000000111012301222527020401 0ustar ianianDIRCS%WS%W A?LD^}Hdebian/README.DebianS%WS%W A {[t٘;%όJw:debian/changelogS%WS%W B~k*x$?M>i debian/compatS%WS%W B(,:nY YF@kfyyEdebian/controlS%WS%W AD$ұlNTdebian/copyrightS%WS%W B+09qhLohu debian/rulesTREE86 1 Y= {@ -\debian6 0 !hVͯ[#Ɵ!3j菠 jzW;V (pari-extra/.git/dgit/unpack/pari-extra-3/debian/0000775000175000017500000000000012301222527017737 5ustar ianianpari-extra/.git/dgit/unpack/pari-extra-3/debian/rules0000775000175000017500000000145312301222527021022 0ustar ianian#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Modified for pari-extra by Bill Allombert 2001 # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 build: build-stamp build-stamp: dh_testdir touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp dh_clean install: build dh_testdir dh_testroot dh_prep dh_installdirs # Build architecture-independent files here. binary-arch: build install binary-indep: build install dh_testdir dh_testroot dh_installdocs dh_installexamples dh_installchangelogs dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install pari-extra/.git/dgit/unpack/pari-extra-3/debian/README.Debian0000664000175000017500000000147712301222527022011 0ustar ianianpari-extra for Debian ---------------------- This package used to contains optional data files fo PARI/GP. It is now a dummy package and it is replaced by 3 packages: pari-galdata: Galois Resolvant files for the polgalois function for degrees 8, 9, 10 and 11 pari-elldata: PARI version of the Elliptic curve data by J. E. Cremona, , for use with ellsearch, ellidentity and ellgenerators. pari-seadata: modular polynomials for p < 500, for use with ellap. These polynomials were extracted from the ECHIDNA databases available at and computed by David R. Kohel (kohel@maths.usyd.edu.au) University of Sydney Feel free to remove it. -- Bill Allombert Fri, 05 Aug 2011 14:18:43 +0200 pari-extra/.git/dgit/unpack/pari-extra-3/debian/compat0000664000175000017500000000000212301222527021135 0ustar ianian5 pari-extra/.git/dgit/unpack/pari-extra-3/debian/copyright0000664000175000017500000000066712301222527021703 0ustar ianianThis package was debianized by Bill Allombert ballombe@debian.org on Fri, 17 Nov 2000 17:59:46 +0100. It was downloaded from ftp://pari.math.u-bordeaux.fr/pub/pari/packages Copyright: PARI/GP is copyright 1989-2006 by the PARI group and distributed under the terms of the GNU General Public License. On Debian GNU/Linux systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL'. pari-extra/.git/dgit/unpack/pari-extra-3/debian/control0000664000175000017500000000245012301222527021343 0ustar ianianSource: pari-extra Build-Depends: debhelper (>=5), package-does-not-exist Section: math Priority: optional Maintainer: Bill Allombert Standards-Version: 3.9.2.0 Package: pari-extra Architecture: all Depends: pari-galdata, pari-elldata, pari-seadata, ${misc:Depends} Suggests: pari-gp, pari-galpol Description: PARI/GP Computer Algebra System extra data files PARI/GP is a widely used computer algebra system designed for fast computations in number theory (factorizations, algebraic number theory, elliptic curves...), but also contains a large number of other useful functions to compute with mathematical entities such as matrices, polynomials, power series, algebraic numbers, etc., and a lot of transcendental functions. PARI is also available as a C library to allow for faster computations. . Originally developed by Henri Cohen and his co-workers (University Bordeaux I, France), PARI is now under the GPL and maintained by Karim Belabas with the help of many volunteer contributors. . This is a dummy package which depends on pari-galdata: the Galois resolvants for the polgalois function. pari-elldata: the elliptic curves database for the ellsearch function. pari-seadata: the modular polynomials for the ellap function. It can be safely removed after the upgrade. pari-extra/.git/dgit/unpack/pari-extra-3/debian/changelog0000664000175000017500000000420412301222527021611 0ustar ianianpari-extra (3-2~dummy1) unstable; urgency=low * Dummy change for dgit testing. Add nonexistend build-dependency to break builds in case this package escapes somehow. -- Senatus Romanus Sun, 17 Nov 2013 14:34:17 +0000 pari-extra (3-1) unstable; urgency=low * This package is now a dummy packages, replaced by pari-galdata and pari-elldata. * debian/control: - Depends on pari-galdata, pari-elldata and pari-seadata. - Suggests: galpol * Bump standard version to 3.9.2 * Move to debhelper v5 (May JoeyH dream of swirls). -- Bill Allombert Fri, 05 Aug 2011 14:07:02 +0200 pari-extra (2.1-1) unstable; urgency=low * New upstream bugfix release - elldata was missing some curves. * debian/watch: removed (cannot work). -- Bill Allombert Wed, 4 Oct 2006 17:36:44 +0200 pari-extra (2-1) unstable; urgency=low * New upstream release - this release is not compatible with PARI/GP 2.1. - this release include galdata and elldata. * Bump standard version to 3.7.2. * Update description. * Move to debhelper v4 (May JoeyH dream of swirls). -- Bill Allombert Sat, 3 Jun 2006 16:48:44 +0200 pari-extra (1-4) unstable; urgency=low * Bump standard version to 3.6.1. * update FTP site in debian/watch and debian/copyright. * description: Rename Université to University to avoid trouble with non latin-1 charsets. Thanks Denis Barbier. Closes: #245594. -- Bill Allombert Tue, 27 Apr 2004 19:04:04 +0200 pari-extra (1-3) unstable; urgency=low * Bump standard version to 3.5.9. * Rebuild with new debhelper to remove the /usr/share/doc transition code. * Clean up debian/rules. -- Bill Allombert Sun, 6 Apr 2003 17:10:00 +0200 pari-extra (1-2) unstable; urgency=low * Improved description. -- Bill Allombert Wed, 17 Oct 2001 19:35:11 +0200 pari-extra (1-1) unstable; urgency=low * Initial Release. Closes: BUG#99173 -- Bill Allombert Fri, 9 Mar 2001 14:49:27 +0100 Local variables: mode: debian-changelog End: pari-extra/.git/dgit/unpack/pari-extra_3.orig.tar.gz0000664000175000017500000000017112301222527020664 0ustar ianian;N1 @=^ MD576Z%{)ujswymSG92[HRsvOCyob yY~p'{(pari-extra/.git/dgit/changelog.822.tmp0000664000175000017500000000053512301222526016005 0ustar ianianSource: pari-extra Version: 3-2~dummy1 Distribution: unstable Urgency: low Maintainer: Senatus Romanus Date: Sun, 17 Nov 2013 14:34:17 +0000 Changes: pari-extra (3-2~dummy1) unstable; urgency=low . * Dummy change for dgit testing. Add nonexistend build-dependency to break builds in case this package escapes somehow. pari-extra/.git/refs/0000775000175000017500000000000014164202406013033 5ustar ianianpari-extra/.git/refs/remotes/0000775000175000017500000000000014164202406014511 5ustar ianianpari-extra/.git/refs/remotes/dgit/0000775000175000017500000000000014164202406015440 5ustar ianianpari-extra/.git/refs/remotes/dgit/dgit/0000775000175000017500000000000014164202406016367 5ustar ianianpari-extra/.git/refs/original/0000775000175000017500000000000014164202406014637 5ustar ianianpari-extra/.git/refs/tags/0000775000175000017500000000000012301222530013760 5ustar ianianpari-extra/.git/refs/tags/debian/0000775000175000017500000000000012303417077015220 5ustar ianianpari-extra/.git/refs/heads/0000775000175000017500000000000014164202406014117 5ustar ianianpari-extra/.git/refs/heads/dgit/0000775000175000017500000000000014164202406015046 5ustar ianianpari-extra/.git/hooks/0000775000175000017500000000000012301222477013220 5ustar ianianpari-extra/.git/hooks/applypatch-msg.sample0000775000175000017500000000070412301222477017360 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : pari-extra/.git/hooks/post-update.sample0000775000175000017500000000027512301222477016677 0ustar ianian#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info pari-extra/.git/hooks/commit-msg.sample0000775000175000017500000000160012301222477016477 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } pari-extra/.git/hooks/pre-rebase.sample0000775000175000017500000001144212301222477016455 0ustar ianian#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END pari-extra/.git/hooks/pre-applypatch.sample0000775000175000017500000000061612301222477017362 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : pari-extra/.git/hooks/update.sample0000775000175000017500000000703312301222477015713 0ustar ianian#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 pari-extra/.git/hooks/prepare-commit-msg.sample0000775000175000017500000000232712301222477020142 0ustar ianian#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" pari-extra/.git/hooks/pre-commit.sample0000775000175000017500000000325012301222477016502 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- pari-extra/.git/config0000664000175000017500000000041213037165263013270 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "dgit"] fetch = +refs/dgit/*:refs/remotes/dgit/dgit/* [remote "origin"] url = ext::/nonexistent/dgit/tests/drs-git-ext fetch = +refs/heads/*:refs/remotes/origin/* pari-extra/.git/info/0000775000175000017500000000000014164202406013027 5ustar ianianpari-extra/.git/info/refs0000664000175000017500000000027014164202406013710 0ustar ianiancaecb81fca3589f998253d96ff884954528c131c refs/heads/dgit/sid 4752e72d89a64bcd0c0d98f69ad8aa34105b46b7 refs/heads/v2 89a231c370ec184471a562e04ce2f9cc0e51d796 refs/remotes/dgit/dgit/sid pari-extra/.git/info/exclude0000664000175000017500000000036012301222477014403 0ustar ianian# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ pari-extra/.git/logs/0000775000175000017500000000000014164202406013040 5ustar ianianpari-extra/.git/logs/refs/0000775000175000017500000000000012301222502013765 5ustar ianianpari-extra/.git/logs/refs/remotes/0000775000175000017500000000000012301222502015443 5ustar ianianpari-extra/.git/logs/refs/remotes/dgit/0000775000175000017500000000000012301222502016372 5ustar ianianpari-extra/.git/logs/refs/remotes/dgit/dgit/0000775000175000017500000000000014164202406017333 5ustar ianianpari-extra/.git/logs/refs/remotes/dgit/dgit/sid0000664000175000017500000000000014164202406020023 0ustar ianianpari-extra/.git/logs/refs/heads/0000775000175000017500000000000014164202406015063 5ustar ianianpari-extra/.git/logs/refs/heads/dgit/0000775000175000017500000000000014164202406016012 5ustar ianianpari-extra/.git/logs/refs/heads/dgit/sid0000664000175000017500000000000014164202406016502 0ustar ianianpari-extra/.git/logs/refs/heads/v20000664000175000017500000000000014164202406015323 0ustar ianianpari-extra/.git/logs/HEAD0000664000175000017500000000000014164202406013452 0ustar ianianpari-extra/.git/COMMIT_EDITMSG0000664000175000017500000000003712303436414014164 0ustar ianianDummy change for dgit testing. pari-extra/.git/HEAD0000664000175000017500000000003112303436436012517 0ustar ianianref: refs/heads/dgit/sid pari-extra/.git/packed-refs0000664000175000017500000000034614164202406014206 0ustar ianian# pack-refs with: peeled fully-peeled sorted caecb81fca3589f998253d96ff884954528c131c refs/heads/dgit/sid 4752e72d89a64bcd0c0d98f69ad8aa34105b46b7 refs/heads/v2 89a231c370ec184471a562e04ce2f9cc0e51d796 refs/remotes/dgit/dgit/sid pari-extra/.git/DGIT_ARCHIVE0000664000175000017500000000005112301222502013671 0ustar ianian1d7060a0b5714db1132e98611963e65edc766762 pari-extra/.git/ORIG_HEAD0000664000175000017500000000005112303436420013332 0ustar ianian0718dd7b55be65093691560d064602557c17fb7a pari-extra/.git/description0000664000175000017500000000011112301222477014334 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. pari-extra/.git/objects/0000775000175000017500000000000014164202406013525 5ustar ianianpari-extra/.git/objects/pack/0000775000175000017500000000000014164202406014443 5ustar ianianpari-extra/.git/objects/pack/pack-2210b56b0bbf9e759beb8d76c5e1a1f914d20c4c.idx0000444000175000017500000000323014164202406023645 0ustar ianiantOc  ,cm  `!5LJZ {[t٘;%όJw:,:nY YF@kfyyE09qhLohu;a`d( YhKOei=/7٦ _7t>pEZKQpJ GR-K ت4[FH/r~o[A8}D{V5 +=mNxMoYЂRUƼ2X`w32*^ϛE"EJ^D$ұlNT1pDqbLQזLD^}Hɕ$`1MM ឬBMK7iėHV*5Y2BtK;W5%=ITRlH߇X[AA6t=7!bI!tA,HfbTF]ݯ)>L<窥O}'$EԳ]g U-B3eek<ɆS_gA '[?°B0 J ; Bt"k uv L;=CRtvrK<pari-extra/.git/objects/pack/pack-2210b56b0bbf9e759beb8d76c5e1a1f914d20c4c.pack0000444000175000017500000001041114164202406023776 0ustar ianianPACKx; {N,?~im&{ x`bW},2T*hST V:I=[1}%!й tw((|I)9F:B$1ֽ-4 =o?з)[c*k>ZCzZC < ISfxJ0EًiҴ7̤IIR8; ra0&I΋]T݉cm?ѓurZXCDJ;ͬSWRwn/)S{6ȑڟAH3.J 5Юs8BTR 8n6+of K q^ ?F{/z$>ݠ&q7Bn|8<@Io~guqx{I(5U2$05,)9211$d&  xN0~#f*̌@Hf^ƾI,N;}{T,زts#3Zג5}ѭron뮧9!XGk8fy(urCM.=nBk{{h],+oa'R:l .z6]UB\)\ncp#͞*S3xmS]o0|Wcr!k.IHUtMp6G]太wgfgZj`GB{Uz $ 5`A )MAuΞ^<vcG@CM; *:5V \NpN 'Ԗ> g6%nz0լ*>IjOM S(]''Y4Ak#VP H˔,:>m:q cCX:۔*C@4*dO#B ,M竒d S r$񝕃F70)ԋ5=u4؋H֒Frq?v_w߷фTo|QZVkەXlN_@XlJ!E^P\%|/<Q#`xVr"7]&[YڃI4`.yX4UaTf3π)vGLbas԰[-˘5)ZUCikjǻ9eřDUdd1R/1DJc8dkq3pR}n%t7b )a&nh=[mMr[чfmHI9 6̾#K 5ǖm}/~d [VA##gFA%WW 4D)=}8e6()Oˢ؋lB= jJ\ͮ/L>*rg&o$ɺ;CH< )!yK>j2Q , Pv̽!"+pv{d^)Nxpװ-@ˠ m U4]лSօ"]Ϙ !MQ޶Hfjm1I}R;s1β1M$a:;t\WSY(Xi]lEjmŰ ~­[ytTF/cBc Xu5qIso7Ʌ"$ݧWi:ɏ0Kf7e1-p_tE-Џ+{ Tnt{/{j#x/"8At|3x34nRxmSM@ Waڀ@.bYݙqk'3|O>. U= yMcKldu؀%ӓ7_<^IÆQX[C,";c[=;q؀k4gdK~;6Ƹ"Uҍі7oCDA>˗iQ'oj9 % YĘՠq5ט˧@8==qPwqHMC!1wCPI~]ק(mMCG8 !R#M}fC8Wpk2@3D 4n$CB`S6bKpU2Sjd0qU8(P)e)ӮR8LԠoh)w58wLuj"ݢCv Vhl $H(uK_ջL/(RVgj.fF J&(]יR9Y>E`e(@. Bh n4ɸ^&S gYȫ~ʭO cnW:s^{"q}!iAfiK}u`GCDFKrj$iTago޸:uݰ8ZY(!m&Rh{ 0Z#2f . ||_{7H3$}u 49d7/ -T|w:wKߩo V묙1SE&K,2x}RQk0~~ō>;ice + c=:ۢΜe$>tn5F^6~FZu`muX0Bu1J$݀跻Ghh8#$;q c[Zb4 Zskj=ǟg K_^ch{ I$8uK#k JC$ž~?^G_U'Z)aLƲZ$ :ZqLSI9WQE-$E%47M؈wl08|d(#dՄ--SǻL}}jќ^ur)g`ȋ8Zgj eAdǂ'\1%vNo%~?x31Ԥ< 9/=]}"bnckG&ו: x340031QrutusIMLcs?3ZvM>)!DarFb^zjN~:f'_os=L2]( S[X_\]9-jםu+)aʋt!;xp%E% mB+}qQټF99!@E榦 E9 \{by'i|ьk/Uxx31Ԥ<D<.Hz"gKs'zxxqHc#mRvݭ$n_7 x31Ԥ<ޅQށsIxmpo=V Oxxq/Gut翩n:^n5ѯ^ oux/"8AtƔ8-x31Ԥ<* /3 .Vy >x6:;a`d( YhKOeiN1 ,cm  `!5LJZF\~x/[XZQRa<ِY~~v|jax[5kF,p"k uv Lpari-extra/.git/objects/info/0000775000175000017500000000000014164202406014460 5ustar ianianpari-extra/.git/objects/info/packs0000664000175000017500000000006614164202406015506 0ustar ianianP pack-2210b56b0bbf9e759beb8d76c5e1a1f914d20c4c.pack pari-extra/.git/FETCH_HEAD0000664000175000017500000000000012301222522013407 0ustar ianianpari-extra/.git/index0000664000175000017500000000111014164202406013117 0ustar ianianDIRCay%S%B?LD^}Hdebian/README.Debianay%S=BMK7iėHV*5Ydebian/changeloga yBa yBH/r~o[A8}D{ debian/compatay%S%B(,:nY YF@kfyyEdebian/controlay%S%BD$ұlNTdebian/copyrightay%S%B+09qhLohu debian/rulesTREE86 1 V5 +=mNxModebian6 0 lH߇X[AA e#G"M zpari-extra/debian/0000775000175000017500000000000014164202406012455 5ustar ianianpari-extra/debian/rules0000775000175000017500000000145312301222502013526 0ustar ianian#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Modified for pari-extra by Bill Allombert 2001 # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 build: build-stamp build-stamp: dh_testdir touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp dh_clean install: build dh_testdir dh_testroot dh_prep dh_installdirs # Build architecture-independent files here. binary-arch: build install binary-indep: build install dh_testdir dh_testroot dh_installdocs dh_installexamples dh_installchangelogs dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install pari-extra/debian/README.Debian0000664000175000017500000000147712301222502014515 0ustar ianianpari-extra for Debian ---------------------- This package used to contains optional data files fo PARI/GP. It is now a dummy package and it is replaced by 3 packages: pari-galdata: Galois Resolvant files for the polgalois function for degrees 8, 9, 10 and 11 pari-elldata: PARI version of the Elliptic curve data by J. E. Cremona, , for use with ellsearch, ellidentity and ellgenerators. pari-seadata: modular polynomials for p < 500, for use with ellap. These polynomials were extracted from the ECHIDNA databases available at and computed by David R. Kohel (kohel@maths.usyd.edu.au) University of Sydney Feel free to remove it. -- Bill Allombert Fri, 05 Aug 2011 14:18:43 +0200 pari-extra/debian/compat0000664000175000017500000000000314164202406013654 0ustar ianian12 pari-extra/debian/copyright0000664000175000017500000000066712301222502014407 0ustar ianianThis package was debianized by Bill Allombert ballombe@debian.org on Fri, 17 Nov 2000 17:59:46 +0100. It was downloaded from ftp://pari.math.u-bordeaux.fr/pub/pari/packages Copyright: PARI/GP is copyright 1989-2006 by the PARI group and distributed under the terms of the GNU General Public License. On Debian GNU/Linux systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL'. pari-extra/debian/control0000664000175000017500000000245012301222502014047 0ustar ianianSource: pari-extra Build-Depends: debhelper (>=5), package-does-not-exist Section: math Priority: optional Maintainer: Bill Allombert Standards-Version: 3.9.2.0 Package: pari-extra Architecture: all Depends: pari-galdata, pari-elldata, pari-seadata, ${misc:Depends} Suggests: pari-gp, pari-galpol Description: PARI/GP Computer Algebra System extra data files PARI/GP is a widely used computer algebra system designed for fast computations in number theory (factorizations, algebraic number theory, elliptic curves...), but also contains a large number of other useful functions to compute with mathematical entities such as matrices, polynomials, power series, algebraic numbers, etc., and a lot of transcendental functions. PARI is also available as a C library to allow for faster computations. . Originally developed by Henri Cohen and his co-workers (University Bordeaux I, France), PARI is now under the GPL and maintained by Karim Belabas with the help of many volunteer contributors. . This is a dummy package which depends on pari-galdata: the Galois resolvants for the polgalois function. pari-elldata: the elliptic curves database for the ellsearch function. pari-seadata: the modular polynomials for the ellap function. It can be safely removed after the upgrade. pari-extra/debian/changelog0000664000175000017500000000420412303436436014334 0ustar ianianpari-extra (3-2~dummy1) unstable; urgency=low * Dummy change for dgit testing. Add nonexistent build-dependency to break builds in case this package escapes somehow. -- Senatus Romanus Sun, 17 Nov 2013 14:34:17 +0000 pari-extra (3-1) unstable; urgency=low * This package is now a dummy packages, replaced by pari-galdata and pari-elldata. * debian/control: - Depends on pari-galdata, pari-elldata and pari-seadata. - Suggests: galpol * Bump standard version to 3.9.2 * Move to debhelper v5 (May JoeyH dream of swirls). -- Bill Allombert Fri, 05 Aug 2011 14:07:02 +0200 pari-extra (2.1-1) unstable; urgency=low * New upstream bugfix release - elldata was missing some curves. * debian/watch: removed (cannot work). -- Bill Allombert Wed, 4 Oct 2006 17:36:44 +0200 pari-extra (2-1) unstable; urgency=low * New upstream release - this release is not compatible with PARI/GP 2.1. - this release include galdata and elldata. * Bump standard version to 3.7.2. * Update description. * Move to debhelper v4 (May JoeyH dream of swirls). -- Bill Allombert Sat, 3 Jun 2006 16:48:44 +0200 pari-extra (1-4) unstable; urgency=low * Bump standard version to 3.6.1. * update FTP site in debian/watch and debian/copyright. * description: Rename Université to University to avoid trouble with non latin-1 charsets. Thanks Denis Barbier. Closes: #245594. -- Bill Allombert Tue, 27 Apr 2004 19:04:04 +0200 pari-extra (1-3) unstable; urgency=low * Bump standard version to 3.5.9. * Rebuild with new debhelper to remove the /usr/share/doc transition code. * Clean up debian/rules. -- Bill Allombert Sun, 6 Apr 2003 17:10:00 +0200 pari-extra (1-2) unstable; urgency=low * Improved description. -- Bill Allombert Wed, 17 Oct 2001 19:35:11 +0200 pari-extra (1-1) unstable; urgency=low * Initial Release. Closes: BUG#99173 -- Bill Allombert Fri, 9 Mar 2001 14:49:27 +0100 Local variables: mode: debian-changelog End: work/tests/worktrees/ruby-rails-3.2_test.tar0000644000000000000000000026400014761250142016261 0ustar ruby-rails-3.2/0000775000175000017500000000000014164202406011550 5ustar ianianruby-rails-3.2/metadata.yml0000664000175000017500000000725212432202022014047 0ustar ianian--- !ruby/object:Gem::Specification name: rails version: !ruby/object:Gem::Version hash: 3 prerelease: segments: - 3 - 2 - 6 version: 3.2.6 platform: ruby authors: - David Heinemeier Hansson autorequire: bindir: bin cert_chain: [] date: 2012-06-12 00:00:00 Z dependencies: - !ruby/object:Gem::Dependency name: activesupport.blibble.blibble prerelease: false requirement: &id001 !ruby/object:Gem::Requirement none: false requirements: - - "=" - !ruby/object:Gem::Version hash: 3 segments: - 3 - 2 - 6 version: 3.2.6 type: :runtime version_requirements: *id001 - !ruby/object:Gem::Dependency name: actionpack.blobble.blobble prerelease: false requirement: &id002 !ruby/object:Gem::Requirement none: false requirements: - - "=" - !ruby/object:Gem::Version hash: 3 segments: - 3 - 2 - 6 version: 3.2.6 type: :runtime version_requirements: *id002 - !ruby/object:Gem::Dependency name: activerecord prerelease: false requirement: &id003 !ruby/object:Gem::Requirement none: false requirements: - - "=" - !ruby/object:Gem::Version hash: 3 segments: - 3 - 2 - 6 version: 3.2.6 type: :runtime version_requirements: *id003 - !ruby/object:Gem::Dependency name: activeresource prerelease: false requirement: &id004 !ruby/object:Gem::Requirement none: false requirements: - - "=" - !ruby/object:Gem::Version hash: 3 segments: - 3 - 2 - 6 version: 3.2.6 type: :runtime version_requirements: *id004 - !ruby/object:Gem::Dependency name: actionmailer prerelease: false requirement: &id005 !ruby/object:Gem::Requirement none: false requirements: - - "=" - !ruby/object:Gem::Version hash: 3 segments: - 3 - 2 - 6 version: 3.2.6 type: :runtime version_requirements: *id005 - !ruby/object:Gem::Dependency name: railties prerelease: false requirement: &id006 !ruby/object:Gem::Requirement none: false requirements: - - "=" - !ruby/object:Gem::Version hash: 3 segments: - 3 - 2 - 6 version: 3.2.6 type: :runtime version_requirements: *id006 - !ruby/object:Gem::Dependency name: bundler prerelease: false requirement: &id007 !ruby/object:Gem::Requirement none: false requirements: - - ~> - !ruby/object:Gem::Version hash: 15 segments: - 1 - 0 version: "1.0" type: :runtime version_requirements: *id007 description: Ruby on Rails is a full-stack web framework optimized for programmer happiness and sustainable productivity. It encourages beautiful code by favoring convention over configuration. email: david@loudthinking.com executables: [] extensions: [] extra_rdoc_files: [] files: [] homepage: http://www.rubyonrails.org licenses: [] post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement none: false requirements: - - ">=" - !ruby/object:Gem::Version hash: 57 segments: - 1 - 8 - 7 version: 1.8.7 required_rubygems_version: !ruby/object:Gem::Requirement none: false requirements: - - ">=" - !ruby/object:Gem::Version hash: 23 segments: - 1 - 3 - 6 version: 1.3.6 requirements: [] rubyforge_project: rubygems_version: 1.8.22 signing_key: specification_version: 3 summary: Full-stack web application framework. test_files: [] ruby-rails-3.2/.commit-tmp.DIv_ZO~0000600000175000017500000000021512244426103015111 0ustar ianianAdd broken build-dependency, for testing. * Add broken build-dependency, for testing. * Do not use ruby build system when building package. ruby-rails-3.2/.git/0000775000175000017500000000000014164202406012411 5ustar ianianruby-rails-3.2/.git/branches/0000775000175000017500000000000012244425622014202 5ustar ianianruby-rails-3.2/.git/addp-hunk-edit.diff~0000664000175000017500000000170612244426010016237 0ustar ianian# Manual hunk edit mode -- see bottom for a quick guide @@ -1,3 +1,16 @@ +ruby-rails-3.2 (3.2.6-2~dummy2) unstable; urgency=low + + * Change something in the upstream yml. + + -- Ian Jackson Sun, 24 Nov 2013 16:05:06 +0000 + +ruby-rails-3.2 (3.2.6-2~dummy1) unstable; urgency=low + + * Add broken build-dependency, for testing. + * Do not use ruby build system when building package. + + -- Ian Jackson Sun, 24 Nov 2013 16:25:38 +0000 + ruby-rails-3.2 (3.2.6-1) unstable; urgency=low * Initial release. # --- # To remove '-' lines, make them ' ' lines (context). # To remove '+' lines, delete them. # Lines starting with # will be removed. # # If the patch applies cleanly, the edited hunk will immediately be # marked for staging. If it does not apply cleanly, you will be given # an opportunity to edit again. If all lines of the hunk are removed, # then the edit is aborted and the hunk is left unchanged. ruby-rails-3.2/.git/gitk.cache0000664000175000017500000000154512432175664014354 0ustar ianian1 5 748c2d40d6a9452cf9bcbfb76d1b382b56c1674a 58498d68ce13425be9fa5ad841a7df38a9b0060b {0444fecd770d5ed8c484dfbef9e397dbb4872fd8 31f445e8a524805f84f65d9880339cbbeb2b73f4 57df0aab82fc97de760d00d0a5b9eb5c50bb14f7 c804091b5507707a4d13444f1066e71b42acc3bf 632997c752de3c99b21462b3dac47487e091241b cb2b5674b214468b13da9a0184493be5855761b0 58498d68ce13425be9fa5ad841a7df38a9b0060b} 297f18ae7fe0a915f98af65fba63062a7c7a411b 89c1bd14d921f8618366423d1eb62c82e4935207 89c1bd14d921f8618366423d1eb62c82e4935207 297f18ae7fe0a915f98af65fba63062a7c7a411b 9094e534759b6d4bbdd93bad2a425314da98885f 9094e534759b6d4bbdd93bad2a425314da98885f 89c1bd14d921f8618366423d1eb62c82e4935207 748c2d40d6a9452cf9bcbfb76d1b382b56c1674a 748c2d40d6a9452cf9bcbfb76d1b382b56c1674a 89c1bd14d921f8618366423d1eb62c82e4935207 24a03a7d4d78afe465c555604929abaffd5b5b66 24a03a7d4d78afe465c555604929abaffd5b5b66 1 ruby-rails-3.2/.git/dgit/0000775000175000017500000000000012244425624013346 5ustar ianianruby-rails-3.2/.git/refs/0000775000175000017500000000000012244425624013356 5ustar ianianruby-rails-3.2/.git/refs/remotes/0000775000175000017500000000000014164202406015026 5ustar ianianruby-rails-3.2/.git/refs/remotes/dgit/0000775000175000017500000000000014164202406015755 5ustar ianianruby-rails-3.2/.git/refs/remotes/dgit/dgit/0000775000175000017500000000000014164202406016704 5ustar ianianruby-rails-3.2/.git/refs/tags/0000775000175000017500000000000012244425622014312 5ustar ianianruby-rails-3.2/.git/refs/heads/0000775000175000017500000000000014164202406014434 5ustar ianianruby-rails-3.2/.git/refs/heads/dgit/0000775000175000017500000000000014164202406015363 5ustar ianianruby-rails-3.2/.git/hooks/0000775000175000017500000000000012244425622013540 5ustar ianianruby-rails-3.2/.git/hooks/applypatch-msg.sample0000775000175000017500000000070412244425622017700 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : ruby-rails-3.2/.git/hooks/post-update.sample0000775000175000017500000000027512244425622017217 0ustar ianian#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info ruby-rails-3.2/.git/hooks/commit-msg.sample0000775000175000017500000000160012244425622017017 0ustar ianian#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } ruby-rails-3.2/.git/hooks/pre-rebase.sample0000775000175000017500000001144212244425622016775 0ustar ianian#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END ruby-rails-3.2/.git/hooks/pre-applypatch.sample0000775000175000017500000000061612244425622017702 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : ruby-rails-3.2/.git/hooks/update.sample0000775000175000017500000000703312244425622016233 0ustar ianian#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 ruby-rails-3.2/.git/hooks/prepare-commit-msg.sample0000775000175000017500000000232712244425622020462 0ustar ianian#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" ruby-rails-3.2/.git/hooks/pre-commit.sample0000775000175000017500000000325012244425622017022 0ustar ianian#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- ruby-rails-3.2/.git/config0000664000175000017500000000043213037165403013603 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "dgit"] fetch = +refs/dgit/*:refs/remotes/dgit/dgit/* [remote "origin"] url = /nonexistent/dgit/tests/tmp/quilt/git/ruby-rails-3.2.git fetch = +refs/heads/*:refs/remotes/origin/* ruby-rails-3.2/.git/info/0000775000175000017500000000000014164202406013344 5ustar ianianruby-rails-3.2/.git/info/refs0000664000175000017500000000030514164202406014224 0ustar ianian6de8e04137ffb352810a3086ef15a51cffd8df52 refs/heads/dgit/sid 748c2d40d6a9452cf9bcbfb76d1b382b56c1674a refs/heads/incoming-branch 58498d68ce13425be9fa5ad841a7df38a9b0060b refs/remotes/dgit/dgit/sid ruby-rails-3.2/.git/info/exclude0000664000175000017500000000036012244425622014723 0ustar ianian# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ ruby-rails-3.2/.git/logs/0000775000175000017500000000000014164202406013355 5ustar ianianruby-rails-3.2/.git/logs/refs/0000775000175000017500000000000012244425624014322 5ustar ianianruby-rails-3.2/.git/logs/refs/remotes/0000775000175000017500000000000012244425624016000 5ustar ianianruby-rails-3.2/.git/logs/refs/remotes/dgit/0000775000175000017500000000000012244425624016727 5ustar ianianruby-rails-3.2/.git/logs/refs/remotes/dgit/dgit/0000775000175000017500000000000014164202406017650 5ustar ianianruby-rails-3.2/.git/logs/refs/remotes/dgit/dgit/sid0000664000175000017500000000000014164202406020340 0ustar ianianruby-rails-3.2/.git/logs/refs/heads/0000775000175000017500000000000014164202406015400 5ustar ianianruby-rails-3.2/.git/logs/refs/heads/dgit/0000775000175000017500000000000014164202406016327 5ustar ianianruby-rails-3.2/.git/logs/refs/heads/dgit/sid0000664000175000017500000000000014164202406017017 0ustar ianianruby-rails-3.2/.git/logs/refs/heads/incoming-branch0000664000175000017500000000000014164202406020347 0ustar ianianruby-rails-3.2/.git/logs/HEAD0000664000175000017500000000000014164202406013767 0ustar ianianruby-rails-3.2/.git/COMMIT_EDITMSG0000664000175000017500000000103512776273646014524 0ustar ianianChange something in the upstream yml. Message body first line. Message body second line. Message body second paragraph. Gbp-Pq: Topic ups-topic Gbp-Pq: Name ups-yml # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Sun Nov 24 16:41:57 2013 +0000 # # On branch dgit/sid # Changes to be committed: # modified: debian/changelog # modified: metadata.yml # # Untracked files: # .commit-tmp.DIv_ZO~ # debian/changelog~ # debian/control~ # ruby-rails-3.2/.git/HEAD0000664000175000017500000000003112432202022013015 0ustar ianianref: refs/heads/dgit/sid ruby-rails-3.2/.git/packed-refs0000664000175000017500000000036314164202406014522 0ustar ianian# pack-refs with: peeled fully-peeled sorted 6de8e04137ffb352810a3086ef15a51cffd8df52 refs/heads/dgit/sid 748c2d40d6a9452cf9bcbfb76d1b382b56c1674a refs/heads/incoming-branch 58498d68ce13425be9fa5ad841a7df38a9b0060b refs/remotes/dgit/dgit/sid ruby-rails-3.2/.git/DGIT_ARCHIVE0000664000175000017500000000005112244425624014226 0ustar ianian58498d68ce13425be9fa5ad841a7df38a9b0060b ruby-rails-3.2/.git/ORIG_HEAD0000664000175000017500000000005112432176741013661 0ustar ianian297f18ae7fe0a915f98af65fba63062a7c7a411b ruby-rails-3.2/.git/description0000664000175000017500000000011112244425622014654 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. ruby-rails-3.2/.git/objects/0000775000175000017500000000000014164202406014042 5ustar ianianruby-rails-3.2/.git/objects/pack/0000775000175000017500000000000014164202406014760 5ustar ianianruby-rails-3.2/.git/objects/pack/pack-f413ba298ee5f339e4c5332b879864fa152707eb.pack0000444000175000017500000001565714164202406024066 0ustar ianianPACK4xAK0sMtѭ t˅0bÕcI*)9!zxDڽ}[3;K=CrS\ rA}Ux bw3 C [ʑpz{t827HdOTޅSm.^o^~ʻ?٣*(xK IOb[Pk'pVLoZIacƔi=ـ2{oxƵKS41y&8J 3y~]<*Zܾvkm.ʕ]m>H r>\!KdI۲xRpOxKj0D:E/Fm},MnђZddyaUA*3PeaEd.dQNF08ةrn0imؑ鵓&9sR1xϾJZR2|QX|?Gk7]sJs}hh#+"m[ZB S꺕eoKf+H2mUDe^ėxN0 Fy`W"0.: H;dD\*x.+f#EF΁fƭ79R3[ۋ% L9Lnӵ? UaGJľKݏ= d,:`ĭyj 7bLjE BOH2ynxN1E{ŔDϮm E3c#=hѩnog ީ0e /I&b9xd>i ѢMц`<".Nx&ϋ{jw*Ar|d۩xPCmp?.Mni<ó}H!ùIjf%^$lTVu=[\xIn0Be(kvӀ1'Nu*U-"#*Age켲{Tƒf"av;(Y\|/GN_9RY:H6=ON{GxW mʿCͱ41 EhC*wW$kn/XlSx-h'K:pn8 w /uKќA6OeB w$ I|x;vu6.]]. =ٙA%j x;źeLe2x3zBxUo0~_qH0IU&`bZī\kmNKi[;Bj~tcBd)^hٕ fM0s.Ph38Ǚ ?L"?FgR?:Opޥ\ D nA28S^+)Ua5i?2邒3) ZtlY$hPDFJ^0}}`%GtF҉k*1<%p-e]I J:C:{n 0;%t$XtA{9MHc5-k4rLZN4 5[R2v=IOټAL ^ Apֺ3rJVA}KS-5hݱ*A7{0qI7@ZaX\bo*}n/D}ЮGI{Շ< MFQ48.p+Vn\~(q-q-,i1R䑀FtRgpFy*ր)?&̴*)Q2!,7}&H ]\9A64ʝd k8y-9ْD_M&-y nꥧT ֡m͹b8D#ReCHHMlu (Bk#GU3ȵVK"Q qRr u) gƣZ)qSgXv%Xt3/:B處77?XQs"ZH=_; EWrmW?Nlx(8[p9f_&n*x(Zp f]:F~ GO0נ`O?4uJ*uK2 u4lTjcTo5@a9 g1+b3 c3,vcb14Gfq9,Ƃ|TZy5Il2}RFaXx]T_o8Stw[St: N@d{}t f;izRߟakQt\V<*Wƞ4(Y $z5f|\}Z=DatJ1bkB.d;?+MUchNX`zGy^LJOoT*-Th2H}`/SFrI+opB{نpR9A {!xB(-b9z40T!3'Vbv %; Od~󝄻ZqJ4\f`%6N5bRO-xՠT>7;94ARCLN+ggtBha'AG_!9'{ v?ID3RSM" ?{Q4Yr.j mW6"2}o.1UdʭXP8onxԻȠ0~1?elB_,x?@Gy@xIň1ϦENN6E^x hYj_xBK^QOeCS,)f,C` !B **]gnei/WK@-qO)kOhAMmFZ6WIh.B@֘#AKq~mndžxSV/-.OMNUMRLPPq" -g/(䦖$$$U0:͗B}6ۄ0i!PuyiE FnnW4/2yVܥ&g7BxE%100644 changelog ء0#JfmE%1vQwgJjvqaj)4xT+rxee-2cͧLQv ;3m >NxE%100644 changelog"yAx5wtm5%1vQwgJjvqaj\lXx;6)L/ xee-|aMc5bm$^Ou ixE%100644 changelogM0q&hh ^H%1vQwgJjvqaj'x31dIf]!=I")J&`ٔԤ< kM h&D!7$1%$Q27gaV_';(]+.KL/e0Zuppy9ϳ'̷.59:4l0x;+Sv0r& M(xee-RKO^]fqFYD{? x4ID!9#1/=5'?bC)VK4LzcgDjx;:uBZLWx31dIf]!=I")J&`ٔԤ :mosꜥJjă1CQ^vb:fajK /N&Ag {!+e3YccWsٮ|h$.=;/MPr[km8w̄f_hɫhb(@)|wW)93+d'ruby-rails-3.2/.git/objects/pack/pack-f413ba298ee5f339e4c5332b879864fa152707eb.idx0000444000175000017500000000474014164202406023723 0ustar ianiantOc  !!!!!!!!!!""""""#$%%%%%%%%%%%%%%%%%%&&&&&&&&&''''))))))***,----------------./////////00000000001111111233333344Dw ^Ą߾۴/ >`%Cg 2|\&B! 71ŅK {@"? S4O, ء0#JfmE"yAx5wtm5:O#_2]'G-3ڄ[BĖ-3I1E$_]3+s2S!7r7 x҂C5 j a6<k *hWHOei_SmA7R 0Rt-@֩E,m8+VgJuWg'=`VAhTx8=0Gг{X =g+->d~ӣUnԶ8&=`C۝,(vQwgJjvqa1~jx٬4鑳n,֥kU4˼ƍ0#C\Q^̖`1d\Eoa1$>wΥ5wm3DȣF &gcIq)3&| WhV菾r %BSѹ7.ppf @+C#e,!RO\ UpzMDOfBÿ+VtFښI;Wa˨_'ߒ1EvYA uH,cZHt)Mܒkz {qENULJ9biCʒd"uE/⛲CK)wZSY5LYmRZuʲdGb']Nzҝ+8\ȶ=øZ.S*+*%⌔h ~ QW\L2DOߋZ2 4UW٪q_AIch(Ӆud$kmݮp>ormS0[PN`MKE(1(_h"gAF!Yo/0"@nv)ajSߵT?R&diJfBR "j~m ! K <F)93+d'JW3FJiv1*u|ruby-rails-3.2/.git/objects/info/0000775000175000017500000000000014164202406014775 5ustar ianianruby-rails-3.2/.git/objects/info/packs0000664000175000017500000000006614164202406016023 0ustar ianianP pack-f413ba298ee5f339e4c5332b879864fa152707eb.pack ruby-rails-3.2/.git/COMMIT_EDITMSG~0000664000175000017500000000103512776273636014721 0ustar ianianChange something in the upstream yml. Message body first line. Message body second line. Message body second paragraph. Gbp-Pq-Topic: ups-topic Gbp-Pq-Name: ups-yml # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Sun Nov 24 16:41:57 2013 +0000 # # On branch dgit/sid # Changes to be committed: # modified: debian/changelog # modified: metadata.yml # # Untracked files: # .commit-tmp.DIv_ZO~ # debian/changelog~ # debian/control~ # ruby-rails-3.2/.git/FETCH_HEAD0000664000175000017500000000000012244425624013742 0ustar ianianruby-rails-3.2/.git/index0000664000175000017500000000230414164202406013442 0ustar ianianDIRC aTi]hWHOei_S.pc/.quilt_patchesaTiYpf @+C#e.pc/.quilt_seriesaTiW S4O, .pc/.versionaTi[⛲CK)wZS.pc/applied-patchesaTi$x8=0Gгdebian/changelogaTic=`C۝,( debian/compataTiܒkz {qENULJ9debian/controlaTi,!RO\debian/control.inaTi˨_'ߒ1EvYAdebian/copyrightaTia-3ڄ[BĖ-3I debian/rulesaTi :O#_2]'Gdebian/source/formataTi_ >`%Cg 2|\&B! debian/watchaUTi5 j adsource1 0 n,֥kU4t2ˡg}?ruby-rails-3.2/.pc/0000775000175000017500000000000012432202022012216 5ustar ianianruby-rails-3.2/.pc/.version0000664000175000017500000000000212432202022013674 0ustar ianian2 ruby-rails-3.2/.pc/.quilt_series0000664000175000017500000000000712432202022014724 0ustar ianianseries ruby-rails-3.2/.pc/applied-patches0000664000175000017500000000000012432202022015172 0ustar ianianruby-rails-3.2/.pc/.quilt_patches0000664000175000017500000000001712432202022015062 0ustar ianiandebian/patches ruby-rails-3.2/debian/0000775000175000017500000000000014164202406012772 5ustar ianianruby-rails-3.2/debian/rules0000775000175000017500000000003612432200232014040 0ustar ianian#!/usr/bin/make -f %: dh $@ ruby-rails-3.2/debian/compat0000664000175000017500000000000214164202406014170 0ustar ianian7 ruby-rails-3.2/debian/source/0000775000175000017500000000000012432200232014261 5ustar ianianruby-rails-3.2/debian/source/format0000664000175000017500000000001412432200232015467 0ustar ianian3.0 (quilt) ruby-rails-3.2/debian/control.in0000664000175000017500000000435312432200232014776 0ustar ianianSource: ruby-rails-3.2 Section: ruby Priority: optional Maintainer: Debian Ruby Extras Maintainers Uploaders: Antonio Terceiro DM-Upload-Allowed: yes Build-Depends: debhelper (>= 7.0.50~), gem2deb (>= 0.3.0~) Standards-Version: 3.9.3 Vcs-Git: git://git.debian.org/pkg-ruby-extras/ruby-rails-3.2.git Vcs-Browser: http://git.debian.org/?p=pkg-ruby-extras/ruby-rails.git;a=summary Homepage: http://www.rubyonrails.org XS-Ruby-Versions: all Package: ruby-rails-3.2 Architecture: all XB-Ruby-Versions: ${ruby:Versions} Depends: ${shlibs:Depends}, ${misc:Depends}, ruby-activesupport-3.2 (>= @RAILS_VERSION@), ruby-activesupport-3.2 (<< @RAILS_VERSION@.), ruby-actionpack-3.2 (>= @RAILS_VERSION@), ruby-actionpack-3.2 (<< @RAILS_VERSION@.), ruby-activerecord-3.2 (>= @RAILS_VERSION@), ruby-activerecord-3.2 (<< @RAILS_VERSION@.), ruby-activeresource-3.2 (>= @RAILS_VERSION@), ruby-activeresource-3.2 (<< @RAILS_VERSION@.), ruby-actionmailer-3.2 (>= @RAILS_VERSION@), ruby-actionmailer-3.2 (<< @RAILS_VERSION@.), ruby-railties-3.2 (>= @RAILS_VERSION@), ruby-railties-3.2 (<< @RAILS_VERSION@.), bundler Description: MVC ruby based framework geared for web application development Rails is a full-stack, open-source web framework in Ruby for writing real-world applications. . Being a full-stack framework means that all layers are built to work seamlessly together. That way you don't repeat yourself and you can use a single language from top to bottom. Everything from templates to control flow to business logic is written in Ruby. . This package provides Rails version 3.2. Package: rails3 Architecture: all Depends: ruby-rails-3.2, ${shlibs:Depends}, ${misc:Depends} Description: MVC ruby based framework geared for web application development Rails is a full-stack, open-source web framework in Ruby for writing real-world applications. . Being a full-stack framework means that all layers are built to work seamlessly together. That way you don't repeat yourself and you can use a single language from top to bottom. Everything from templates to control flow to business logic is written in Ruby. . This package is a convenience metapackage that depends on ruby-rails-3.2. ruby-rails-3.2/debian/control~0000664000175000017500000000421212244425624014600 0ustar ianianSource: ruby-rails-3.2 Section: ruby Priority: optional Maintainer: Debian Ruby Extras Maintainers Uploaders: Antonio Terceiro DM-Upload-Allowed: yes Build-Depends: debhelper (>= 7.0.50~), gem2deb (>= 0.3.0~) Standards-Version: 3.9.3 Vcs-Git: git://git.debian.org/pkg-ruby-extras/ruby-rails-3.2.git Vcs-Browser: http://git.debian.org/?p=pkg-ruby-extras/ruby-rails.git;a=summary Homepage: http://www.rubyonrails.org XS-Ruby-Versions: all Package: ruby-rails-3.2 Architecture: all XB-Ruby-Versions: ${ruby:Versions} Depends: ${shlibs:Depends}, ${misc:Depends}, ruby-activesupport-3.2 (>= 3.2.6), ruby-activesupport-3.2 (<< 3.2.6.), ruby-actionpack-3.2 (>= 3.2.6), ruby-actionpack-3.2 (<< 3.2.6.), ruby-activerecord-3.2 (>= 3.2.6), ruby-activerecord-3.2 (<< 3.2.6.), ruby-activeresource-3.2 (>= 3.2.6), ruby-activeresource-3.2 (<< 3.2.6.), ruby-actionmailer-3.2 (>= 3.2.6), ruby-actionmailer-3.2 (<< 3.2.6.), ruby-railties-3.2 (>= 3.2.6), ruby-railties-3.2 (<< 3.2.6.), bundler, rubygems-integration Description: MVC ruby based framework geared for web application development Rails is a full-stack, open-source web framework in Ruby for writing real-world applications. . Being a full-stack framework means that all layers are built to work seamlessly together. That way you don't repeat yourself and you can use a single language from top to bottom. Everything from templates to control flow to business logic is written in Ruby. . This package provides Rails version 3.2. Package: rails3 Architecture: all Depends: ruby-rails-3.2, ${shlibs:Depends}, ${misc:Depends} Description: MVC ruby based framework geared for web application development Rails is a full-stack, open-source web framework in Ruby for writing real-world applications. . Being a full-stack framework means that all layers are built to work seamlessly together. That way you don't repeat yourself and you can use a single language from top to bottom. Everything from templates to control flow to business logic is written in Ruby. . This package is a convenience metapackage that depends on ruby-rails-3.2. ruby-rails-3.2/debian/copyright0000664000175000017500000000260012432200232014712 0ustar ianianFormat: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: rails Source: https://github.com/rails/rails Files: * Copyright: 2004-2012 David Heinemeier Hansson License: Expat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Files: debian/* Copyright: 2012 Antonio Terceiro License: The Debian packaging is licensed under the same terms as the original package. ruby-rails-3.2/debian/control0000664000175000017500000000423312432202022014365 0ustar ianianSource: ruby-rails-3.2 Section: ruby Priority: optional Maintainer: Debian Ruby Extras Maintainers Uploaders: Antonio Terceiro DM-Upload-Allowed: yes Build-Depends: debhelper (>= 7.0.50~), gem2deb (>= 0.3.0~), no-such-package Standards-Version: 3.9.3 Vcs-Git: git://git.debian.org/pkg-ruby-extras/ruby-rails-3.2.git Vcs-Browser: http://git.debian.org/?p=pkg-ruby-extras/ruby-rails.git;a=summary Homepage: http://www.rubyonrails.org XS-Ruby-Versions: all Package: ruby-rails-3.2 Architecture: all XB-Ruby-Versions: ${ruby:Versions} Depends: ${shlibs:Depends}, ${misc:Depends}, ruby-activesupport-3.2 (>= 3.2.6), ruby-activesupport-3.2 (<< 3.2.6.), ruby-actionpack-3.2 (>= 3.2.6), ruby-actionpack-3.2 (<< 3.2.6.), ruby-activerecord-3.2 (>= 3.2.6), ruby-activerecord-3.2 (<< 3.2.6.), ruby-activeresource-3.2 (>= 3.2.6), ruby-activeresource-3.2 (<< 3.2.6.), ruby-actionmailer-3.2 (>= 3.2.6), ruby-actionmailer-3.2 (<< 3.2.6.), ruby-railties-3.2 (>= 3.2.6), ruby-railties-3.2 (<< 3.2.6.), bundler, rubygems-integration Description: MVC ruby based framework geared for web application development Rails is a full-stack, open-source web framework in Ruby for writing real-world applications. . Being a full-stack framework means that all layers are built to work seamlessly together. That way you don't repeat yourself and you can use a single language from top to bottom. Everything from templates to control flow to business logic is written in Ruby. . This package provides Rails version 3.2. Package: rails3 Architecture: all Depends: ruby-rails-3.2, ${shlibs:Depends}, ${misc:Depends} Description: MVC ruby based framework geared for web application development Rails is a full-stack, open-source web framework in Ruby for writing real-world applications. . Being a full-stack framework means that all layers are built to work seamlessly together. That way you don't repeat yourself and you can use a single language from top to bottom. Everything from templates to control flow to business logic is written in Ruby. . This package is a convenience metapackage that depends on ruby-rails-3.2. ruby-rails-3.2/debian/changelog~0000664000175000017500000000022212244425624015044 0ustar ianianruby-rails-3.2 (3.2.6-1) unstable; urgency=low * Initial release. -- Antonio Terceiro Sun, 24 Jun 2012 21:16:07 -0300 ruby-rails-3.2/debian/changelog0000664000175000017500000000104412432202022014631 0ustar ianianruby-rails-3.2 (3.2.6-2~dummy2) unstable; urgency=low * Change something in the upstream yml. -- Ian Jackson Sun, 24 Nov 2013 16:05:06 +0000 ruby-rails-3.2 (3.2.6-2~dummy1) unstable; urgency=low * Add broken build-dependency, for testing. * Do not use ruby build system when building package. -- Ian Jackson Sun, 24 Nov 2013 16:25:38 +0000 ruby-rails-3.2 (3.2.6-1) unstable; urgency=low * Initial release. -- Antonio Terceiro Sun, 24 Jun 2012 21:16:07 -0300 ruby-rails-3.2/debian/watch0000664000175000017500000000013712432200232014013 0ustar ianianversion=3 http://pkg-ruby-extras.alioth.debian.org/cgi-bin/gemwatch/rails .*/rails-(.*).tar.gz work/using-these0000755000000000000000000000021014761250142011102 0ustar #!/bin/bash set -e d="${0%/*}" PERLLIB=$d${PERLLIB:+:}${PERLLIB} export PERLLIB PATH=$d:$d/infra${PATH:+:}${PATH} export PATH exec "$@"