work/0000775000000000000000000000000015016262471006734 5ustar work/.dir-locals.el0000664000000000000000000000040115016262471011360 0ustar ;;; Directory Local Variables -*- no-byte-compile: t -*- ;;; For more information see (info "(emacs) Directory Variables") ((nil . ((indent-tabs-mode . t) (fill-column . 70))) (python-mode . ((indent-tabs-mode . nil) (fill-column . 78)))) work/.gitignore0000664000000000000000000000070715016262471010730 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 tag2upload.5 substituted .po4a.translated-only work/.gitlab/0000775000000000000000000000000015016262471010254 5ustar work/.gitlab/issue_templates/0000775000000000000000000000000015016262471013462 5ustar work/.gitlab/issue_templates/Default.md0000664000000000000000000000057715016262471015401 0ustar Please do not file any new issues here. Instead, file Debian Bug Tracking System bugs. This allows us to organise things by binary package, though feel free to report against src:dgit if in any doubt. Merge requests on salsa remain very welcome. (We cannot make the issues tracker read-only without disabling it completely, which would break links to comments in closed issues.) work/.gitlab-ci.yml0000664000000000000000000000416115016262471011372 0ustar # We're following this recipe # Advanced Use # https://salsa.debian.org/salsa-ci-team/pipeline#advanced-use include: - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml variables: # See: # https://salsa.debian.org/salsa-ci-team/pipeline#skipping-a-job # Skipping a job # Very slow and resource-intensive SALSA_CI_DISABLE_AUTOPKGTEST: 1 # We build no arch-specific packages; thse are just wasted faff SALSA_CI_DISABLE_BUILD_PACKAGE_ANY: 1 SALSA_CI_DISABLE_CROSSBUILD_ARM64: 1 # Doesn't work with unfinalised changelogs SALSA_CI_DISABLE_REPROTEST: 1 SALSA_CI_LINTIAN_SUPPRESS_TAGS: changelog-empty-entry # t2usm project T2USM_EXECUTABLE_URL: https://salsa.debian.org/dgit-team/tag2upload-service-manager/-/jobs/artifacts/main/raw/artifacts/tag2upload-service-manager?job=build .dgit-test-suite: stage: test image: debian:testing dependencies: - build after_script: - tests/maybe-tail-log-of-one-failing-test artifacts: name: logs when: always expire_in: 1 week paths: - tests/tmp/* dgit-test-suite: extends: .dgit-test-suite script: - apt-get -y update - tests/gitlab-ci-run-all dgit-test-suite-bookworm: extends: dgit-test-suite image: debian:bookworm variables: DGIT_TEST_CURRENT_SUITE: bookworm dgit-test-suite-bullseye: extends: dgit-test-suite image: debian:bullseye variables: DGIT_TEST_CURRENT_SUITE: bullseye dgit-test-suite-buster: extends: dgit-test-suite image: debian:buster variables: DGIT_TEST_CURRENT_SUITE: buster t2u-integration: extends: .dgit-test-suite stage: test script: - apt-get -y update - apt-get -y install curl - curl -L "$T2USM_EXECUTABLE_URL" >tag2upload-service-manager - chmod +x tag2upload-service-manager - export DGIT_TEST_T2USM_PROGRAM=$(pwd)/tag2upload-service-manager - export TESTSCRIPTS=$(tests/list-t2u-integration-tests) - tests/gitlab-ci-run-all t2u-integration-bookworm: extends: t2u-integration image: debian:bookworm # Don't set DGIT_TEST_CURRENT_SUITE just in case that might suppress the # very test case(s) we care about. work/DEVELOPER-CERTIFICATE0000664000000000000000000000261615016262471011731 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/0000775000000000000000000000000015016262471010116 5ustar work/Debian/Dgit/0000775000000000000000000000000015016262471011005 5ustar work/Debian/Dgit/ExitStatus.pm0000664000000000000000000000073515016262471013465 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.pm0000664000000000000000000000145415016262471011763 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.pm0000664000000000000000000000122615016262471012063 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 usable 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.pm0000664000000000000000000000102415016262471012377 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/0000775000000000000000000000000015016262471012244 5ustar work/Debian/Dgit/Policy/Debian.pm0000664000000000000000000000131315016262471013762 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/ProtoConn.pm0000664000000000000000000001336515016262471013274 0ustar # -*- perl -*- # dgit # Debian::Dgit::Proto: protocol helper utilities # # Copyright (C)2015-2020,2022-2024 Ian Jackson # Copyright (C)2020-2024 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 . package Debian::Dgit::ProtoConn; use strict; use warnings; use Debian::Dgit; use Debian::Dgit::I18n; use Carp; use IPC::Open2 (); sub new ($$) { # Arguments to new: # $fh_r filehandle to read from # $fh_w filehandle to write to my ($class, $fh_r, $fh_w) = @_; bless { R => $fh_r, W => $fh_w, Cmd => undef, Pid => undef, Desc => undef, EofHook => sub { undef; }, FailHook => sub { undef; }, } => $class; } sub open2 { my $class = shift; my $pid = IPC::Open2::open2(my $fh_r, my $fh_w, @_); my $r = Debian::Dgit::ProtoConn->new($fh_r, $fh_w); $r->{Pid} = $pid; $r->{Cmd} = [ @_ ]; $r } # $hook is called when we get unexpected eof and # should return a (translated) message, # or undef if a generic message is fine. # # The hook is called by the following functions: # expect # read_bytes # readfail # in each case, if the stream got EOF, but not if our read got an error. sub set_eof_hook ($$) { my ($self, $hook) = @_; $self->{EofHook} = $hook; } # $hook is called just before fail, and it is passed the error message as sole argument sub set_fail_hook ($$) { my ($self, $hook) = @_; $self->{FailHook} = $hook; } sub set_description ($$) { my ($self, $desc) = @_; $self->{Desc} = $desc; } sub _fail ($$) { my ($self, $m) = @_; $self->{FailHook}($m); fail +(defined $self->{Desc} ? $self->{Desc}.': ' : '').$m; } sub bad ($$) { my ($self, $m) = @_; $self->_fail(f_ "connection lost: %s", $!) if $self->{R}->error; $self->_fail(f_ "protocol violation; %s not expected", $m); } sub get_pid ($$) { my ($self) = @_; $self->{Pid}; } sub get_command ($$) { my ($self) = @_; $self->{Cmd}; } # die due to a read error. # # `$wh` is a (translated) description of what we were trying to read # (which is used on EOF, if set_eof_hook was not called.) sub readfail ($$) { my ($self, $wh) = @_; $self->_fail(f_ "connection lost: %s", $!) if $!; my $report = $self->{EofHook}(); $self->_fail($report) if defined $report; $self->bad(f_ "eof (reading %s)", $wh); } # Expects to receive a message in some particular form(s) # # $match->() is used to analyse the received message. # Calls $match->() having set `$_` to the received line (chomped). # # In array context, calls $match->() in array context; # a nonempty array means the value matched, # and is then returned. # # In other contexts, calls $match->() in scalar context; # a true value means the value matched, and is returned. # # If $match returns false, it is bad (expect calls $self->bad()). sub expect ($&) { my ($self, $match) = @_; # Bind $_ for the benefit of the user's matcher. local $_ = readline $self->{R}; defined && chomp or $self->readfail(__ "protocol message"); printdebug +($self->{Desc} // '')."<< $_\n"; if (wantarray) { my @r = &$match; return @r if @r; } else { my $r = &$match; return $r if $r; } $self->bad(f_ "\`%s'", $_); } sub read_bytes ($$) { my ($self, $nbytes) = @_; $nbytes =~ m/^[1-9]\d{0,5}$|^0$/ or $self->bad(__ "bad byte count"); my $d; my $got = read $self->{R}, $d, $nbytes; $got==$nbytes or $self->readfail(__ "data block"); return $d; } # Receive data sent via zero or more `data-block` messages. # # Successive data blocks are passed as the sole argument to `$take_data`. # # The caller should consider doing at least one `printdebug` # before calling this function, if there isn't one nearby already. sub receive_data_blocks ($&) { my ($self, $take_data) = @_; for (;;) { my ($more_data, $l) = $self->expect(sub { m/^data-block (.+)$/ ? (1,$1) : m/^data-end$/ ? (0,) : (); }); last unless $more_data; my $d = $self->read_bytes($l); $take_data->($d); } } sub receive_file ($$) { my ($self, $ourfn) = @_; printdebug +($self->{Desc} // '')."() $ourfn\n"; my $pf = new IO::File($ourfn, ">") or die "$ourfn: $!"; $self->receive_data_blocks(sub { print $pf $_[0] or confess "$!"; }); close $pf or confess "$!"; } # Like `send` but doesn't add a newline and doesn't call `printdebug` sub send_raw (&$) { my ($self, $msg) = @_; my $fh = $self->{W}; print $fh $msg or confess "$!"; } sub send (&$) { my ($self, $msg) = @_; printdebug +($self->{Desc} // '').">> $msg\n"; $self->send_raw("$msg\n"); } sub send_counted_message ($$$) { my ($self, $command, $message) = @_; $self->send("$command ".length($message)); $self->send_raw($message); } sub send_file ($$) { my ($self, $ourfn) = @_; my $pf = new IO::File($ourfn, '<') or die "$ourfn: $!"; my $fh = $self->{W}; for (;;) { my $d; my $got = (read $pf, $d, 65536) // die "$ourfn: $!"; 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; } 1; work/Debian/Dgit.pm0000664000000000000000000011137615016262471011354 0ustar # -*- perl -*- # dgit # Debian::Dgit: functions common to dgit and its helpers and servers # # Copyright (C)2015-2020,2022-2023 Ian Jackson # Copyright (C)2020 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 . 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(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 rmdir_r 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 $failmsg_prefix $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 $atext_re $dot_atom_text_re $addr_spec_re $angle_addr_re $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; # This is RFC 5322's 'atext'. our $atext_re = qr([[:alnum:]!#$%&'*+\-/=?^_`{|}~])a; # This is RFC 5322's 'dot-atom-text' without comments and whitespace. our $dot_atom_text_re = qr($atext_re(?:\.|$atext_re)*)a; # This is RFC 5322's 'addr-spec' without obsolete syntax. our $addr_spec_re = qr($dot_atom_text_re\@$dot_atom_text_re); # This is RFC 5322's 'angle-addr' without obsolete syntax. our $angle_addr_re = qr(\<($addr_spec_re)\>)a; 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; } # Set this variable (locally) at the top of an `eval { }` when # - general code within the eval might call fail # - these errors are nonfatal and maybe not even errors # This replaces `dgit: error: ` at the start of the message. our $failmsg_prefix; 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 () { # $SIG{__WARN__} affects `warn` but not `-w` (`use warnings`). # Ideally we would fatalise all warnings. However: # 1. warnings(3perl) has a long discussion of why this is # a bad idea due to bugs in, well, everything. # 2. So maybe we would want to do that only when running the tests, # 3. However, because it's a lexical keyword it's difficult to # manipulate at runtime. We could use the caller's ^H # via caller, but that would take effect only in the main # program (which calls setup_sigwarn, eg dgit.git/dgit), # and not in the modules. # This is all swimming too much upstream. 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 { # Quote an argument list for use as a fragment of shell text. # # Shell quoting doctrine in dgit.git: # * perl lists are always unquoted argument lists # * perl scalars are always individual arguments, # or if being passed to a shell, quoted shell text. # # So shellquote returns a scalar. # # When invoking ssh-like programs, that concatenate the arguments # with spaces and then treat the result as a shell command, we never # use the concatenation. We pass the intended script as a single # parameter (which is in accordance with the above doctrine). 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." ".(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 = "@_"; $s =~ s/\n\n$/\n/g; my $prefix; my $prefixnl; if (defined $failmsg_prefix) { $prefixnl = ''; $prefix = $failmsg_prefix; $s .= "\n"; } else { $prefixnl = "\n"; $s = f_ "error: %s\n", "$s"; $prefix = _us().": "; } $s =~ s/^/$prefix/gm; return $prefixnl.$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 ($;$) { my ($ref, $cmd_map) = @_; $cmd_map //= sub { @_; }; return cmdoutput $cmd_map->(qw(git rev-parse), "$ref~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 rmdir_r ($) { my ($dir) = @_; # Removes the whole subtree $dir (which need not exist), or dies. # # We used to use File::Path::remove_tree (via ::rmtree) but its # error handling and chmod behaviour is very complex and confusing. # For example: # - It chdirs, and then tries to chdir back. # With our $SIG{__WARN__} setting to die, this can, in combination # with eval, cause execution to continue in an unexpected cwd! # - Without the `safe` option it chmods things. We never want that. # - *With* the `safe` option it appears to silently skip things # it would want to chdir. # - The error handling with the errors option is rather janky. # Don't fork/exec rm if we don't have to. return unless stat_exists $dir; # We don't use runcmd because we want to capture errors from rmdir # in $@ so that if we eval a rmdir_r, the right things happen. # even cmdoutput_errok is too cooked. my @cmd = (qw(rm -rf --), $dir); debugcmd '+', @cmd; my $child = open P, "-|" // confess $!; if (!$child) { open STDERR, ">& STDOUT" or die $!; exec @cmd or die "exec $cmd[0]: $!"; } $!=0; $?=0; my $errs; { local $/ = undef; $errs =

; } confess "$!" if P->error; return if close P && !stat_exists $dir; chomp $errs; $errs =~ s{\n}{; }g; $errs ||= 'no error messages'; die f_ "failed to remove directory tree %s: rm -rf: %s; %s\n", $dir, waitstatusmsg, $errs; } 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 { # parsechangelog @dpkg_changelog_args # parsechangelog \&cmd_map, @dpkg_changelog_args my $c = Dpkg::Control::Hash->new(name => 'parsed changelog'); my $p = new IO::Handle; my $cmd_map = sub { @_; }; $cmd_map = shift @_ if ref $_[0]; my @cmd = $cmd_map->(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 # creating 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 # # rmdir_r 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; rmdir_r $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/HACKING0000664000000000000000000000652115016262471007727 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 install all test suite dependencies like this: sudo apt-get install $(tests/enumerate-tests dep-packages) 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/Makefile0000664000000000000000000001322015016262471010372 0ustar # dgit # Integration between git and Debian-style archives # # Copyright (C)2013-2018 Ian Jackson # Copyright (C)2019,2024 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 infradebiandir=$(prefix)/share/dgit-infrastructure/debian txtdocdir=$(prefix)/share/doc/dgit absurddir=$(prefix)/share/dgit/absurd PROGRAMS=dgit git-playtree-setup mini-git-tag-fsck 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 \ Debian/Dgit/ProtoConn.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 GDP_MAN5PAGES=tag2upload.5 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 \ tag2upload-oracled INFRA_EXAMPLES=get-dm-txt ssh-wrap drs-cron-wrap get-suites INFRA_DEBIAN=get-dm-txt tag2upload-builder-rebuild \ tag2upload-oracle-crontab tag2upload-builder-crontab INFRA_PERLMODULES= \ Debian/Dgit.pm \ Debian/Dgit/Infra.pm \ Debian/Dgit/Policy/Debian.pm \ Debian/Dgit/ProtoConn.pm MANPAGES=$(MAN1PAGES) $(MAN5PAGES) $(MAN7PAGES) \ $(GDR_MAN1PAGES) $(GDR_MAN5PAGES) \ $(GDP_MAN1PAGES) $(GDP_MAN5PAGES) 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_DATA) $(GDP_MAN5PAGES) $(DESTDIR)$(man5dir) 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) $(INSTALL_PROGRAM) $(addprefix infra/, $(INFRA_DEBIAN)) \ $(DESTDIR)$(infradebiandir) set -e; for m in $(INFRA_PERLMODULES); do \ $(INSTALL_DATA) $$m $(DESTDIR)$(perldir)/$${m%/*}; \ done installdirs-gdp: $(INSTALL_DIR) $(DESTDIR)$(bindir) \ $(DESTDIR)$(man1dir) $(DESTDIR)$(man5dir) installdirs-gdr: $(INSTALL_DIR) $(DESTDIR)$(bindir) \ $(DESTDIR)$(man1dir) $(DESTDIR)$(man5dir) \ $(addprefix $(DESTDIR)$(perldir)/, $(dir $(GDR_PERLMODULES))) installdirs-infra: $(INSTALL_DIR) $(DESTDIR)$(bindir) \ $(DESTDIR)$(infraexamplesdir) $(DESTDIR)$(infradebiandir) \ $(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 \ $^ $@ tag2upload.5: tag2upload.5.pod pod2man --section=5 --date="Debian Project" --center="tag2upload" \ --name tag2upload \ $^ $@ %.view: % man -l $* work/NOTES.dgit-downstream-dsc.7.pod0000664000000000000000000000472215016262471014360 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-debrebase0000664000000000000000000001033715016262471012247 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 available 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.podchecker0000664000000000000000000000214115016262471011653 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-import0000664000000000000000000001066515016262471011704 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.md0000664000000000000000000000245115016262471010215 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 usable 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/TAG2UPLOAD-DESIGN.txt0000664000000000000000000003070215016262471012050 0ustar TAG-TO-UPLOAD - DEBIAN - SERVICE DESIGN / DEPLOYMENT PLAN ========================================================= Overall structure and dataflow ------------------------------ * Uploader (DD or DM) makes signed git tag (containing metadata forming instructions to tag2upload service) * Uploader pushes said tag to salsa. [1] * salsa sends webhook to tag2upload service. * tag2upload service : provides an HTTPS service accessible to salsa : fishes url and tag name out of webhook json : checks to see if the tag is at all relevant : retrieves tag data (git shallow clone) ! verifies signature on the tag ! parses the tag metadata ! checks that salsa repo url is basically sane ! checks to see if signed by DD, or DM for appropriate package - obtains relevant git history - obtains, if applicable, orig tarball from archive - makes source package # signs source package and "canonical view" git tag - pushes history and both tags to dgit-repos git server - uploads source package to archive ! reports activities by email : shows status of package building to enquirers via www * archive publishes package as normal [1] In principle other git servers would be possible but it would have to be restricted to ones where we can either avoid, or stop, them being used as a channel for a DoS attack against the tag2upload service. Privsep ------- The tag2upload service will have to have a signing key that can upload source packages to the archive. We do not want that signing key to be abused. In particular, even though it will be in a hardware token we want to avoid giving unrestricted access to use that key, to code which itself has a large attack surface. In particular, source package construction is very complex. So there will be a privilege separation arrangement, as described above. Different tasks run in a different security context: : runs on the Manager, which is web-accessible and not trusted very much ! is fully trusted and has access to the signing key - runs in the discardable VM or container, controlled by `!' # is achieved by the `dgit rpush' protocol, where the trusted (invoking, signing) part offers a restricted signing oracle to the less-trusted (building) part. The signing oracle will check that the files to be signed are roughly in the right form and that they name the right source package. It will construct the "canonical view" git tag itself from metadata provided by the building part. The signing oracle has the information from the now-verified git tag (since it operating in the context of a particular request) and will only sign for the same source package and version. Service architecture -------------------- I propose the following architecture for the tag2upload service. There are three systems involved: I. Manager (`:`) Hardly trusted. * Database (sqlite) containing queue, and historical data. * Conventional webserver offering TLS and using Let's Encrypt. * Manager daemon. Manager daemon has the following tasks: * Web-service-style "application server" written in some scripting language listens on a local TCP port, handles HTTP connections proxied by the webserver. * Receives webbook requests. Checks that the calling IP address is salsa. Parses the JSON. Checks tag name to see if it seems of interest. If so, fetches the actual tag data (git shallow clone) and sees if it looks plausible, and if so, stores it in the db. If an Oracle client is waiting, feeds it the tag and url. * Server for very simple protocol, used by Oracle to obtain work to do. Accessed via ssh with restricted key (`ssh ... nc`). * Manager daemon web service also offers basic query API and web pages showing recent activity, for human tracking. (To all comers.) II. Oracle (`!`) Trusted to use the signing key. (Key itself is in a hardware token.) Not exposed to source package contents. Not exposed to the web. Not exposed via the git protocol, not even as a client. * Uses ssh to connect to manager's simple Oracle protocol port. Manager sends Oracle the signed tag, and repository URL. * Sends an email saying what it is about to process. (We do this in the Oracle so that less-trusted components don't get to hide their misbheaviours by not sending reports.) * Checks that the tag is signed by someone in the keyring (and that it uses a good enough hash function). (Oracle has a copy of the keyrings and dm allow list.) * Parses the tag to find the metadata including source package name, target suite, and version. Checks that the signer is authorised for this package. * Checks that the source repository URL is basically sane. (But does not access it - the Builder does that, below.) * Arranges that the Builder is reset (see below). * ssh's to the Builder to have the builder fetch the git data. * Runs dgit rpush, specifying the package, version and target suite on the command line. Target host is the Builder. (We use the existing dgit rpush signing oracle protocol, except extended to include the new SOURCE_VERSION.git.tar.xz described below.) * Sends an email saying what it did. * Reports the outcome success/failure and a summary line to the Manager via the still-open manager protocol connection. III. Builder (`-`) Does the actual source package conversion. Largely trusts the Oracle. Trusted as to source package contents, but not otherwise. Oracle can reset this. So it is a VM or a chroot. We propose to use the same schroot configuration as for a buildd, subject to consultation with DSA as to the best approach. * On instructions from the Oracle (via incoming ssh): - Fetches the git objects for the maintainer's tag from Salsa. - Fetches the git objects for the existing canonical view from the dgit-repos git server. - Fetches necessary origs from the archive. - Converts the git history to the canonical form (treesame to the source package) by adding necessary synthetic commits. - Builds the source package - Uses the rpush protocol to obtain signed git tag (on the canonical git form) and signed .dsc and .changes. - Pushes the git objects to the dgit-repos server. - Uploads the .dsc and .changes to the archive. * Packet filter limiting outgoing connections to salsa, dgit-repos, and the Debian archive, Incoming connections come only from the Oracle. Reproducibility, metadata and auditing -------------------------------------- The trusted part of the tag2upload service will keep some logs, particularly of each tag it is told about and what the disposition of that was, and when it was retried. Also, it will send the following information to a public mailing list: - The tag object data for any tag it decides to process, before it passes it to the VM. - A report (more or less, a shell transcript) of each processing attempt - The list will also be the public email address of the tag2upload robot's signing key The generated .dscs will contain additional fields Git-Tag-Tagger: Firstname Surname "tagger" line from the git tag converted to deb822 format Git-Tag-Info: tag= fp= is the git object ID of the tag object (if someone wants to obtain referenced git objects, they can be found on the dgit-repos git server) is the "fingerprint_in_hex" from the VALIDSIG line in the gpgv output. This additional metadata is needed to be able to tell by looking at the .dsc who the original uploader was (which might be different to the maintainer, in the sponsorship case). (Programs which use the uploader signature identity will send mails to the mailing list mentioned above, until they have been updated. This is not desirable but not a blocker for deployment.) The generated .changes will contain copies of the two .dsc fields above. The upload will contain a .source_buildinfo. This will list the versions of the software running in the Builder, which is primarily what controls the generated .dsc. The versions of dgit-infrastructure and git running in the trusted part are also relevant because the trusted part assembles outgoing tagger lines etc. and interprets the incoming git tag; however, in our deployment we intend to maintain them in sync, and anyway our ad-hoc reproduction tooling will not be able to arrange for them to be different. So the outside-VM version information will not be included. Eventually there could be a mode for sbuild (related to binary build reproduction), or a suitable script, which can verify a reproduction attempt. For now the src:dgit test suite will check that the upload is reproducible if run again in the same environment. SOURCE_VERSION.git.tar.xz ========================= The .changes will also contain a file SOURCE_VERSION.git.tar.xz which is a compressed git repository with the following properties: * It has the ref debian/VERSION, the maintainer's signed tag. * It is sufficient on its own to (re)produce the canonical git view. It is jointly sufficient, together with the orig.tar, to (re)produce the source package. (When the upload including the .git.tar.xz does not contain the full source, this means the orig.tar that's already in the archive.) * These reproductions are up to equality of file names and contents -- timestamps of files may differ. * It is usually shallow, for performance and storage space reasons. * It may be a bare repository; or, it might be that no branch is checked out. This .git.tar.xz is for the purpose of third-party auditing of what tag2upload did. There will be a Python script in dgit.git, called mini-git-tag-fsck, which will take the .git.tar.xz as input, and produce two forms of auditing output: * It extracts the maintainer's signed tag and deconstructs it into two files, the tag text, and the detached signature. * It prints to standard output a list of all files in the tagged commit, with their git checksums (their object IDs). It does this by walking the Merkle tree whose head is the debian/VERSION signed tag object, re-checksumming as it goes. mini-git-tag-fsck has the following other properties: * It does not verify the signature on the tag. That is left to the caller. * Given that the signature on the tag *is* valid, then all of the script's own output is (transitively, via SHA1CD hashing) covered by that signature, and so the output faithfully represents the intent of the person who signed the tag. * It does not invoke git, or anything from libgit2, or any other external code of comparable complexity. * It is designed to process only tag2upload's .git.tar.xz repositories; it cannot process arbitrary git repositories. Although the .git.tar.xz contains a bona fide git repository, special arrangements are made regarding packfiles versus loose objects to facilitate mini-git-tag-fsck's being able to process it without invoking git/libgit2/etc.. mini-git-tag-fsck will also have a mode to generate the .git.tar.xz. This will be invoked by the tag2upload service as part of preparing the upload. (This mode will need to call out to git/libgit2/etc..) Emails ------ Emails are sent to: 1. The username associated with the signing key 2. The tagger (email address from the git tag object) 3. A public mailing list selected (or created) for the purpose 1 and 2 will often be the same. This provides feedback to the person making the signature. The person preparing (rather than, maybe, sponsoring) the upload (Changed-By in .changes) will be notified by the archive software. The email report will contain at least: * The target distro, package, suite and version * The URL from which the git objectx were downloadeed * Whether the operation succeeded, and error messages if it didn't. Email is sent by the Oracle feeding a file to `ssh smarthost sendmail -t` not by implementing SMTP, to reduce the attack surface. DoS --- This service is not very resistant to DoS attacks. In particular, sending it bad URLs might stall it (since it has to retry failing URLs). So we (i) do not expose it to anyone but salsa and (ii) limit it to trying to fetch salsa urls. Making very many tags on salsa would stress this tag2upload service a bit but not fatally, and it would be a DoS against salsa too. After signature verification, we are much more vulnerable to DoS. An approved signer can get the service to do a lot of work. That is the purpose of the service, indeed. work/TAG2UPLOAD-FAQ.md0000664000000000000000000002611615016262471011273 0ustar # tag2upload Frequently Asked Questions * [What is tag2upload anyway and how does it work? ](#what-is-tag2upload-anyway-and-how-does-it-work-) * [How much effort will I have to put in to adopt tag2upload?](#how-much-effort-will-i-have-to-put-in-to-adopt-tag2upload) * [Which git workflows does tag2upload support? And which not?](#which-git-workflows-does-tag2upload-support--and-which-not) * [What is the relationship between tag2upload & dgit?](#what-is-the-relationship-between-tag2upload--dgit) * [Why are we having a GR? Have other avenues been exhausted?](#why-are-we-having-a-gr--have-other-avenues-been-exhausted) * [How about including sha256 checksums of the source package contents in the git tag?](#how-about-including-sha256-checksums-of-the-source-package-contents-in-the-git-tag) * [How does access control work? What about Debian Maintainer (DM) uploads?](#how-does-access-control-work--what-about-debian-maintainer-dm-uploads) * [Aren't you demanding that ftpmaster volunteers do work they disagree with?](#arent-you-demanding-that-ftpmaster-volunteers-do-work-they-disagree-with) * [I'm not happy voting on an unimplemented design proposal](#im-not-happy-voting-on-an-unimplemented-design-proposal) ## What is tag2upload anyway and how does it work? As the GR says, tag2upload will make it possible to upload a package to Debian, by signing and pushing a simple git tag. The tag contains a tiny amount of human-readable metadata, which instructs a robot, running on Debian Project infrastructure, to build and upload a source package. Most of tag2upload is already implemented and tested. We just need some code to invoke the machinery, and then we can deploy it. The full design document is here: Ian gave a talk on tag2upload at the 2023 Cambridge Minidebconf: There's a helpful diagram on the last page of the slides: ## How much effort will I have to put in to adopt tag2upload? If your existing workflow is based on upstream git, then very little. Let's suppose you are using git-buildpackage. You prepare and test your upload as normal. When you are ready to tag, dput and push to salsa, you instead just type `git debpush`. That's it. The only other thing is that the first time will require `git debpush --gbp` to record that you're using git-buildpackage and not, say, git-dpm. Thereafter `git debpush` alone will work, for all uploaders. git-debpush is deliberately very simple. It is a hundred times simpler than both dgit and git-buildpackage. It isn't likely to fail in ways that aren't easy to understand for anyone experienced with uploading directly to ftp-master. The tag format is simple enough that you can create and push tags manually, using plain `git tag` and `git push`: refer to the specification in . ## Which git workflows does tag2upload support? And which not? * git-buildpackage workflows and patches-applied workflows all work. * Workflows where only `debian/` is committed to the repository mostly work. * Native packages work. * The main exceptions are packages in team monorepos, and packages with very large assets that can't be checked into git. These are not supported yet. tag2upload really shines in a fully-git-based workflow, where you do all of your Debian work in git, in a git branch which is based on upstream's signed git tags -- and ignore any upstream tarballs. One of tag2upload's design principles is that git and the source package must be equivalent. So if you use upstream *tarballs* as the base for your work (and as the `.orig`), there must be a commit/tag/branch in your repository that contains the full upstream release, including anything which upstream includes in their tarball releases but doesn't commit to their own VCS repository, such as autotools output. Your packaging branch must be based off this full upstream release (except for the "bare debian/ directory" workflow). gbp-importorig can be used to create this tarball import. ## What is the relationship between tag2upload & dgit? dgit is relevant to the server-side implementation, but you do not need dgit installed, or to learn dgit, to use `git debpush`. From an uploader's perspective, dgit is a server-side implementation detail. * dgit is the most mature tool that exists for converting arbitrary git trees to Debian source packages. So tag2upload calls out to dgit for that purpose. * tag2upload is developed in dgit.git because they are tested using the same test suite. * tag2upload pushes to dgit.debian.org because that git archive has the desired append-only properties, and there's no reason to set up a separate git hosting service for t2u. * The git tag metadata reuses syntax developed for dgit. ## Why are we having a GR? Have other avenues been exhausted? tag2upload was originally designed, and mostly implemented, four years ago in 2019. ftpmaster declined to allow the deployment of tag2upload, and some ftpmaster delegates requested major design changes that we felt would defeat the point. Since then we have been quietly seeking help behind the scenes, with multiple DPLs and other prominent members of the project who might've been able to successfully mediate. Unfortunately these efforts did not lead to resolution of the impasse. The specific changes requested were: * The tag2upload server should perform only certain trivial git->dsc conversions. But this would mean that tag2upload wouldn't work for most Git workflows Debian package maintainers actually use, including very common git-buildpackage workflows. * The tag2upload client should locally compute some sort of tree hash over the included files, and include it in the Git tag. But this would mean that tag2upload requires running Debian-specific tools over the Git tree before uploading, which defeats a core design goal of tag2upload. These points are discussed in more detail in the next section. On debian-vote this June, we had another extensive discussion with ftpmaster delegates, and it reached exactly the same conclusion as the discussion in 2019. (Constitutionally, as this is a delegate override, only a GR is appropriate, not the TC.) ## How about including sha256 checksums of the source package contents in the git tag? This is intended to allow dak to establish a chain of trust from a signature by the uploader to the *contents* of the .dsc. Our understanding of ftpmaster's position is that, with this change, tag2upload would be acceptable to them. However, this approach eliminates much of the point of tag2upload: With our design, the git tag for an upload is *just* a git tag, containing a small amount of simple metadata. You can see an example (from a talk demo), here: With the proposed modification, this is no longer true. Making that list of the sha256sums is very complicated. Doing so requires building the source package (or something very like it) locally, on the tagger's system. This is a problem because in the general case, reliably producing source packages from git is complex, depends on the git workflow in use, and is highly Debian-specific. The point of tag2upload is to move the git-to-dsc conversion from the maintainer's laptop to a central system, which is more convenient, traceable, reliable, and secure. If we adopted this suggestion: * git-debpush would have to be much, much more complicated -- as complicated as dgit -- and opaque. * Only git-debpush would be able to generate the tag. But we want it to be possible for other software to generate it. * The conversion from git to source package might still be influenced by bugs and anomalies on the uploader's system. **So, this is the core of the disagreement.** With this modification, it's no longer "just tag to upload" -- and we feel it's no longer worthwhile. Further reading: * Sven Mueller summarised it well, here: (start reading at "In essence:"). * Russ Allbery wrote a more detailed explanation of objections to the suggestion: * Ian Jackson described in detail some cases which show why reliably producing source packages from git is so complex: ## How does access control work? What about Debian Maintainer (DM) uploads? tag2upload implements the same access control policy as the Debian Archive, based on the keyrings and `dm.txt`. So tag2upload is usable precisely by uploading Debian Members (uploading DDs), and by Debian Maintainers (DMs) for their authorised packages. The access control on the tag2upload server is a reimplementation. As a future avenue of development, we would like to include a copy of the maintainer's signed git tag along with the rest of the upload. We can't do this already because it would cause dak to reject the upload. We hope dak will be modified to accept this additional file, and then to use it to redo tag2upload's authentication and authorisation checks on the original signed tag. This modification is a good idea, but not required for deployment. ## Aren't you demanding that ftpmaster volunteers do work they disagree with? No. We hope this GR will decide that archive.debian.org should extend enough trust to the tag2upload server for the system to work. Once that's decided, then there are deployment strategies that do not involve *any* work by ftpmaster. The natural deployment strategy would be for ftpmaster to add a new keyring that allows uploading only source packages, similar to how there is a keyring for the binary buildds which allows uploading only binary packages. So that would be a small amount of work for ftpmaster. But, instead, the tag2upload server's signing key could be certified as a subkey by an existing key which is already authorised for uploads. Or the tag2upload robot could be enrolled in the Debian keyring as a pseudo-DD. These deployment strategies aren't as good as first-class support in dak, but they are OK. Of course there *are* security improvements, which could be made before or after deployment, which would involve work by both ftpmaster and the tag2upload team. We would encourage and cooperate with such improvements, but they are not essential. ## I'm not happy voting on an unimplemented design proposal The core of tag2upload -- the automated tag handler and source package constructor -- is implemented and tested. You may have seen it demo'd, for example in Ian's 2023 Cambridge Minidebconf talk. The bulk of the remaining implementation work is just the surrounding framework, which we will work on in detail after discussion with DSA. It doesn't make sense for us and DSA to do all this work if the resulting system won't be actually enabled. work/TAG2UPLOAD-MANAGER-PROTOCOL.md0000664000000000000000000001315015016262471013167 0ustar # Protocol between the tag2upload Manager and the Oracle. ## Initiation and lifecycle The Oracle initiates the connection. The transport is `ssh manager nc`: ie, the Manager will be listening on a local socket. (There will be an ssh restricted command.) In principle, the Oracle might make multiple connections, if it has multiple worker processes. In that case, each worker has one connection. The ssh connection will use "protocol keepalives", so that the Manager will (eventually) detect a failure. ## Protocol ### Basic principles; notation The protocol is line-based. Lines are terminated by newlines. Extraneous whitespace is a protocol violation. We see things from the Oracle's point of view. `<` is from Manager to Oracle. ### Initial exchange ``` $ ssh manager nc -U /srv/socket < t2u-manager-ready > t2u-oracle-version 4 > worker-id WORKER-ID FIDELITY ``` If there are multiple protocol versions, the Oracle gets to choose its preferred one. This document describes version `4`. In `3` and earlier, `PUTATIVE-PACKAGE` is omitted from the `job` message. In `2` and earlier, `FIDELITY` is omitted from the `worker-id` message. (The protocol version could be on the command line, but that entangles it with the ssh restricted command.) The WORKER-ID must consist of ASCII alphanumerics, commas, hyphens, and dots, and must start with an alphanumeric. It is used by the manager for reporting, including in public-facing status reports. If the Oracle manages multiple Builders, it should make multiple connections to the Oracle, one for each Builder. (The `worker-id` message is mandatory.) `FIDELITY` is one of the fixed strings `testing` or `production`, according to the Oracle's self-determination of its own status. The Manager will not give out jobs to to a non-`production` Oracle, unless it explicitly so instructed by its administrator. ### Readiness The Oracle should then wait, indefinitely, for a job to be available. During this time, the Manager will periodically poll the Oracle for readiness: ``` < ayt > ack ``` This allows the Manager to detect a dead Oracle connection. Before responding with `ack`, the Oracle should attempt to discover any reasons why the processing of a source package is bound to fail. In particular, ideally, the Oracle would check that: * it can contact its Builder; * the build environment (the autopkgtest testbed) is `open`; * the build environment is accessible (commands can be run in it); * the signing key it intends to use is available. The Oracle need not check anything visible to the Manager. For example, the Oracle need not check availability of dgit-reposs, the ftpmaster upload queue, or input git repository servers (eg salsa). ### Job ``` < job JOB-ID PUTATIVE-PACKAGE URL < data-block NBYTES < [NBYTES bytes of data for the tag (no newline)] < data-end ``` JOB-ID is the "job id" assigned by the Manager, and displayed in the Manager's reporting web pages etc. The Oracle should use it only for reporting. It has the same syntax as BUILDER-ID. PUTATIVE-PACKAGE is the source package name. It is derived from the Manager's parse of the tag data, so should be used for reporting only. The Oracle must reparse the tag for itself after verifying the signature. URL is the git URL for the repository where the tag exists. It is guaranteed to consist of ASCII graphic characters. The NBYTES of data are precisely the git tag object, as output by `git cat-file tag`. This protocol is identical to the `dgit rpush` file transfer protocol, except that the Manager guarantees to put the whole tag in one data block. (So there will be only one `data-block`.) After receiving a job, the Oracle must produce an outcome. If it doesn't, the job (perhaps, that package version) is irrecoverable. ### Outcome ``` > message MESSAGE > uploaded ``` or ``` > message MESSAGE > irrecoverable ``` MESSAGE is UTF-8 text, possibly containing whitespace, up to the newline. The manager will log it, and display it publicly in its status reports. ### Conclusion After sending the outcome, the Oracle should either close the connection, or retain it and wait for further jobs. ### Protocol violations, reporting Either side may send this message, at any time (except in the middle of data blocks) if it considers that its peer has violated the protocol: ``` > protocol-violation MESSAGE < protocol-violation MESSAGE ``` The complaining side should then close the connection. The complained-at side should report the error somewhere, and will ideally display it in user-facing output such as status web pages or emails. It should also then close the connection. The complaining side that sends `protocol-violation` should *also* report or log the error as appropriate. ### Connection failures - handling by Oracle If the connection is dropped, or a connection attempt is unsuccessful, the Oracle should retry with a delay. ### Connection failures - handling by Manager If the connection fails (or the protocol is violated) after `job` and before the outcome, the job is treated as irrecoverable. To Manager always does an `ayt` check immediately before issuing a job, to minimise the opportunity for jobs to be lost simply because of a broken connection. (The rest of the time the Manager doesn't care about connection failure.) ### Error recovery and retrying jobs In this version of the protocol there is no way to retry a failed job. For example, if the Builder is unable to clone the repo, the tag is irrecoverable and a new version number must be used. If this turns out to be annoying in practice, we should have the Oracle ask the Manager for confirmation just before it first makes a signature, as that is the point of no return. work/absurd/0000775000000000000000000000000015016262471010214 5ustar work/absurd/git0000775000000000000000000000531415016262471010730 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/0000775000000000000000000000000015016262471010156 5ustar work/debian/changelog0000664000000000000000000044537315016262471012050 0ustar dgit (12.12~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. -- Sean Whitton Fri, 30 May 2025 08:58:49 +0100 dgit (12.12) unstable; urgency=medium Bugfixes: * git-debrebase: Use add -f for d/p/series in merge resolution Closes: #1101958. [Report from Sean Whitton] * Honour debian-nonupload keyring as a DM keyring. Will enable "non-uploading" DDs who have DM permissions to dgit push, and use tag2upload. Closes:1102202. Process metadata [Sean Whitton]: * dgit-infrastructure package description: Say "git depository" as per delegation. * Set Maintainer to role address, with humans in Uploaders. * Set a GitLab issue template. Documentation: * git-debrebase(1): fix xref to git-debrebase(5). [Tony Finch] * i18n: Updated nl translations for dgit-user(7) and messages. Closes: #1103908, #1103910. [Frans Spiesschaert] tag2upload internals: * tag2upload-oracled: Add function prototypes. [Sean Whitton] -- Ian Jackson Fri, 09 May 2025 14:38:16 +0100 dgit (12.11~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. -- Sean Whitton Thu, 03 Apr 2025 08:41:56 +0800 dgit (12.11) unstable; urgency=high dgit, dgit-repos-server, Dgit.pm [Ian Jackson]: * Install countermeasures for 'rm -r' failure (see #1101580). * Replace File::Path::rmtree with a subroutine of our own. tag2upload-oracled [Ian Jackson]: * Fix worker PID tracking, and rigorously avoid sending wild signals. Closes: #1101690. * Do not ignore SIGCHLD. * Quit if the link count of the workercwd becomes zero. Test suite: * autopkgtest-virt-null-for-test: Avoid 'mkdir -p'. Don't recreate the whole test's $tmp directory from here. [Ian Jackson] * autopkgtest-virt-null-for-test: Always set TMPDIR. In particular, when autopkgtest is new enough not to require workarounds. [Ian Jackson] * tag-updates test: Fix $tagname variable. Broken for a while, revealed by git 2.49.0 hitting sid. -- Sean Whitton Mon, 31 Mar 2025 11:45:54 +0800 dgit (12.10) unstable; urgency=medium dgit: * Avoid crash with EEXIST on single-debian-patch and --split-view=always. Closes: #1076983. [Report from Aaron M. Ucko] * Better tolerate source trees without debian/rules, eg with debputy. Closes: #1092929. [Niels Thykier; report from Andrea Pappacoda] git-debrebase: * Unconditionally enable general merge resolution attempts; improve relevant documentation, and invite bug reports. (Previously this required --experimental-merge-resolution). * upstream: Strip epoch in human-facing outputs. Closes: #1099311. workflow manpages: * dgit-maint-bpo(7): Replace a lingering --overwrite. [Sean Whitton] * dgit-nmu-simple(7): Be less pessimistic about rebasing. Closes: #1099519. * Disambiguate what we mean by "first ever dgit push". [Sean Whitton] translations [Frans Spiesschaert]: * nl: Update translation for messages. Closes: #1090762. * nl: Update translation for dgit-user(7). Closes: #1090763. Infrastructure: * Improve handling of stderr output from gpgv. (Improves the output for users of dgit push, and tag2upload emails.) tag2upload: * Builder: Use dgit and gdr from testing. [Sean Whitton] * dgit-repos access control): Expect a separate tag2upload public keyring. * Oracle: Pass -u to dput to suppress a spurious warning in email reports. * Oracle: Speak oracle-to-manager protocol version 4. * Oracle: Report fidelity to Manager (whether we're the production codebase). * Oracle/Builder: Always report source package (using info from Manager). * Oracle: Improved consistency and informativeness of logging. * tests: t2u: Add a test case for a completely unknown signing key. -- Ian Jackson Sat, 29 Mar 2025 18:04:29 +0000 dgit (12.9~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. -- Sean Whitton Mon, 17 Mar 2025 12:53:32 +0800 dgit (12.9) unstable; urgency=medium tag2upload development: * tag2upload-oracled: - Query systemd re whether we are a production or testing instance. - New --force-production option. * tag2upload-oracled systemd unit: - Fix WantedBy= so the user unit starts on reboot. - Add additional Documentation= values. * TAG2UPLOAD-MANAGER-PROTOCOL.md: Define v3, including worker fidelity. [Ian Jackson] Test suite: * Bypass autopkgtest-virt-null workarounds with newer autopkgtest. This should fix our autopkgtest in sid. -- Sean Whitton Fri, 14 Mar 2025 22:32:23 +0800 dgit (12.8~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. -- Sean Whitton Tue, 04 Mar 2025 21:23:53 +0800 dgit (12.8) unstable; urgency=medium Bugfix to dgit: * Fix passing -c options to git. While -c options intended to affect dgit work, it was discovered that -c options for git itself have been broken since dgit 2.0. [Ian Jackson] tag2upload development: * Improvements to generated e-mail messages: - Reorder parts to put the tag last. [Ian Jackson] - Make the log disposition inline. [Ian Jackson] - Add a Reply-To header, use our dgit-owner@ role address in From. This fixes our mail not reaching debian-tag2upload@lists.debian.org. - Make tag2upload-oracled's --noreply option a full From field value. Use this to capitalise "Debian" in "Debian tag2upload service". - Replace long line splitting with encoding in quoted-printable. DSA's MTA is already doing a conversion to quoted-printable so it's cleaner to replace our own long line splitting with this. [Ian Jackson] * tag2upload-oracled: Don't invoke dgit-repos-server more than once in the same working directory, as required by its calling convention. This fixes using more than one worker. * tag2upload-oracled systemd unit: - Work around 'podman exec' failing to set HOME. - Work around 'podman exec --user=...' breaking autopkgtest-virt-podman. Prefix an invocation of su(1) to switch user, instead. - Set IgnoreSIGPIPE=false. * Save a copy of all outgoing mail in case of MTA issues. [Ian Jackson & Sean Whitton] * Have the Oracle use precisely the one available signing key. Pass it as a -k option to 'dgit rpush-source'. Closes: #932553. [Ian Jackson] * Pass --no-tags to 'git fetch'. [Ian Jackson] * tag2upload-builder-rebuild: - Copy in DSA's /etc/ssh/ssh_known_hosts. - Copy in Builder's SSH key for dgit-repos access. - Copy in public part of Oracle's package signing key. - Install dgit and git-debrebase from Debian backports. - Install python3-pygit2. - Add several abstractions to make it easier to customise our images. * tag2upload-oracle-crontab: Add a job to delete old outgoing mail copies. * tag2upload-*-crontab: Add comments about how to make changes effective. Test suite [Ian Jackson]: * t2u-integration: Increase test timeouts. * match-check-template: Fix some more output indentation. * Move t-dgit lib -> lib-core, simplify tstunt/dgit. * Replace generic someuser@somehost with more specific dummy strings. * No longer dump sendmail.last. Miscellaneous [Ian Jackson]: * Consistently use scalars vs arrays for shell-quoted commands and not-yet-shell-quoted argument lists, respectively. This fixes issues running commands in the tag2upload virt. * tag2upload-oracled: Minor improvements to some error handling. -- Sean Whitton Sun, 02 Mar 2025 13:58:10 +0800 dgit (12.7~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. -- Sean Whitton Sat, 01 Mar 2025 09:56:28 +0800 dgit (12.7) unstable; urgency=medium tag2upload development: * Fixes to tag2upload-oracled: - Pass -N to nc.openbsd on the Manager. This is required for the connection to be properly terminated. - Fix protocol violation in the case where '--builder=USER@...'. - Actually validate the protocol messages generated by 'dgit-repos-server --tag2upload5'. * dgit-repos-server, tag2upload support: - Impose a length limit on various values. [Ian Jackson] - Split long lines in the e-mail. [Ian Jackson] * Other improvements to tag2upload-oracled: - Before reporting readiness to the Manager, + establish a connection to the Builder; + test we can really run commands in the isolation environment; and + test we have a usable signing key. - New -D option to set the Debian::Dgit debug level. - New --worker-restart-timeout option. [Ian Jackson] - Drop old SIGALRM handler, no longer used by test suite. - Add [USER@] to --manager and --builder in usage docs. * tag2upload-oracled systemd unit: - Fill in remaining config values for our current hosts. - Instruct autopkgtest-virt-podman not to unshare the netns. - Set a value for TimeoutStopSec equal to the processing timeout. * Provide tag2upload-builder-rebuild script. Previously maintained in dgit-infra-notes-scripts.git. * Provide self-installing crontabs for the Oracle and the Builder. Test suite: * Completely rewrite mocking up tag2upload-service-manager. [Ian Jackson] - tag2upload-oracled now connects to a real socket. - Correctly handle the tag2upload-oracled child process, to fix a race. * Pass new 'run-manager' subcommand to tag2upload-service-manager. [Ian Jackson] * gitlab-ci-run-all: Add a per-test-case timeout. [Ian Jackson] This avoids GitLab timing out the whole job and thus losing logs. * Always pass new -D option to tag2upload-oracled. * Work around autopkgtest-virt-* not exiting (#868576). [Ian Jackson] * autopkgtest-virt-null-for-test: Fix shebang. [Ian Jackson] * Rename template-match-check to match-check-template. [Ian Jackson] * match-check-template: Fix some output indentation. [Ian Jackson] * Print "success." after the log dumps, for reassurance. [Ian Jackson] Documentation: * dgit-maint-debrebase(7), dgit-maint-merge(7): Consistently use lowercase 'debian' for the salsa.d.o namespace. [Dr Tobias Quathamer] * dgit-maint-gbp(7): In one place, list all three push commands instead of just the 'dgit push' alias. [Dr Tobias Quathamer] * dgit-maint-merge(7): Replace a reference to alioth's collab-maint. [Dr Tobias Quathamer] * TAG2UPLOAD-MANAGER-PROTOCOL.md: - Document additional things Oracle should do before saying 'ack'. [Ian Jackson] - Fix a reference to the worker ID. * dgit-user(7): Fix typo comments->commits. Closes: #1098688. [Reported by Ben Harris] Miscellaneous: * Debian::Dgit::ProtoConn: Call printdebug in expect. This ensure we see both halves of the conversation. [Ian Jackson] * get-dm-txt: Take data dir using a positional param, not an env var. * d/control: Drop unnecessary Testsuite field. * Override 'unusual-interpreter /usr/bin/crontab' Lintian warning. * Comment out mismatched file-contains-trailing-whitespace override. -- Sean Whitton Tue, 25 Feb 2025 12:36:05 +0800 dgit (12.6~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. -- Sean Whitton Tue, 04 Feb 2025 16:33:39 +0000 dgit (12.6) unstable; urgency=medium tag2upload development: * Implement & test timing out the work done by dgit-repos-server's tag2upload mode, for robustness. [Ian Jackson] * tag2upload-oracled: New --process-timeout option. [Ian Jackson] * tag2upload-oracled systemd unit: Pass --process-timeout. [Ian Jackson] * tag2upload-oracled systemd unit: Fix line continuation syntax. * tag2upload-oracled: Tidy up logging and then exiting non-zero. Test suite: * Use new template-match-check utility to test the content of the success e-mail from the tag2upload mode of dgit-repos-server. [Ian Jackson] * t2u-email test: Also do the mpack MIME check here. [Ian Jackson] -- Sean Whitton Thu, 30 Jan 2025 09:13:55 +0000 dgit (12.5~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. -- Sean Whitton Tue, 28 Jan 2025 14:48:21 +0000 dgit (12.5) unstable; urgency=medium tag2upload development: * Rewrite the tag2upload mode of the dgit-repos-server program in order to satisfy a number of requirements of the design that the old code did not. [Ian Jackson] In particular, we now send much better e-mails. * Set the Git-Tag-Tagger and Git-Tag-Info fields. Closes: #932753. * Implement & test CCing the tag signing key's owner. - Don't CC them if they're probably also the Git tagger. - More strictly validate tag2upload Git tag taggers. - New 'preferred-mail-domains' dgit-repos-server configuration. * tag2upload-oracled: - Validate & log the protocol messages generated by 'dgit-repos-server --tag2upload5'. - Don't expect "ok" in response to "quit". [Ian Jackson] Instead, waitpid the adt virt server. See #1092808. - Improved debug printing. [Ian Jackson] - New --retain-tmp option. [Ian Jackson] - Pass ssh timeout options to builder SSH, too. * Pass --ssh:-oBatchMode=yes to dgit in dgit-repos-server t2u mode. * Patch autopkgtest-virt-null so as to retain the temp dir. [Ian Jackson] * Set dgit-repos-server $0 to something else in tag2upload mode. [Ian Jackson] Test suite [Ian Jackson]: * Complete the end-to-end t2u-integration test. - Add GitLab CI definition to run it on bookworm as well as sid. * Add a test case for a DM attempting to git-debpush a package they are not authorized to upload. * Fix spuriously removing 'git cat-file tag' trailing newline. * Rewrite t2u-ssh-for-t2u-oracled in Perl. * Provide and use new general facility for polling in tests. * tag2upload-oracled test: Don't kill tag2upload-oracled again. * Output improvements when testing 'mini-git-tag-fsck --audit'. * Introduce T2U dependencies alias. Documentation: * dgit-maint-debrebase(7): Improve sample 'git remote add'. [Andrea Pappacoda] * git-debpush(1): Fix -sn versus -sk. Closes: #1093216. [Reported by Ben Harris] * dgit(1), dgit usage message: List push-built|push-source not push. This is better because plain push issues a warning, at present. Closes: #1092904. [Ian Jackson, report from Niels Thykier] * dgit usage message: Mention rpush-source, and tidy. [Ian Jackson] Miscellaneous: * dgit-repos-server: Improved error handling when invoking gpgv. [Ian Jackson] * Update copyright for dgit, dgit-repos-server & tag2upload-oracled. * Fix documentation of --expect-version option. * mini-git-tag-fsck: Fix bytestring regexp syntax. -- Sean Whitton Fri, 24 Jan 2025 13:55:00 +0000 dgit (12.4) unstable; urgency=medium dgit changes: * New --dsc-control-add and --ch-control-add options. * With --dry-run, dgit now always writes an edited .changes to a temporary file, as it has long done for the edited .dsc. tag2upload development: * tag2upload-oracled: Speak version 2 of the simple Oracle protocol. * dgit-repos-server: Take JOB-ID from tag2upload-oracled. * dgit: In --tag2upload-builder-mode, include a _source.buildinfo. This is work towards #932802. Specifications [Ian Jackson]: * Define version 2 of the Manager-to-Oracle protocol. The protocol now additionally conveys the job ID. Test suite fix: * Set "Rules-Requires-Root: binary-targets" in example_1.0.tar. Closes: #1092190. CI job definitions [Ian Jackson]: * dgit-test-suite, t2u-integration: Use a Debian testing image. This means that the inputs to our CI are gated by our own tests. * t2u-integration: Explicitly install curl. Documentation fix [Xiyue Deng]: * git-debrebase(5): Fix a few typos of repeated words. -- Sean Whitton Wed, 08 Jan 2025 09:11:11 +0000 dgit (12.3) unstable; urgency=medium tag2upload development: * dgit: Make --tag2upload-builder-mode imply --dep14tag-reuse=must. * tag2upload-oracled.user.service: Use @packages.d.o address in From. * Document proposed new calling convention between tag2upload-oracled and 'dgit-repos-server --tag2upload4' [Ian Jackson]. Test suite fix: * tag2upload-oracled-systemd-unit: Restore default test dependencies. This was breaking this test under autopkgtest. -- Sean Whitton Sun, 15 Dec 2024 10:38:57 +0800 dgit (12.2) unstable; urgency=medium * git-debpush options improvements: - Rename patches-applicable check to patches-nonapplicable. - Rename suite check to changed-suite. - Rename existing -n/--no-push to -t/--tag-only. - New -n/--dry-run and --print-tag-text options. Closes: #935085. [Report & suggestions from Ian Jackson] * git-debpush output improvements: - Use uniform line prefix "git-debpush: check failed: ". This should make it easier to see which checks failed. - Disable whitespace warnings from git-apply. Closes: #940590. [Report & suggestion from Andrej Shadura] * Test suite fixes: - Fix overlapping use of file descriptor 5 by the tests. This was breaking all the tag2upload tests under autopkgtest. - t2u-gbp: Replace an unwarranted change of pipefail settings. - t2u-gdr: Fix dependencies and environment variable issue. -- Sean Whitton Fri, 13 Dec 2024 17:06:02 +0800 dgit (12.1) unstable; urgency=high Critical bugfix: * Once again honour command line options --delayed, -c, -m. (-c would sometimes still work, depending on the usage). Regressed in 12.0. Closes:#1089632. [Report from Sean Whitton] New feature for dgit [Xiyue Deng]: * New passthrough option, --allow-unrelated-histories. Documentation: * dgit(1), dgit-user(7): Document dgit's backwards installability. tag2upload development [Sean Whitton]: * Complete mini-git-tag-fsck by implementing its --audit mode. * Complete the integration tests for mini-git-tag-fsck. * Make the Oracle always invoke mini-git-tag-fsck. * Don't call 'git deborig' if we got one from the archive. * Fix hardcoded debian/ tag prefix in git-debpush. * Test git-debpush's fishing the quilt mode out of history. * Some minor code style changes. Internal changes & test suite: * Tidy up some control of split brain mode. * Demonstrate --collab-non-dgit for a native package. * Strip junk from a number of tarballs used to set up tests. * Fix the gdr-convert-gbp canned setup to call t-select-package [Sean Whitton]. -- Ian Jackson Fri, 13 Dec 2024 02:16:53 +0000 dgit (12.0) unstable; urgency=medium Possible incompatible changes: * dgit push-*: Retain existing DEP-14 tag, even if unsigned, by default. New --dep14 options (and config settings) to control the behaviour. DEP-14 tag handling and docs overhauled and debugged. Closes: #1073787. * Command option option handling (--cmd:... etc.): Reimplement, with behavioural change bugfix: now you can always override configured information from the command line. Other misbehaviours and crashes in this area fixed. Documentation: * dgit-user(7): Use `apt-get build-dep .` in build examples. * dgit-sponsorship(7): Mention possible lack of origs. * Update Dutch (.nl) translation. Closes:#1070141 [Frans Spiesschaert] * Fix minor docs typos. [Otto Kekäläinen] Other improvements: * dgit: Include split-maint-view-tag metadata item in dgit view tag. * dgit rpush: Better error handling when child fails. * dgit rpush: debug prints: show the files-end message. Packaging: * debian/control: Bump to debhelper compat level 12. Testing - compatibility and bug fixes: * Replace use of apt-key with trusted.gpg.d. Closes:#1088220. [Report from Julian Andres Klode] * Strip libeatmydata.so out of LD_PRELOAD when using schroot. (Fixes in-tree run failures on trixie.) * CI: Disable new changelog-empty-entry warning. Testing - other improvements: * enumerate-tests: Honour TESTSCRIPTS * Turn off gbp-buildpackage desktop notifications. * CI: Add jobs to test on old releases, back to buster. * CI: Better error reporting; use eatmydata; disable two empty jobs. * Supporting changes and refactoring. tag2upload development: * tag2upload-oracled: New program, still in development. * Add systemd user unit for tag2upload-oracled. * Relax syntax of WORKER-ID in o2m protocol. * Break out ProtoConn module for reuse in o2m. * New test: integration with tag2upload-service-manager. * Run existing tag2upload tests via tag2upload-oracled. * Further development of mini-git-tag-fsck. * Supporting changes to and refactoring of dgit-repos-server. Much of the work described above was done by, or with, or reviewed by, Sean Whitton. Thanks, Sean! -- Ian Jackson Fri, 29 Nov 2024 01:40:28 +0000 dgit (11.11) unstable; urgency=medium [ Ian Jackson ] * dgit-repos-server, tag2upload support: - Introduce t2uv_* prefix to distinguish trusted parts of t2u flow. - New parameter for mail addresses to Cc error messages to. * dgit-repos-server, general: - New always-accept AUTH-SPEC. - Fix & update some debug printing. - Some other refactorings. * Dgit.pm: - git_rev_parse: New \@prefix parameter. * dgit: Fix documentation of the rpush protocol. * TAG2UPLOAD-MANAGER-PROTOCOL.md: New protocol specification. * Test suite: - New .gitlab-ci.yml to enable salsa CI. - Pass --no-same-owner to tar. Fixes running the tests as root. - Move some variables out from tests/drs-git-ext to tests/lib. - tag2upload: Check for drs dgit success (t-tagupl-succeeded). - tests/enumerate-tests: New facility for printing package names. - Various renames to replace 'tagupl' abbreviation with 't2u'. Not yet complete. [ Sean Whitton ] * dgit: - Check that a source-only changes has "Architecture: source". - New --expect-suite, --expect-version options for rpush. The initiator now checks the values of these options, and that of -p/--package, against the parsed changelog, .changes and .dsc sent by the responder. This protects against a misbehaving or compromised responder attempting to use the initiator to sign .changes and .dsc files for some other package, version or target suite. This is relevant for how the security of the tag2upload design relies on the rpush protocol. - New --tag2upload-builder-mode, --tag2upload-upstream and --tag2upload-upstream-commit options. These are used to invoke mini-git-tag-fsck in the right way, and --tag2upload-builder-mode may enable other things in the future. (As of this release, they are not yet passed by dgit-repos-servers.) * git-debpush: Add source= & version= to the in-tag metadata (for real this time) (Closes: #1069001). * dgit-repos-server, tag2upload support: - Obtain the source package and version from the [dgit ...] metadata. (The target suite is still obtained from the first line of the tag message; this will change.) - Replace invoking 'dgit push-source' with 'dgit rpush-source'. This is work towards the new tag2upload three node design. - Pass the new --package, --expect-suite and --expect-version. - Some other tidying up. * TAG2UPLOAD-DESIGN.txt: Document SOURCE_VERSION.git.tar.xz. * mini-git-tag-fsck: New script to handle SOURCE_VERSION.git.tar.xz. Its functionality is only partially implemented as of this release. * Test suite: - Test the new rpush security by mocking up an MITM of the responder (tests/ssh-rpush-mitm). - Very basic test for --tag2upload-builder-mode. - t2u-gbp: Drop an unnecessary, confusing include. * Update copyright notices for Ian and me for core files. * Add .dir-locals.el. * Add some file mode indicators in various places. [ Sean Whitton & Ian Jackson ] * Add TAG2UPLOAD-FAQ.md. With thanks to Russ Allbery for review. -- Sean Whitton Tue, 03 Sep 2024 13:55:01 +0100 dgit (11.10) unstable; urgency=medium * Add TAG2UPLOAD-DESIGN.txt [Ian Jackson]. * git-debpush: Revert changes to in-tag metadata from the last upload. -- Sean Whitton Wed, 22 May 2024 20:42:50 +0100 dgit (11.9) unstable; urgency=medium * tag2upload(5): - The COMMITID must be an abbreviated hash. - Explain why upstream-tag=TAG is required. - Add source= & version= to the in-tag metadata. * git-debpush: - Quote an argument to git-cat-file. - Add source= & version= to the in-tag metadata. * Replace http->https in GPL file headers. -- Sean Whitton Tue, 21 May 2024 14:08:20 +0100 dgit (11.8) unstable; urgency=medium * Fix installation of tag2upload(5). -- Sean Whitton Sun, 14 Apr 2024 20:34:49 +0800 dgit (11.7) unstable; urgency=medium [ Ian Jackson ] * dgit: Introduce --trust-changelog, as the new name for --overwrite, and recommend it everywhere. As requested in #1050713; may help with #913451 #990667 (requests for better docs). * dgit: New --collab-non-dgit option. Closes: #1050713. [Apropos informal reports from several people] * dgit diff generation: Avoid breaking if user has ui.color=always. Closes: #1067222. [Report from Rafael Laboissière] * tag2upload(5): New manpage documenting the tag2upload protocol. Closes: #1068231. [ Sean Whitton ] * Add myself to Uploaders. -- Sean Whitton Sat, 13 Apr 2024 21:14:43 +0800 dgit (11.6) unstable; urgency=medium Improved behaviour: * dgit: Delete the playground on success, by default. [Report from gregor herrmann] Closes: #1056103. Documentation: * dgit(7): Don't falsely assert that *.dgit.d.o is usually `origin`. * dgit-user(7): Deprioritise information about jessie. Tests: * autopkgtests: Install locales-all for i18n-messages test. * Stunt httpd: don't respond to HEAD with 404+body. Closes: #1063341. * autopkgtests: Reduce primary log size when running under autopkgtest: Save the stderr/stdout to a file which appears (compressed) in the artifacts, and is only printed if the test fails. * Add comment about benchmarking of the gzip -1 flag on artifacts. -- Ian Jackson Fri, 09 Feb 2024 12:05:39 +0000 dgit (11.5) unstable; urgency=medium * dgit: Fix harmless but annoying warning about rebinding $date. [Report from Étienne Mollier] Closes: #1055528. -- Ian Jackson Fri, 10 Nov 2023 13:12:42 +0000 dgit (11.4) unstable; urgency=medium dgit dsc import fixes: * Do not fail when source package has broken changelog for -1 upload. Closes: #1054630. See also #1051961. [Report from Peter Green] * Pass through the changelog timezone to the generated commit metadata. Documentation: * dgit-sponsorship(7): Mention git-deborig(1) alongside git-archive(1) [Sean Whitton]. Test suite: * Fix i18n-messages test to explictly demand "locales", and set locale. -- Ian Jackson Mon, 30 Oct 2023 02:21:52 +0000 dgit (11.3) unstable; urgency=medium * Prevent pushing older versions than is in the archive. Closes: #1050711. [Reports from Helmut Grohne and Phil Hands] * Detect tar-ignore in d/s/options and bail early if appropriate. Closes: #1050709. [Report from Helmut Grohne] * dgit(1): --overwrite: Add cross reference to --split-view. Apropos ##1050713. [Report from Helmut Grohne] -- Ian Jackson Sun, 03 Sep 2023 00:43:36 +0100 dgit (11.2) unstable; urgency=high * 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:25:55 +0100 dgit (11.1) unstable; urgency=medium * dgit(1): Adjust tbl formatting to avoid warning. [Report and suggestions from Branden Robinson] Closes: #1041317. -- Ian Jackson Thu, 20 Jul 2023 00:32:36 +0100 dgit (11.0) unstable; urgency=medium Bugfix with compatibility implications: * Pass --no-source-only-changes to sbuild (when building binaries). Fixes operation with SOURCE_ONLY_CHANGES locally overridden. (Incompatible with sbuild <0.78; to work around, say dgit --sbuild!:--no-source-only-changes.). [Report from Sean Whitton] Closes: #904969. Documentation: * dgit-maint-{merge,rebase}(7): Cross-reference to gitrevisions(7). [Sean Whitton, Ian Jackson] Closes: #959760. Removal: * Abolish dgit-badcommit-fixup (the remedial script for #849041). If ancient repositories are found which need fixing, install dgit.deb 10.7 or earlier (eg from Debian bookworm and earlier). Testing; * Tests: work around git changes in 2.40 relating to commit verification. Skipping tests involving now-uncreatable objects. Closes: #1033503. -- Ian Jackson Thu, 15 Jun 2023 00:53:22 +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/control0000664000000000000000000000541715016262471011570 0ustar Source: dgit Section: devel Priority: optional Maintainer: Debian tag2upload Delegates Uploaders: Ian Jackson , Sean Whitton Standards-Version: 4.4.0.0 Build-Depends: debhelper-compat (= 12), gettext, po4a, tcl 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, python3 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, liburi-perl, liblocale-gettext-perl Recommends: dgit (>= 11.7~) Architecture: all Description: dgit server backend infrastructure This package contains tools which are useful for setting up a dgit git depository. You probably want dgit, the client package, instead of dgit-infrastructure. work/debian/copyright0000664000000000000000000001041515016262471012112 0ustar dgit Integration between git and Debian-style archives Copyright (C)2013-2025 Ian Jackson Copyright (C)2016-2020,2023-2025 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 upstream under the same terms; please sign off your patches (by writing an appropriate 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-infrastructure.lintian-overrides0000664000000000000000000000020715016262471017542 0ustar # These are self-installing crontabs. unusual-interpreter /usr/bin/crontab [usr/share/dgit-infrastructure/debian/tag2upload-*-crontab] work/debian/dgit-infrastructure.tag2upload-oracled.user.service0000664000000000000000000000654315016262471022202 0ustar [Unit] Description=tag2upload Oracle daemon Documentation=https://salsa.debian.org/dgit-team/dgit/-/blob/master/TAG2UPLOAD-DESIGN.txt Documentation=https://salsa.debian.org/dgit-team/dgit-infra-notes-scripts/-/blob/main/README.t2u-oracle.update Documentation=https://salsa.debian.org/dgit-team/tag2upload-service-manager/-/blob/main/INSTALL.md Documentation=https://salsa.debian.org/dgit-team/dgit-infra-notes-scripts/-/blob/main/README.t2u-builder.update [Service] # Re --workers=1: This is because tag2upload-builder-01 has just # one core, at present. # # Re --reply-to: We want to catch miscellaneous queries and # problem reports. Currently we think that using # this @packages.d.o address will be an effective # way to do this. Also cf. #1089757. # # Re --noreply: Use role address here because lists.d.o rejects # mail From @packages.d.o. # # Re --force-production: This option should NEVER APPEAR in the version # of this file committed to src:dgit's repository. # # It may be added only to an uncommitted copy of # this file made on tag2upload-oracle-01 in # ~tag2upload-oracle/.config/systemd/user/. ExecStart=/usr/bin/tag2upload-oracled \ --processing-timeout=2000 \ --workers=1 \ --autopkgtest-virt=autopkgtest-virt-podman \ --autopkgtest-arg=localhost/autopkgtest/debian:bookworm \ --autopkgtest-arg=-- \ --autopkgtest-arg=--network=host \ --manager=tag2upload-manager@tag2upload-manager-01.debian.org \ --manager-socket=/srv/manager.tag2upload.debian.org/run/o2m.s \ --builder=tag2upload-builder@tag2upload-builder-01.debian.org \ --noreply="Debian tag2upload service " \ --reply-to=git-debpush@packages.debian.org \ --copies=debian-tag2upload@lists.debian.org \ debian \ /srv/oracle.tag2upload.debian.org/distro=debian \ "/srv/keyring.debian.org/keyrings/debian-keyring.gpg,a:/srv/keyring.debian.org/keyrings/debian-maintainers.gpg,m/srv/oracle.tag2upload.debian.org/data/dm.txt:/srv/keyring.debian.org/keyrings/debian-nonupload.gpg,m/srv/oracle.tag2upload.debian.org/data/dm.txt" IgnoreSIGPIPE=false # Let workers finish up any builds they might be doing. # tag2upload-oracled is designed such that upon receipt of SIGTERM, # the workers will finish their builds but not take on any new jobs. TimeoutStopSec=2000 StandardInput=null StandardOutput=journal StandardError=journal # This deals with two things: # # (1) 'podman exec' on (at least) bookworm fails to set HOME. # Git in the container immediately errors out in that case. # su starting a login shell handles that. # # (2) Appending --autopkgtest-arg=--user=builder:builder above means # that after sending 'open', autopkgtest-virt-podman dies, because # it gets EPERM when it tries to create the temporary directory. # # What's encoded here is |su - builder -- -ec 'exec "$@";x' --|. # If we need more, consider # echo '-e$ENV{HOME}//="/nonexistent";...;exec @ARGV' \ # | perl -MURI::Escape \ # -wlne'$_ = uri_escape $_; s#%2F#/#g; s#%#%%#g; print ",perl,$_"' Environment=DGIT_DRS_T2U_VIRT_EXEC_CMD_SUFFIX=,su,-,builder,--,-ec,exec%%20%%22%%24%%40%%22%%3Bx,-- [Install] WantedBy=default.target work/debian/dgit.install0000664000000000000000000000022415016262471012473 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-overrides0000664000000000000000000000014215016262471014462 0ustar manpage-has-errors-from-man usr/share/man/man1/dgit.1.gz file '', around line 51: work/debian/git-debpush.install0000664000000000000000000000005215016262471013756 0ustar git-playtree-setup /usr/share/git-debpush work/debian/git-debrebase.install0000664000000000000000000000024415016262471014243 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/rules0000775000000000000000000000627215016262471011245 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_installsystemduser: dh_installsystemduser --name=tag2upload-oracled --no-enable 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/0000775000000000000000000000000015016262471011456 5ustar work/debian/source/lintian-overrides0000664000000000000000000000022615016262471015037 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/0000775000000000000000000000000015016262471011320 5ustar work/debian/tests/control0000664000000000000000000002127315016262471012730 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: cmd-override 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: gdr-newupstream gdr-viagit Tests-Directory: tests/tests Depends: chiark-utils-bin, faketime, 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: i18n-messages Tests-Directory: tests/tests Depends: chiark-utils-bin, faketime, git-debrebase, git-buildpackage, locales-all 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: mini-git-tag-fsck-utils Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, python3 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: t2u Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush, autopkgtest, python3-pygit2, netcat-openbsd, libdpkg-perl, libgit-wrapper-perl, liblist-compare-perl, libstring-shellquote-perl, libtry-tiny-perl, mpack Tests: t2u-baredebian Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush, autopkgtest, python3-pygit2, netcat-openbsd, quilt, git-debrebase, git-buildpackage, libdpkg-perl, libgit-wrapper-perl, liblist-compare-perl, libstring-shellquote-perl, libtry-tiny-perl Tests: t2u-email Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush, autopkgtest, python3-pygit2, netcat-openbsd, mpack Tests: t2u-gbp Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush, autopkgtest, python3-pygit2, netcat-openbsd, libdpkg-perl, libgit-wrapper-perl, liblist-compare-perl, libstring-shellquote-perl, libtry-tiny-perl Tests: t2u-gdr Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush, autopkgtest, python3-pygit2, netcat-openbsd, libdpkg-perl, libgit-wrapper-perl, liblist-compare-perl, libstring-shellquote-perl, libtry-tiny-perl, git-debrebase, git-buildpackage Tests: t2u-integration Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush, autopkgtest, python3-pygit2, netcat-openbsd, jq Restrictions: x-tag2upload-service-manager Tests: t2u-native Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, git-debpush, autopkgtest, python3-pygit2, netcat-openbsd Tests: tag2upload-oracled Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, autopkgtest, netcat-openbsd Tests: tag2upload-oracled-systemd-unit Tests-Directory: tests/tests Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, systemd 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 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-r1clog 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-delayed push-extra-fields push-newpackage push-newrepeat push-nextdgit push-source push-source-with-changes quilt quilt-colour 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.in0000664000000000000000000000004715016262471013331 0ustar Tests-Directory: tests/tests Depends: work/dgit0000775000000000000000000101533415016262471007620 0ustar #!/usr/bin/perl -w # dgit # Integration between git and Debian-style archives # # Copyright (C)2013-2024 Ian Jackson # Copyright (C)2017-2019,2023-2025 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 5.024; 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 qw(mkpath); 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; use Debian::Dgit::ProtoConn; our $our_version = 'UNRELEASED'; ###substituted### our $absurdity = undef; ###substituted### $SIG{INT} = 'DEFAULT'; # work around #932841 our @rpushprotovsn_support = qw(7 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 $expected_suite; our $expected_version; our @ropts; our $allow_unrelated_histories = 0; our $sign = 1; our $dryrun_level = 0; our $changesfile; our $buildproductsdir; our $bpd_glob; our $new_package = 0; our $includedirty = 0; our $t2u_bmode = 0; our $t2u_upstream; our $t2u_upstreamc; our $rmonerror = 1; our @deliberatelies; our %previously; our $existing_package = 'dpkg'; our $cleanmode; our $changes_since_version; our $rmchanges; our $keep_playground; 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 $dep14tag_reuse; our $dep14tag_reuse_re = qr{replace|replace-unsuitable|if-exists|must}; our $dep14tag_verify; 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 --no-source-only-changes)); 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 (@dpkggenbuildinfo) = qw(dpkg-genbuildinfo); our (@dpkgquery) = qw(dpkg-query); 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 (@mgtf) = qw(mini-git-tag-fsck); # Commands that we run and that the user can override with --PROGRAM=... # We also honour access-cfg settings. # If not in `%opts_opt_cmdonly`, also support --PROGRAM:... & --PROGRAM... # If ->[0] is the empty string, we don't support overriding the command. 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, 'dpkg-genbuildinfo' => \@dpkggenbuildinfo, 'dpkg-query' => \@dpkgquery, 'gbp-build' => \@gbp_build, 'gbp-pq' => \@gbp_pq, 'ch' => \@changesopts, 'mergechanges' => \@mergechanges, 'pbuilder' => \@pbuilder, 'cowbuilder' => \@cowbuilder, 'mini-git-tag-fsck' => \@mgtf); our %opts_opt_cmdonly = ('gpg' => 1, 'git' => 1); our %opts_opt_orig = map { $_, [ @{ $opts_opt_map{$_} } ] } keys %opts_opt_map; our @cmd_opts_opts; sub parseopts_late_defaults(); sub quiltify_trees_differ ($$;$$$); sub setup_gitattrs(;$); sub check_gitattrs($$); our $playground; our $keyid; autoflush STDOUT 1; our $rpush_conn; our $rparent_conn; our $supplementary_message = ''; our $made_splitbrain_playtree = 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; our %control_add; our %i_param; 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 just for deciding whether to run gdr make-patches # Before reusing this algorithm for something 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: # # (We see this from the POV of the responder, which mostly drives # the protocol. So `>` is "from responder to initiator".) # # $ 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 # # > previously REFNAME=OBJNAME # if --deliberately-not-fast-forward # # goes into tag, for replay prevention # # > param dep14tag 0|1 # responder needs initiator to make a DEP-14 tag ? # # if unsent, use `1`. # # (older responders don't ever send it) # # must be honoured in $protovsn >= 7; # # otherwise, uses dep14tag cfg and param splitbrain # # > want signed-tag # [indicates that signed tag is wanted] # # < data-block NBYTES # < [NBYTES bytes of dgit view tag data (no newline)] # [maybe some more blocks] # < data-end # # < data-block NBYTES # if we're making # < [NBYTES bytes of DEP-14 tag data (no newline)] # a new DEP-14 tag # [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; our @i_child_cmd; sub i_child_report ($) { my ($wflags) = @_; # 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, $wflags; return undef if $got <= 0; die unless $got == $i_child_pid; $i_child_pid = undef; return undef unless $?; failedcmd @i_child_cmd; return f_ "build host child %s", waitstatusmsg(); } #---------- remote protocol support, responder ---------- sub responder_send_command ($) { my ($command) = @_; return unless $we_are_responder; # called even without $we_are_responder $rparent_conn->send($command); } sub responder_send_file ($$) { my ($keyword, $ourfn) = @_; return unless $we_are_responder; printdebug "]] $keyword $ourfn\n"; responder_send_command "file $keyword"; $rparent_conn->send_file($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) { $rparent_conn->receive_file($fn); } printdebug "[[\$\n"; $rparent_conn->expect(sub { m/^files-end$/ }); } #---------- remote protocol support, initiator ---------- sub initiator_expect (&) { my ($match) = @_; $rpush_conn->expect($match); } #---------- end remote code ---------- sub progress { if ($we_are_responder) { my $m = join '', @_; $rparent_conn->send_counted_message("progress", $m); } 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', # When changing to "source", probably after trixie, update: # - usage summary in the usage message # - usage summary in dgit(1) # + (I.e., restore plain 'push' to the summaries. # We removed it to avoid having anything in the usage # summary which would generate warnings.) # - principal documentation in dgit(1) # - maybe change push-source to push in workflow(7) (grep) 'dgit.default.push-subcmd' => 'warn,built', '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 algorithm 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 { $rparent_conn->send_counted_message("supplementary-message", $msg); } } 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 implicit 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 git_diff_programmatic (@) { # Ideally we would unset various git.diff config options here, # but there doesn't seem to be a way to *unset* # something on the command line (@git, qw(-c color.ui=never diff --no-ext-diff), @_) } 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 $_); rmdir_r $_; } } $!=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 = get_source_format(); if (madformat($format)) { rmdir_r '.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. # (An exception to this is when --tag2upload-builder-mode.) sub test_source_only_changes ($) { my ($changes) = @_; my $arch = getfield $changes, 'Architecture'; unless ($arch eq 'source') { print STDERR f_ "purportedly source-only changes has Architecture: %s\n", $arch; return 0; } 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 = getfield($clogp,'Date'); # try to pass through the changelog entry's timezone offset my $tz = $date =~ m{ ([-+]\d{4})$} ? $1 : " +0000"; $date = cmdoutput qw(date), '+%s', qw(-d), $date; my $authline = "$author $date $tz"; $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_r1authline ($$) { my ($clogp_r, $upstreamv) = @_; my $r1clogp; my @clogcmd = qw(dpkg-parsechangelog --format rfc822 --all); printdebug "import clog search...\n"; parsechangelog_loop \@clogcmd, (__ "package changelog"), sub { my ($thisstanza, $desc) = @_; no warnings qw(exiting); $$clogp_r //= $thisstanza; printdebug "import clog $thisstanza->{version} $desc...\n"; # 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"; }; $r1clogp //= $$clogp_r; # maybe there's only one entry; return clogp_authline $r1clogp; } 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; } rmdir_r "_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 ".."; rmdir_r "_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 $clogp; my $r1authline; if ($any_orig) { if (!eval { local $failmsg_prefix = ' '; $r1authline = import_r1authline(\$clogp, $upstreamv); $clogp or fail __ "package changelog has no entries!"; 1; }) { chomp $@; print STDERR f_ <{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; rmdir_r '.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 push @options, $_; } 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 wantarray ? ($_, \@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; } our %expected = ( Source => \$package, Distribution => \$expected_suite, Version => \$expected_version ); sub check_expected { my ($c, $desc) = @_; for (sort keys %expected) { my $v = getfield($c, $_); # assert field indeed present not defined ${$expected{$_}} or $v eq ${$expected{$_}} or fail f_ "%s field \`%s' is not expected \`%s'", $desc, $_, ${$expected{$_}} } } sub push_parse_changelog ($) { my ($clogpfn) = @_; my $clogp = Dpkg::Control::Hash->new(); $clogp->load($clogpfn) or die; check_expected($clogp, "changelog"); $package //= getfield $clogp, 'Source'; 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 dep14tag_reuse_tag_adjust_tagwants ($$) { # Adjusts the $tagwant->[] with {Dep14}, as necessary my ($cversion, $tagwants) = @_; my @adjust = grep { $_->{Dep14} } @$tagwants; return unless @adjust; confess unless @adjust == 1; my ($tw) = @adjust; printdebug "considering DEP-14 tag $tw->{Tag} reuse (--dep14tag-reuse=$dep14tag_reuse)\n"; if ($we_are_initiator) { $tw->{ReuseExisting} = !($i_param{'dep14tag'} // 1); printdebug sprintf "DEP-14: we are initiator, param %s, reuse %s\n", ($i_param{'dep14tag'} // ''), ($tw->{ReuseExisting} // ''); return; } # modes: must, if-exists, replace-unsuitable, replace # tag: might exist if ($dep14tag_reuse eq 'replace') { printdebug "existing DEP-14 tag: not examining\n"; return; } # modes: must, if-exists, replace-unsuitable # tag: might exist my $existing_objid = git_get_ref "refs/tags/$tw->{Tag}"; if (!$existing_objid) { printdebug "existing DEP-14 tag: nonexistent\n"; if (grep { $dep14tag_reuse eq $_ } qw(if-exists replace-unsuitable)) { return; } else { # `must`, since `replace` dealt with above fail f_ "DEP-14 tag %s does not exist (--dep14tag-reuse=%s)", $tw->{Tag}, $dep14tag_reuse; } } # modes: must, if-exists, replace-unsuitable # tag: does exist, may be unsuitable my $existing_unsuitable = dep14tag_reuse_unsuitable($tw, $existing_objid); if (defined $existing_unsuitable) { printdebug "existing DEP-14 tag: unsuitable\n"; # modes: must, if-exists, replace-unsuitable # tag: does exist, but is unsuitable if ($dep14tag_reuse eq 'replace-unsuitable') { print STDERR f_ "%s: making fresh DEP-14 tag %s (--dep14tag-reuse=%s), since existing tag unsuitable: %s", $us, $tw->{Tag}, $dep14tag_reuse, $existing_unsuitable; return; } else { # modes: must, if-exists # tag: does exist, but is unsuitable # If -fforce-reusing-version we ignore `reuse=if-exists`, # and remake the tag in that case, treating it as `if-unsuitable`. forceable_fail [qw(reusing-version)], f_ "existing DEP-14 tag %s is unsuitable (--dep14tag-reuse=%s): %s", $tw->{Tag}, $dep14tag_reuse, $existing_unsuitable; } } printdebug "existing DEP-14 tag: suitable\n"; # modes: must, if-exists, replace-unsuitable # tag: does exist, is suitable # reuse the tag $tw->{ReuseExisting} = 1; responder_send_command("param dep14tag 0"); } sub dep14tag_reuse_unsuitable ($$) { # Returns undef if the existing tag is OK. my ($tw, $existing_objid) = @_; my $existing_commitid = git_rev_parse $existing_objid; # Not `eval`, so we only tolerate precisely the errors we expect. if ($existing_commitid ne $tw->{Objid}) { return f_ "refers to commit %s, not %s", $existing_commitid, $tw->{Objid}; } if ($dep14tag_verify) { my @cmd = (@git, qw(verify-tag), $tw->{Tag}); debugcmd '+', @cmd; $!=0; $?=-1; if (system @cmd) { failedcmd_report_cmd 'existing DEP-14 tag verification used', @_; return f_ "verification failed: git verify-tag: %s", failedcmd_waitstatus(); } } return undef; } sub push_tagwants ($$$$) { my ($cversion, $dgithead, $maintviewhead, $tfbase) = @_; my @tagwants; push @tagwants, { TagFn => \&debiantag_new, Objid => $dgithead, TfSuffix => '', View => 'dgit', }; my $maintview_tag; if (defined $maintviewhead) { push @tagwants, { TagFn => \&debiantag_maintview, Objid => $maintviewhead, TfSuffix => '-maintview', View => 'maint', Dep14 => 1, }; } elsif ($dodep14tag ne 'no') { push @tagwants, { TagFn => \&debiantag_maintview, Objid => $dgithead, TfSuffix => '-dgit', View => 'dgit', Dep14 => 1, }; }; foreach my $tw (@tagwants) { $tw->{Tag} = $tw->{TagFn}($cversion, access_nomdistro); $tw->{Tfn} = sub { $tfbase.$tw->{TfSuffix}.$_[0]; }; } dep14tag_reuse_tag_adjust_tagwants($cversion, \@tagwants); printdebug 'push_tagwants: ', Dumper(\@_, \@tagwants); return @tagwants; } sub push_mktags ($$ $$ $) { my ($clogp,$dscfn, $changesfile,$changesfilewhat, $tagwants) = @_; my $add_fields = sub { my ($file, $desc) = @_; foreach my $field (sort keys $control_add{$desc}->%*) { fail f_ "%s already contains field %s", $desc, $field if exists $file->{$field}; $file->{$field} = $control_add{$desc}{$field}; } }; 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; $add_fields->($dsc, "dsc"); $dsc->save("$dscfn.tmp") or confess "$!"; # Do this unconditionally, even if there are no entries in # $control_add{changes}, so that elsewhere we can assume there is # always a .tmp file for the .changes, too, which is simpler. my $changes = parsecontrol($changesfile,$changesfilewhat); $add_fields->($changes, "changes"); $changes->save("$changesfile.tmp") or confess $!; # Calling check_expected is redundant with the proceeding check # against the values from the changelog because we can't reach # this point if the changelog values aren't what we expected. # But it is good to check the changes values are as expected # independently of the changelog checks, and this makes for more # useful error messages. check_expected($changes, "changes"); foreach my $field (sort keys %expected) { $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 $note_split_maint_view_tag = ''; 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'); } } if ($tw->{View} eq 'maint') { # We might be reusing a tag. Bind the tag we think is OK # into *our* archive/ tag, so that it can be found later, # even in the presence of multiple DEP-14 tags floating about. my $o = cmdoutput @git, qw(hash-object -t tag), $tagobjfn; $note_split_maint_view_tag = <($_); } reverse @$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 overriding 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_splitbrain_playtree = 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 --trust-changelog, or --overwrite=VERSION.\n". "To rewrite history, if permitted by the archive,". " use --deliberately-not-fast-forward."; } } confess unless !!$made_splitbrain_playtree == 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_splitbrain_playtree ? $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 .changes 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_all = push_tagwants($cversion, $dgithead, $maintviewhead, dgit_privdir()."/tag"); my @tagwants_make = grep { !$_->{ReuseExisting} } @tagwants_all; 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 = (); my @tagobjfns_discard; foreach my $tw (@tagwants_all) { if (!$tw->{ReuseExisting}) { push @tagobjfns, $tw->{Tfn}('.signed-tmp'); } elsif ($protovsn >= 7) { # we sent param dep14tag 0, and initiator understands it } else { # Initiator is going to send us a tag we don't want this is # kind of gross - making a semantically weird signed tag # and then discarding it. But it's better than the # alternatives. push @tagobjfns_discard, $tw->{Fn}('.discard-remade-tag'); } } responder_receive_files('signed-tag', @tagobjfns, @tagobjfns_discard); } else { @tagobjfns = push_mktags($clogp,$dscpath, $changesfile,$changesfile, \@tagwants_make); } 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_make, @tagobjfns; foreach my $tw (@tagwants_make) { 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; # ^ for a tag we're reusing, we verified it (if we needed to) # earlier, via dep14tag_reuse_tag_adjust_tagwants 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_all) { 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 "$_.tmp", $_ or die "$_ $!" for $dscpath, $changesfile; } else { progress f_ "[new .dsc & .changes left in %s.tmp, %s.tmp]", $dscpath, $changesfile; } 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; $rparent_conn = Debian::Dgit::ProtoConn->new(\*PI, \*PO); $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(WNOHANG); 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 { rmdir_r $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; @i_child_cmd = @cmd; $we_are_initiator=1; if (defined $initiator_tempdir) { rmdir_r $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); $rpush_conn = Debian::Dgit::ProtoConn->new(\*RO, \*RI); $rpush_conn->set_eof_hook(sub { # The child has probably exited. Ideally we would wait with WNOHANG, # but Linux has an annoying race: if you have a pipe on a child, # which dies, you can read EOF on the pipe, but get nothing from # wait WNOHANG. So we must call waitpid *without* WNOHANG. # We send SIGTERM in case some even more bizarre thing is wrong. kill 15, $i_child_pid; i_child_report(0); }); 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 = $rpush_conn->read_bytes($rhs); progress $msg; } sub i_resp_supplementary_message ($) { my ($rhs) = @_; $supplementary_message = $rpush_conn->read_bytes($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 $rpush_conn->bad(f_ "file %s (%s) twice", $keyword, $localpath); $rpush_conn->receive_file($localpath); i_method "i_file", $keyword; } sub i_resp_param ($) { $_[0] =~ m/^(\S+) (.*)$/ or $rpush_conn->bad(__ "bad param spec"); $i_param{$1} = $2; } sub i_resp_previously ($) { $_[0] =~ m#^(refs/tags/\S+)=(\w+)$# or $rpush_conn->bad(__ "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 $rpush_conn->bad( "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 $rpush_conn->bad( "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) { $rpush_conn->send_file($localpath); } $rpush_conn->send("files-end"); } 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 $rpush_conn->bad("dsc (before parsed-changelog)"); return $i_dscfn; } sub i_file_dsc { } sub i_localname_buildinfo ($) { my $bi = $i_param{'buildinfo-filename'}; defined $bi or $rpush_conn->bad("buildinfo before filename"); defined $i_changesfn or $rpush_conn->bad("buildinfo before changes"); $bi =~ m{^\Q$package\E_[!-.0-~]*\.buildinfo$}s or $rpush_conn->bad("improper buildinfo filename"); return $&; } sub i_file_buildinfo { $rpush_verb eq 'push' or $t2u_bmode or $rpush_conn->bad("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); !$t2u_bmode or (getfield $bd, 'Architecture') eq "source" or fail __ "buildinfo mismatch in field Architecture"; !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 $rpush_conn->bad("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'; # TODO Here we check that *our* rpush verb is push-source. # We should confirm that the responder will always agree with us, # no matter its local configuration. This is relevant because we # have this thing to allow users to configure the default rpush # verb, and at the same time we are in the process of changing the # meaning of plain 'push' to mean 'push-source'. 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 $rpush_conn->bad("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 $rpush_conn->bad("tag format mismatch: $p vs. new"); } die unless $i_param{'csuite'} =~ m/^$suite_re$/; $csuite = $&; defined $dsc or $rpush_conn->bad("dsc (before parsed-changelog)"); my @tagwants = push_tagwants $i_version, $head, $maintview, "tag"; @tagwants = grep { !$_->{ReuseExisting} } @tagwants; return push_mktags $i_clogp, $i_dscfn, $i_changesfn, (__ 'remote changes file'), \@tagwants; } sub i_want_signed_dsc_changes { rename "$_.tmp", $_ or die "$_ $!" for $i_dscfn, $i_changesfn; 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 appended # 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_diff_programmatic $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_splitbrain_playtree; $made_splitbrain_playtree = 1; } chdir '..'; if (grep m{^single-debian-patch$}, @$fopts) { 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 contains a calls to realpath, and does its own # error handling, so do idempotency with an explicit stat. stat_exists $leaf or link_ltarget $f, $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/control debian/changelog); foreach my $maybe (qw(debian/patches debian/rules 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(); rmdir_r '.pc'; rmdir_r '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_splitbrain_playtree = 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, $!; } my ($dtag, $dtag_t); if ($t2u_bmode) { # See if it's at all likely we'll find our debian/ tag. do_split_brain() or fail __ "--tag2upload-builder-mode needs split-brain mode"; $dtag = debiantag_maintview $version, access_nomdistro; $dtag_t = git_get_ref "refs/tags/$dtag"; fail __ "upstream tag and not commit, or vice-versa" unless defined $t2u_upstream == defined $t2u_upstreamc; } my @cmd = (@dpkgsource, qw(-b --include-removal)); my $leafdir; my $binfofn = srcfn($version, "_source.buildinfo"); 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_splitbrain_playtree; changedir $playground; unless ($made_splitbrain_playtree) { 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); if ($t2u_bmode) { # We need to copy the maintainer & upstream tags into the # playtree for mini-git-tag-fsck's consumption. changedir $leafdir; runcmd @git, qw(update-ref), "refs/tags/$dtag", $dtag_t; runcmd @git, qw(update-ref), "refs/tags/$t2u_upstream", $t2u_upstreamc if $t2u_upstream; changedir '..'; } 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; } $dsc = parsecontrol($dscfn, "source package"); # We use dpkg-genchanges to generate the .changes. We want to # pass -S. However, that in that case, if there is a .git.tar.xz # in debian/files, dpkg-genchanges will ignore it. # # What we do is not pass -S in the case that we are adding a # .git.tar.xz. This is safe because: we only need to add a # .git.tar.xz when in split brain mode because tag2upload is # always in that mode; if we are in split brain mode then we # always build in a playtree (see building_source_in_playtree()); # and if we are indeed building in a playtree, then we will # certainly get a source-only changes, even if we don't pass -S. changedir $leafdir; my @gencmd = (qw(sh -ec), 'exec >../$1; shift; exec "$@"','x', $sourcechanges, @dpkggenchanges, changesopts()); if ($t2u_bmode) { building_source_in_playtree() or fail __ "--include-dirty not supported with --tag2upload-builder-mode"; runcmd @dpkggenbuildinfo, qw(--build=source); # The aim of including a _source.buildinfo in tag2upload # uploads is to make it possible for a third party to # reproduce the .dsc (see #932802). The most important # information for this not already likely to be have been # included in the _source.buildinfo is the versions of dgit # and dgit-infrastructure that were installed. As the # tag2upload builder is already a system with only a minimal # set of packages installed, we just include everything. my $binfo = parsecontrol("../$binfofn", __ "source-only buildinfo"); chomp(my @all = split "\n", cmdoutput @dpkgquery, qw(-W), '--showformat=${Package} (= ${Version})\n'); $binfo->{"Installed-Build-Depends"} = "\n".join ",\n", @all; $binfo->save("../$binfofn") or confess "$!"; my @cmd = (@mgtf, qw(--prepare --distro), access_nomdistro); push @cmd, "--upstream=$t2u_upstream", "--upstream-commit=$t2u_upstreamc" if $t2u_upstream; runcmd @cmd; runcmd @gencmd; } else { push @gencmd, qw(-S); if (building_source_in_playtree()) { runcmd @gencmd; } else { runcmd_ordryrun_local @gencmd; } } changedir '..'; printdebug "moving $dscfn, $sourcechanges, etc. to ".bpd_abs()."\n"; 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); if ($t2u_bmode) { $mv->('buildinfo', $binfofn); $mv->('mgtf', srcfn($version,".git.tar.xz")); } $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) { fail __ "--tag2upload-builder-mode not supported with -C" if $t2u_bmode; 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 absolute 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 assignment 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 '--expect-suite','', $suite_re, \$expected_suite; defvalopt '--expect-version','', '.+', \$expected_version; defvalopt '--quilt', '', $quilt_modes_re, \$quilt_mode; defvalopt '--tag2upload-upstream','','.+', \$t2u_upstream; defvalopt '--tag2upload-upstream-commit','','.+',\$t2u_upstreamc; 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." }; # We leave validating the field names to Dpkg::Control::Hash. foreach my $outfile ([qw(dsc dsc)], [qw(ch changes)]) { defvalopt "--@$outfile[0]-control-add", '', '([^=]+)=(.+)', sub { $control_add{@$outfile[1]}{$1} = $2 }; } 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; 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; }; # Empty out each of the builtin commands-we-call. # This lets us capture ad-hoc settings of eg @dgit # in the option parser, and turn them into entries # in @cmd_opts_opts. See parseopts_cmd_opts_resolve. @$_ = () foreach values %opts_opt_map; # Doing it like this means we can simply append to @somecmd here # in the option parser, without further fuss. (Adjustments other # than appending won't work at all.) 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 && $opts_opt_map{$1}) { push @ropts, $_; push @cmd_opts_opts, $_; } 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/^--collab-non-dgit$/s) { push @ropts, $_; $overwrite_version = ''; $splitview_mode = 'always'; } elsif (m/^(?:--trust-changelog|--overwrite)$/s) { push @ropts, '--overwrite'; # TODO, eventually, change this $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/^--dep14tag-reuse=($dep14tag_reuse_re)$/s) { push @ropts, $_; $dep14tag_reuse = $1; } elsif (m/^--(no-)?dep14tag-verify$/s) { push @ropts, $_; $dep14tag_verify = !$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-)?keep-playground$/s) { push @ropts, $_; $keep_playground = !$1; } 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 (/^--tag2upload-builder-mode$/) { push @ropts, $_; $t2u_bmode = 1; } elsif (/^--allow-unrelated-histories$/) { push @ropts, $_; $allow_unrelated_histories = 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', "$1=$2"; push @ropts, $&; $gitcfgs{cmdline}{$1} = [ $2 ]; } elsif (s/^-c([^=]+)$//s) { push @git, '-c', $1; push @ropts, $&; $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'", $_; } } } } foreach my $cmd (keys %opts_opt_map) { foreach my $added (@{ $opts_opt_map{$cmd} }) { push @cmd_opts_opts, "--${cmd}&${added}"; } } parseopts_cmd_opts_resolve(sub {}); } 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_ <($k, $om) should update @$om for command $k # (or be a no-op if we're not looking at access_cfg yet). my ($from_config) = @_; foreach my $k (keys %opts_opt_map) { my @om = @{ $opts_opt_orig{$k} }; printcmd \*DEBUG, "COO RESET", $k, @om if $debuglevel >= 4; $from_config->($k, \@om); @{ $opts_opt_map{$k} } = @om; } if (defined $ENV{'DGIT_SSH'}) { @ssh = string_to_ssh $ENV{'DGIT_SSH'}; printcmd \*DEBUG, "COO DGIT_SSH", @ssh if $debuglevel >= 3; } elsif (defined $ENV{'GIT_SSH'}) { @ssh = ($ENV{'GIT_SSH'}); printcmd \*DEBUG, "COO GIT_SSH", @ssh if $debuglevel >= 3; } foreach (@cmd_opts_opts) { m/=|:|!:|\&/ or confess; my ($k, $mode, $v) = ($`, $&, $'); $k =~ s/^\-\-// // confess "$k ?"; my $om = $opts_opt_map{$k} // confess "$k ?"; printcmd \*DEBUG, "COO OPT BEFORE", $k, @$om if $debuglevel >= 3; if ($mode eq '=') { length $om->[0] or badusage f_ "unsupported option \`%s', cannot set command for %s (can only provide options)", $_, $k; $om->[0] = $v; } elsif ($mode eq ':') { !$opts_opt_cmdonly{$k} or badusage f_ "unsupported option \`%s', cannot provide additional options for %s (can only provide replacement command)", $_, $k; push @$om, $v; } elsif ($mode eq '&') { # internal, set only at the end of parseopts push @$om, $v; } elsif ($mode eq '!:') { !$opts_opt_cmdonly{$k} or badusage f_ "unsupported option \`%s', cannot adjust options for %s (can only provide replacement command)", $_, $k; my $cmd = shift @$om; @$om = ($cmd, grep { $_ ne $v } @$om); } else { confess "$mode ?"; } printcmd \*DEBUG, "COO OPT AFTER", $k, @$om if $debuglevel >= 3; } if ($debuglevel >= 4) { foreach my $k (keys %opts_opt_map) { printcmd \*DEBUG, "COO FINAL", $k, @{ $opts_opt_map{$k} }; } } } sub parseopts_late_defaults () { printdebug "parseopts_late_defaults()\n" if $debuglevel >= 3; $isuite //= cfg("dgit-distro.$idistro.default-suite", 'RETURN-UNDEF') if defined $idistro; $isuite //= cfg('dgit.default.default-suite'); parseopts_cmd_opts_resolve(sub { my ($k, $om) = @_; my $v = access_cfg("cmd-$k", 'RETURN-UNDEF'); if (defined $v) { printcmd \*DEBUG, "COO CFG CMD", $k, $v if $debuglevel >= 3; badcfg f_ "cannot set command for %s (can only provide options)", $k unless length $om->[0]; $om->[0] = $v; } my %done; foreach my $c (access_cfg_cfgs("opts-$k")) { # Look only once at each actual cfg. # This scheme is not great for non-idempotent options, # but we try to avoid making it break unnecessarily. next if $done{$c}++; my @vl = map { $_ ? @$_ : () } map { $gitcfgs{$_}{$c} } reverse @gitcfgsources; printcmd \*DEBUG, "CL $c ", @vl if $debuglevel >= 4; next unless @vl; printcmd \*DEBUG, "COO CFG OPTS $c", @vl if $debuglevel >= 3; badcfg f_ "cannot configure options for %s (can only provide replacement command)", $k if $opts_opt_cmdonly{$k}; push @$om, @vl; } }); 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); } if ($t2u_bmode && $dep14tag_reuse && $dep14tag_reuse ne 'must') { badusage __ "--tag2upload-builder-mode implies --dep14tag-reuse=must"; } elsif ($t2u_bmode) { $dep14tag_reuse = 'must'; } else { $dep14tag_reuse //= access_cfg('dep14tag-reuse', 'RETURN-UNDEF'); $dep14tag_reuse //= 'if-exists'; $dep14tag_reuse =~ m{^$dep14tag_reuse_re$} or badcfg f_ "unknown dep14tag-reuse mode \`%s'", $dep14tag_reuse; } $dep14tag_verify //= access_cfg_bool(0, 'dep14tag-verify'); $dep14tag_verify //= 0; $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->(); changedir '/'; # rmdir_r complains if our cwd is inside what we remove rmdir_r $playground if defined($playground) && !$keep_playground; finish 0; work/dgit-downstream-dsc.7.pod0000664000000000000000000002617415016262471013476 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.pod0000664000000000000000000001001715016262471012417 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<--trust-changelog=1.2.2-1~bpo10+1>. Alternatively, you can perform the pseudomerge that I<--trust-changelog> 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.pod0000664000000000000000000005510415016262471013561 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 git@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<--trust-changelog> 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<--trust-changelog>. =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 to this suite, consider passing I<--deliberately-not-fast-forward> instead of I<--trust-changelog>. 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), gitrevisions(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-gbp.7.pod0000664000000000000000000000761315016262471012417 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, B, and 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-built =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<--trust-changelog> if the previous upload was not performed with dgit. If this is first ever dgit push of the package to this suite, consider passing I<--deliberately-not-fast-forward> instead of I<--trust-changelog>. 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<--trust-changelog>. =head1 SEE ALSO dgit(1), dgit(7) =head1 AUTHOR This tutorial was written and is maintained by Sean Whitton . work/dgit-maint-merge.7.pod0000664000000000000000000003300415016262471012737 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 salsa.debian.org:debian/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<--trust-changelog>. If this is the first ever dgit push of the package, consider passing I<--deliberately-not-fast-forward> instead of I<--trust-changelog>. 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<--trust-changelog>. =head1 SEE ALSO dgit(1), dgit(7), gitrevisions(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.pod0000664000000000000000000000457715016262471013143 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 --trust-changelog 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 --trust-changelog 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 to this suite, you can avoid this merge commit by passing C<--deliberately-not-fast-forward> instead of C<--trust-changelog>. 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<--trust-changelog>. =head1 SEE ALSO dgit(1), dgit(7) work/dgit-nmu-simple.7.pod0000664000000000000000000001157515016262471012631 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 existing 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 PREPARING AND REVISING THE LOCAL BRANCH The dgit/sid branch is a normal local git branch tracking a (synthetic) upstream branch. So you can freely rewrite any commits that you have made locally and haven't pushed anywhere, as normal, The one thing that's weird is the "quilt fixup" commits (that turn up if you do eg dgit sbuild). If you're rebasing them at all, you can and should just drop them; dgit will then regenerate them as needed. All of this follows from one underlying fact: dgit doesn't have invisible git state somewhere. So if you rebase away the quilt fixup, and rework your branch, your branch is still good because it looks just like it would do, if you'd just made those commits straight off. (NB git-debrebase B have weird off-branch state.) =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.pod0000664000000000000000000001777215016262471013137 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-deborig(1), 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. (When using a native source package format, no origs are needed.) If the sponsee generated these tarballs with git-deborig(1), git-archive(1) or gbp-buildpackage(1), they can simply include a sample invocation of git-deborig(1) or 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<--trust-changelog> to dgit. Alternatively, if this was the first ever dgit push of the package to this suite, you can pass C<--deliberately-not-fast-forward> instead of C<--trust-changelog>. 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<--trust-changelog> 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.pod0000664000000000000000000003146715016262471011523 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 % sudo apt-get build-dep . % 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 commits 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 % sudo apt-get build-dep . % 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 Stretch or newer =over 4 % sudo apt install ../libc6_*.deb =back =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. =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 INSTALLING NEWER DGIT ON OLDER DISTROS If dgit breaks with the source package you are working with, this might be due to a bug which would be fixed by upgrading. You can probably directly C the latest version of dgit.deb from Debian stable, or Debian testing. Versions of dgit from Debian 13 (trixie) onwards document their installability on old releases in the manpage. For example, for current Debian testing, see L, and look in the section SUPPORT ON OLD DISTRIBUTIONS. =head1 SEE ALSO dgit(1), dgit(7) work/dgit.10000664000000000000000000016473015016262471007760 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-source\fP|\fBpush-built\fP [\fIdgit\-opts\fP] [\fIsuite\fP] .br .B dgit [\fIdgit\-opts\fP] \fBrpush-source\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 usable by ordinary people. This is the command line reference. Please read the tutorial(s): .TS lb2 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, and that of any sponsee, 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 usable 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 .IR package . For dgit fetch and dgit pull, uses this value rather than looking in debian/control or debian/changelog. For dgit rpush, specifies that the invoking host should be willing to sign only a .dsc or .changes file for the source package \fIpackage\fR. .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 --collab-non-dgit Make .BR "dgit push" , behave more suitably for collaborating (using shared git history) with git-using co-developers who aren't using dgit. With this option, dgit won't mind that the git history you're using isn't necessarily fast forward from the dgit view; instead, it will rely on the changelog to prevent accidentally overwriting changes. And, the synthetic commits needed to make the dgit git history fast forward will appear only on the dgit git server, and local dgit suite branches, not on your own main branch. So they won't end up in the maintainer-visible history, when you push your own branch to make a merge request. This is equivalent to .BR "--split-view=always --trust-changelog" . .TP .BR --trust-changelog " | " --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 to specify .BR \-\-trust-changelog , than .BR \-\-overwrite= \fIprevious-version\fR, and usually the latter is not needed. .B --trust-changelog 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. It 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) . With .BR \-\-trust-changelog dgit will check that the version in the archive is mentioned in your debian/changelog. (This will avoid losing changes, unless someone committed to git a finalised changelog entry, and then made later changes to that version.) With .BI \-\-overwrite= previous-version that version ought to be the version currently in the archive, and it will be unconditionally overwritten, regardless of what's in the changelog. These options 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; .B --split-view=always can be used to force that behaviour, e.g. in other quilt modes.) .B \-\-overwrite without a version number is an obsolete way of specifying .BR \-\-trust-changelog . .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 \-\-trust-changelog (which creates a suitable pseudomerge) and --deliberately-not-fast-forward (which suppresses the pseudomerge and the fast forward checks) should be needed; \-\-trust-changelog 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 .BR --dep14tag " | " --no-dep14tag Whether to push a DEP-14 tag (eg .BR debian/ \fIversion\fR) as well as a dgit tag (eg .BR archive/debian/ \fIversion\fR). Pushing a DEP-14 tag is the default. In split view mode, a DEP-14 tag is always pushed, regardless of this option. .B --always-dep14tag is an obsolete alias for --dep14tag, retained for compatibility. .TP .BR --dep14tag-reuse=must | if-exists | replace-unsuitable | replace Whether to use an existing DEP-14 tag, or make a fresh one. Ignored if no DEP-14 tag is to be pushed. .RS .TP .B --dep14tag-reuse=must Push an existing tag DEP-14 tag. If there is no existing tag, or the existing tag is unsuitable, fail. .TP .B --dep14tag-reuse=if-exists Push an existing tag DEP-14 tag, if it exists. If there is no existing tag, make one. If there is an existing tag but it is unsuitable, fail. This is the default. .TP .B --dep14tag-reuse=replace-unsuitable Push an existing tag DEP-14 tag, if it exists and is suitable. If there is no existing tag, or it's unsuitable, make a fresh tag, overwriting the corresponding git ref, and thus deleting any old tag. .TP .B --dep14tag-reuse=replace Always make a fresh DEP-14 tag, overwriting the corresponding git ref, and thus deleting any old tag. This was the default in dgit 11 and earlier. .RE .TP .BR --dep14tag-verify " | " --no-dep14tag-verify Whether to verify an existing DEP-14 tag, as part of the suitability check. The default is to consider an unsigned tag suitable (and not verify a signed one). Note that any DEP-14 tag being pushed will be, effectively, countersigned: the hash of the DEP-14 tag object (if there is one) is part of the metadata in the dgit view .B archive/ tag message. .TP .BI -D Prints debugging information to stderr. Repeating the option produces more output (currently, up to -DDDD is meaningfully different). .TP .BR \-\-keep\-playground | \-\-no\-\-keep\-playground Controls whether to retain the "playground" working directory .B .git/dgit/unpack even on success, for examination and debugging. The default is .B \-\-no\-keep\-playground which deletes the directory after a successful execution. .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-genbuildinfo , .BR dpkg-genchanges , .BR dpkg-query , .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-genbuildinfo , .BR dpkg-genchanges , .BR dpkg-query , .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 and .changes in temporary files, 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. .TP .BR --expect-suite =\fIsuite\fR Specifies that the dgit rpush invoking host should be willing to sign only a .dsc or .changes file with target suite \fIsuite\fR. .TP .BR --expect-version =\fIversion\fR Specifies that the dgit rpush invoking host should be willing to sign only a .dsc or .changes file with version \fIversion\fR. .TP \fB--tag2upload-builder-mode\fR, \fB--tag2upload-upstream=\fITAG\fR, \fB--tag2upload-upstream-commit=\fICOMMIT\fR These options activate configuration and behavioural changes needed when the tag2upload robot invokes dgit. They are not intended for users. .TP .BR \-\-allow-unrelated-histories Pass --allow-unrelated-histories to git merge command when running dgit pull. This makes dgit pull easier to use when the main repository has never been used with dgit and hence has unrelated histories. .TP \fB--dsc-control-add=\fIFIELD\fB=\fIVALUE\fR Add an additional control file field to the .dsc. This is similar to using \fB--dpkg-source:-D\fIFIELD\fB=\fIVALUE\fR except that (i) you can only add an additional field, not override a value; and (ii) for an rpush, the field is added on the invoking (signing) host, not the build host. .TP \fB--ch-control-add=\fIFIELD\fB=\fIVALUE\fR Like \fB--dsc-control-add\fR but for adding fields to the .changes file. .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 .BR dgit-distro. \fIdistro\fR .dep14tag-reuse " " must | if-exists | replace-unsuitable | replace .BR dgit-distro. \fIdistro\fR .dep14tag-verify " " true | false .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 SUPPORT ON OLD DISTRIBUTIONS We aim to make modern dgit installable and useable on old versions of Debian, and on derivatives. One reason this is helpful is that it can be necessary to upgrade to handle strange source packages that trigger bugs (in dgit or tools that dgit runs). This version of .B dgit.deb is directly installable, and functional .RB "(with " "apt install dgit.deb" ) all the way back to Debian 10 (buster) and later; this is tested in our CI. It is likely to work on many Debian derivatives, too. .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.70000664000000000000000000004671515016262471007770 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; the dgit-repos repo for the package can even be the same as the `origin' remote, although this is not generally the case in Debian. 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-debpush0000775000000000000000000003613115016262471011101 0ustar #!/bin/bash # git-debpush -- create & push a git tag with metadata for an ftp-master upload # # Copyright (C) 2019, 2024 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 failed: $* ('$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 -MDpkg::Version -F", " -we' @debian_tag_vs = sort { version_compare($b, $a) } grep defined, map m|tag: refs/tags/'"$prefix"'(.+)|, @F or next; 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 --whitespace=nowarn \ "debian/patches/$patch" git_apply_rc=$? set -e if ! [ $git_apply_rc = 0 ]; then fail_check patches-nonapplicable \ "'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 "$distro/") last_archive_tag=$(find_last_tag "archive/$distro/") 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 changed-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'/^\[dgit.*--quilt=([a-z+]+).*\]$/ or next; 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] " if $printing; then printf "%s" "$tagmessage" fi if $tagging; then git tag "${git_tag_opts[@]}" -s -m "$tagmessage" \ "$debian_tag" "$branch" fi # **** Do a git push **** if $pushing; then git push "$remote" "${to_push[@]}" fi work/git-debpush.1.pod0000664000000000000000000001776715016262471012034 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_dummy, @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 overridden by individual -f options\n", $us, $snags_forced; } if ($snags_tripped) { if ($opt_force) { print STDERR f_ "%s: snags: %d overridden 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(5) section OTHER MERGES and file a bug."; # 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 -f), $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 something 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"); } 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 called 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_version_show = stripepoch $new_upstream_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_show", ("[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_show", "[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_show."); 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_show", "[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_experimental () { # This is almost impossible to use and therefore almost impossible # to document. 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_dummy, '-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.pod0000664000000000000000000004324515016262471012304 0ustar =head1 NAME git-debrebase - tool to maintain series of Debian changes to upstream source =head1 SYNOPSIS 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 No-op option still accepted for compatibilty. In previous versions this enabled attempting to handle general merges, but that attempt is now made unconditonally. =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(5), dgit-maint-debrebase(7), dgit(1), gitglossary(7) work/git-debrebase.5.pod0000664000000000000000000005075715016262471012316 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 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 avoided because they might generate such merges. 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. If a general merge is detected, git-debrebase will treat each side of the merge as a git-debrebase interchange branch, and to attempt to resolve them into a coherent view. When this attempt succeeds, the output is likely to be correct. If automatic resolution fails, an incomprehensible pile of multidimensional merge wreckage will be left in git refs under C. You are not likely to be able to resolve this without expert help. If this happens, please file a bug, with a formal Steps to Reproduce, including the URL for your public repository, the precise git commitid of your current branch. =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 derived 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-setup0000775000000000000000000000227415016262471012433 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.make0000664000000000000000000000146215016262471011643 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-auditor0000775000000000000000000003404315016262471012020 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/0000775000000000000000000000000015016262471010033 5ustar work/infra/cgit-regen-config0000775000000000000000000000067715016262471013262 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-wrap0000775000000000000000000000222615016262471013764 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-debian0000775000000000000000000001366115016262471014353 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-debian0000775000000000000000000004702415016262471014562 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-trusting0000775000000000000000000000210515016262471015206 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-server0000775000000000000000000020764215016262471013355 0ustar #!/usr/bin/perl -w # dgit-repos-server # # git protocol proxy to check dgit pushes etc. # # Copyright (C) 2014-2017,2019,2024-2025 Ian Jackson # Copyright (C) 2024-2025 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 . # 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 [] \ # --tag2upload9 SSH-CMD RPUSH-HOST RPUSH-DIR VIRT-EXEC-CMD \ # NOREPLY REPLY-TO COPIES TIMEOUT SIGNING-KEYID \ # -- URL TAGNAME PUTATIVE-PACKAGE (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::Temp qw(tempfile); initdebug(''); our $func; our $dgitrepos; our $package; our $distro; our $suitesfile; our $suitesformasterfile; our $policyhook; our $mirrorhook; our $dgitlive; our $maildomainsfile; our $outgoingmail; our $distrodir; our $destrepo; our $workrepo; our $keyrings; our @lockfhs; our @deliberatelies; our %previously; our $policy; our @policy_args; our $reject_hook = sub { }; # called at the top of reject, with message #----- 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; rmdir_r $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 dgit_program () { $ENV{DGIT_DRS_DGIT} // 'dgit'; } 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) = @_; $reject_hook->($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: rmdir_r $garbagerepo-tmp\n"; rmdir_r "$garbagerepo-tmp"; if (rename "$garbagerepo-old", "$garbagerepo-tmp") { printdebug "movetogarbage: $garbagerepo-old -> -tmp, rmdir_r\n"; rmdir_r "$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; rmdir_r "${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, $tagfp, $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 ($$;$) { # Runs git cat-file and writes the output to dgit-tmp/$outleaf my ($objref, $outleaf, $cmd_map) = @_; printdebug " readtag ($outleaf)...\n"; $cmd_map //= sub { @_; }; local $/ = undef; # don't chomp! my $tag_data = cmdoutput $cmd_map->(qw(git cat-file tag), $objref); open TW, ">dgit-tmp/$outleaf" or die $!; print TW $tag_data or die $!; close TW or die $!; } sub parsetag_split () { # First part of tag processing. # # Reads dgit-tmp/wholetag # Writes # dgit-tmp/plaintext whole tag plaintext # dgit-tmp/plaintext.asc signature # dgit-tmp/tagmessage the "message" part # printdebug " parsetag_split...\n"; open T, "dgit-tmp/wholetag" or die $!; open PT, ">dgit-tmp/plaintext" or die $!; open DS, ">dgit-tmp/plaintext.asc" or die $!; my $in_ds; for (;;) { $!=0; $_=; defined or last; $in_ds = 1 if m/^-----BEGIN PGP/; if ($in_ds) { print DS or die $!; } else { print PT or die $!; } } T->error() and die $!; close T; close PT or die $!; close DS or die $!; reject "tag missing signature" unless $in_ds; } sub parsetag_general ($$) { # Processes the tag message, after parsetag_split. # # tag header values (git headers) are left in @{ $tagh['HEADER'] } # # the tag summary line is fed in $_ to $summary_line_fn->(); # # [dgit..] metadata lines found in the message are identified. # the metadata line content, plus a space, is fed in $_ to # $dgititemfn->() # # $dgititemfn->() should consider whether the item is recognised. # If the item is recognised, it should strip the item, and the space, # from the front of $_, and return true. # Otherwise it should leave $_ unchanged, and return false. my ($summary_line_fn, $dgititemfn) = @_; printdebug " parsetag...\n"; my $phase = 'header'; my $distro_ok; open T, "dgit-tmp/plaintext" or die $!; for (;;) { $!=0; $_=; defined or last; if ($phase eq 'header') { if (m/^(\S+) (.*)/) { push @{ $tagh{$1} }, $2; } elsif (!m/\S/) { $phase = 'summary line'; } else { reject "corrupted git headers in tag"; } } elsif ($phase eq 'summary line') { m/\S/ or reject 'tag summary line has only whitespace'; $summary_line_fn->(); $phase = 'summary line sep'; } elsif ($phase eq 'summary line sep') { m/\S/ and reject '2nd line of tag message (after summary line) is not blank'; $phase = 'body'; } elsif ($phase eq 'body' && m/^\[dgit ([^"].*)\]$/) { # [dgit "something"] is for future $_ = $1." "; while (length) { if ($dgititemfn->()) { } elsif (s/^distro\=(\S+) //) { $distro_ok ||= $1 eq $distro; } elsif (s/^([-+.=0-9a-z]\S*) //) { printdebug " parsetag ignoring unrecognised \`$1'\n"; } else { reject "unknown critical dgit info in tag ($_)"; } } } elsif ($phase eq 'body') { # ignore } else { confess "$phase ?"; } } T->error and die $!; reject "tag missing message (at $phase)" unless grep { $_ eq $phase } 'summary line sep', 'body'; if (!$distro_ok) { $distro_ok // reject "missing distro= in tag (very old dgit?)"; reject "not for this distro (distro=$distro missing)"; } printdebug " parsetag ok.\n"; } sub parsetag () { readtag($tagval, 'wholetag'); parsetag_split(); parsetag_general sub { # TODO we should replace this eventually, either after all non-ancient # dgit versions put the relevant information in the tag body, or with # fallback to looking here. NB this code isn't used for the t2u tag. # This will probably also mean moving the `source=` handling from # tag2upload_parsetag to parsetag_general. m/^($package_re) release (\S+) for \S+ \((\S+)\) \[dgit\]$/ or reject "tag summary line not in expected format: $_ "; reject "package mismatch in tag summary line" unless $1 eq $package; $version = $2; reject "suite mismatch in tag summary line ($3 != $suite)" unless $3 eq $suite; }, 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 checksig_keyring ($$) { my ($keyringfile, $log_fh) = @_; # returns primary-keyid if signed by a key in this keyring # or undef if not # or dies on other errors # # Either way, some log info, including the keyring leafname, # and the gpgv stderr, is written to $log_fh. my $ok = undef; printdebug " checksig keyring $keyringfile...\n"; $keyringfile =~ m{([^/]*)$} or die; print $log_fh "checking signature against keyring $1...\n"; flush $log_fh or die $!; our @cmd = (qw(gpgv --status-fd=1 --keyring), $keyringfile, qw(dgit-tmp/plaintext.asc dgit-tmp/plaintext)); debugcmd '|',@cmd; my $gpg_child = open P, "-|" // die $!; if (!$gpg_child) { open STDERR, ">&", $log_fh or die $!; exec @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]; $tagfp = $l[1]; die unless defined $ok and defined $tagfp; last; } elsif ($l[0] eq 'BADSIG') { # This is not necessary for correctness, but it produces # a much better error message. reject "bad signature!"; } } # Print a message if gnupg dies due to a signal other than SIGPIPE. # Ignore nonzero exit status: that's normal, eg for key not found. # If gnupg crashes with a nonzero exit status it ought to # print some messages of its own. $!=0; $?=0; close P or $?==13 or $? < 256 or print $log_fh "gnupg failed ($keyringfile): $? $!\n"; 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_start ($) { my ($fail_log_copy_fh) = @_; # Tries to verify the signature, based on $keyrings, # and returns information about the first auth entry containing the key # that signed the tag. # # If it rejects, also writes log info including keyring leafnames, # and gpgv stderr, to $fail_log_copy_fh. # Nothing is written there on success. # # Return values are # { AnyPackage => 1, KeyId => $keyid, Keyring => $keyring } # where the KeyId and Keyring fields may not be present. # Any package should be allowed - access should be granted. # A "printdebug" has already been logged. # The return value from $permit will be # returned by verifytag_general unconditionally. # { DmTextFn => $dm_txt_filename, KeyId => $keyid, Keyring => $keyring } # An "m" entry in $keyrings specified the signing key. # The keyid and dm.txt filename are passed to $permit # and the dm.txt has NOT yet been read, so $keyid MUST be checked. # (Typiecally, by calling dm_txt_check) # Otherwise, calls `reject`. my $log_fh = IO::File::new_tmpfile() or die $!; my $orig_reject_hook = $reject_hook; local $reject_hook = sub { seek $log_fh,0,POSIX::SEEK_SET or die $!; File::Copy::copy($log_fh, $fail_log_copy_fh) or die $!; $orig_reject_hook->(@_); }; return { AnyPackage => 1 } if $keyrings eq 'always-accept'; foreach my $kas (split /:/, $keyrings) { printdebug "verifytag $kas...\n"; $kas =~ s/^([^,]+),// or die; my $keyring = $1; my $keyid = checksig_keyring $keyring, $log_fh; if (defined $keyid) { my %ret = (KeyId => $keyid, Keyring => $keyring); if ($kas =~ m/^a$/) { printdebug "verifytag a ok\n"; $ret{AnyPackage} = 1; return \%ret; } elsif ($kas =~ m/^m([^,]+)$/) { $ret{DmTxtFn} = $1; return \%ret; } else { die; } } } reject "key not found in keyrings, or verification failed"; } sub verifytag_finish ($) { # Takes a value returned by ``verifytag_start`, # and completes all the checks. Either returns true, or `reject`s. my ($info) = @_; if ($info->{AnyPackage}) { } elsif ($info->{DmTxtFn}) { dm_txt_check( $info->{KeyId}, $info->{DmTxtFn}, ); printdebug "verifytag m ok\n"; } else { confess; } 1; } sub verifytag () { # Verifies that # some entry in $keyrings justifies the upload # specifically # if the entry references a keyring # a public key in that keyring can verify # dgit-tmp/plaintext.asc # dgit-tmp/plaintext # if the entry references a dm.txt # that dm.txt mentions the signing key fingerprint wrt src:$package # Otherwise, dies. verifytag_finish verifytag_start(\*STDERR); } 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 following 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; rmdir_r "$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, 'preferred-mail-domains' => \$maildomainsfile, 'outgoing-mail' => \$outgoingmail, ); our @hookenvs = qw(distro suitesfile suitesformasterfile policyhook mirrorhook dgitlive keyrings dgitrepos distrodir); # workrepo and destrepo handled ad-hoc #----- tag2upload ----- our ($t2uv_ssh, $t2uv_host, $t2uv_tdir, @t2u_virt_exec_cmd); our ($t2u_line_length_limit); our ($t2u_email_noreply, $t2u_email_noreply_addr, $t2u_email_reply_to, @t2u_email_copies, $t2u_jid, $t2u_url, $t2u_putative_package); our ($t2u_tagger, $t2u_tagger_addr, $t2u_timeout); our ($t2u_signing_keyid); our ($t2u_upstreamc, $t2u_upstreamt, $t2u_quilt); sub t2u_dgit_cmd () { ( dgit_program(), qw(-wn), "-p$package", qw(--build-products-dir=../bpd), ) } #-- line length limits --# sub t2u_length_limit ($$$) { my ($desc, $value, $limit) = @_; return if (length $value) <= $limit; reject "$desc unreasonably long (>$limit characters)"; } # Used for Subject (only) sub t2u_split_long_lines ($;$) { my ($val_ref, $indent) = @_; $indent //= ''; my $o = ''; my $i = $$val_ref; my $lim = $t2u_line_length_limit; while ((length $i) > $lim) { my $chunk = substr($i, 0, $lim); $i = substr($i, $lim); $o .= $chunk; $o .= "\\\n"; $o .= $indent; } # This transformation ensures that the output is reversible: # Every \ was inserted above. If we wanted to mean # \, we write \\. $i =~ s{\\n$}{\\\\\n\n}; $o .= $i; $$val_ref = $o; } #-- accessing builder VM -- sub t2u_b_cmd_map_nochdir (@) { # Returns the shell command argv (a list) to run locally, # in order to run @cmd in the builder VM, in no particular directory. my (@cmd) = @_; # $t2uv_ssh is ssh-like. # # When ssh executes a remote command instead of starting a remote # interactive shell, it simply joins the arguments together with # spaces and passes this single shell command to the remote shell. # So we have to add a layer of quotation (if we were executing the # ssh client using a local shell, it would be as though ssh strips # one layer of shell quotation). my $remote_cmd = shellquote @t2u_virt_exec_cmd, @cmd; ($t2uv_ssh, $t2uv_host, $remote_cmd); } sub t2u_b_cmd_map ($@) { # Returns the shell command argv (a list) to run locally, # in order to run @cmd in the builder VM, in directory $subdir. my ($subdir, @cmd) = @_; t2u_b_cmd_map_nochdir qw(env -C), "$t2uv_tdir/$subdir", @cmd; } sub t2u_b_cmd_map_work (@) { # Returns the shell command argv (a list) to run locally, # in order to run @_ in the builder VM, in directory 'work'. t2u_b_cmd_map 'work', @_; } sub t2u_b_runcmd_inner ($@) { # Run command @cmd in the builder VM (and die if it fails) my ($subdir, @cmd) = @_; runcmd t2u_b_cmd_map $subdir, @cmd; } # We divide commands into logged ones that always show up in the log, # and unlogged ones which are only logged if they fail. # # We arrange to print `...` in the transcript when we run unlogged # commands, but only once, and not at the start of the transcript. # As it happens, at the time of writing, *all* the unlogged # commands are at the start so this machinery is a bit superfluous. # # (This logging is in addition to failure output from runcmd, etc., # so if a logged command fails, the command ends up in the log twice: # once before its own output, and once after.) our $t2u_runcmd_suppress_ellipsis = 1; sub t2u_b_cmd_log ($@) { my ($subdir, @cmd) = @_; printcmd \*STDERR, "\nbuilder:$subdir\$", @cmd; } sub t2u_b_cmd_log_after ($) { my ($outcome) = @_; print STDERR "# [$outcome]\n"; } sub t2u_b_runcmd ($@) { my ($subdir, @cmd) = @_; print STDERR "# ...\n" unless $t2u_runcmd_suppress_ellipsis++; t2u_b_runcmd_inner $subdir, @cmd; } sub t2u_b_runcmd_logged ($@) { my ($subdir, @cmd) = @_; t2u_b_cmd_log $subdir, @cmd; t2u_b_runcmd_inner $subdir, @cmd; t2u_b_cmd_log_after('ok'); $t2u_runcmd_suppress_ellipsis = 0; } #-- t2u responses and reporting -- sub t2u_respond_general ($$) { # Send a response (to stdout), reporting outcome, and exit my ($status, $msg) = @_; $msg =~ s{\n}{ // }g; print PROTOCOL_RESPONSE <>$email_whole" or die $!; # The $subject is the only thing that might contains more than # just one piece of (length-limited) uncontrolled data. # If it's too long, break it, inserting \ t2u_split_long_lines \$subject, " "; my $report_package = $package // $t2u_putative_package; print EW <. # This can only actually happen to the body and the transcript, # not to the tag, because the tag's lines are assured to be short. open EP, "<", $copy_from or die "$copy_from $!"; while () { $_ = encode_qp($_); print EW or die $!; } EP->error and die $!; close EP; }; flush EMAIL_REPORT or die $!; $mime_part->('inline', undef, undef, 'dgit-tmp/email-report'); if (stat "dgit-tmp/t2u.log") { # In theory this log might not be UTF-8 but we ought to # specify *some* encoding, so just use $mime_part. $mime_part->('inline', "log.txt", 'processing log', 'dgit-tmp/t2u.log'); } else { $! == ENOENT or die $!; } $mime_part->('attachment', "tag.txt", 'input git tag', 'dgit-tmp/wholetag'); print EW <&STDOUT" or die $!; open STDOUT, ">&STDERR" or die $!; open EMAIL_LOG, ">/dev/null" or die $!; # dgit-tmp is in trusted, and not in a .git, unlike elsewhere. # This is a bit confusing but it means readtag etc. can just do # "the same thing", ie use `dgit-tmp' from their cwd. rmdir_r 'dgit-tmp'; mkdir 'dgit-tmp' or die $!; # Get the tag from stdin and write it to a file File::Copy::copy(\*STDIN, "dgit-tmp/wholetag") or die $!; } sub tag2upload_check_args () { # Argument checking - but, after we have set up so that # `reject` sends a protocol response instead of crashing. reject 'bad jobid' if $t2u_jid =~ m/[^[:graph:]]/; reject 'bad tag name' if $tagname =~ m/[^[:graph:]]/; reject 'bad url' if $t2u_url =~ m/[^[:graph:]]/; $tagname =~ m{^$distro/($versiontag_re)$}s or reject "tag name not for this distro or bad version"; $version = $1; $version =~ y/_\%\#/~:/d; # 900 is enough for SMTP (998 excluding \r\n) plus some fixed # furniture of our own (eg mail header lines). $t2u_line_length_limit = $ENV{TAG2UPLOAD_LINE_LENGTH_LIMIT} // 900; t2u_length_limit 'jobid', $t2u_jid, 50; t2u_length_limit 'tag name', $tagname, $t2u_line_length_limit / 4; t2u_length_limit 'url', $t2u_url, $t2u_line_length_limit; open T, "dgit-tmp/wholetag" or die $!; while () { t2u_length_limit 'tag line', $_, $t2u_line_length_limit; } T->error and die $!; } sub tag2upload_verifytag () { my $verifytag_info = verifytag_start(\*EMAIL_REPORT); t2u_add_to_report <{Keyring} && $verifytag_info->{KeyId}; my @maildomains; unless (open MAILDOMAINS, "<", $maildomainsfile) { $!==ENOENT or die $!; return; } /^(?!#)\s*(\S+)/ && push @maildomains, qr/\@\Q$1\E$/ while ; die $! if MAILDOMAINS->error; my @cmd = (qw(gpg --keyring), $verifytag_info->{Keyring}, qw(--with-colons --list-keys --), $verifytag_info->{KeyId}); debugcmd '|',@cmd; open P, "-|", @cmd or die $!; my (%addresses, @addresses); while (

) { chomp or die; printdebug " maybe_cc_signer| $_\n"; my @F = split /:/; # Extract e-mail addresses similarly to how dak does it, in # its _gpg_get_addresses_from_listing subroutine. # We want to do it like dak to avoid mail from dak and from us # ending up distributed across different mailboxes. # Look in both pub and uid lines for addresses, like dak. $F[0] eq "uid" or $F[0] eq "pub" or next; # Skip invalid, disabled and revoked UIDs. # This ensures that e.g. we don't send mail to an e-mail # address from a UID that was revoked because the e-mail # address no longer belongs to the key owner. $F[1] eq "i" || $F[1] eq "d" || $F[1] eq "r" and next; # Look for an RFC 5322 angle-addr without obsolete syntax. # This means we skip any UID containing C-style escaping or # quoting. If this proves to be a problem for any actual UIDs # in Debian keyrings, we can add some additional handling. $F[9] =~ /\s$angle_addr_re$/a or next; $addresses{$1}++; push @addresses, $1; } die $! if P->error; $!=0; $?=0; close P or die "$? $!"; @addresses or return; # Stop if we're already mailing any of the addresses on the key. $addresses{$_} && return for $t2u_tagger_addr, @t2u_email_copies; my $pref = $addresses[0]; # this is the primary UID my $pref_prio = @maildomains; ADDRESSES: foreach my $addr (@addresses) { last unless $pref_prio; for (my $i = 0; $i < $pref_prio; $i++) { if ($addr =~ $maildomains[$i]) { $pref = $addr; $pref_prio = $i; next ADDRESSES; } } } push @t2u_email_copies, $pref; } sub tag2upload_parsetag ($) { my ($verifytag_info) = @_; my %need = map { $_ => 1 } qw(please-upload split); my $tagversion; parsetag_general sub { # message summary line }, sub { if (m/^(\S+) / && exists $need{$1}) { $_ = $'; delete $need{$1}; } elsif (s/^upstream=(\w+) //) { $t2u_upstreamc = $1; } elsif (s/^upstream-tag=(\S+) //) { $t2u_upstreamt = $1; } elsif (s/^--quilt=([-+0-9a-z]+) //) { $t2u_quilt = $1; } elsif (s/^source=($package_re) //) { $package = $1; } elsif (s/^version=(\S+) //) { $tagversion = $1; } else { return 0; } return 1; }; # Reject a tagger that doesn't end in an RFC 5322 angle-addr # without obsolete syntax. Require a display name, but don't # restrict it to an RFC 5322 display-name. It doesn't seem to be # specified anywhere what restrictions Git places on # author/committer/tagger names, but they can certainly contain # non-ASCII, and this doesn't require escaping or quoting. # # Save the whole thing to $t2u_tagger for use as the # Git-Tag-Tagger .changes/.dsc field. Save just the angle-addr # for tag2upload_maybe_cc_signer's deduplication purposes. ($t2u_tagger, $t2u_tagger_addr) = tagh1('tagger') =~ m/^([^\n\r]+ $angle_addr_re) \d+ [-+]\d+$/m or reject "failed to fish tagger out of tag"; reject "tag missing \"$_\"" foreach keys %need; reject "tag missing source=" unless $package; reject # package names have been checked against $package_re so no quoting needed "parsed source package $package but manager said $t2u_putative_package" unless $package eq $t2u_putative_package; reject "tag missing version=" unless $tagversion; reject "tag has version mismatch $tagversion != $version " unless $tagversion eq $version; reject "tag has upstream= and not upstream-tag=, or v-v" unless defined $t2u_upstreamt == defined $t2u_upstreamc; t2u_add_to_report <>dgit-tmp/t2u.log" or die $!; flush EMAIL_REPORT or die $!; if (my $child = fork // die $!) { # We are the parent. We handle all reporting, but: # If the child exits 0 it has written the whole protocol # response to `dgit-tmp/ok-response`. $!=0; waitpid $child, 0 == $child or die $!; printdebug "child $child ?=$?\n"; if (!$?) { t2u_send_email 'uploaded', "uploaded $package $version"; File::Copy::copy("dgit-tmp/ok-response", \*PROTOCOL_RESPONSE) or die $!; exit 0; } else { my $ws_msg = waitstatusmsg(); t2u_add_to_report <dgit-tmp/ok-response" or die $!; $reject_hook = sub { }; open STDERR, ">&", *L or die $!; open STDOUT, ">&STDERR" or die $!; open DEBUG, ">&STDERR" if $debuglevel; open EMAIL_LOG, ">&2" or die $!; $SIG{ALRM} = sub { t2u_add_to_report <= 0 or die $!; $r == 0 or reject "tag changed between fetches"; # XXXX needs test case! t2u_b_runcmd_logged 'work', qw(git checkout -q), "refs/tags/$tagname"; t2u_add_to_report <('Version', $version); $clogf->('Source', $package); $suite = getfield $clogp, 'Distribution'; $suite =~ m{^$suite_re$} or reject "bad suite \`$suite' (in d/changelog)"; t2u_add_to_report <>dgit-tmp/email-report" or die $!; t2u_add_to_report <&", $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; } open WORKAROUND_LOG, ">> _rmtree-workaround.log" or confess $!; foreach my $lf (<*.lock>) { my $tree = $lf; $tree =~ s/\.lock$// or confess "$tree ?"; # Attempt to detect #1101580 (failure to remove) and # 1. log it somewhere # 2. work around it by simply tolerating it, # so that (hopefully) the next run will clean it up # # After deploying this we should periodically check the logfile. $@ = ''; my $y = eval { acquirermtree($tree, 0); }; if (length $@) { my $now = time; print WORKAROUND_LOG <&WORKAROUND_LOG" or confess $!; open STDERR, ">&STDOUT" or confess $!; exec 'find', "./$tree", "-ls" or confess $!; } $child eq waitpid $child, 0 or confess $!; print WORKAROUND_LOG "find ended, wait status $?\n"; flush WORKAROUND_LOG; } next unless $y; remove $lf or warn $!; unlockall(); } } parseargsdispatch(); cleanup(); work/infra/dgit-ssh-dispatch0000775000000000000000000001222615016262471013303 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 ':', '@/debian-tag2upload.gpg,a', '@/keyrings/debian-keyring.gpg,a', '@/keyrings/debian-maintainers.gpg,m@/dm.txt', '@/keyrings/debian-nonupload.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-wrap0000775000000000000000000000043615016262471012462 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-txt0000775000000000000000000000071115016262471011752 0ustar #!/bin/sh set -e cd ${1-/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-suites0000775000000000000000000000114515016262471012053 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-wrap0000775000000000000000000000032515016262471011525 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/infra/tag2upload-builder-crontab0000775000000000000000000000063615016262471015102 0ustar #!/usr/bin/crontab -utag2upload-builder # After changing this file, to make those changes effective on # tag2upload-builder-01.debian.org, upgrade dgit-infrastructure.deb # there, and then execute # /usr/share/dgit-infrastructure/debian/tag2upload-builder-crontab # as the tag2upload-builder UID. MAILTO=dgit-owner@debian.org 0 3 * * 4 chronic /usr/share/dgit-infrastructure/debian/tag2upload-builder-rebuild work/infra/tag2upload-builder-rebuild0000775000000000000000000000556215016262471015103 0ustar #!/bin/bash # -*- fill-column: 78 -*- # Copyright (C) 2025 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 -eo pipefail release=bookworm mirror=http://deb.debian.org/debian variant=minbase early_pkgs=( # This ensures /etc/ssh exists for copying in /etc/ssh/ssh_known_hosts. openssh-client python3-pygit2 ) customize_hooks=( "upload /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts" 'chroot "$1" adduser --gecos builder --disabled-password builder' 'mkdir "$1"/home/builder/.ssh' "copy-in $HOME/.ssh/id_ed25519 /home/builder/.ssh/" "copy-in $HOME/.ssh/id_ed25519.pub /home/builder/.ssh/" 'chroot "$1" chown -R --reference=/home/builder /home/builder/.ssh' 'mkdir "$1"/home/builder/.gnupg' "copy-in $HOME/.gnupg/pubring.kbx /home/builder/.gnupg/" 'chroot "$1" chown -R --reference=/home/builder /home/builder/.gnupg' ) late_pkgs=( # We can't just have mmdebstrap include dgit and git-debrebase because # autopkgtest-build-podman tries to do some ad hoc cleaning up which # uninstalls some of their dependencies, thus uninstalling them, too. # # It also deletes our /etc/apt/sources.list.d/*.list and rewrites # mmdebstrap's /etc/apt/sources.list dgit/testing git-debrebase/testing ) mkdir -p ~/.local/share/containers touch ~/.local/share/containers/.nobackup # Live testing is much easier if this script is self-contained, # so we're not using mmdebstrap's support for hook directories. for t in setup extract essential customize; do declare -n a=${t}_hooks for i in "${!a[@]}"; do printf -v a[i] -- "--$t-hook=%s" "${a[i]}" done done set -x mmdebstrap \ --variant=$variant --include=$(set +x; IFS=,; echo "${early_pkgs[*]}") \ "${setup_hooks[@]}" "${extract_hooks[@]}" \ "${essential_hooks[@]}" "${customize_hooks[@]}" \ $release - $mirror | autopkgtest-build-podman \ --release=$release --tarball=- \ --post-command='printf "%s\n" >/etc/apt/preferences.d/20testing.pref \ "Package: *" \ "Pin: release a=testing" \ "Pin-Priority: -10" \ && printf "%s\n" >/etc/apt/sources.list.d/testing.list \ "deb '$mirror' testing main" \ && apt-get update \ && apt-get -y install '"${late_pkgs[*]}" \ -- --network=host podman image prune --force work/infra/tag2upload-oracle-crontab0000775000000000000000000000103215016262471014710 0ustar #!/usr/bin/crontab -utag2upload-oracle # After changing this file, to make those changes effective on # tag2upload-oracle-01.debian.org, upgrade dgit-infrastructure.deb # there, and then execute # /usr/share/dgit-infrastructure/debian/tag2upload-oracle-crontab # as the tag2upload-oracle UID. MAILTO=dgit-owner@debian.org 28 * * * * chronic /usr/share/dgit-infrastructure/debian/get-dm-txt /srv/oracle.tag2upload.debian.org/data 0 2 * * * find /srv/oracle.tag2upload.debian.org/distro=debian/outgoing-mail -type f -mtime +35 -delete work/infra/tag2upload-oracled0000775000000000000000000004463015016262471013441 0ustar #!/usr/bin/perl # -*- fill-column: 78 -*- # tag2upload-oracled -- tag2upload simple Oracle protocol communicator # Copyright (C) 2024-2025 Sean Whitton # Copyright (C) 2025 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 . # usage: # tag2upload-oracled [-D] [--force-production] \ # [--workers=WORKERS] [--no-restart-workers] \ # [--worker-restart-timeout=SECONDS] \ # [--processing-timeout=SECONDS] \ # [--ssh=SSH] \ # [--autopkgtest-virt=autopkgtest-virt-SERVER] \ # [--autopkgtest-arg=VIRT-SERVER-ARG] ... \ # [--retain-tmp] \ # --manager=[USER@]MNGR-HOST \ # --manager-socket=MNGR-SOCK \ # --builder=[USER@]BLDR-HOST \ # --noreply=NOREPLY \ # --reply-to=REPLY-TO \ # --copies=COPIES \ # [--] DISTRO DISTRO-DIR AUTH-SPEC [] # # Option -D may be repeated, e.g. -DDD, to increase the debug level. # --processing-timeout=0 means no timeout, and is the default. # # Uses whatever one ambient gpg key is available. use 5.028; use warnings; use POSIX qw(:errno_h :signal_h strftime WNOHANG); use IPC::Open2; use URI::Escape; use Getopt::Long; use Debian::Dgit::Infra; # must precede Debian::Dgit use Debian::Dgit qw(!fail); use Debian::Dgit::ProtoConn; use subs qw(fail); our ($production, $force_production) = (0, 0); our ($workers_n, $restart_workers, $ssh, $adt_virt) = (1, 1, "ssh", "autopkgtest-virt-null"); our ($processing_timeout, $worker_restart_timeout) = (0, 20); our ($retain_tmp, $manager, $socket, $builder, $noreply, $reply_to, $copies, @adt_args); Getopt::Long::Configure "bundling"; GetOptions # Optional arguments. "D+" => \$debuglevel, "force-production!" => \$force_production, "workers=i" => \$workers_n, "ssh=s" => \$ssh, "autopkgtest-virt|adt-virt=s" => \$adt_virt, "processing-timeout=i" => \$processing_timeout, "worker-restart-timeout=i" => \$worker_restart_timeout, "retain-tmp" => \$retain_tmp, "autopkgtest-arg=s" => \@adt_args, "restart-workers!" => \$restart_workers, # Required arguments. "manager=s" => \$manager, "manager-socket=s" => \$socket, "builder=s" => \$builder, "noreply=s" => \$noreply, "reply-to=s" => \$reply_to, "copies=s" => \$copies; $manager && $socket && $builder && $noreply && $reply_to && $copies or fail "not enough arguments"; @ARGV >= 3 or fail "not enough arguments for dgit-repos-server"; our @drs_args = @ARGV; initdebug "tag2upload-oracled "; enabledebug if $debuglevel; our @fatal_signals = qw(HUP TERM INT QUIT); our $sigset = POSIX::SigSet->new(map { no strict; &{"SIG$_"} } @fatal_signals); our $signing_keyid; our $production_string; # We are expecting to be on a LAN with the Manager & Builder, so be fairly # intolerant of connection issues. our @ssh_opts = qw( -oBatchMode=yes -oConnectTimeout=30 -oServerAliveInterval=120 -oServerAliveCountMax=8 ); sub me () { (my $b = $builder) =~ s/^.+@//; "$b,$$" } sub say_log (@) { # We just output to STDERR for now. Either systemd will pick it up for # its journal, or we will use some kind of remote syslogging. # Either way we will want to be able to inspect the live logs even though # we won't have shell access to the host running this daemon. # # We do only whole lines at once given these eventual expected outputs. printf STDERR "[t2u-oracled %s][%s] %s\n", me, strftime("%FT%T", gmtime), $_ for @_ } sub fail ($) { my $msg = shift; $builder //= "none"; say_log "error: $msg"; die $msg; } # Main procedure. { # Decide whether we are a production or testing instance. # The Manager should not send ordinary user jobs to a testing instance # without manual intervention. # Normally, only a clean install running everything out of dgit.deb and # dgit-infrastructure.deb counts as a production instance. # The output of systemctl's 'show' subcommand is a stable interface. if ($force_production) { $production = 1; } elsif ($ENV{DBUS_SESSION_BUS_ADDRESS} && $ENV{XDG_RUNTIME_DIR}) { my @wanted = qw(MainPID FragmentPath DropInPaths); my $ret = open my $systemctl, "-|", qw(systemctl --user show tag2upload-oracled.service), map "--property=$_", @wanted; if (!$ret) { $! == ENOENT or fail "'systemctl show': $!"; } else { chomp(my @lines = <$systemctl>); close $systemctl or fail "systemctl failed: ".failedcmd_waitstatus(); @lines == @wanted or fail "unexpected number of systemctl output lines"; my %vals; for (@lines) { my ($k, $v) = split /=/, $_, 2; exists $vals{$k} and fail "unexpected systemctl output: repeated $k field"; $vals{$k} = $v // ""; } $vals{$_} // fail "expected $_ in systemctl output" for @wanted; $production = $vals{MainPID} == $$ && $vals{FragmentPath} =~ m#^(?:/usr)?/lib/# && $vals{DropInPaths} eq ""; } } $production_string = $production ? "production" : "testing"; say_log sprintf "instance fidelity=%s", $production_string; -d or mkdir or fail $! for "worker-cwd"; test_signing_key(); # WARNING! Be careful manipulating this without signals blocked! # This variable is used by our signal handlers. # (Right here is OK because we haven't set up the signal handlers yet.) # # Invariants: # 1. Every one of our unreaped children is in this array, # except briefly with signals blocked (while we're forking). # 2. The converse is NOT true - this may contain pids of # workers that we have already reaped! # 3. But *at the start of each iteration of the main loop*, # it contains only (and therefore precisely) our unreaped children. # 4. We reap only (a) in the main loop or (b) with signals blocked, # in a signal handler which will definitely exit rather than return. # Therefore code in the main loop can assume no children # have been reaped other than by the main loop. my @worker_slots = (undef)x$workers_n; foreach my $sig (@fatal_signals) { $SIG{$sig} = sub { say_log "group_leader: received SIG$sig; shutting down workers"; # See the comment for @worker_slots, notably the invariants. # # We mustn't kill anything that isn't actually one of our # children. @worker_slots might contain already-reaped pids. # We can check a pid with waitpid, because we know that # no-one else is reaping in between (given that we block signals). # # We might run this code more than once. So we might send # multiple signals each child. That's OK and intended. block_signals(); kill $sig => grep { # waitpid returns: # -1 Not our child, or doesn't exist. This is normal! # >0 Was our child but we just reaped it. # 0 Is our unfinished. unreaped, child.. # Only in the final case do we want to kill. my $child = waitpid $_, WNOHANG; if ($child > 0) { die "$child != $_" unless $child == $_; report_reaped_worker($child); # The pid remains in @worker_slots, despite being reaped. # This is OK according to our invariants. } !$child } grep defined, @worker_slots; unblock_signals(); exit 0; }; } my $start_worker = sub { # We're forking, and manipulating @worker_slots. # Also, avoid entering our (parent-appropriate) signal handler in # the child right after fork, before the child has reset %SIG. block_signals(); my $free_slot; for my $i (0..$#worker_slots) { if (!defined $worker_slots[$i]) { $free_slot = $i; last; } } $free_slot // fail "No free slot to start worker -- shouldn't happen"; if (my $child = fork // fail $!) { $worker_slots[$free_slot] = $child; unblock_signals(); } else { $SIG{$_} = "DEFAULT" for @fatal_signals; @worker_slots = (); # just in case unblock_signals(); # Jump out of the parent process's lexical scope. worker($free_slot); # worker() should never return, but ensure no grandchild workers. exit 255; } }; for (;;) { # Particularly useful in the test suite: leaked oracleds will die. stat '.' or fail "parent cwd has become inaccessibe: $!"; (stat _)[3] or fail "parent cwd deleted (link count 0), quitting"; # If we have empty worker slots, (re)start worker(s). # # We don't modify @worker_slots in this test, # so this access with signals unblocked is OK. $start_worker->() while grep !defined, @worker_slots; # Now we do nothing until after at least one worker dies, then wait # for a bit longer before going round again to start up a replacement. # We start up one replacement at a time. # # If the worker died then it's probably because either the SSH # connection failed, or there was a bug triggered by the particular # manager request the worker was trying to handle. In both cases it # is fine to restart workers: in the latter case, it's okay because no # state is shared between workers, and the manager shouldn't send the # bug-triggering request again immediately. # # In both cases, though, we want a delay. In the second case this is # to prevent us getting stuck in a pointless tight forking loop if # workers are dying over and over again in quick succession. my $child = wait; $child == -1 and fail "No workers to reap -- shouldn't be possible"; # We're manipulating worker_slots. # We must block signals only now, *after* the wait, # because we need such signals to interrupt the wait. # Hence the possible presence of reaped pids in @worker_slots. block_signals(); my $child_i; for my $i (0..$#worker_slots) { if ((defined $worker_slots[$i]) && $worker_slots[$i] == $child) { $child_i = $i; last; } } if (defined $child_i) { $worker_slots[$child_i] = undef; unblock_signals(); report_reaped_worker($child); # This could become more sophisticated (e.g. exponential backoff) # if necessary, but hopefully things will be reliable enough. fail "group leader: restarting workers disabled" unless $restart_workers; sleep $worker_restart_timeout; } else { unblock_signals(); say_log "group_leader: wait(2) returned unexpected PID $child"; } } } sub worker ($) { my $slot = shift; # Try to establish a connection to the builder right away. If we can't, # then we don't even want to make ourselves available to the manager. my ($virt, $virt_dir, $virt_cmd_enclist, @virt_cmd); my $run_cmd = sub { # Check return value or $?, which are zero on success. # Otherwise, use failedcmd_waitstatus to report the status. $? = -1; system $ssh, @ssh_opts, $builder, shellquote @virt_cmd, @_; }; my $new_virt = sub { # Use autopkgtest's virtualisation server protocol so that we can # easily upgrade the isolation. Spec.: # /usr/share/doc/autopkgtest/README.virtualisation-server.rst.gz # # The protocol requires that we ensure here, in this call to # Debian::Dgit::ProtoConn::open2, that the way we invoke the # virtualisation server will ensure that we have exclusive use of the # testbed. $virt = Debian::Dgit::ProtoConn->open2( $ssh, @ssh_opts, $builder, $adt_virt, @adt_args); $virt->set_description('virt'); $virt->set_fail_hook(sub { (waitpid $virt->get_pid(), WNOHANG) == 0 or say_log "virt-server: ".waitstatusmsg; }); $virt->expect(sub { /^ok$/ }); $virt->send("open"); ($virt_dir) = $virt->expect(sub { /^ok (.+)$/ }); $virt->send("print-execute-command"); ($virt_cmd_enclist) = $virt->expect(sub { /^ok (\S+)/ }); @virt_cmd = map uri_unescape($_), split /,/, $virt_cmd_enclist; $run_cmd->("true"); $? == 0 or fail "Cannot execute commands in builder virt: " .failedcmd_waitstatus(); }; $new_virt->(); # Need our own cwd -- see dgit-repos-server's file header. my $wcwd = "worker-cwd/w$slot"; -d or mkdir or fail $! for $wcwd; chdir $wcwd or fail $!; my $mngr = Debian::Dgit::ProtoConn->open2( $ssh, @ssh_opts, $manager, shellquote qw(nc.openbsd -U -N), $socket ); $mngr->set_description('manager'); $mngr->set_fail_hook( sub { my $msg = shift; (waitpid $mngr->get_pid(), WNOHANG) == 0 or say_log "worker: ssh to manager: ".waitstatusmsg; eval { $mngr->send("protocol-violation $msg") }; say_log sprintf "worker: %s to inform manager: %s", ($@ ? "failed" : "attempted"), $msg; }); $mngr->expect(sub { /^t2u-manager-ready$/ }); $mngr->send("t2u-oracle-version 4"); $mngr->send(sprintf "worker-id %s,w%s %s", me, $slot, $production_string); for (;;) { my ($msg, $payld_id, $payld_pkg, $payld_url) = $mngr->expect(sub { /^(?|(ayt)|(job) ([[:alnum:]][[:alnum:],-.]*) ($package_re) ([[:graph:]]+))$/a }); if ($msg eq "ayt") { # Check the connection to the builder is still up. $virt->send("capabilities"); $virt->expect(sub { /^ok(?: |$)/ }); # Check the hardware token is still working. test_signing_key(); $mngr->send("ack"); } elsif ($msg eq "job") { # Block fatal signals to avoid interrupting actual builds. # (So not to protect @worker_slots - we're the child.) block_signals(); handle_job($mngr, $virt_dir, $virt_cmd_enclist, $payld_id, $payld_pkg, $payld_url); unblock_signals(); # Now stop the autopkgtest-virt-* process, and bring up another # one. This means that we don't have to assume anything about # what capabilities are available, which is more flexible. unless ($retain_tmp) { # Most virtualisation backends will take care of this, but # it's not guaranteed by the protocol. $run_cmd->(qw(rm -rf), $virt_dir); $? == 0 or warn "WARNING: failed to remove $virt_dir in builder virt: " .failedcmd_waitstatus(); } $virt->send("quit"); # Spec says we should expect `ok` but many autopkgtest-virt-* # don't send it. #1092808. Anyway, we can safely waitpid without # risk of deadlock -- the pipe would fit an ok if it sent one. (waitpid $virt->get_pid(), 0) == $virt->get_pid() or fail $!; fail sprintf "autopkgtest virt server: %s", waitstatusmsg() if $?; $new_virt->(); } else { fail "ProtoConn's expect() has failed us"; } } } sub handle_job ($$$$$$) { my ($mngr, $virt_dir, $virt_cmd_enclist, $id, $putative_pkg, $url) = @_; my $tag; $mngr->receive_data_blocks(sub { if ($tag) { # There should not be a second data-block. $mngr->bad("unexpected data-block"); } else { $tag = shift; } }); # Parse it just enough to log something useful. # Leave the real parsing, and emailing, to dgit-repos-server. my ($tag_name) = $tag =~ /^tag (\S+)$/m or fail "couldn't find tag name"; my $log_info = "job=$id package=$putative_pkg tag=$tag_name"; say_log "$log_info url=$url starting"; # The diversion of the code path into dgit-repos-server now is for # historical reasons. While invoking 'dgit rpush-source' is essential to # the design, the parts of dgit-repos-server we use could be refactored # and moved here. my @drs = ($ENV{DGIT_REPOS_SERVER_TEST} // qw(dgit-repos-server), @drs_args, qw(--tag2upload9), $ssh, $builder, $virt_dir, $virt_cmd_enclist, $noreply, $reply_to, $copies, $processing_timeout, $signing_keyid, qw(--), $id, $url, $tag_name, $putative_pkg); say_log "worker: invoking <<@drs>>"; my $drs_child = open2(my $drs_out, my $drs_in, @drs) // fail "failed to start dgit-repos-server: $!"; print $drs_in $tag; close $drs_in; # dgit-repos-server generates the remainder of the protocol messages, but # as this program is ultimately responsible for speaking the simple Oracle # protocol, we validate. my $drs_msg = <$drs_out>; $drs_msg && chomp $drs_msg && $drs_msg =~ /^message / or fail "dgit-repos-server didn't send message"; my $drs_status = <$drs_out>; $drs_status && chomp $drs_status && $drs_status =~ /^(?:irrecoverable|uploaded)$/ or fail "dgit-repos-server didn't send disposition"; <$drs_out> and fail "dgit-repos-server sent too much output"; $drs_out->error and fail $!; say_log "$log_info: ".substr($drs_msg, 8), "$log_info final-disposition=$drs_status"; $mngr->send($_) for $drs_msg, $drs_status; (waitpid $drs_child, 0) == $drs_child or fail $!; fail sprintf "dgit-repos-server %s", waitstatusmsg() if $?; } sub test_signing_key () { # debsign, which dgit-repos-server's dgit call will use, defaults # to looking at the changelog to find a -u option to pass to gnupg, # and there's no way to tell it to not pass any such option. # # Also it's probably a good idea to make sure that we're not implicitly # doing something surprising. # # So, list our secret keys, and insist that there's exactly one, # and pass its keyid to dgit-repos-server to pass to dgit to # pass to debsign. my $keys = cmdoutput qw(gpg --list-secret --with-colons); my @keys = $keys =~ m{^fpr:.*}mg; @keys or fail "no signing keys available"; @keys == 1 or fail "multiple signing keys available"; $signing_keyid = (split /:/, $keys[0])[9]; (defined $signing_keyid) && $signing_keyid =~ m{^[0-9a-f]+$}i or fail "bad output from gnupg $keys[0]"; open my $gpg_in, "|gpg -u$signing_keyid --clearsign >/dev/null" or fail $!; print $gpg_in "Test of signing key."; close $gpg_in or fail "Signing key is not usable: ".failedcmd_waitstatus(); } sub block_signals () { sigprocmask(SIG_BLOCK, $sigset) or fail $! } sub unblock_signals () { sigprocmask(SIG_UNBLOCK, $sigset) or fail $! } sub report_reaped_worker ($) { # Logs a message about worker $pid, using $?. # Doesn't update @worker_slots. say_log sprintf "group_leader worker=%s: %s", shift, waitstatusmsg; } work/mini-git-tag-fsck0000775000000000000000000004417715016262471012111 0ustar #!/usr/bin/python3 # mini-git-tag-fsck # Handling of tag2upload SOURCE_VERSION.git.tar.xz archives # # Copyright (C)2024 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 . import argparse import email import hashlib import itertools import os import re import subprocess import sys import tarfile import tempfile import zlib def audit(tarball, distro, out_txt, out_sig): extract = tempfile.TemporaryDirectory() tb = tarfile.open(name=tarball) # This is similar to using tarfile.data_filter from Python 3.12+. for member in tb.getmembers(): if not (member.isreg() or member.isdir()): raise Exception(f"{tarball} contains non-regular file") if os.path.isabs(member.name): raise Exception(f"{tarball} contains member with absolute name") if not os.path.realpath(os.path.join(extract.name, member.name))\ .startswith(extract.name): raise Exception( f"{tarball} contains member with path-join trickery") tb.extractall(path=extract.name) extract_list = os.listdir(extract.name) if len(extract_list) != 1: raise Exception(f"{tarball} has !=1 top-level members") repo = os.path.join(extract.name, extract_list[0]) def read_obj(expected_type, oid): if re.match(r'^[0-9A-Fa-f]{40}$', oid) is None: raise Exception(f"Found invalid object ID") obj = os.path.join("objects", oid[:2], oid[2:]) head, gen = iter_peel_field(read_deflated(os.path.join(repo, obj))) if (m := re.match(rb'^([a-z]+) (\d+)$', head)) is None: raise Exception(f"{obj} is malformed") actual_type = m.group(1).decode() expected_len = int(m.group(2)) if actual_type != expected_type: raise Exception(f"{obj} is not {expected_type}") h = hashlib.sha1() h.update(head+b"\0") total_len = 0 for data in gen: total_len += len(data) h.update(data) yield data if total_len != expected_len: raise Exception(f"{obj} is corrupt: incorrect length") if h.hexdigest() != oid: raise Exception(f"{obj} is corrupt: checksum mismatch") distro_tags_dir = os.path.join(repo, "refs", "tags", distro) dtags_list = os.listdir(distro_tags_dir) if len(dtags_list) != 1: raise Exception(f"{tarball} has !=1 {distro}/ tags or is not bare") dtag_name = f"{distro}/{dtags_list[0]}" dtag_target = open(os.path.join(distro_tags_dir, dtags_list[0]))\ .read().splitlines()[0] # Avoid using any information from inside the tarball to default these. out_txt = out_txt or tarball+".tag" out_sig = out_sig or out_txt+".asc" headers = True out = tag = [] sig = [] dtag_commit = dtag_type = dtag_tag = None # read_obj validates dtag_target, checking it's a valid Git object name. for line in iter_slurp_lines(read_obj("tag", dtag_target)): if headers: if line.startswith("object "): if dtag_commit: raise Exception( f"Multiple 'object' headers in {dtag_target}") else: dtag_commit = line[7:] elif line.startswith("type "): if dtag_type: raise Exception( f"Multiple 'type' headers in {dtag_target}") elif (dtag_type := line[5:]) != "commit": raise NotImplementedError( "DEP-14 tag points to a non-commit") elif line.startswith("tag "): if dtag_tag: raise Exception( f"Multiple 'tag' headers in {dtag_target}") elif (dtag_tag := line[4:]) != dtag_name: raise Exception("Conflicting names for the DEP-14 tag") elif len(line) == 0: headers = False elif line == "-----BEGIN PGP SIGNATURE-----": out = sig out.append(line+"\n") if not dtag_commit: raise Exception("DEP-14 tag does not point to a commit") dtag_tree = None # read_obj validates dtag_commit, checking it's a valid Git object name. for line in iter_slurp_lines(read_obj("commit", dtag_commit)): if line.startswith("tree "): if dtag_tree: raise Exception(f"Multiple 'tree' headers in {dtag_commit}") else: dtag_tree = line[5:] elif len(line) == 0: break if not dtag_tree: raise Exception(f"{dtag_commit} does not point to a tree") def ls_tree(parent, tree): tree = read_obj("tree", tree) while True: try: item, tree = iter_peel_field(tree) sha1, tree = iter_peel_bytes(20, tree) except StopIteration: return mode, entry = item.decode().split(" ", 1) entry = os.path.join(parent, entry) sha1 = format(int.from_bytes(sha1, byteorder="big"), "040x") if mode == "40000": ls_tree(entry, sha1) elif mode in ("100755", "100644", "120000"): # Iterate through it in order to verify its checksum. for data in read_obj("blob", sha1): pass sys.stdout.write(f"{mode} {sha1} {entry}\0") else: raise Exception(f"Invalid tree entry mode") ls_tree("", dtag_tree) # Avoid writing these files out unless all ls_tree() checks passed. # This actually closes the handles, s.t. if, e.g., ENOSPC, we will die. with open(out_txt, "w") as f: f.writelines(tag) with open(out_sig, "w") as f: f.writelines(sig) # While tags, commits and trees oughtn't be too big, # we should avoid loading huge blobs into memory all at once. def read_deflated(path): decomp = zlib.decompressobj() with open(path, "rb") as f: while buf := f.read(2**16): if data := decomp.decompress(buf): yield data if data := decomp.flush(): yield data def iter_slurp_lines(binary_iterable): return "".join(map(lambda x: x.decode(), binary_iterable)).splitlines() def iter_peel_bytes(nbytes, binary_iterable): """Where binary_iterable is an iterable yielding chunks of bytes from a stream of bytes, read nbytes bytes from the stream, and return a pair of the first nbytes bytes and an iterable yielding the stream's remaining bytes. """ buf = b"" while len(buf) < nbytes: buf += next(binary_iterable) # Minor optimisation: don't cons up a fresh [b""] and don't call # itertools.chain if we already have exactly nbytes. if len(buf) == nbytes: return buf, binary_iterable else: return buf[:nbytes], itertools.chain([buf[nbytes:]], binary_iterable) def iter_peel_field(binary_iterable): """Where binary_iterable is an iterable yielding chunks of bytes from a stream of bytes, efficiently read bytes from the stream until end-of-file or the next null byte. Return a pair of the bytes read and a iterable yielding the stream's remaining bytes. Note that this means skipping over the null byte itself. """ buf = [next(binary_iterable)] try: while b"\0" not in buf[-1]: buf.append(next(binary_iterable)) except StopIteration: pass buf = b"".join(buf) try: first = buf.index(b"\0") except ValueError: return buf, binary_iterable # Minor optimisation: don't cons up a fresh [b""] and don't call # itertools.chain if the null byte was the last byte read from the stream. if first < len(buf)-1: binary_iterable = itertools.chain([buf[first+1:]], binary_iterable) return buf[:first], binary_iterable def prepare(repo, distro, out_tar, deepen_to, utag_name, utag_target, dfiles): # For --audit mode, we must require only core modules. import pygit2 orig_repo = pygit2.Repository(repo) orig_repo_dir = os.path.abspath(repo) out_repo_parent = tempfile.TemporaryDirectory() source, version = dpkg_parsechangelog(repo) fn_version = re.sub(r'^\d+:', "", version) fn_upstream_version = re.sub("-.+$", "", fn_version) pkg_dir_name = f"{source}-{fn_upstream_version}" out_repo_dir = os.path.join(out_repo_parent.name, pkg_dir_name) out_repo = pygit2.init_repository(out_repo_dir, bare=True) def get_tag(tag): if not tag.startswith("refs/tags/"): tag = f"refs/tags/{tag}" try: return orig_repo.get(orig_repo.lookup_reference(tag).target) except KeyError: raise Exception(f"Couldn't find {tag} in {orig_repo_dir}") def fetch_tag(tag, depth): run_git(out_repo_dir, "fetch", f"--depth={depth}", "origin", "tag", tag) dtag_name = f"{distro}/{dep14_version(version)}" orig_dtag = get_tag(dtag_name) orig_dtag_obj = orig_dtag.get_object() # It would be nicer to use # # remote = out_repo.remotes.create_anonymous() # # here and then call # # remote.fetch(depth=1, refspecs=[ # f"refs/tags/{dtag_name}:refs/tags/{dtag_name}"]) # # rather than creating and deleting a true remote, but this # is broken: https://github.com/libgit2/pygit2/issues/1314 out_repo.remotes.create("origin", f"file://{orig_repo_dir}") # We now decide exactly what to fetch so that we get enough history. # What we already know how to do is include the history back to the # upstream tag. If that's not enough history for our purposes, we # rely on the caller passing us --deepen-to arguments. # This is to avoid having to teach mini-git-tag-fsck about quilt modes. # # You might think that it would be possible to achieve what we want using # just the --depth and --shallow-exclude options to 'git fetch'. # Investigation led me to believe that this (slightly) more complicated # 'git log --ancestry-path'-based algorithm is in fact needed. # # This implementation has git shallowly fetch down each side of each merge # commit between the dep14 tag and each commit to which we're deepening. # Commonly there will be no such merge commits. In the case that there # are, we might be able to pull in less as follows: walk each ancestry # path and collect the other side of each merge, i.e., the side we don't # care about. Pass a --shallow-exclude option to 'git fetch' for each. required_depth = 0 def ancestry_depth(revision_range): ancestry_path = run_git( orig_repo_dir, "log", "--ancestry-path", "--pretty=%H", revision_range) return len(ancestry_path.stdout.splitlines()) if utag_name: fetch_tag(utag_name, 1) udepth = ancestry_depth(f"{utag_name}..{dtag_name}") if udepth > 0: required_depth = udepth elif ancestry_depth(f"{dtag_name}..{utag_name}") > 0: raise Exception("Upstream tag is descendant of dep14 tag?!") if deepen_to: for committish in deepen_to: cdepth = ancestry_depth(f"{committish}..{dtag_name}") if cdepth == 0: raise Exception( "Expected {committish} to be ancestor of {dtag_name}") elif cdepth > required_depth: required_depth = cdepth required_depth += 1 stderrln(f">> Copying {dtag_name} to depth {required_depth}") fetch_tag(dtag_name, required_depth) out_repo.remotes.delete("origin") # Begin by unpacking everything. # There is no way to prevent the occurrence of packing when fetching, so # we have to do this repacking afterwards. pack = os.path.join(out_repo_dir, "objects", "pack") handles = [] for f in os.listdir(path=pack): f = os.path.join(pack, f) if f.endswith(".pack"): handles.append(open(f, "r")) # We have to unlink now because git-unpack-objects(1) will # skip over objects already in the repository. os.unlink(f) for h in handles: subprocess.run(["git", "-C", out_repo_dir, "unpack-objects"], stdin=h, check=True) # Now we pack everything that 'mini-git-tag-fsck --audit' *doesn't* need. needed = {str(oid) for oid in [orig_dtag.id, orig_dtag_obj.id, orig_dtag_obj.tree_id]} for line in run_git(out_repo_dir, "ls-tree", "-r", "-t", "--object-only", str(orig_dtag_obj.tree_id)).stdout.splitlines(): needed.add(line.decode()) all_objs = run_git(out_repo_dir, "cat-file", "--batch-check=%(objectname)", "--batch-all-objects", "--unordered").stdout.splitlines() def delegate(builder): for obj in all_objs: obj = obj.decode() if obj not in needed: builder.add(pygit2.Oid(hex=obj)) stderr(">> Re-packing ... ") packed = out_repo.pack(pack_delegate=delegate, n_threads=0) # ncpus stderrln(f"packed {packed} objects not required for --audit") run_git(out_repo_dir, "prune-packed") tar = f"{source}_{fn_version}.git.tar.xz" default_out_tar = os.path.abspath(f"../{tar}") out_tar = out_tar or default_out_tar stderr(">> Starting compression ... ") tarfile.open(name=out_tar, mode="w:xz")\ .add(out_repo_dir, arcname=pkg_dir_name) stderrln("done") # Write to d/files such that dpkg-genchanges will pick up our .git.tar.xz. # Note that this is ignored by 'dpkg-genchanges -S'. if dfiles: dctrl = os.path.join(orig_repo_dir, "debian", "control") dfiles = os.path.join(orig_repo_dir, "debian", "files") with open(dctrl, "r") as f: control = email.message_from_file(f) with open(dfiles, "a") as f: line = f'{tar} {control["Section"]} {control["Priority"]}' stderrln(f">> Appending '{line}' to debian/files") print(line, file=f) def dpkg_parsechangelog(dir): msg = email.message_from_bytes( subprocess.run("dpkg-parsechangelog", stdout=subprocess.PIPE, cwd=dir, check=True).stdout) return msg["Source"], msg["Version"] def dep14_version(ver): return re.sub("\\.(?=\\.|$|lock$)", ".#", ver.translate(str.maketrans(":~", "%_"))) # This is for when pygit2 doesn't wrap something. def run_git(repo, *args): return subprocess.run(["git", "-C", repo, *args], stdout=subprocess.PIPE, check=True) def stderr(arg): sys.stderr.write(arg) sys.stderr.flush() def stderrln(*args): print(*args, file=sys.stderr) if __name__ == "__main__": parser = argparse.ArgumentParser( description="\ Handling of tag2upload SOURCE_VERSION.git.tar.xz archives") # Can't pass a title= directly to add_mutually_exclusive_group. desc = parser.add_argument_group(title="mode of operation") mode = desc.add_mutually_exclusive_group(required=True) mode.add_argument( "--audit", metavar="TARBALL", help="print 'git ls-files -z'-style output, extract tag text & sig") mode.add_argument( "--prepare", metavar="REPO", help="produce .git.tar.xz for upload (called by t2u server-side)", nargs="?", const=".") files = parser.add_argument_group( title="optional arguments for output file names") files.add_argument( "--out-txt", metavar="FILE", help="in --audit mode, file for the tag's text") files.add_argument( "--out-sig", metavar="FILE", help="in --audit mode, file for the tag's signature") files.add_argument( "--out-tar", metavar="FILE", help="in --prepare mode, file for the .git.tar.xz") prepare_args = parser.add_argument_group( title="optional arguments for --prepare mode") prepare_args.add_argument( "--deepen-to", metavar="COMMITTISH", nargs="*", help="deepen the clone down to each COMMITTISH") prepare_args.add_argument( "--upstream", metavar="TAG", help="the upstream= value from the maintainer's tag") prepare_args.add_argument( "--upstream-commit", metavar="COMMIT", help="the upstream-commit= value from the maintainer's tag") prepare_args.add_argument( "--not-for-upload", help="do not write to debian/files") other_args = parser.add_argument_group(title="other optional arguments") other_args.add_argument( "--distro", metavar="DISTRO", help="the distro name: 'debian' by default", nargs="?", default="debian", const="debian") args = parser.parse_args() if (args.upstream is None) != (args.upstream_commit is None): raise Exception("--upstream without --upstream-commit or vice-versa") if args.audit: if args.out_tar: stderrln("--out-tar argument ignored in --audit mode") if args.deepen_to: stderrln("--deepen-to argument ignored in --audit mode") if args.upstream: stderrln("--upstream argument ignored in --audit mode") if args.upstream_commit: stderrln("--upstream-commit argument ignored in --audit mode") if args.not_for_upload: stderrln("--not-for-upload argument ignored in --audit mode") audit(args.audit, args.distro, args.out_txt, args.out_sig) elif args.prepare: if args.out_txt: stderrln("--out-txt argument ignored in --prepare mode") if args.out_sig: stderrln("--out-sig argument ignored in --prepare mode") prepare(args.prepare, args.distro, args.out_tar, args.deepen_to, args.upstream, args.upstream_commit, not args.not_for_upload) work/po/0000775000000000000000000000000015016262471007352 5ustar work/po/.gitignore0000664000000000000000000000005415016262471011341 0ustar .*.make .*.potfiles .*.pot .*.tmp .*.new mo work/po/Makefile0000664000000000000000000000741215016262471011016 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, please 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/README0000664000000000000000000001044315016262471010234 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 defining 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.po0000664000000000000000000017510215016262471010731 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: 2025-05-07 18:40+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:296 #, perl-format msgid "%s: invalid configuration: %s\n" msgstr "" #: ../dgit:303 msgid "warning: overriding problem due to --force:\n" msgstr "" #: ../dgit:311 #, perl-format msgid "warning: skipping checks or functionality due to --force-%s\n" msgstr "" #: ../dgit:316 #, perl-format msgid "%s: source package %s does not exist in suite %s\n" msgstr "" #: ../dgit:589 #, perl-format msgid "build host child %s" msgstr "" #: ../dgit:648 #, perl-format msgid "%s ok: %s" msgstr "" #: ../dgit:650 #, perl-format msgid "would be ok: %s (but dry run only)" msgstr "" #: ../dgit:675 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-source [dgit-opts] [suite]\n" " dgit [dgit-opts] push-built [dgit-opts] [suite]\n" " dgit [dgit-opts] rpush-source|rpush-built 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:694 msgid "Perhaps the upload is stuck in incoming. Using the version from git.\n" msgstr "" #: ../dgit:698 #, perl-format msgid "" "%s: %s\n" "%s" msgstr "" #: ../dgit:703 msgid "too few arguments" msgstr "" #: ../dgit:825 #, perl-format msgid "multiple values for %s (in %s git config)" msgstr "" #: ../dgit:828 #, perl-format msgid "value for config option %s (in %s git config) contains newline(s)!" msgstr "" #: ../dgit:848 #, perl-format msgid "" "need value for one of: %s\n" "%s: distro or suite appears not to be (properly) supported" msgstr "" #: ../dgit:905 #, perl-format msgid "bad syntax for (nominal) distro `%s' (does not match %s)" msgstr "" #: ../dgit:920 #, perl-format msgid "backports-quirk needs % or ( )" msgstr "" #: ../dgit:936 #, perl-format msgid "%s needs t (true, y, 1) or f (false, n, 0) not `%s'" msgstr "" #: ../dgit:956 msgid "readonly needs t (true, y, 1) or f (false, n, 0) or a (auto)" msgstr "" #: ../dgit:974 #, perl-format msgid "unknown %s `%s'" msgstr "" #: ../dgit:979 ../git-debrebase:1548 ../Debian/Dgit.pm:255 msgid "internal error" msgstr "" #: ../dgit:981 msgid "pushing but distro is configured readonly" msgstr "" #: ../dgit:985 msgid "" "Push failed, before we got started.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:1008 #, perl-format msgid "" "dgit: quilt mode `%s' (for format `%s') implies split view, but split-view " "set to `%s'" msgstr "" #: ../dgit:1169 msgid "this operation does not support multiple comma-separated suites" msgstr "" #: ../dgit:1237 #, perl-format msgid "fetch of %s failed (%s): %s" msgstr "" #: ../dgit:1244 #, perl-format msgid "fetch of %s gave HTTP code %s" msgstr "" #: ../dgit:1265 msgid "ftpmasterapi archive query method takes no data part" msgstr "" #: ../dgit:1283 #, perl-format msgid "unknown suite %s, maybe -d would help" msgstr "" #: ../dgit:1287 #, perl-format msgid "multiple matches for suite %s\n" msgstr "" #: ../dgit:1289 #, perl-format msgid "suite %s info has no codename\n" msgstr "" #: ../dgit:1291 #, perl-format msgid "suite %s maps to bad codename\n" msgstr "" #: ../dgit:1293 ../dgit:1318 msgid "bad ftpmaster api response: " msgstr "" #: ../dgit:1307 #, perl-format msgid "bad version: %s\n" msgstr "" #: ../dgit:1309 msgid "bad component" msgstr "" #: ../dgit:1312 msgid "bad filename" msgstr "" #: ../dgit:1314 msgid "bad sha256sum" msgstr "" #: ../dgit:1365 msgid "aptget archive query method takes no data part" msgstr "" #: ../dgit:1449 #, 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:1473 #, perl-format msgid "Release file (%s) specifies intolerable %s" msgstr "" #: ../dgit:1499 msgid "apt-get source did not produce a .dsc" msgstr "" #: ../dgit:1500 #, perl-format msgid "apt-get source produced several .dscs (%s)" msgstr "" #: ../dgit:1605 #, 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:1744 #, perl-format msgid "cannot operate on %s suite" msgstr "" #: ../dgit:1747 #, perl-format msgid "canonical suite name for %s is %s" msgstr "" #: ../dgit:1749 #, perl-format msgid "canonical suite name is %s" msgstr "" #: ../dgit:1769 #, perl-format msgid "%s has hash %s but archive told us to expect %s" msgstr "" #: ../dgit:1775 #, perl-format msgid "unsupported source format %s, sorry" msgstr "" #: ../dgit:1802 #, perl-format msgid "diverting to %s (using config for %s)" msgstr "" #: ../dgit:1825 #, perl-format msgid "unknown git-check `%s'" msgstr "" #: ../dgit:1840 #, perl-format msgid "unknown git-create `%s'" msgstr "" #: ../dgit:1884 #, perl-format msgid "%s: warning: removing from %s: %s\n" msgstr "" #: ../dgit:1930 #, perl-format msgid "could not parse .dsc %s line `%s'" msgstr "" #: ../dgit:1941 #, perl-format msgid "missing any supported Checksums-* or Files field in %s" msgstr "" #: ../dgit:1987 #, perl-format msgid "hash or size of %s varies in %s fields (between: %s)" msgstr "" #: ../dgit:1996 #, perl-format msgid "file list in %s varies between hash fields!" msgstr "" #: ../dgit:2000 #, perl-format msgid "%s has no files list field(s)" msgstr "" #: ../dgit:2006 #, perl-format msgid "no file appears in all file lists (looked in: %s)" msgstr "" #: ../dgit:2046 #, perl-format msgid "purportedly source-only changes has Architecture: %s\n" msgstr "" #: ../dgit:2057 #, perl-format msgid "purportedly source-only changes polluted by %s\n" msgstr "" #: ../dgit:2069 msgid "cannot find section/priority from .changes Files field" msgstr "" #: ../dgit:2082 msgid "" "archive does not support .orig check; hope you used --ch:--sa/-sd if needed\n" msgstr "" #: ../dgit:2098 #, perl-format msgid ".dsc %s missing entry for %s" msgstr "" #: ../dgit:2103 #, perl-format msgid "%s: %s (archive) != %s (local .dsc)" msgstr "" #: ../dgit:2111 #, perl-format msgid "archive %s: %s" msgstr "" #: ../dgit:2118 #, perl-format msgid "archive contains %s with different checksum" msgstr "" #: ../dgit:2146 #, perl-format msgid "edited .changes for archive .orig contents: %s %s" msgstr "" #: ../dgit:2154 #, perl-format msgid "[new .changes left in %s]" msgstr "" #: ../dgit:2157 #, perl-format msgid "%s already has appropriate .orig(s) (if any)" msgstr "" #: ../dgit:2179 #, perl-format msgid "" "unexpected commit author line format `%s' (was generated from changelog " "Maintainer field)" msgstr "" #: ../dgit:2202 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:2214 #, perl-format msgid "" "Found active distro-specific series file for %s (%s): %s, cannot continue" msgstr "" #: ../dgit:2245 msgid "Dpkg::Vendor `current vendor'" msgstr "" #: ../dgit:2247 msgid "(base) distro being accessed" msgstr "" #: ../dgit:2249 msgid "(nominal) distro being accessed" msgstr "" #: ../dgit:2254 #, perl-format msgid "build-products-dir %s is not accessible: %s\n" msgstr "" #: ../dgit:2292 #, perl-format msgid "%s: multiple representations of similar orig %s:\n" msgstr "" #: ../dgit:2296 #, perl-format msgid " %s: in %s (%s)\n" msgstr "" #: ../dgit:2301 msgid "Duplicate/inconsistent orig tarballs. Delete the spurious ones." msgstr "" #: ../dgit:2318 #, perl-format msgid "" "%s: found orig(s) in .. missing from build-products-dir, transferring:\n" msgstr "" #: ../dgit:2322 #, perl-format msgid "check orig file %s in bpd %s: %s" msgstr "" #: ../dgit:2324 #, perl-format msgid "check orig file %s in ..: %s" msgstr "" #: ../dgit:2327 #, perl-format msgid "check target of orig symlink %s in ..: %s" msgstr "" #: ../dgit:2336 #, perl-format msgid "%s: cloned orig symlink from ..: %s\n" msgstr "" #: ../dgit:2340 #, perl-format msgid "%s: hardlinked orig from ..: %s\n" msgstr "" #: ../dgit:2343 #, perl-format msgid "failed to make %s a hardlink to %s: %s" msgstr "" #: ../dgit:2349 #, perl-format msgid "%s: symmlinked orig from .. on other filesystem: %s\n" msgstr "" #: ../dgit:2364 msgid "package changelog" msgstr "" #: ../dgit:2469 #, perl-format msgid "dgit (child): exec %s: %s" msgstr "" #: ../dgit:2532 msgid "package changelog has no entries!" msgstr "" #: ../dgit:2537 #, perl-format msgid "" "warning: unable to find/parse changelog entry for first import of %s:\n" "%s\n" msgstr "" #: ../dgit:2608 ../dgit:2613 #, perl-format msgid "accessing %s: %s" msgstr "" #: ../dgit:2630 ../dgit:2637 #, perl-format msgid "saving %s: %s" msgstr "" #: ../dgit:2663 ../dgit:6701 msgid "source package" msgstr "" #: ../dgit:2743 #, perl-format msgid "%s: trying slow absurd-git-apply..." msgstr "" #: ../dgit:2796 #, perl-format msgid "%s failed: %s\n" msgstr "" #: ../dgit:2814 #, 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:2834 #, perl-format msgid "synthesised git commit from .dsc %s" msgstr "" #: ../dgit:2838 msgid "Import of source package" msgstr "" #: ../dgit:2858 #, 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:2900 #, perl-format msgid "using existing %s" msgstr "" #: ../dgit:2904 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (perhaps you should delete this " "file?)" msgstr "" #: ../dgit:2908 #, perl-format msgid "need to fetch correct version of %s" msgstr "" #: ../dgit:2924 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (got wrong file from archive!)" msgstr "" #: ../dgit:3019 msgid "too many iterations trying to get sane fetch!" msgstr "" #: ../dgit:3034 #, perl-format msgid "warning: git ls-remote %s reported %s; this is silly, ignoring it.\n" msgstr "" #: ../dgit:3078 #, perl-format msgid "warning: git fetch %s created %s; this is silly, deleting it.\n" msgstr "" #: ../dgit:3093 #, 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:3098 #, 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:3245 #, perl-format msgid "not chasing .dsc distro %s: not fetching %s" msgstr "" #: ../dgit:3250 #, perl-format msgid ".dsc names distro %s: fetching %s" msgstr "" #: ../dgit:3255 #, 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:3265 #, 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:3285 msgid "rewrite map" msgstr "" #: ../dgit:3292 msgid "server's git history rewrite map contains a relevant entry!" msgstr "" #: ../dgit:3296 msgid "using rewritten git hash in place of .dsc value" msgstr "" #: ../dgit:3298 msgid "server data says .dsc hash is to be disregarded" msgstr "" #: ../dgit:3305 msgid "additional commits" msgstr "" #: ../dgit:3308 #, perl-format msgid "" ".dsc Dgit metadata requires commit %s\n" "but we could not obtain that object anywhere.\n" msgstr "" #: ../dgit:3333 msgid "last upload to archive" msgstr "" #: ../dgit:3337 msgid "no version available from the archive" msgstr "" #: ../dgit:3420 msgid "dgit suite branch on dgit git server" msgstr "" #: ../dgit:3427 msgid "dgit client's archive history view" msgstr "" #: ../dgit:3432 msgid "Dgit field in .dsc from archive" msgstr "" #: ../dgit:3460 #, 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:3473 msgid "archive .dsc names newer git commit" msgstr "" #: ../dgit:3476 msgid "archive .dsc names other git commit, fixing up" msgstr "" #: ../dgit:3497 #, perl-format msgid "" "\n" "Package not found in the archive, but has allegedly been pushed using dgit.\n" "%s\n" msgstr "" #: ../dgit:3506 #, 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:3591 #, perl-format msgid "" "Record %s (%s) in archive suite %s\n" "\n" "Record that\n" msgstr "" #: ../dgit:3604 msgid "should be treated as descended from\n" msgstr "" #: ../dgit:3622 msgid "dgit repo server tip (last push)" msgstr "" #: ../dgit:3624 msgid "local tracking tip (last fetch)" msgstr "" #: ../dgit:3635 #, 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:3650 msgid "fetched source tree" msgstr "" #: ../dgit:3686 msgid "debian/changelog merge driver" msgstr "" #: ../dgit:3751 msgid "" "[attr]dgit-defuse-attrs already found, and proper, in .git/info/attributes\n" " not doing further gitattributes setup\n" msgstr "" #: ../dgit:3765 msgid "# ^ see GITATTRIBUTES in dgit(7) and dgit setup-new-tree in dgit(1)\n" msgstr "" #: ../dgit:3780 #, perl-format msgid "install %s: %s" msgstr "" #: ../dgit:3807 #, perl-format msgid "" "dgit: warning: %s contains .gitattributes\n" "dgit: .gitattributes not (fully) defused. Recommended: dgit setup-new-" "tree.\n" msgstr "" #: ../dgit:3829 #, perl-format msgid "fetching %s..." msgstr "" #: ../dgit:3837 #, perl-format msgid "failed to obtain %s: %s" msgstr "" #: ../dgit:3876 #, perl-format msgid "package %s missing in (base suite) %s" msgstr "" #: ../dgit:3908 msgid "local combined tracking branch" msgstr "" #: ../dgit:3910 msgid "archive seems to have rewound: local tracking branch is ahead!" msgstr "" #: ../dgit:3949 #, perl-format msgid "" "Combine archive branches %s [dgit]\n" "\n" "Input branches:\n" msgstr "" #: ../dgit:3963 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:3978 #, perl-format msgid "calculated combined tracking suite %s" msgstr "" #: ../dgit:3996 #, perl-format msgid "ready for work in %s" msgstr "" #: ../dgit:4014 msgid "dry run makes no sense with clone" msgstr "" #: ../dgit:4029 #, perl-format msgid "create `%s': %s" msgstr "" #: ../dgit:4041 msgid "fetching existing git history" msgstr "" #: ../dgit:4044 msgid "starting new git history" msgstr "" #: ../dgit:4069 #, 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:4074 #, perl-format msgid "fetched into %s" msgstr "" #: ../dgit:4087 #, perl-format msgid "Merge from %s [dgit]" msgstr "" #: ../dgit:4089 #, perl-format msgid "fetched to %s and merged into HEAD" msgstr "" #: ../dgit:4097 #, perl-format msgid "git tree contains %s" msgstr "" #: ../dgit:4108 msgid "you have uncommitted changes to critical files, cannot continue:\n" msgstr "" #: ../dgit:4127 #, 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:4144 msgid "nothing quilty to commit, ok." msgstr "" #: ../dgit:4147 msgid " (wanted to commit patch update)" msgstr "" #: ../dgit:4151 msgid "" "Commit Debian 3.0 (quilt) metadata\n" "\n" msgstr "" #: ../dgit:4189 #, perl-format msgid "" "Not doing any fixup of `%s' due to ----no-quilt-fixup or --quilt=nocheck" msgstr "" #: ../dgit:4194 #, perl-format msgid "Format `%s', need to check/update patch stack" msgstr "" #: ../dgit:4204 #, perl-format msgid "commit id %s" msgstr "" #: ../dgit:4210 #, perl-format msgid "and left in %s" msgstr "" #: ../dgit:4236 #, perl-format msgid "Wanted tag %s (%s) on dgit server, but not found\n" msgstr "" #: ../dgit:4239 #, perl-format msgid "Wanted tag %s (one of: %s) on dgit server, but not found\n" msgstr "" #: ../dgit:4247 #, perl-format msgid "%s (%s) .. %s (%s) is not fast forward\n" msgstr "" #: ../dgit:4256 msgid "version currently in archive" msgstr "" #: ../dgit:4265 #, perl-format msgid "Checking package changelog for archive version %s ..." msgstr "" #: ../dgit:4274 #, perl-format msgid "%s field from dpkg-parsechangelog %s" msgstr "" #: ../dgit:4285 #, perl-format msgid "Perhaps debian/changelog does not mention %s ?" msgstr "" #: ../dgit:4288 #, perl-format msgid "" "%s is %s\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" #: ../dgit:4293 #, perl-format msgid "" "d/changelog entry for %s is unfinalised!\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" #: ../dgit:4307 #, perl-format msgid "Declaring that HEAD includes all changes in %s..." msgstr "" #: ../dgit:4363 msgid "Checking that HEAD includes all changes in archive..." msgstr "" #: ../dgit:4372 msgid "maintainer view tag" msgstr "" #: ../dgit:4374 msgid "dgit view tag" msgstr "" #: ../dgit:4375 msgid "current archive contents" msgstr "" #: ../dgit:4388 msgid "" "| Not fast forward; maybe --trust-changelog is needed ? Please see " "dgit(1).\n" msgstr "" #: ../dgit:4398 #, perl-format msgid "Declare fast forward from %s\n" msgstr "" #: ../dgit:4399 #, perl-format msgid "Make fast forward from %s\n" msgstr "" #: ../dgit:4403 #, perl-format msgid "Made pseudo-merge of %s into dgit view." msgstr "" #: ../dgit:4416 #, perl-format msgid "Declare fast forward from %s" msgstr "" #: ../dgit:4424 #, perl-format msgid "Make pseudo-merge of %s into your HEAD." msgstr "" #: ../dgit:4439 #, perl-format msgid "%s field `%s' is not expected `%s'" msgstr "" #: ../dgit:4471 #, perl-format msgid "%s is for %s %s but debian/changelog is for %s %s" msgstr "" #: ../dgit:4514 #, perl-format msgid "DEP-14 tag %s does not exist (--dep14tag-reuse=%s)" msgstr "" #: ../dgit:4528 #, perl-format msgid "" "%s: making fresh DEP-14 tag %s (--dep14tag-reuse=%s), since existing tag " "unsuitable: %s" msgstr "" #: ../dgit:4538 #, perl-format msgid "existing DEP-14 tag %s is unsuitable (--dep14tag-reuse=%s): %s" msgstr "" #: ../dgit:4559 #, perl-format msgid "refers to commit %s, not %s" msgstr "" #: ../dgit:4569 #, perl-format msgid "verification failed: git verify-tag: %s" msgstr "" #: ../dgit:4623 #, perl-format msgid "%s already contains field %s" msgstr "" #: ../dgit:4655 #, perl-format msgid "changes field %s `%s' does not match changelog `%s'" msgstr "" #: ../dgit:4711 #, perl-format msgid "(maintainer view tag generated by dgit --quilt=%s)\n" msgstr "" #: ../dgit:4784 #, perl-format msgid "" "warning: server says object %s type %s is tainted, but here it has type %s\n" msgstr "" #: ../dgit:4817 msgid "commit" msgstr "" #: ../dgit:4819 #, perl-format msgid "object within commit %s" msgstr "" #: ../dgit:4827 msgid "pushing tainted objects (which server would reject)" msgstr "" #: ../dgit:4835 msgid "" "Push failed, while checking state of the archive.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:4845 msgid "" "package appears to be new in this suite; if this is intentional, use --new" msgstr "" #: ../dgit:4850 msgid "" "Push failed, while preparing your push.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:4869 #, perl-format msgid "looked for .dsc %s, but %s; maybe you forgot to build" msgstr "" #: ../dgit:4885 #, perl-format msgid "" "Branch is managed by git-debrebase (%s\n" "exists), but quilt mode (%s) implies a split view.\n" "Pass the right --quilt option or adjust your git config.\n" "Or, maybe, run git-debrebase forget-was-ever-debrebase.\n" msgstr "" #: ../dgit:4904 #, perl-format msgid "" "You seem to be trying to push an old version.\n" "Version current in archive: %s (in suite %s)\n" "Version you are trying to upload: %s\n" msgstr "" #: ../dgit:4918 #, perl-format msgid "" "--quilt=%s but no cached dgit view:\n" " perhaps HEAD changed since dgit build[-source] ?" msgstr "" #: ../dgit:4954 msgid "" "dgit push: HEAD is not a descendant of the archive's version.\n" "To overwrite the archive's contents, pass --trust-changelog, or --" "overwrite=VERSION.\n" "To rewrite history, if permitted by the archive, use --deliberately-not-fast-" "forward." msgstr "" #: ../dgit:4969 #, perl-format msgid "" "\n" "Version %s has already been tagged (pushed?)\n" "If this was a failed (or incomplete or rejected) upload by you, just\n" "add a new changelog stanza for a new version number and try again.\n" msgstr "" #: ../dgit:4975 #, perl-format msgid "Tag %s already exists.\n" msgstr "" #: ../dgit:4980 #, perl-format msgid "checking that %s corresponds to HEAD" msgstr "" #: ../dgit:5014 ../dgit:5026 #, perl-format msgid "HEAD specifies a different tree to %s:\n" msgstr "" #: ../dgit:5020 #, perl-format msgid "" "There is a problem with your source tree (see dgit(7) for some hints).\n" "To see a full diff, run git diff %s %s\n" msgstr "" #: ../dgit:5030 #, perl-format msgid "" "Perhaps you forgot to build. Or perhaps there is a problem with your\n" " source tree (see dgit(7) for some hints). To see a full diff, run\n" " git diff %s %s\n" msgstr "" #: ../dgit:5041 #, perl-format msgid "" "failed to find unique changes file (looked for %s in %s); perhaps you need " "to use dgit -C" msgstr "" #: ../dgit:5063 msgid "uploading binaries, although distro policy is source only" msgstr "" #: ../dgit:5067 msgid "source-only upload, although distro policy requires .debs" msgstr "" #: ../dgit:5071 #, perl-format msgid "" "source-only upload, though package appears entirely NEW\n" "(this is probably contrary to policy in %s)" msgstr "" #: ../dgit:5078 #, perl-format msgid "unknown source-only-uploads policy `%s'" msgstr "" #: ../dgit:5085 #, perl-format msgid "policy-query-supported-ssh value '%s' must be false/true/unknown" msgstr "" #: ../dgit:5148 msgid "" "Push failed, while signing the tag.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:5175 msgid "" "Push failed, *after* signing the tag.\n" "If you want to try again, you should use a new version number.\n" msgstr "" #: ../dgit:5194 msgid "" "Push failed, while updating the remote git repository - see messages above.\n" "If you want to try again, you should use a new version number.\n" msgstr "" #: ../dgit:5211 msgid "" "Push failed, while obtaining signatures on the .changes and .dsc.\n" "If it was just that the signature failed, you may try again by using\n" "debsign by hand to sign the changes file (see the command dgit tried,\n" "above), and then dput that changes file to complete the upload.\n" "If you need to change the package, you must use a new version number.\n" msgstr "" #: ../dgit:5229 #, perl-format msgid "[new .dsc & .changes left in %s.tmp, %s.tmp]" msgstr "" #: ../dgit:5236 #, perl-format msgid "" "Push failed, while uploading package(s) to the archive server.\n" "You can retry the upload of exactly these same files with dput of:\n" " %s\n" "If that .changes file is broken, you will need to use a new version\n" "number for your next attempt at the upload.\n" msgstr "" #: ../dgit:5245 #, perl-format msgid "pushed and uploaded %s" msgstr "" #: ../dgit:5257 msgid "-p is not allowed with clone; specify as argument instead" msgstr "" #: ../dgit:5268 msgid "incorrect arguments to dgit clone" msgstr "" #: ../dgit:5274 ../git-debrebase:1811 #, perl-format msgid "%s already exists" msgstr "" #: ../dgit:5288 #, perl-format msgid "remove %s: %s\n" msgstr "" #: ../dgit:5292 #, perl-format msgid "check whether to remove %s: %s\n" msgstr "" #: ../dgit:5330 msgid "incorrect arguments to dgit fetch or dgit pull" msgstr "" #: ../dgit:5348 msgid "" "dgit pull not yet supported in split view mode (including with view-" "splitting quilt modes)\n" msgstr "" #: ../dgit:5357 msgid "dgit checkout needs a suite argument" msgstr "" #: ../dgit:5420 #, perl-format msgid "setting up vcs-git: %s\n" msgstr "" #: ../dgit:5423 #, perl-format msgid "vcs git unchanged: %s\n" msgstr "" #: ../dgit:5425 #, perl-format msgid "changing vcs-git url to: %s\n" msgstr "" #: ../dgit:5430 #, perl-format msgid "fetching (%s)\n" msgstr "" #: ../dgit:5446 #, perl-format msgid "incorrect arguments to dgit %s" msgstr "" #: ../dgit:5457 #, perl-format msgid "dgit %s: changelog specifies %s (%s) but command line specifies %s" msgstr "" #: ../dgit:5481 #, perl-format msgid "dgit push, but dgit.default.push-subcmd set to %s" msgstr "" #: ../dgit:5489 #, perl-format msgid "dgit rpush, but dgit.default.[r]push-subcmd set to %s" msgstr "" #: ../dgit:5502 #, perl-format msgid "" "warning: \"dgit %s\" currently means \"dgit %s-built\" (by default)\n" "warning: but is going to change to \"dgit %s-source\". See dgit!(1).\n" msgstr "" #: ../dgit:5542 #, perl-format msgid "" "build host has dgit rpush protocol versions %s but invocation host has %s" msgstr "" #: ../dgit:5626 #, perl-format msgid "create %s: %s" msgstr "" #: ../dgit:5672 #, perl-format msgid "build host child failed: %s" msgstr "" #: ../dgit:5675 msgid "all done\n" msgstr "" #: ../dgit:5684 #, perl-format msgid "file %s (%s) twice" msgstr "" #: ../dgit:5690 msgid "bad param spec" msgstr "" #: ../dgit:5696 msgid "bad previously spec" msgstr "" #: ../dgit:5768 #, perl-format msgid "buildinfo mismatch in field %s" msgstr "" #: ../dgit:5771 msgid "buildinfo mismatch in field Architecture" msgstr "" #: ../dgit:5773 #, perl-format msgid "buildinfo contains forbidden field %s" msgstr "" #: ../dgit:5795 msgid "build-host-supplied changes file is not source-only" msgstr "" #: ../dgit:5825 msgid "remote changes file" msgstr "" #: ../dgit:5908 msgid "not a plain file\n" msgstr "" #: ../dgit:5914 msgid "mode or type changed in unsupported way\n" msgstr "" #: ../dgit:5917 msgid "modified symlink\n" msgstr "" #: ../dgit:5920 msgid "deletion of symlink\n" msgstr "" #: ../dgit:5924 msgid "creation with non-default mode, or symlink\n" msgstr "" #: ../dgit:5952 #, perl-format msgid "dgit: cannot represent change: %s: %s\n" msgstr "" #: ../dgit:5957 msgid "" "HEAD has changes to .orig[s] which are not representable by `3.0 (quilt)'\n" msgstr "" #: ../dgit:5995 #, perl-format msgid "" "\n" "For full diff showing the problem(s), type:\n" " %s\n" msgstr "" #: ../dgit:6002 #, perl-format msgid "" "--quilt=%s specified, implying patches-unapplied git tree\n" " but git tree differs from orig in upstream files." msgstr "" #: ../dgit:6008 msgid "" "\n" " ... debian/patches is missing; perhaps this is a patch queue branch?" msgstr "" #: ../dgit:6015 #, 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:6029 #, perl-format msgid "Combine debian/ with upstream source for %s\n" msgstr "" #: ../dgit:6037 msgid "dgit view: creating patches-applied version using gbp pq" msgstr "" #: ../dgit:6048 #, 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:6056 msgid "dgit view: creating patch to represent .gitignore changes" msgstr "" #: ../dgit:6061 #, perl-format msgid "%s already exists; but want to create it to record .gitignore changes" msgstr "" #: ../dgit:6067 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:6090 msgid "Commit patch to update .gitignore\n" msgstr "" #: ../dgit:6160 msgid "maximum search space exceeded" msgstr "" #: ../dgit:6178 #, perl-format msgid "has %s not %s" msgstr "" #: ../dgit:6187 msgid "root commit" msgstr "" #: ../dgit:6193 #, perl-format msgid "merge (%s nontrivial parents)" msgstr "" #: ../dgit:6205 #, perl-format msgid "changed %s" msgstr "" #: ../dgit:6224 #, perl-format msgid "" "\n" "%s: error: quilt fixup cannot be linear. Stopped at:\n" msgstr "" #: ../dgit:6231 #, perl-format msgid "%s: %s: %s\n" msgstr "" #: ../dgit:6243 msgid "quilt history linearisation failed. Search `quilt fixup' in dgit(7).\n" msgstr "" #: ../dgit:6246 msgid "quilt fixup cannot be linear, smashing..." msgstr "" #: ../dgit:6260 #, perl-format msgid "" "Automatically generated patch (%s)\n" "Last (up to) %s git changes, FYI:\n" "\n" msgstr "" #: ../dgit:6267 msgid "quiltify linearisation planning successful, executing..." msgstr "" #: ../dgit:6301 msgid "contains unexpected slashes\n" msgstr "" #: ../dgit:6302 msgid "contains leading punctuation\n" msgstr "" #: ../dgit:6303 msgid "contains bad character(s)\n" msgstr "" #: ../dgit:6304 msgid "is series file\n" msgstr "" #: ../dgit:6305 msgid "too long\n" msgstr "" #: ../dgit:6309 #, perl-format msgid "quiltifying commit %s: ignoring/dropping Gbp-Pq %s: %s" msgstr "" #: ../dgit:6338 #, perl-format msgid "dgit: patch title transliteration error: %s" msgstr "" #: ../dgit:6413 #, perl-format msgid "" "quilt mode %s does not make sense (or is not supported) with single-debian-" "patch" msgstr "" #: ../dgit:6438 msgid "converted" msgstr "" #: ../dgit:6439 #, perl-format msgid "dgit view: created (%s)" msgstr "" #: ../dgit:6495 msgid "Commit removal of .pc (quilt series tracking data)\n" msgstr "" #: ../dgit:6505 msgid "starting quiltify (single-debian-patch)" msgstr "" #: ../dgit:6541 #, perl-format msgid "regenerating patch using git diff (--quilt=%s)" msgstr "" #: ../dgit:6635 msgid "" "warning: package uses dpkg-source include-binaries feature - not all changes " "are visible in patches!\n" msgstr "" #: ../dgit:6644 #, perl-format msgid "warning: ignoring bad include-binaries file %s: %s\n" msgstr "" #: ../dgit:6647 #, perl-format msgid "forbidden path component '%s'" msgstr "" #: ../dgit:6657 #, perl-format msgid "path starts with '%s'" msgstr "" #: ../dgit:6667 #, perl-format msgid "path to '%s' not a plain file or directory" msgstr "" #: ../dgit:6725 #, perl-format msgid "dgit: split brain (separate dgit view) may be needed (--quilt=%s)." msgstr "" #: ../dgit:6757 #, perl-format msgid "dgit view: found cached (%s)" msgstr "" #: ../dgit:6762 msgid "dgit view: found cached, no changes required" msgstr "" #: ../dgit:6797 #, perl-format msgid "examining quilt state (multiple patches, %s mode)" msgstr "" #: ../dgit:6890 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:6904 msgid "Tree already contains .pc - will delete it." msgstr "" #: ../dgit:6938 msgid "baredebian quilt fixup: could not find any origs" msgstr "" #: ../dgit:6951 msgid "tarball" msgstr "" #: ../dgit:6969 #, perl-format msgid "Combine orig tarballs for %s %s" msgstr "" #: ../dgit:6985 msgid "tarballs" msgstr "" #: ../dgit:6999 msgid "upstream" msgstr "" #: ../dgit:7023 #, perl-format msgid "%s: base trees orig=%.20s o+d/p=%.20s" msgstr "" #: ../dgit:7033 #, 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:7043 msgid "" "This has only a debian/ directory; you probably want --quilt=bare debian." msgstr "" #: ../dgit:7047 msgid "This might be a patches-unapplied branch." msgstr "" #: ../dgit:7050 msgid "This might be a patches-applied branch." msgstr "" #: ../dgit:7053 msgid "Maybe you need one of --[quilt=]gbp --[quilt=]dpm --quilt=unapplied ?" msgstr "" #: ../dgit:7056 msgid "Warning: Tree has .gitattributes. See GITATTRIBUTES in dgit(7)." msgstr "" #: ../dgit:7060 msgid "Maybe orig tarball(s) are not identical to git representation?" msgstr "" #: ../dgit:7071 #, perl-format msgid "starting quiltify (multiple patches, %s mode)" msgstr "" #: ../dgit:7110 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:7122 msgid "dgit: Unapplying patches again to tidy up the tree." msgstr "" #: ../dgit:7151 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:7163 msgid "tree contains uncommitted files and --clean=check specified" msgstr "" #: ../dgit:7166 msgid "tree contains uncommitted files (NB dgit didn't run rules clean)" msgstr "" #: ../dgit:7169 msgid "" "tree contains uncommitted, 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:7183 #, perl-format msgid "" "quilt mode %s (generally needs untracked upstream files)\n" "contradicts clean mode %s (which would delete them)\n" msgstr "" #: ../dgit:7200 msgid "tree contains uncommitted files (after running rules clean)" msgstr "" #: ../dgit:7214 msgid "clean takes no additional arguments" msgstr "" #: ../dgit:7233 #, perl-format msgid "-p specified package %s, but changelog says %s" msgstr "" #: ../dgit:7243 msgid "" "dgit: --include-dirty is not supported with split view (including with view-" "splitting quilt modes)" msgstr "" #: ../dgit:7251 msgid "" "tree has .gitignore(s) but debian/source/options has 'tar-ignore'\n" "Try 'tar-ignore=.git' in d/s/options instead. (See #908747.)\n" msgstr "" #: ../dgit:7256 #, perl-format msgid "" "%s: warning: debian/source/options contains bare 'tar-ignore'\n" "This can cause .gitignore files to be improperly omitted. See #908747.\n" msgstr "" #: ../dgit:7267 #, perl-format msgid "dgit: --quilt=%s, %s" msgstr "" #: ../dgit:7271 msgid "dgit: --upstream-commitish only makes sense with --quilt=baredebian" msgstr "" #: ../dgit:7306 #, perl-format msgid "remove old changes file %s: %s" msgstr "" #: ../dgit:7308 #, perl-format msgid "would remove %s" msgstr "" #: ../dgit:7326 #, perl-format msgid "warning: dgit option %s must be passed before %s on dgit command line\n" msgstr "" #: ../dgit:7333 #, 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:7359 msgid "archive query failed (queried because --since-version not specified)" msgstr "" #: ../dgit:7365 #, perl-format msgid "changelog will contain changes since %s" msgstr "" #: ../dgit:7368 msgid "package seems new, not specifying -v" msgstr "" #: ../dgit:7411 msgid "Wanted to build nothing!" msgstr "" #: ../dgit:7449 #, perl-format msgid "only one changes file from build (%s)\n" msgstr "" #: ../dgit:7456 #, perl-format msgid "%s found in binaries changes file %s" msgstr "" #: ../dgit:7463 #, perl-format msgid "%s unexpectedly not created by build" msgstr "" #: ../dgit:7467 #, perl-format msgid "install new changes %s{,.inmulti}: %s" msgstr "" #: ../dgit:7472 #, perl-format msgid "wrong number of different changes files (%s)" msgstr "" #: ../dgit:7475 #, perl-format msgid "build successful, results in %s\n" msgstr "" #: ../dgit:7488 #, 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:7506 msgid "build successful\n" msgstr "" #: ../dgit:7514 #, 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:7625 #, perl-format msgid "remove %s: %s" msgstr "" #: ../dgit:7632 msgid "--tag2upload-builder-mode needs split-brain mode" msgstr "" #: ../dgit:7637 msgid "upstream tag and not commit, or vice-versa" msgstr "" #: ../dgit:7693 msgid "--include-dirty not supported with --build-products-dir, sorry" msgstr "" #: ../dgit:7718 msgid "--include-dirty not supported with --tag2upload-builder-mode" msgstr "" #: ../dgit:7731 msgid "source-only buildinfo" msgstr "" #: ../dgit:7760 #, perl-format msgid "put in place new built file (%s): %s" msgstr "" #: ../dgit:7777 msgid "build-source takes no additional arguments" msgstr "" #: ../dgit:7781 #, perl-format msgid "source built, results in %s and %s" msgstr "" #: ../dgit:7788 msgid "" "dgit push-source: --include-dirty/--ignore-dirty does not makesense with " "push-source!" msgstr "" #: ../dgit:7793 msgid "--tag2upload-builder-mode not supported with -C" msgstr "" #: ../dgit:7796 msgid "source changes file" msgstr "" #: ../dgit:7798 msgid "user-specified changes file is not source-only" msgstr "" #: ../dgit:7818 ../dgit:7820 #, perl-format msgid "%s (in build products dir): %s" msgstr "" #: ../dgit:7834 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:7847 msgid "" "you asked for a builder but your debbuildopts didn't ask for any binaries -- " "is this really what you meant?" msgstr "" #: ../dgit:7851 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:7881 msgid "incorrect arguments to dgit print-unapplied-treeish" msgstr "" #: ../dgit:7902 msgid "source tree" msgstr "" #: ../dgit:7904 #, perl-format msgid "dgit: import-dsc: %s" msgstr "" #: ../dgit:7917 #, perl-format msgid "unknown dgit import-dsc sub-option `%s'" msgstr "" #: ../dgit:7921 msgid "usage: dgit import-dsc .../PATH/TO/.DSC BRANCH" msgstr "" #: ../dgit:7925 msgid "dry run makes no sense with import-dsc" msgstr "" #: ../dgit:7942 #, perl-format msgid "%s is checked out - will not update it" msgstr "" #: ../dgit:7947 #, perl-format msgid "open import .dsc (%s): %s" msgstr "" #: ../dgit:7949 #, perl-format msgid "read %s: %s" msgstr "" #: ../dgit:7960 msgid "import-dsc signature check failed" msgstr "" #: ../dgit:7963 #, perl-format msgid "%s: warning: importing unsigned .dsc\n" msgstr "" #: ../dgit:7974 msgid "Dgit metadata in .dsc" msgstr "" #: ../dgit:7985 msgid "dgit: import-dsc of .dsc with Dgit field, using git hash" msgstr "" #: ../dgit:7994 #, 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:8001 msgid "Not fast forward, forced update." msgstr "" #: ../dgit:8003 #, perl-format msgid "Not fast forward to %s" msgstr "" #: ../dgit:8008 #, perl-format msgid "updated git ref %s" msgstr "" #: ../dgit:8013 #, 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:8033 #, perl-format msgid "lstat %s works but stat gives %s !" msgstr "" #: ../dgit:8035 #, perl-format msgid "stat %s: %s" msgstr "" #: ../dgit:8043 #, perl-format msgid "import %s requires %s, but: %s" msgstr "" #: ../dgit:8062 #, perl-format msgid "cannot import %s which seems to be inside working tree!" msgstr "" #: ../dgit:8066 #, perl-format msgid "symlink %s to %s: %s" msgstr "" #: ../dgit:8067 #, perl-format msgid "made symlink %s -> %s" msgstr "" #: ../dgit:8078 msgid "Import, forced update - synthetic orphan git history." msgstr "" #: ../dgit:8080 msgid "Import, merging." msgstr "" #: ../dgit:8094 #, perl-format msgid "Merge %s (%s) import into %s\n" msgstr "" #: ../dgit:8103 #, perl-format msgid "results are in git ref %s" msgstr "" #: ../dgit:8110 msgid "need only 1 subpath argument" msgstr "" #: ../dgit:8128 msgid "need destination argument" msgstr "" #: ../dgit:8133 #, perl-format msgid "exec git clone: %s\n" msgstr "" #: ../dgit:8141 msgid "no arguments allowed to dgit print-dgit-repos-server-source-url" msgstr "" #: ../dgit:8152 msgid "no arguments allowed to dgit print-dpkg-source-ignores" msgstr "" #: ../dgit:8158 msgid "no arguments allowed to dgit setup-mergechangelogs" msgstr "" #: ../dgit:8165 ../dgit:8171 msgid "no arguments allowed to dgit setup-useremail" msgstr "" #: ../dgit:8177 msgid "no arguments allowed to dgit setup-tree" msgstr "" #: ../dgit:8228 msgid "" "--initiator-tempdir must be used specify an absolute, not relative, " "directory." msgstr "" #: ../dgit:8267 #, perl-format msgid "%s needs a value" msgstr "" #: ../dgit:8271 #, perl-format msgid "bad value `%s' for %s" msgstr "" #: ../dgit:8380 #, perl-format msgid "%s: warning: ignoring unknown force option %s\n" msgstr "" #: ../dgit:8404 #, perl-format msgid "unknown long option `%s'" msgstr "" #: ../dgit:8461 #, perl-format msgid "unknown short option `%s'" msgstr "" #: ../dgit:8484 #, perl-format msgid "%s is set to something other than SIG_DFL\n" msgstr "" #: ../dgit:8488 #, perl-format msgid "%s is blocked\n" msgstr "" #: ../dgit:8494 #, 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:8541 #, perl-format msgid "" "unsupported option `%s', cannot set command for %s (can only provide options)" msgstr "" #: ../dgit:8546 #, perl-format msgid "" "unsupported option `%s', cannot provide additional options for %s (can only " "provide replacement command)" msgstr "" #: ../dgit:8553 #, perl-format msgid "" "unsupported option `%s', cannot adjust options for %s (can only provide " "replacement command)" msgstr "" #: ../dgit:8585 #, perl-format msgid "cannot set command for %s (can only provide options)" msgstr "" #: ../dgit:8606 #, perl-format msgid "cannot configure options for %s (can only provide replacement command)" msgstr "" #: ../dgit:8625 #, perl-format msgid "unknown quilt-mode `%s'" msgstr "" #: ../dgit:8637 #, perl-format msgid "unknown %s setting `%s'" msgstr "" #: ../dgit:8650 msgid "--tag2upload-builder-mode implies --dep14tag-reuse=must" msgstr "" #: ../dgit:8657 #, perl-format msgid "unknown dep14tag-reuse mode `%s'" msgstr "" #: ../dgit:8680 msgid "DRY RUN ONLY\n" msgstr "" #: ../dgit:8681 msgid "DAMP RUN - WILL MAKE LOCAL (UNSIGNED) CHANGES\n" msgstr "" #: ../dgit:8701 #, 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 overridden by individual -f options\n" msgstr "" #: ../git-debrebase:385 #, perl-format msgid "%s: snags: %d overridden 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:1037 #, perl-format msgid "inconsistent anchors in merged-breakwaters %s" msgstr "" #: ../git-debrebase:1077 #, perl-format msgid "branch needs laundering (run git-debrebase): %s" msgstr "" #: ../git-debrebase:1105 #, perl-format msgid "packaging change (%s) follows upstream change" msgstr "" #: ../git-debrebase:1106 #, perl-format msgid " (eg %s)" msgstr "" #: ../git-debrebase:1112 msgid "found mixed upstream/packaging commit" msgstr "" #: ../git-debrebase:1113 ../git-debrebase:1121 ../git-debrebase:1126 #: ../git-debrebase:1131 ../git-debrebase:1137 ../git-debrebase:1145 #, perl-format msgid " (%s)" msgstr "" #: ../git-debrebase:1120 #, perl-format msgid "found interchange bureaucracy commit (%s)" msgstr "" #: ../git-debrebase:1125 msgid "found dgit dsc import" msgstr "" #: ../git-debrebase:1130 msgid "found bare dgit dsc import with no prior history" msgstr "" #: ../git-debrebase:1136 msgid "found vanilla merge" msgstr "" #: ../git-debrebase:1143 #, perl-format msgid "found unprocessable commit, cannot cope: %s" msgstr "" #: ../git-debrebase:1154 msgid "old anchor is recognised due to --anchor, cannot check upstream" msgstr "old anchor is recognized due to --anchor, cannot check upstream" #: ../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:1771 msgid "launder for rebase" msgstr "" #: ../git-debrebase:1776 msgid "analyse does not support any options" msgstr "" #: ../git-debrebase:1778 msgid "too many arguments to analyse" msgstr "" #: ../git-debrebase:1813 msgid "HEAD symref is not to refs/heads/" msgstr "" #: ../git-debrebase:1836 #, perl-format msgid "OK, you are ahead of %s\n" msgstr "" #: ../git-debrebase:1840 #, perl-format msgid "you are behind %s, divergence risk" msgstr "" #: ../git-debrebase:1844 #, perl-format msgid "you have diverged from %s" msgstr "" #: ../git-debrebase:1866 msgid "remote dgit branch" msgstr "" #: ../git-debrebase:1869 msgid "remote dgit branch for sid" msgstr "" #: ../git-debrebase:1897 msgid "Recorded previous head for preservation" msgstr "" #: ../git-debrebase:1905 #, perl-format msgid "could not record ffq-prev: %s" msgstr "" #: ../git-debrebase:1916 #, perl-format msgid "could not check ffq-prev: %s" msgstr "" #: ../git-debrebase:1936 msgid "fast forward" msgstr "" #: ../git-debrebase:1946 msgid "Declare fast forward / record previous work" msgstr "" #: ../git-debrebase:1958 msgid "No ffq-prev to stitch." msgstr "" #: ../git-debrebase:1975 msgid "need NEW-VERSION [UPS-COMMITTISH]" msgstr "" #: ../git-debrebase:1980 #, perl-format msgid "bad version number `%s'" msgstr "" #: ../git-debrebase:1999 #, perl-format msgid "upstream piece `%s'" msgstr "" #: ../git-debrebase:2000 msgid "upstream (main piece" msgstr "" #: ../git-debrebase:2020 msgid "for each EXTRA-UPS-NAME need EXTRA-UPS-COMMITISH" msgstr "" #: ../git-debrebase:2053 #, 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:2062 #, perl-format msgid "previous upstream combine %s first piece is not `.'" msgstr "" #: ../git-debrebase:2075 #, perl-format msgid "" "previous upstream %s is from git-debrebase but not an `upstream-combine' " "commit" msgstr "" #: ../git-debrebase:2086 #, perl-format msgid "introducing upstream piece `%s'" msgstr "" #: ../git-debrebase:2089 #, perl-format msgid "dropping upstream piece `%s'" msgstr "" #: ../git-debrebase:2092 #, perl-format msgid "not fast forward: %s %s" msgstr "" #: ../git-debrebase:2203 msgid "Previous head already recorded\n" msgstr "" #: ../git-debrebase:2207 #, perl-format msgid "Could not preserve: %s" msgstr "" #: ../git-debrebase:2212 ../git-debrebase:2218 ../git-debrebase:2224 #: ../git-debrebase:2324 ../git-debrebase:2333 ../git-debrebase:2357 #: ../git-debrebase:2421 msgid "no arguments allowed" msgstr "" #: ../git-debrebase:2246 msgid "branch contains furniture (not laundered)" msgstr "" #: ../git-debrebase:2247 msgid "branch is unlaundered" msgstr "" #: ../git-debrebase:2248 msgid "branch needs laundering" msgstr "" #: ../git-debrebase:2249 msgid "branch not in git-debrebase form" msgstr "" #: ../git-debrebase:2259 msgid "current branch contents, in git-debrebase terms:\n" msgstr "" #: ../git-debrebase:2261 msgid " branch is laundered\n" msgstr "" #: ../git-debrebase:2277 #, perl-format msgid " %s is not well-defined\n" msgstr "" #: ../git-debrebase:2283 msgid "key git-debrebase commits:\n" msgstr "" #: ../git-debrebase:2284 msgid "anchor" msgstr "" #: ../git-debrebase:2285 msgid "breakwater" msgstr "" #: ../git-debrebase:2300 msgid "branch and ref status, in git-debrebase terms:\n" msgstr "" #: ../git-debrebase:2307 msgid " unstitched; previous tip was:\n" msgstr "" #: ../git-debrebase:2310 msgid " stitched? (no record of git-debrebase work)\n" msgstr "" #: ../git-debrebase:2312 msgid " stitched\n" msgstr "" #: ../git-debrebase:2314 msgid " not git-debrebase (diverged since last stitch)\n" msgstr "" #: ../git-debrebase:2317 msgid "you are currently rebasing\n" msgstr "" #: ../git-debrebase:2334 ../git-debrebase:2347 msgid "launder for git-debrebase quick" msgstr "" #: ../git-debrebase:2341 ../git-debrebase:2371 msgid "No ongoing git-debrebase session." msgstr "" #: ../git-debrebase:2410 msgid "Commit patch queue (exported by git-debrebase)" msgstr "" #: ../git-debrebase:2427 msgid "No (more) patches to export." msgstr "" #: ../git-debrebase:2434 #, perl-format msgid "" "Patch export produced patch amendments (abandoned output commit %s). Try " "laundering first." msgstr "" #: ../git-debrebase:2454 #, perl-format msgid "%s contains comments, which will be discarded" msgstr "" #: ../git-debrebase:2459 #, perl-format msgid "patch %s repeated in %s !" msgstr "" #: ../git-debrebase:2466 #, perl-format msgid "Unused patch file %s will be discarded" msgstr "" #: ../git-debrebase:2474 msgid "ffq-prev exists, this is already managed by git-debrebase!" msgstr "" #: ../git-debrebase:2479 msgid "ahead of debrebase-last, this is already managed by git-debrebase!" msgstr "" #: ../git-debrebase:2496 msgid "want only 1 optional argument, the upstream git commitish" msgstr "" #: ../git-debrebase:2501 msgid "missing Version from changelog\n" msgstr "" #: ../git-debrebase:2517 #, 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:2525 #, perl-format msgid "upstream (%s) is not an ancestor of HEAD" msgstr "" #: ../git-debrebase:2532 #, 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:2534 #, perl-format msgid "list expected changes with: %s\n" msgstr "" #: ../git-debrebase:2541 #, perl-format msgid "upstream (%s) contains debian/ directory" msgstr "" #: ../git-debrebase:2559 msgid "neither of the first two changelog entries are released\n" msgstr "" #: ../git-debrebase:2565 #, perl-format msgid "could not find suitable maintainer view tag %s\n" msgstr "" #: ../git-debrebase:2568 #, perl-format msgid "HEAD is not FF from maintainer tag %s!" msgstr "" #: ../git-debrebase:2571 #, perl-format msgid "dgit view tag %s not found\n" msgstr "" #: ../git-debrebase:2573 #, perl-format msgid "dgit view tag %s is not FF from maintainer tag %s\n" msgstr "" #: ../git-debrebase:2575 #, perl-format msgid "will stitch in dgit view, %s\n" msgstr "" #: ../git-debrebase:2582 #, perl-format msgid "" "Cannot confirm dgit view: %s\n" "Failed to stitch in dgit view (see messages above).\n" "dgit --trust-changelog will be needed on the first dgit push after " "conversion.\n" msgstr "" #: ../git-debrebase:2628 #, perl-format msgid "%s: converted from patched-unapplied (gbp) branch format, OK\n" msgstr "" #: ../git-debrebase:2657 #, 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:2678 msgid "takes 1 optional argument, the upstream commitish" msgstr "" #: ../git-debrebase:2686 #, perl-format msgid "%s, from command line" msgstr "" #: ../git-debrebase:2700 #, 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:2704 msgid "Branch already in git-debrebase format." msgstr "" #: ../git-debrebase:2716 msgid "Considering possible commits corresponding to upstream:\n" msgstr "" #: ../git-debrebase:2724 #, perl-format msgid "git tag %s" msgstr "" #: ../git-debrebase:2730 #, perl-format msgid " git tag: no suitable tag found (tried %s)\n" msgstr "" #: ../git-debrebase:2739 #, perl-format msgid "opendir build-products-dir %s: %s" msgstr "" #: ../git-debrebase:2745 #, perl-format msgid " orig: found what looks like a .orig, %s\n" msgstr "" #: ../git-debrebase:2776 #, perl-format msgid " orig: no suitable origs found (looked for %s in %s)\n" msgstr "" #: ../git-debrebase:2785 msgid "Evaluating possible commits corresponding to upstream:\n" msgstr "" #: ../git-debrebase:2826 #, perl-format msgid " %s: couldn't apply patches: gbp pq %s" msgstr "" #: ../git-debrebase:2835 #, perl-format msgid " %s: applying patches gives different tree\n" msgstr "" #: ../git-debrebase:2849 msgid "" "Could not find or construct a suitable upstream commit.\n" "Rerun adding --diagnose after convert-from-dgit-view, or pass a\n" "upstream commit explicitly or provide suitable origs.\n" msgstr "" #: ../git-debrebase:2855 #, perl-format msgid "Yes, will base new branch on %s\n" msgstr "" #: ../git-debrebase:2860 #, 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:2868 msgid "Output of conversion does not match input!" msgstr "" #: ../git-debrebase:2876 msgid "forget-was-ever-debrebase takes no further arguments" msgstr "" #: ../git-debrebase:2880 #, perl-format msgid "Not suitable for recording git-debrebaseness anyway: %s" msgstr "" #: ../git-debrebase:2985 msgid "bad options\n" msgstr "" #: ../git-debrebase:2995 #, perl-format msgid "" "%s: with git-debrebase, get-rebase -i option may only be followed by more " "options (as separate arguments)" msgstr "" #: ../git-debrebase:3025 #, perl-format msgid "unknown git-debrebase sub-operation %s" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:93 ../Debian/Dgit/ProtoConn.pm:112 #, perl-format msgid "connection lost: %s" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:94 #, perl-format msgid "protocol violation; %s not expected" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:115 #, perl-format msgid "eof (reading %s)" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:135 msgid "protocol message" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:144 #, perl-format msgid "`%s'" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:149 msgid "bad byte count" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:152 msgid "data block" msgstr "" #: ../Debian/Dgit.pm:352 #, perl-format msgid "error: %s\n" msgstr "" #: ../Debian/Dgit.pm:378 #, perl-format msgid "getcwd failed: %s\n" msgstr "" #: ../Debian/Dgit.pm:397 msgid "terminated, reporting successful completion" msgstr "" #: ../Debian/Dgit.pm:399 #, perl-format msgid "failed with error exit status %s" msgstr "" #: ../Debian/Dgit.pm:402 #, perl-format msgid "died due to fatal signal %s" msgstr "" #: ../Debian/Dgit.pm:406 #, perl-format msgid "failed with unknown wait status %s" msgstr "" #: ../Debian/Dgit.pm:412 msgid "failed command" msgstr "" #: ../Debian/Dgit.pm:418 #, perl-format msgid "failed to fork/exec: %s" msgstr "" #: ../Debian/Dgit.pm:420 #, perl-format msgid "subprocess %s" msgstr "" #: ../Debian/Dgit.pm:422 msgid "subprocess produced invalid output" msgstr "" #: ../Debian/Dgit.pm:527 msgid "stat source file: %S" msgstr "" #: ../Debian/Dgit.pm:537 msgid "stat destination file: %S" msgstr "" #: ../Debian/Dgit.pm:556 msgid "finally install file after cp: %S" msgstr "" #: ../Debian/Dgit.pm:562 msgid "delete old file after cp: %S" msgstr "" #: ../Debian/Dgit.pm:585 msgid "" "not in a git working tree?\n" "(git rev-parse --show-toplevel produced no output)\n" msgstr "" #: ../Debian/Dgit.pm:588 #, perl-format msgid "chdir toplevel %s: %s\n" msgstr "" #: ../Debian/Dgit.pm:696 msgid "git index contains changes (does not match HEAD)" msgstr "" #: ../Debian/Dgit.pm:697 msgid "working tree is dirty (does not match HEAD)" msgstr "" #: ../Debian/Dgit.pm:722 msgid "using specified upstream commitish" msgstr "" #: ../Debian/Dgit.pm:729 #, 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:734 ../Debian/Dgit.pm:736 #, perl-format msgid "using upstream from git tag %s" msgstr "" #: ../Debian/Dgit.pm:850 #, perl-format msgid "failed to remove directory tree %s: rm -rf: %s; %s\n" msgstr "" #: ../Debian/Dgit.pm:885 msgid "detached HEAD" msgstr "" #: ../Debian/Dgit.pm:886 msgid "HEAD symref is not to refs/" msgstr "" #: ../Debian/Dgit.pm:902 #, perl-format msgid "parsing of %s failed" msgstr "" #: ../Debian/Dgit.pm:911 #, 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:925 #, perl-format msgid "open %s (%s): %s" msgstr "" #: ../Debian/Dgit.pm:950 #, perl-format msgid "missing field %s in %s" msgstr "" #: ../Debian/Dgit.pm:1036 msgid "Dummy commit - do not use\n" msgstr "" #: ../Debian/Dgit.pm:1057 #, perl-format msgid "exec %s: %s\n" msgstr "" #: ../Debian/Dgit.pm:1085 #, perl-format msgid "Taint recorded at time %s for package %s" msgstr "" #: ../Debian/Dgit.pm:1087 #, perl-format msgid "Taint recorded at time %s for any package" msgstr "" #: ../Debian/Dgit.pm:1089 #, perl-format msgid "Taint recorded for package %s" msgstr "" #: ../Debian/Dgit.pm:1091 msgid "Taint recorded for any package" msgstr "" #: ../Debian/Dgit.pm:1103 msgid "Uncorrectable error. If confused, consult administrator.\n" msgstr "" #: ../Debian/Dgit.pm:1106 msgid "Could perhaps be forced using --deliberately. Consult documentation.\n" msgstr "" #: ../Debian/Dgit.pm:1109 #, perl-format msgid "Forcing due to %s\n" msgstr "" #: ../Debian/Dgit.pm:1174 #, perl-format msgid "cannot stat %s/.git: %s" msgstr "" #: ../Debian/Dgit.pm:1197 #, perl-format msgid "failed to mkdir playground parent %s: %s" msgstr "" #: ../Debian/Dgit.pm:1205 #, perl-format msgid "failed to mkdir a playground %s: %s" msgstr "" #: ../Debian/Dgit.pm:1214 #, perl-format msgid "failed to mkdir the playground %s: %s" msgstr "" work/po/messages.pot0000664000000000000000000017472515016262471011725 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: 2025-05-07 18:40+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:296 #, perl-format msgid "%s: invalid configuration: %s\n" msgstr "" #: ../dgit:303 msgid "warning: overriding problem due to --force:\n" msgstr "" #: ../dgit:311 #, perl-format msgid "warning: skipping checks or functionality due to --force-%s\n" msgstr "" #: ../dgit:316 #, perl-format msgid "%s: source package %s does not exist in suite %s\n" msgstr "" #: ../dgit:589 #, perl-format msgid "build host child %s" msgstr "" #: ../dgit:648 #, perl-format msgid "%s ok: %s" msgstr "" #: ../dgit:650 #, perl-format msgid "would be ok: %s (but dry run only)" msgstr "" #: ../dgit:675 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-source [dgit-opts] [suite]\n" " dgit [dgit-opts] push-built [dgit-opts] [suite]\n" " dgit [dgit-opts] rpush-source|rpush-built 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:694 msgid "Perhaps the upload is stuck in incoming. Using the version from git.\n" msgstr "" #: ../dgit:698 #, perl-format msgid "" "%s: %s\n" "%s" msgstr "" #: ../dgit:703 msgid "too few arguments" msgstr "" #: ../dgit:825 #, perl-format msgid "multiple values for %s (in %s git config)" msgstr "" #: ../dgit:828 #, perl-format msgid "value for config option %s (in %s git config) contains newline(s)!" msgstr "" #: ../dgit:848 #, perl-format msgid "" "need value for one of: %s\n" "%s: distro or suite appears not to be (properly) supported" msgstr "" #: ../dgit:905 #, perl-format msgid "bad syntax for (nominal) distro `%s' (does not match %s)" msgstr "" #: ../dgit:920 #, perl-format msgid "backports-quirk needs % or ( )" msgstr "" #: ../dgit:936 #, perl-format msgid "%s needs t (true, y, 1) or f (false, n, 0) not `%s'" msgstr "" #: ../dgit:956 msgid "readonly needs t (true, y, 1) or f (false, n, 0) or a (auto)" msgstr "" #: ../dgit:974 #, perl-format msgid "unknown %s `%s'" msgstr "" #: ../dgit:979 ../git-debrebase:1548 ../Debian/Dgit.pm:255 msgid "internal error" msgstr "" #: ../dgit:981 msgid "pushing but distro is configured readonly" msgstr "" #: ../dgit:985 msgid "" "Push failed, before we got started.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:1008 #, perl-format msgid "" "dgit: quilt mode `%s' (for format `%s') implies split view, but split-view " "set to `%s'" msgstr "" #: ../dgit:1169 msgid "this operation does not support multiple comma-separated suites" msgstr "" #: ../dgit:1237 #, perl-format msgid "fetch of %s failed (%s): %s" msgstr "" #: ../dgit:1244 #, perl-format msgid "fetch of %s gave HTTP code %s" msgstr "" #: ../dgit:1265 msgid "ftpmasterapi archive query method takes no data part" msgstr "" #: ../dgit:1283 #, perl-format msgid "unknown suite %s, maybe -d would help" msgstr "" #: ../dgit:1287 #, perl-format msgid "multiple matches for suite %s\n" msgstr "" #: ../dgit:1289 #, perl-format msgid "suite %s info has no codename\n" msgstr "" #: ../dgit:1291 #, perl-format msgid "suite %s maps to bad codename\n" msgstr "" #: ../dgit:1293 ../dgit:1318 msgid "bad ftpmaster api response: " msgstr "" #: ../dgit:1307 #, perl-format msgid "bad version: %s\n" msgstr "" #: ../dgit:1309 msgid "bad component" msgstr "" #: ../dgit:1312 msgid "bad filename" msgstr "" #: ../dgit:1314 msgid "bad sha256sum" msgstr "" #: ../dgit:1365 msgid "aptget archive query method takes no data part" msgstr "" #: ../dgit:1449 #, 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:1473 #, perl-format msgid "Release file (%s) specifies intolerable %s" msgstr "" #: ../dgit:1499 msgid "apt-get source did not produce a .dsc" msgstr "" #: ../dgit:1500 #, perl-format msgid "apt-get source produced several .dscs (%s)" msgstr "" #: ../dgit:1605 #, 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:1744 #, perl-format msgid "cannot operate on %s suite" msgstr "" #: ../dgit:1747 #, perl-format msgid "canonical suite name for %s is %s" msgstr "" #: ../dgit:1749 #, perl-format msgid "canonical suite name is %s" msgstr "" #: ../dgit:1769 #, perl-format msgid "%s has hash %s but archive told us to expect %s" msgstr "" #: ../dgit:1775 #, perl-format msgid "unsupported source format %s, sorry" msgstr "" #: ../dgit:1802 #, perl-format msgid "diverting to %s (using config for %s)" msgstr "" #: ../dgit:1825 #, perl-format msgid "unknown git-check `%s'" msgstr "" #: ../dgit:1840 #, perl-format msgid "unknown git-create `%s'" msgstr "" #: ../dgit:1884 #, perl-format msgid "%s: warning: removing from %s: %s\n" msgstr "" #: ../dgit:1930 #, perl-format msgid "could not parse .dsc %s line `%s'" msgstr "" #: ../dgit:1941 #, perl-format msgid "missing any supported Checksums-* or Files field in %s" msgstr "" #: ../dgit:1987 #, perl-format msgid "hash or size of %s varies in %s fields (between: %s)" msgstr "" #: ../dgit:1996 #, perl-format msgid "file list in %s varies between hash fields!" msgstr "" #: ../dgit:2000 #, perl-format msgid "%s has no files list field(s)" msgstr "" #: ../dgit:2006 #, perl-format msgid "no file appears in all file lists (looked in: %s)" msgstr "" #: ../dgit:2046 #, perl-format msgid "purportedly source-only changes has Architecture: %s\n" msgstr "" #: ../dgit:2057 #, perl-format msgid "purportedly source-only changes polluted by %s\n" msgstr "" #: ../dgit:2069 msgid "cannot find section/priority from .changes Files field" msgstr "" #: ../dgit:2082 msgid "" "archive does not support .orig check; hope you used --ch:--sa/-sd if needed\n" msgstr "" #: ../dgit:2098 #, perl-format msgid ".dsc %s missing entry for %s" msgstr "" #: ../dgit:2103 #, perl-format msgid "%s: %s (archive) != %s (local .dsc)" msgstr "" #: ../dgit:2111 #, perl-format msgid "archive %s: %s" msgstr "" #: ../dgit:2118 #, perl-format msgid "archive contains %s with different checksum" msgstr "" #: ../dgit:2146 #, perl-format msgid "edited .changes for archive .orig contents: %s %s" msgstr "" #: ../dgit:2154 #, perl-format msgid "[new .changes left in %s]" msgstr "" #: ../dgit:2157 #, perl-format msgid "%s already has appropriate .orig(s) (if any)" msgstr "" #: ../dgit:2179 #, perl-format msgid "" "unexpected commit author line format `%s' (was generated from changelog " "Maintainer field)" msgstr "" #: ../dgit:2202 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:2214 #, perl-format msgid "" "Found active distro-specific series file for %s (%s): %s, cannot continue" msgstr "" #: ../dgit:2245 msgid "Dpkg::Vendor `current vendor'" msgstr "" #: ../dgit:2247 msgid "(base) distro being accessed" msgstr "" #: ../dgit:2249 msgid "(nominal) distro being accessed" msgstr "" #: ../dgit:2254 #, perl-format msgid "build-products-dir %s is not accessible: %s\n" msgstr "" #: ../dgit:2292 #, perl-format msgid "%s: multiple representations of similar orig %s:\n" msgstr "" #: ../dgit:2296 #, perl-format msgid " %s: in %s (%s)\n" msgstr "" #: ../dgit:2301 msgid "Duplicate/inconsistent orig tarballs. Delete the spurious ones." msgstr "" #: ../dgit:2318 #, perl-format msgid "" "%s: found orig(s) in .. missing from build-products-dir, transferring:\n" msgstr "" #: ../dgit:2322 #, perl-format msgid "check orig file %s in bpd %s: %s" msgstr "" #: ../dgit:2324 #, perl-format msgid "check orig file %s in ..: %s" msgstr "" #: ../dgit:2327 #, perl-format msgid "check target of orig symlink %s in ..: %s" msgstr "" #: ../dgit:2336 #, perl-format msgid "%s: cloned orig symlink from ..: %s\n" msgstr "" #: ../dgit:2340 #, perl-format msgid "%s: hardlinked orig from ..: %s\n" msgstr "" #: ../dgit:2343 #, perl-format msgid "failed to make %s a hardlink to %s: %s" msgstr "" #: ../dgit:2349 #, perl-format msgid "%s: symmlinked orig from .. on other filesystem: %s\n" msgstr "" #: ../dgit:2364 msgid "package changelog" msgstr "" #: ../dgit:2469 #, perl-format msgid "dgit (child): exec %s: %s" msgstr "" #: ../dgit:2532 msgid "package changelog has no entries!" msgstr "" #: ../dgit:2537 #, perl-format msgid "" "warning: unable to find/parse changelog entry for first import of %s:\n" "%s\n" msgstr "" #: ../dgit:2608 ../dgit:2613 #, perl-format msgid "accessing %s: %s" msgstr "" #: ../dgit:2630 ../dgit:2637 #, perl-format msgid "saving %s: %s" msgstr "" #: ../dgit:2663 ../dgit:6701 msgid "source package" msgstr "" #: ../dgit:2743 #, perl-format msgid "%s: trying slow absurd-git-apply..." msgstr "" #: ../dgit:2796 #, perl-format msgid "%s failed: %s\n" msgstr "" #: ../dgit:2814 #, 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:2834 #, perl-format msgid "synthesised git commit from .dsc %s" msgstr "" #: ../dgit:2838 msgid "Import of source package" msgstr "" #: ../dgit:2858 #, 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:2900 #, perl-format msgid "using existing %s" msgstr "" #: ../dgit:2904 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (perhaps you should delete this " "file?)" msgstr "" #: ../dgit:2908 #, perl-format msgid "need to fetch correct version of %s" msgstr "" #: ../dgit:2924 #, perl-format msgid "" "file %s has hash %s but .dsc demands hash %s (got wrong file from archive!)" msgstr "" #: ../dgit:3019 msgid "too many iterations trying to get sane fetch!" msgstr "" #: ../dgit:3034 #, perl-format msgid "warning: git ls-remote %s reported %s; this is silly, ignoring it.\n" msgstr "" #: ../dgit:3078 #, perl-format msgid "warning: git fetch %s created %s; this is silly, deleting it.\n" msgstr "" #: ../dgit:3093 #, 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:3098 #, 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:3245 #, perl-format msgid "not chasing .dsc distro %s: not fetching %s" msgstr "" #: ../dgit:3250 #, perl-format msgid ".dsc names distro %s: fetching %s" msgstr "" #: ../dgit:3255 #, 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:3265 #, 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:3285 msgid "rewrite map" msgstr "" #: ../dgit:3292 msgid "server's git history rewrite map contains a relevant entry!" msgstr "" #: ../dgit:3296 msgid "using rewritten git hash in place of .dsc value" msgstr "" #: ../dgit:3298 msgid "server data says .dsc hash is to be disregarded" msgstr "" #: ../dgit:3305 msgid "additional commits" msgstr "" #: ../dgit:3308 #, perl-format msgid "" ".dsc Dgit metadata requires commit %s\n" "but we could not obtain that object anywhere.\n" msgstr "" #: ../dgit:3333 msgid "last upload to archive" msgstr "" #: ../dgit:3337 msgid "no version available from the archive" msgstr "" #: ../dgit:3420 msgid "dgit suite branch on dgit git server" msgstr "" #: ../dgit:3427 msgid "dgit client's archive history view" msgstr "" #: ../dgit:3432 msgid "Dgit field in .dsc from archive" msgstr "" #: ../dgit:3460 #, 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:3473 msgid "archive .dsc names newer git commit" msgstr "" #: ../dgit:3476 msgid "archive .dsc names other git commit, fixing up" msgstr "" #: ../dgit:3497 #, perl-format msgid "" "\n" "Package not found in the archive, but has allegedly been pushed using dgit.\n" "%s\n" msgstr "" #: ../dgit:3506 #, 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:3591 #, perl-format msgid "" "Record %s (%s) in archive suite %s\n" "\n" "Record that\n" msgstr "" #: ../dgit:3604 msgid "should be treated as descended from\n" msgstr "" #: ../dgit:3622 msgid "dgit repo server tip (last push)" msgstr "" #: ../dgit:3624 msgid "local tracking tip (last fetch)" msgstr "" #: ../dgit:3635 #, 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:3650 msgid "fetched source tree" msgstr "" #: ../dgit:3686 msgid "debian/changelog merge driver" msgstr "" #: ../dgit:3751 msgid "" "[attr]dgit-defuse-attrs already found, and proper, in .git/info/attributes\n" " not doing further gitattributes setup\n" msgstr "" #: ../dgit:3765 msgid "# ^ see GITATTRIBUTES in dgit(7) and dgit setup-new-tree in dgit(1)\n" msgstr "" #: ../dgit:3780 #, perl-format msgid "install %s: %s" msgstr "" #: ../dgit:3807 #, perl-format msgid "" "dgit: warning: %s contains .gitattributes\n" "dgit: .gitattributes not (fully) defused. Recommended: dgit setup-new-" "tree.\n" msgstr "" #: ../dgit:3829 #, perl-format msgid "fetching %s..." msgstr "" #: ../dgit:3837 #, perl-format msgid "failed to obtain %s: %s" msgstr "" #: ../dgit:3876 #, perl-format msgid "package %s missing in (base suite) %s" msgstr "" #: ../dgit:3908 msgid "local combined tracking branch" msgstr "" #: ../dgit:3910 msgid "archive seems to have rewound: local tracking branch is ahead!" msgstr "" #: ../dgit:3949 #, perl-format msgid "" "Combine archive branches %s [dgit]\n" "\n" "Input branches:\n" msgstr "" #: ../dgit:3963 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:3978 #, perl-format msgid "calculated combined tracking suite %s" msgstr "" #: ../dgit:3996 #, perl-format msgid "ready for work in %s" msgstr "" #: ../dgit:4014 msgid "dry run makes no sense with clone" msgstr "" #: ../dgit:4029 #, perl-format msgid "create `%s': %s" msgstr "" #: ../dgit:4041 msgid "fetching existing git history" msgstr "" #: ../dgit:4044 msgid "starting new git history" msgstr "" #: ../dgit:4069 #, 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:4074 #, perl-format msgid "fetched into %s" msgstr "" #: ../dgit:4087 #, perl-format msgid "Merge from %s [dgit]" msgstr "" #: ../dgit:4089 #, perl-format msgid "fetched to %s and merged into HEAD" msgstr "" #: ../dgit:4097 #, perl-format msgid "git tree contains %s" msgstr "" #: ../dgit:4108 msgid "you have uncommitted changes to critical files, cannot continue:\n" msgstr "" #: ../dgit:4127 #, 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:4144 msgid "nothing quilty to commit, ok." msgstr "" #: ../dgit:4147 msgid " (wanted to commit patch update)" msgstr "" #: ../dgit:4151 msgid "" "Commit Debian 3.0 (quilt) metadata\n" "\n" msgstr "" #: ../dgit:4189 #, perl-format msgid "" "Not doing any fixup of `%s' due to ----no-quilt-fixup or --quilt=nocheck" msgstr "" #: ../dgit:4194 #, perl-format msgid "Format `%s', need to check/update patch stack" msgstr "" #: ../dgit:4204 #, perl-format msgid "commit id %s" msgstr "" #: ../dgit:4210 #, perl-format msgid "and left in %s" msgstr "" #: ../dgit:4236 #, perl-format msgid "Wanted tag %s (%s) on dgit server, but not found\n" msgstr "" #: ../dgit:4239 #, perl-format msgid "Wanted tag %s (one of: %s) on dgit server, but not found\n" msgstr "" #: ../dgit:4247 #, perl-format msgid "%s (%s) .. %s (%s) is not fast forward\n" msgstr "" #: ../dgit:4256 msgid "version currently in archive" msgstr "" #: ../dgit:4265 #, perl-format msgid "Checking package changelog for archive version %s ..." msgstr "" #: ../dgit:4274 #, perl-format msgid "%s field from dpkg-parsechangelog %s" msgstr "" #: ../dgit:4285 #, perl-format msgid "Perhaps debian/changelog does not mention %s ?" msgstr "" #: ../dgit:4288 #, perl-format msgid "" "%s is %s\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" #: ../dgit:4293 #, perl-format msgid "" "d/changelog entry for %s is unfinalised!\n" "Your tree seems to based on earlier (not uploaded) %s.\n" msgstr "" #: ../dgit:4307 #, perl-format msgid "Declaring that HEAD includes all changes in %s..." msgstr "" #: ../dgit:4363 msgid "Checking that HEAD includes all changes in archive..." msgstr "" #: ../dgit:4372 msgid "maintainer view tag" msgstr "" #: ../dgit:4374 msgid "dgit view tag" msgstr "" #: ../dgit:4375 msgid "current archive contents" msgstr "" #: ../dgit:4388 msgid "" "| Not fast forward; maybe --trust-changelog is needed ? Please see " "dgit(1).\n" msgstr "" #: ../dgit:4398 #, perl-format msgid "Declare fast forward from %s\n" msgstr "" #: ../dgit:4399 #, perl-format msgid "Make fast forward from %s\n" msgstr "" #: ../dgit:4403 #, perl-format msgid "Made pseudo-merge of %s into dgit view." msgstr "" #: ../dgit:4416 #, perl-format msgid "Declare fast forward from %s" msgstr "" #: ../dgit:4424 #, perl-format msgid "Make pseudo-merge of %s into your HEAD." msgstr "" #: ../dgit:4439 #, perl-format msgid "%s field `%s' is not expected `%s'" msgstr "" #: ../dgit:4471 #, perl-format msgid "%s is for %s %s but debian/changelog is for %s %s" msgstr "" #: ../dgit:4514 #, perl-format msgid "DEP-14 tag %s does not exist (--dep14tag-reuse=%s)" msgstr "" #: ../dgit:4528 #, perl-format msgid "" "%s: making fresh DEP-14 tag %s (--dep14tag-reuse=%s), since existing tag " "unsuitable: %s" msgstr "" #: ../dgit:4538 #, perl-format msgid "existing DEP-14 tag %s is unsuitable (--dep14tag-reuse=%s): %s" msgstr "" #: ../dgit:4559 #, perl-format msgid "refers to commit %s, not %s" msgstr "" #: ../dgit:4569 #, perl-format msgid "verification failed: git verify-tag: %s" msgstr "" #: ../dgit:4623 #, perl-format msgid "%s already contains field %s" msgstr "" #: ../dgit:4655 #, perl-format msgid "changes field %s `%s' does not match changelog `%s'" msgstr "" #: ../dgit:4711 #, perl-format msgid "(maintainer view tag generated by dgit --quilt=%s)\n" msgstr "" #: ../dgit:4784 #, perl-format msgid "" "warning: server says object %s type %s is tainted, but here it has type %s\n" msgstr "" #: ../dgit:4817 msgid "commit" msgstr "" #: ../dgit:4819 #, perl-format msgid "object within commit %s" msgstr "" #: ../dgit:4827 msgid "pushing tainted objects (which server would reject)" msgstr "" #: ../dgit:4835 msgid "" "Push failed, while checking state of the archive.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:4845 msgid "" "package appears to be new in this suite; if this is intentional, use --new" msgstr "" #: ../dgit:4850 msgid "" "Push failed, while preparing your push.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:4869 #, perl-format msgid "looked for .dsc %s, but %s; maybe you forgot to build" msgstr "" #: ../dgit:4885 #, perl-format msgid "" "Branch is managed by git-debrebase (%s\n" "exists), but quilt mode (%s) implies a split view.\n" "Pass the right --quilt option or adjust your git config.\n" "Or, maybe, run git-debrebase forget-was-ever-debrebase.\n" msgstr "" #: ../dgit:4904 #, perl-format msgid "" "You seem to be trying to push an old version.\n" "Version current in archive: %s (in suite %s)\n" "Version you are trying to upload: %s\n" msgstr "" #: ../dgit:4918 #, perl-format msgid "" "--quilt=%s but no cached dgit view:\n" " perhaps HEAD changed since dgit build[-source] ?" msgstr "" #: ../dgit:4954 msgid "" "dgit push: HEAD is not a descendant of the archive's version.\n" "To overwrite the archive's contents, pass --trust-changelog, or --" "overwrite=VERSION.\n" "To rewrite history, if permitted by the archive, use --deliberately-not-fast-" "forward." msgstr "" #: ../dgit:4969 #, perl-format msgid "" "\n" "Version %s has already been tagged (pushed?)\n" "If this was a failed (or incomplete or rejected) upload by you, just\n" "add a new changelog stanza for a new version number and try again.\n" msgstr "" #: ../dgit:4975 #, perl-format msgid "Tag %s already exists.\n" msgstr "" #: ../dgit:4980 #, perl-format msgid "checking that %s corresponds to HEAD" msgstr "" #: ../dgit:5014 ../dgit:5026 #, perl-format msgid "HEAD specifies a different tree to %s:\n" msgstr "" #: ../dgit:5020 #, perl-format msgid "" "There is a problem with your source tree (see dgit(7) for some hints).\n" "To see a full diff, run git diff %s %s\n" msgstr "" #: ../dgit:5030 #, perl-format msgid "" "Perhaps you forgot to build. Or perhaps there is a problem with your\n" " source tree (see dgit(7) for some hints). To see a full diff, run\n" " git diff %s %s\n" msgstr "" #: ../dgit:5041 #, perl-format msgid "" "failed to find unique changes file (looked for %s in %s); perhaps you need " "to use dgit -C" msgstr "" #: ../dgit:5063 msgid "uploading binaries, although distro policy is source only" msgstr "" #: ../dgit:5067 msgid "source-only upload, although distro policy requires .debs" msgstr "" #: ../dgit:5071 #, perl-format msgid "" "source-only upload, though package appears entirely NEW\n" "(this is probably contrary to policy in %s)" msgstr "" #: ../dgit:5078 #, perl-format msgid "unknown source-only-uploads policy `%s'" msgstr "" #: ../dgit:5085 #, perl-format msgid "policy-query-supported-ssh value '%s' must be false/true/unknown" msgstr "" #: ../dgit:5148 msgid "" "Push failed, while signing the tag.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" #: ../dgit:5175 msgid "" "Push failed, *after* signing the tag.\n" "If you want to try again, you should use a new version number.\n" msgstr "" #: ../dgit:5194 msgid "" "Push failed, while updating the remote git repository - see messages above.\n" "If you want to try again, you should use a new version number.\n" msgstr "" #: ../dgit:5211 msgid "" "Push failed, while obtaining signatures on the .changes and .dsc.\n" "If it was just that the signature failed, you may try again by using\n" "debsign by hand to sign the changes file (see the command dgit tried,\n" "above), and then dput that changes file to complete the upload.\n" "If you need to change the package, you must use a new version number.\n" msgstr "" #: ../dgit:5229 #, perl-format msgid "[new .dsc & .changes left in %s.tmp, %s.tmp]" msgstr "" #: ../dgit:5236 #, perl-format msgid "" "Push failed, while uploading package(s) to the archive server.\n" "You can retry the upload of exactly these same files with dput of:\n" " %s\n" "If that .changes file is broken, you will need to use a new version\n" "number for your next attempt at the upload.\n" msgstr "" #: ../dgit:5245 #, perl-format msgid "pushed and uploaded %s" msgstr "" #: ../dgit:5257 msgid "-p is not allowed with clone; specify as argument instead" msgstr "" #: ../dgit:5268 msgid "incorrect arguments to dgit clone" msgstr "" #: ../dgit:5274 ../git-debrebase:1811 #, perl-format msgid "%s already exists" msgstr "" #: ../dgit:5288 #, perl-format msgid "remove %s: %s\n" msgstr "" #: ../dgit:5292 #, perl-format msgid "check whether to remove %s: %s\n" msgstr "" #: ../dgit:5330 msgid "incorrect arguments to dgit fetch or dgit pull" msgstr "" #: ../dgit:5348 msgid "" "dgit pull not yet supported in split view mode (including with view-" "splitting quilt modes)\n" msgstr "" #: ../dgit:5357 msgid "dgit checkout needs a suite argument" msgstr "" #: ../dgit:5420 #, perl-format msgid "setting up vcs-git: %s\n" msgstr "" #: ../dgit:5423 #, perl-format msgid "vcs git unchanged: %s\n" msgstr "" #: ../dgit:5425 #, perl-format msgid "changing vcs-git url to: %s\n" msgstr "" #: ../dgit:5430 #, perl-format msgid "fetching (%s)\n" msgstr "" #: ../dgit:5446 #, perl-format msgid "incorrect arguments to dgit %s" msgstr "" #: ../dgit:5457 #, perl-format msgid "dgit %s: changelog specifies %s (%s) but command line specifies %s" msgstr "" #: ../dgit:5481 #, perl-format msgid "dgit push, but dgit.default.push-subcmd set to %s" msgstr "" #: ../dgit:5489 #, perl-format msgid "dgit rpush, but dgit.default.[r]push-subcmd set to %s" msgstr "" #: ../dgit:5502 #, perl-format msgid "" "warning: \"dgit %s\" currently means \"dgit %s-built\" (by default)\n" "warning: but is going to change to \"dgit %s-source\". See dgit!(1).\n" msgstr "" #: ../dgit:5542 #, perl-format msgid "" "build host has dgit rpush protocol versions %s but invocation host has %s" msgstr "" #: ../dgit:5626 #, perl-format msgid "create %s: %s" msgstr "" #: ../dgit:5672 #, perl-format msgid "build host child failed: %s" msgstr "" #: ../dgit:5675 msgid "all done\n" msgstr "" #: ../dgit:5684 #, perl-format msgid "file %s (%s) twice" msgstr "" #: ../dgit:5690 msgid "bad param spec" msgstr "" #: ../dgit:5696 msgid "bad previously spec" msgstr "" #: ../dgit:5768 #, perl-format msgid "buildinfo mismatch in field %s" msgstr "" #: ../dgit:5771 msgid "buildinfo mismatch in field Architecture" msgstr "" #: ../dgit:5773 #, perl-format msgid "buildinfo contains forbidden field %s" msgstr "" #: ../dgit:5795 msgid "build-host-supplied changes file is not source-only" msgstr "" #: ../dgit:5825 msgid "remote changes file" msgstr "" #: ../dgit:5908 msgid "not a plain file\n" msgstr "" #: ../dgit:5914 msgid "mode or type changed in unsupported way\n" msgstr "" #: ../dgit:5917 msgid "modified symlink\n" msgstr "" #: ../dgit:5920 msgid "deletion of symlink\n" msgstr "" #: ../dgit:5924 msgid "creation with non-default mode, or symlink\n" msgstr "" #: ../dgit:5952 #, perl-format msgid "dgit: cannot represent change: %s: %s\n" msgstr "" #: ../dgit:5957 msgid "" "HEAD has changes to .orig[s] which are not representable by `3.0 (quilt)'\n" msgstr "" #: ../dgit:5995 #, perl-format msgid "" "\n" "For full diff showing the problem(s), type:\n" " %s\n" msgstr "" #: ../dgit:6002 #, perl-format msgid "" "--quilt=%s specified, implying patches-unapplied git tree\n" " but git tree differs from orig in upstream files." msgstr "" #: ../dgit:6008 msgid "" "\n" " ... debian/patches is missing; perhaps this is a patch queue branch?" msgstr "" #: ../dgit:6015 #, 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:6029 #, perl-format msgid "Combine debian/ with upstream source for %s\n" msgstr "" #: ../dgit:6037 msgid "dgit view: creating patches-applied version using gbp pq" msgstr "" #: ../dgit:6048 #, 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:6056 msgid "dgit view: creating patch to represent .gitignore changes" msgstr "" #: ../dgit:6061 #, perl-format msgid "%s already exists; but want to create it to record .gitignore changes" msgstr "" #: ../dgit:6067 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:6090 msgid "Commit patch to update .gitignore\n" msgstr "" #: ../dgit:6160 msgid "maximum search space exceeded" msgstr "" #: ../dgit:6178 #, perl-format msgid "has %s not %s" msgstr "" #: ../dgit:6187 msgid "root commit" msgstr "" #: ../dgit:6193 #, perl-format msgid "merge (%s nontrivial parents)" msgstr "" #: ../dgit:6205 #, perl-format msgid "changed %s" msgstr "" #: ../dgit:6224 #, perl-format msgid "" "\n" "%s: error: quilt fixup cannot be linear. Stopped at:\n" msgstr "" #: ../dgit:6231 #, perl-format msgid "%s: %s: %s\n" msgstr "" #: ../dgit:6243 msgid "quilt history linearisation failed. Search `quilt fixup' in dgit(7).\n" msgstr "" #: ../dgit:6246 msgid "quilt fixup cannot be linear, smashing..." msgstr "" #: ../dgit:6260 #, perl-format msgid "" "Automatically generated patch (%s)\n" "Last (up to) %s git changes, FYI:\n" "\n" msgstr "" #: ../dgit:6267 msgid "quiltify linearisation planning successful, executing..." msgstr "" #: ../dgit:6301 msgid "contains unexpected slashes\n" msgstr "" #: ../dgit:6302 msgid "contains leading punctuation\n" msgstr "" #: ../dgit:6303 msgid "contains bad character(s)\n" msgstr "" #: ../dgit:6304 msgid "is series file\n" msgstr "" #: ../dgit:6305 msgid "too long\n" msgstr "" #: ../dgit:6309 #, perl-format msgid "quiltifying commit %s: ignoring/dropping Gbp-Pq %s: %s" msgstr "" #: ../dgit:6338 #, perl-format msgid "dgit: patch title transliteration error: %s" msgstr "" #: ../dgit:6413 #, perl-format msgid "" "quilt mode %s does not make sense (or is not supported) with single-debian-" "patch" msgstr "" #: ../dgit:6438 msgid "converted" msgstr "" #: ../dgit:6439 #, perl-format msgid "dgit view: created (%s)" msgstr "" #: ../dgit:6495 msgid "Commit removal of .pc (quilt series tracking data)\n" msgstr "" #: ../dgit:6505 msgid "starting quiltify (single-debian-patch)" msgstr "" #: ../dgit:6541 #, perl-format msgid "regenerating patch using git diff (--quilt=%s)" msgstr "" #: ../dgit:6635 msgid "" "warning: package uses dpkg-source include-binaries feature - not all changes " "are visible in patches!\n" msgstr "" #: ../dgit:6644 #, perl-format msgid "warning: ignoring bad include-binaries file %s: %s\n" msgstr "" #: ../dgit:6647 #, perl-format msgid "forbidden path component '%s'" msgstr "" #: ../dgit:6657 #, perl-format msgid "path starts with '%s'" msgstr "" #: ../dgit:6667 #, perl-format msgid "path to '%s' not a plain file or directory" msgstr "" #: ../dgit:6725 #, perl-format msgid "dgit: split brain (separate dgit view) may be needed (--quilt=%s)." msgstr "" #: ../dgit:6757 #, perl-format msgid "dgit view: found cached (%s)" msgstr "" #: ../dgit:6762 msgid "dgit view: found cached, no changes required" msgstr "" #: ../dgit:6797 #, perl-format msgid "examining quilt state (multiple patches, %s mode)" msgstr "" #: ../dgit:6890 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:6904 msgid "Tree already contains .pc - will delete it." msgstr "" #: ../dgit:6938 msgid "baredebian quilt fixup: could not find any origs" msgstr "" #: ../dgit:6951 msgid "tarball" msgstr "" #: ../dgit:6969 #, perl-format msgid "Combine orig tarballs for %s %s" msgstr "" #: ../dgit:6985 msgid "tarballs" msgstr "" #: ../dgit:6999 msgid "upstream" msgstr "" #: ../dgit:7023 #, perl-format msgid "%s: base trees orig=%.20s o+d/p=%.20s" msgstr "" #: ../dgit:7033 #, 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:7043 msgid "" "This has only a debian/ directory; you probably want --quilt=bare debian." msgstr "" #: ../dgit:7047 msgid "This might be a patches-unapplied branch." msgstr "" #: ../dgit:7050 msgid "This might be a patches-applied branch." msgstr "" #: ../dgit:7053 msgid "Maybe you need one of --[quilt=]gbp --[quilt=]dpm --quilt=unapplied ?" msgstr "" #: ../dgit:7056 msgid "Warning: Tree has .gitattributes. See GITATTRIBUTES in dgit(7)." msgstr "" #: ../dgit:7060 msgid "Maybe orig tarball(s) are not identical to git representation?" msgstr "" #: ../dgit:7071 #, perl-format msgid "starting quiltify (multiple patches, %s mode)" msgstr "" #: ../dgit:7110 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:7122 msgid "dgit: Unapplying patches again to tidy up the tree." msgstr "" #: ../dgit:7151 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:7163 msgid "tree contains uncommitted files and --clean=check specified" msgstr "" #: ../dgit:7166 msgid "tree contains uncommitted files (NB dgit didn't run rules clean)" msgstr "" #: ../dgit:7169 msgid "" "tree contains uncommitted, 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:7183 #, perl-format msgid "" "quilt mode %s (generally needs untracked upstream files)\n" "contradicts clean mode %s (which would delete them)\n" msgstr "" #: ../dgit:7200 msgid "tree contains uncommitted files (after running rules clean)" msgstr "" #: ../dgit:7214 msgid "clean takes no additional arguments" msgstr "" #: ../dgit:7233 #, perl-format msgid "-p specified package %s, but changelog says %s" msgstr "" #: ../dgit:7243 msgid "" "dgit: --include-dirty is not supported with split view (including with view-" "splitting quilt modes)" msgstr "" #: ../dgit:7251 msgid "" "tree has .gitignore(s) but debian/source/options has 'tar-ignore'\n" "Try 'tar-ignore=.git' in d/s/options instead. (See #908747.)\n" msgstr "" #: ../dgit:7256 #, perl-format msgid "" "%s: warning: debian/source/options contains bare 'tar-ignore'\n" "This can cause .gitignore files to be improperly omitted. See #908747.\n" msgstr "" #: ../dgit:7267 #, perl-format msgid "dgit: --quilt=%s, %s" msgstr "" #: ../dgit:7271 msgid "dgit: --upstream-commitish only makes sense with --quilt=baredebian" msgstr "" #: ../dgit:7306 #, perl-format msgid "remove old changes file %s: %s" msgstr "" #: ../dgit:7308 #, perl-format msgid "would remove %s" msgstr "" #: ../dgit:7326 #, perl-format msgid "warning: dgit option %s must be passed before %s on dgit command line\n" msgstr "" #: ../dgit:7333 #, 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:7359 msgid "archive query failed (queried because --since-version not specified)" msgstr "" #: ../dgit:7365 #, perl-format msgid "changelog will contain changes since %s" msgstr "" #: ../dgit:7368 msgid "package seems new, not specifying -v" msgstr "" #: ../dgit:7411 msgid "Wanted to build nothing!" msgstr "" #: ../dgit:7449 #, perl-format msgid "only one changes file from build (%s)\n" msgstr "" #: ../dgit:7456 #, perl-format msgid "%s found in binaries changes file %s" msgstr "" #: ../dgit:7463 #, perl-format msgid "%s unexpectedly not created by build" msgstr "" #: ../dgit:7467 #, perl-format msgid "install new changes %s{,.inmulti}: %s" msgstr "" #: ../dgit:7472 #, perl-format msgid "wrong number of different changes files (%s)" msgstr "" #: ../dgit:7475 #, perl-format msgid "build successful, results in %s\n" msgstr "" #: ../dgit:7488 #, 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:7506 msgid "build successful\n" msgstr "" #: ../dgit:7514 #, 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:7625 #, perl-format msgid "remove %s: %s" msgstr "" #: ../dgit:7632 msgid "--tag2upload-builder-mode needs split-brain mode" msgstr "" #: ../dgit:7637 msgid "upstream tag and not commit, or vice-versa" msgstr "" #: ../dgit:7693 msgid "--include-dirty not supported with --build-products-dir, sorry" msgstr "" #: ../dgit:7718 msgid "--include-dirty not supported with --tag2upload-builder-mode" msgstr "" #: ../dgit:7731 msgid "source-only buildinfo" msgstr "" #: ../dgit:7760 #, perl-format msgid "put in place new built file (%s): %s" msgstr "" #: ../dgit:7777 msgid "build-source takes no additional arguments" msgstr "" #: ../dgit:7781 #, perl-format msgid "source built, results in %s and %s" msgstr "" #: ../dgit:7788 msgid "" "dgit push-source: --include-dirty/--ignore-dirty does not makesense with " "push-source!" msgstr "" #: ../dgit:7793 msgid "--tag2upload-builder-mode not supported with -C" msgstr "" #: ../dgit:7796 msgid "source changes file" msgstr "" #: ../dgit:7798 msgid "user-specified changes file is not source-only" msgstr "" #: ../dgit:7818 ../dgit:7820 #, perl-format msgid "%s (in build products dir): %s" msgstr "" #: ../dgit:7834 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:7847 msgid "" "you asked for a builder but your debbuildopts didn't ask for any binaries -- " "is this really what you meant?" msgstr "" #: ../dgit:7851 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:7881 msgid "incorrect arguments to dgit print-unapplied-treeish" msgstr "" #: ../dgit:7902 msgid "source tree" msgstr "" #: ../dgit:7904 #, perl-format msgid "dgit: import-dsc: %s" msgstr "" #: ../dgit:7917 #, perl-format msgid "unknown dgit import-dsc sub-option `%s'" msgstr "" #: ../dgit:7921 msgid "usage: dgit import-dsc .../PATH/TO/.DSC BRANCH" msgstr "" #: ../dgit:7925 msgid "dry run makes no sense with import-dsc" msgstr "" #: ../dgit:7942 #, perl-format msgid "%s is checked out - will not update it" msgstr "" #: ../dgit:7947 #, perl-format msgid "open import .dsc (%s): %s" msgstr "" #: ../dgit:7949 #, perl-format msgid "read %s: %s" msgstr "" #: ../dgit:7960 msgid "import-dsc signature check failed" msgstr "" #: ../dgit:7963 #, perl-format msgid "%s: warning: importing unsigned .dsc\n" msgstr "" #: ../dgit:7974 msgid "Dgit metadata in .dsc" msgstr "" #: ../dgit:7985 msgid "dgit: import-dsc of .dsc with Dgit field, using git hash" msgstr "" #: ../dgit:7994 #, 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:8001 msgid "Not fast forward, forced update." msgstr "" #: ../dgit:8003 #, perl-format msgid "Not fast forward to %s" msgstr "" #: ../dgit:8008 #, perl-format msgid "updated git ref %s" msgstr "" #: ../dgit:8013 #, 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:8033 #, perl-format msgid "lstat %s works but stat gives %s !" msgstr "" #: ../dgit:8035 #, perl-format msgid "stat %s: %s" msgstr "" #: ../dgit:8043 #, perl-format msgid "import %s requires %s, but: %s" msgstr "" #: ../dgit:8062 #, perl-format msgid "cannot import %s which seems to be inside working tree!" msgstr "" #: ../dgit:8066 #, perl-format msgid "symlink %s to %s: %s" msgstr "" #: ../dgit:8067 #, perl-format msgid "made symlink %s -> %s" msgstr "" #: ../dgit:8078 msgid "Import, forced update - synthetic orphan git history." msgstr "" #: ../dgit:8080 msgid "Import, merging." msgstr "" #: ../dgit:8094 #, perl-format msgid "Merge %s (%s) import into %s\n" msgstr "" #: ../dgit:8103 #, perl-format msgid "results are in git ref %s" msgstr "" #: ../dgit:8110 msgid "need only 1 subpath argument" msgstr "" #: ../dgit:8128 msgid "need destination argument" msgstr "" #: ../dgit:8133 #, perl-format msgid "exec git clone: %s\n" msgstr "" #: ../dgit:8141 msgid "no arguments allowed to dgit print-dgit-repos-server-source-url" msgstr "" #: ../dgit:8152 msgid "no arguments allowed to dgit print-dpkg-source-ignores" msgstr "" #: ../dgit:8158 msgid "no arguments allowed to dgit setup-mergechangelogs" msgstr "" #: ../dgit:8165 ../dgit:8171 msgid "no arguments allowed to dgit setup-useremail" msgstr "" #: ../dgit:8177 msgid "no arguments allowed to dgit setup-tree" msgstr "" #: ../dgit:8228 msgid "" "--initiator-tempdir must be used specify an absolute, not relative, " "directory." msgstr "" #: ../dgit:8267 #, perl-format msgid "%s needs a value" msgstr "" #: ../dgit:8271 #, perl-format msgid "bad value `%s' for %s" msgstr "" #: ../dgit:8380 #, perl-format msgid "%s: warning: ignoring unknown force option %s\n" msgstr "" #: ../dgit:8404 #, perl-format msgid "unknown long option `%s'" msgstr "" #: ../dgit:8461 #, perl-format msgid "unknown short option `%s'" msgstr "" #: ../dgit:8484 #, perl-format msgid "%s is set to something other than SIG_DFL\n" msgstr "" #: ../dgit:8488 #, perl-format msgid "%s is blocked\n" msgstr "" #: ../dgit:8494 #, 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:8541 #, perl-format msgid "" "unsupported option `%s', cannot set command for %s (can only provide options)" msgstr "" #: ../dgit:8546 #, perl-format msgid "" "unsupported option `%s', cannot provide additional options for %s (can only " "provide replacement command)" msgstr "" #: ../dgit:8553 #, perl-format msgid "" "unsupported option `%s', cannot adjust options for %s (can only provide " "replacement command)" msgstr "" #: ../dgit:8585 #, perl-format msgid "cannot set command for %s (can only provide options)" msgstr "" #: ../dgit:8606 #, perl-format msgid "cannot configure options for %s (can only provide replacement command)" msgstr "" #: ../dgit:8625 #, perl-format msgid "unknown quilt-mode `%s'" msgstr "" #: ../dgit:8637 #, perl-format msgid "unknown %s setting `%s'" msgstr "" #: ../dgit:8650 msgid "--tag2upload-builder-mode implies --dep14tag-reuse=must" msgstr "" #: ../dgit:8657 #, perl-format msgid "unknown dep14tag-reuse mode `%s'" msgstr "" #: ../dgit:8680 msgid "DRY RUN ONLY\n" msgstr "" #: ../dgit:8681 msgid "DAMP RUN - WILL MAKE LOCAL (UNSIGNED) CHANGES\n" msgstr "" #: ../dgit:8701 #, 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 overridden by individual -f options\n" msgstr "" #: ../git-debrebase:385 #, perl-format msgid "%s: snags: %d overridden 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:1037 #, perl-format msgid "inconsistent anchors in merged-breakwaters %s" msgstr "" #: ../git-debrebase:1077 #, perl-format msgid "branch needs laundering (run git-debrebase): %s" msgstr "" #: ../git-debrebase:1105 #, perl-format msgid "packaging change (%s) follows upstream change" msgstr "" #: ../git-debrebase:1106 #, perl-format msgid " (eg %s)" msgstr "" #: ../git-debrebase:1112 msgid "found mixed upstream/packaging commit" msgstr "" #: ../git-debrebase:1113 ../git-debrebase:1121 ../git-debrebase:1126 #: ../git-debrebase:1131 ../git-debrebase:1137 ../git-debrebase:1145 #, perl-format msgid " (%s)" msgstr "" #: ../git-debrebase:1120 #, perl-format msgid "found interchange bureaucracy commit (%s)" msgstr "" #: ../git-debrebase:1125 msgid "found dgit dsc import" msgstr "" #: ../git-debrebase:1130 msgid "found bare dgit dsc import with no prior history" msgstr "" #: ../git-debrebase:1136 msgid "found vanilla merge" msgstr "" #: ../git-debrebase:1143 #, perl-format msgid "found unprocessable commit, cannot cope: %s" msgstr "" #: ../git-debrebase:1154 msgid "old anchor is recognised due to --anchor, cannot check upstream" 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:1771 msgid "launder for rebase" msgstr "" #: ../git-debrebase:1776 msgid "analyse does not support any options" msgstr "" #: ../git-debrebase:1778 msgid "too many arguments to analyse" msgstr "" #: ../git-debrebase:1813 msgid "HEAD symref is not to refs/heads/" msgstr "" #: ../git-debrebase:1836 #, perl-format msgid "OK, you are ahead of %s\n" msgstr "" #: ../git-debrebase:1840 #, perl-format msgid "you are behind %s, divergence risk" msgstr "" #: ../git-debrebase:1844 #, perl-format msgid "you have diverged from %s" msgstr "" #: ../git-debrebase:1866 msgid "remote dgit branch" msgstr "" #: ../git-debrebase:1869 msgid "remote dgit branch for sid" msgstr "" #: ../git-debrebase:1897 msgid "Recorded previous head for preservation" msgstr "" #: ../git-debrebase:1905 #, perl-format msgid "could not record ffq-prev: %s" msgstr "" #: ../git-debrebase:1916 #, perl-format msgid "could not check ffq-prev: %s" msgstr "" #: ../git-debrebase:1936 msgid "fast forward" msgstr "" #: ../git-debrebase:1946 msgid "Declare fast forward / record previous work" msgstr "" #: ../git-debrebase:1958 msgid "No ffq-prev to stitch." msgstr "" #: ../git-debrebase:1975 msgid "need NEW-VERSION [UPS-COMMITTISH]" msgstr "" #: ../git-debrebase:1980 #, perl-format msgid "bad version number `%s'" msgstr "" #: ../git-debrebase:1999 #, perl-format msgid "upstream piece `%s'" msgstr "" #: ../git-debrebase:2000 msgid "upstream (main piece" msgstr "" #: ../git-debrebase:2020 msgid "for each EXTRA-UPS-NAME need EXTRA-UPS-COMMITISH" msgstr "" #: ../git-debrebase:2053 #, 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:2062 #, perl-format msgid "previous upstream combine %s first piece is not `.'" msgstr "" #: ../git-debrebase:2075 #, perl-format msgid "" "previous upstream %s is from git-debrebase but not an `upstream-combine' " "commit" msgstr "" #: ../git-debrebase:2086 #, perl-format msgid "introducing upstream piece `%s'" msgstr "" #: ../git-debrebase:2089 #, perl-format msgid "dropping upstream piece `%s'" msgstr "" #: ../git-debrebase:2092 #, perl-format msgid "not fast forward: %s %s" msgstr "" #: ../git-debrebase:2203 msgid "Previous head already recorded\n" msgstr "" #: ../git-debrebase:2207 #, perl-format msgid "Could not preserve: %s" msgstr "" #: ../git-debrebase:2212 ../git-debrebase:2218 ../git-debrebase:2224 #: ../git-debrebase:2324 ../git-debrebase:2333 ../git-debrebase:2357 #: ../git-debrebase:2421 msgid "no arguments allowed" msgstr "" #: ../git-debrebase:2246 msgid "branch contains furniture (not laundered)" msgstr "" #: ../git-debrebase:2247 msgid "branch is unlaundered" msgstr "" #: ../git-debrebase:2248 msgid "branch needs laundering" msgstr "" #: ../git-debrebase:2249 msgid "branch not in git-debrebase form" msgstr "" #: ../git-debrebase:2259 msgid "current branch contents, in git-debrebase terms:\n" msgstr "" #: ../git-debrebase:2261 msgid " branch is laundered\n" msgstr "" #: ../git-debrebase:2277 #, perl-format msgid " %s is not well-defined\n" msgstr "" #: ../git-debrebase:2283 msgid "key git-debrebase commits:\n" msgstr "" #: ../git-debrebase:2284 msgid "anchor" msgstr "" #: ../git-debrebase:2285 msgid "breakwater" msgstr "" #: ../git-debrebase:2300 msgid "branch and ref status, in git-debrebase terms:\n" msgstr "" #: ../git-debrebase:2307 msgid " unstitched; previous tip was:\n" msgstr "" #: ../git-debrebase:2310 msgid " stitched? (no record of git-debrebase work)\n" msgstr "" #: ../git-debrebase:2312 msgid " stitched\n" msgstr "" #: ../git-debrebase:2314 msgid " not git-debrebase (diverged since last stitch)\n" msgstr "" #: ../git-debrebase:2317 msgid "you are currently rebasing\n" msgstr "" #: ../git-debrebase:2334 ../git-debrebase:2347 msgid "launder for git-debrebase quick" msgstr "" #: ../git-debrebase:2341 ../git-debrebase:2371 msgid "No ongoing git-debrebase session." msgstr "" #: ../git-debrebase:2410 msgid "Commit patch queue (exported by git-debrebase)" msgstr "" #: ../git-debrebase:2427 msgid "No (more) patches to export." msgstr "" #: ../git-debrebase:2434 #, perl-format msgid "" "Patch export produced patch amendments (abandoned output commit %s). Try " "laundering first." msgstr "" #: ../git-debrebase:2454 #, perl-format msgid "%s contains comments, which will be discarded" msgstr "" #: ../git-debrebase:2459 #, perl-format msgid "patch %s repeated in %s !" msgstr "" #: ../git-debrebase:2466 #, perl-format msgid "Unused patch file %s will be discarded" msgstr "" #: ../git-debrebase:2474 msgid "ffq-prev exists, this is already managed by git-debrebase!" msgstr "" #: ../git-debrebase:2479 msgid "ahead of debrebase-last, this is already managed by git-debrebase!" msgstr "" #: ../git-debrebase:2496 msgid "want only 1 optional argument, the upstream git commitish" msgstr "" #: ../git-debrebase:2501 msgid "missing Version from changelog\n" msgstr "" #: ../git-debrebase:2517 #, 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:2525 #, perl-format msgid "upstream (%s) is not an ancestor of HEAD" msgstr "" #: ../git-debrebase:2532 #, 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:2534 #, perl-format msgid "list expected changes with: %s\n" msgstr "" #: ../git-debrebase:2541 #, perl-format msgid "upstream (%s) contains debian/ directory" msgstr "" #: ../git-debrebase:2559 msgid "neither of the first two changelog entries are released\n" msgstr "" #: ../git-debrebase:2565 #, perl-format msgid "could not find suitable maintainer view tag %s\n" msgstr "" #: ../git-debrebase:2568 #, perl-format msgid "HEAD is not FF from maintainer tag %s!" msgstr "" #: ../git-debrebase:2571 #, perl-format msgid "dgit view tag %s not found\n" msgstr "" #: ../git-debrebase:2573 #, perl-format msgid "dgit view tag %s is not FF from maintainer tag %s\n" msgstr "" #: ../git-debrebase:2575 #, perl-format msgid "will stitch in dgit view, %s\n" msgstr "" #: ../git-debrebase:2582 #, perl-format msgid "" "Cannot confirm dgit view: %s\n" "Failed to stitch in dgit view (see messages above).\n" "dgit --trust-changelog will be needed on the first dgit push after " "conversion.\n" msgstr "" #: ../git-debrebase:2628 #, perl-format msgid "%s: converted from patched-unapplied (gbp) branch format, OK\n" msgstr "" #: ../git-debrebase:2657 #, 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:2678 msgid "takes 1 optional argument, the upstream commitish" msgstr "" #: ../git-debrebase:2686 #, perl-format msgid "%s, from command line" msgstr "" #: ../git-debrebase:2700 #, 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:2704 msgid "Branch already in git-debrebase format." msgstr "" #: ../git-debrebase:2716 msgid "Considering possible commits corresponding to upstream:\n" msgstr "" #: ../git-debrebase:2724 #, perl-format msgid "git tag %s" msgstr "" #: ../git-debrebase:2730 #, perl-format msgid " git tag: no suitable tag found (tried %s)\n" msgstr "" #: ../git-debrebase:2739 #, perl-format msgid "opendir build-products-dir %s: %s" msgstr "" #: ../git-debrebase:2745 #, perl-format msgid " orig: found what looks like a .orig, %s\n" msgstr "" #: ../git-debrebase:2776 #, perl-format msgid " orig: no suitable origs found (looked for %s in %s)\n" msgstr "" #: ../git-debrebase:2785 msgid "Evaluating possible commits corresponding to upstream:\n" msgstr "" #: ../git-debrebase:2826 #, perl-format msgid " %s: couldn't apply patches: gbp pq %s" msgstr "" #: ../git-debrebase:2835 #, perl-format msgid " %s: applying patches gives different tree\n" msgstr "" #: ../git-debrebase:2849 msgid "" "Could not find or construct a suitable upstream commit.\n" "Rerun adding --diagnose after convert-from-dgit-view, or pass a\n" "upstream commit explicitly or provide suitable origs.\n" msgstr "" #: ../git-debrebase:2855 #, perl-format msgid "Yes, will base new branch on %s\n" msgstr "" #: ../git-debrebase:2860 #, 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:2868 msgid "Output of conversion does not match input!" msgstr "" #: ../git-debrebase:2876 msgid "forget-was-ever-debrebase takes no further arguments" msgstr "" #: ../git-debrebase:2880 #, perl-format msgid "Not suitable for recording git-debrebaseness anyway: %s" msgstr "" #: ../git-debrebase:2985 msgid "bad options\n" msgstr "" #: ../git-debrebase:2995 #, perl-format msgid "" "%s: with git-debrebase, get-rebase -i option may only be followed by more " "options (as separate arguments)" msgstr "" #: ../git-debrebase:3025 #, perl-format msgid "unknown git-debrebase sub-operation %s" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:93 ../Debian/Dgit/ProtoConn.pm:112 #, perl-format msgid "connection lost: %s" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:94 #, perl-format msgid "protocol violation; %s not expected" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:115 #, perl-format msgid "eof (reading %s)" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:135 msgid "protocol message" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:144 #, perl-format msgid "`%s'" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:149 msgid "bad byte count" msgstr "" #: ../Debian/Dgit/ProtoConn.pm:152 msgid "data block" msgstr "" #: ../Debian/Dgit.pm:352 #, perl-format msgid "error: %s\n" msgstr "" #: ../Debian/Dgit.pm:378 #, perl-format msgid "getcwd failed: %s\n" msgstr "" #: ../Debian/Dgit.pm:397 msgid "terminated, reporting successful completion" msgstr "" #: ../Debian/Dgit.pm:399 #, perl-format msgid "failed with error exit status %s" msgstr "" #: ../Debian/Dgit.pm:402 #, perl-format msgid "died due to fatal signal %s" msgstr "" #: ../Debian/Dgit.pm:406 #, perl-format msgid "failed with unknown wait status %s" msgstr "" #: ../Debian/Dgit.pm:412 msgid "failed command" msgstr "" #: ../Debian/Dgit.pm:418 #, perl-format msgid "failed to fork/exec: %s" msgstr "" #: ../Debian/Dgit.pm:420 #, perl-format msgid "subprocess %s" msgstr "" #: ../Debian/Dgit.pm:422 msgid "subprocess produced invalid output" msgstr "" #: ../Debian/Dgit.pm:527 msgid "stat source file: %S" msgstr "" #: ../Debian/Dgit.pm:537 msgid "stat destination file: %S" msgstr "" #: ../Debian/Dgit.pm:556 msgid "finally install file after cp: %S" msgstr "" #: ../Debian/Dgit.pm:562 msgid "delete old file after cp: %S" msgstr "" #: ../Debian/Dgit.pm:585 msgid "" "not in a git working tree?\n" "(git rev-parse --show-toplevel produced no output)\n" msgstr "" #: ../Debian/Dgit.pm:588 #, perl-format msgid "chdir toplevel %s: %s\n" msgstr "" #: ../Debian/Dgit.pm:696 msgid "git index contains changes (does not match HEAD)" msgstr "" #: ../Debian/Dgit.pm:697 msgid "working tree is dirty (does not match HEAD)" msgstr "" #: ../Debian/Dgit.pm:722 msgid "using specified upstream commitish" msgstr "" #: ../Debian/Dgit.pm:729 #, 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:734 ../Debian/Dgit.pm:736 #, perl-format msgid "using upstream from git tag %s" msgstr "" #: ../Debian/Dgit.pm:850 #, perl-format msgid "failed to remove directory tree %s: rm -rf: %s; %s\n" msgstr "" #: ../Debian/Dgit.pm:885 msgid "detached HEAD" msgstr "" #: ../Debian/Dgit.pm:886 msgid "HEAD symref is not to refs/" msgstr "" #: ../Debian/Dgit.pm:902 #, perl-format msgid "parsing of %s failed" msgstr "" #: ../Debian/Dgit.pm:911 #, 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:925 #, perl-format msgid "open %s (%s): %s" msgstr "" #: ../Debian/Dgit.pm:950 #, perl-format msgid "missing field %s in %s" msgstr "" #: ../Debian/Dgit.pm:1036 msgid "Dummy commit - do not use\n" msgstr "" #: ../Debian/Dgit.pm:1057 #, perl-format msgid "exec %s: %s\n" msgstr "" #: ../Debian/Dgit.pm:1085 #, perl-format msgid "Taint recorded at time %s for package %s" msgstr "" #: ../Debian/Dgit.pm:1087 #, perl-format msgid "Taint recorded at time %s for any package" msgstr "" #: ../Debian/Dgit.pm:1089 #, perl-format msgid "Taint recorded for package %s" msgstr "" #: ../Debian/Dgit.pm:1091 msgid "Taint recorded for any package" msgstr "" #: ../Debian/Dgit.pm:1103 msgid "Uncorrectable error. If confused, consult administrator.\n" msgstr "" #: ../Debian/Dgit.pm:1106 msgid "Could perhaps be forced using --deliberately. Consult documentation.\n" msgstr "" #: ../Debian/Dgit.pm:1109 #, perl-format msgid "Forcing due to %s\n" msgstr "" #: ../Debian/Dgit.pm:1174 #, perl-format msgid "cannot stat %s/.git: %s" msgstr "" #: ../Debian/Dgit.pm:1197 #, perl-format msgid "failed to mkdir playground parent %s: %s" msgstr "" #: ../Debian/Dgit.pm:1205 #, perl-format msgid "failed to mkdir a playground %s: %s" msgstr "" #: ../Debian/Dgit.pm:1214 #, perl-format msgid "failed to mkdir the playground %s: %s" msgstr "" work/po/nl.po0000664000000000000000000031565015016262471010335 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-2025. # msgid "" msgstr "" "Project-Id-Version: dgit_12.11\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-05-07 18:40+0000\n" "PO-Revision-Date: 2025-04-12 21:45+0200\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 3.2.2\n" #: ../dgit:296 #, perl-format msgid "%s: invalid configuration: %s\n" msgstr "%s: ongeldige configuratie: %s\n" #: ../dgit:303 msgid "warning: overriding problem due to --force:\n" msgstr "waarschuwing: overschrijvingsprobleem wegens --force:\n" #: ../dgit:311 #, perl-format msgid "warning: skipping checks or functionality due to --force-%s\n" msgstr "" "waarschuwing: controles of functionaliteit overgeslagen wegens --force-%s\n" #: ../dgit:316 #, 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:589 #, perl-format msgid "build host child %s" msgstr "bouwcomputer-dochter %s" #: ../dgit:648 #, perl-format msgid "%s ok: %s" msgstr "%s oké: %s" #: ../dgit:650 #, perl-format msgid "would be ok: %s (but dry run only)" msgstr "zou oké zijn: %s (maar slechts een testuitvoering)" #: ../dgit:675 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-source [dgit-opts] [suite]\n" " dgit [dgit-opts] push-built [dgit-opts] [suite]\n" " dgit [dgit-opts] rpush-source|rpush-built 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-source [dgit-opties] [suite]\n" "\n" " dgit [dgit-opties] push-built [dgit-opties] [suite]\n" " dgit [dgit-opties] rpush-source|rpush-built 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:694 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:698 #, perl-format msgid "" "%s: %s\n" "%s" msgstr "" "%s: %s\n" "%s" #: ../dgit:703 msgid "too few arguments" msgstr "te weinig argumenten" #: ../dgit:825 #, perl-format msgid "multiple values for %s (in %s git config)" msgstr "verschillende waarden voor %s (in %s git config)" #: ../dgit:828 #, 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:848 #, 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:905 #, 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:920 #, perl-format msgid "backports-quirk needs % or ( )" msgstr "backports-spitsvondigheid vereist % of ( )" #: ../dgit:936 #, 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:956 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:974 #, perl-format msgid "unknown %s `%s'" msgstr "onbekend %s `%s'" #: ../dgit:979 ../git-debrebase:1548 ../Debian/Dgit.pm:255 msgid "internal error" msgstr "interne fout" #: ../dgit:981 msgid "pushing but distro is configured readonly" msgstr "" "een push aan het uitvoeren, maar de distributie is voor alleen-lezen " "geconfigureerd" #: ../dgit:985 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:1008 #, 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:1169 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:1237 #, perl-format msgid "fetch of %s failed (%s): %s" msgstr "ophalen (fetch) van %s mislukte (%s): %s" #: ../dgit:1244 #, perl-format msgid "fetch of %s gave HTTP code %s" msgstr "een fetch van %s gaf HTTP-code %s" #: ../dgit:1265 msgid "ftpmasterapi archive query method takes no data part" msgstr "" "de methode ftpmasterapi voor een verzoek aan het archief kent geen data-" "onderdeel" #: ../dgit:1283 #, perl-format msgid "unknown suite %s, maybe -d would help" msgstr "onbekende suite %s, misschien is -d nuttig" #: ../dgit:1287 #, perl-format msgid "multiple matches for suite %s\n" msgstr "meerdere overeenkomsten met suite %s\n" #: ../dgit:1289 #, perl-format msgid "suite %s info has no codename\n" msgstr "info over suite %s bevat geen codenaam\n" #: ../dgit:1291 #, perl-format msgid "suite %s maps to bad codename\n" msgstr "suite %s is gekoppeld aan een verkeerde codenaam\n" #: ../dgit:1293 ../dgit:1318 msgid "bad ftpmaster api response: " msgstr "verkeerd antwoord van de ftpmaster api: " #: ../dgit:1307 #, perl-format msgid "bad version: %s\n" msgstr "verkeerde versie: %s\n" #: ../dgit:1309 msgid "bad component" msgstr "verkeerde component" #: ../dgit:1312 msgid "bad filename" msgstr "verkeerde bestandsnaam" #: ../dgit:1314 msgid "bad sha256sum" msgstr "verkeerde sha256sum" #: ../dgit:1365 msgid "aptget archive query method takes no data part" msgstr "" "de methode aptget voor een verzoek aan het archief kent geen data-onderdeel" #: ../dgit:1449 #, 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:1473 #, perl-format msgid "Release file (%s) specifies intolerable %s" msgstr "Release-bestand (%s) vermeldt ontoelaatbaar %s" #: ../dgit:1499 msgid "apt-get source did not produce a .dsc" msgstr "apt-get source produceerde geen .dsc-bestand" #: ../dgit:1500 #, perl-format msgid "apt-get source produced several .dscs (%s)" msgstr "apt-get source produceerde verschillende .dsc-bestanden (%s)" #: ../dgit:1605 #, 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:1744 #, perl-format msgid "cannot operate on %s suite" msgstr "kan geen acties uitvoeren op suite %s" #: ../dgit:1747 #, perl-format msgid "canonical suite name for %s is %s" msgstr "de gebruikelijke suitenaam voor %s is %s" #: ../dgit:1749 #, perl-format msgid "canonical suite name is %s" msgstr "de gebruikelijke suitenaam is %s" #: ../dgit:1769 #, 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:1775 #, perl-format msgid "unsupported source format %s, sorry" msgstr "niet-ondersteunde broncode-indeling %s, sorry" #: ../dgit:1802 #, perl-format msgid "diverting to %s (using config for %s)" msgstr "er wordt omgeschakeld naar %s (de configuratie voor %s wordt gebruikt)" #: ../dgit:1825 #, perl-format msgid "unknown git-check `%s'" msgstr "onbekende git-check `%s'" #: ../dgit:1840 #, perl-format msgid "unknown git-create `%s'" msgstr "onbekende git-create `%s'" #: ../dgit:1884 #, perl-format msgid "%s: warning: removing from %s: %s\n" msgstr "%s: waarschuwing: wordt verwijderd van %s: %s\n" #: ../dgit:1930 #, perl-format msgid "could not parse .dsc %s line `%s'" msgstr "kon .dsc %s regel `%s' niet ontleden" #: ../dgit:1941 #, perl-format msgid "missing any supported Checksums-* or Files field in %s" msgstr "een ondersteund Checksums-* of Files-veld ontbreekt in %s" #: ../dgit:1987 #, 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:1996 #, perl-format msgid "file list in %s varies between hash fields!" msgstr "bestandenlijst in %s varieert tussen hash-velden!" #: ../dgit:2000 #, perl-format msgid "%s has no files list field(s)" msgstr "%s bevat geen veld(en) met een bestandenlijst" #: ../dgit:2006 #, 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:2046 #, perl-format msgid "purportedly source-only changes has Architecture: %s\n" msgstr "" "ogenschijnlijke wijzigingen in uitsluitend de broncode hebben als " "architectuur: %s\n" #: ../dgit:2057 #, perl-format msgid "purportedly source-only changes polluted by %s\n" msgstr "" "ogenschijnlijke wijzigingen in uitsluitend de broncode vervuild door %s\n" #: ../dgit:2069 msgid "cannot find section/priority from .changes Files field" msgstr "" "kan sectie/prioriteit niet vinden in het veld Files van het .changes-bestand" #: ../dgit:2082 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:2098 #, perl-format msgid ".dsc %s missing entry for %s" msgstr ".dsc %s mist een item voor %s" #: ../dgit:2103 #, perl-format msgid "%s: %s (archive) != %s (local .dsc)" msgstr "%s: %s (archief) != %s (lokale .dsc)" #: ../dgit:2111 #, perl-format msgid "archive %s: %s" msgstr "archief %s: %s" #: ../dgit:2118 #, perl-format msgid "archive contains %s with different checksum" msgstr "archief bevat %s met een andere checksum" #: ../dgit:2146 #, 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:2154 #, perl-format msgid "[new .changes left in %s]" msgstr "[nieuwe .changes achtergelaten in %s]" #: ../dgit:2157 #, perl-format msgid "%s already has appropriate .orig(s) (if any)" msgstr "%s heeft reeds passende .orig(s) (indien van toepassing)" #: ../dgit:2179 #, 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:2202 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:2214 #, 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:2245 msgid "Dpkg::Vendor `current vendor'" msgstr "Dpkg::Vendor `current vendor'" #: ../dgit:2247 msgid "(base) distro being accessed" msgstr "(basis)-distributie wordt benaderd" #: ../dgit:2249 msgid "(nominal) distro being accessed" msgstr "(nominale) distributie wordt benaderd" #: ../dgit:2254 #, perl-format msgid "build-products-dir %s is not accessible: %s\n" msgstr "build-products-dir %s is niet toegankelijk: %s\n" #: ../dgit:2292 #, perl-format msgid "%s: multiple representations of similar orig %s:\n" msgstr "%s: meerdere weergaven van soortgelijke oorsprong %s:\n" #: ../dgit:2296 #, perl-format msgid " %s: in %s (%s)\n" msgstr " %s: in %s (%s)\n" #: ../dgit:2301 msgid "Duplicate/inconsistent orig tarballs. Delete the spurious ones." msgstr "Dubbele/inconsistente orig-tar-archieven. Verwijder de ongewenste." #: ../dgit:2318 #, 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:2322 #, perl-format msgid "check orig file %s in bpd %s: %s" msgstr "controleer orig-bestand %s in bpd %s: %s" #: ../dgit:2324 #, perl-format msgid "check orig file %s in ..: %s" msgstr "controleer orig-bestand %s in ..: %s" #: ../dgit:2327 #, perl-format msgid "check target of orig symlink %s in ..: %s" msgstr "controleer doel van orig-symbolische koppeling %s in ..: %s" #: ../dgit:2336 #, perl-format msgid "%s: cloned orig symlink from ..: %s\n" msgstr "%s: orig-symbolische koppeling gekloond van ..: %s\n" #: ../dgit:2340 #, perl-format msgid "%s: hardlinked orig from ..: %s\n" msgstr "%s: vast gekoppelde orig van ..: %s\n" #: ../dgit:2343 #, 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:2349 #, 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:2364 msgid "package changelog" msgstr "changelog van het pakket" #: ../dgit:2469 #, perl-format msgid "dgit (child): exec %s: %s" msgstr "dgit (dochter): exec %s: %s" #: ../dgit:2532 msgid "package changelog has no entries!" msgstr "het changelog-bestand van het pakket bevat geen vermeldingen!" #: ../dgit:2537 #, perl-format msgid "" "warning: unable to find/parse changelog entry for first import of %s:\n" "%s\n" msgstr "" "waarschuwing: kan het changelog-item voor de eerste import van %s niet " "vinden/ontleden:\n" "%s\n" #: ../dgit:2608 ../dgit:2613 #, perl-format msgid "accessing %s: %s" msgstr "benaderen van %s: %s" #: ../dgit:2630 ../dgit:2637 #, perl-format msgid "saving %s: %s" msgstr "opslaan van %s: %s" #: ../dgit:2663 ../dgit:6701 msgid "source package" msgstr "broncodepakket" #: ../dgit:2743 #, perl-format msgid "%s: trying slow absurd-git-apply..." msgstr "%s: langzame absurd-git-apply wordt gebruikt..." #: ../dgit:2796 #, perl-format msgid "%s failed: %s\n" msgstr "%s mislukte: %s\n" #: ../dgit:2814 #, 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:2834 #, perl-format msgid "synthesised git commit from .dsc %s" msgstr "git commit samengesteld vanuit .dsc %s" #: ../dgit:2838 msgid "Import of source package" msgstr "Importeren van broncodepakket" #: ../dgit:2858 #, 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:2900 #, perl-format msgid "using existing %s" msgstr "bestaande %s wordt gebruikt" #: ../dgit:2904 #, 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:2908 #, perl-format msgid "need to fetch correct version of %s" msgstr "moet de juiste versie van %s ophalen met fetch" #: ../dgit:2924 #, 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:3019 msgid "too many iterations trying to get sane fetch!" msgstr "te veel pogingen om een foutloze fetch te bekomen!" #: ../dgit:3034 #, 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:3078 #, 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:3093 #, 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:3098 #, 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:3245 #, 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:3250 #, perl-format msgid ".dsc names distro %s: fetching %s" msgstr ".dsc vernoemt distributie %s: %s wordt opgehaald" #: ../dgit:3255 #, 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:3265 #, 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:3285 msgid "rewrite map" msgstr "modificatieplan (rewrite map)" #: ../dgit:3292 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:3296 msgid "using rewritten git hash in place of .dsc value" msgstr "de gemodificeerde git hash wordt gebruikt in plaats van de .dsc-waarde" #: ../dgit:3298 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:3305 msgid "additional commits" msgstr "extra vastleggingen (commits)" #: ../dgit:3308 #, 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:3333 msgid "last upload to archive" msgstr "laatste upload naar het archief" #: ../dgit:3337 msgid "no version available from the archive" msgstr "geen versie beschikbaar uit het archief" #: ../dgit:3420 msgid "dgit suite branch on dgit git server" msgstr "dgit suite-tak op dgit git-server" #: ../dgit:3427 msgid "dgit client's archive history view" msgstr "dgit - weergave geschiedenis van cliëntarchief" #: ../dgit:3432 msgid "Dgit field in .dsc from archive" msgstr "Dgit-veld in het .dsc uit het archief" #: ../dgit:3460 #, 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:3473 msgid "archive .dsc names newer git commit" msgstr ".dsc van het archief vermeldt een recentere git commit" #: ../dgit:3476 msgid "archive .dsc names other git commit, fixing up" msgstr ".dsc van het archief vermeldt een andere git commit, wordt gerepareerd" #: ../dgit:3497 #, 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:3506 #, 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:3591 #, 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:3604 msgid "should be treated as descended from\n" msgstr "behandeld zou moeten worden als afstammend van\n" #: ../dgit:3622 msgid "dgit repo server tip (last push)" msgstr "tip van de dgit-opslagplaats op de server (laatste push)" #: ../dgit:3624 msgid "local tracking tip (last fetch)" msgstr "tip van de lokale kopie (laatste fetch)" #: ../dgit:3635 #, 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:3650 msgid "fetched source tree" msgstr "broncodeboom opgehaald" #: ../dgit:3686 msgid "debian/changelog merge driver" msgstr "stuurprogramma voor samenvoeging van debian/changelog" #: ../dgit:3751 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:3765 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:3780 #, perl-format msgid "install %s: %s" msgstr "installeren van %s: %s" #: ../dgit:3807 #, 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:3829 #, perl-format msgid "fetching %s..." msgstr "ophalen van %s..." #: ../dgit:3837 #, perl-format msgid "failed to obtain %s: %s" msgstr "verkrijgen van %s mislukte: %s" #: ../dgit:3876 #, perl-format msgid "package %s missing in (base suite) %s" msgstr "pakket %s ontbreekt in (basissuite) %s" #: ../dgit:3908 msgid "local combined tracking branch" msgstr "lokale gecombineerde navolgende tak (tracking branch)" #: ../dgit:3910 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:3949 #, perl-format msgid "" "Combine archive branches %s [dgit]\n" "\n" "Input branches:\n" msgstr "" "Archieftakken %s combineren [dgit]\n" "\n" "Invoertakken:\n" #: ../dgit:3963 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:3978 #, perl-format msgid "calculated combined tracking suite %s" msgstr "berekende gecombineerde navolgende suite %s" #: ../dgit:3996 #, perl-format msgid "ready for work in %s" msgstr "klaar om te werken in %s" #: ../dgit:4014 msgid "dry run makes no sense with clone" msgstr "dry run is zinloos met clone" #: ../dgit:4029 #, perl-format msgid "create `%s': %s" msgstr "creëren van `%s': %s" #: ../dgit:4041 msgid "fetching existing git history" msgstr "ophalen van bestaande git-geschiedenis" #: ../dgit:4044 msgid "starting new git history" msgstr "starten van een nieuwe git-geschiedenis" #: ../dgit:4069 #, 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:4074 #, perl-format msgid "fetched into %s" msgstr "opgehaald naar %s" #: ../dgit:4087 #, perl-format msgid "Merge from %s [dgit]" msgstr "Samenvoegen vanuit %s [dgit]" #: ../dgit:4089 #, perl-format msgid "fetched to %s and merged into HEAD" msgstr "opgehaald naar %s samengevoegd naar HEAD" #: ../dgit:4097 #, perl-format msgid "git tree contains %s" msgstr "git-boom bevat %s" #: ../dgit:4108 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:4127 #, 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:4144 msgid "nothing quilty to commit, ok." msgstr "niets quilt-achtig vast te leggen, oké." #: ../dgit:4147 msgid " (wanted to commit patch update)" msgstr " (wilde een patch-update vastleggen)" #: ../dgit:4151 msgid "" "Commit Debian 3.0 (quilt) metadata\n" "\n" msgstr "" "Vastleggen van (commit) Debian 3.0 (quilt) metadata\n" "\n" #: ../dgit:4189 #, 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:4194 #, perl-format msgid "Format `%s', need to check/update patch stack" msgstr "Indeling `%s', moet de patch-stack nakijken/bijwerken" #: ../dgit:4204 #, perl-format msgid "commit id %s" msgstr "vastleggings-id (commit id) %s" #: ../dgit:4210 #, perl-format msgid "and left in %s" msgstr "en achtergelaten in %s" #: ../dgit:4236 #, 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:4239 #, 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:4247 #, 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:4256 msgid "version currently in archive" msgstr "momenteel in het archief aanwezige versie" #: ../dgit:4265 #, perl-format msgid "Checking package changelog for archive version %s ..." msgstr "" "Het changlog-bestand van het pakket wordt gecontroleerd op archiefversie " "%s ..." #: ../dgit:4274 #, perl-format msgid "%s field from dpkg-parsechangelog %s" msgstr "veld %s van dpkg-parsechangelog %s" #: ../dgit:4285 #, perl-format msgid "Perhaps debian/changelog does not mention %s ?" msgstr "Vermeldt debian/changelog misschien %s niet?" #: ../dgit:4288 #, 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:4293 #, 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:4307 #, perl-format msgid "Declaring that HEAD includes all changes in %s..." msgstr "Verklaren dat HEAD alle wijzigingen uit %s omvat..." #: ../dgit:4363 msgid "Checking that HEAD includes all changes in archive..." msgstr "Controleren dat HEAD alle wijzigingen uit het archief omvat..." #: ../dgit:4372 msgid "maintainer view tag" msgstr "tag weergave pakketonderhouder" #: ../dgit:4374 msgid "dgit view tag" msgstr "tag weergave dgit" #: ../dgit:4375 msgid "current archive contents" msgstr "huidige inhoud van het archief" #: ../dgit:4388 msgid "" "| Not fast forward; maybe --trust-changelog is needed ? Please see " "dgit(1).\n" msgstr "" "| Niet fast forward; is misschien --trust-changelog nodig? Raadpleeg " "dgit(1).\n" #: ../dgit:4398 #, perl-format msgid "Declare fast forward from %s\n" msgstr "Lineair (fast forward) declareren vanuit %s\n" #: ../dgit:4399 #, perl-format msgid "Make fast forward from %s\n" msgstr "Lineair (fast forward) maken vanuit %s\n" #: ../dgit:4403 #, perl-format msgid "Made pseudo-merge of %s into dgit view." msgstr "Maakte een pseudo-samenvoeging van %s in de dgit-weergave." #: ../dgit:4416 #, perl-format msgid "Declare fast forward from %s" msgstr "Lineair (fast forward) declareren vanuit %s" #: ../dgit:4424 #, perl-format msgid "Make pseudo-merge of %s into your HEAD." msgstr "Pseudo-samenvoeging maken van %s naar uw HEAD." #: ../dgit:4439 #, perl-format msgid "%s field `%s' is not expected `%s'" msgstr "%s-veld `%s' wordt niet verwacht `%s'" #: ../dgit:4471 #, 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:4514 #, perl-format msgid "DEP-14 tag %s does not exist (--dep14tag-reuse=%s)" msgstr "DEP-14 tag %s bestaat niet (--dep14tag-reuse=%s)" #: ../dgit:4528 #, perl-format msgid "" "%s: making fresh DEP-14 tag %s (--dep14tag-reuse=%s), since existing tag " "unsuitable: %s" msgstr "" "%s: er wordt een verse DEP-14 tag %s (--dep14tag-reuse=%s) gemaakt, omdat de " "bestaande tag ongeschikt is: %s" #: ../dgit:4538 #, perl-format msgid "existing DEP-14 tag %s is unsuitable (--dep14tag-reuse=%s): %s" msgstr "de bestaande DEP-14 tag %s is ongeschikt (--dep14tag-reuse=%s): %s" #: ../dgit:4559 #, perl-format msgid "refers to commit %s, not %s" msgstr "verwijst naar vastlegging (commit) %s, niet %s" #: ../dgit:4569 #, perl-format msgid "verification failed: git verify-tag: %s" msgstr "verificatie mislukte: git verify-tag: %s" #: ../dgit:4623 #, perl-format msgid "%s already contains field %s" msgstr "%s bevat reeds veld %s" #: ../dgit:4655 #, 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:4711 #, perl-format msgid "(maintainer view tag generated by dgit --quilt=%s)\n" msgstr "(beheerdersweergave-tag gegenereerd door dgit --quilt=%s)\n" #: ../dgit:4784 #, perl-format msgid "" "warning: server says object %s type %s is tainted, but here it has type %s\n" msgstr "" "waarschuwing: de server zegt dat object %s type %s beschadigd is, maar hier " "heeft het type %s\n" #: ../dgit:4817 msgid "commit" msgstr "vastlegging (commit)" #: ../dgit:4819 #, perl-format msgid "object within commit %s" msgstr "object binnen vastlegging (commit) %s" #: ../dgit:4827 msgid "pushing tainted objects (which server would reject)" msgstr "pushen van beschadigde objecten (die de server zou weigeren)" #: ../dgit:4835 msgid "" "Push failed, while checking state of the archive.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" "Pushen mislukte tijdens het controleren van de status van het archief.\n" "Als u wilt, kunt u het pushen opnieuw proberen nadat het probleem opgelost " "werd.\n" #: ../dgit:4845 msgid "" "package appears to be new in this suite; if this is intentional, use --new" msgstr "" "pakket lijkt nieuw te zijn in deze suite; als dit opzettelijk is, gebruik " "dan --new" #: ../dgit:4850 msgid "" "Push failed, while preparing your push.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" "Het pushen mislukte tijdens het voorbereiden van uw push.\n" "Als u wilt, kunt u het pushen opnieuw proberen nadat het probleem opgelost " "werd.\n" #: ../dgit:4869 #, perl-format msgid "looked for .dsc %s, but %s; maybe you forgot to build" msgstr "zocht naar .dsc %s, maar %s; misschien bent u vergeten te bouwen" #: ../dgit:4885 #, perl-format msgid "" "Branch is managed by git-debrebase (%s\n" "exists), but quilt mode (%s) implies a split view.\n" "Pass the right --quilt option or adjust your git config.\n" "Or, maybe, run git-debrebase forget-was-ever-debrebase.\n" msgstr "" "Tak (branch) wordt beheerd door git-debrebase (%s\n" "bestaat), maar quilt-modus (%s) impliceert een gesplitste weergave.\n" "Geef de juiste --quilt-optie door of pas je git-configuratie aan.\n" "Of voer misschien git-debrebase forget-was-ever-debrebase uit.\n" #: ../dgit:4904 #, perl-format msgid "" "You seem to be trying to push an old version.\n" "Version current in archive: %s (in suite %s)\n" "Version you are trying to upload: %s\n" msgstr "" "U lijkt een oude versie te willen pushen.\n" "Huidige versie in het archief: %s (in suite %s)\n" "Versie die u probeert te uploaden: %s\n" #: ../dgit:4918 #, perl-format msgid "" "--quilt=%s but no cached dgit view:\n" " perhaps HEAD changed since dgit build[-source] ?" msgstr "" "--quilt=%s maar geen dgit-weergave in de cache:\n" " veranderde HEAD misschien sinds dgit build[-source] ?" #: ../dgit:4954 msgid "" "dgit push: HEAD is not a descendant of the archive's version.\n" "To overwrite the archive's contents, pass --trust-changelog, or --" "overwrite=VERSION.\n" "To rewrite history, if permitted by the archive, use --deliberately-not-fast-" "forward." msgstr "" "dgit push: HEAD is geen afstammeling van de versie van het archief.\n" "Geef --trust-changelog of --overwrite=VERSIE door om de inhoud van het " "archief te overschrijven.\n" "Gebruik --deliberately-not-fast-forward om de geschiedenis te herschrijven, " "indien dit toegestaan wordt door het archief." #: ../dgit:4969 #, perl-format msgid "" "\n" "Version %s has already been tagged (pushed?)\n" "If this was a failed (or incomplete or rejected) upload by you, just\n" "add a new changelog stanza for a new version number and try again.\n" msgstr "" "\n" "Versie %s is al getagd (gepusht?)\n" "Als dit een mislukte (of onvolledige of afgewezen) upload\n" " van u was, voeg dan gewoon een nieuw changelog-item toe\n" "voor een nieuw versienummer en probeer het opnieuw.\n" #: ../dgit:4975 #, perl-format msgid "Tag %s already exists.\n" msgstr "Tag %s bestaat reeds.\n" #: ../dgit:4980 #, perl-format msgid "checking that %s corresponds to HEAD" msgstr "controleren of %s overeenkomt met HEAD" #: ../dgit:5014 ../dgit:5026 #, perl-format msgid "HEAD specifies a different tree to %s:\n" msgstr "HEAD geeft een andere boom aan dan %s:\n" #: ../dgit:5020 #, perl-format msgid "" "There is a problem with your source tree (see dgit(7) for some hints).\n" "To see a full diff, run git diff %s %s\n" msgstr "" "Er is een probleem met uw broncodeboom (zie dgit(7) voor enkele hints).\n" "Voer git diff %s %s uit om een volledige diff te zien\n" #: ../dgit:5030 #, perl-format msgid "" "Perhaps you forgot to build. Or perhaps there is a problem with your\n" " source tree (see dgit(7) for some hints). To see a full diff, run\n" " git diff %s %s\n" msgstr "" "Misschien vergat u te bouwen. Of misschien is er een probleem met uw\n" "broncodeboom (zie dgit(7) voor enkele hints).\n" "\n" "Voer git diff %s %s uit om een volledige diff te zien\n" #: ../dgit:5041 #, perl-format msgid "" "failed to find unique changes file (looked for %s in %s); perhaps you need " "to use dgit -C" msgstr "" "het unieke changes-bestand werd niet gevonden (gezocht naar %s in %s); " "misschien moet u dgit -C gebruiken" #: ../dgit:5063 msgid "uploading binaries, although distro policy is source only" msgstr "" "uploaden van binaire bestanden, hoewel het distributiebeleid alleen broncode " "is" #: ../dgit:5067 msgid "source-only upload, although distro policy requires .debs" msgstr "" "upload van uitsluitend broncode, hoewel het distributiebeleid .debs vereist" #: ../dgit:5071 #, perl-format msgid "" "source-only upload, though package appears entirely NEW\n" "(this is probably contrary to policy in %s)" msgstr "" "upload van uitsluitend broncode, hoewel het pakket volledig NIEUW lijkt\n" "(dit is waarschijnlijk in strijd met het beleid in %s)" #: ../dgit:5078 #, perl-format msgid "unknown source-only-uploads policy `%s'" msgstr "onbekend source-only-uploads-beleid `%s'" #: ../dgit:5085 #, perl-format msgid "policy-query-supported-ssh value '%s' must be false/true/unknown" msgstr "" "waarde '%s' van policy-query-supported-ssh moet false/true/unknown zijn" #: ../dgit:5148 msgid "" "Push failed, while signing the tag.\n" "You can retry the push, after fixing the problem, if you like.\n" msgstr "" "Het pushen mislukte bij het ondertekenen van de tag.\n" "Als u wilt, kunt u het pushen opnieuw proberen nadat het probleem opgelost " "werd.\n" #: ../dgit:5175 msgid "" "Push failed, *after* signing the tag.\n" "If you want to try again, you should use a new version number.\n" msgstr "" "Het pushen mislukte *na* het ondertekenen van de tag. Indien u\n" "opnieuw wenst te proberen, moet u een nieuw versienummer gebruiken.\n" #: ../dgit:5194 msgid "" "Push failed, while updating the remote git repository - see messages above.\n" "If you want to try again, you should use a new version number.\n" msgstr "" "Het pushen mislukt, tijdens het bijwerken van de externe\n" "git-opslagplaats - zie berichten hierboven. Indien u\n" "opnieuw wenst te proberen, moet u een nieuw versienummer gebruiken.\n" #: ../dgit:5211 msgid "" "Push failed, while obtaining signatures on the .changes and .dsc.\n" "If it was just that the signature failed, you may try again by using\n" "debsign by hand to sign the changes file (see the command dgit tried,\n" "above), and then dput that changes file to complete the upload.\n" "If you need to change the package, you must use a new version number.\n" msgstr "" "Het pushen mislukte tijdens het zetten van handtekeningen op .changes " "en .dsc.\n" "Als alleen de handtekening fout liep, kunt u het opnieuw proberen door\n" "debsign handmatig te gebruiken om het changes-bestand te ondertekenen\n" "(zie hierboven voor het door dgit gebruikte commando)\n" "en dput daarna dat changes-bestand om de upload te voltooien.\n" "Indien u het pakket moet wijzigen, moet u een nieuw versienummer gebruiken.\n" #: ../dgit:5229 #, perl-format msgid "[new .dsc & .changes left in %s.tmp, %s.tmp]" msgstr "[nieuw .dsc & .changes achtergelaten in %s.tmp, %s.tmp]" #: ../dgit:5236 #, perl-format msgid "" "Push failed, while uploading package(s) to the archive server.\n" "You can retry the upload of exactly these same files with dput of:\n" " %s\n" "If that .changes file is broken, you will need to use a new version\n" "number for your next attempt at the upload.\n" msgstr "" "Het pushen mislukte bij het uploaden van pakket(ten) naar de archiefserver.\n" "U kunt de upload van exact dezelfde bestanden opnieuw proberen met dput " "van:\n" " %s\n" "Als dat .changes-bestand beschadigd is, moet u een nieuw\n" "versienummer gebruiken voor uw volgende uploadpoging.\n" #: ../dgit:5245 #, perl-format msgid "pushed and uploaded %s" msgstr "%s gepusht en geüpload" #: ../dgit:5257 msgid "-p is not allowed with clone; specify as argument instead" msgstr "" "-p niet toegestaan met clone; geef dit in plaats daarvan door als argument" #: ../dgit:5268 msgid "incorrect arguments to dgit clone" msgstr "foutieve argumenten voor dgit clone" #: ../dgit:5274 ../git-debrebase:1811 #, perl-format msgid "%s already exists" msgstr "%s bestaat reeds" #: ../dgit:5288 #, perl-format msgid "remove %s: %s\n" msgstr "verwijderen van %s: %s\n" #: ../dgit:5292 #, perl-format msgid "check whether to remove %s: %s\n" msgstr "controleren of %s moet worden verwijderd: %s\n" #: ../dgit:5330 msgid "incorrect arguments to dgit fetch or dgit pull" msgstr "foutieve argumenten voor dgit fetch of dgit pull" #: ../dgit:5348 msgid "" "dgit pull not yet supported in split view mode (including with view-" "splitting quilt modes)\n" msgstr "" "dgit pull wordt nog niet ondersteund bij gesplitste weergave (met inbegrip " "van quilt-modi welke de weergave splitsen)\n" #: ../dgit:5357 msgid "dgit checkout needs a suite argument" msgstr "dgit checkout vereist een suite-argument" #: ../dgit:5420 #, perl-format msgid "setting up vcs-git: %s\n" msgstr "vcs-git instellen: %s\n" #: ../dgit:5423 #, perl-format msgid "vcs git unchanged: %s\n" msgstr "vcs git onveranderd: %s\n" #: ../dgit:5425 #, perl-format msgid "changing vcs-git url to: %s\n" msgstr "vcs-git-url wijzigen in: %s\n" #: ../dgit:5430 #, perl-format msgid "fetching (%s)\n" msgstr "(%s) ophalen\n" #: ../dgit:5446 #, perl-format msgid "incorrect arguments to dgit %s" msgstr "foutieve argumenten voor dgit %s" #: ../dgit:5457 #, perl-format msgid "dgit %s: changelog specifies %s (%s) but command line specifies %s" msgstr "dgit %s: changelog vermeldt %s (%s) maar commandoregel vermeldt %s" #: ../dgit:5481 #, perl-format msgid "dgit push, but dgit.default.push-subcmd set to %s" msgstr "dgit push, maar dgit.default.push-subcmd ingesteld op %s" #: ../dgit:5489 #, perl-format msgid "dgit rpush, but dgit.default.[r]push-subcmd set to %s" msgstr "dgit rpush, maar dgit.default.[r]push-subcmd ingesteld op %s" #: ../dgit:5502 #, perl-format msgid "" "warning: \"dgit %s\" currently means \"dgit %s-built\" (by default)\n" "warning: but is going to change to \"dgit %s-source\". See dgit!(1).\n" msgstr "" "aandacht: \"dgit %s\" betekent momenteel \"dgit %s-built\" (standaard)\n" "aandacht: maar zal veranderen naar \"dgit %s-source\". Zie dgit!(1).\n" #: ../dgit:5542 #, perl-format msgid "" "build host has dgit rpush protocol versions %s but invocation host has %s" msgstr "" "bouwcomputer heeft dgit rpush protocolversies %s maar aanroepcomputer heeft " "%s" #: ../dgit:5626 #, perl-format msgid "create %s: %s" msgstr "%s creëren: %s" #: ../dgit:5672 #, perl-format msgid "build host child failed: %s" msgstr "bouwcomputer-dochter mislukte: %s" #: ../dgit:5675 msgid "all done\n" msgstr "helemaal klaar\n" #: ../dgit:5684 #, perl-format msgid "file %s (%s) twice" msgstr "bestand %s (%s) tweemaal" #: ../dgit:5690 msgid "bad param spec" msgstr "slechte param spec" #: ../dgit:5696 msgid "bad previously spec" msgstr "slechte vroegere spec" #: ../dgit:5768 #, perl-format msgid "buildinfo mismatch in field %s" msgstr "bouwinfo in veld %s komt niet overeen" #: ../dgit:5771 msgid "buildinfo mismatch in field Architecture" msgstr "bouwinfo komt niet overeen in veld Architecture" #: ../dgit:5773 #, perl-format msgid "buildinfo contains forbidden field %s" msgstr "bouwinfo bevat verboden veld %s" #: ../dgit:5795 msgid "build-host-supplied changes file is not source-only" msgstr "" "door bouwcomputer geleverd changes-bestand is niet uitsluitend broncode" #: ../dgit:5825 msgid "remote changes file" msgstr "extern changes-bestand" #: ../dgit:5908 msgid "not a plain file\n" msgstr "is geen gewoon bestand\n" #: ../dgit:5914 msgid "mode or type changed in unsupported way\n" msgstr "modus of type gewijzigd op niet-ondersteunde manier\n" #: ../dgit:5917 msgid "modified symlink\n" msgstr "symbolische koppeling gewijzigd\n" #: ../dgit:5920 msgid "deletion of symlink\n" msgstr "verwijdering van symbolische koppeling\n" #: ../dgit:5924 msgid "creation with non-default mode, or symlink\n" msgstr "aanmaken met niet-standaardmodus, of symbolische koppeling\n" #: ../dgit:5952 #, perl-format msgid "dgit: cannot represent change: %s: %s\n" msgstr "dgit: kan wijziging niet representeren: %s: %s\n" #: ../dgit:5957 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:5995 #, 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:6002 #, 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:6008 msgid "" "\n" " ... debian/patches is missing; perhaps this is a patch queue branch?" msgstr "" "\n" " ... debian/patches ontbreekt; is dit misschien een patchwachtrijtak?" #: ../dgit:6015 #, 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:6029 #, perl-format msgid "Combine debian/ with upstream source for %s\n" msgstr "Combinatie maken van debian/ met bovenstroomse bron van %s\n" #: ../dgit:6037 msgid "dgit view: creating patches-applied version using gbp pq" msgstr "dgit view: een patches-applied versie creëren met gbp pq" #: ../dgit:6048 #, 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:6056 msgid "dgit view: creating patch to represent .gitignore changes" msgstr "dgit view: patch maken om .gitignore-wijzigingen weer te geven" #: ../dgit:6061 #, 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:6067 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:6090 msgid "Commit patch to update .gitignore\n" msgstr "Patch om .gitignore bij te werken vastleggen\n" #: ../dgit:6160 msgid "maximum search space exceeded" msgstr "maximale zoekruimte overschreden" #: ../dgit:6178 #, perl-format msgid "has %s not %s" msgstr "bevat %s, niet %s" #: ../dgit:6187 msgid "root commit" msgstr "beginvastlegging (root commit)" #: ../dgit:6193 #, perl-format msgid "merge (%s nontrivial parents)" msgstr "samenvoeging (merge) (%s niet-triviale ouders)" #: ../dgit:6205 #, perl-format msgid "changed %s" msgstr "gewijzigd: %s" #: ../dgit:6224 #, 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:6231 #, perl-format msgid "%s: %s: %s\n" msgstr "%s: %s: %s\n" #: ../dgit:6243 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:6246 msgid "quilt fixup cannot be linear, smashing..." msgstr "" "de quilt fixup kan niet lineair zijn, de smash strategie wordt gebruikt..." #: ../dgit:6260 #, 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:6267 msgid "quiltify linearisation planning successful, executing..." msgstr "linearisatieplanning voor quiltify was succesvol, wordt uitgevoerd..." #: ../dgit:6301 msgid "contains unexpected slashes\n" msgstr "bevat onverwachte slashes\n" #: ../dgit:6302 msgid "contains leading punctuation\n" msgstr "bevat leestekens aan het begin\n" #: ../dgit:6303 msgid "contains bad character(s)\n" msgstr "bevat foutieve teken(s)\n" #: ../dgit:6304 msgid "is series file\n" msgstr "is een series-bestand\n" #: ../dgit:6305 msgid "too long\n" msgstr "te lang\n" #: ../dgit:6309 #, 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:6338 #, perl-format msgid "dgit: patch title transliteration error: %s" msgstr "dgit: fout bij de transliteratie van de patch-titel: %s" #: ../dgit:6413 #, 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:6438 msgid "converted" msgstr "omgezet" #: ../dgit:6439 #, perl-format msgid "dgit view: created (%s)" msgstr "dgit-weergave: gecreëerd: (%s)" #: ../dgit:6495 msgid "Commit removal of .pc (quilt series tracking data)\n" msgstr "" "Vastleggingsverwijdering (commit removal) van .pc (quilt-seriegegevens)\n" #: ../dgit:6505 msgid "starting quiltify (single-debian-patch)" msgstr "quiltify wordt gestart (één enkele debian-patch)" #: ../dgit:6541 #, perl-format msgid "regenerating patch using git diff (--quilt=%s)" msgstr "patch opnieuw genereren met git diff (--quilt=%s)" #: ../dgit:6635 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:6644 #, perl-format msgid "warning: ignoring bad include-binaries file %s: %s\n" msgstr "opgelet: slecht nclude-binaries-bestand %s wordt genegeerd: %s\n" #: ../dgit:6647 #, perl-format msgid "forbidden path component '%s'" msgstr "niet toegelaten pad-component '%s'" #: ../dgit:6657 #, perl-format msgid "path starts with '%s'" msgstr "pad begint met '%s'" #: ../dgit:6667 #, perl-format msgid "path to '%s' not a plain file or directory" msgstr "pad naar '%s' geen gewoon bestand of map" #: ../dgit:6725 #, 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:6757 #, perl-format msgid "dgit view: found cached (%s)" msgstr "dgit-weergave: gecachete (%s) aangetroffen" #: ../dgit:6762 msgid "dgit view: found cached, no changes required" msgstr "dgit-weergave: gecachete aangetroffen, geen wijzigingen vereist" #: ../dgit:6797 #, perl-format msgid "examining quilt state (multiple patches, %s mode)" msgstr "toestand van quilt wordt nagegaan (meerdere patches, %s-modus)" #: ../dgit:6890 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:6904 msgid "Tree already contains .pc - will delete it." msgstr "Boom bevat reeds een .pc - zal dit verwijderen." #: ../dgit:6938 msgid "baredebian quilt fixup: could not find any origs" msgstr "baredebian quilt reparatie: kon geen origs vinden" #: ../dgit:6951 msgid "tarball" msgstr "tar-archief" #: ../dgit:6969 #, perl-format msgid "Combine orig tarballs for %s %s" msgstr "Combineren van orig tar-archieven voor %s %s" #: ../dgit:6985 msgid "tarballs" msgstr "tar-archieven" #: ../dgit:6999 msgid "upstream" msgstr "bovenstroom" #: ../dgit:7023 #, 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:7033 #, 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:7043 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:7047 msgid "This might be a patches-unapplied branch." msgstr "Dit is mogelijk een tak zonder toepassing van patches." #: ../dgit:7050 msgid "This might be a patches-applied branch." msgstr "Dit is mogelijk een tak met toegepaste patches." #: ../dgit:7053 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:7056 msgid "Warning: Tree has .gitattributes. See GITATTRIBUTES in dgit(7)." msgstr "" "Waarschuwing: Boom bevat .gitattributes. Zie GITATTRIBUTES in dgit(7)." #: ../dgit:7060 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:7071 #, perl-format msgid "starting quiltify (multiple patches, %s mode)" msgstr "quiltify wordt gestart (meerdere patches, %s-modus)" #: ../dgit:7110 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:7122 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:7151 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:7163 msgid "tree contains uncommitted files and --clean=check specified" msgstr "" "de boom bevat niet-vastgelegde bestanden en --clean=check werd opgegeven" #: ../dgit:7166 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:7169 msgid "" "tree contains uncommitted, 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:7183 #, 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:7200 msgid "tree contains uncommitted files (after running rules clean)" msgstr "" "de boom bevat niet-vastgelegde bestanden (na het uitvoeren van rules clean)" #: ../dgit:7214 msgid "clean takes no additional arguments" msgstr "met clean kunnen geen extra argumenten opgegeven worden" #: ../dgit:7233 #, perl-format msgid "-p specified package %s, but changelog says %s" msgstr "-p specificeerde pakket %s, maar het changelog-bestand vermeldt %s" #: ../dgit:7243 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:7251 msgid "" "tree has .gitignore(s) but debian/source/options has 'tar-ignore'\n" "Try 'tar-ignore=.git' in d/s/options instead. (See #908747.)\n" msgstr "" "boomstructuur bevat .gitignore(s) maar debian/source/options bevat 'tar-" "ignore'\n" "Gebruik in de plaats 'tar-ignore=.git' in d/s/options. (Zie #908747.)\n" #: ../dgit:7256 #, perl-format msgid "" "%s: warning: debian/source/options contains bare 'tar-ignore'\n" "This can cause .gitignore files to be improperly omitted. See #908747.\n" msgstr "" "%s: waarschuwing: debian/source/options bevat lege 'tar-ignore'\n" "Hierdoor kunnen .gitignore-bestanden ten onrechte worden overgeslagen. Zie " "#908747.\n" #: ../dgit:7267 #, perl-format msgid "dgit: --quilt=%s, %s" msgstr "dgit: --quilt=%s, %s" #: ../dgit:7271 msgid "dgit: --upstream-commitish only makes sense with --quilt=baredebian" msgstr "dgit: --upstream-commitish is enkel zinvol met --quilt=baredebian" #: ../dgit:7306 #, perl-format msgid "remove old changes file %s: %s" msgstr "verwijder oud changes-bestand %s: %s" #: ../dgit:7308 #, perl-format msgid "would remove %s" msgstr "zou %s verwijderen" #: ../dgit:7326 #, 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:7333 #, 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:7359 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:7365 #, perl-format msgid "changelog will contain changes since %s" msgstr "changelog zal wijzigingen sinds %s bevatten" #: ../dgit:7368 msgid "package seems new, not specifying -v" msgstr "pakket lijkt nieuw te zijn, geen vermelding van -v" #: ../dgit:7411 msgid "Wanted to build nothing!" msgstr "Wilde niets bouwen!" #: ../dgit:7449 #, perl-format msgid "only one changes file from build (%s)\n" msgstr "slechts één changes-bestand van bouw (%s)\n" #: ../dgit:7456 #, perl-format msgid "%s found in binaries changes file %s" msgstr "%s aangetroffen in changes-bestand %s van de binaire pakketten" #: ../dgit:7463 #, perl-format msgid "%s unexpectedly not created by build" msgstr "%s tegen de verwachtingen in niet gecreëerd door de bouw" #: ../dgit:7467 #, perl-format msgid "install new changes %s{,.inmulti}: %s" msgstr "installeer nieuw changes %s{,.inmulti}: %s" #: ../dgit:7472 #, perl-format msgid "wrong number of different changes files (%s)" msgstr "fout nummer van verschillende changes-bestanden (%s)" #: ../dgit:7475 #, perl-format msgid "build successful, results in %s\n" msgstr "bouw was succesvol, resultaten in %s\n" #: ../dgit:7488 #, 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:7506 msgid "build successful\n" msgstr "de bouw was succesvol\n" #: ../dgit:7514 #, 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:7625 #, perl-format msgid "remove %s: %s" msgstr "verwijder %s: %s" #: ../dgit:7632 msgid "--tag2upload-builder-mode needs split-brain mode" msgstr "--tag2upload-builder-mode heeft de modus split-brain nodig" #: ../dgit:7637 msgid "upstream tag and not commit, or vice-versa" msgstr "upstream-tag en geen vastlegging (commit), of omgekeerd" #: ../dgit:7693 msgid "--include-dirty not supported with --build-products-dir, sorry" msgstr "--include-dirty niet ondersteund met --build-products-dir, sorry" #: ../dgit:7718 msgid "--include-dirty not supported with --tag2upload-builder-mode" msgstr "--include-dirty niet ondersteund met --tag2upload-builder-mode" #: ../dgit:7731 msgid "source-only buildinfo" msgstr "uitsluitend broncode bouwinfo" #: ../dgit:7760 #, perl-format msgid "put in place new built file (%s): %s" msgstr "zet nieuw gebouwd bestand (%s) op zijn plaats: %s" #: ../dgit:7777 msgid "build-source takes no additional arguments" msgstr "build-source moet zonder bijkomende argumenten gebruikt worden" #: ../dgit:7781 #, perl-format msgid "source built, results in %s and %s" msgstr "broncodepakket is gebouwd, resultaten in %s en %s" #: ../dgit:7788 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:7793 msgid "--tag2upload-builder-mode not supported with -C" msgstr "--tag2upload-builder-mode niet ondersteund met -C" #: ../dgit:7796 msgid "source changes file" msgstr "broncode-changes-bestand" #: ../dgit:7798 msgid "user-specified changes file is not source-only" msgstr "" "door de gebruiker opgegeven changes-bestand is niet 'uitsluitend broncode'" #: ../dgit:7818 ../dgit:7820 #, perl-format msgid "%s (in build products dir): %s" msgstr "%s (in bouwproductenmap): %s" #: ../dgit:7834 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:7847 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:7851 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:7881 msgid "incorrect arguments to dgit print-unapplied-treeish" msgstr "foutieve argumenten voor dgit print-unapplied-treeish" #: ../dgit:7902 msgid "source tree" msgstr "broncodeboom" #: ../dgit:7904 #, perl-format msgid "dgit: import-dsc: %s" msgstr "dgit: import-dsc: %s" #: ../dgit:7917 #, perl-format msgid "unknown dgit import-dsc sub-option `%s'" msgstr "onbekende onderliggende optie `%s' voor dgit import-dsc" #: ../dgit:7921 msgid "usage: dgit import-dsc .../PATH/TO/.DSC BRANCH" msgstr "gebruik: dgit import-dsc .../PAD/NAAR/.DSC TAK" #: ../dgit:7925 msgid "dry run makes no sense with import-dsc" msgstr "testuitvoering (dry run) is zinloos met import-dsc" #: ../dgit:7942 #, perl-format msgid "%s is checked out - will not update it" msgstr "%s is binnengehaald (checked out) - zal het niet bijwerken" #: ../dgit:7947 #, perl-format msgid "open import .dsc (%s): %s" msgstr "open import-.dsc (%s): %s" #: ../dgit:7949 #, perl-format msgid "read %s: %s" msgstr "lees %s: %s" #: ../dgit:7960 msgid "import-dsc signature check failed" msgstr "controle ondertekening van import-dsc mislukte" #: ../dgit:7963 #, perl-format msgid "%s: warning: importing unsigned .dsc\n" msgstr "%s: waarschuwing: niet-ondertekend .dsc wordt geïmporteerd\n" #: ../dgit:7974 msgid "Dgit metadata in .dsc" msgstr "Dgit-metadata in .dsc" #: ../dgit:7985 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:7994 #, 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:8001 msgid "Not fast forward, forced update." msgstr "Niet lineair (fast forward), gedwongen update." #: ../dgit:8003 #, perl-format msgid "Not fast forward to %s" msgstr "Niet lineair (fast forward) naar %s" #: ../dgit:8008 #, perl-format msgid "updated git ref %s" msgstr "git ref %s geüpdatet" #: ../dgit:8013 #, 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:8033 #, perl-format msgid "lstat %s works but stat gives %s !" msgstr "lstat %s werkt maar stat geeft %s !" #: ../dgit:8035 #, perl-format msgid "stat %s: %s" msgstr "stat %s: %s" #: ../dgit:8043 #, perl-format msgid "import %s requires %s, but: %s" msgstr "importeren van %s vereist %s, maar: %s" #: ../dgit:8062 #, 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:8066 #, perl-format msgid "symlink %s to %s: %s" msgstr "symbolische koppeling %s naar %s: %s" #: ../dgit:8067 #, perl-format msgid "made symlink %s -> %s" msgstr "maakte symbolische koppeling %s -> %s" #: ../dgit:8078 msgid "Import, forced update - synthetic orphan git history." msgstr "Importeren, gedwongen update - kunstmatige verweesde git-geschiedenis." #: ../dgit:8080 msgid "Import, merging." msgstr "Importeren, samenvoegen." #: ../dgit:8094 #, perl-format msgid "Merge %s (%s) import into %s\n" msgstr "Invoegen van import %s (%s) in %s\n" #: ../dgit:8103 #, perl-format msgid "results are in git ref %s" msgstr "resultaten staan in git ref %s" #: ../dgit:8110 msgid "need only 1 subpath argument" msgstr "slechts 1 argument met een onderliggend pad nodig" #: ../dgit:8128 msgid "need destination argument" msgstr "bestemmingsargument nodig" #: ../dgit:8133 #, perl-format msgid "exec git clone: %s\n" msgstr "exec git clone: %s\n" #: ../dgit:8141 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:8152 msgid "no arguments allowed to dgit print-dpkg-source-ignores" msgstr "geen argumenten toegelaten bij dgit print-dpkg-source-ignores" #: ../dgit:8158 msgid "no arguments allowed to dgit setup-mergechangelogs" msgstr "geen argumenten toegelaten bij dgit setup-mergechangelogs" #: ../dgit:8165 ../dgit:8171 msgid "no arguments allowed to dgit setup-useremail" msgstr "geen argumenten toegelaten bij dgit setup-useremail" #: ../dgit:8177 msgid "no arguments allowed to dgit setup-tree" msgstr "geen argumenten toegelaten bij dgit setup-tree" #: ../dgit:8228 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:8267 #, perl-format msgid "%s needs a value" msgstr "%s moet een waarde hebben" #: ../dgit:8271 #, perl-format msgid "bad value `%s' for %s" msgstr "foute waarde `%s' voor %s" #: ../dgit:8380 #, perl-format msgid "%s: warning: ignoring unknown force option %s\n" msgstr "%s: waarschuwing: onbekende force-optie %s wordt genegeerd\n" #: ../dgit:8404 #, perl-format msgid "unknown long option `%s'" msgstr "onbekende lange optie `%s'" #: ../dgit:8461 #, perl-format msgid "unknown short option `%s'" msgstr "onbekende korte optie `%s'" #: ../dgit:8484 #, 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:8488 #, perl-format msgid "%s is blocked\n" msgstr "%s is geblokkeerd\n" #: ../dgit:8494 #, 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:8541 #, perl-format msgid "" "unsupported option `%s', cannot set command for %s (can only provide options)" msgstr "" "niet-ondersteunde optie \"%s', kan commando voor %s niet instellen (kan " "alleen opties opgeven)" #: ../dgit:8546 #, perl-format msgid "" "unsupported option `%s', cannot provide additional options for %s (can only " "provide replacement command)" msgstr "" "niet-ondersteunde optie `%s', kan geen extra opties voor %s bieden (kan " "alleen vervangend commando opgeven)" #: ../dgit:8553 #, perl-format msgid "" "unsupported option `%s', cannot adjust options for %s (can only provide " "replacement command)" msgstr "" "niet-ondersteunde optie `%s', kan opties voor %s niet aanpassen (kan alleen " "vervangend commando opgeven)" #: ../dgit:8585 #, perl-format msgid "cannot set command for %s (can only provide options)" msgstr "kan commando voor %s niet instellen (kan alleen opties opgeven)" #: ../dgit:8606 #, perl-format msgid "cannot configure options for %s (can only provide replacement command)" msgstr "" "kan opties voor %s niet configureren (kan alleen vervangend commando opgeven)" #: ../dgit:8625 #, perl-format msgid "unknown quilt-mode `%s'" msgstr "onbekende quilt-modus `%s'" #: ../dgit:8637 #, perl-format msgid "unknown %s setting `%s'" msgstr "onbekende %s dat `%s' instelt" #: ../dgit:8650 msgid "--tag2upload-builder-mode implies --dep14tag-reuse=must" msgstr "--tag2upload-builder-mode veronderstelt --dep14tag-reuse=must" #: ../dgit:8657 #, perl-format msgid "unknown dep14tag-reuse mode `%s'" msgstr "onbekende dep14tag-reuse-modus `%s'" #: ../dgit:8680 msgid "DRY RUN ONLY\n" msgstr "ENKEL TESTUITVOERING (DRY RUN)\n" #: ../dgit:8681 msgid "DAMP RUN - WILL MAKE LOCAL (UNSIGNED) CHANGES\n" msgstr "" "GETEMPERDE UITVOERING (DAMP RUN) - ZAL LOKALE (NIET-ONDERTEKENDE) " "WIJZIGINGEN MAKEN\n" #: ../dgit:8701 #, 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 overridden 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 overridden 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:1037 #, perl-format msgid "inconsistent anchors in merged-breakwaters %s" msgstr "strijdige ankers in samengevoegde golfbrekers (merged-breakwaters) %s" #: ../git-debrebase:1077 #, perl-format msgid "branch needs laundering (run git-debrebase): %s" msgstr "tak heeft wasbeurt (laundering) nodig (voer git-debrebase uit): %s" #: ../git-debrebase:1105 #, perl-format msgid "packaging change (%s) follows upstream change" msgstr "wijziging (%s) bij het verpakken volgt de bovenstroomse wijziging" #: ../git-debrebase:1106 #, perl-format msgid " (eg %s)" msgstr " (bijv. %s)" #: ../git-debrebase:1112 msgid "found mixed upstream/packaging commit" msgstr "gemengde toeleveraars-/verpakkings-vastlegging aangetroffen" #: ../git-debrebase:1113 ../git-debrebase:1121 ../git-debrebase:1126 #: ../git-debrebase:1131 ../git-debrebase:1137 ../git-debrebase:1145 #, perl-format msgid " (%s)" msgstr " (%s)" #: ../git-debrebase:1120 #, perl-format msgid "found interchange bureaucracy commit (%s)" msgstr "vastlegging in verband met uitwisselingsbeheer aangetroffen (%s)" #: ../git-debrebase:1125 msgid "found dgit dsc import" msgstr "dsc-import door dgit aangetroffen" #: ../git-debrebase:1130 msgid "found bare dgit dsc import with no prior history" msgstr "" "kale dsc-import door dgit aangetroffen zonder voorafgaande geschiedenis" #: ../git-debrebase:1136 msgid "found vanilla merge" msgstr "standaardsamenvoeging (vanilla merge) aangetroffen" #: ../git-debrebase:1143 #, perl-format msgid "found unprocessable commit, cannot cope: %s" msgstr "niet-verwerkbare vastlegging aangetroffen, kan er niet mee om: %s" #: ../git-debrebase:1154 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: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:1771 msgid "launder for rebase" msgstr "wassen (launder) voor rebase" #: ../git-debrebase:1776 msgid "analyse does not support any options" msgstr "analyse ondersteunt geen opties" #: ../git-debrebase:1778 msgid "too many arguments to analyse" msgstr "te veel argumenten om te analyseren" #: ../git-debrebase:1813 msgid "HEAD symref is not to refs/heads/" msgstr "HEAD symref wijst niet naar refs/heads/" #: ../git-debrebase:1836 #, perl-format msgid "OK, you are ahead of %s\n" msgstr "Oké, u bent voor op %s\n" #: ../git-debrebase:1840 #, perl-format msgid "you are behind %s, divergence risk" msgstr "u bent achter op %s, gevaar voor uiteenlopen" #: ../git-debrebase:1844 #, perl-format msgid "you have diverged from %s" msgstr "u bent uiteengelopen van %s" #: ../git-debrebase:1866 msgid "remote dgit branch" msgstr "externe dgit-tak" #: ../git-debrebase:1869 msgid "remote dgit branch for sid" msgstr "externe dgit-tak voor sid" #: ../git-debrebase:1897 msgid "Recorded previous head for preservation" msgstr "Vorige head voor behoud opgetekend" #: ../git-debrebase:1905 #, perl-format msgid "could not record ffq-prev: %s" msgstr "kon ffq-prev niet optekenen: %s" #: ../git-debrebase:1916 #, perl-format msgid "could not check ffq-prev: %s" msgstr "kon ffq-prev niet controleren: %s" #: ../git-debrebase:1936 msgid "fast forward" msgstr "lineair (fast forward)" #: ../git-debrebase:1946 msgid "Declare fast forward / record previous work" msgstr "Afkondigen lineair (fast forward) / optekenen vorig werk" #: ../git-debrebase:1958 msgid "No ffq-prev to stitch." msgstr "Geen ffq-prev om aaneen te stikken." #: ../git-debrebase:1975 msgid "need NEW-VERSION [UPS-COMMITTISH]" msgstr "heb NIEUWE-VERSIE [TOEL-COMMITTISH] nodig" #: ../git-debrebase:1980 #, perl-format msgid "bad version number `%s'" msgstr "fout versienummer `%s'" #: ../git-debrebase:1999 #, perl-format msgid "upstream piece `%s'" msgstr "bovenstrooms stuk `%s'" #: ../git-debrebase:2000 msgid "upstream (main piece" msgstr "bovenstrooms (belangrijkste stuk" #: ../git-debrebase:2020 msgid "for each EXTRA-UPS-NAME need EXTRA-UPS-COMMITISH" msgstr "voor elke EXTRA-TOEL-NAAM is een EXTRA-TOEL-COMMITISH nodig" #: ../git-debrebase:2053 #, 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:2062 #, perl-format msgid "previous upstream combine %s first piece is not `.'" msgstr "eerste stuk van vorige bovenstroom-bijeenvoeging %s is niet `.'" #: ../git-debrebase:2075 #, 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:2086 #, perl-format msgid "introducing upstream piece `%s'" msgstr "bovenstrooms stuk `%s' wordt ingevoerd" #: ../git-debrebase:2089 #, perl-format msgid "dropping upstream piece `%s'" msgstr "bovenstrooms stuk `%s' wordt weggelaten" #: ../git-debrebase:2092 #, perl-format msgid "not fast forward: %s %s" msgstr "niet lineair (fast forward): %s %s" #: ../git-debrebase:2203 msgid "Previous head already recorded\n" msgstr "Vorige head reeds opgenomen\n" #: ../git-debrebase:2207 #, perl-format msgid "Could not preserve: %s" msgstr "Niet in staat te behouden: %s" #: ../git-debrebase:2212 ../git-debrebase:2218 ../git-debrebase:2224 #: ../git-debrebase:2324 ../git-debrebase:2333 ../git-debrebase:2357 #: ../git-debrebase:2421 msgid "no arguments allowed" msgstr "geen argumenten toegelaten" #: ../git-debrebase:2246 msgid "branch contains furniture (not laundered)" msgstr "tak bevat stoffering (niet gewassen)" #: ../git-debrebase:2247 msgid "branch is unlaundered" msgstr "tak is ongewassen (unlaundered)" #: ../git-debrebase:2248 msgid "branch needs laundering" msgstr "tak heeft wasbeurt nodig" #: ../git-debrebase:2249 msgid "branch not in git-debrebase form" msgstr "tak is niet in git-debrebase-indeling" #: ../git-debrebase:2259 msgid "current branch contents, in git-debrebase terms:\n" msgstr "inhoud van de huidige tak, in git-debrebase-terminologie:\n" #: ../git-debrebase:2261 msgid " branch is laundered\n" msgstr " tak is gewassen\n" #: ../git-debrebase:2277 #, perl-format msgid " %s is not well-defined\n" msgstr " %s is niet goed gedefinieerd\n" #: ../git-debrebase:2283 msgid "key git-debrebase commits:\n" msgstr "kern-git-debrebase-vastleggingen:\n" #: ../git-debrebase:2284 msgid "anchor" msgstr "anker" #: ../git-debrebase:2285 msgid "breakwater" msgstr "golfbreker (breakwater)" #: ../git-debrebase:2300 msgid "branch and ref status, in git-debrebase terms:\n" msgstr "toestand van tak en ref, in git-debrebase-terminologie:\n" #: ../git-debrebase:2307 msgid " unstitched; previous tip was:\n" msgstr " stiksel losgemaakt; vorige tip was:\n" #: ../git-debrebase:2310 msgid " stitched? (no record of git-debrebase work)\n" msgstr " aaneen gestikt? (geen registratie van git-debrebase werkzaamheden)\n" #: ../git-debrebase:2312 msgid " stitched\n" msgstr " aaneen gestikt\n" #: ../git-debrebase:2314 msgid " not git-debrebase (diverged since last stitch)\n" msgstr " geen git-debrebase (uiteengelopen sinds laatste stiksel)\n" #: ../git-debrebase:2317 msgid "you are currently rebasing\n" msgstr "u bent momenteel aan het rebasen\n" #: ../git-debrebase:2334 ../git-debrebase:2347 msgid "launder for git-debrebase quick" msgstr "wassen voor git-debrebase quick" #: ../git-debrebase:2341 ../git-debrebase:2371 msgid "No ongoing git-debrebase session." msgstr "Geen lopende git-debrebase-sessie." #: ../git-debrebase:2410 msgid "Commit patch queue (exported by git-debrebase)" msgstr "Vastlegging patch-wachtrij (geëxporteerd door git-debrebase)" #: ../git-debrebase:2427 msgid "No (more) patches to export." msgstr "Geen (andere) patches die geëxporteerd moeten worden." #: ../git-debrebase:2434 #, 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:2454 #, perl-format msgid "%s contains comments, which will be discarded" msgstr "%s bevat commentaar die verwijderd zal worden" #: ../git-debrebase:2459 #, perl-format msgid "patch %s repeated in %s !" msgstr "patch %s herhaald in %s !" #: ../git-debrebase:2466 #, perl-format msgid "Unused patch file %s will be discarded" msgstr "Niet gebruikt patch-bestand %s zal verwijderd worden" #: ../git-debrebase:2474 msgid "ffq-prev exists, this is already managed by git-debrebase!" msgstr "ffq-prev bestaat; dit wordt reeds beheerd door git-debrebase!" #: ../git-debrebase:2479 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:2496 msgid "want only 1 optional argument, the upstream git commitish" msgstr "wil slechts 1 facultatief argument, de bovenstroomse git commitish" #: ../git-debrebase:2501 msgid "missing Version from changelog\n" msgstr "ontbrekende versie uit changelog\n" #: ../git-debrebase:2517 #, 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:2525 #, perl-format msgid "upstream (%s) is not an ancestor of HEAD" msgstr "bovenstroom (%s) is geen voorouder van HEAD" #: ../git-debrebase:2532 #, 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:2534 #, perl-format msgid "list expected changes with: %s\n" msgstr "toon verwachte wijzigingen met: %s\n" #: ../git-debrebase:2541 #, perl-format msgid "upstream (%s) contains debian/ directory" msgstr "upstream (%s) bevat een debian/-map" #: ../git-debrebase:2559 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:2565 #, perl-format msgid "could not find suitable maintainer view tag %s\n" msgstr "kon geen geschikte maintainer-weergavetag %s vinden\n" #: ../git-debrebase:2568 #, perl-format msgid "HEAD is not FF from maintainer tag %s!" msgstr "HEAD is niet FF (lineair) vanaf maintainer-tag %s!" #: ../git-debrebase:2571 #, perl-format msgid "dgit view tag %s not found\n" msgstr "dgit-weergavetag %s niet gevonden\n" #: ../git-debrebase:2573 #, 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:2575 #, perl-format msgid "will stitch in dgit view, %s\n" msgstr "aaneen stikken zal gebeuren in de dgit-weergave, %s\n" #: ../git-debrebase:2582 #, perl-format msgid "" "Cannot confirm dgit view: %s\n" "Failed to stitch in dgit view (see messages above).\n" "dgit --trust-changelog will be needed on the first dgit push after " "conversion.\n" msgstr "" "Kan de dgit-weergave niet bevestigen: %s\n" "Aaneen stikken (stitch) in dgit-weergave mislukte (zie bovenstaande " "berichten).\n" "dgit --trust-changelog zal nodig zijn bij de eerste dgit push na de " "omzetting.\n" #: ../git-debrebase:2628 #, 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:2657 #, 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:2678 msgid "takes 1 optional argument, the upstream commitish" msgstr "heeft 1 facultatief argument, de bovenstroomse commitish" #: ../git-debrebase:2686 #, perl-format msgid "%s, from command line" msgstr "%s, van de commandoregel" #: ../git-debrebase:2700 #, 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:2704 msgid "Branch already in git-debrebase format." msgstr "Tak is reeds in git-debrebase-indeling." #: ../git-debrebase:2716 msgid "Considering possible commits corresponding to upstream:\n" msgstr "Mogelijke vastleggingen nagaan die met bovenstroom overeenkomen:\n" #: ../git-debrebase:2724 #, perl-format msgid "git tag %s" msgstr "git tag %s" #: ../git-debrebase:2730 #, perl-format msgid " git tag: no suitable tag found (tried %s)\n" msgstr " git tag: geen geschikte tag gevonden (probeerde %s)\n" #: ../git-debrebase:2739 #, perl-format msgid "opendir build-products-dir %s: %s" msgstr "opendir build-products-dir %s: %s" #: ../git-debrebase:2745 #, 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:2776 #, 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:2785 msgid "Evaluating possible commits corresponding to upstream:\n" msgstr "Mogelijke vastleggingen evalueren die met bovenstroom overeenkomen:\n" #: ../git-debrebase:2826 #, perl-format msgid " %s: couldn't apply patches: gbp pq %s" msgstr " %s: kon patches niet toepassen: gbp pq %s" #: ../git-debrebase:2835 #, perl-format msgid " %s: applying patches gives different tree\n" msgstr " %s: patches toepassen geeft een afwijkende boom\n" #: ../git-debrebase:2849 msgid "" "Could not find or construct a suitable upstream commit.\n" "Rerun adding --diagnose after convert-from-dgit-view, or pass a\n" "upstream commit 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:2855 #, perl-format msgid "Yes, will base new branch on %s\n" msgstr "Ja, zal nieuwe tak baseren op %s\n" #: ../git-debrebase:2860 #, 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:2868 msgid "Output of conversion does not match input!" msgstr "Uitvoer van conversie komt niet net invoer overeen!" #: ../git-debrebase:2876 msgid "forget-was-ever-debrebase takes no further arguments" msgstr "forget-was-ever-debrebase wordt zonder verdere argumenten gebruikt" #: ../git-debrebase:2880 #, 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:2985 msgid "bad options\n" msgstr "foute opties\n" #: ../git-debrebase:2995 #, 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:3025 #, perl-format msgid "unknown git-debrebase sub-operation %s" msgstr "onbekende onderliggende bewerking van git-debrebase: %s" #: ../Debian/Dgit/ProtoConn.pm:93 ../Debian/Dgit/ProtoConn.pm:112 #, perl-format msgid "connection lost: %s" msgstr "verbinding verbroken: %s" #: ../Debian/Dgit/ProtoConn.pm:94 #, perl-format msgid "protocol violation; %s not expected" msgstr "protocolschending; %s werd niet verwacht" #: ../Debian/Dgit/ProtoConn.pm:115 #, perl-format msgid "eof (reading %s)" msgstr "eof (bij het lezen van %s)" #: ../Debian/Dgit/ProtoConn.pm:135 msgid "protocol message" msgstr "protocolbericht" #: ../Debian/Dgit/ProtoConn.pm:144 #, perl-format msgid "`%s'" msgstr "`%s'" #: ../Debian/Dgit/ProtoConn.pm:149 msgid "bad byte count" msgstr "aantal slechte bytes" #: ../Debian/Dgit/ProtoConn.pm:152 msgid "data block" msgstr "gegevensblok" #: ../Debian/Dgit.pm:352 #, perl-format msgid "error: %s\n" msgstr "fout: %s\n" #: ../Debian/Dgit.pm:378 #, perl-format msgid "getcwd failed: %s\n" msgstr "getcwd mislukte: %s\n" #: ../Debian/Dgit.pm:397 msgid "terminated, reporting successful completion" msgstr "beëindigd, met de melding van een succesvolle voltooiing" #: ../Debian/Dgit.pm:399 #, perl-format msgid "failed with error exit status %s" msgstr "mislukt met de foutmelding %s" #: ../Debian/Dgit.pm:402 #, perl-format msgid "died due to fatal signal %s" msgstr "gestorven vanwege fataal signaal %s" #: ../Debian/Dgit.pm:406 #, perl-format msgid "failed with unknown wait status %s" msgstr "mislukt met ongekende wachttoestand %s" #: ../Debian/Dgit.pm:412 msgid "failed command" msgstr "mislukt commando" #: ../Debian/Dgit.pm:418 #, perl-format msgid "failed to fork/exec: %s" msgstr "fork/exec is mislukt: %s" #: ../Debian/Dgit.pm:420 #, perl-format msgid "subprocess %s" msgstr "onderliggend proces %s" #: ../Debian/Dgit.pm:422 msgid "subprocess produced invalid output" msgstr "onderliggend proces produceerde ongeldige uitvoer" #: ../Debian/Dgit.pm:527 msgid "stat source file: %S" msgstr "stat bronbestand: %S" #: ../Debian/Dgit.pm:537 msgid "stat destination file: %S" msgstr "stat doelbestand: %S" #: ../Debian/Dgit.pm:556 msgid "finally install file after cp: %S" msgstr "tot slot, installeer bestand na cp: %S" #: ../Debian/Dgit.pm:562 msgid "delete old file after cp: %S" msgstr "verwijder oud bestand na cp: %S" #: ../Debian/Dgit.pm:585 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:588 #, perl-format msgid "chdir toplevel %s: %s\n" msgstr "chdir naar hoogste niveau %s: %s\n" #: ../Debian/Dgit.pm:696 msgid "git index contains changes (does not match HEAD)" msgstr "de index van git bevat wijzigingen (komt niet overeen met HEAD)" #: ../Debian/Dgit.pm:697 msgid "working tree is dirty (does not match HEAD)" msgstr "werkboom is bevuild (komt niet overeen met HEAD)" #: ../Debian/Dgit.pm:722 msgid "using specified upstream commitish" msgstr "opgegeven bovenstroomse commitish wordt gebruikt" #: ../Debian/Dgit.pm:729 #, 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:734 ../Debian/Dgit.pm:736 #, perl-format msgid "using upstream from git tag %s" msgstr "bovenstroom van git tag %s wordt gebruikt" #: ../Debian/Dgit.pm:850 #, perl-format msgid "failed to remove directory tree %s: rm -rf: %s; %s\n" msgstr "" #: ../Debian/Dgit.pm:885 msgid "detached HEAD" msgstr "vrijstaande HEAD (detached HEAD)" #: ../Debian/Dgit.pm:886 msgid "HEAD symref is not to refs/" msgstr "symbolische referentie HEAD is geen referentie naar refs/" #: ../Debian/Dgit.pm:902 #, perl-format msgid "parsing of %s failed" msgstr "ontleden van %s mislukte" #: ../Debian/Dgit.pm:911 #, 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:925 #, perl-format msgid "open %s (%s): %s" msgstr "open %s (%s): %s" #: ../Debian/Dgit.pm:950 #, perl-format msgid "missing field %s in %s" msgstr "ontbrekend veld %s in %s" #: ../Debian/Dgit.pm:1036 msgid "Dummy commit - do not use\n" msgstr "Voorbeeldvastlegging - niet gebruiken\n" #: ../Debian/Dgit.pm:1057 #, perl-format msgid "exec %s: %s\n" msgstr "exec %s: %s\n" #: ../Debian/Dgit.pm:1085 #, perl-format msgid "Taint recorded at time %s for package %s" msgstr "Bezoedeling geregistreerd op tijdstip %s voor pakket %s" #: ../Debian/Dgit.pm:1087 #, perl-format msgid "Taint recorded at time %s for any package" msgstr "Bezoedeling geregistreerd op tijdstip %s voor willekeurig pakket" #: ../Debian/Dgit.pm:1089 #, perl-format msgid "Taint recorded for package %s" msgstr "Bezoedeling geregistreerd voor pakket %s" #: ../Debian/Dgit.pm:1091 msgid "Taint recorded for any package" msgstr "Bezoedeling geregistreerd voor willekeurig pakket" #: ../Debian/Dgit.pm:1103 msgid "Uncorrectable error. If confused, consult administrator.\n" msgstr "" "Niet-corrigeerbare fout. Neem bij verwarring contact op met de beheerder.\n" #: ../Debian/Dgit.pm:1106 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:1109 #, perl-format msgid "Forcing due to %s\n" msgstr "Forceren vanwege %s\n" #: ../Debian/Dgit.pm:1174 #, perl-format msgid "cannot stat %s/.git: %s" msgstr "kan status van %s/.git niet verkrijgen: %s" #: ../Debian/Dgit.pm:1197 #, perl-format msgid "failed to mkdir playground parent %s: %s" msgstr "mkdir van speelplaatsouder %s mislukte: %s" #: ../Debian/Dgit.pm:1205 #, perl-format msgid "failed to mkdir a playground %s: %s" msgstr "mkdir van een speelplaats %s mislukte: %s" #: ../Debian/Dgit.pm:1214 #, perl-format msgid "failed to mkdir the playground %s: %s" msgstr "mkdir van de speelplaats %s mislukte: %s" work/po/part.make0000664000000000000000000000045515016262471011163 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-potcdate0000775000000000000000000000023415016262471012375 0ustar #! /usr/bin/perl -n BEGIN { $seen_potcdate = 0; } if (not $seen_potcdate and /^"POT-Creation-Date: .*"/) { $seen_potcdate = 1; next; } print; work/po4a/0000775000000000000000000000000015016262471007577 5ustar work/po4a/.gitignore0000664000000000000000000000006515016262471011570 0ustar translated preview.* .po4a.*.cfg .*.translated *.tmp work/po4a/Makefile0000664000000000000000000001016115016262471011236 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, please 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 translated 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/README0000777000000000000000000000000015016262471012163 2../po/READMEustar work/po4a/dgit-downstream-dsc_7.pot0000664000000000000000000004571515016262471014444 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.pot0000664000000000000000000011736515016262471014535 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: 2025-03-28 17:38+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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 ../tag2upload.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:347 #: ../dgit-maint-merge.7.pod:426 ../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: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:420 #: ../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:359 #: ../dgit-maint-merge.7.pod:451 ../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:320 ../dgit-maint-debrebase.7.pod:482 msgid "BUILDING AND UPLOADING" msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:345 ../dgit-maint-debrebase.7.pod:360 msgid "Obtaining the release" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:351 ../dgit-maint-debrebase.7.pod:366 #, no-wrap msgid "" " % git fetch --tags upstream\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:355 ../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:361 ../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:366 ../dgit-maint-debrebase.7.pod:381 msgid "Then, either" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:370 ../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:374 ../dgit-maint-debrebase.7.pod:389 msgid "or if you have a working watch file" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:378 ../dgit-maint-debrebase.7.pod:393 #, no-wrap msgid "" " % gbp import-orig --uscan\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:414 ../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:424 ../dgit-maint-debrebase.7.pod:517 msgid "HANDLING DFSG-NON-FREE MATERIAL" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:453 ../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:498 ../dgit-maint-gbp.7.pod:133 #: ../dgit-maint-debrebase.7.pod:596 msgid "INCORPORATING NMUS" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:513 ../dgit-maint-gbp.7.pod:143 #: ../dgit-maint-debrebase.7.pod:796 ../dgit-maint-bpo.7.pod:144 #: ../git-debpush.1.pod:277 msgid "AUTHOR" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:515 ../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: verbatim #: ../dgit-maint-debrebase.7.pod:90 #, no-wrap msgid "" " % git remote add -f origin git@salsa.debian.org:debian/foo.git\n" " % git push --follow-tags -u origin master\n" "\n" 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<--trust-changelog> 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<--trust-changelog>." 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 to this suite, consider " "passing I<--deliberately-not-fast-forward> instead of I<--trust-changelog>. " "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), gitrevisions(7)" msgstr "" work/po4a/dgit-maint-gbp_7.pot0000664000000000000000000002074315016262471013362 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: 2025-03-28 17:38+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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 ../tag2upload.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:465 ../dgit-maint-native.7.pod:127 #: ../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:498 ../dgit-maint-gbp.7.pod:133 #: ../dgit-maint-debrebase.7.pod:596 msgid "INCORPORATING NMUS" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:513 ../dgit-maint-gbp.7.pod:143 #: ../dgit-maint-debrebase.7.pod:796 ../dgit-maint-bpo.7.pod:144 #: ../git-debpush.1.pod:277 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, B, and 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:177 #, 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-built\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<--trust-changelog> 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 to this suite, consider " "passing I<--deliberately-not-fast-forward> instead of I<--trust-changelog>. " "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<--trust-changelog>." 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.pot0000664000000000000000000006173015016262471013712 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: 2025-03-28 17:38+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =item #: ../dgit.1:298 ../dgit-maint-merge.7.pod:464 #, no-wrap msgid "1." msgstr "" #. type: =item #: ../dgit.1:299 ../dgit-maint-merge.7.pod:468 #, no-wrap msgid "2." msgstr "" #. type: =item #: ../dgit.1:300 ../dgit-maint-merge.7.pod:473 #, no-wrap msgid "3." msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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 ../tag2upload.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: verbatim #: ../dgit-maint-native.7.pod:106 ../dgit-maint-merge.7.pod:502 #, 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:347 #: ../dgit-maint-merge.7.pod:426 ../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 #, 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:420 #: ../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:359 #: ../dgit-maint-merge.7.pod:451 ../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 salsa.debian.org:debian/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<--trust-changelog>. If this is the first " "ever dgit push of the package, consider passing I<--deliberately-not-fast-" "forward> instead of I<--trust-changelog>. 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 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 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." msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:305 msgid "debian/source/options" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:307 msgid "" "We set a source package option to help dpkg handle changes to the upstream " "source:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:313 #, no-wrap msgid "" " auto-commit\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:317 msgid "" "You don't need to create this file if you are using the version 1.0 source " "package format." msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:320 ../dgit-maint-debrebase.7.pod:482 msgid "BUILDING AND UPLOADING" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:322 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:328 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:332 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:339 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:343 msgid "NEW UPSTREAM RELEASES" msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:345 ../dgit-maint-debrebase.7.pod:360 msgid "Obtaining the release" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:351 ../dgit-maint-debrebase.7.pod:366 #, no-wrap msgid "" " % git fetch --tags upstream\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:355 ../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:361 ../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:366 ../dgit-maint-debrebase.7.pod:381 msgid "Then, either" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:370 ../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:374 ../dgit-maint-debrebase.7.pod:389 msgid "or if you have a working watch file" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:378 ../dgit-maint-debrebase.7.pod:393 #, no-wrap msgid "" " % gbp import-orig --uscan\n" "\n" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:382 msgid "In the following, replace I<1.2.3> with I." msgstr "" #. type: =head2 #: ../dgit-maint-merge.7.pod:384 msgid "Reviewing & merging the release" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:386 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:392 #, 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:396 msgid "You can then review the full merge diff:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:400 #, 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:404 msgid "Once you're satisfied with what will be merged, update your package:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:408 #, 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:414 ../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:424 ../dgit-maint-debrebase.7.pod:517 msgid "HANDLING DFSG-NON-FREE MATERIAL" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:428 msgid "We create a DFSG-clean tag to merge to master:" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:432 #, 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:441 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:446 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:453 ../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:458 msgid "FORWARDING PATCHES UPSTREAM" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:460 msgid "The basic steps are:" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:466 msgid "Create a new branch based off upstream's master branch." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:470 msgid "" "git-cherry-pick(1) commits from your master branch onto your new branch." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:475 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:480 msgid "For example (and it is only an example):" msgstr "" #. type: verbatim #: ../dgit-maint-merge.7.pod:484 #, 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:494 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:498 ../dgit-maint-gbp.7.pod:133 #: ../dgit-maint-debrebase.7.pod:596 msgid "INCORPORATING NMUS" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:506 msgid "" "Alternatively, you can apply the NMU diff to your repository. The next push " "will then require I<--trust-changelog>." msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:511 msgid "dgit(1), dgit(7), gitrevisions(7)" msgstr "" #. type: =head1 #: ../dgit-maint-merge.7.pod:513 ../dgit-maint-gbp.7.pod:143 #: ../dgit-maint-debrebase.7.pod:796 ../dgit-maint-bpo.7.pod:144 #: ../git-debpush.1.pod:277 msgid "AUTHOR" msgstr "" #. type: textblock #: ../dgit-maint-merge.7.pod:515 ../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.pot0000664000000000000000000001406215016262471014075 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: 2025-03-28 17:38+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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 ../tag2upload.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: textblock #: ../dgit-user.7.pod:465 ../dgit-maint-native.7.pod:127 #: ../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 --trust-changelog 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 --trust-changelog 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 to this " "suite, you can avoid this merge commit by passing C<--deliberately-not-fast-" "forward> instead of C<--trust-changelog>. 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:502 #, 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<--trust-changelog>." msgstr "" work/po4a/dgit-nmu-simple_7.pot0000664000000000000000000002135515016262471013572 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: 2025-05-07 19:40+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:158 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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 existing 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 "PREPARING AND REVISING THE LOCAL BRANCH" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:84 msgid "" "The dgit/sid branch is a normal local git branch tracking a (synthetic) " "upstream branch. So you can freely rewrite any commits that you have made " "locally and haven't pushed anywhere, as normal," msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:90 msgid "" "The one thing that's weird is the \"quilt fixup\" commits (that turn up if " "you do eg dgit sbuild). If you're rebasing them at all, you can and should " "just drop them; dgit will then regenerate them as needed." msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:95 msgid "All of this follows from one underlying fact:" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:97 msgid "" "dgit doesn't have invisible git state somewhere. So if you rebase away the " "quilt fixup, and rework your branch, your branch is still good because it " "looks just like it would do, if you'd just made those commits straight off. " "(NB git-debrebase B have weird off-branch state.)" msgstr "" #. type: =head1 #: ../dgit-nmu-simple.7.pod:103 msgid "RELEVANT BRANCHES" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:105 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:111 msgid "KEEPING YOUR WORKING TREE TIDY" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:113 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:118 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:122 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:128 msgid "OTHER GIT BRANCHES" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:130 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:135 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:142 #, no-wrap msgid "" " % git fetch vcs-git\n" "\n" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:146 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:152 msgid "UPLOADING TO DELAYED" msgstr "" #. type: textblock #: ../dgit-nmu-simple.7.pod:154 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:160 msgid "dgit(1), dgit(7), dgit-maint-*(7)" msgstr "" work/po4a/dgit-sponsorship_7.pot0000664000000000000000000003503115016262471014067 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: 2025-03-28 17:38+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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:177 #, 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:80 ../dgit-sponsorship.7.pod:85 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-deborig(1), git-" "archive(1) or gbp-buildpackage(1) command(s) to generate them." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:82 msgid "" "A sample dgit push-source command, containing any dgit --quilt=, --gbp or --" "dpm option needed" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:87 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:94 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:99 msgid "git branch" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:103 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:108 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:111 msgid "" "Instead, the sponsee should include the git commit id of their HEAD in their " "handover email." msgstr "" #. type: =head3 #: ../dgit-sponsorship.7.pod:117 msgid "orig tarballs" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:121 msgid "" "If there are any .origs that are not in the archive already, the sponsor " "will need them as part of the upload. (When using a native source package " "format, no origs are needed.)" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:125 msgid "" "If the sponsee generated these tarballs with git-deborig(1), git-archive(1) " "or gbp-buildpackage(1), they can simply include a sample invocation of git-" "deborig(1) or 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:134 msgid "" "Otherwise, the simplest approach is to commit the orig tarballs with " "pristine-tar(1), e.g." msgstr "" #. type: verbatim #: ../dgit-sponsorship.7.pod:140 #, 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:144 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:148 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:153 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:159 msgid "quilt options" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:163 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:167 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:183 msgid "SPONSOR WORKFLOW" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:185 ../dgit-sponsorship.7.pod:277 msgid "This part is addressed to the sponsor:" msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:187 msgid "Receiving and validating the sponsorship request" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:189 msgid "You should check the signature on the email." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:191 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:198 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:202 msgid "Now you can check out the branch tip, and do your substantive review." msgstr "" #. type: =head2 #: ../dgit-sponsorship.7.pod:205 msgid "Dealing with branches that want --quilt=" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:207 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:213 #, 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:218 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:221 msgid "Some hints which may help the review" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:223 msgid "" "C will get you an up-to-date C " "showing what's in the archive already." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:227 msgid "" "C will check that dgit can build an " "appropriate source package." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:230 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:235 msgid "Doing the upload" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:237 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:246 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:253 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:261 msgid "" "If this was the first upload done with dgit, you may need to pass C<--trust-" "changelog> to dgit." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:266 msgid "" "Alternatively, if this was the first ever dgit push of the package to this " "suite, you can pass C<--deliberately-not-fast-forward> instead of C<--trust-" "changelog>. 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:275 msgid "SPONSORING A NON-GIT-USING SPONSEE" msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:279 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:283 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:290 #, 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:297 msgid "Or for an entirely new package:" msgstr "" #. type: verbatim #: ../dgit-sponsorship.7.pod:301 #, 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:308 msgid "" "This will leave you looking at the sponsee's package, formatted as a dgit " "branch." msgstr "" #. type: textblock #: ../dgit-sponsorship.7.pod:311 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:317 msgid "" "You will need to pass C<--trust-changelog> 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:328 msgid "dgit(1), dgit(7), dgit-nmu-simple(7), dgit-maint-*(7)" msgstr "" work/po4a/dgit-user_7.nl.po0000664000000000000000000011034515016262471012704 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, 2024-2025. # msgid "" msgstr "" "Project-Id-Version: dgit_12.11_dgit-user_7\n" "POT-Creation-Date: 2025-03-28 17:38+0000\n" "PO-Revision-Date: 2025-04-12 22:04+0200\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 3.2.2\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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "NAAM" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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 #: ../dgit-maint-bpo.7.pod:5 ../git-debrebase.5.pod:5 ../tag2upload.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" " % sudo apt-get build-dep .\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" " % sudo apt-get build-dep .\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 commits 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 vastleggingen " "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 "" " % sudo apt-get build-dep .\n" " % dpkg-buildpackage -uc -b\n" "\n" msgstr "" " % sudo apt-get build-dep .\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 Stretch or newer" msgstr "Debian Stretch of later" #. type: verbatim #: ../dgit-user.7.pod:328 #, no-wrap msgid "" " % sudo apt install ../libc6_*.deb\n" "\n" msgstr "" " % sudo apt install ../libc6_*.deb\n" "\n" #. type: =head2 #: ../dgit-user.7.pod:332 msgid "Debian Jessie or older" msgstr "Debian Jessie of eerder" #. type: verbatim #: ../dgit-user.7.pod:336 #, no-wrap msgid "" " % sudo dpkg -i ../libc6_*.deb\n" "\n" msgstr "" " % sudo dpkg -i ../libc6_*.deb\n" "\n" #. type: textblock #: ../dgit-user.7.pod:340 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:343 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: =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: =head1 #: ../dgit-user.7.pod:447 msgid "INSTALLING NEWER DGIT ON OLDER DISTROS" msgstr "NIEUWERE DGIT INSTALLEREN OP OUDERE DISTRIBUTIES" #. type: textblock #: ../dgit-user.7.pod:449 msgid "" "If dgit breaks with the source package you are working with, this might be " "due to a bug which would be fixed by upgrading." msgstr "" "Als dgit niet werkt met het bronpakket waarmee u werkt, kan dit te wijten " "zijn aan een bug. Deze kan worden verholpen door een upgrade." #. type: textblock #: ../dgit-user.7.pod:452 msgid "" "You can probably directly C the latest version of dgit.deb from " "Debian stable, or Debian testing." msgstr "" "U kunt waarschijnlijk rechtstreeks de nieuwste versie van dgit.deb " "installeren via C vanuit Debian stable of Debian testing." #. type: textblock #: ../dgit-user.7.pod:457 msgid "" "Versions of dgit from Debian 13 (trixie) onwards document their " "installability on old releases in the manpage. For example, for current " "Debian testing, see L, and look in the section SUPPORT ON OLD DISTRIBUTIONS." msgstr "" "Versies van dgit vanaf Debian 13 (trixie) documenteren hun " "installeerbaarheid op oude releases in de manpagina. Zie bijvoorbeeld " "L voor het huidige " "Debian testing en kijk in de sectie ONDERSTEUNING OP OUDE DISTRIBUTIES.." #. type: textblock #: ../dgit-user.7.pod:465 ../dgit-maint-native.7.pod:127 #: ../dgit-maint-gbp.7.pod:141 msgid "dgit(1), dgit(7)" msgstr "dgit(1), dgit(7)" work/po4a/dgit-user_7.pot0000664000000000000000000005121415016262471012457 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: 2025-03-28 17:38+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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 #: ../dgit-maint-bpo.7.pod:5 ../git-debrebase.5.pod:5 ../tag2upload.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" " % sudo apt-get build-dep .\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 commits 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 "" " % sudo apt-get build-dep .\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 Stretch or newer" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:328 #, no-wrap msgid "" " % sudo apt install ../libc6_*.deb\n" "\n" msgstr "" #. type: =head2 #: ../dgit-user.7.pod:332 msgid "Debian Jessie or older" msgstr "" #. type: verbatim #: ../dgit-user.7.pod:336 #, no-wrap msgid "" " % sudo dpkg -i ../libc6_*.deb\n" "\n" msgstr "" #. type: textblock #: ../dgit-user.7.pod:340 msgid "" "You can use C to install the .debs that came out of your package." msgstr "" #. type: textblock #: ../dgit-user.7.pod:343 msgid "" "If the dependencies aren't installed, you will get an error, which can " "usually be fixed with C." 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: =head1 #: ../dgit-user.7.pod:447 msgid "INSTALLING NEWER DGIT ON OLDER DISTROS" msgstr "" #. type: textblock #: ../dgit-user.7.pod:449 msgid "" "If dgit breaks with the source package you are working with, this might be " "due to a bug which would be fixed by upgrading." msgstr "" #. type: textblock #: ../dgit-user.7.pod:452 msgid "" "You can probably directly C the latest version of dgit.deb from " "Debian stable, or Debian testing." msgstr "" #. type: textblock #: ../dgit-user.7.pod:457 msgid "" "Versions of dgit from Debian 13 (trixie) onwards document their " "installability on old releases in the manpage. For example, for current " "Debian testing, see L, and look in the section SUPPORT ON OLD DISTRIBUTIONS." msgstr "" #. type: textblock #: ../dgit-user.7.pod:465 ../dgit-maint-native.7.pod:127 #: ../dgit-maint-gbp.7.pod:141 msgid "dgit(1), dgit(7)" msgstr "" work/po4a/dgit_1.pot0000664000000000000000000025767715016262471011522 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: 2025-03-28 17:38+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 ../tag2upload.5.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-debrebase.1.pod:5 ../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 usable 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:1442 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 this command)." msgstr "" #. type: Plain text #: ../dgit.1:245 msgid "" "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.\"" msgstr "" #. type: Plain text #: ../dgit.1:256 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:260 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:265 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:269 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:269 #, no-wrap msgid "B [I]" msgstr "" #. type: Plain text #: ../dgit.1:276 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:283 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 (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." msgstr "" #. type: Plain text #: ../dgit.1:288 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:288 #, no-wrap msgid "B|B IB<:>I [I]" msgstr "" #. type: Plain text #: ../dgit.1:295 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:298 ../dgit-maint-merge.7.pod:464 #, no-wrap msgid "1." msgstr "" #. type: tbl table #: ../dgit.1:298 #, no-wrap msgid "Clone on build host (dgit clone)" msgstr "" #. type: =item #: ../dgit.1:299 ../dgit-maint-merge.7.pod:468 #, no-wrap msgid "2." msgstr "" #. type: tbl table #: ../dgit.1:299 #, no-wrap msgid "Edit code on build host (edit, git commit)" msgstr "" #. type: =item #: ../dgit.1:300 ../dgit-maint-merge.7.pod:473 #, no-wrap msgid "3." msgstr "" #. type: tbl table #: ../dgit.1:300 #, no-wrap msgid "Build package on build host (dgit build)" msgstr "" #. type: tbl table #: ../dgit.1:301 #, no-wrap msgid "4." msgstr "" #. type: tbl table #: ../dgit.1:301 #, no-wrap msgid "Test package on build host or elsewhere (dpkg -i, test)" msgstr "" #. type: tbl table #: ../dgit.1:302 #, no-wrap msgid "5." msgstr "" #. type: tbl table #: ../dgit.1:302 #, no-wrap msgid "Upload by invoking dgit rpush on host with your GPG key." msgstr "" #. type: Plain text #: ../dgit.1:308 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:312 msgid "" "The remaining arguments are treated just as dgit push-source or dgit push-" "built would handle them." msgstr "" #. type: Plain text #: ../dgit.1:317 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:323 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, and that of any sponsee, in its keyring (but not your private key, " "obviously)." msgstr "" #. type: TP #: ../dgit.1:323 #, no-wrap msgid "B|B I<...>" msgstr "" #. type: Plain text #: ../dgit.1:334 msgid "" "Configurable aliases for B and B. These " "aliases will in the future change to mean B and B, and therefore they currently generate a warning." msgstr "" #. type: Plain text #: ../dgit.1:338 msgid "" "The behaviour of dgit push is controlled by the B " "git config option:" msgstr "" #. type: tbl table #: ../dgit.1:340 #, no-wrap msgid "B" msgstr "" #. type: tbl table #: ../dgit.1:340 #, no-wrap msgid "runs B" msgstr "" #. type: tbl table #: ../dgit.1:340 #, no-wrap msgid "future default" msgstr "" #. type: tbl table #: ../dgit.1:341 #, no-wrap msgid "B" msgstr "" #. type: tbl table #: ../dgit.1:341 #, no-wrap msgid "and runs B" msgstr "" #. type: tbl table #: ../dgit.1:342 #, no-wrap msgid "B" msgstr "" #. type: tbl table #: ../dgit.1:342 #, no-wrap msgid "warns, and runs B" msgstr "" #. type: tbl table #: ../dgit.1:342 #, no-wrap msgid "current default" msgstr "" #. type: tbl table #: ../dgit.1:343 #, no-wrap msgid "B" msgstr "" #. type: tbl table #: ../dgit.1:343 #, no-wrap msgid "fails" msgstr "" #. type: Plain text #: ../dgit.1:354 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:364 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:364 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:380 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:380 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:386 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:386 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:392 msgid "" "Configures a git merge helper for the file B which uses " "B." msgstr "" #. type: TP #: ../dgit.1:392 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:407 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:415 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:426 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:426 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:433 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:435 msgid "This is normally done automatically by dgit build and dgit push." msgstr "" #. type: Plain text #: ../dgit.1:441 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:450 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:455 msgid "See B in B." msgstr "" #. type: TP #: ../dgit.1:455 #, no-wrap msgid "B [I] I<../path/to/.dsc> [B<+>|B<..>]branch" msgstr "" #. type: Plain text #: ../dgit.1:461 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:472 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:482 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:484 msgid "There is only one sub-option:" msgstr "" #. type: Plain text #: ../dgit.1:490 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:509 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:513 msgid "If I does not start with refs/, refs/heads/ is prepended." msgstr "" #. type: TP #: ../dgit.1:513 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:516 msgid "Prints version information and exits." msgstr "" #. type: TP #: ../dgit.1:516 #, no-wrap msgid "BI< destdir>" msgstr "" #. type: Plain text #: ../dgit.1:520 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:520 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:525 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 usable in a browser." msgstr "" #. type: TP #: ../dgit.1:525 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:532 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:532 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.1:543 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:550 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:552 msgid "This function is primarily provided for the benefit of git-debrebase." msgstr "" #. type: =head1 #: ../dgit.1:552 ../git-debrebase.1.pod:473 #, no-wrap msgid "OPTIONS" msgstr "" #. type: TP #: ../dgit.1:553 #, no-wrap msgid "B<-k>I" msgstr "" #. type: Plain text #: ../dgit.1:562 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:562 #, no-wrap msgid "B<--no-sign>" msgstr "" #. type: Plain text #: ../dgit.1:565 msgid "does not sign tags or uploads (meaningful only with push)." msgstr "" #. type: TP #: ../dgit.1:566 #, no-wrap msgid "B<-p>I" msgstr "" #. type: Plain text #: ../dgit.1:570 msgid "Specifies that we should process source package I." msgstr "" #. type: Plain text #: ../dgit.1:574 msgid "" "For dgit fetch and dgit pull, uses this value rather than looking in debian/" "control or debian/changelog." msgstr "" #. type: Plain text #: ../dgit.1:579 msgid "" "For dgit rpush, specifies that the invoking host should be willing to sign " "only a .dsc or .changes file for the source package I." msgstr "" #. type: TP #: ../dgit.1:579 #, no-wrap msgid "B<--clean=git> | B<-wg>" msgstr "" #. type: Plain text #: ../dgit.1:585 msgid "" "Use B to clean the working tree, rather than running the " "package's rules clean target." msgstr "" #. type: Plain text #: ../dgit.1:588 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:593 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:600 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:600 #, no-wrap msgid "B<--clean=git-ff> | B<-wgf>" msgstr "" #. type: Plain text #: ../dgit.1:609 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:609 #, no-wrap msgid "B<--clean=git>[B<-ff>]B<,always> | B<-wga> | B<-wgfa>" msgstr "" #. type: Plain text #: ../dgit.1:613 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:613 #, no-wrap msgid "B<--clean=check> | B<--clean=check,ignores> | B<-wc> | B<-wci>" msgstr "" #. type: Plain text #: ../dgit.1:619 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:630 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:630 #, no-wrap msgid "B<--clean=none> | B<-wn>" msgstr "" #. type: Plain text #: ../dgit.1:638 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:638 #, no-wrap msgid "B<--clean=dpkg-source>[B<-d>] | B<-wd> | B<-wdd>" msgstr "" #. type: Plain text #: ../dgit.1:643 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:647 msgid "Without the extra B, requires the package's build dependencies." msgstr "" #. type: Plain text #: ../dgit.1:657 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:664 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:674 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:674 #, no-wrap msgid "B<--clean=dpkg-source>[B<-d>]B<,no-check> | B<-wdn> | B<-wddn>" msgstr "" #. type: Plain text #: ../dgit.1:678 msgid "" "Like --clean=dpkg-source, but does not care about untracked un-ignored files." msgstr "" #. type: TP #: ../dgit.1:678 #, no-wrap msgid "B<--clean=dpkg-source>[B<-d>]B<,all-check> | B<-wda> | B<-wdda>" msgstr "" #. type: Plain text #: ../dgit.1:683 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:683 #, no-wrap msgid "B<-N> | B<--new>" msgstr "" #. type: Plain text #: ../dgit.1:689 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:695 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:695 #, no-wrap msgid "B<--include-dirty>" msgstr "" #. type: Plain text #: ../dgit.1:703 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:715 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:715 #, no-wrap msgid "B<--ignore-dirty>" msgstr "" #. type: Plain text #: ../dgit.1:718 msgid "Deprecated alias for --include-dirty." msgstr "" #. type: TP #: ../dgit.1:718 #, no-wrap msgid "B<--collab-non-dgit>" msgstr "" #. type: Plain text #: ../dgit.1:725 msgid "" "Make B, behave more suitably for collaborating (using shared git " "history) with git-using co-developers who aren't using dgit." msgstr "" #. type: Plain text #: ../dgit.1:731 msgid "" "With this option, dgit won't mind that the git history you're using isn't " "necessarily fast forward from the dgit view; instead, it will rely on the " "changelog to prevent accidentally overwriting changes." msgstr "" #. type: Plain text #: ../dgit.1:740 msgid "" "And, the synthetic commits needed to make the dgit git history fast forward " "will appear only on the dgit git server, and local dgit suite branches, not " "on your own main branch. So they won't end up in the maintainer-visible " "history, when you push your own branch to make a merge request." msgstr "" #. type: Plain text #: ../dgit.1:743 msgid "This is equivalent to B<--split-view=always --trust-changelog>." msgstr "" #. type: TP #: ../dgit.1:743 #, no-wrap msgid "B<--trust-changelog> | B<--overwrite>=I" msgstr "" #. type: Plain text #: ../dgit.1:754 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:760 msgid "" "It is safer to specify B<--trust-changelog>, than B<--overwrite=>I, and usually the latter is not needed." msgstr "" #. type: Plain text #: ../dgit.1:767 msgid "" "B<--trust-changelog> 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:773 msgid "" "It 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:782 msgid "" "With B<--trust-changelog> dgit will check that the version in the archive is " "mentioned in your debian/changelog. (This will avoid losing changes, unless " "someone committed to git a finalised changelog entry, and then made later " "changes to that version.)" msgstr "" #. type: Plain text #: ../dgit.1:788 msgid "" "With B<--overwrite=>I that version ought to be the version " "currently in the archive, and it will be unconditionally overwritten, " "regardless of what's in the changelog." msgstr "" #. type: Plain text #: ../dgit.1:794 msgid "" "These options 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:801 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; B<--split-view=always> can be used to force " "that behaviour, e.g. in other quilt modes.)" msgstr "" #. type: Plain text #: ../dgit.1:805 msgid "" "B<--overwrite> without a version number is an obsolete way of specifying B<--" "trust-changelog>." msgstr "" #. type: TP #: ../dgit.1:805 #, no-wrap msgid "B<--delayed>=I" msgstr "" #. type: Plain text #: ../dgit.1:808 msgid "Upload to a DELAYED queue." msgstr "" #. type: Plain text #: ../dgit.1:818 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:823 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:823 #, no-wrap msgid "B<--no-chase-dsc-distro>" msgstr "" #. type: Plain text #: ../dgit.1:829 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:839 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:847 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:847 #, no-wrap msgid "B<--save-dgit-view=>I|I" msgstr "" #. type: Plain text #: ../dgit.1:857 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:861 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:865 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:869 msgid "B<--dgit-view-save> is a deprecated alias for --save-dgit-view." msgstr "" #. type: TP #: ../dgit.1:869 #, no-wrap msgid "B<--deliberately->I" msgstr "" #. type: Plain text #: ../dgit.1:883 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:883 #, no-wrap msgid "B<--deliberately-not-fast-forward>" msgstr "" #. type: Plain text #: ../dgit.1:889 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:895 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:906 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 --trust-changelog (which creates a suitable pseudomerge) and --" "deliberately-not-fast-forward (which suppresses the pseudomerge and the fast " "forward checks) should be needed; --trust-changelog is usually better." msgstr "" #. type: TP #: ../dgit.1:906 #, no-wrap msgid "B<--deliberately-include-questionable-history>" msgstr "" #. type: Plain text #: ../dgit.1:915 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:915 #, no-wrap msgid "B<--deliberately-fresh-repo>" msgstr "" #. type: Plain text #: ../dgit.1:920 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:920 ../git-debpush.1.pod:114 #, no-wrap msgid "B<--quilt=linear>" msgstr "" #. type: Plain text #: ../dgit.1:927 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:932 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:932 #, no-wrap msgid "B<--quilt=try-linear>" msgstr "" #. type: Plain text #: ../dgit.1:942 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:942 ../git-debpush.1.pod:120 #, no-wrap msgid "B<--quilt=smash>" msgstr "" #. type: Plain text #: ../dgit.1:948 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:954 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:954 #, no-wrap msgid "B<--quilt=single>" msgstr "" #. type: Plain text #: ../dgit.1:961 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:970 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:970 ../git-debpush.1.pod:131 #, no-wrap msgid "B<--quilt=nofix>" msgstr "" #. type: Plain text #: ../dgit.1:980 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:980 #, no-wrap msgid "B<--quilt=nocheck> | B<--no-quilt-fixup>" msgstr "" #. type: Plain text #: ../dgit.1:987 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:987 #, 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:994 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:998 msgid "" "These quilt modes are known as B. See --split-view, " "below." msgstr "" #. type: Plain text #: ../dgit.1:1006 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:1014 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:1019 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:1033 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:1044 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:1062 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:1071 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:1071 #, no-wrap msgid "B<-d>I | B<--distro=>I" msgstr "" #. type: Plain text #: ../dgit.1:1080 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:1086 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:1091 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:1091 #, no-wrap msgid "B<--split-view=auto>|B|B" msgstr "" #. type: Plain text #: ../dgit.1:1096 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:1104 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:1110 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:1113 msgid "" "B splits the view regardless of the source format and the quilt mode." msgstr "" #. type: Plain text #: ../dgit.1:1116 msgid "B will cause dgit to fail if split view is needed." msgstr "" #. type: Plain text #: ../dgit.1:1124 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:1127 msgid "" "Note that split view does not affect dgit fetch, and is not compatible with " "dgit pull." msgstr "" #. type: TP #: ../dgit.1:1127 #, no-wrap msgid "B<-C>I" msgstr "" #. type: Plain text #: ../dgit.1:1132 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:1141 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:1141 #, no-wrap msgid "B<--upstream-commitish=>I" msgstr "" #. type: Plain text #: ../dgit.1:1149 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:1149 #, no-wrap msgid "B<--rm-old-changes>" msgstr "" #. type: Plain text #: ../dgit.1:1161 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:1164 msgid "" "Note that B will always find the right .changes, " "regardless of this option." msgstr "" #. type: TP #: ../dgit.1:1164 #, no-wrap msgid "B<--build-products-dir=>I" msgstr "" #. type: Plain text #: ../dgit.1:1168 msgid "" "Specifies where to find and create tarballs, binary packages, source " "packages, .changes files, and so on." msgstr "" #. type: Plain text #: ../dgit.1:1171 msgid "By default, dgit uses the parent directory (B<..>)." msgstr "" #. type: Plain text #: ../dgit.1:1180 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:1180 #, no-wrap msgid "B<--no-rm-on-error>" msgstr "" #. type: Plain text #: ../dgit.1:1183 msgid "Do not delete the destination directory if clone fails." msgstr "" #. type: TP #: ../dgit.1:1183 #, no-wrap msgid "B<--dep14tag> | B<--no-dep14tag>" msgstr "" #. type: Plain text #: ../dgit.1:1189 msgid "" "Whether to push a DEP-14 tag (eg BI) as well as a dgit " "tag (eg BI)." msgstr "" #. type: Plain text #: ../dgit.1:1192 msgid "" "Pushing a DEP-14 tag is the default. In split view mode, a DEP-14 tag is " "always pushed, regardless of this option." msgstr "" #. type: Plain text #: ../dgit.1:1195 msgid "" "B<--always-dep14tag> is an obsolete alias for --dep14tag, retained for " "compatibility." msgstr "" #. type: TP #: ../dgit.1:1195 #, no-wrap msgid "B<--dep14tag-reuse=must>|B|B|B" msgstr "" #. type: Plain text #: ../dgit.1:1199 msgid "" "Whether to use an existing DEP-14 tag, or make a fresh one. Ignored if no " "DEP-14 tag is to be pushed." msgstr "" #. type: TP #: ../dgit.1:1200 #, no-wrap msgid "B<--dep14tag-reuse=must>" msgstr "" #. type: Plain text #: ../dgit.1:1204 msgid "" "Push an existing tag DEP-14 tag. If there is no existing tag, or the " "existing tag is unsuitable, fail." msgstr "" #. type: TP #: ../dgit.1:1204 #, no-wrap msgid "B<--dep14tag-reuse=if-exists>" msgstr "" #. type: Plain text #: ../dgit.1:1209 msgid "" "Push an existing tag DEP-14 tag, if it exists. If there is no existing tag, " "make one. If there is an existing tag but it is unsuitable, fail." msgstr "" #. type: Plain text #: ../dgit.1:1211 msgid "This is the default." msgstr "" #. type: TP #: ../dgit.1:1211 #, no-wrap msgid "B<--dep14tag-reuse=replace-unsuitable>" msgstr "" #. type: Plain text #: ../dgit.1:1216 msgid "" "Push an existing tag DEP-14 tag, if it exists and is suitable. If there is " "no existing tag, or it's unsuitable, make a fresh tag, overwriting the " "corresponding git ref, and thus deleting any old tag." msgstr "" #. type: TP #: ../dgit.1:1216 #, no-wrap msgid "B<--dep14tag-reuse=replace>" msgstr "" #. type: Plain text #: ../dgit.1:1220 msgid "" "Always make a fresh DEP-14 tag, overwriting the corresponding git ref, and " "thus deleting any old tag." msgstr "" #. type: Plain text #: ../dgit.1:1222 msgid "This was the default in dgit 11 and earlier." msgstr "" #. type: TP #: ../dgit.1:1223 #, no-wrap msgid "B<--dep14tag-verify> | B<--no-dep14tag-verify>" msgstr "" #. type: Plain text #: ../dgit.1:1227 msgid "" "Whether to verify an existing DEP-14 tag, as part of the suitability check." msgstr "" #. type: Plain text #: ../dgit.1:1230 msgid "" "The default is to consider an unsigned tag suitable (and not verify a signed " "one)." msgstr "" #. type: Plain text #: ../dgit.1:1236 msgid "" "Note that any DEP-14 tag being pushed will be, effectively, countersigned: " "the hash of the DEP-14 tag object (if there is one) is part of the metadata " "in the dgit view B tag message." msgstr "" #. type: TP #: ../dgit.1:1236 #, no-wrap msgid "B<-D>" msgstr "" #. type: Plain text #: ../dgit.1:1240 msgid "" "Prints debugging information to stderr. Repeating the option produces more " "output (currently, up to -DDDD is meaningfully different)." msgstr "" #. type: TP #: ../dgit.1:1240 #, no-wrap msgid "B<--keep-playground>|B<--no--keep-playground>" msgstr "" #. type: Plain text #: ../dgit.1:1249 msgid "" "Controls whether to retain the \"playground\" working directory B<.git/dgit/" "unpack> even on success, for examination and debugging. The default is B<--" "no-keep-playground> which deletes the directory after a successful execution." msgstr "" #. type: TP #: ../dgit.1:1249 #, no-wrap msgid "B<-c>IB<=>I" msgstr "" #. type: Plain text #: ../dgit.1:1253 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:1253 #, no-wrap msgid "B<-v>I|B<_> | B<--since-version=>versionI<|>B<_>" msgstr "" #. type: Plain text #: ../dgit.1:1262 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:1268 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:1268 #, no-wrap msgid "B<-m>I" msgstr "" #. type: Plain text #: ../dgit.1:1271 msgid "Passed to dpkg-genchanges (eventually)." msgstr "" #. type: TP #: ../dgit.1:1271 #, no-wrap msgid "B<--ch:>I config when B, " "or when pushing and B." msgstr "" #. type: TP #: ../dgit.1:1713 #, no-wrap msgid "BIB<.git-url>" msgstr "" #. type: TP #: ../dgit.1:1715 #, no-wrap msgid "BIB<.git-url>[B<-suffix>]" msgstr "" #. type: TP #: ../dgit.1:1717 #, no-wrap msgid "BIB<.git-proto>" msgstr "" #. type: TP #: ../dgit.1:1719 #, no-wrap msgid "BIB<.git-path>" msgstr "" #. type: TP #: ../dgit.1:1721 #, no-wrap msgid "BIB<.git-check> B|B|B|B" msgstr "" #. type: TP #: ../dgit.1:1723 #, no-wrap msgid "BIB<.git-check-suffix>" msgstr "" #. type: TP #: ../dgit.1:1725 #, no-wrap msgid "BIB<.policy-query-supported-ssh>I< >BI<|>BI<|>B" msgstr "" #. type: TP #: ../dgit.1:1727 #, no-wrap msgid "BIB<.diverts.divert> B|BI" msgstr "" #. type: TP #: ../dgit.1:1729 #, no-wrap msgid "BIB<.git-create>I< >BI<|>B" msgstr "" #. type: TP #: ../dgit.1:1731 #, no-wrap msgid "BIB<.archive-query> B | BI | BI | BIB<@>IB<:>IB< >|B< aptget:>" msgstr "" #. type: TP #: ../dgit.1:1733 #, no-wrap msgid "BIB<.archive-query->(B|B|B)" msgstr "" #. type: TP #: ../dgit.1:1735 #, no-wrap msgid "BIB<.madison-distro>" msgstr "" #. type: TP #: ../dgit.1:1737 #, no-wrap msgid "BIB<.archive-query-default-component>" msgstr "" #. type: TP #: ../dgit.1:1739 #, no-wrap msgid "BIB<.dep14tag> B|B[|B]" msgstr "" #. type: TP #: ../dgit.1:1741 #, no-wrap msgid "BIB<.dep14tag-reuse> B|B|B|B" msgstr "" #. type: Plain text #: ../dgit.1:1744 msgid "BIB<.dep14tag-verify> B|B" msgstr "" #. type: TP #: ../dgit.1:1744 #, no-wrap msgid "BIB<.ssh>" msgstr "" #. type: TP #: ../dgit.1:1746 #, no-wrap msgid "BIB<.sshpsql-dbname>" msgstr "" #. type: TP #: ../dgit.1:1748 #, no-wrap msgid "BIB<.>(B|B)B<->(B|B|B)" msgstr "" #. type: TP #: ../dgit.1:1750 #, no-wrap msgid "BIB<.backports-quirk>" msgstr "" #. type: TP #: ../dgit.1:1752 #, no-wrap msgid "BIB<.rewrite-map-enable>" msgstr "" #. type: TP #: ../dgit.1:1754 #, no-wrap msgid "BIB<.source-only-uploads> B|B|B|B" msgstr "" #. type: TP #: ../dgit.1:1756 #, no-wrap msgid "B" msgstr "" #. type: TP #: ../dgit.1:1758 #, no-wrap msgid "BI" msgstr "" #. type: TP #: ../dgit.1:1760 #, no-wrap msgid "B" msgstr "" #. type: TP #: ../dgit.1:1762 #, no-wrap msgid "B" msgstr "" #. type: TP #: ../dgit.1:1764 #, no-wrap msgid "BI< >BI<|>BI<|>B" msgstr "" #. type: Plain text #: ../dgit.1:1768 msgid "Controls the behaviour of B." msgstr "" #. type: TP #: ../dgit.1:1768 #, no-wrap msgid "B I[B<;>...]" msgstr "" #. type: SH #: ../dgit.1:1770 #, no-wrap msgid "ENVIRONMENT VARIABLES" msgstr "" #. type: TP #: ../dgit.1:1771 #, no-wrap msgid "B, B" msgstr "" #. type: Plain text #: ../dgit.1:1780 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:1780 #, no-wrap msgid "B, B" msgstr "" #. type: Plain text #: ../dgit.1:1784 msgid "" "Default git user.email and user.name for new trees. See B." msgstr "" #. type: TP #: ../dgit.1:1784 #, no-wrap msgid "B, B..., B, B, [B]B, B" msgstr "" #. type: Plain text #: ../dgit.1:1789 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:1789 #, no-wrap msgid "SUPPORT ON OLD DISTRIBUTIONS" msgstr "" #. type: Plain text #: ../dgit.1:1795 msgid "" "We aim to make modern dgit installable and useable on old versions of " "Debian, and on derivatives. One reason this is helpful is that it can be " "necessary to upgrade to handle strange source packages that trigger bugs (in " "dgit or tools that dgit runs)." msgstr "" #. type: Plain text #: ../dgit.1:1803 msgid "" "This version of B is directly installable, and functional (with " "B) all the way back to Debian 10 (buster) and later; " "this is tested in our CI. It is likely to work on many Debian derivatives, " "too." msgstr "" #. type: SH #: ../dgit.1:1803 #, no-wrap msgid "BUGS" msgstr "" #. type: Plain text #: ../dgit.1:1810 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:1816 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:1821 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:1826 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:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: Plain text #: ../dgit.1:1835 msgid "" "B(7), B(7), B(1), B(1), B(1), B(1), B(1), B(1)," msgstr "" #. type: Plain text #: ../dgit.1:1836 msgid "https://browse.dgit.debian.org/" msgstr "" work/po4a/dgit_7.pot0000664000000000000000000006671215016262471011514 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: 2024-04-11 22:39+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: 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:1694 ../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:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:325 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:643 ../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:50 msgid "" "However, it is perfectly fine to have other branches in dgit-repos; the dgit-" "repos repo for the package can even be the same as the `origin' remote, " "although this is not generally the case in Debian." msgstr "" #. type: Plain text #: ../dgit.7:56 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:66 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:78 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:83 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:92 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:95 msgid "" "dgit push-* can operate on any commit which is a descendant of the suite " "tracking branch." msgstr "" #. type: Plain text #: ../dgit.7:106 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:113 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:120 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:120 #, no-wrap msgid "COMBINED SUITES" msgstr "" #. type: Plain text #: ../dgit.7:125 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:127 msgid "IB<,>I..." msgstr "" #. type: Plain text #: ../dgit.7:129 msgid "This facility is available with dgit clone, fetch and pull, only." msgstr "" #. type: Plain text #: ../dgit.7:139 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:142 msgid "" "The package must exist in mainsuite, but need not exist in the subsuites." msgstr "" #. type: Plain text #: ../dgit.7:146 msgid "If a specified subsuite starts with B<-> then mainsuite is prepended." msgstr "" #. type: Plain text #: ../dgit.7:154 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:162 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:167 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:171 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:171 #, no-wrap msgid "LIMITATIONS" msgstr "" #. type: Plain text #: ../dgit.7:184 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:193 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:201 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:212 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:212 #, no-wrap msgid "READ-ONLY DISTROS" msgstr "" #. type: Plain text #: ../dgit.7:216 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:216 #, no-wrap msgid "GITATTRIBUTES" msgstr "" #. type: Plain text #: ../dgit.7:224 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:233 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:242 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:253 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:263 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:263 #, no-wrap msgid "PACKAGE SOURCE FORMATS" msgstr "" #. type: Plain text #: ../dgit.7:268 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:268 #, no-wrap msgid "FILE EXECUTABILITY" msgstr "" #. type: Plain text #: ../dgit.7:275 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:281 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:281 #, no-wrap msgid "FORMAT 3.0 (QUILT)" msgstr "" #. type: Plain text #: ../dgit.7:285 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:292 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:297 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:304 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:307 msgid "" "You can explicitly request that dgit do just this fixup, by running dgit " "quilt-fixup." msgstr "" #. type: Plain text #: ../dgit.7:314 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:315 #, no-wrap msgid "quilt fixup error messages" msgstr "" #. type: Plain text #: ../dgit.7:317 msgid "When dgit's quilt fixup fails, it prints messages like this:" msgstr "" #. type: Plain text #: ../dgit.7:323 #, 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:326 #, 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:328 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:334 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:335 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:340 msgid "" "is another tree object, which is the same as orig but with the patches from " "debian/patches applied." msgstr "" #. type: TP #: ../dgit.7:341 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:344 msgid "is of course your own git HEAD." msgstr "" #. type: TP #: ../dgit.7:345 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: ../dgit.7:354 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:361 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:372 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:391 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:397 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:397 #, no-wrap msgid "SPLIT VIEW AND SPLITTING QUILT MODES" msgstr "" #. type: Plain text #: ../dgit.7:404 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:411 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:417 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:430 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:438 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:442 msgid "" "Split view conversions are cached in the ref dgit-intern/quilt-cache. This " "should not be manipulated directly." msgstr "" #. type: SH #: ../dgit.7:442 #, no-wrap msgid "FILES IN THE ORIG TARBALL BUT NOT IN GIT - AUTOTOOLS ETC." msgstr "" #. type: Plain text #: ../dgit.7:445 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:451 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:457 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:459 msgid "As the maintainer you therefore have the following options:" msgstr "" #. type: TP #: ../dgit.7:459 ../dgit.7:470 ../dgit.7:519 ../dgit.7:527 #, no-wrap msgid "\\(bu" msgstr "" #. type: Plain text #: ../dgit.7:470 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:476 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:482 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:487 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:488 #, no-wrap msgid "FILES IN THE SOURCE PACKAGE BUT NOT IN GIT - DOCS, BINARIES ETC." msgstr "" #. type: Plain text #: ../dgit.7:492 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:502 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:510 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:516 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:519 msgid "" "For the non-maintainer, this can be observed in the following suboptimal " "occurrences:" msgstr "" #. type: Plain text #: ../dgit.7:527 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:534 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:544 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:544 #, no-wrap msgid "PROBLEMS WITH PACKAGE CLEAN TARGETS ETC." msgstr "" #. type: Plain text #: ../dgit.7:552 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:560 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:564 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.pot0000664000000000000000000007330615016262471013251 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: 2025-05-07 19:40+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:6 ../git-debrebase.1.pod:5 ../git-debpush.1.pod:5 #, no-wrap msgid "SYNOPSIS" msgstr "" #. type: =head1 #: ../dgit.1:552 ../git-debrebase.1.pod:473 #, no-wrap msgid "OPTIONS" msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:158 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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: 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 "" "When sharing branches, you should usually share a fast-forwarding branch " "(ie, use C (or C) before pushing." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:27 msgid "" "git-debrebase has a special branch format, so see \"CONVERTING AN EXISTING " "PACKAGE\" in L." msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:30 msgid "GUIDE TO DOCUMENTATION" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:32 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:39 msgid "" "You should read this manpage in conjunction with L, which defines many important terms used here." msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:43 msgid "PRINCIPAL OPERATIONS" msgstr "" #. type: =item #: ../git-debrebase.1.pod:47 msgid "git-debrebase [-- ]" msgstr "" #. type: =item #: ../git-debrebase.1.pod:49 msgid "git-debrebase [-i ]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:51 msgid "" "Unstitches and launders the branch. (See L " "below.)" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:54 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:58 #, no-wrap msgid "" " git rebase \n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:60 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:65 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:71 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:75 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:81 msgid "git-debrebase status" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:83 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:88 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:94 msgid "git-debrebase conclude" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:96 msgid "" "Finishes a git-debrebase session, tidying up the branch and making it fast " "forward again." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:99 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:105 msgid "git-debrebase quick" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:107 msgid "" "Unconditionally launders and restitches the branch, consuming any ffq-prev " "and making a new pseudomerge." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:111 msgid "If the branch is already laundered and stitched, does nothing." msgstr "" #. type: =item #: ../git-debrebase.1.pod:113 msgid "git-debrebase prepush [--prose=]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:115 msgid "If the branch is unstitched, stitches it, consuming ffq-prev." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:119 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:123 msgid "git-debrebase stitch [--prose=]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:125 msgid "Stitches the branch, consuming ffq-prev." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:128 msgid "If there is no ffq-prev, it is an error, unless --noop-ok." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:130 msgid "You should consider using B or B instead." msgstr "" #. type: =item #: ../git-debrebase.1.pod:132 msgid "git-debrebase scrap" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:134 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:138 msgid "If you are in the middle of a git-rebase, will abort that too." msgstr "" #. type: =item #: ../git-debrebase.1.pod:140 msgid "" "git-debrebase new-upstream [...] [--|-i ]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:142 msgid "Rebases the delta queue onto a new upstream version. In detail:" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:145 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:153 msgid "If all seems well, unstitches and launders the branch." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:155 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:163 msgid "Finally, starts a git-rebase of the delta queue onto these new commits." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:167 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:171 msgid "" "If you git-rebase --abort, the whole new upstream operation is aborted, " "except for the laundering." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:175 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:181 msgid "The are, optionally, in order:" msgstr "" #. type: =item #: ../git-debrebase.1.pod:185 msgid "" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:187 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:193 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:198 msgid " " msgstr "" #. type: textblock #: ../git-debrebase.1.pod:200 msgid "Specifies that this is a multi-piece upstream. May be repeated." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:203 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:208 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:215 msgid "" " has a restricted syntax: it may contain only ASCII " "alphanumerics and hyphens." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:218 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:224 msgid "" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:226 msgid "These will be passed to git rebase." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:228 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:234 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:245 msgid "git-debrebase make-patches [--quiet-would-amend]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:247 msgid "" "Generate patches in debian/patches/ representing the changes made to " "upstream files." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:250 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:257 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:266 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:275 msgid "git-debrebase convert-from-unapplied []" msgstr "" #. type: =item #: ../git-debrebase.1.pod:277 msgid "git-debrebase convert-from-gbp []" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:279 msgid "Converts any of the following into a git-debrebase interchange branch:" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:285 msgid "a gbp patches-unapplied branch (but not a gbp pq patch-queue branch)" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:289 msgid "" "a patches-unapplied git packaging branch containing debian/patches, as used " "with quilt" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:294 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:300 msgid "(These two commands operate identically and are simply aliases.)" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:302 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:306 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:314 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:320 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:325 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:328 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:332 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:341 msgid "UNDERLYING AND SUPPLEMENTARY OPERATIONS" msgstr "" #. type: =item #: ../git-debrebase.1.pod:345 msgid "git-debrebase breakwater" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:347 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:351 msgid "git-debrebase anchor" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:353 msgid "Prints the breakwater anchor commitid." msgstr "" #. type: =item #: ../git-debrebase.1.pod:355 msgid "git-debrebase analyse" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:357 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:365 msgid "git-debrebase record-ffq-prev" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:367 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:371 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:375 msgid "git-debrebase convert-to-gbp" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:377 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:382 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:387 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:391 msgid "git-debrebase convert-from-dgit-view [] [upstream]" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:393 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:397 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:402 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:408 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:413 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:418 msgid "" "The available convert-options are as follows. (These must come after " "convert-from-dgit-view.)" msgstr "" #. type: =item #: ../git-debrebase.1.pod:423 msgid "--[no-]diagnose" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:425 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:429 msgid "--build-products-dir" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:431 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:437 msgid "--[no-]origs" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:439 msgid "" "Whether to try to look for or use any orig tarballs. --origs is the default." msgstr "" #. type: =item #: ../git-debrebase.1.pod:442 msgid "--[no-]tags" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:444 msgid "" "Whether to try to look for or use any upstream git tags. --tags is the " "default." msgstr "" #. type: =item #: ../git-debrebase.1.pod:447 msgid "--always-convert-anyway" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:449 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:457 msgid "git-debrebase forget-was-ever-debrebase" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:459 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:465 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:469 msgid "Do not use this if you expect to run git-debrebase on the branch again." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:475 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:487 msgid "-f" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:489 msgid "Turns snag(s) with id into warnings." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:491 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:496 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:501 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:505 msgid "--force" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:507 msgid "Turns all snags into warnings. See the -f option." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:510 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:513 msgid "--noop-ok" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:515 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:519 msgid "" "The specific instances are discussed in the text for the relvant operation." msgstr "" #. type: =item #: ../git-debrebase.1.pod:522 msgid "--anchor=" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:524 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:528 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:538 msgid "--dgit=" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:540 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:544 msgid "-D" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:546 msgid "Requests (more) debugging. May be repeated." msgstr "" #. type: =item #: ../git-debrebase.1.pod:548 msgid "--experimental-merge-resolution" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:550 msgid "No-op option still accepted for compatibilty." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:552 msgid "" "In previous versions this enabled attempting to handle general merges, but " "that attempt is now made unconditonally." msgstr "" #. type: =head1 #: ../git-debrebase.1.pod:557 msgid "UNSTITCHING AND LAUNDERING" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:559 msgid "" "Several operations unstitch and launder the branch first. In detail this " "means:" msgstr "" #. type: =head2 #: ../git-debrebase.1.pod:562 msgid "Establish the current branch's ffq-prev" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:564 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:576 msgid "" "The branch that git would merge from (remote..merge, remote." ".remote);" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:581 msgid "" "The branch git would push to, if different (remote..pushRemote etc.);" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:586 msgid "For local dgit suite branches, the corresponding tracking remote;" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:591 msgid "If you are on C, remotes/dgit/dgit/sid." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:596 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:601 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:607 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:611 msgid "Examine the branch" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:613 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:618 msgid "Rewrite the commits into laundered form" msgstr "" #. type: textblock #: ../git-debrebase.1.pod:620 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:626 msgid "" "This rewrite will always succeed, by construction. The result is the " "laundered branch." msgstr "" #. type: textblock #: ../git-debrebase.1.pod:631 msgid "git-debrebase(5), dgit-maint-debrebase(7), dgit(1), gitglossary(7)" msgstr "" work/po4a/git-debrebase_5.pot0000664000000000000000000010062715016262471013252 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: 2025-03-28 17:38+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 ../tag2upload.5.pod:1 #, no-wrap msgid "NAME" msgstr "" #. type: =head1 #: ../dgit.1:1826 ../dgit.7:23 ../dgit-user.7.pod:463 #: ../dgit-nmu-simple.7.pod:137 ../dgit-maint-native.7.pod:125 #: ../dgit-maint-merge.7.pod:509 ../dgit-maint-gbp.7.pod:139 #: ../dgit-maint-debrebase.7.pod:792 ../dgit-downstream-dsc.7.pod:352 #: ../dgit-sponsorship.7.pod:326 ../dgit-maint-bpo.7.pod:140 #: ../git-debrebase.1.pod:629 ../git-debrebase.5.pod:677 #: ../git-debpush.1.pod:272 ../tag2upload.5.pod:224 #, 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 ../tag2upload.5.pod:5 msgid "INTRODUCTION" msgstr "" #. type: =head1 #: ../dgit-maint-bpo.7.pod:17 ../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 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 avoided because they might generate such merges." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:400 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:405 msgid "" "If a general merge is detected, git-debrebase will treat each side of the " "merge as a git-debrebase interchange branch, and to attempt to resolve them " "into a coherent view. When this attempt succeeds, the output is likely to " "be correct." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:411 msgid "" "If automatic resolution fails, an incomprehensible pile of multidimensional " "merge wreckage will be left in git refs under C. " "You are not likely to be able to resolve this without expert help. If this " "happens, please file a bug, with a formal Steps to Reproduce, including the " "URL for your public repository, the precise git commitid of your current " "branch." msgstr "" #. type: =head1 #: ../git-debrebase.5.pod:419 msgid "LEGAL OPERATIONS" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:421 msgid "" "The following basic operations follow from this model (refer to the diagram " "above):" msgstr "" #. type: =item #: ../git-debrebase.5.pod:426 msgid "Append linear commits" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:428 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:434 msgid "(This may make the branch unlaundered.)" msgstr "" #. type: =item #: ../git-debrebase.5.pod:436 msgid "Launder branch" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:438 msgid "" "Record the previous head in ffq-prev, if we were stitched before (and delete " "debrebase-last)." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:442 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:447 msgid "Drop pseudomerges and any quilt patch additions." msgstr "" #. type: =item #: ../git-debrebase.5.pod:449 msgid "Interactive rebase" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:451 msgid "" "With a laundered branch, one can do an interactive git rebase of the delta " "queue." msgstr "" #. type: =item #: ../git-debrebase.5.pod:454 msgid "New upstream rebase" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:456 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:459 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:465 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:471 msgid "Stitch" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:473 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:482 msgid "Commit quilt patches" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:484 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:492 msgid "ILLEGAL OPERATIONS" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:494 msgid "" "Some git operations are not permitted in this data model. Performing them " "will break git-debrebase." msgstr "" #. type: =item #: ../git-debrebase.5.pod:499 msgid "General merges" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:501 msgid "See L, above." msgstr "" #. type: =item #: ../git-debrebase.5.pod:503 msgid "git-rebase starting too soon, or without base argument" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:505 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:511 msgid "git-rebase without a base argument will often start too early." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:513 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:521 msgid "Editing debian/patches" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:523 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:529 msgid "" "Instead of editing patches, use git-debrebase to edit the corresponding " "commits." msgstr "" #. type: =item #: ../git-debrebase.5.pod:532 msgid "Renaming (etc.) branch while unstitched" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:534 msgid "" "The previous HEAD, which will be pseudomerged over by operations like git-" "debrebase stitch, is recorded in a ref name derived from your branch name." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:539 msgid "" "If you rename unstitched branches, this information can get out of step." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:542 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:549 msgid "COMMIT MESSAGE ANNOTATIONS" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:551 msgid "" "git-debrebase makes annotations in the messages of commits it generates." msgstr "" #. type: textblock #: ../git-debrebase.5.pod:554 msgid "The general form is" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:556 #, no-wrap msgid "" " [git-debrebase COMMIT-TYPE [ ARGS...]: PROSE, MORE PROSE]\n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:558 msgid "" "git-debrebase treats anything after the colon as a comment, paying no " "attention to PROSE." msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:561 #, 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:567 #, 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:572 #, 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:576 #, no-wrap msgid "" " [git-debrebase merged-breakwater: constructed from vanilla merge]\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:578 #, 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:582 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:587 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:591 msgid "APPENDIX - DGIT IMPORT HANDLING" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:593 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:598 msgid "Consider a non-dgit NMU followed by a dgit NMU:" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:600 #, 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:616 #, no-wrap msgid "" " Supplementary key:\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:618 #, 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:625 #, 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:628 #, no-wrap msgid "" " * ** before and after HEAD\n" "\n" msgstr "" #. type: textblock #: ../git-debrebase.5.pod:630 msgid "We want to transform this into:" msgstr "" #. type: =item #: ../git-debrebase.5.pod:634 msgid "I. No new upstream version" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:636 #, 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:652 msgid "II. New upstream" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:654 #, no-wrap msgid "" " (0 + 00 neq #)\n" "\n" msgstr "" #. type: verbatim #: ../git-debrebase.5.pod:656 #, 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:679 msgid "git-debrebase(1), dgit-maint-rebase(7), dgit(1)" msgstr "" work/po4a/install-documents0000775000000000000000000000064015016262471013172 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-documents0000775000000000000000000000174615016262471012507 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 <. However, the tags are plain git tags, with small amounts of additional metadata, so they could be made by other tooling. This document defines the syntax and semantics of the tag. =head1 BASICS A signed git tag is an instruction to the tag2upload service if the tag message contains a line looking like this: [dgit ... please-upload ...] The tag must be signed by an authorised uploader, for the relevant package. The tagged object must be a git commit. Metadata about the intended operation is obtained from both the tag message and the referenced git tree object. =head1 GIT METADATA The git tag's name must be C, where VERSION is in the Debian package version number transformed to be valid for git as specified in DEP-14, and DISTRO is the distribution name (the DEP-14 "vendor", C for Debian). The email address from git's C field (ie, the author of the tag, from git's point of view) will be emailed any error reports. =head1 TAG2UPLOAD IN-TAG METADATA tag2upload reuses a tag metadata format, and some metadata semantics, from dgit. Metadata lines are in the form C<[dgit ...]>. The brackets must be at the start and end of the line. Inside the brackets, after C, are space separated metadata items. Each metadata item is C or C. Keywords start with one of the characters C<- + . = 0-9 a-z>. Items may not contain whitespace. Any metadata line whose first item starts with a double quote C<"> is reserved for future expansion, and the whole line is ignored. The placement and ordering of metadata items is not relevant, unless specified otherwise here. Some metadata items may be repeated. Unknown keywords are ignored. =over =item C Declares that this tag is indeed an instruction to a tag2upload service, to produce and upload a source package based on the commit at which the tag points. The relevant git objects will also be pushed to a canonical server belonging to the targeted distro (in Debian's case, *.dgit.debian.org). =item C C Specifies the name and version of the source package intended to be uploaded, as also appear in the first line of F. Duplicating this information in the tag metadata is necessary to ensure certain security properties. The package and version must correspond to F, or it is an error. =item C Specifies an intended distribution, to which the package is to be uploaded. May be repeated. Each tag2upload instance ignores tags which do not mention that instance's DISTRO. So for a tag to be effective, at least one distro= must be present. (Note that DISTRO also appears in the tag name, so uploading to multiple distros necessarily involves several tags, although they may have the same tag message.) =item C=COMMITID C=TAG Identifies the upstream source code to be used. This corresponds to the "orig" in the source package. The orig tarball will be generated with C, as invoked by C. Both or neither of these must be supplied. TAG must be fetchable from the same repo as the tag2upload tag, and must resolve to COMMITID, which must be an unabbreviated hash. TAG is required in order to ensure that COMMITID is retrievable. This is because most git repository servers only allow fetching tags and branches, not arbitrary commits. If these are omitted, any necessary orig must already be present in the target source package archive. With C quilt modes, this option is mandatory. (This metadata item might be ignored if the git tree specifies a native source package format, or if the targeted archive already contains a suitable orig.) =item C<--quilt=QUILT-MODE> Specifies the git tree format in use, for a C<3.0 (quilt)> source package. The semantics are the same as for the identically-named dgit option. If this option is not specified, the default is C (depending on the distro and configuration). =item C<--deliberately=...> The semantics are the same as for the identically-named dgit option. Unused or unknown deliberately options are ignored. =item C Instructs the tag2upload service that this upload is to be made in "split git view" mode: When converting from git to a source package, and in order to push and upload, it may be necessary to make changes -- both to tree content and to git history. For example, it may be necessary to apply quilt patches, or to make the git branch fast-forwarding from previous history in the targeted suite. C instructs the tag2upload service to make these changes, and push git commits representing these changes to only its canonical target repository. I.e., the suite branch in the canonical target repository may contain additional changes, but these will not be automatically pushed back to a maintainer-owned git repository (eg salsa.debian.org). The git history on the canonical target repository is always descended from the form supplied by the tagger; it can be readily obtained using dgit. Under the current implementation, this metadata item is mandatory, because the service is not capable of doing anything else. =back =head1 IN-TREE METADATA The target suite(s), are obtained from F. =head1 CONTENTS OF THE TREE The tree must be in the form of an unpacked Debian source package. For a non-native source package format, the upstream files must correspond to any upstream commit specified, or the orig already present in the archive -- either patched or unpatched, according to the quilt mode. Mismatches will cause the tag2upload service's processing to fail. =head1 REPLAY Uploading is intended to be an idempotent process. Thus, the tag2upload tag is an instruction to upload I. Old tags, specifying old versions, will be rejected (although replay attempts might generate some error mail to the tagger). =head1 INVOCATION AND QUEUEING Normally, arrangements will be made so that the tag2upload service becomes aware of new git tags, in relevant repositories; for example, by means of webhooks. If this mechanism fails, the tagging user may need to manually provoke the tag2upload service into rescanning the relevant repository. =head1 CREDITS tag2upload was designed by Ian Jackson and Sean Whitton . =head1 SEE ALSO dgit(1), git-debpush(1). work/tests/0000775000000000000000000000000015016262471010076 5ustar work/tests/Makefile0000664000000000000000000000142715016262471011542 0ustar # usage: tests/using-intree make -f tests/Makefile # optionally setting # TESTSCRIPTS='tests/tests/foo tests/tests/bar') # DGIT_TEST_RETRY_COUNT= 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/adhoc0000775000000000000000000000174515016262471011111 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/autopkgtest-virt-null-for-test0000775000000000000000000000402215016262471016067 0ustar #!/bin/bash # Work around #868576 and #1092771 for bookworm. # The bugs are fixed for trixie, and we already don't run the relevant # t2u tests on bullseye & buster due to needing newer python3-pygit2. set -ex export TMPDIR="$DGIT_TEST_TMP/autopkgtest-tmp" test -d "$TMPDIR" || mkdir "$TMPDIR" if ! dpkg --compare-versions \ "$(dpkg-query -f '${Version}' -W autopkgtest)" '<<' 5.47~; then exec autopkgtest-virt-null --retain-tmp "$@" x fi bodge="$TMPDIR/autopkgtest-virt-null-bodged" troot="$DGIT_TEST_TROOT" if ! test -e "$bodge"; then orig="$(type -p autopkgtest-virt-null)" # This patching is morally equivalent to maintaining a local fork of # autopkgtest-virt-null here in the dgit test suite, # with the unusual property that we insist on being able to update # automatically, and fail the test if the patch doesn't apply. # # Other options considered but rejected: # # clone-and-hack autopkgtest-virt-null here and expect that the # VirtSubProc API is stable enough: also unprincipled, and ISTM more # likely to appear to work, but malfunction. # # Put a stunt version of `rm` on the PATH. This would work until # VirtSubProc uses rmtree, and would then silently stop working. # # Even if #1092771 is addressed, we still need to probe for its # availability, and fall back to this patching, until all Debian # releases supported by dgit.dgit#main have the new autopkgtest. cp -- "$orig" "$bodge" patch $bodge <"$troot/autopkgtest-virt-null.bodge.patch" >&2 fi # work around #868576 (which is fixed only in autopkgtest 5.44, in trixie!) perl -we ' my $child = open CHILD, "|-", @ARGV; $child // die $!; open STDOUT, ">&2" or die $!; sub quit () { waitpid $child, 0; die "failed @ARGV $?" if $? && $? != 15; exit 0; } $SIG{CHLD} = \&quit; while () { print CHILD or die $!; flush CHILD or die $!; } $SIG{CHLD} = "DEFAULT"; kill 15, $child; quit(); ' \ "$bodge" ${DGIT_TEST_NDEBUG- -d} "$@" work/tests/autopkgtest-virt-null.bodge.patch0000664000000000000000000000054215016262471016503 0ustar --- /usr/bin/autopkgtest-virt-null 2024-10-25 09:04:32.000000000 +0100 +++ autopkgtest-virt-null 2025-01-11 12:40:19.549365093 +0000 @@ -66,7 +66,7 @@ def hook_cleanup(): global capabilities - VirtSubproc.downtmp_remove() +# VirtSubproc.downtmp_remove() capabilities = [c for c in capabilities if not c.startswith('downtmp-host')] work/tests/drs-git-ext0000775000000000000000000000053315016262471012174 0ustar #!/bin/sh set -e tmp=$DGIT_TEST_TMP echo >&2 '((((((((((((((((((((((((((((((((((((((((' set -x export SSH_ORIGINAL_COMMAND="$*" ${DGIT_REPOS_SERVER_TEST-dgit-repos-server} \ test-dummy $tmp/distro=test-dummy \ "$DGIT_TEST_DRS_AUTH" \ --repos=$tmp/git --suites=$tmp/suites \ --${DGIT_DRS_MODE-ssh} : '))))))))))))))))))))))))))))))))))))))))' work/tests/dsd-ssh0000775000000000000000000000117315016262471011373 0ustar #!/bin/sh set -e set -${DGIT_TEST_NDEBUG-x} : '((((((((((((((((((((((((((((((((((((((((' tmp=$DGIT_TEST_TMP cd / userhost="$1"; shift export SSH_ORIGINAL_COMMAND="$*" # We might be "ssh"ing from the t2u oracle, in which case we want # to go back to your usual set of keyrings and keys. export GNUPGHOME=$tmp/gnupg # 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} ${DGIT_TEST_NDEBUG- -D} $tmp : '))))))))))))))))))))))))))))))))))))))))' work/tests/enumerate-tests0000775000000000000000000000727415016262471013163 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 () { case "$r" in x-dgit-out-of-tree-only) return ;; # Deliberately don't honour suite restrictions in formal autopkgtests. # Test dependencies should handle that as needed. x-dgit-skip-suite,*) return ;; esac 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 ;; T2U) gencontrol-add-deps \ git-debpush autopkgtest python3-pygit2 netcat-openbsd ;; *) gencontrol-add-deps "$dep" ;; esac done } test-done-gencontrol () { stanza=$( add_Depends="$dependencies" \ perl &2 "skipping $t: $whynot" fi } finish-dep-packages () { perl -e ' # include every dependency, but without version $_ = $ARGV[0]; s{\([^()]*\)}{}g; s{\,}{ }g; $y{$_}=1 foreach split /\s+/; printf "%s\n", join " ", sort keys %y or die $!; ' -- "$all_dependencies" } seddery () { local seddery=$1 sed <$tf -n ' 20q; /^: t-enumerate-tests-end$/q; '"$seddery"' ' } allsedderies () { local tf=$1 for r in $(seddery 's/^t-restrict //p'); do restriction-$mode done for deps in $(seddery 's/^t-dependencies //p'); do dependencies-$mode done for import in $(seddery 's/^t-setup-import //p'); do allsedderies tests/setup/$import done if egrep -q '^t-alt-test *$' <$tf; then local leaf=${tf#tests/tests/} allsedderies tests/tests/"${leaf#*-}" fi } : ${TESTSCRIPTS=$(run-parts --list tests/tests)} for t in $TESTSCRIPTS; do test-begin-$mode allsedderies $t test-done-$mode done finish-$mode work/tests/git-srcs/0000775000000000000000000000000015016262471011631 5ustar work/tests/git-srcs/pari-extra_3-1.git.tar0000664000000000000000000007400015016262471015560 0ustar pari-extra.git/0000775000175000017500000000000014164202404012013 5ustar ianianpari-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/info/0000775000175000017500000000000014164202404012746 5ustar ianianpari-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/info/refs0000664000175000017500000000027614164202404013635 0ustar ianianc6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 refs/dgit/sid d7f949a6455f8ce2230bd5df778bdd9faf091bc5 refs/tags/test-dummy/3-1 c6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 refs/tags/test-dummy/3-1^{} pari-extra.git/HEAD0000664000175000017500000000002712242157267012451 0ustar ianianref: refs/heads/master pari-extra.git/description0000664000175000017500000000011112242157267014265 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. pari-extra.git/refs/0000775000175000017500000000000014164202404012752 5ustar ianianpari-extra.git/refs/dgit/0000775000175000017500000000000014164202404013701 5ustar ianianpari-extra.git/refs/heads/0000775000175000017500000000000012242157267014051 5ustar ianianpari-extra.git/refs/tags/0000775000175000017500000000000014164202404013710 5ustar ianianpari-extra.git/refs/tags/debian/0000775000175000017500000000000013515174001015132 5ustar ianianpari-extra.git/refs/original/0000775000175000017500000000000014164202404014556 5ustar ianianpari-extra.git/hooks/0000775000175000017500000000000014725314333013146 5ustar ianianpari-extra.git/objects/0000775000175000017500000000000014164202404013444 5ustar ianianpari-extra.git/objects/info/0000775000175000017500000000000014164202404014377 5ustar ianianpari-extra.git/objects/info/packs0000664000175000017500000000015314164202404015422 0ustar ianianP pack-20ed040fb05ed3747488b3707fb51d0b44bcf061.pack P pack-f78438af55214ab2e04c6baf980f32df0e71ca44.pack pari-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/config0000664000175000017500000000010212242157267013207 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = true pari-extra.git/branches/0000775000175000017500000000000012242157267013613 5ustar ianianwork/tests/git-template.tar0000664000000000000000000007400015016262471013203 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/gitlab-ci-run-all0000775000000000000000000000163515016262471013234 0ustar #!/bin/bash set -e set -o pipefail # Wrapper to run the tests in gitlab CI x () { echo >&2 "+ $*"; "$@"; } deps=" $(tests/enumerate-tests dep-packages) " our_debs=$(find ./debian/output -name '*.deb') our_pkgs=''; for p in $our_debs; do p=${p##*/} p=${p%%_*} our_pkgs+=" $p" deps="${deps// $p / }" done # This timeout is per test case, but becauswe of our gnupg serialisation, # in principle, a test case might end up waiting for ages and ages for # other test cases. Empirically, locally, I have seen very alphabetically # early test cases being the last ones to finish. This is mad. # Anyway, we must therefore set this long for the whole test suite. export DGIT_TEST_RUN_PFX='timeout 2500' x apt-get -y install $our_debs x apt-get -y install --no-install-recommends $deps eatmydata moreutils x apt-get -y build-dep . x apt-get -y remove $our_pkgs x eatmydata tests/using-intree tests/run-all "$@" work/tests/gnupg/0000775000000000000000000000000015016262471011216 5ustar work/tests/gnupg/dd.gpg0000664000000000000000000000226415016262471012310 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.txt0000664000000000000000000026764615016262471012404 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.gpg0000664000000000000000000000744515016262471013375 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+3gF +G@Y}G*$&- dDw|g Ͱ gpg Barbarian Gaul gpg8!R@ |cB +XMgF    M*[S#I͏e_ ^_K'.R1؇i|9 H3>Sn `< gpgwork/tests/gnupg/random_seed0000664000000000000000000000113015016262471013414 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.gpg0000664000000000000000000001653215016262471013356 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/t2uokr.gpg0000664000000000000000000000035115016262471013142 0ustar 3gF +G@Y}G*$&- dDw|g ʹ Barbarian Gaul 8!R@ |cB +XMgF    M*[S#I͏e_ ^_K'.R1؇i|9 H3>Sn `< work/tests/gnupg/trustdb.gpg0000664000000000000000000000264015016262471013406 0ustar gpgR "  ,2C=>9= QF{b3 :72G*u%! vбs 7/`^\dBzf ;? \h;9# A revocation certificate is a kind of "kill switch" to publicly declare that a key shall not anymore be used. It is not possible to retract such a revocation certificate once it has been published. Use it to revoke this key in case of a compromise or loss of the secret key. However, if the secret key is still accessible, it is better to generate a new revocation certificate and give a reason for the revocation. For details see the description of of the gpg command "--generate-revocation" in the GnuPG manual. To avoid an accidental use of this file, a colon has been inserted before the 5 dashes below. Remove this colon with a text editor before importing and publishing this revocation certificate. :-----BEGIN PGP PUBLIC KEY BLOCK----- Comment: This is a revocation certificate iHgEIBYIACAWIQRSQA18Y0KCHA0rWI4Qj5JNj+z4kAUCZ8JGmQIdAAAKCRAQj5JN j+z4kDDKAP4jJuU+DSUEnf3sOhD7i4LOssxrQ0rUVh6Am24jXqvWTgEA98qdHJbU MNkaqYa+qraRc1QXZVZBJWgUX7krAz3K0w8= =FDVl -----END PGP PUBLIC KEY BLOCK----- work/tests/gnupg-t2uo/private-keys-v1.d/0000775000000000000000000000000015016262471015276 5ustar work/tests/gnupg-t2uo/private-keys-v1.d/0CA6D99ED971BADD91DFA089CE7AE5222C104B45.key0000664000000000000000000000034315016262471022565 0ustar Created: 20250228T232822 Key: (private-key (ecc (curve Ed25519)(flags eddsa)(q #409E59C77DC347872AA618D12426CCC72DE404E50A64AC4477B2B4B37C67890ACD#) (d #7D53AC8E96376B0AEB6B616FF4728394F579D70D8DBAF6F585AB71CCEF1B89B5#) )) work/tests/gnupg-t2uo/pubring.kbx0000664000000000000000000000063715016262471014267 0ustar KBXfgFgF^ R@ |cB +XM  gF3gF +G@Y}G*$&- dDw|g Ͱ gpg Barbarian Gaul gpg8!R@ |cB +XMgF    M*[S#I͏e_ ^_K'.R1؇i|9 H3>Sn `< gpgJHꇮf$work/tests/gnupg-t2uo/trustdb.gpg0000664000000000000000000000233015016262471014271 0ustar gpggF  R@ |cB +XMwork/tests/http-static-server0000775000000000000000000000465615016262471013607 0ustar #!/usr/bin/perl -w # # This file is part of the dgit test suite. # # Copyright (C)2004-2015 Best Practical Solutions, LLC # Copyright (C)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. # # # invocation protocol: # # http-static-server >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; print $cgi->start_html('Not found'), $cgi->h1('Not found'), $cgi->end_html if uc $cgi->request_method eq 'GET'; } } 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/lib0000664000000000000000000010616515016262471010600 0ustar # -*- sh -*- exec 2>&1 set -o pipefail . tests/lib-core . tests/lib-restricts t-report-failure () { set +x rc=$1 cat <&2 TEST FAILED (for proximate cause, look earlier in the log for many %) cwd: $PWD funcs: ${FUNCNAME[*]} lines: ${BASH_LINENO[*]} files: ${BASH_SOURCE[*]} END t-save-artifacts exit 16 } trap ' rc=$? set +x redirected_log="$DGIT_TEST_REDIRECTED_LOG" if [ "$redirected_log" ]; then exec 2>&7 >&2 unset DGIT_TEST_REDIRECTED_LOG cat -- "$redirected_log" ||: fi test $rc = 0 || echo " %%%%%%%%%%%%%%%%%%%% EXITING $rc %%%%%%%%%%%%%%%%%%%% Most relevant logs are just before assignment rc=$rc Will now do cleanup etc. " if [ $rc != 0 ] || ! [ "$DGIT_TRAP_QUIET" ]; then set -${DGIT_TEST_NDEBUG-x} ${DGIT_TEST_NDEBUG+ :} pwd fi set +e (cd $tmp && \ grep "" t2u/worker-cwd/w0/dgit-tmp/t2u.log) for pid in $end_kill_pids; do kill -9 $pid; done [ "x$DGIT_TEST_KEEP_MUSTCLEAN" != x ] || \ [ "x$DGIT_TEST_TMP" = x ] || rm -rf $DGIT_TEST_TMP/must-clean set -e case $rc in 0) echo success.;; *) t-report-failure;; esac ' EXIT if [ "$AUTOPKGTEST_ARTIFACTS" ] && ! [ "$DGIT_TEST_REDIRECTED_LOG" ] \ && ! [ "$DGIT_TEST_DIRECT_LOG" ]; then # When running under real autopkgtest, don't spew our megabytes of # logs unconditionally. Redirect them to a file, and print them # only on failure. On success, t-save-artifacts comppresses them. exec 7>&2 export DGIT_TEST_REDIRECTED_LOG="$AUTOPKGTEST_ARTIFACTS"/"${0##*/}.log" exec >"$DGIT_TEST_REDIRECTED_LOG" exec 2>&1 fi # DGIT_TEST_NDEBUG can be used to disable most of the whole test suite's # debugging enablement, whereever there isn't a separate env var for it. # (Note: this ^ is an aspiration; we have have missed some places.) # It must be unset (debugging enabled) or set to '' (debugging disabled). # Other values are not allowed! set -${DGIT_TEST_NDEBUG-x} 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_DRS_DEBUG:=1} export DGIT_DRS_DEBUG : ${DGIT_TEST_DISTRO+ ${distro=${DGIT_TEST_DISTRO}}} : ${DGIT_TEST_SIGNING_KEY_OPTS= -kBCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A } export DGIT_TEST_SIGNING_KEY_OPTS 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 t-tar-x -f "$tarfile" fi } t-tar-x () { tar --no-same-owner -x "$@" } 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; t-tar-x -f $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 local v=${2-$v} 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 # Empirically in a non-autopkgtest run with AUTOPKGTEST_ARTIFACTS # this `-1` flag to gzip decreased the runtime from 585s (2558s CPU) # to 609s (2730s CPU), a decrease of 5-7%. It increased the # total size of the artifacts from 24220k to 26092k, ie +8%, # but in a real autopkgtest run there are many bigger things # alongside AUTOPKGTEST_ARTIFACTS put there by autopkgtest itself. GZIP=-1v tar -C "$tmp" -zc -f "$artifacts/${0##*/}.tar.gz" \ --exclude=\*.tar . local logfile="$DGIT_TEST_REDIRECTED_LOG" if [ "$logfile" ]; then unset DGIT_TEST_REDIRECTED_LOG set +x DGIT_TRAP_QUIET=1 exec >&7 2>&1 gzip -f -- "$logfile" fi } t-rm-dput-dropping () { rm -f $tmp/${p}_${v}_*.upload } 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 - "$@" \ env -u DGIT_TEST_REDIRECTED_LOG \ "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-sponsee-dep14tag-sign () { t-sponsee-dep14tag "$@" -u Hannibal } t-sponsee-dep14tag () { git tag -m 'Sponsee tag' "$@" test-dummy/$v dep14tagref=refs/tags/test-dummy/$v dep14tag=$(t-git-get-ref $dep14tagref) } t-sponsee-dep14tag-check-kept () { t-refs-same-start t-ref-same-val sponsee-tag $dep14tag t-refs-same $dep14tagref (cd $dgitrepo; t-refs-same $dep14tagref) } 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-t2u-native-prep () { t-archive-none example t-git-none t-worktree 1.1 v=1.0-1 cd $p git checkout -B master 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' } 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,t2uokr.gpg} $tmp/. cp $troot/suites $tmp/. cp $troot/suites $tmp/suites-master export DGIT_TEST_DRS_AUTH=$tmp/dd.gpg,a:$tmp/t2uokr.gpg,a:$tmp/dm.gpg,m$tmp/dm.txt 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 $drs_dispatch/outgoing-mail ln -sf $tmp/dd.gpg $drs_dispatch/keyrings/debian-keyring.gpg ln -sf $tmp/dm.gpg $drs_dispatch/keyrings/debian-maintainers.gpg touch $drs_dispatch/keyrings/debian-nonupload.gpg ln -sf $tmp/t2uokr.gpg $drs_dispatch/debian-tag2upload.gpg ln -sf /bin/true $drs_dispatch/policy-hook echo example.org >>$drs_dispatch/preferred-mail-domains } 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-t2u-settings () { export DGIT_DRS_SENDMAIL=$troot/tstunt/sendmail export DGIT_DRS_DGIT=$troot/tstunt/dgit t-chain-test-somehow t2u_fake_https_dir="$tmp/fake_https_dir" t2u_fake_salsa_host=gitlab.test-dummy.example.org t2u_fake_salsa_project_id=20603 cp -r $troot/gnupg-t2uo/. $tmp/gnupg-t2uo } t-t2u-setup-repo () { t2u_fake_salsa_repo="$t2u_fake_https_dir/$t2u_fake_salsa_host/$p.git" mkdir -p -- "$t2u_fake_salsa_repo" (set -e; cd "$t2u_fake_salsa_repo"; git init --bare) git remote add salsa "$t2u_fake_salsa_repo" # git branch --set-upstream-to complains, so git config branch.master.remote salsa git config branch.master.merge refs/heads/master } t-t2u-run-drs () { # This function used to invoke 'dgit-repos-server --tag2upload4' # directly; now it calls upon tag2upload-oracled to do that. # This means that we have integration tests for # tag2upload-oracled's functionality that don't depend upon # tag2upload-service-manager, as tests/tests/t2u-integration does. # # We try to make the use of tag2upload-oracled here as transparent # as possible in the hope that the fact we don't invoke # dgit-repos-server directly doesn't interfere too much with using # tests that call this function to debug dgit-repos-server # independently of tag2upload-oracled. local source=$1; shift local exp_response=$1; shift local version= worker_id= response= msg_rcvd=false ret= # We want to carry on even if we can't find the tag, for # one of the test cases in t2u. git cat-file tag $tagname >../t2u/raw-tag ||: local size="$(wc -c <../t2u/raw-tag)" rm -f "$DGIT_TEST_TMP/sendmail.last" cd ../t2u t2u_oracled_response_scripts=(' echo "t2u-manager-ready" read version test "$version" = "t2u-oracle-version 4" read worker_id worker_fidelity echo ayt read response test "$response" = ack echo "job fake-job '"${t2u_job_package-$p}"' '"$source"'" printf "data-block %d\n" "'"$size"'" cat raw-tag echo data-end read response case "$response" in "message "*) echo "${response:8}" |tee "$DGIT_TEST_TMP"/t2u-message ;; *) fail "expected message, got $response" ;; esac read response printf "%s\n" "$response" >t2u-response ') t-t2u-interact-t2u-oracled --no-restart-workers read response $tmp/mgtf.got git ls-files -z \ --format="%(objectmode) %(objectname) %(path)" \ | cat -vet >$tmp/mgtf.exp diff -u $tmp/mgtf.{exp,got} git cat-file tag test-dummy/$v >$tmp/mgtf.whole-tag-real cat $tmp/tag $tmp/sig >$tmp/mgtf.whole-tag-reconstructed diff -u $tmp/mgtf.whole-tag-{real,reconstructed} for f in ${p}_${v}.dsc ${p}_${v}_source.changes; do f=$tmp/incoming/$f fgrep "Git-Tag-Tagger: dgit test git user" $f local tag=$(t-git-get-ref-exact $dep14tagref) local fp=bcd22cd83243b79d3dfac33ea3dbcbc039b13d8a # ^ Senatus's key, used for all t2u tests t-grep-mpat E:"^Git-Tag-Info: tag=$tag fp=$fp\$" $f done } t-t2u-gittarxz-unpack () { cd $tmp rm -rf t-gittarxz mkdir -p t-gittarxz/.git cd t-gittarxz/.git t-tar-x --strip-components=1 -af $tmp/incoming/$gittarxz cd .. git config --local --bool core.bare false git reset --hard $tagname } t-t2u-gittarxz-reproduced () { # Assert that we have successfully reproduced the dgit view, # in split.t, from the maintainer view, in $tagname. git fetch ../$p refs/heads/split.p:refs/heads/split.p t-output "" git diff --stat split.p split.t cd $tmp/$p } 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-poll-loop () { # t-poll-loop TIMEOUT_MS COMMAND... # COMMAND should call t-poll-done # # In practice COMMAND will probably need to be a bespoke function local poll_timeout=$1; shift local poll_done=false for poll_time in $($troot/poll-loop-schedule $poll_timeout); do sleep $poll_time "$@" if $poll_done; then return; fi done fail "poll timed out (${poll_time}s): $*" } t-poll-done () { poll_done=true } t-template-expect () { local file=$1 cat >"$file.expected" $troot/match-check-template "$file"{.expected,} } 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-baredebian0000664000000000000000000000446615016262471012653 0ustar # -*- sh -*- 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 () { t-tar-x --strip-components=1 -af ../$origbase.tar.* for comp in $xorigcomps; do mkdir $comp cd $comp t-tar-x --strip-components=1 -af ../../$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-modes0000664000000000000000000001566115016262471013002 0ustar # -*- sh -*- 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-core0000664000000000000000000000512515016262471011520 0ustar # -*- sh -*- 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} : ${T2U_ORACLED_TEST:=$DGIT_TEST_INTREE/infra/tag2upload-oracled} : ${DGIT_MGTF_TEST:=$DGIT_TEST_INTREE/mini-git-tag-fsck} export DGIT_TEST DGIT_BADCOMMIT_FIXUP export DGIT_REPOS_SERVER_TEST DGIT_SSH_DISPATCH_TEST export DGIT_MIRROR_SSH_WRAP_TEST DGIT_MGTF_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-mkfifo () { mkfifo -m 600 "$@" } t-sort () { LC_COLLATE=C sort "$@" } t-dontkill-pid () { local pid=$1 end_kill_pids=${end_kill_pids//" $pid "/} } t-kill () { for pid; do t-dontkill-pid $pid kill -9 "$pid" done } t-dgit () { local dgit=${DGIT_TEST-dgit} ${DGIT_TEST_NDEBUG+ :} 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} \ ${DGIT_MGTF_TEST+--mini-git-tag-fsck=}${DGIT_MGTF_TEST} \ --gbp-build:--git-notify=off \ ${distro+${distro:+-d}}${distro--dtest-dummy} \ $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \ $DGIT_TEST_SIGNING_KEY_OPTS $t_dgit_xopts "$@" : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ' } work/tests/lib-gdr0000664000000000000000000001667615016262471011361 0ustar # -*- sh -*- : ${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-chk0000664000000000000000000000406415016262471012646 0ustar # -*- sh -*- 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-mirror0000664000000000000000000000156415016262471012105 0ustar # -*- sh -*- 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-exclude0000664000000000000000000000166215016262471014602 0ustar # -*- sh -*- # 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-reprepro0000664000000000000000000000332315016262471012424 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 <$etcapt/trusted.gpg.d/han.asc } t-archive-none-reprepro () { # hook called by t-archive-none t-reprepro-setup t-reprepro-regen local rrinst= } t-archive-query-reprepro () { # hook called by t-archive-query local suite=$1 local p=$2 local v=$3 local dscf=$4 local rrinst= t-reprepro-includedsc $suite $tmp/mirror/pool/$dscf "$rrinst" } t-reprepro-setup () { local rrinst=$1 local mir=$tmp/${rrinst}mirror local rrc=$mir/conf mkdir -p $rrc mkdir -p $mir/pool/main exec 3>$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-tag2upload-service-manager () { # DGIT_TEST_T2USM_PROGRAM being the command to run for the # tagupload-service-manager. # It can contain spaces: it's run as $DGIT_TEST_T2USM_PROGRAM -c ... # # In principle we could have done this with a formal dependency # on a .deb which isn't in the Debian archive, but this is # a lot simpler and good enough at least for now. if [ "x${DGIT_TEST_T2USM_PROGRAM}" != x ]; then return 0; fi echo 'DGIT_TEST_T2USM_PROGRAM not set' return 1 } t-restriction-x-dgit-unfinished () { echo 'unfinished test, or unfinished feature' return 1 } t-restriction-hint-testsuite-triggers () { : } work/tests/list-t2u-integration-tests0000775000000000000000000000017515016262471015173 0ustar #!/bin/sh set -e candidates=$(run-parts --list tests/tests) grep -l '^t-restrict x-tag2upload-service-manager' $candidates work/tests/match-check-template0000775000000000000000000001173015016262471014006 0ustar #!/usr/bin/perl -w # # usage: # match-check-template TEMPLATE FILE # Checks a text file against a template (a pattern). # # Template data is indented by 4 characters, with control information # in the first two and then two separating spaces. # # Template line syntax # TR PATTERN # where T can be # space - ??? maps to .*, no way to escape ??? # E - PATTERN is a perl regexp fragment # L - PATTERN is a literal string # # - this is a comment line, rest is ignored # and R can be # space ? * + # # For regexp PATTERNs, don't use numbered capture groups: the supplied regexp # will be embedded in a longer regexp including many other PATTERNs. Use # named capture groups, which should be distinct across all PATTERNs. # # If the template doesn't match, prints (to stdout) a report showing # the longest prefix of the template which *does* match, # and which template lines matched which file lines. # # TODO put this in chiark-utils and depend on it instead of including it # (with a transition plan). use strict; use Carp; sub read_file ($) { my ($n) = @_; local $/ = undef; open F, '<', $n or die "$n: $!"; my $r = ; F->error and die $!; close F; return $r; } die unless @ARGV==2 && $ARGV[0] !~ m/^-/; my ($exp_file) = @ARGV; our ($exp, $got) = map { read_file $_ } @ARGV; # This template file syntax is line based; files without trailing newline # can't sensibly be matched. (If we didn't do this here, you could in # theory handle a file without a final newline but the missing newline # would have to be matched against the final line of the template. # Instead, to support missing final newlines, we should have some # bespoke other pattern syntax. sub no_nl_chk ($$) { my ($desc, $data) = @_; return if $data =~ m/\n$/s; die "no newline at end of $desc\n"; } no_nl_chk 'expected', $exp; no_nl_chk 'actual', $got; my $exp_line = 0; my @exp; # $exp[]{Re} regexp for PATTERN (including the newline) # $exp[]{Line} line number in template file # $exp[]{Repeat} R from the input, but '' instead of ' ' foreach (split m{(?<=\n)}, $exp, -1) { $exp_line++; next if m{^\#}; my $e = { Orig => $_ }; # pad (before the newline) with spaces, in case the line is short s{^(.{0,3})(\n?)$}{ sprintf "%-4s%s", $1, $2 }e; s{^(.)(.) }{} or die "$exp_file:$exp_line: missing spaces before pattern data\n"; my ($t, $r) = ($1, $2); $e->{Re} = $t eq ' ' ? join '.*', map { quotemeta $_ } split m/\Q???/, $_, -1 : $t eq 'L' ? quotemeta $_ : $t eq 'E' ? $_ : die "$exp_file:$exp_line: unknown line type ($t)\n"; $r =~ m{^[ ?*+]$} or die "$exp_file:$exp_line: unknown repeat mode ($r)\n"; $r =~ s{ }{}; $e->{Repeat} = $r; $e->{Line} = $exp_line; #use Data::Dumper; #print STDERR Dumper($e); push @exp, $e; } my $exp_whole = join '', map { my $e = $_; my $re = $e->{Re}; qr{$re}.$e->{Repeat} } @exp; #print STDERR ">>>>>$exp_whole<<<<<"; # fast success path exit 0 if $got =~ m{$exp_whole}s; #---- failure reporting ----- sub p { print @_ or die $!; } p "# mismatch! prefix that matches (| = actual output):\n"; # use Data::Dumper; my ($l, $rhs, @cap); # Find the longest prefix that matches. We iterate O(n), rather than # (eg) binary search, for simplicity. If this ever turns out to be too slow # it could be improved. for ($l=@exp; ; $l--) { $exp_whole = '^'; for (my $i=0; $i<$l; $i++) { my $e = $exp[$i]; my $re = $e->{Re}; # Each template line's regexp is wrapped in a named capture group. # That will let us print how the match went. # We use capture groups with these long names to avoid any confusion # if any PATTERN also uses capture groups. $exp_whole .= sprintf "(?<%s>%s)", "template_match_check_$i", qr{$re}.$e->{Repeat}; } # No $ at the end of $exp_whole - we expect to match a prefix of the file. if ($got =~ m{$exp_whole}s) { # Perl scoping rules for $' and $+ mean we must copy things here. $rhs = $'; foreach (my $i=0; $i<$l; $i++) { push @cap, $+{"template_match_check_$i"}; } last; } confess "$exp_whole ?" unless $l > 0; } my $i; for ($i=0; $i<$l; $i++) { my $e = $exp[$i]; p $e->{Orig}; if ($cap[$i] ne '') { # Every pattern which had a nonzero repeat will have a nonempty # match text, since the pattern always ends in \n. my $cap = $cap[$i]; my @l = split m{^}m, $cap, -1; #use Data::Dumper; #print STDERR Dumper($i, $cap, \@l); p "| $_" foreach @l; } else { # But ? and * might repeat 0 times and we should print *something*. p "|(none)\n"; } } print "# mismatch:\n" or die $!; if ($i<@exp) { my $e = $exp[$i]; # use Data::Dumper; # p Dumper($exp_whole, $&, $', $e->{Orig}, $+{"template_match_check_$i"}); p $e->{Orig}; } else { p " (eof)\n"; } if ($rhs) { # $rhs is the whole unmatched suffix of the file my @l = split "\n", $rhs, 2; # trailing newline was guaranteed earlier p "| $l[0]\n"; } else { p "|(eof)\n"; } exit 1; work/tests/maybe-tail-log-of-one-failing-test0000775000000000000000000000123715016262471016377 0ustar #!/bin/bash set -e -o pipefail num_fails=0 for log in tests/tmp/*.log; do case "$log" in tests/tmp/run-all.log) continue;; esac if test -f ${log%.log}.ok; then continue; fi this_lines=$(wc -l <"$log") num_fails=$(( num_fails + 1)) if [ "$best_lines" != "" ] && [ $this_lines -gt $best_lines ]; then continue fi best_lines=$this_lines best_log=$log done if [ "$best_log" = '' ]; then exit 0; fi length_limit=10000 cat <(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.dsc0000664000000000000000000000200315016262471015740 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.xz0000664000000000000000000000243015016262471020511 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.dsc0000664000000000000000000000202315016262471016611 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.xz0000664000000000000000000000415415016262471016672 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.dsc0000664000000000000000000000176715016262471015003 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.xz0000664000000000000000000000242415016262471016371 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.gz0000664000000000000000000000035415016262471016656 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.gz0000664000000000000000000000056515016262471015734 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.gz0000664000000000000000000000062415016262471015731 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.gz0000664000000000000000000000446515016262471015545 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.gz0000664000000000000000000000466615016262471017104 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.dsc0000664000000000000000000000142615016262471016315 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.gz0000664000000000000000000000017115016262471016212 0ustar ;N1 @=^ MD576Z%{)ujswymSG92[HRsvOCyob yY~p'{(work/tests/pkg-srcs/ruby-rails-3.2_3.2.6-1.debian.tar.xz0000664000000000000000000000431415016262471017477 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.dsc0000664000000000000000000000225215016262471015600 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.gz0000664000000000000000000000167115016262471017041 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.xz0000664000000000000000000001143415016262471021470 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.dsc0000664000000000000000000000203015016262471017562 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.gz0000664000000000000000000010440415016262471016604 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-refs0000775000000000000000000000034615016262471013545 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/poll-loop-schedule0000775000000000000000000000271015016262471013533 0ustar #!/usr/bin/perl -w # # Prints out a series of arguments suitable for passing to sleep, # as poll intervals. Helper for t-poll-loop in tests/lib. # # Separate script becauwe (a) shell is very bad at FP arithmetic and # (b) printing the arithmetic in shell debug output wouldn't be nice either. use strict; use IO::Handle; open DEBUG, ">/dev/null" or die $!; while (@ARGV) { last unless $ARGV[0] =~ m/^-/; $_ = shift @ARGV; if ($_ eq '--') { last; } elsif (m/^--debug$/) { open DEBUG, ">&2" or die $!; } else { die "$0: unknown option $_\n"; } } die "$0: need (only) timeout argument" unless @ARGV==1; our ($overall_timeout) = @ARGV; my @output; my $left = 1; # Parameters (fixed) # # These parameters lead to 11 attempts, # with a first interval of 0.0236 T (0.707s with T=30) # and a final one of 0.25 T (7.5s with T=30) # On timeout, we sleep too long by 0.00475 T (0.143s with T=30) # This all seems reasonable. my $sleep = 0.25; my $ratio = 1.3; printf DEBUG "# %10s %10s %12s\n", 'total', 'interval', 'actual'; for (;;) { my $actual_sleep = $sleep * $overall_timeout; printf DEBUG "# %10.7f %10.7f %12.7f\n", $left, $sleep, $actual_sleep; push @output, $actual_sleep; $left -= $sleep; $sleep /= $ratio; last if $left < 0; }; printf DEBUG "# %10.7f %-9d %12.7f\n", $left, 0, $left * $overall_timeout; @output = reverse @output; print "0 @output\n" or die $!; flush STDOUT or die $!; work/tests/pretend-pbuilder0000775000000000000000000000125415016262471013273 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/0000775000000000000000000000000015016262471011236 5ustar work/tests/setup/baredebian0000775000000000000000000000102215016262471013233 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/examplegit0000775000000000000000000000135715016262471013331 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/gbp0000775000000000000000000000147115016262471011737 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-gbp0000775000000000000000000000363415016262471014172 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 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 t-select-package example t-git-next-date ' work/tests/setup/gdr-convert-gbp-noarchive0000775000000000000000000000020115016262471016131 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/gnupg0000775000000000000000000000127415016262471012310 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/ssh0000775000000000000000000000024015016262471010615 0ustar #!/bin/bash set -e cd / # something not writeable, to catch misdirected writes while [[ ${1:0:1} == "-" ]]; do shift; done userhost="$1"; shift exec sh -c "$*" work/tests/ssh-rpush-mitm0000775000000000000000000000240315016262471012723 0ustar #!/usr/bin/perl -w # # This script is used to simulate a misbehaving responder in the rpush # tests. It does two things: # # - strips --package, --expect-suite and --expect-version arguments # out from the arguments passed on to the responder dgit, so that it # can more easily be made to disagree with the initiator about what # the package name, version and target suite should be (this is not # relied upon by the current tests, but may be useful for new ones) # # - rewrites the nth instance of a given deb822 field found in the # responder's responses, reversing the value (so as to keep the same # number of bytes in the data-block). # # As we control the input, specifying where to perform the MITM by # counting instances of a particular deb822 field is sufficiently # robust for our testing purposes. # # Usage: # # DGIT_SSH="$troot/ssh-rpush-mitm FIELD N" t-dgit ... # use IPC::Open2; ($|, $i) = (1, 0); ($f, $n, undef, @args) = @ARGV; # Support only '--foo=bar' calling convention, not, e.g., '--foo bar'. s/\b--(?:package|expect-(?:suite|version))=\S+\s*// for @args; $pat = qr/^\Q$f\E: (.+)$/; open2($out, "<&STDIN", "@args"); while (<$out>) { if (/$pat/ && ++$i == $n) { printf "%s: %s\n", $f, scalar reverse $1; } else { print; } } work/tests/suites0000664000000000000000000000000415016262471011327 0ustar sid work/tests/t2u-fake-manager0000775000000000000000000000357515016262471013064 0ustar #!/usr/bin/perl -w # # Usage: .../t2u-fake-manager SOCKET RSCRIPT [RSCIRPT...] --- ORACLED... # # Listens on SOCKET, and then runs ORACLED... # Each successive worker from the oracle will be handled # by the next RSCRIPT (invoked as `bash -xec RSCRIPT`). # After that, the oracled is killed. use strict; use IO::Socket::UNIX; use POSIX; my $self = $0; $self =~ s{.*/}{}; our ($socket_path, @response_scripts); $socket_path = shift @ARGV; for (;;) { $_ = shift @ARGV // die 'missing ---'; last if $_ eq '---'; push @response_scripts, $_; } print STDERR "$self [$$] setting up on $socket_path\n"; my $listener = IO::Socket::UNIX->new( Type => SOCK_STREAM(), Local => $socket_path, Listen => 1, ) or die $!; print STDERR "$self [$$] forking oracled\n"; my $oracled = fork // die $!; if (!$oracled) { exec @ARGV or die "exec $ARGV[0] $!"; } $SIG{CHLD} = sub { my $pid = waitpid $oracled, WNOHANG; if ($pid == $oracled) { die "oracled died $?"; } }; print STDERR sprintf "%s [%s] listening, %d script(s)\n", $self, $$, scalar @response_scripts; my $i = 0; foreach my $response_script (@response_scripts) { $i++; print STDERR "$self [$$] #$i accepting\n"; my $conn = $listener->accept() or die $!; print STDERR "$self [$$] #$i connected, running bash -xec\n"; open STDIN, "<&", $conn or die $!; open STDOUT, ">&", $conn or die $!; $!=0; $?=0; my $r = system 'bash', '-xec', $response_script; die "$self: response script died: $r $? $!\n" if $r; print STDERR "$self [$$] #$i response script complete\n"; } print STDERR "$self [$$] script(s) complete, terminating oracled\n"; $SIG{CHLD} = 'DEFAULT'; kill 15, $oracled or die "kill oracled: $!"; my $pid = waitpid $oracled, 0; die "$pid != $oracled, $!" unless $pid == $oracled; die "oracled failed: $?" if $?; print STDERR "$self [$$] all complete, oracled terminated ok\n"; exit 0; work/tests/tartree-edit0000775000000000000000000001120015016262471012407 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/0000775000000000000000000000000015016262471011240 5ustar work/tests/tests/absurd-gitapply0000775000000000000000000000034715016262471014301 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-dgit0000775000000000000000000000225315016262471014425 0ustar #!/bin/bash set -e . tests/lib t-setup-import examplegit t-setup-import http-git-check : '---------- test making dgit-based NMU ----------' 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 # combine the histories to make something coherent for the next bit cd ../$p git fetch ../$p.2 dgit/sid git checkout FETCH_HEAD . git commit -m 'Import changes made by dgit user' : '---------- test --collab-non-dgit ----------' t-commit '2nd non-dgit upload, by putative non-dgit-using maintainer' t-non-dgit-upload t-commit 'dgit collab-non-dgit upload' t-expect-fail E:'HEAD is not a descendant of the archive' \ t-dgit -wgf push-source t-refs-same-start t-ref-head t-dgit -wgf push-source --collab-non-dgit t-ref-head # pseudomerge on dgit view only, HEAD wasn't changed t-refs-same-start suite=sid t-pushed-good-core # dgit/dgit/sid is ahead of HEAD t-has-parent-or-is dgit/dgit/sid HEAD test "$(git log --pretty=oneline HEAD..dgit/dgit/sid)" # but trees are the same git diff --exit-code --stat HEAD dgit/dgit/sid t-ok work/tests/tests/baredebian-multitar0000775000000000000000000000146315016262471015105 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-plusgit0000775000000000000000000000032415016262471014726 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-push0000775000000000000000000000023515016262471014217 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-tarball0000775000000000000000000000055315016262471014664 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-modes0000775000000000000000000000055715016262471013401 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-gbp0000775000000000000000000000132715016262471014143 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-long0000775000000000000000000000105415016262471014327 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-sbuild0000775000000000000000000000046115016262471014653 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-source0000775000000000000000000000033115016262471014665 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/checkout0000775000000000000000000000173115016262471012775 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/cmd-override0000775000000000000000000000310415016262471013544 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-setup-import gdr-convert-gbp false_program=$(type -Pp false) ln -s -- "$false_program" false2 cd example t-expect-fail E:'^dgit: failed command: false --no-source-only-changes ' \ t-dgit --quilt=nofix \ --sbuild=false \ --sbuild!:--no-source \ sbuild t-expect-fail E:'^dgit: failed command: false 88 -d unstable ' \ t-dgit --quilt=nofix \ -cdgit-distro.test-dummy.opts-sbuild=88 \ --sbuild=false \ --sbuild!:--no-source \ --sbuild!:--no-source-only-changes \ sbuild t-expect-fail \ E:'^dgit: failed command: false no-such-host '\''spoons --stuff ' \ t-dgit --ssh=false --dgit=spoons --dgit:--stuff rpush-source no-such-host:$tmp t-expect-fail E:'^dgit: failed command: false .* -I\.git 77 -b ' \ t-dgit \ -cdgit-distro.test-dummy.cmd-dpkg-source=false \ -cdgit-distro.test-dummy.opts-dpkg-source=77 \ build # ---- tests that try to invoke git-debrebase ---- unset DGIT_GITDEBREBASE_TEST # ^ this stops t-dgit adding a --git-debrebase=... argument t-expect-fail E:'^dgit: failed command: false 12 99 --noop-ok ' \ t-dgit \ -cdgit-distro.test-dummy.opts-git-debrebase=12 \ -cdgit-distro.test-dummy.cmd-git-debrebase=false \ --git-debrebase:99 \ quilt-fixup t-expect-fail E:'^dgit: failed command: false 42 66 --noop-ok ' \ t-dgit \ -cdgit-distro.test-dummy.opts-git-debrebase=42 \ -cdgit-distro.test-dummy.cmd-git-debrebase=$tmp/false2 \ --git-debrebase=false \ --git-debrebase:66 \ quilt-fixup # ---- don't add new tests here: `unset DGIT_GITDEBREBASE_TEST` above ---- t-ok work/tests/tests/debpolicy-dbretry0000775000000000000000000000246715016262471014622 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 t-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 poll1-taint-tainted () { if grep $taint $taintsout; then t-poll-done; fi } t-poll-loop 10 poll1-taint-tainted 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-newreject0000775000000000000000000000667715016262471015144 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-gbp0000775000000000000000000000005215016262471015037 0ustar #!/bin/bash set -e . tests/lib t-alt-test work/tests/tests/debpolicy-taintrm0000775000000000000000000000246115016262471014617 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-drs0000775000000000000000000000053615016262471015611 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-mirror0000775000000000000000000000007715016262471014465 0ustar #!/bin/bash set -e . tests/lib t-dependencies rsync t-alt-test work/tests/tests/defdistro-rpush0000775000000000000000000000005215016262471014305 0ustar #!/bin/bash set -e . tests/lib t-alt-test work/tests/tests/defdistro-setup0000775000000000000000000000040215016262471014303 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-reject0000775000000000000000000000274715016262471015326 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-gitless0000775000000000000000000000361415016262471015025 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-correct0000775000000000000000000000174215016262471016366 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-docs0000775000000000000000000000162615016262471015656 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-nogit0000775000000000000000000000005215016262471014167 0ustar #!/bin/bash set -e . tests/lib t-alt-test work/tests/tests/drs-push-masterupdate0000775000000000000000000000157415016262471015436 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-rejects0000775000000000000000000001165315016262471014376 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] [dgit distro=test-dummy]" 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 ] && egrep 'fatal: corrupt tag|error: object fails fsck: missing.*Entry: invalid format' 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 set +e badcommit=$( set -e LC_MESSAGES=C t-make-badcommit 2>badcommit.err echo "$badcommit" ) rc=$? set -e if [ $rc = 0 ]; then git checkout -b broken $badcommit prep unstable sid mktag mustfail "corrupted object $badcommit" $push_spec elif [ $rc = 128 ] && egrep 'error: object fails fsck: missingCommitter: invalid format' badcommit.err; then :; else cat badcommit.err fail "could not bad commit" fi 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-drs0000775000000000000000000000035415016262471013626 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-nogit0000775000000000000000000000005215016262471014151 0ustar #!/bin/bash set -e . tests/lib t-alt-test work/tests/tests/dsd-divert0000775000000000000000000000020415016262471013227 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-localgitonly0000775000000000000000000000054015016262471014754 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-notlast0000775000000000000000000000025015016262471015403 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-linear0000775000000000000000000000142115016262471014606 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-overwrite0000775000000000000000000000113715016262471015366 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-http0000775000000000000000000000064015016262471014642 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-orig0000775000000000000000000000153415016262471012677 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-notify=off --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-nmu0000775000000000000000000000167015016262471014166 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-dgit0000775000000000000000000000131615016262471015110 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-edits0000775000000000000000000000153415016262471013053 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-fresh0000775000000000000000000000143215016262471013047 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-dgit0000775000000000000000000000212415016262471014176 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-dgitview0000775000000000000000000000223115016262471015070 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-nostitch0000775000000000000000000000114415016262471015103 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 --trust-changelog will be needed' ../convert-msg >/dev/null t-ok work/tests/tests/gdr-makepatches70000775000000000000000000000163115016262471014315 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-merge0000775000000000000000000000177415016262471013050 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 : ----- 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-conflicts0000775000000000000000000000505015016262471015021 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 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-experimental 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-newupstream0000775000000000000000000000420415016262471014312 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-subcommands0000775000000000000000000001304115016262471014252 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-unprocessable0000775000000000000000000000156415016262471014613 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 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-hints0000775000000000000000000000141015016262471015724 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-viagit0000775000000000000000000000144115016262471013223 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/gitattributes0000775000000000000000000001207615016262471014066 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.required 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/gitconfig0000775000000000000000000000210715016262471013137 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 # Test that we pass -c options in a way that git accepts. t-dgit -cdgit.default.clean-mode=git clean # Test that we didn't just omit them. t-expect-fail \ 'dgit: failed command: x-crash-args -c dgit.default.clean-mode=git clean -xdf' \ t-dgit -cdgit.default.clean-mode=git --git=x-crash-args clean t-ok work/tests/tests/gitworktree0000775000000000000000000000061415016262471013535 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-triggers0000775000000000000000000000030215016262471015776 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-messages0000775000000000000000000000222715016262471013555 0ustar #!/bin/bash set -e autoimport= . tests/lib t-dependencies NO-DGIT GDR locales-all 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) expect_fail_lcmessages=C.UTF-8 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-uptodate0000775000000000000000000000015015016262471014425 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-dsc0000775000000000000000000000414115016262471013247 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-linkorigs0000775000000000000000000000217015016262471014477 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-maintmangle0000775000000000000000000000123115016262471014767 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-native0000775000000000000000000000210315016262471013760 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-nonnative0000775000000000000000000000050115016262471014473 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-pushold0000775000000000000000000000115315016262471014154 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-r1clog0000775000000000000000000000401315016262471013663 0ustar #!/bin/bash set -e . tests/lib p=sunxi-tools v_upstr=1.2 v_base=$v_upstr-2 v_input=$v_base.~~dgittest dpkg-source -x $troot/pkg-srcs/${p}_${v_input}.dsc unmang mkdir $p cd $p git init cd .. perl-i-clog () { perl -i "$@" debian/changelog } mangle-start () { mang=$1 v="$v_base.$mang" cp -al unmang $mang cd $mang perl-i-clog -pe 's{\~\~dgittest}{'$mang'} if $.==1' cat >>debian/changelog <<'END' sunxi-tools (1.0-1) unstable; urgency=medium * Lies for dgit testing -- Example Sat, 12 Jul 2011 20:51:56 +0100 END } mangle-import () { rm -f debian/*~ dpkg-source -b . cd ../$p t-dgit import-dsc ../${p}_${v}.dsc $mang git checkout $mang } mangle-done () { cd .. } mangle-start good mangle-import : ---------- 'check that if all is well we make right author line' ---------- perl -ne ../headlines-exp ch=$(git log -P --grep '^\[dgit import orig ' --pretty='format:%H') git cat-file commit $ch | perl -ne 'next if m/^$/..0; print if m/^(?:author|committer) /' \ >../headlines-got-orig diff ../headlines-exp ../headlines-got-orig mangle-done : ---------- 'test missing finalisation data in -1' ---------- mangle-start missingdate perl-i-clog -pe '$_="" if m{^ -- .* Sat, 12 Jul 2014 20:51:56}' mangle-import mangle-done : ---------- 'test garbage before -1' ---------- mangle-start garbage perl-i-clog -ne '$_ = "GARBAGE\n" if (m{^\S} && $. != 1) .. 0; print;' mangle-import mangle-done : ---------- 'test malformed authline' ---------- mangle-start bademail # This causes the output syntax check in clogp_authline to trip; # (that's the one which is intended to stop us feeding bad data to git). perl-i-clog -pe ' next unless m{^ -- .* Sat, 12 Jul 2014 20:51:56.*}; s{^([^<]+) }{ -- cause }; ' mangle-import mangle-done work/tests/tests/import-tarbomb0000775000000000000000000000143615016262471014130 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/inarchivecopy0000775000000000000000000000256015016262471014034 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-format0000775000000000000000000000244015016262471014247 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' 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/mini-git-tag-fsck-utils0000775000000000000000000000701315016262471015537 0ustar #!/bin/bash set -e . tests/lib # Base Python in buster is too old. t-restrict x-dgit-skip-suite,buster t-dependencies python3 python3 <<'ENDPY' import os try: script = os.environ["DGIT_MGTF_TEST"] except KeyError: script = "/usr/bin/mini-git-tag-fsck" code = compile(open(script).read(), script, "exec") __name__ = "mini-git-tag-fsck" exec(code, globals(), None) # ---- iter_peel_bytes ---- # Pulling exactly nbytes first try. (bytes, rest) = iter_peel_bytes(3, iter([b"abc", b"def"])) assert bytes == b"abc", "pulls exactly 3 bytes first try" assert list(rest) == [b"def"] # Pulling exactly nbytes after three tries. (bytes, rest) = iter_peel_bytes(3, iter([b"a", b"b", b"c", b"def"])) assert bytes == b"abc", "pulls exactly three bytes after 3 tries" assert list(rest) == [b"def"] # Pulling >nbytes first try. (bytes, rest) = iter_peel_bytes(2, iter([b"abc", b"def"])) assert bytes == b"ab", "pulls two bytes" assert list(rest) == [b"c", b"def"], "pushes back one byte" # Pulling >nbytes after two tries. (bytes, rest) = iter_peel_bytes(4, iter([b"abc", b"def", b"ghi"])) assert bytes == b"abcd", "pulls four bytes" assert list(rest) == [b"ef", b"ghi"], "pushes back two bytes" # Not enough bytes. try: iter_peel_bytes(3, iter([b"a", b"b"])) except StopIteration: pass else: assert False, "exception raised" # No bytes at all. try: iter_peel_bytes(1, iter([])) except StopIteration: pass else: assert False, "exception raised" # ---- iter_peel_field ---- # Pulling exactly a field first try. (bytes, rest) = iter_peel_field(iter([b"abc\0", b"def"])) assert bytes == b"abc", "pulls field first try" assert list(rest) == [b"def"], "leaves one bytestring after 1 try" # Pulling exactly a zero-length field first try. (bytes, rest) = iter_peel_field(iter([b"\0", b"def"])) assert bytes == b"", "pulls zero-length field first try" assert list(rest) == [b"def"], "leaves one bytestring after 1 try" # Pulling exactly a field after three tries. (bytes, rest) = iter_peel_field(iter([b"a", b"b", b"c\0", b"def"])) assert bytes == b"abc", "pulls field after three tries" assert list(rest) == [b"def"], "leaves one bytestring after 3 tries" # Pulling exactly zero-length field after three tries. (bytes, rest) = iter_peel_field(iter([b"", b"", b"\0", b"def"])) assert bytes == b"", "pulls zero-length field after three tries" assert list(rest) == [b"def"], "leaves one bytestring after 3 tries" # Pulling more than a field first try. (bytes, rest) = iter_peel_field(iter([b"abc\0de", b"fgh"])) assert bytes == b"abc", "pulls field of three bytes" assert list(rest) == [b"de", b"fgh"], "pushes back two bytes" # Pulling more than a field after two tries. (bytes, rest) = iter_peel_field(iter([b"abc", b"d\0ef", b"ghi"])) assert bytes == b"abcd", "pulls four bytes" assert list(rest) == [b"ef", b"ghi"], "pushes back two bytes" # Properly handles two adjacent field separators. (bytes1, rest) = iter_peel_field(iter([b"ab\0\0", b"def"])) (bytes2, rest) = iter_peel_field(rest) assert bytes1 == b"ab", "pulls two bytes ..." assert bytes2 == b"", "... then zero bytes" assert list(rest) == [b"def"], "leaves three bytes" # Unterminated field at end of stream. (bytes, rest) = iter_peel_field(iter([b"abc", b"def"])) assert bytes == b"abcdef", "pulls six bytes" assert list(rest) == [], "leave no bytes" # No bytes at all. (Ths code couldn't treat this as an unterminated, # zero-length field because then the caller could never get EOF.) try: iter_peel_field(iter([])) except StopIteration: pass else: assert False, "exception raised" ENDPY work/tests/tests/mirror0000775000000000000000000000235115016262471012501 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 t-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>&- poll1-lock-removed () { if ! test -f $queuedir/$p.lock; then t-poll-done; fi } t-poll-loop 10 poll1-lock-removed t-check-mirrored t-ok work/tests/tests/mirror-debnewgit0000775000000000000000000000041415016262471014445 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-private0000775000000000000000000000053615016262471014154 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-contents0000775000000000000000000000055315016262471015161 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-dscchanges0000775000000000000000000000101215016262471015415 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/multisuite0000775000000000000000000000175015016262471013375 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-exclude0000775000000000000000000000047115016262471015200 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-chkquery0000775000000000000000000000137315016262471017033 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-chkclog0000775000000000000000000000206615016262471014630 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 --trust-changelog 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 --trust-changelog 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 --trust-changelog stable git revert --no-edit 'HEAD^{/Break changelog}' t-dgit push-built --overwrite stable t-ok work/tests/tests/overwrite-junk0000775000000000000000000000052615016262471014164 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-splitbrains0000775000000000000000000000064515016262471015551 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 --trust-changelog 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 --trust-changelog push-built t-gbp-pushed-good t-ok work/tests/tests/overwrite-version0000775000000000000000000000042215016262471014675 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-build0000775000000000000000000000027615016262471013663 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/pbuilder0000775000000000000000000000243215016262471012775 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-compat0000775000000000000000000000214015016262471014305 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-buildproductsdir0000775000000000000000000000076515016262471015535 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-delayed0000775000000000000000000000054215016262471013553 0ustar #!/bin/bash set -e . tests/lib t-tstunt-parsechangelog t-buildproductsdir-config t-prep-newpackage example 1.0 cd $p t-refs-same-start t-ref-head mkdir $tmp/incoming/DELAYED{,/7-day} t-dgit push-source --delayed=7 --new dcmd mv $tmp/incoming/DELAYED/7-day/${p}_${v}_source.changes $tmp/incoming/ t-pushed-good master t-push-was-source-only t-ok work/tests/tests/push-extra-fields0000775000000000000000000000114215016262471014530 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 t-expect-fail "dsc already contains field Standards-Version" \ t-dgit push-source --new --dsc-control-add=Standards-Version=who-cares t-expect-fail "changes already contains field Urgency" \ t-dgit push-source --new --ch-control-add=Urgency=apocalyptic t-dgit push-source --new \ --dsc-control-add=foo-bar=baz --ch-control-add=bar-baz=quux t-pushed-good master t-grep-mpat E:'^Foo-Bar: baz$' ../${p}_${v}.dsc t-grep-mpat E:'^Bar-Baz: quux$' ../${p}_${v}_source.changes t-ok work/tests/tests/push-newpackage0000775000000000000000000000066015016262471014252 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-newrepeat0000775000000000000000000000063715016262471014143 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-nextdgit0000775000000000000000000000043715016262471013775 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-source0000775000000000000000000000117315016262471013445 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 # If dep14tag already exists (eg, sponsorship) v=1.1 t-dch-commit -v $v -m sponsor t-dch-commit-r t-sponsee-dep14tag t-expect-fail E:'existing DEP-14 tag.*unsuitable.*verification failed' \ t-dgit push --dep14tag-verify t-sponsee-dep14tag-sign -f t-refs-same-start t-ref-head t-dgit push --dep14tag-verify t-pushed-good master t-sponsee-dep14tag-check-kept t-ok work/tests/tests/push-source-with-changes0000775000000000000000000000164215016262471016025 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 sed -i 's/Architecture: source/Architecture: all/' ../${p}_1.0_source.changes t-expect-push-fail "purportedly source-only changes has Architecture: all" \ t-dgit -C ../${p}_1.0_source.changes push-source --new 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/quilt0000775000000000000000000000374115016262471012331 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-colour0000775000000000000000000000036615016262471013632 0ustar #!/bin/bash set -e . tests/lib t-archive ruby-rails-3.2 3.2.6-1 t-git-none t-dgit clone $p cd $p echo 'added line' >>metadata.yml git add metadata.yml git commit -m metadata git config --global color.ui always t-dgit -wgf build-source t-ok work/tests/tests/quilt-gbp0000775000000000000000000000353215016262471013075 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-modes0000775000000000000000000000027115016262471015274 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-sbuild0000775000000000000000000000026315016262471016555 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-binaries0000775000000000000000000000432515016262471015543 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 t-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-singlepatch0000775000000000000000000000143715016262471014630 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='' maint_view_tag=$( git cat-file tag archive/test-dummy/$v | \ perl -ne 'print $1 if m{^\[dgit.* split-maint-view-tag=(\w+)(?:\s.*)?\]$}' ) git cat-file tag $maint_view_tag 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-useremail0000775000000000000000000000056315016262471014314 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/rpush0000775000000000000000000000153315016262471012331 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 r-build:$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-quilt0000775000000000000000000000045315016262471013465 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 r-build:$tmp/$p cd $tmp/$p t-gbp-pushed-good t-ok work/tests/tests/rpush-source0000775000000000000000000000414515016262471013631 0ustar #!/bin/bash set -e . tests/lib t-archive pari-extra 3-1 t-git pari-extra 3-1 rp=$(echo $p | rev) t-dgit clone $p cd $p t-cloned-fetched-good v=3-2~dummy1 t-apply-diff 3-1 $v debcommit -a rv=$(echo $v | rev) s=unstable rs=$(echo $s | rev) t-refs-same-start t-ref-head t-dgit-rpush-source-mitm () { field="$1"; nth="$2"; shift 2 DGIT_SSH="$troot/ssh-rpush-mitm $field $nth" \ t-dgit "$@" rpush-source r-build:$tmp/$p } mkdir $tmp/empty cd $tmp/empty : ' (1) Check we die if the parsed changelog the responder presents has values that are not what the initiator expects. ' t-expect-fail "changelog field \`Source' is not expected \`$p'" \ t-dgit-rpush-source-mitm Source 1 --package=$p t-expect-fail "changelog field \`Distribution' is not expected \`$s'" \ t-dgit-rpush-source-mitm Distribution 1 --expect-suite=unstable t-expect-fail "changelog field \`Version' is not expected \`$v'" \ t-dgit-rpush-source-mitm Version 1 --expect-version=$v : ' (2) Now consider an rpush responder that sent us a parsed changelog we were expecting but then wants us to sign a .changes or .dsc with different values. ' t-expect-fail "changes field \`Source' is not expected \`$p'" \ t-dgit-rpush-source-mitm Source 3 --package=$p t-expect-fail "changes field \`Distribution' is not expected \`$s'" \ t-dgit-rpush-source-mitm Distribution 2 --expect-suite=unstable t-expect-fail "changes field \`Version' is not expected \`$v'" \ t-dgit-rpush-source-mitm Version 3 --expect-version=$v t-expect-fail "is for $rp $v but debian/changelog is for $p $v" \ t-dgit-rpush-source-mitm Source 2 --package=$p t-expect-fail "is for $p $rv but debian/changelog is for $p $v" \ t-dgit-rpush-source-mitm Version 2 --expect-version=$v : ' (3) A non-broken push that should succeed. ' t-dgit "$@" --ssh=$troot/ssh rpush-source r-build:$tmp/$p cd $tmp/$p t-pushed-good dgit/sid : ' (4) A non-broken push with sponshorthip ' v=3-3 t-dch-commit -v $v -m sponsor t-dch-commit-r t-sponsee-dep14tag t-refs-same-start t-dgit "$@" --ssh=$troot/ssh rpush-source r-build:$tmp/$p t-pushed-good dgit/sid t-sponsee-dep14tag-check-kept t-ok work/tests/tests/sbuild-gitish0000775000000000000000000000131215016262471013732 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/sourceonlypolicy0000775000000000000000000000131315016262471014606 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/spelling0000775000000000000000000000021015016262471012774 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/t2u0000775000000000000000000001576315016262471011714 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-skip-suite,bullseye t-restrict x-dgit-skip-suite,buster t-dependencies T2U DEBORIG mpack t-t2u-settings t-debpolicy export DGIT_TEST_MUNPACK=munpack 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-t2u-setup-repo 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-t2u-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-t2u-test --quilt=gbp --upstream=$upstreamtag t-expect-fail "upstream tag $upstreamtag is not an ancestor of refs/heads/master" \ t-t2u-test --quilt=gbp --force=changed-suite --force=no-such-force-option --upstream=$upstreamtag t-t2u-test --quilt=gbp --force=changed-suite --force=no-such-force-option-1 \ --force=upstream-nonancestor,no-such-force-option-2 \ --upstream=$upstreamtag t-t2u-succeeded t-pushed-good master t-sponsee-dep14tag-check-kept ident=ok mv-ident () { local f=$tmp/$1 if test -e $f; then mv $f $f--$ident fi } next-mangle () { # In case the test case doesn't send mail, when it should do, # prevent it from grepping this test cases' sent email. mv-ident sendmail.last mv-ident t2u-message ident=$1 } with-mangled () { local perl=$1; shift perl <../basetag >../badtag-$ident -pe "$perl" git tag -u Senatus -f -s -m "$(cat ../badtag-$ident)" "$tagname" t-t2u-run-drs $tmp/$p "$@" } expect-quit () { next-mangle "$1" local perl=$2 local mregexp=$3 with-mangled "$perl" irrecoverable egrep -e "$mregexp" $tmp/t2u-message } expect-email () { next-mangle "$1" local perl=$2 local mregexp=$3 with-mangled "$perl" irrecoverable "$mregexp" } raw-mangled () { local tagobj tagobj=$(git hash-object -w -t tag ../tagobj-$ident) git update-ref refs/tags/$tagname "$tagobj" t-t2u-run-drs $tmp/$p "$@" } next-mangle timeout # It's important that we arrange the deliberate hang to happen before # the d-r-s processing child touches gnupg, because our gnupg serialisation # might result in nearly-arbitrary delays. The git fetch fits that bill. t-tstunt git-remote-t-sleep t2u_oracled_args=(--processing-timeout=10) t-t2u-run-drs t-sleep::20 irrecoverable \ 'tag2upload processing interrupted by timeout' # Because of the gnupg serialisation (and just to avoid fragility), # most tests have no timeout. Restore that default. t2u_oracled_args=() 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 tagname=test-dummy/1.2 t-expect-fail "couldn't find tag name" \ t-t2u-run-drs $tmp/$p NO-RESPONSE tagname=splorf/$v ; expect-quit baddistro '' 'tag .* not for this distro' tagname=test-dummy/1,2; expect-quit badver '' 'tag .* bad version' tagname=test-dummy/$v expect-email noplease s/please-upload/plunk/ 'tag missing "please-upload"' expect-email nosource "s/ source=$p//" 'missing source=' expect-email vermatch 's/ version=/$&3/' 'rejected: tag has version mismatch' expect-email unkinfo 's/^\[dgit please-upload/$& Rejectme/' \ 'unknown critical dgit info in tag' expect-email unkdistro 's/test-dummy/ubuntu/ if m/^\[dgit/' \ 'not for this distro' expect-email notsplit 's/ split / no-split /' 'rejected: tag missing "split"' expect-email upsnot1 's/ upstream=/ uxstream=/' \ 'rejected: tag has upstream=.* and not upstream-tag=.*, or v-v' expect-email upsnot2 's/ upstream-tag=/ uxstream-tag=/' \ 'rejected: tag has upstream=.* and not upstream-tag=.*, or v-v' 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 expect-email noversion "s/ version=$v//" 'missing version=' t-dch-commit -v $v -m bump t-dch-commit-r expect-email upsmism 's/ upstream=/$&3/' \ "but tag refers to" # Without this, subsequent uploads of this same package produce the # "tainted objects" error (because we're re-uploading things stuck in # incoming, without explicitly saying we intend to not rewind). # # This could cause success test cases to fail, and it can also # cause failing test cases to fail in unexpected ways. # # We must do this no earlier than here, because the `upstream=` test # case above depends on us actually trying to make origs from the tag, # which doesn't happen if the already-uploaded origs for the same version # are in the archive. t-archive-process-incoming sid 1.0-1 t2u_job_package=xexample expect-email wrongpkg 's/ source=/$&x/' 'mismatch: changelog Source' unset t2u_job_package expect-quit wrongpkg2 's/ source=/$&x/' \ 'rejected: parsed source package xexample but manager said example' next-mangle hannibal git tag -u Hannibal -f -s -m "$(cat ../basetag)" "$tagname" t-t2u-run-drs $tmp/$p irrecoverable "$@" egrep -e 'key not found in keyrings' $tmp/t2u-message next-mangle baddm git tag -u Populus -f -s -m "$(cat ../basetag)" "$tagname" # We don't need to nobble dm.txt, because our *success* cases # (eg in drs-push-rejects) are set up to authorise Populus for pari-extra, # but not for example. t-t2u-run-drs $tmp/$p irrecoverable "$@" egrep -e 'package example not allowed for key' $tmp/t2u-message # 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 irrecoverable 'bad signature' next-mangle nosig perl -ne <../raw-base >../tagobj-$ident 'print unless m/^-----/..0' raw-mangled irrecoverable 'missing signature' git cat-file tag $tagname >../raw-base # This test case only works properly before bookworm, before which git # is willing to make the busted tag. And, d-r-s t2u mode verifies # the tag signature first, whereas this test case generates a mangled # *unsigned* tag. It would be nice to reinstate this, perhaps by # using git's config options for tolerating bad objects. : <<'END_TODO' 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 set +e (set -e; LC_MESSAGES=C raw-mangled false 2>../mktag.err) rc=$? set -e if [ $rc = 0 ]; then grep 'failed to fish tagger out of tag' "$tmp/sendmail.last" elif [ $rc = 128 ] && egrep 'error: object fails fsck: badTimezone: invalid author/committer line - bad time zone' ../mktag.err; then : else fatal 'failed to make raw-mangled' fi END_TODO cd .. rm -rf $p mv $p.save $p t-ok work/tests/tests/t2u-baredebian0000775000000000000000000000166615016262471013763 0ustar #!/bin/bash set -e . tests/lib . $troot/lib-baredebian t-restrict x-dgit-skip-suite,bullseye t-restrict x-dgit-skip-suite,buster t-dependencies T2U quilt t-t2u-settings t-debpolicy t-setup-import baredebian cd $p baredebian-test-vars t-t2u-setup-repo 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-nonapplicable check" tagname=test-dummy/$v t-expect-fail "'git apply' failed to apply patch 0002-Edit-the-.c-file.patch ('patches-nonapplicable' check)" \ t-t2u-test --baredebian git reset --hard HEAD~1 t-t2u-test --baredebian t-t2u-succeeded git branch split.p dgit/dgit/sid # we didn't generate this here baredebian-test-core-postpush t-t2u-gittarxz-unpack t-dgit -wn --quilt=$quiltmode --dgit-view-save=split.t quilt-fixup t-t2u-gittarxz-reproduced t-ok work/tests/tests/t2u-email0000775000000000000000000001103715016262471012767 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-skip-suite,bullseye t-restrict x-dgit-skip-suite,buster t-dependencies T2U mpack t-t2u-settings t-debpolicy export DGIT_TEST_MUNPACK=munpack export TAG2UPLOAD_LINE_LENGTH_LIMIT=200 t-t2u-native-prep t-t2u-setup-repo tagname=test-dummy/$v export DGIT_TEST_DEBUG= export DGIT_TEST_DEBPUSH_DEBUG= export DGIT_DRS_DEBUG=0 export DGIT_TEST_NDEBUG= t-t2u-test t-t2u-succeeded t-pushed-good master cd .. t-template-expect sendmail.last <<'END' ??? sendmail -oee -odb -oi -t -fnoreply@example.org From: test-dummy t2u service Subject: [tag2upload fake-job] uploaded example 1.0-1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=??? Content-Transfer-Encoding: 8bit X-Debian-Tag2upload-Distro: test-dummy X-Debian-Tag2upload-JobId: fake-job X-Debian-Tag2upload-Url: ???/fake_https_dir/gitlab.test-dummy.example.org/example.git X-Debian-Tag2upload-Status: uploaded X-Debian-Tag2upload-Package: example To: dgit test git user CC: copies@example.org, spqr@example.com Reply-To: reply-to@example.org, dgit test git user --??? Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline * ??? --??? Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline; filename="t2u_fake-job_log.txt" Content-Description: processing log + ??? --??? Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="t2u_fake-job_tag.txt" Content-Description: input git tag * ??? --???-- END t-template-expect sendmail.munpack/part1 <<'END' job id: fake-job url: ???/fake_https_dir/gitlab.test-dummy.example.org/example.git tag: test-dummy/1.0-1 preparing tag signature verified tag parsed ok source: example version: 1.0-1 tag signer authorised for package source code fetched changelog parsed ok target: test-dummy unstable package is new in this suite no upstream tag/commit specified, not considering orig(s) processing successful Uploaded to unstable END t-template-expect sendmail.munpack/t2u_fake-job_tag.txt <<'END' object f68f0a55d4bba3833727b96b135ee8b66a049a77 type commit tag test-dummy/1.0-1 tagger dgit test git user 1530000000 +0100 example release 1.0-1 for unstable [dgit distro=test-dummy split] [dgit please-upload source=example version=1.0-1] -----BEGIN PGP SIGNATURE----- + ??? -----END PGP SIGNATURE----- END t-template-expect sendmail.munpack/t2u_fake-job_log.txt <<'END' # builder: oracle$ ???ssh??? 'builder@t2u-b' 'env ...' builder:work$ git fetch origin --no-tags refs/tags/test-dummy/1.0-1:refs/tags/test-dummy/1.0-1 From ???/fake_https_dir/gitlab.test-dummy.example.org/example * [new tag] test-dummy/1.0-1 -> test-dummy/1.0-1 # [ok] builder:work$ git checkout -q refs/tags/test-dummy/1.0-1 # [ok] # source code fetched # changelog parsed ok # target: test-dummy unstable builder:work$ ???/dgit -wn -pexample --build-products-dir=../bpd --for-push fetch unstable canonical suite name for unstable is sid no version available from the archive dgit: source package example does not exist in suite unstable # [new] # package is new in this suite # no upstream tag/commit specified, not considering orig(s) oracle$ ???/dgit -wn -pexample --build-products-dir=../bpd --force-uploading-source-only --ssh=???ssh??? --ssh:-oBatchMode=yes --dgit=env --dgit:???/dgit -k52400D7C6342821C0D2B588E108F924D8FECF890 --dput:-u --package=example --expect-suite=unstable --expect-version=1.0-1 --tag2upload-builder-mode --split-view=always --new --trust-changelog '--dsc-control-add=Git-Tag-Tagger=dgit test git user ' '--dsc-control-add=Git-Tag-Info=tag=??? fp=bcd22cd83243b79d3dfac33ea3dbcbc039b13d8a' '--ch-control-add=Git-Tag-Tagger=dgit test git user ' '--ch-control-add=Git-Tag-Info=tag=??? fp=bcd22cd83243b79d3dfac33ea3dbcbc039b13d8a' rpush-source 'builder@t2u-b:???/work' canonical suite name for unstable is sid ## Don't insist on particular output from dgit rpush. * ??? dgit (build host) ok: pushed and uploaded 1.0-1 # [ok] # processing successful # Uploaded to unstable END t-ok work/tests/tests/t2u-gbp0000775000000000000000000000203715016262471012450 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-skip-suite,bullseye t-restrict x-dgit-skip-suite,buster t-dependencies T2U DEBORIG t-setup-import gbp t-t2u-settings t-debpolicy cd $p git deborig t-t2u-setup-repo tagname=test-dummy/$v t-expect-fail "please supply a --quilt= argument" t-t2u-test # Seed a quilt mode with an upload that never was. # Also test git-debpush's --print-tag-text option. ${DGIT_DEBPUSH_TEST-git debpush} --tag-only --print-tag-text \ --quilt=gbp --distro=test-dummy \ -u Senatus >$tmp/t.output t-grep-mpat E:'^\[dgit distro=test-dummy split --quilt=gbp\]$' \ $tmp/t.output v=1.0-2 t-dch-commit -v $v -m bump t-dch-commit-r t-dgit -wgf --quilt=gbp --dgit-view-save=split.b quilt-fixup # Test that git-debpush can now figure out the quilt mode for itself. tagname=test-dummy/$v t-t2u-test t-t2u-succeeded git branch split.p dgit/dgit/sid # we didn't generate this here t-gbp-pushed-good sid t-t2u-gittarxz-unpack t-dgit --quilt=gbp --dgit-view-save=split.t quilt-fixup t-t2u-gittarxz-reproduced t-ok work/tests/tests/t2u-gdr0000775000000000000000000000251715016262471012457 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-skip-suite,bullseye t-restrict x-dgit-skip-suite,buster t-dependencies T2U DEBORIG GDR t-setup-import gdr-convert-gbp v=2.0-3 t-t2u-settings t-debpolicy # This will spot failures to shell-escape the print-execute-command. # (Our tests otherwise miss this because autopkgtest-virt-null's # print-execute-command is trivial.) # # We do this in only one test case beause it makes the logs # *even harder* to read. # noop_suffix=$( cat <<'END' ,bash,-xec, : bodge args "$@" for e in \' \" \$; do test "$1" = "$e" shift done exec "$@" ,x,',",$ END ) noop_suffix="${noop_suffix// /%20}" export DGIT_DRS_T2U_VIRT_EXEC_CMD_SUFFIX="$noop_suffix" cd $p # Remove d/patches from the maintainer view so we have a real split. t-git-debrebase DEBEMAIL=dgit-tests@example.org \ gbp dch --commit --qa \ --ignore-branch --release --spawn-editor=never t-git-debrebase stitch t-t2u-setup-repo # TODO Make split.b ref. tagname=test-dummy/$v # Check that the thing we are about to tag (still) lacks d/patches. test ! -e debian/patches # And, debpush it. t-t2u-test --quilt=linear t-t2u-succeeded git branch split.p dgit/dgit/sid # TODO Run an appropriate t-*-pushed-good. t-t2u-gittarxz-unpack t-git-debrebase make-patches git branch split.t t-t2u-gittarxz-reproduced t-ok work/tests/tests/t2u-integration0000775000000000000000000001072215016262471014223 0ustar #!/bin/bash set -e . tests/lib t-dependencies T2U jq t-restrict x-tag2upload-service-manager t-debpolicy t-t2u-settings t-t2u-native-prep # Run this test case with real wall clock time unset GIT_COMMITTER_DATE unset GIT_AUTHOR_DATE #---------- start the tag2upload-service-manager daemon ---------- mkdir ../t2usm cd ../t2usm mkdir tmp cat >t2usm.toml <port # we pass O_RDWR fd to t2usm; that way we get EOF if it crashes $DGIT_TEST_T2USM_PROGRAM -c t2usm.toml run-manager & t2usm_pid=$! end_kill_pids+=" $! " # we don't keep the O_RDWR fd, only an O_RDONLY one exec 4check-for-banner nc.openbsd -U t2usm/o2m.s >check-for-banner & exec 3<&- read banner page-front-start.html #---------- start the tag2upload oracle daemon ---------- t-t2u-exec-t2u-oracled \ --ssh="$troot/ssh" \ --manager=t2u-service-manager-host \ --no-restart-workers \ --force-production \ --manager-socket=$tmp/t2usm/o2m.s & # We don't care about cleanup of this forked oracled: # If the manager dies, so will the oracled. poll1-for-worker-in-front-page () { curl http://127.0.0.1:$port/ >page-front-worker.html if grep -P '\bt2u-b,' page-front-worker.html; then t-poll-done; fi } t-poll-loop 1000 poll1-for-worker-in-front-page # ^ when we abandon gnupg, set this timeout to 5 #---------- make an upload tag and push it to fake salsa ---------- cd $p t-t2u-setup-repo ${DGIT_DEBPUSH_TEST-git debpush} --distro=test-dummy -u Senatus "$@" #---------- simulate webhook ---------- tagname=test-dummy/$v dep14tagref="refs/tags/$tagname" tag_objid=$(t-git-get-ref-exact $dep14tagref) hook_message=$(git cat-file tag $tagname | sed '1,/^$/d' | jq -sR) # Prepare the "api call responses" for tag fetches: fake_tag_dir="$t2u_fake_https_dir/$t2u_fake_salsa_host/api/v4/projects/$t2u_fake_salsa_project_id/repository/tags" mkdir -p -- "$fake_tag_dir" for tag in $(git tag -l); do fake_tag_file="$fake_tag_dir/${tag//\//%2F}" tag_date=$(TZ=UTC git for-each-ref "$dep14tagref" \ --format='%(creatordate:format-local:%Y-%m-%dT%H:%M:%SZ)') tag_date="${tag_date/+/.000+}" cat <"$fake_tag_file" { "target": "$tag_objid", "created_at": "$tag_date" } END done cd .. # Make the web hook request: curl http://127.0.0.1:"$port"/hook/gitlab -d@- <$" $tmp/sendmail.last grep -v "^CC:.*spqr@example\.com" $tmp/sendmail.last t-ok work/tests/tests/tag-updates0000775000000000000000000000076615016262471013415 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=${tagref#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/tag2upload-oracled0000775000000000000000000000205415016262471014640 0ustar #!/bin/bash set -e . tests/lib t-restrict x-dgit-skip-suite,buster t-dependencies autopkgtest netcat-openbsd t-t2u-settings # Here we test the Oracle qua daemon -- forking, signals etc.. # The real tests of its functionality are in tests/tests/t2u*. # This test is deliberately not named tests/tests/t2u-oracled because # it isn't likely to be helpful when hacking on actual tag2upload # functionality, and because it tests the daemon qua daemon, it is # named after, precisely, the tested daemon. t-drs t2u_oracled_response_scripts=(' # (1) Test it wants a proper greeting. echo "t2u-manager-not-ready" read response test "${response:0:19}" = "protocol-violation " ' ' # (2) Test it restarts the worker that complained about our greeting. echo "t2u-manager-ready" read version test "$version" = "t2u-oracle-version 4" # (3) Check ayt/ack works. read worker_id echo ayt read response test "$response" = ack ') t-t2u-interact-t2u-oracled --worker-restart-timeout=4 # (4) Fatal signals tested by t2u-fake-manager. test "x$(ls worker-cwd)" = xw0 t-ok work/tests/tests/tag2upload-oracled-systemd-unit0000775000000000000000000000071015016262471017300 0ustar #!/bin/bash set -e . tests/lib t-dependencies dgit-infrastructure systemd t-restrict x-dgit-out-of-tree-only unit=$root/debian/dgit-infrastructure.tag2upload-oracled.user.service # Exits zero if the unit file is valid, and it can find # /usr/bin/tag2upload-oracled (hence out-of-tree only). systemd-analyze verify $unit # Check --force-production isn't present except possibly in a comment. perl -wne'/^#/ && next; /--force-production\b/ && die' $unit work/tests/tests/test-list-uptodate0000775000000000000000000000037115016262471014742 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-replay0000775000000000000000000000345015016262471015561 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/unrepresentable0000775000000000000000000000461715016262471014374 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-dpkg0000775000000000000000000000007415016262471016567 0ustar #!/bin/bash set -e . tests/lib t-chain-test unrepresentable work/tests/tests/unrepresentable-single-git0000775000000000000000000000007415016262471016425 0ustar #!/bin/bash set -e . tests/lib t-chain-test unrepresentable work/tests/tests/version-opt0000775000000000000000000000102515016262471013451 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/0000775000000000000000000000000015016262471011437 5ustar work/tests/tstunt/Dpkg/0000775000000000000000000000000015016262471012324 5ustar work/tests/tstunt/Dpkg/Changelog/0000775000000000000000000000000015016262471014213 5ustar work/tests/tstunt/Dpkg/Changelog/Parse.pm0000664000000000000000000000406115016262471015624 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/debchange0000775000000000000000000000051715016262471013270 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/debuild0000775000000000000000000000020015016262471012765 0ustar #!/bin/bash set -e echo "DGIT TEST STUNT DEBUILD $*" >&2 "${DGIT_TEST_REAL_DEBUILD}" --preserve-env --preserve-envvar PATH "$@" work/tests/tstunt/dgit0000775000000000000000000000025715016262471012320 0ustar #!/bin/bash # NB This requires use of t-chain-test-somehow. set -e${DGIT_TEST_NDEBUG-x} troot=$DGIT_TEST_TROOT tmp=$DGIT_TEST_TMP . "$troot/lib-core" t-set-intree t-dgit "$@" work/tests/tstunt/dpkg-deb0000775000000000000000000000010115016262471013032 0ustar #!/bin/sh set -x exec \ "${DGIT_TEST_REAL_DPKG_DEB}" -Znone "$@" work/tests/tstunt/dpkg-parsechangelog0000775000000000000000000000304515016262471015274 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-agent0000775000000000000000000000013715016262471013237 0ustar #!/bin/sh set -e exec \ $DGIT_TEST_REAL_GPG_AGENT \ --debug-quick-random \ "$@" work/tests/tstunt/gpg-locked0000775000000000000000000000114615016262471013403 0ustar #!/bin/sh set -e for attempt in '' ' ' exec; do 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-withagent0000775000000000000000000000205015016262471014127 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/lintian0000775000000000000000000000012115016262471013015 0ustar #!/bin/sh echo >&2 'W: dgit test suite stunt lintian detects no problems' exit 0 work/tests/tstunt/sendmail0000775000000000000000000000076315016262471013167 0ustar #!/bin/sh set -e cd "$DGIT_TEST_TMP" exec >sendmail.last date printf "sendmail %s\n" "$*" cat exec >>sendmail.all echo '----------------------------------------------------------------' cat sendmail.last echo if [ "$DGIT_TEST_MUNPACK" ]; then set -x rm -rf sendmail.munpack mkdir sendmail.munpack sed 1,2d . 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-adjust0000775000000000000000000000171615016262471014455 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-intree0000775000000000000000000000052115016262471012433 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/0000775000000000000000000000000015016262471012123 5ustar work/tests/worktrees/example_1.0.tar0000664000000000000000000021400015016262471014641 0ustar example/0000755000175000017500000000000014737315347013047 5ustar swhittonswhittonexample/.git/0000755000175000017500000000000014737315650013705 5ustar swhittonswhittonexample/.git/logs/0000755000175000017500000000000014737315650014651 5ustar swhittonswhittonexample/.git/logs/HEAD0000644000175000017500000001324214737315650015277 0ustar swhittonswhitton17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 b5e11713170d332d33cab3b9743efffc2c2fabce Sean Whitton 1736284774 +0000 commit: Set Rules-Requires-Root to old default b5e11713170d332d33cab3b9743efffc2c2fabce e2157295db63affb0fdc90c11c60b5f279aaa587 Sean Whitton 1736284781 +0000 checkout: moving from master to indep-arch e2157295db63affb0fdc90c11c60b5f279aaa587 b5e11713170d332d33cab3b9743efffc2c2fabce Sean Whitton 1736284785 +0000 rebase (start): checkout master b5e11713170d332d33cab3b9743efffc2c2fabce d2d2327c5c060b3cfc270affbdd07faa439003ea Sean Whitton 1736284785 +0000 rebase (pick): Provide indep-arch branch d2d2327c5c060b3cfc270affbdd07faa439003ea d2d2327c5c060b3cfc270affbdd07faa439003ea Sean Whitton 1736284785 +0000 rebase (finish): returning to refs/heads/indep-arch d2d2327c5c060b3cfc270affbdd07faa439003ea 1986506b09aedf1864a4e3228284a58c3db6ac7a Sean Whitton 1736284787 +0000 checkout: moving from indep-arch to quilt-tip 1986506b09aedf1864a4e3228284a58c3db6ac7a b5e11713170d332d33cab3b9743efffc2c2fabce Sean Whitton 1736284791 +0000 rebase (start): checkout master b5e11713170d332d33cab3b9743efffc2c2fabce 1b214544d15d25791c6a77a021b47281e8bd41c6 Sean Whitton 1736284791 +0000 rebase (pick): Prep for quilt, now builds a quilt source package with suitable origs 1b214544d15d25791c6a77a021b47281e8bd41c6 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 Sean Whitton 1736284791 +0000 rebase (pick): Add *.o to .gitignore 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 Sean Whitton 1736284791 +0000 rebase (finish): returning to refs/heads/quilt-tip 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 d6025bb5f4cd5e5d7748f3fad2240e3e73c74ed7 Sean Whitton 1736284802 +0000 checkout: moving from quilt-tip to patch-queue/quilt-tip d6025bb5f4cd5e5d7748f3fad2240e3e73c74ed7 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 Sean Whitton 1736284815 +0000 rebase (start): checkout quilt-tip 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 f2a083eb1642ac84377377a72e064fe691caefa8 Sean Whitton 1736284815 +0000 rebase (pick): Add a new upstream file f2a083eb1642ac84377377a72e064fe691caefa8 c69707c82d276d682071c0de34026758a7af84c8 Sean Whitton 1736284815 +0000 rebase (pick): Edit the .c file c69707c82d276d682071c0de34026758a7af84c8 33e7210ae0b8fedd5d3ce56bc8f8400d89714b5b Sean Whitton 1736284815 +0000 rebase (pick): Add another new upstream file 33e7210ae0b8fedd5d3ce56bc8f8400d89714b5b 33e7210ae0b8fedd5d3ce56bc8f8400d89714b5b Sean Whitton 1736284815 +0000 rebase (finish): returning to refs/heads/patch-queue/quilt-tip 33e7210ae0b8fedd5d3ce56bc8f8400d89714b5b 7fc34be828b8d7e20864ef74c08303033134326d Sean Whitton 1736284842 +0000 checkout: moving from patch-queue/quilt-tip to quilt-tip-1.1 7fc34be828b8d7e20864ef74c08303033134326d 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 Sean Whitton 1736284847 +0000 rebase (start): checkout quilt-tip 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 c3c45692a988908acc6b91861349aaca54e0d43d Sean Whitton 1736284847 +0000 rebase (pick): Update to 1.1 (with some extra funny upstream objects). c3c45692a988908acc6b91861349aaca54e0d43d c3c45692a988908acc6b91861349aaca54e0d43d Sean Whitton 1736284847 +0000 rebase (finish): returning to refs/heads/quilt-tip-1.1 c3c45692a988908acc6b91861349aaca54e0d43d 2b2ddc8b3f713d535acaa8da51346c46c68281a5 Sean Whitton 1736284852 +0000 checkout: moving from quilt-tip-1.1 to gitish-only 2b2ddc8b3f713d535acaa8da51346c46c68281a5 c3c45692a988908acc6b91861349aaca54e0d43d Sean Whitton 1736284860 +0000 rebase (start): checkout quilt-tip-1.1 c3c45692a988908acc6b91861349aaca54e0d43d c196fbef667095ed309c6537b6785173346caca3 Sean Whitton 1736284860 +0000 rebase (pick): check we can function with broken clean target c196fbef667095ed309c6537b6785173346caca3 bc4db5545db708f2af3ff558ac3fa8760d5b0152 Sean Whitton 1736284860 +0000 rebase (pick): check new executables can be created bc4db5545db708f2af3ff558ac3fa8760d5b0152 5f8556a6fc1911871e1678d70665361d23e24ef3 Sean Whitton 1736284860 +0000 rebase (pick): check symlinks can be deleted 5f8556a6fc1911871e1678d70665361d23e24ef3 5f8556a6fc1911871e1678d70665361d23e24ef3 Sean Whitton 1736284860 +0000 rebase (finish): returning to refs/heads/gitish-only 5f8556a6fc1911871e1678d70665361d23e24ef3 99fcab4e49e6fd71091f30d30760c3600e291263 Sean Whitton 1736284864 +0000 checkout: moving from gitish-only to quilt-tip-2 99fcab4e49e6fd71091f30d30760c3600e291263 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 Sean Whitton 1736284871 +0000 rebase (start): checkout quilt-tip 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 8114e30bd0c255f8a1416b6ffebce27da684ef26 Sean Whitton 1736284871 +0000 rebase (pick): rules: check we are patched 8114e30bd0c255f8a1416b6ffebce27da684ef26 8114e30bd0c255f8a1416b6ffebce27da684ef26 Sean Whitton 1736284871 +0000 rebase (finish): returning to refs/heads/quilt-tip-2 8114e30bd0c255f8a1416b6ffebce27da684ef26 b5e11713170d332d33cab3b9743efffc2c2fabce Sean Whitton 1736284903 +0000 checkout: moving from quilt-tip-2 to master example/.git/logs/refs/0000755000175000017500000000000012524731655015607 5ustar swhittonswhittonexample/.git/logs/refs/heads/0000755000175000017500000000000014737315650016674 5ustar swhittonswhittonexample/.git/logs/refs/heads/indep-arch0000644000175000017500000000034014737315650020626 0ustar swhittonswhittone2157295db63affb0fdc90c11c60b5f279aaa587 d2d2327c5c060b3cfc270affbdd07faa439003ea Sean Whitton 1736284785 +0000 rebase (finish): refs/heads/indep-arch onto b5e11713170d332d33cab3b9743efffc2c2fabce example/.git/logs/refs/heads/quilt-tip0000644000175000017500000000033714737315650020552 0ustar swhittonswhitton1986506b09aedf1864a4e3228284a58c3db6ac7a 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 Sean Whitton 1736284791 +0000 rebase (finish): refs/heads/quilt-tip onto b5e11713170d332d33cab3b9743efffc2c2fabce example/.git/logs/refs/heads/master0000644000175000017500000000027214737315650020113 0ustar swhittonswhitton17d67dbd8f2a46fa824ed7aa5aecd7893ac1dcf9 b5e11713170d332d33cab3b9743efffc2c2fabce Sean Whitton 1736284774 +0000 commit: Set Rules-Requires-Root to old default example/.git/logs/refs/heads/quilt-tip-1.10000644000175000017500000000034314737315650021044 0ustar swhittonswhitton7fc34be828b8d7e20864ef74c08303033134326d c3c45692a988908acc6b91861349aaca54e0d43d Sean Whitton 1736284847 +0000 rebase (finish): refs/heads/quilt-tip-1.1 onto 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 example/.git/logs/refs/heads/quilt-tip-20000644000175000017500000000034114737315650020704 0ustar swhittonswhitton99fcab4e49e6fd71091f30d30760c3600e291263 8114e30bd0c255f8a1416b6ffebce27da684ef26 Sean Whitton 1736284871 +0000 rebase (finish): refs/heads/quilt-tip-2 onto 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 example/.git/logs/refs/heads/qc/0000755000175000017500000000000012724643135017273 5ustar swhittonswhittonexample/.git/logs/refs/heads/patch-queue/0000755000175000017500000000000014737315650021115 5ustar swhittonswhittonexample/.git/logs/refs/heads/patch-queue/quilt-tip0000644000175000017500000000035314737315650022771 0ustar swhittonswhittond6025bb5f4cd5e5d7748f3fad2240e3e73c74ed7 33e7210ae0b8fedd5d3ce56bc8f8400d89714b5b Sean Whitton 1736284815 +0000 rebase (finish): refs/heads/patch-queue/quilt-tip onto 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 example/.git/logs/refs/heads/gitish-only0000644000175000017500000000034114737315650021063 0ustar swhittonswhitton2b2ddc8b3f713d535acaa8da51346c46c68281a5 5f8556a6fc1911871e1678d70665361d23e24ef3 Sean Whitton 1736284860 +0000 rebase (finish): refs/heads/gitish-only onto c3c45692a988908acc6b91861349aaca54e0d43d example/.git/packed-refs0000644000175000017500000000076214737315650016021 0ustar swhittonswhitton# pack-refs with: peeled fully-peeled sorted 5f8556a6fc1911871e1678d70665361d23e24ef3 refs/heads/gitish-only d2d2327c5c060b3cfc270affbdd07faa439003ea refs/heads/indep-arch b5e11713170d332d33cab3b9743efffc2c2fabce refs/heads/master 33e7210ae0b8fedd5d3ce56bc8f8400d89714b5b refs/heads/patch-queue/quilt-tip 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 refs/heads/quilt-tip c3c45692a988908acc6b91861349aaca54e0d43d refs/heads/quilt-tip-1.1 8114e30bd0c255f8a1416b6ffebce27da684ef26 refs/heads/quilt-tip-2 example/.git/info/0000755000175000017500000000000014737315650014640 5ustar swhittonswhittonexample/.git/info/exclude0000644000175000017500000000036012524730531016202 0ustar swhittonswhitton# 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/info/refs0000644000175000017500000000070414737315644015526 0ustar swhittonswhitton5f8556a6fc1911871e1678d70665361d23e24ef3 refs/heads/gitish-only d2d2327c5c060b3cfc270affbdd07faa439003ea refs/heads/indep-arch b5e11713170d332d33cab3b9743efffc2c2fabce refs/heads/master 33e7210ae0b8fedd5d3ce56bc8f8400d89714b5b refs/heads/patch-queue/quilt-tip 0d767aab1a851d6ca0086d9733d3ce1ea8012f09 refs/heads/quilt-tip c3c45692a988908acc6b91861349aaca54e0d43d refs/heads/quilt-tip-1.1 8114e30bd0c255f8a1416b6ffebce27da684ef26 refs/heads/quilt-tip-2 example/.git/FETCH_HEAD0000644000175000017500000000016312631152426015231 0ustar swhittonswhitton3ae19a7996340f1ce74004d6e84f2de7d6670742 branch 'master' of /home/ian/things/Dgit/dgit/tests/pkg-srcs/example-1.0 example/.git/branches/0000755000175000017500000000000012524730531015461 5ustar swhittonswhittonexample/.git/HEAD0000644000175000017500000000002714737315347014333 0ustar swhittonswhittonref: refs/heads/master example/.git/COMMIT_EDITMSG~0000644000175000017500000000057713132702305016164 0ustar swhittonswhittoncheck 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/description0000644000175000017500000000011112524730531016133 0ustar swhittonswhittonUnnamed repository; edit this file 'description' to name the repository. example/.git/index0000644000175000017500000000122014737315347014735 0ustar swhittonswhittonDIRCg}%Eg}%E >\YFbp)8p .gitignoreg}%Eg}%E ?+C'yS"^-6debian/changelogg}"a @Euۆ@dM debian/compatg}!g}! 23İR$PxdRpvdebian/controlg}sg}s HUku\ůCb5(~debian/example.installg}%Eg}%E B AUI|hH]#;eN: debian/rulesg}"US $S2(58vexampleTREE87 1 ;&S3:AۉM3Vdebian5 0 A?X\L4 l֥^dϷ#9R!_>]example/.git/refs/0000755000175000017500000000000012524730531014633 5ustar swhittonswhittonexample/.git/refs/tags/0000755000175000017500000000000012524730531015571 5ustar swhittonswhittonexample/.git/refs/heads/0000755000175000017500000000000014737315650015730 5ustar swhittonswhittonexample/.git/refs/heads/qc/0000755000175000017500000000000012724643135016327 5ustar swhittonswhittonexample/.git/refs/heads/patch-queue/0000755000175000017500000000000014737315650020151 5ustar swhittonswhittonexample/.git/ORIG_HEAD0000644000175000017500000000005114737315307015144 0ustar swhittonswhitton99fcab4e49e6fd71091f30d30760c3600e291263 example/.git/objects/0000755000175000017500000000000014737315644015341 5ustar swhittonswhittonexample/.git/objects/info/0000755000175000017500000000000014737315650016271 5ustar swhittonswhittonexample/.git/objects/info/packs0000644000175000017500000000006614737315644017322 0ustar swhittonswhittonP pack-f4b7f49c134fa6c1b50b2203b4c6ac6ceade6748.pack example/.git/objects/info/commit-graph0000444000175000017500000000403014737315650020576 0ustar swhittonswhittonCGPHOIDFDOIDLDCDATGDA2  vzlm3/ }*FNתZ׉:!ED]%yjw!rA'gS}@kZh:f3! ],/μMT]?X?v [Rfp0e7xQs4lVkIT=Ɨ-'mh q4gX2|\ <' CB7sw.O" XGF̊Zpg}w>L&^%.E3w2QepU~X5ƐΈSU#e pg}w jd7vf]F1ppUS}M8Z r p(g}T|7nF/ .Y VpUS"2`<Az p,g}~($@iR,$xjp g}9`.94'Ѱfbkp US;&S3:AۉM3Vpg}f{M&DLV" p(g}Z6[{ G##ܷ+ p$g}3Vcx\))p g}8 E${[k Cp$g}d:?{6/S{ pg}q"h'߄$)Fp g}: y ѳ>rnv)3example/.git/objects/pack/0000755000175000017500000000000014737315650016254 5ustar swhittonswhittonexample/.git/objects/pack/pack-f4b7f49c134fa6c1b50b2203b4c6ac6ceade6748.pack0000444000175000017500000002345014737315650025677 0ustar swhittonswhittonPACKhx=?k0]Ɩ8I@(Y۵g;e~z{ïUfģ1[k2䣋CԁѱZT97#^% 1DVL1T*Qwd8G4S˱ sNԋozD]!B,WCO#%3-|X;߹8N5QchTt[YUquki2\9Y_+q[cx[¤[R``dljhdadbbbjfijdlaldblnaf8Q7l\G5sCm **I-RHHMV(OUH,JU(H,Sx=?k0]B{C Y5C +~z{ïLjL=a< >b2ԝ#)Z;=O(xF@k=AYǞ3 YrrI0,Zx߶V)"M'+eڤw& A#)ų𪏟ܜ(:M$ Rx=λn0 @]_e (횡3EяE?J 8u*4ie6ڤ1QtIܰp@l}\ ;el@$-cu |b/gx_~^uyvS sN^X?@Rj孓&m[jWnܖtWqF ioFV8 㑩.8:C,W,WX%Xx=?k0 ݟ{!(#;Pʭڡ(4p.jy"{?M!ѠsihLH0C8S\5NI&mH{zY.ϺPYk[%^ݹ5~@mKR4knϟtϼWiF&ЈvJ,,-?gtCsh.BUF '?TCx=1k0 ݿB{!؎c頔خ: K8q_jz<|G SҁzAEbGIDF>9s\! ZLcHޢKVGG u |pON˱exuMenmA,Vnݹ qb&m:תIS{c<_]U} hg̻pԔ85Qx[[Rddhaffaladnjfabdbafddi`fhbf8Q7BA`B[%CS1%E!Q!/\hpbBZfN*x==o D{#!>R]"iS^r)?De4śizce./h5sɫdϋ!ɀFJkIzQͨ)y4΍,g<3}=QwJ\.:Py<\qo/&ұwnk]x'Qipfu) ƹLmx=n E{bꬄ`@M)R2XV[;Rĉ}Ԗ Nfq0z&XpQaWntPitDm 3*OJGGo\~׃.avJ*QֶicqS4L(4<5FxzR[?PN x=j0~[ĘD Cϛu# ؽէ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Ѓaicvv@ ߟKEzjc d:SlN:̀ WuHZx/9Ee2X/DI-tѡܼcĥW<YX<'F8[ٖ@gaGQO|MF !`֔{qipa\OγRV9'51 .'xSVO/JMWP*,V<Ԋ܂T%.O }xj100644 .gitignore\YFbp)8p40000 debianA?X\L4 l֥^100755 exampleS2(58vY+mx340031QHHKOOg^aYߕztV6*-H,ap]vqߗJ]"(?aSW\/$"1 'U7(9C/3$1'tҕbwN28-/S7 M}f^Jj! 榦 E9 &9s9v5l*?tWS]?xAV"3İR$PxdRpv100644 example*AUI|hH]#;eN:Dx340031QK,L/JeW3?sekBJjRfb]hD^P tG|k-<1^CsSSԊ܂T_1zc$6|-38$'3I/[+OkL mϭWTA^jniAqIQjbnZ&дE {96A~=]{\ PE@r7hux3j) %r~fG1i-xxq„{xxqaVo+W 6+?'x!3C%/44Sn/GI&7xӪm x340031QHHKOOg08Q&}'Q[EGB$0.]ź8K%RWWR`|dÄWAW0TKpNPATIjEbnAN^f^qIbN٥+7]dqZ^nrPBQiNj1CSkƶeb]=Tzu(%2LܜMlm7Ͼ|3 rYgx;8qw 5x340031QH/M,aZ۴xؽϨop5 ZƘI /ԲԊ܂T_1zc$6|-*K-MHM tu>6[?x+K-T-/*I+0}mx!`XW"~d/tI "Kxxq"IYqg-6-hx!kj(8q"Ȅ ::xtq rw s[xxq"L Kojulsx;ʴiɉ] {x´i(&e&1Lx6Qӗyܚ ;pT}e3s-Wxxq"Gj2<*[Ng%2q" +xxQD!9#1/=5'?!?|F]ƻED)n99QumZx+LQH+K.(4kb>;xsLIQHTHIcU=xM(LѬ"+xxq„EXk\)?Zw۬TiVxxq„{i?xθq„{ x340031QK,L/Je#C~ãnk ִ(xab )Iy sOϗvwB{9C'3}YVE4OWx MMR+s rR&_ ~~ӎu,ddVo+W 6+1Fxj100644 .gitignore\YFbp)8p40000 debianti$QrC6)100755 exampleS2(58v,x[qBRf^bQnf^JjDݜ)9y\ %xθqso-v68dzةUNtW cxxqB?1οK*\հkĬ\ՙ|Bxkb8a W@brvbzBjEbnANy% ,xtiBPv(>7͚yʊ+X3YD [xxqB?1οK*\հkĬ\ՙ|xiBMCx۫.QZca #W \VxxqB?1οK*\հkĬ\ՙ|\xtiBL}k <#TuO;)axbćJ/xxq"IYqg-6-hx!kj(8q"Ȅ :5x´i(&e&10+}8XcCU VK<'> rxxq"Gj2<*[Ng%2q" +xxQD!9#1/=5'?!?|F]ƻED)n99QumZiFxθq„{ x3j) %r~fGc7xj100644 .gitignore\YFbp)8p40000 debianCS;7fQŀ> 100755 exampleS2(58v=-4Bx{qBdvֆ-~{MR;;SĬ&ʑ iwxkb4a.xj100644 .gitignore\YFbp)8p40000 debian]ൺeKL\35100755 exampleS2(58v[-9xƸqB?1οK*\հk,xj100644 .gitignore\YFbp)8p40000 debiantx"R or100755 exampleS2(58v ,"xƸq" 2/;g=cUc xx;4qD'щen\9yV\E Ei )Iy9\Bq8x83%#>9'51 0xj100644 .gitignore\YFbp)8p40000 debian_cΘLDHgz#(100755 exampleS2(58vv+MxƸq"x{Wo_beR6 xj100644 .gitignore\YFbp)8p40000 debian2'M+̗N쟲Eo100755 exampleS2(58v1-jix8qĀ4RO "ƬlgHexample/.git/objects/pack/pack-f4b7f49c134fa6c1b50b2203b4c6ac6ceade6748.idx0000444000175000017500000000762014737315650025546 0ustar swhittonswhittontOc  """#######$%%%%%%%&&&&&&&&&&&'''''(((())**+++,,,,,-----------../112222222233334556666668::;;;<<<??????@@@@@@@BCCDEEFFFFFGGIIIIIJJKKKMMMMMNQRRRRTUUUVXXXXYZZZZZ[[\\]^^^^^^___`aabccddefffhhhhhh~($@iR,$xjC|WyY\=jlj^8X$D]51 LMggT [zusN vzlm3/ G"8t/1`:}M8Z r{M&DLV" :O#_2]'G}*FNתZ׉:Pk d"=z!ED]%yjw!rA NfFv.%}" XGF̊Z#kCN5 &͗q'gS}@kZh:f+C'yS"^-6+-܋?q=SZʨQ4lFƂ0Eúag%&G6B2`<Az3İR$PxdRpv3! ]L&^%.E3w2Qe@ͨFmǤ~~EBh^AcneJFu"gI6\AUI|hH]#;eN:B@r *8@iH>'yBU ZF)|n=vrtEuۆ@dMLh\h)bq1z}JMyEKDv T|7nF/ .Y V_Vxe6#Nd:?{6/S{h_@6{Z 5"kj) %r~flM+$n.,doh0h~`ݲ/Z!Ytx"R orK(dt142m UAko}&hѷ-Uu{"B2٧y'>YF["9O|No8WsuOעv2譙5)-,n ) M,מ=)op}-Ca@vC]ൺeKL\35ݢpvHƐ??  `OKhЮ0L1d3%3\YFbp)8pA?X\L4 l֥^ݵ 3-3ʳt>,/κ-X9ڎ 8c MT]?X?v [RÙ ,fp0e7xQs4lVkIT=o%OT9qoƗ-'mh q4gXUku\ůCb5(~cȯhs+Dæt"R\($G36~pjf?ΎOgd HQ1Rgk~<&C%/44Sn/2|\ <' C/&^5p`g?4s[^]wH$>sNa}Yr5CP3&{~2'M+̗N쟲Eo&5iW|401=Ψ֡frcܐ`y jd7vf]F1ztcQ"h'߄$)F o(9ۓђc׭kg-9sQ|+x1CS;7fQŀ> B7sw.Oti$QrC6)߈#BF9_cΘLDHgz#(EVO% B`h{1Agbʋ-!f2ng >xtﬗ9T&&8}jDO;d?EH:nf΅mp`>.& {}v$7O|d# uƑ!1~P3+NMv`1VrNǖʚǝMtouGڨ7SC6 Å|FK~Db4Ebn.WPvoϡ} 65K5j/ &[amG6|w2a7E_.d!;v=%/cN:\缸mX\9p/OαTPϽb1&n 9Dt8xp";`8TPY?֦`w<`KgxK'o\R Wed, 13 May 2015 21:26:42 +0100 example/debian/example.install0000644000175000017500000000002014737315163017300 0ustar swhittonswhittonexample usr/bin example/debian/compat0000644000175000017500000000000214164202405015447 0ustar swhittonswhitton8 example/debian/rules0000755000175000017500000000041414737315347015350 0ustar swhittonswhitton#!/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/control0000644000175000017500000000043214737315307015667 0ustar swhittonswhittonSource: example Section: devel Priority: extra Maintainer: Ian Jackson Standards-Version: 3.9.4.0 Build-Depends: debhelper (>= 8) Rules-Requires-Root: binary-targets Package: example Architecture: all Description: Example package for dgit testing work/tests/worktrees/example_1.1.tar0000664000000000000000000017000015016262471014643 0ustar example/0000755000175000017500000000000014164202405010607 5ustar ianianexample/example0000755000175000017500000000004412524704751012177 0ustar ianian#!/bin/sh echo "this is an example" example/src.c0000664000175000017500000000001513340053221011533 0ustar ianianmain(void){} example/docs/0000775000175000017500000000000013340053221011534 5ustar ianianexample/docs/README0000664000175000017500000000003413340053221012411 0ustar ianianSome document might be here example/.git/0000755000175000017500000000000014164202405011450 5ustar 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/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/info/0000755000175000017500000000000014164202405012403 5ustar ianianexample/.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/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/HEAD0000664000175000017500000000004613340053221012071 0ustar ianianref: refs/heads/patch-queue/quilt-tip 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/logs/0000755000175000017500000000000014164202405012414 5ustar ianianexample/.git/logs/HEAD0000664000175000017500000000000014164202405013030 0ustar ianianexample/.git/logs/refs/0000755000175000017500000000000012524731655013367 5ustar ianianexample/.git/logs/refs/heads/0000755000175000017500000000000014164202405014437 5ustar ianianexample/.git/logs/refs/heads/quilt-tip-1.10000664000175000017500000000000014164202405016577 0ustar ianianexample/.git/logs/refs/heads/indep-arch0000664000175000017500000000000014164202405016364 0ustar ianianexample/.git/logs/refs/heads/qc/0000755000175000017500000000000012724643135015053 5ustar 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/refs/heads/master0000664000175000017500000000000014164202405015645 0ustar ianianexample/.git/logs/refs/heads/quilt-tip0000664000175000017500000000000014164202405016302 0ustar ianianexample/.git/logs/refs/heads/gitish-only0000664000175000017500000000000014164202405016620 0ustar ianianexample/.git/ORIG_HEAD0000644000175000017500000000005113132706650012715 0ustar ianiane2123a9c45ab450a3a4bbbfe532d7d67bbca790a example/.git/description0000644000175000017500000000011112524730531013713 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. example/.git/refs/0000755000175000017500000000000012524730531012413 5ustar ianianexample/.git/refs/heads/0000755000175000017500000000000014164202405013473 5ustar ianianexample/.git/refs/heads/qc/0000755000175000017500000000000012724643135014107 5ustar ianianexample/.git/refs/heads/patch-queue/0000775000175000017500000000000014164202405015716 5ustar ianianexample/.git/refs/tags/0000755000175000017500000000000012524730531013351 5ustar ianianexample/.git/hooks/0000755000175000017500000000000014725313416012603 5ustar ianianexample/.git/objects/0000755000175000017500000000000013340056274013107 5ustar ianianexample/.git/objects/info/0000755000175000017500000000000014164202405014034 5ustar ianianexample/.git/objects/info/packs0000664000175000017500000000015314164202405015061 0ustar ianianP pack-8b9ce6a40d3917e4d05c85d653061b77df1549be.pack P pack-9c9203df30e15e5315ccde612b5f1d17e2a6bf12.pack example/.git/objects/pack/0000755000175000017500000000000014164202405014017 5ustar ianianexample/.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/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/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/.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/config0000644000175000017500000000013412724643135012647 0ustar ianian[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true example/.git/branches/0000755000175000017500000000000012524730531013241 5ustar ianianexample/.git/FETCH_HEAD0000644000175000017500000000016312631152426013011 0ustar ianian3ae19a7996340f1ce74004d6e84f2de7d6670742 branch 'master' of /home/ian/things/Dgit/dgit/tests/pkg-srcs/example-1.0 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/.gitignore0000664000175000017500000000000713340053221012571 0ustar ianian*~ *.o example/debian/0000755000175000017500000000000014164202405012031 5ustar ianianexample/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/compat0000644000175000017500000000000214164202405013227 0ustar ianian8 example/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/example.install0000644000175000017500000000002012555314271015053 0ustar ianianexample usr/bin example/debian/changelog0000664000175000017500000000021613340053221013677 0ustar ianianexample (1.0-1) unstable; urgency=low * Test package. -- Ian Jackson Wed, 13 May 2015 21:26:42 +0100 example/debian/source/0000775000175000017500000000000013340053221013326 5ustar ianianexample/debian/source/format0000664000175000017500000000001413340053221014534 0ustar ianian3.0 (quilt) example/new-upstream-file0000664000175000017500000000001313340053221014065 0ustar ianianAdd a file example/lib.c0000664000175000017500000000002613340053221011514 0ustar ianianvoid function(void){} work/tests/worktrees/pari-extra_3-1.tar0000664000000000000000000014400015016262471015266 0ustar pari-extra/0000775000175000017500000000000014164202405011232 5ustar ianianpari-extra/.git/0000775000175000017500000000000014725314066012105 5ustar ianianpari-extra/.git/COMMIT_EDITMSG0000664000175000017500000000003612367464122014172 0ustar ianianAdd bogus text to Description 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/info/0000775000175000017500000000000014164202405013026 5ustar ianianpari-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/info/refs0000664000175000017500000000016714164202405013714 0ustar ianian0bfc46797e1ed174335f693335a96f431ff4e0c5 refs/heads/bogus c6cb32b389f242fdbc74c61b9ddd4b3b57e601e5 refs/heads/dgit/sid pari-extra/.git/HEAD0000664000175000017500000000003112367464177012534 0ustar ianianref: refs/heads/dgit/sid pari-extra/.git/logs/0000775000175000017500000000000014164202405013037 5ustar ianianpari-extra/.git/logs/HEAD0000664000175000017500000000000014164202405013451 0ustar ianianpari-extra/.git/logs/refs/0000775000175000017500000000000012242154445014003 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/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/description0000664000175000017500000000011112242154443014335 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. pari-extra/.git/refs/0000775000175000017500000000000014164202405013032 5ustar ianianpari-extra/.git/refs/heads/0000775000175000017500000000000014164202405014116 5ustar ianianpari-extra/.git/refs/heads/dgit/0000775000175000017500000000000014164202405015045 5ustar ianianpari-extra/.git/refs/tags/0000775000175000017500000000000012242154443013773 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/hooks/0000775000175000017500000000000014725314066013230 5ustar ianianpari-extra/.git/objects/0000775000175000017500000000000014164202405013524 5ustar ianianpari-extra/.git/objects/info/0000775000175000017500000000000014164202405014457 5ustar ianianpari-extra/.git/objects/info/packs0000664000175000017500000000006614164202405015505 0ustar ianianP pack-5a56ba3cdae1890c53175d98a55cdde74f44863f.pack pari-extra/.git/objects/pack/0000775000175000017500000000000014164202405014442 5ustar ianianpari-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/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/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/.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/DGIT_ARCHIVE0000664000175000017500000000005112242154445013707 0ustar ianian1d7060a0b5714db1132e98611963e65edc766762 pari-extra/.git/branches/0000775000175000017500000000000012242154443013663 5ustar ianianpari-extra/debian/0000775000175000017500000000000014164202405012454 5ustar ianianpari-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/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/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/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/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.tar0000664000000000000000000014400015016262471015556 0ustar pari-extra/0000775000175000017500000000000014164202406011233 5ustar ianianpari-extra/.git/0000775000175000017500000000000014725312762012106 5ustar ianianpari-extra/.git/COMMIT_EDITMSG0000664000175000017500000000003712303436414014164 0ustar ianianDummy change for dgit testing. 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/info/0000775000175000017500000000000014164202406013027 5ustar ianianpari-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/info/refs0000664000175000017500000000027014164202406013710 0ustar ianiancaecb81fca3589f998253d96ff884954528c131c refs/heads/dgit/sid 4752e72d89a64bcd0c0d98f69ad8aa34105b46b7 refs/heads/v2 89a231c370ec184471a562e04ce2f9cc0e51d796 refs/remotes/dgit/dgit/sid pari-extra/.git/HEAD0000664000175000017500000000003112303436436012517 0ustar ianianref: refs/heads/dgit/sid pari-extra/.git/logs/0000775000175000017500000000000014164202406013040 5ustar ianianpari-extra/.git/logs/HEAD0000664000175000017500000000000014164202406013452 0ustar ianianpari-extra/.git/logs/refs/0000775000175000017500000000000012301222502013765 5ustar 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/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/ORIG_HEAD0000664000175000017500000000005112303436420013332 0ustar ianian0718dd7b55be65093691560d064602557c17fb7a pari-extra/.git/description0000664000175000017500000000011112301222477014334 0ustar ianianUnnamed repository; edit this file 'description' to name the repository. pari-extra/.git/refs/0000775000175000017500000000000014164202406013033 5ustar ianianpari-extra/.git/refs/heads/0000775000175000017500000000000014164202406014117 5ustar ianianpari-extra/.git/refs/heads/dgit/0000775000175000017500000000000014164202406015046 5ustar ianianpari-extra/.git/refs/tags/0000775000175000017500000000000012301222530013760 5ustar ianianpari-extra/.git/refs/tags/debian/0000775000175000017500000000000012303417077015220 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/hooks/0000775000175000017500000000000014725312770013230 5ustar ianianpari-extra/.git/objects/0000775000175000017500000000000014164202406013525 5ustar ianianpari-extra/.git/objects/info/0000775000175000017500000000000014164202406014460 5ustar ianianpari-extra/.git/objects/info/packs0000664000175000017500000000006614164202406015506 0ustar ianianP pack-2210b56b0bbf9e759beb8d76c5e1a1f914d20c4c.pack pari-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/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/.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/DGIT_ARCHIVE0000664000175000017500000000005112301222502013671 0ustar ianian1d7060a0b5714db1132e98611963e65edc766762 pari-extra/.git/branches/0000775000175000017500000000000012301222477013662 5ustar ianianpari-extra/.git/FETCH_HEAD0000664000175000017500000000000012301222522013407 0ustar ianianpari-extra/debian/0000775000175000017500000000000014164202406012455 5ustar ianianpari-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/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/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/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/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.tar0000664000000000000000000021400015016262471016260 0ustar ruby-rails-3.2/0000775000175000017500000000000014164202406011550 5ustar ianianruby-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/.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/.git/0000775000175000017500000000000014725314135012417 5ustar 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/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/info/0000775000175000017500000000000014164202406013344 5ustar ianianruby-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/info/refs0000664000175000017500000000030514164202406014224 0ustar ianian6de8e04137ffb352810a3086ef15a51cffd8df52 refs/heads/dgit/sid 748c2d40d6a9452cf9bcbfb76d1b382b56c1674a refs/heads/incoming-branch 58498d68ce13425be9fa5ad841a7df38a9b0060b refs/remotes/dgit/dgit/sid ruby-rails-3.2/.git/HEAD0000664000175000017500000000003112432202022013015 0ustar ianianref: refs/heads/dgit/sid 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/logs/0000775000175000017500000000000014164202406013355 5ustar ianianruby-rails-3.2/.git/logs/HEAD0000664000175000017500000000000014164202406013767 0ustar ianianruby-rails-3.2/.git/logs/refs/0000775000175000017500000000000012244425624014322 5ustar 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/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/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/refs/0000775000175000017500000000000012244425624013356 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/refs/tags/0000775000175000017500000000000012244425622014312 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/hooks/0000775000175000017500000000000014725314135013542 5ustar ianianruby-rails-3.2/.git/objects/0000775000175000017500000000000014164202406014042 5ustar ianianruby-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/objects/pack/0000775000175000017500000000000014164202406014760 5ustar ianianruby-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/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/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/.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/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/DGIT_ARCHIVE0000664000175000017500000000005112244425624014226 0ustar ianian58498d68ce13425be9fa5ad841a7df38a9b0060b ruby-rails-3.2/.git/branches/0000775000175000017500000000000012244425622014202 5ustar ianianruby-rails-3.2/.git/FETCH_HEAD0000664000175000017500000000000012244425624013742 0ustar ianianruby-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/debian/0000775000175000017500000000000014164202406012772 5ustar ianianruby-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/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/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/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/compat0000664000175000017500000000000214164202406014170 0ustar ianian7 ruby-rails-3.2/debian/rules0000775000175000017500000000003612432200232014040 0ustar ianian#!/usr/bin/make -f %: dh $@ 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/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/source/0000775000175000017500000000000012432200232014261 5ustar ianianruby-rails-3.2/debian/source/format0000664000175000017500000000001412432200232015467 0ustar ianian3.0 (quilt) ruby-rails-3.2/debian/watch0000664000175000017500000000013712432200232014013 0ustar ianianversion=3 http://pkg-ruby-extras.alioth.debian.org/cgi-bin/gemwatch/rails .*/rails-(.*).tar.gz ruby-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: [] work/using-these0000775000000000000000000000021015016262471011106 0ustar #!/bin/bash set -e d="${0%/*}" PERLLIB=$d${PERLLIB:+:}${PERLLIB} export PERLLIB PATH=$d:$d/infra${PATH:+:}${PATH} export PATH exec "$@"