Browse Source

use local changelog from /usr/share/doc if possible

If pkgAcqChangelog is told to acquire the changelog for a version it
will check first if this version is installed on the disk and if so will
use the local changelog in /usr/share/doc (possibily/likely gz
compressed) instead of downloading the file from the web.

An option is provided to disable this, which is enabled by default for
the Ubuntu vendor as they truncate the local changelogs – and for apts
--print-uris action.
tags/debian/1.2.4
David Kalnischkies 5 years ago
parent
commit
b5aba9096e
5 changed files with 60 additions and 2 deletions
  1. +33
    -2
      apt-pkg/acquire-item.cc
  2. +1
    -0
      apt-pkg/init.cc
  3. +2
    -0
      apt-private/private-download.cc
  4. +23
    -0
      test/integration/test-apt-get-changelog
  5. +1
    -0
      vendor/ubuntu/apt.conf-01-vendor-ubuntu

+ 33
- 2
apt-pkg/acquire-item.cc View File

@@ -3149,16 +3149,47 @@ void pkgAcqChangelog::Init(std::string const &DestDir, std::string const &DestFi
/*}}}*/
std::string pkgAcqChangelog::URI(pkgCache::VerIterator const &Ver) /*{{{*/
{
std::string const confOnline = "Acquire::Changelogs::AlwaysOnline";
bool AlwaysOnline = _config->FindB(confOnline, false);
if (AlwaysOnline == false)
for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; ++VF)
{
pkgCache::PkgFileIterator const PF = VF.File();
if (PF.Flagged(pkgCache::Flag::NotSource) || PF->Release == 0)
continue;
pkgCache::RlsFileIterator const RF = PF.ReleaseFile();
if (RF->Origin != 0 && _config->FindB(confOnline + "::Origin::" + RF.Origin(), false))
{
AlwaysOnline = true;
break;
}
}
if (AlwaysOnline == false)
{
pkgCache::PkgIterator const Pkg = Ver.ParentPkg();
if (Pkg->CurrentVer != 0 && Pkg.CurrentVer() == Ver)
{
std::string const basename = std::string("/usr/share/doc/") + Pkg.Name() + "/changelog";
std::string const debianname = basename + ".Debian";
if (FileExists(debianname))
return "copy://" + debianname;
else if (FileExists(debianname + ".gz"))
return "gzip://" + debianname + ".gz";
else if (FileExists(basename))
return "copy://" + basename;
else if (FileExists(basename + ".gz"))
return "gzip://" + basename + ".gz";
}
}

char const * const SrcName = Ver.SourcePkgName();
char const * const SrcVersion = Ver.SourceVerStr();
pkgCache::PkgFileIterator PkgFile;
// find the first source for this version which promises a changelog
for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; ++VF)
{
pkgCache::PkgFileIterator const PF = VF.File();
if (PF.Flagged(pkgCache::Flag::NotSource) || PF->Release == 0)
continue;
PkgFile = PF;
pkgCache::RlsFileIterator const RF = PF.ReleaseFile();
std::string const uri = URI(RF, PF.Component(), SrcName, SrcVersion);
if (uri.empty())


+ 1
- 0
apt-pkg/init.cc View File

@@ -120,6 +120,7 @@ bool pkgInitConfig(Configuration &Cnf)
Cnf.CndSet("Acquire::Changelogs::URI::Origin::Tanglu", "http://metadata.tanglu.org/changelogs/@CHANGEPATH@_changelog");
Cnf.CndSet("Acquire::Changelogs::URI::Origin::Ubuntu", "http://changelogs.ubuntu.com/changelogs/pool/@CHANGEPATH@/changelog");
Cnf.CndSet("Acquire::Changelogs::URI::Origin::Ultimedia", "http://packages.ultimediaos.com/changelogs/pool/@CHANGEPATH@/changelog.txt");
Cnf.CndSet("Acquire::Changelogs::AlwaysOnline::Origin::Ubuntu", true);

bool Res = true;



+ 2
- 0
apt-private/private-download.cc View File

@@ -246,6 +246,8 @@ bool DoChangelog(CommandLine &CmdL)

bool const downOnly = _config->FindB("APT::Get::Download-Only", false);
bool const printOnly = _config->FindB("APT::Get::Print-URIs", false);
if (printOnly)
_config->CndSet("Acquire::Changelogs::AlwaysOnline", true);

aptAcquireWithTextStatus Fetcher;
for (APT::VersionList::const_iterator Ver = verset.begin();


+ 23
- 0
test/integration/test-apt-get-changelog View File

@@ -7,6 +7,7 @@ TESTDIR="$(readlink -f "$(dirname "$0")")"
setupenvironment
configarchitecture 'native'

buildsimplenativepackage 'dpkg' 'native' '42' 'stable'
buildsimplenativepackage 'foo' 'all' '1.0' 'stable'
buildsimplenativepackage 'libbar' 'all' '1.0' 'stable'

@@ -105,3 +106,25 @@ testfailure test -e foo.changelog
testequal "E: Failed to fetch http://localhost:${APTHTTPPORT}/does/not/exist/main/f/foo/foo_1.0/change.txt Changelog unavailable for foo=1.0 (404 Not Found)
" aptget changelog foo -qq -d -o Acquire::Changelogs::URI::Label::Testcases="http://localhost:${APTHTTPPORT}/does/not/exist/@CHANGEPATH@/change.txt"
testfailure test -e foo.changelog
cd ..

testdpkgnotinstalled 'foo'
testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/f/foo/foo_1.0/changelog' foo.changelog" apt changelog foo --print-uris -o Acquire::Changelogs::AlwaysOnline=false
testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/f/foo/foo_1.0/changelog' foo.changelog" apt changelog foo --print-uris -o Acquire::Changelogs::AlwaysOnline=true

testsuccess apt install dpkg -y
# at this moment, we still have the Releasefile claim to be origin:ubuntu
echo 'Acquire::Changelogs::AlwaysOnline::Origin::Ubuntu "false";' >> rootdir/etc/apt/apt.conf.d/nooriginchangelogs
testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/d/dpkg/dpkg_42/changelog' dpkg.changelog" apt changelog dpkg --print-uris
testsuccessequal "'gzip:///usr/share/doc/dpkg/changelog.Debian.gz' dpkg.changelog" apt changelog dpkg --print-uris -o Acquire::Changelogs::AlwaysOnline=false
testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/d/dpkg/dpkg_42/changelog' dpkg.changelog" apt changelog dpkg --print-uris -o Acquire::Changelogs::AlwaysOnline=true
testsuccessequal "'http://localhost:${APTHTTPPORT}/pool/main/d/dpkg/dpkg_42/changelog' dpkg.changelog" apt changelog dpkg --print-uris -o Acquire::Changelogs::AlwaysOnline=false -o Acquire::Changelogs::AlwaysOnline::Origin::Ubuntu=true
testsuccessequal "'gzip:///usr/share/doc/dpkg/changelog.Debian.gz' dpkg.changelog" apt changelog dpkg --print-uris -o Acquire::Changelogs::AlwaysOnline=false -o Acquire::Changelogs::AlwaysOnline::Origin::Debian=true

cd downloaded
testsuccess apt changelog dpkg -d
testfilestats 'dpkg.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644"
head -n 3 dpkg.changelog > dpkg.change
testfileequal 'dpkg.change' "$(apthelper cat-file '/usr/share/doc/dpkg/changelog.Debian.gz' | head -n 3)"
rm -f dpkg.change dpkg.changelog
cd ..

+ 1
- 0
vendor/ubuntu/apt.conf-01-vendor-ubuntu View File

@@ -0,0 +1 @@
Acquire::Changelogs::AlwaysOnline "true";

Loading…
Cancel
Save