diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2015-06-29 02:46:24 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2015-06-29 02:46:24 +0100 |
commit | fd8f387167425d0c9da7bce0ffc460a57d0ceced (patch) | |
tree | cb7067f8ee3aa778647122527d3776bfd2fce3b7 /dgit | |
parent | 8359fd512497cc33029f6f3c696e331a844229ab (diff) |
Detect and bomb out on vendor-specific `3.0 (quilt)' patch series.
Diffstat (limited to 'dgit')
-rwxr-xr-x | dgit | 67 |
1 files changed, 67 insertions, 0 deletions
@@ -1145,6 +1145,69 @@ sub clogp_authline ($) { 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) { + die "$series $!" unless $!==ENOENT; + return; + } + while (<SERIES>) { + next unless m/\S/; + next if m/^\s+\#/; + + print STDERR <<END; + +Unfortunately, this source package uses a feature of dpkg-source where +the same source package unpacks to different source code on different +distros. dgit cannot safely operate on such packages on affected +distros, because the meaning of source packages is not stable. + +Please ask the distro/maintainer to remove the distro-specific series +files and use a different technique (if necessary, uploading actually +different packages, if different distros are supposed to have +different code). + +END + fail "Found active distro-specific series file for". + " $checkdistro ($what): $series, cannot continue"; + } + die "$series $!" if SERIES->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 <hertzog@debian.org> + # 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(), + "distro being accessed"); +} + sub generate_commit_from_dsc () { prep_ud(); changedir $ud; @@ -1177,6 +1240,7 @@ sub generate_commit_from_dsc () { runcmd @cmd; my ($tree,$dir) = mktree_in_ud_from_only_subdir(); + check_for_vendor_patches() if madformat($dsc->{format}); runcmd qw(sh -ec), 'dpkg-parsechangelog >../changelog.tmp'; my $clogp = parsecontrol('../changelog.tmp',"commit's changelog"); my $authline = clogp_authline $clogp; @@ -1632,6 +1696,7 @@ sub dopush ($) { runcmd qw(dpkg-source -x --), $dscpath =~ m#^/# ? $dscpath : "../../../$dscpath"; my ($tree,$dir) = mktree_in_ud_from_only_subdir(); + check_for_vendor_patches() if madformat($dsc->{format}); changedir '../../../..'; my $diffopt = $debuglevel>0 ? '--exit-code' : '--quiet'; my @diffcmd = (@git, qw(diff), $diffopt, $tree); @@ -2354,6 +2419,8 @@ sub build_maybe_quilt_fixup () { return unless madformat $format; # sigh + check_for_vendor_patches(); + # Our objective is: # - honour any existing .pc in case it has any strangeness # - determine the git commit corresponding to the tip of |