]> git.saurik.com Git - apt.git/commitdiff
* merged lp:~mvo/apt/history
authorMichael Vogt <michael.vogt@ubuntu.com>
Fri, 18 Dec 2009 15:55:06 +0000 (16:55 +0100)
committerMichael Vogt <michael.vogt@ubuntu.com>
Fri, 18 Dec 2009 15:55:06 +0000 (16:55 +0100)
  - this writes a /var/log/apt/history tagfile that contains details
    from the transaction (complements term.log)

1  2 
apt-pkg/deb/dpkgpm.cc
debian/changelog
doc/examples/configure-index

diff --combined apt-pkg/deb/dpkgpm.cc
index d1a275a4786551e807445b78dc51860f74d5e758,4b118bc1422f244a9602624e0b6c6094ae5c3350..88098c379c6d6aca1d4b96ea8d0dbb1947b9c14a
@@@ -550,45 -550,103 +550,103 @@@ void pkgDPkgPM::DoDpkgStatusFd(int stat
     dpkgbuf_pos = dpkgbuf+dpkgbuf_pos-p;
  }
                                                                        /*}}}*/
+ // DPkgPM::WriteHistoryTag                                            /*{{{*/
+ void pkgDPkgPM::WriteHistoryTag(string tag, string value)
+ {
+    if (value.size() > 0)
+    {
+       // poor mans rstrip(", ")
+       if (value[value.size()-2] == ',' && value[value.size()-1] == ' ')
+        value.erase(value.size() - 2, 2);
+       fprintf(history_out, "%s: %s\n", tag.c_str(), value.c_str());
+    }
+ }                                                                     /*}}}*/
  // DPkgPM::OpenLog                                                    /*{{{*/
  bool pkgDPkgPM::OpenLog()
  {
     string logdir = _config->FindDir("Dir::Log");
     if(not FileExists(logdir))
        return _error->Error(_("Directory '%s' missing"), logdir.c_str());
+    // get current time
+    char timestr[200];
+    time_t t = time(NULL);
+    struct tm *tmp = localtime(&t);
+    strftime(timestr, sizeof(timestr), "%F  %T", tmp);
+    // open terminal log
     string logfile_name = flCombine(logdir,
                                   _config->Find("Dir::Log::Terminal"));
     if (!logfile_name.empty())
     {
        term_out = fopen(logfile_name.c_str(),"a");
        chmod(logfile_name.c_str(), 0600);
-       // output current time
-       char outstr[200];
-       time_t t = time(NULL);
-       struct tm *tmp = localtime(&t);
-       strftime(outstr, sizeof(outstr), "%F  %T", tmp);
-       fprintf(term_out, "\nLog started: ");
-       fprintf(term_out, "%s", outstr);
+       fprintf(term_out, "\n\nLog started: ");
+       fprintf(term_out, "%s", timestr);
        fprintf(term_out, "\n");
     }
+    // write 
+    string history_name = flCombine(logdir,
+                                  _config->Find("Dir::Log::History"));
+    if (!history_name.empty())
+    {
+       history_out = fopen(history_name.c_str(),"a");
+       chmod(history_name.c_str(), 0644);
+       fprintf(history_out, "\nStart-Date: %s\n", timestr);
+       string remove, purge, install, upgrade, downgrade;
+       for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
+       {
+        if (Cache[I].NewInstall())
+           install += I.Name() + string(" (") + Cache[I].CandVersion + string("), ");
+        else if (Cache[I].Upgrade())
+           upgrade += I.Name() + string(" (") + Cache[I].CurVersion + string(", ") + Cache[I].CandVersion + string("), ");
+        else if (Cache[I].Downgrade())
+           downgrade += I.Name() + string(" (") + Cache[I].CurVersion + string(", ") + Cache[I].CandVersion + string("), ");
+        else if (Cache[I].Delete())
+        {
+           if ((Cache[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge)
+              purge += I.Name() + string(" (") + Cache[I].CurVersion + string("), ");      
+           else
+              remove += I.Name() + string(" (") + Cache[I].CurVersion + string("), ");     
+        }
+       }
+       WriteHistoryTag("Install", install);
+       WriteHistoryTag("Upgrade", upgrade);
+       WriteHistoryTag("Downgrade",downgrade);
+       WriteHistoryTag("Remove",remove);
+       WriteHistoryTag("Purge",purge);
+       fflush(history_out);
+    }
+    
     return true;
  }
                                                                        /*}}}*/
  // DPkg::CloseLog                                                     /*{{{*/
  bool pkgDPkgPM::CloseLog()
  {
+    char timestr[200];
+    time_t t = time(NULL);
+    struct tm *tmp = localtime(&t);
+    strftime(timestr, sizeof(timestr), "%F  %T", tmp);
     if(term_out)
     {
-       char outstr[200];
-       time_t t = time(NULL);
-       struct tm *tmp = localtime(&t);
-       strftime(outstr, sizeof(outstr), "%F  %T", tmp);
        fprintf(term_out, "Log ended: ");
-       fprintf(term_out, "%s", outstr);
+       fprintf(term_out, "%s", timestr);
        fprintf(term_out, "\n");
        fclose(term_out);
     }
     term_out = NULL;
+    if(history_out)
+    {
+       if (dpkg_error.size() > 0)
+        fprintf(history_out, "Error: %s\n", dpkg_error.c_str());
+       fprintf(history_out, "End-Date: %s\n", timestr);
+       fclose(history_out);
+    }
     return true;
  }
                                                                        /*}}}*/
@@@ -879,8 -937,7 +937,8 @@@ bool pkgDPkgPM::Go(int OutStatusFd
            const char *s = _("Can not write log, openpty() "
                              "failed (/dev/pts not mounted?)\n");
            fprintf(stderr, "%s",s);
 -          fprintf(term_out, "%s",s);
 +            if(term_out)
 +              fprintf(term_out, "%s",s);
            master = slave = -1;
         }  else {
            struct termios rtt;
            RunScripts("DPkg::Post-Invoke");
  
         if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV) 
-           _error->Error("Sub-process %s received a segmentation fault.",Args[0]);
+           strprintf(dpkg_error, "Sub-process %s received a segmentation fault.",Args[0]);
         else if (WIFEXITED(Status) != 0)
-           _error->Error("Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
+           strprintf(dpkg_error, "Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
         else 
-           _error->Error("Sub-process %s exited unexpectedly",Args[0]);
+           strprintf(dpkg_error, "Sub-process %s exited unexpectedly",Args[0]);
+        if(dpkg_error.size() > 0)
+           _error->Error(dpkg_error.c_str());
  
         if(stopOnError) 
         {
diff --combined debian/changelog
index 53dfcce12e4f012a8e02ee688cfb6c156df8f921,c75ea227e0ee14b007ad64c93f0596be5cfa825f..eb50b4c78ea76edeefac897ba4d95f4d78c3ed79
@@@ -1,4 -1,4 +1,12 @@@
 -apt (0.7.25) UNRELEASED; urgency=low
++apt (0.7.25.1) UNRELEASED; urgency=low
++
++  * merged lp:~mvo/apt/history
++    - this writes a /var/log/apt/history tagfile that contains details
++      from the transaction (complements term.log)
++
++ -- Michael Vogt <michael.vogt@ubuntu.com>  Fri, 18 Dec 2009 16:54:18 +0100
++
 +apt (0.7.25) unstable; urgency=low
  
    [ Christian Perrier ]
    * Fix apt-ftparchive(1) wrt description of the "-o" option.
@@@ -13,6 -13,8 +21,6 @@@
      Closes: #548571
    * German translation update by Holger Wansing
      Closes: #551534
 -  * German translation of manpages by Chris Leick
 -    Closes: #552606
    * Italian translation update by Milo Casagrande
      Closes: #555797
    * Simplified Chinese translation update by Aron Xu 
      (thanks also to Jussi Hakala and Julian Andres Klode)
    * apt-pkg/deb/dpkgpm.cc:
      - add "purge" to list of known actions
 +  * apt-pkg/init.h:
 +    - add compatibility with old ABI name until the next ABI break
 +  * merge segfault fix from Mario Sanchez Prada, many thanks
 +    (closes: #561109)
  
    [ Brian Murray ]
    * apt-pkg/depcache.cc, apt-pkg/indexcopy.cc:
    * doc/po4a.conf: activate translation of guide.sgml and offline.sgml
    * doc/apt.conf.5.xml:
      - provide a few more details about APT::Immediate-Configure
 +    - briefly document the behaviour of the new https options
    * doc/sources.list.5.xml:
      - add note about additional apt-transport-methods
    * doc/apt-mark.8.xml:
      - correct showauto synopsis, thanks Andrew Schulman (Closes: #551440)
    * cmdline/apt-get.cc:
 -    - source should displays his final pkg pick (Closes: #249383, #550952)
 +    - source should display his final pkg pick (Closes: #249383, #550952)
      - source doesn't need the complete version for match (Closes: #245250)
      - source ignores versions/releases if not available (Closes: #377424)
      - only warn if (free) space overflows (Closes: #522238)
      - add --debian-only as alias for --diff-only
    * methods/connect.cc:
      - display also strerror of "wicked" getaddrinfo errors
 +    - add AI_ADDRCONFIG to ai_flags as suggested by Aurelien Jarno
 +      in response to Bernhard R. Link, thanks! (Closes: #505020)
    * buildlib/configure.mak, buildlib/config.{sub,guess}:
      - remove (outdated) config.{sub,guess} and use the ones provided
        by the new added build-dependency autotools-dev instead
      - bump policy to 3.8.3 as we have no outdated manpages anymore
    * debian/NEWS:
      - fix a typo in 0.7.24: Allready -> Already (Closes: #557674)
 -  * cmdline/apt-mark:
 -    - print an error if a new state file can't be created,
 -      thanks Carl Chenet! (Closes: #521289)
 -    - print an error and exit if python-apt is not installed,
 -      thanks Carl Chenet! (Closes: #521284)
    * ftparchive/writer.{cc,h}:
      - add APT::FTPArchive::LongDescription to be able to disable them
    * apt-pkg/deb/debsrcrecords.cc:
      - use "diff" filetype for .debian.tar.* files (Closes: #554898)
 +  * methods/rred.cc:
 +    - rewrite to be able to handle even big patch files
 +    - adopt optional mmap+iovec patch from Morten Hustveit
 +      (Closes: #463354) which should speed up a bit. Thanks!
 +  * methods/http{,s}.cc
 +    - add config setting for User-Agent to the Acquire group,
 +      thanks Timothy J. Miller! (Closes: #355782)
 +    - add https options which default to http ones (Closes: #557085)
 +  * debian/apt.cron.daily:
 +    - check cache size even if we do nothing else otherwise, thanks
 +      Francesco Poli for patch(s) and patience! (Closes: #459344)
 +  * ftparchive/*:
 +    - fix a few typos in strings, comments and manpage,
 +      thanks Karl Goetz! (Closes: #558757)
 +
 +  [ Carl Chenet ]
 +  * cmdline/apt-mark:
 +    - print an error if a new state file can't be created
 +      (Closes: #521289) and
 +    - exit nicely if python-apt is not installed (Closes: #521284)
  
    [ Chris Leick ]
 +  * doc/de: German translation of manpages (Closes: #552606)
    * doc/ various manpages:
      - correct various errors, typos and oddities (Closes: #552535)
    * doc/apt-secure.8.xml:
      - replace literal with emphasis tags in Archive configuration
 +  * doc/apt-ftparchive.1.xml:
 +    - remove informalexample tag which hides the programlisting
 +  * doc/apt-get.8.xml:
 +    - change equivalent "for" to "to the" (purge command)
 +    - clarify --fix-broken sentence about specifying packages
  
    [ Eugene V. Lyubimkin ]
    * apt-pkg/contib/strutl.h
    * debian/apt.conf.autoremove:
      - Add kfreebsd-image-* to the list (Closes: #558803)
  
 - -- Michael Vogt <michael.vogt@ubuntu.com>  Tue, 29 Sep 2009 15:51:34 +0200
 + -- Michael Vogt <mvo@debian.org>  Tue, 15 Dec 2009 09:21:55 +0100
  
  apt (0.7.24) unstable; urgency=low
  
index ced390447bbb0da40e20c1d9302051910319ba02,eaea6511cf2e0f13289b828c9ea1949891d95320..1e9946e1b65c18c2f0fef1e3a5c580e9439c47a6
@@@ -191,37 -191,19 +191,37 @@@ Acquir
      Max-Age "86400";     // 1 Day age on index files
      No-Store "false";    // Prevent the cache from storing archives    
      Dl-Limit "7";        // 7Kb/sec maximum download rate
 +    User-Agent "Debian APT-HTTP/1.3";
    };
  
 -  // HTTPS method configuration:
 -  // - uses the http proxy config 
 -  // - uses the http cache-control values
 -  // - uses the http Dl-Limit values
 -  https 
 +
 +
 +  // HTTPS method configuration: uses the http
 +  // - proxy config
 +  // - cache-control values
 +  // - Dl-Limit, Timout, ... values
 +  // if not set explicit for https
 +  //
 +  // see /usr/share/doc/apt/examples/apt-https-method-example.conf.gz
 +  // for more examples
 +  https
    {
        Verify-Peer "false";
        SslCert "/etc/apt/some.pem";
 -        CaPath  "/etc/ssl/certs";
 -        Verify-Host" "true";
 -        AllowRedirect  "true";
 +      CaPath  "/etc/ssl/certs";
 +      Verify-Host" "true";
 +      AllowRedirect  "true";
 +
 +      Timeout "120";
 +      AllowRedirect  "true";
 +
 +      // Cache Control. Note these do not work with Squid 2.0.2
 +      No-Cache "false";
 +      Max-Age "86400";     // 1 Day age on index files
 +      No-Store "false";    // Prevent the cache from storing archives
 +      Dl-Limit "7";        // 7Kb/sec maximum download rate
 +
 +      User-Agent "Debian APT-CURL/1.0";
    };
  
    ftp
@@@ -325,6 -307,7 +325,7 @@@ Dir "/
    // Location of the logfile
    Log "var/log/apt" {
        Terminal "term.log";
+       History "history.log";
    };
  };