ソースを参照

update: Run Post-Invoke-Success if not all sources failed

Failures can happen and APT regardless will do a partial cache
update anyway. Because APT ensures that the list directory is
in a sane state, it makes sense to also call success hooks if
success was only partial - otherwise it loses sync with APT.

Most importantly, this causes the appstream cache to be empty,
see launchpad bug #1562733.

This is somewhat overly optimistic though: As soon as any repository
has nonexisting optional files, the missing optional files are also
treated as success, which means a single broken repository without an
InRelease file still runs Success hooks, even though it really should
not.
Julian Andres Klode 10 年 前
コミット
35664152e4
共有2 個のファイルを変更した53 個の追加5 個の削除を含む
  1. 10 5
      apt-pkg/update.cc
  2. 43 0
      test/integration/test-apt-update-hooks

+ 10 - 5
apt-pkg/update.cc

@@ -61,11 +61,14 @@ bool AcquireUpdate(pkgAcquire &Fetcher, int const PulseInterval,
 
    bool Failed = false;
    bool TransientNetworkFailure = false;
+   bool AllFailed = true;
    for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); 
 	I != Fetcher.ItemsEnd(); ++I)
    {
-      if ((*I)->Status == pkgAcquire::Item::StatDone)
+      if ((*I)->Status == pkgAcquire::Item::StatDone) {
+	 AllFailed = false;
 	 continue;
+      }
 
       (*I)->Finished();
 
@@ -101,22 +104,24 @@ bool AcquireUpdate(pkgAcquire &Fetcher, int const PulseInterval,
 	 // something went wrong with the clean
 	 return false;
    }
+
+   bool Res = true;
    
    if (TransientNetworkFailure == true)
-      _error->Warning(_("Some index files failed to download. They have been ignored, or old ones used instead."));
+      Res = _error->Warning(_("Some index files failed to download. They have been ignored, or old ones used instead."));
    else if (Failed == true)
-      return _error->Error(_("Some index files failed to download. They have been ignored, or old ones used instead."));
+      Res = _error->Error(_("Some index files failed to download. They have been ignored, or old ones used instead."));
 
 
    // Run the success scripts if all was fine
    if (RunUpdateScripts == true)
    {
-      if(!TransientNetworkFailure && !Failed)
+      if(AllFailed == false)
 	 RunScripts("APT::Update::Post-Invoke-Success");
 
       // Run the other scripts
       RunScripts("APT::Update::Post-Invoke");
    }
-   return true;
+   return Res;
 }
 									/*}}}*/

+ 43 - 0
test/integration/test-apt-update-hooks

@@ -0,0 +1,43 @@
+#!/bin/sh
+set -e
+
+TESTDIR="$(readlink -f "$(dirname "$0")")"
+. "$TESTDIR/framework"
+
+setupenvironment
+configarchitecture 'i386'
+confighashes 'SHA512'
+
+insertpackage 'unstable' 'foo' 'i386' '1.0'
+insertpackage 'testing' 'foo' 'any' '1.0'
+
+setupaptarchive --no-update
+APTARCHIVE="$(readlink -f ./aptarchive)"
+
+signreleasefiles 'Joe Sixpack'
+
+echo 'APT::Update::Post-Invoke-Success { "echo SUCCESS"; };' >> rootdir/etc/apt/apt.conf.d/display-success.conf
+echo 'APT::Update::Post-Invoke { "echo RUN"; };' >> rootdir/etc/apt/apt.conf.d/display-success.conf
+
+
+msgmsg "All sources OK => run Post-Invoke-Success and Post-Invoke"
+testsuccess aptget update
+cp rootdir/tmp/testsuccess.output aptupdate.output
+testsuccess grep "RUN" aptupdate.output
+testsuccess grep "SUCCESS" aptupdate.output
+
+msgmsg "Some sources broken => run Post-Invoke-Success and Post-Invoke"
+sed -i -e '/^ / d' -e '/^SHA512:/ d' "$APTARCHIVE/dists/unstable/Release"
+signreleasefiles
+testfailure aptget update
+cp rootdir/tmp/testfailure.output aptupdate.output
+testsuccess grep "RUN" aptupdate.output
+testsuccess grep "SUCCESS" aptupdate.output
+
+msgmsg "All sources broken => run Post-Invoke"
+sed -i -e '/^ / d' -e '/^SHA512:/ d' "$APTARCHIVE/dists/testing/Release"
+signreleasefiles
+testfailure aptget update
+cp rootdir/tmp/testfailure.output aptupdate.output
+testsuccess grep "RUN" aptupdate.output
+testfailure grep "SUCCESS" aptupdate.output