Merge remote-tracking branch 'donkult/debian/sid' into debian/sid
authorMichael Vogt <mvo@debian.org>
Sun, 26 Jan 2014 07:15:29 +0000 (08:15 +0100)
committerMichael Vogt <mvo@debian.org>
Sun, 26 Jan 2014 07:15:29 +0000 (08:15 +0100)
Conflicts:
apt-private/private-list.cc
doc/po/de.po
test/integration/framework

37 files changed:
apt-inst/dirstream.cc
apt-pkg/aptconfiguration.cc
apt-pkg/cacheset.cc
apt-pkg/contrib/fileutl.cc
apt-pkg/contrib/gpgv.cc
apt-pkg/contrib/hashes.cc
apt-pkg/contrib/hashsum.cc
apt-pkg/contrib/mmap.cc
apt-pkg/deb/dpkgpm.cc
apt-pkg/install-progress.cc
apt-private/private-list.cc
apt-private/private-search.cc
cmdline/apt-key.in
debian/control
doc/Doxyfile.in
doc/po/de.po
ftparchive/contents.cc
ftparchive/multicompress.cc
ftparchive/override.cc
methods/connect.cc
methods/copy.cc
methods/ftp.cc
methods/gzip.cc
methods/http.cc
methods/https.cc
methods/https.h
methods/mirror.cc
methods/rsh.cc
methods/server.cc
methods/server.h
test/integration/framework
test/integration/run-tests
test/integration/test-apt-get-download
test/integration/test-apt-get-source
test/integration/test-ubuntu-bug-784473-InRelease-one-message-only
test/interactive-helper/rpmver.cc
test/libapt/parsedepends_test.cc

index 65d1aa1..b62bdca 100644 (file)
@@ -20,7 +20,6 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <errno.h>
-#include <utime.h>
 #include <unistd.h>
 #include <apti18n.h>
                                                                        /*}}}*/
@@ -93,19 +92,18 @@ bool pkgDirStream::FinishedFile(Item &Itm,int Fd)
 {
    if (Fd < 0)
       return true;
-   
-   if (close(Fd) != 0)
-      return _error->Errno("close",_("Failed to close file %s"),Itm.Name);
 
    /* Set the modification times. The only way it can fail is if someone
       has futzed with our file, which is intolerable :> */
-   struct utimbuf Time;
-   Time.actime = Itm.MTime;
-   Time.modtime = Itm.MTime;
-   if (utime(Itm.Name,&Time) != 0)
-      _error->Errno("utime",_("Failed to close file %s"),Itm.Name);
-   
-   return true;   
+   struct timespec times[2];
+   times[0].tv_sec = times[1].tv_sec = Itm.MTime;
+   times[0].tv_nsec = times[1].tv_nsec = 0;
+   if (futimens(Fd, times) != 0)
+      _error->Errno("futimens", "Failed to set modification time for %s",Itm.Name);
+
+   if (close(Fd) != 0)
+      return _error->Errno("close",_("Failed to close file %s"),Itm.Name);
+   return true;
 }
                                                                        /*}}}*/
 // DirStream::Fail - Failed processing a file                          /*{{{*/
index 115d116..1ebcf97 100644 (file)
@@ -141,7 +141,7 @@ std::vector<std::string> const Configuration::getLanguages(bool const &All,
        // so they will be all included in the Cache.
        std::vector<string> builtin;
        DIR *D = opendir(_config->FindDir("Dir::State::lists").c_str());
-       if (D != 0) {
+       if (D != NULL) {
                builtin.push_back("none");
                for (struct dirent *Ent = readdir(D); Ent != 0; Ent = readdir(D)) {
                        string const name = SubstVar(Ent->d_name, "%5f", "_");
@@ -166,8 +166,8 @@ std::vector<std::string> const Configuration::getLanguages(bool const &All,
                                continue;
                        builtin.push_back(c);
                }
+               closedir(D);
        }
-       closedir(D);
 
        // FIXME: Remove support for the old APT::Acquire::Translation
        // it was undocumented and so it should be not very widthly used
index 0147f7e..29281aa 100644 (file)
@@ -73,6 +73,8 @@ bool PackageContainerInterface::FromTask(PackageContainerInterface * const pci,
                const char *start, *end;
                parser.GetRec(start,end);
                unsigned int const length = end - start;
+               if (unlikely(length == 0))
+                  continue;
                char buf[length];
                strncpy(buf, start, length);
                buf[length-1] = '\0';
index ffb8b4b..37155b6 100644 (file)
@@ -319,7 +319,7 @@ bool CreateDirectory(string const &Parent, string const &Path)
       return false;
 
    // we are not going to create directories "into the blue"
-   if (Path.find(Parent, 0) != 0)
+   if (Path.compare(0, Parent.length(), Parent) != 0)
       return false;
 
    vector<string> const dirs = VectorizeString(Path.substr(Parent.size()), '/');
index f57a72d..9de2270 100644 (file)
@@ -103,12 +103,12 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
       }
    }
 
+   enum  { DETACHED, CLEARSIGNED } releaseSignature = (FileGPG != File) ? DETACHED : CLEARSIGNED;
    std::vector<std::string> dataHeader;
    char * sig = NULL;
    char * data = NULL;
 
-   // file with detached signature
-   if (FileGPG != File)
+   if (releaseSignature == DETACHED)
    {
       Args.push_back(FileGPG.c_str());
       Args.push_back(File.c_str());
@@ -181,7 +181,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
       putenv((char *)"LC_MESSAGES=");
    }
 
-   if (FileGPG != File)
+   if (releaseSignature == DETACHED)
    {
       execvp(gpgvpath.c_str(), (char **) &Args[0]);
       ioprintf(std::cerr, "Couldn't execute %s to check %s", Args[0], File.c_str());
@@ -260,8 +260,7 @@ bool SplitClearSignedFile(std::string const &InFile, FileFd * const ContentFile,
 
    char *buf = NULL;
    size_t buf_size = 0;
-   ssize_t line_len = 0;
-   while ((line_len = getline(&buf, &buf_size, in)) != -1)
+   while (getline(&buf, &buf_size, in) != -1)
    {
       _strrstrip(buf);
       if (found_message_start == false)
@@ -355,7 +354,7 @@ bool OpenMaybeClearSignedFile(std::string const &ClearSignedFileName, FileFd &Me
       return _error->Error("Couldn't open temporary file to work with %s", ClearSignedFileName.c_str());
 
    _error->PushToStack();
-   bool const splitDone = SplitClearSignedFile(ClearSignedFileName.c_str(), &MessageFile, NULL, NULL);
+   bool const splitDone = SplitClearSignedFile(ClearSignedFileName, &MessageFile, NULL, NULL);
    bool const errorDone = _error->PendingError();
    _error->MergeWithStack();
    if (splitDone == false)
index b4c768d..890573d 100644 (file)
@@ -129,13 +129,12 @@ bool Hashes::AddFD(int const Fd,unsigned long long Size, bool const addMD5,
                   bool const addSHA1, bool const addSHA256, bool const addSHA512)
 {
    unsigned char Buf[64*64];
-   ssize_t Res = 0;
-   int ToEOF = (Size == 0);
+   bool const ToEOF = (Size == 0);
    while (Size != 0 || ToEOF)
    {
       unsigned long long n = sizeof(Buf);
       if (!ToEOF) n = std::min(Size, n);
-      Res = read(Fd,Buf,n);
+      ssize_t const Res = read(Fd,Buf,n);
       if (Res < 0 || (!ToEOF && Res != (ssize_t) n)) // error, or short read
         return false;
       if (ToEOF && Res == 0) // EOF
index 289e43a..d021777 100644 (file)
@@ -9,13 +9,12 @@
 /* */
 bool SummationImplementation::AddFD(int const Fd, unsigned long long Size) {
    unsigned char Buf[64 * 64];
-   ssize_t Res = 0;
-   int ToEOF = (Size == 0);
+   bool const ToEOF = (Size == 0);
    while (Size != 0 || ToEOF)
    {
       unsigned long long n = sizeof(Buf);
       if (!ToEOF) n = std::min(Size, n);
-      Res = read(Fd, Buf, n);
+      ssize_t const Res = read(Fd, Buf, n);
       if (Res < 0 || (!ToEOF && Res != (ssize_t) n)) // error, or short read
         return false;
       if (ToEOF && Res == 0) // EOF
@@ -27,7 +26,7 @@ bool SummationImplementation::AddFD(int const Fd, unsigned long long Size) {
 }
 bool SummationImplementation::AddFD(FileFd &Fd, unsigned long long Size) {
    unsigned char Buf[64 * 64];
-   bool ToEOF = (Size == 0);
+   bool const ToEOF = (Size == 0);
    while (Size != 0 || ToEOF)
    {
       unsigned long long n = sizeof(Buf);
index a176da6..51e8eb3 100644 (file)
@@ -352,6 +352,12 @@ unsigned long DynamicMMap::RawAllocate(unsigned long long Size,unsigned long Aln
    size in the file. */
 unsigned long DynamicMMap::Allocate(unsigned long ItemSize)
 {
+   if (unlikely(ItemSize == 0))
+   {
+      _error->Fatal("Can't allocate an item of size zero");
+      return 0;
+   }
+
    // Look for a matching pool entry
    Pool *I;
    Pool *Empty = 0;
@@ -412,7 +418,7 @@ unsigned long DynamicMMap::WriteString(const char *String,
 
    unsigned long const Result = RawAllocate(Len+1,0);
 
-   if (Result == 0 && _error->PendingError())
+   if (Base == NULL || (Result == 0 && _error->PendingError()))
       return 0;
 
    memcpy((char *)Base + Result,String,Len);
index 506ebf6..91893c4 100644 (file)
@@ -568,7 +568,6 @@ void pkgDPkgPM::ProcessDpkgStatusLine(char *line)
    std::string prefix = APT::String::Strip(list[0]);
    std::string pkgname;
    std::string action;
-   ostringstream status;
 
    // "processing" has the form "processing: action: pkg or trigger"
    // with action = ["install", "configure", "remove", "purge", "disappear",
@@ -1662,7 +1661,7 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
    io_errors.push_back(string("failed in write on buffer copy for %s"));
    io_errors.push_back(string("short read on buffer copy for %s"));
 
-   for (vector<string>::iterator I = io_errors.begin(); I != io_errors.end(); I++)
+   for (vector<string>::iterator I = io_errors.begin(); I != io_errors.end(); ++I)
    {
       vector<string> list = VectorizeString(dgettext("dpkg", (*I).c_str()), '%');
       if (list.size() > 1) {
@@ -1777,13 +1776,11 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
    string histfile_name = _config->FindFile("Dir::Log::History");
    if (!histfile_name.empty())
    {
-      FILE *log = NULL;
-      char buf[1024];
-
       fprintf(report, "DpkgHistoryLog:\n");
-      log = fopen(histfile_name.c_str(),"r");
+      FILE* log = fopen(histfile_name.c_str(),"r");
       if(log != NULL)
       {
+        char buf[1024];
         while( fgets(buf, sizeof(buf), log) != NULL)
            fprintf(report, " %s", buf);
         fclose(log);
index fe065da..a3a4cc0 100644 (file)
@@ -242,7 +242,7 @@ PackageManagerFancy::~PackageManagerFancy()
 void PackageManagerFancy::staticSIGWINCH(int signum)
 {
    std::vector<PackageManagerFancy *>::const_iterator I;
-   for(I = instances.begin(); I != instances.end(); I++)
+   for(I = instances.begin(); I != instances.end(); ++I)
       (*I)->HandleSIGWINCH(signum);
 }
 
index fbb66d2..44a766c 100644 (file)
@@ -61,7 +61,7 @@ class PackageNameMatcher : public Matcher                             /*{{{*/
   public:
    PackageNameMatcher(const char **patterns)
    {
-      for(int i=0; patterns[i] != NULL; i++)
+      for(int i=0; patterns[i] != NULL; ++i)
       {
          std::string pattern = patterns[i];
 #ifdef PACKAGE_MATCHER_ABI_COMPAT
@@ -79,12 +79,12 @@ class PackageNameMatcher : public Matcher                           /*{{{*/
    }
    virtual ~PackageNameMatcher()
    {
-      for(J=filters.begin(); J != filters.end(); J++)
+      for(J=filters.begin(); J != filters.end(); ++J)
          delete *J;
    }
    virtual bool operator () (const pkgCache::PkgIterator &P) 
    {
-      for(J=filters.begin(); J != filters.end(); J++)
+      for(J=filters.begin(); J != filters.end(); ++J)
       {
          APT::CacheFilter::PackageMatcher *cachefilter = *J;
          if((*cachefilter)(P)) 
@@ -105,7 +105,7 @@ void ListAllVersions(pkgCacheFile &CacheFile, pkgRecords &records,  /*{{{*/
                      bool include_summary=true)
 {
    for (pkgCache::VerIterator Ver = P.VersionList();
-        Ver.end() == false; Ver++) 
+        Ver.end() == false; ++Ver)
    {
       ListSingleVersion(CacheFile, records, Ver, outs, include_summary);
       outs << "\n";
@@ -146,7 +146,7 @@ bool List(CommandLine &Cmd)
                             Cache->Head().PackageCount,
                             _("Listing"));
    GetLocalitySortedVersionSet(CacheFile, bag, matcher, progress);
-   for (LocalitySortedVersionSet::iterator V = bag.begin(); V != bag.end(); V++)
+   for (LocalitySortedVersionSet::iterator V = bag.begin(); V != bag.end(); ++V)
    {
       std::stringstream outs;
       if(_config->FindB("APT::Cmd::All-Versions", false) == true)
@@ -163,7 +163,7 @@ bool List(CommandLine &Cmd)
 
    // FIXME: SORT! and make sorting flexible (alphabetic, by pkg status)
    // output the sorted map
-   for (K = output_map.begin(); K != output_map.end(); K++)
+   for (K = output_map.begin(); K != output_map.end(); ++K)
       std::cout << (*K).second << std::endl;
 
 
index 9d7f361..0b1a929 100644 (file)
@@ -61,18 +61,18 @@ bool FullTextSearch(CommandLine &CmdL)                                      /*{{{*/
    progress.OverallProgress(50, 100, 50,  _("Full Text Search"));
    progress.SubProgress(bag.size());
    int Done = 0;
-   for ( ;V != bag.end(); V++)
+   for ( ;V != bag.end(); ++V)
    {
       if (Done%500 == 0)
          progress.Progress(Done);
-      Done++;
+      ++Done;
       
       int i;
       pkgCache::DescIterator Desc = V.TranslatedDescription();
       pkgRecords::Parser &parser = records.Lookup(Desc.FileList());
      
       bool all_found = true;
-      for(i=0; patterns[i] != NULL; i++) 
+      for(i=0; patterns[i] != NULL; ++i)
       {
          // FIXME: use regexp instead of simple find()
          const char *pattern = patterns[i];
@@ -93,7 +93,7 @@ bool FullTextSearch(CommandLine &CmdL)                                        /*{{{*/
 
    // FIXME: SORT! and make sorting flexible (alphabetic, by pkg status)
    // output the sorted map
-   for (K = output_map.begin(); K != output_map.end(); K++)
+   for (K = output_map.begin(); K != output_map.end(); ++K)
       std::cout << (*K).second << std::endl;
 
    return true;
index 463e4b4..0ced500 100644 (file)
@@ -5,22 +5,23 @@ unset GREP_OPTIONS
 
 GPG_CMD="gpg --ignore-time-conflict --no-options --no-default-keyring"
 
-# gpg needs a trustdb to function, but it can't be invalid (not even empty)
-# so we create a temporary directory to store our fresh readable trustdb in
-TRUSTDBDIR="$(mktemp -d)"
-CURRENTTRAP="${CURRENTTRAP} rm -rf '${TRUSTDBDIR}';"
+# gpg needs (in different versions more or less) files to function correctly,
+# so we give it its own homedir and generate some valid content for it
+GPGHOMEDIR="$(mktemp -d)"
+CURRENTTRAP="${CURRENTTRAP} rm -rf '${GPGHOMEDIR}';"
 trap "${CURRENTTRAP}" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
-chmod 700 "$TRUSTDBDIR"
-# We also don't use a secret keyring, of course, but gpg panics and
+chmod 700 "$GPGHOMEDIR"
+# We don't use a secret keyring, of course, but gpg panics and
 # implodes if there isn't one available - and writeable for imports
-SECRETKEYRING="${TRUSTDBDIR}/secring.gpg"
+SECRETKEYRING="${GPGHOMEDIR}/secring.gpg"
 touch $SECRETKEYRING
-GPG_CMD="$GPG_CMD --secret-keyring $SECRETKEYRING"
-GPG_CMD="$GPG_CMD --trustdb-name ${TRUSTDBDIR}/trustdb.gpg"
-
-# now create the trustdb with an (empty) dummy keyring
-$GPG_CMD --quiet --check-trustdb --keyring $SECRETKEYRING
-# and make sure that gpg isn't trying to update the file
+GPG_CMD="$GPG_CMD --homedir $GPGHOMEDIR"
+# create the trustdb with an (empty) dummy keyring
+# older gpgs required it, newer gpgs even warn that it isn't needed,
+# but require it nontheless for some commands, so we just play safe
+# here for the foreseeable future and create a dummy one
+$GPG_CMD --quiet --check-trustdb --keyring $SECRETKEYRING >/dev/null 2>&1
+# tell gpg that it shouldn't try to maintain a trustdb file
 GPG_CMD="$GPG_CMD --no-auto-check-trustdb --trust-model always"
 
 GPG="$GPG_CMD"
index c70d0e9..f3303e8 100644 (file)
@@ -9,7 +9,7 @@ Build-Depends: dpkg-dev (>= 1.15.8), debhelper (>= 8.1.3~), libdb-dev,
  gettext (>= 0.12), libcurl4-gnutls-dev (>= 7.19.4~),
  zlib1g-dev, libbz2-dev, xsltproc, docbook-xsl, docbook-xml,
  po4a (>= 0.34-2), autotools-dev, autoconf, automake
-Build-Depends-Indep: doxygen, debiandoc-sgml
+Build-Depends-Indep: doxygen, debiandoc-sgml, graphviz
 Build-Conflicts: autoconf2.13, automake1.4
 Vcs-Git: git://anonscm.debian.org/apt/apt.git
 Vcs-Browser: http://anonscm.debian.org/gitweb/?p=apt/apt.git
index a0087cd..9ebbd96 100644 (file)
@@ -880,7 +880,7 @@ HTML_OUTPUT            = html
 # each generated HTML page (for example: .htm,.php,.asp). If it is left blank
 # doxygen will generate files with .html extension.
 
-HTML_FILE_EXTENSION    = .html
+HTML_FILE_EXTENSION    = .xhtml
 
 # The HTML_HEADER tag can be used to specify a personal HTML header for
 # each generated HTML page. If it is left blank doxygen will generate a
@@ -1715,7 +1715,7 @@ DOT_NUM_THREADS        = 0
 # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
 # directory containing the font.
 
-DOT_FONTNAME           = FreeSans
+DOT_FONTNAME           =
 
 # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
 # The default size is 10pt.
@@ -1815,7 +1815,7 @@ DIRECTORY_GRAPH        = YES
 # HTML_FILE_EXTENSION to xhtml in order to make the SVG files
 # visible in IE 9+ (other browsers do not have this requirement).
 
-DOT_IMAGE_FORMAT       = png
+DOT_IMAGE_FORMAT       = svg
 
 # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
 # enable generation of interactive SVG images that allow zooming and panning.
@@ -1824,7 +1824,7 @@ DOT_IMAGE_FORMAT       = png
 # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
 # visible. Older versions of IE do not have SVG support.
 
-INTERACTIVE_SVG        = NO
+INTERACTIVE_SVG        = YES
 
 # The tag DOT_PATH can be used to specify the path where the dot tool can be
 # found. If left blank, it is assumed the dot tool can be found in the path.
index 3c9799f..61f99ee 100644 (file)
@@ -1,14 +1,29 @@
-# Translation of apt-doc to German
-# Copyright (C) 1997, 1998, 1999 Jason Gunthorpe and others.
-# This file is distributed under the same license as the apt-doc package.
-# Chris Leick <c.leick@vollbio.de>, 2009-2012.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
+#, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: apt-doc 0.9.7\n"
-"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-01-25 22:21+0100\n"
-"PO-Revision-Date: 2012-06-25 22:49+0100\n"
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: 2014-01-26 08:14+0100\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#~ # Translation of apt-doc to German
+#~ # Copyright (C) 1997, 1998, 1999 Jason Gunthorpe and others.
+#~ # This file is distributed under the same license as the apt-doc package.
+#~ # Chris Leick <c.leick@vollbio.de>, 2009-2014.
+#~ #
+#~ msgid ""
+#~ msgstr ""
+#~ "Project-Id-Version: apt-doc 0.9.14.2\n"
+#~ "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
+"POT-Creation-Date: 2014-01-24 12:29+0100\n"
+"PO-Revision-Date: 2014-01-21 20:59+0100\n"
 "Last-Translator: Chris Leick <c.leick@vollbio.de>\n"
 "Language-Team: German <debian-l10n-german@lists.debian.org>\n"
 "Language: de\n"
@@ -1334,6 +1349,14 @@ msgid ""
 "will never remove packages, only allow adding new ones.  Configuration Item: "
 "<literal>APT::Get::Upgrade-Allow-New</literal>."
 msgstr ""
+"erlaubt das Installieren neuer Pakete, wenn es zusammen mit "
+"<literal>upgrade</literal> benutzt wird. Dies ist nützlich, falls das "
+"Aktualisieren eines installierten Pakets zur Installation neue "
+"Abhängigkeiten hat. Anstatt das Paket zurückzuhalten, wird <literal>upgrade</"
+"literal> ein Upgrade des Pakets durchführen und die neuen Abhängigkeiten "
+"installieren. Beachten Sie, dass <literal>upgrade</literal> mit dieser "
+"Option niemals Pakete entfernen, sondern nur das Hinzufügen neuer gestatten "
+"wird.Konfigurationselement: <literal>APT::Get::Upgrade-Allow-New</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:407
@@ -1553,6 +1576,7 @@ msgstr ""
 "fragen. Dies ist für Werkzeuge wie pbuilder nützlich. Konfigurationselement: "
 "<literal>APT::Get::AllowUnauthenticated</literal>."
 
+# FIXME s/Item/Items/
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:527
 msgid ""
@@ -1562,6 +1586,12 @@ msgid ""
 "Item: <literal>DpkgPM::Progress</literal> and <literal>Dpkg::Progress-Fancy</"
 "literal>."
 msgstr ""
+"zeigt benutzerfreundliche Fortschrittsinformationen im Terminalfenster, wenn "
+"Pakete installiert beziehungsweise entfernt werden oder ein Upgrade "
+"durchgeführt wird. Informationen über eine maschinell auswertbare Version "
+"dieser Daten finden Sie in README.progress-reporting im Apt-doc-Verzeichnis. "
+"Konfigurationselemente: <literal>DpkgPM::Progress</literal> und "
+"<literal>Dpkg::Progress-Fancy</literal>."
 
 #. type: Content of: <refentry><refsect1><title>
 #: apt-get.8.xml:540 apt-cache.8.xml:345 apt-key.8.xml:176 apt-mark.8.xml:127
@@ -2900,20 +2930,14 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-cdrom.8.xml:87
-#, fuzzy
-#| msgid ""
-#| "Mount point; specify the location to mount the CD-ROM. This mount point "
-#| "must be listed in <filename>/etc/fstab</filename> and properly "
-#| "configured.  Configuration Item: <literal>Acquire::cdrom::mount</literal>."
 msgid ""
 "Do not try to auto-detect the CD-ROM path. Usually combined with the "
 "<option>--cdrom</option> option.  Configuration Item: <literal>Acquire::"
 "cdrom::AutoDetect</literal>."
 msgstr ""
-"Einhängepunkt; gibt den Ort an, an dem die CD-ROM eingehängt wird. Dieser "
-"Einhängepunkt muss in <filename>/etc/fstab</filename> eingetragen und "
-"angemessen konfiguriert sein. Konfigurationselement: <literal>Acquire::"
-"cdrom::mount</literal>."
+"versucht nicht, den CD-ROM-Pfad automatisch zu bestimmen. Dies wird "
+"üblicherweise mit der Option <option>--cdrom</option> kombiniert. "
+"Konfigurationselement: <literal>Acquire::cdrom::AutoDetect</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-cdrom.8.xml:95
@@ -3894,13 +3918,6 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:391
-#, fuzzy
-#| msgid ""
-#| "The used bandwidth can be limited with <literal>Acquire::http::Dl-Limit</"
-#| "literal> which accepts integer values in kilobytes. The default value is "
-#| "0 which deactivates the limit and tries to use all available bandwidth "
-#| "(note that this option implicitly disables downloading from multiple "
-#| "servers at the same time.)"
 msgid ""
 "The used bandwidth can be limited with <literal>Acquire::http::Dl-Limit</"
 "literal> which accepts integer values in kilobytes per second. The default "
@@ -3909,11 +3926,11 @@ msgid ""
 "multiple servers at the same time."
 msgstr ""
 "Die benutzte Bandbreite kann durch <literal>Acquire::http::Dl-Limit</"
-"literal> eingeschränkt werden, was Ganzzahlwerte in Kilobyte akzeptiert. Der "
-"Vorgabewert ist 0, was die Beschränkung ausschaltet und versucht, sämtliche "
-"verfügbare Bandbreite zu benutzen. (Beachten Sie, dass diese Optionen "
-"implizit das Herunterladen von mehreren Servern zur gleichen Zeit "
-"deaktiviert.)"
+"literal> eingeschränkt werden, was Ganzzahlwerte in Kilobyte pro Sekunde "
+"akzeptiert. Der Vorgabewert ist 0, was die Beschränkung ausschaltet und "
+"versucht, sämtliche verfügbare Bandbreite zu benutzen. Beachten Sie, dass "
+"diese Optionen implizit das Herunterladen von mehreren Servern zur gleichen "
+"Zeit deaktiviert."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:398
@@ -3940,6 +3957,15 @@ msgid ""
 "takes precedence over the legacy option name <literal>ProxyAutoDetect</"
 "literal>."
 msgstr ""
+"<literal>Acquire::http::Proxy-Auto-Detect</literal> kann benutzt werden, um "
+"einen externen Befehl zum Auffinden des HTTP-Proxys anzugeben, der benutzt "
+"werden soll. APT erwartet den Befehl zum Ausgeben auf der Standardausgabe "
+"imStil <literal>http://proxy:port/</literal>. Dies wird das typische "
+"<literal>Acquire::http::Proxy</literal> außer Kraft setzen, aber keine "
+"spezielle per <literal>Acquire::http::Proxy::$HOST</literal> gesetzte Proxy-"
+"Rechnerkonfiguration. Eine Beispielimplementierung, die Avahi benutzt, "
+"finden Sie im Paket &squid-deb-proxy-client;. Diese Option hat Vorrang vor "
+"dem veralteten Optionsnamen <literal>ProxyAutoDetect</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:420
@@ -4330,12 +4356,12 @@ msgstr ""
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:576
 msgid "When downloading, force to use only the IPv4 protocol."
-msgstr ""
+msgstr "Beim Herunterladen wird die Verwendung des IPv4-Protokolls erzwungen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:582
 msgid "When downloading, force to use only the IPv6 protocol."
-msgstr ""
+msgstr "Beim Herunterladen wird die Verwendung des IPv6-Protokolls erzwungen."
 
 #. type: Content of: <refentry><refsect1><title>
 #: apt.conf.5.xml:589
@@ -4575,13 +4601,6 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:703
-#, fuzzy
-#| msgid ""
-#| "This is a list of shell commands to run before invoking &dpkg;. Like "
-#| "<literal>options</literal> this must be specified in list notation. The "
-#| "commands are invoked in order using <filename>/bin/sh</filename>; should "
-#| "any fail APT will abort. APT will pass the filenames of all .deb files it "
-#| "is going to install to the commands, one per line on standard input."
 msgid ""
 "This is a list of shell commands to run before invoking &dpkg;. Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4595,17 +4614,12 @@ msgstr ""
 "Listenschreibweise angegeben werden. Die Befehle werden der Reihenfolge nach "
 "mit <filename>/bin/sh</filename> aufgerufen, sollte einer fehlschlagen, wird "
 "APT abgebrochen. APT wird den Befehlen die Dateinamen aller .deb-Dateien, "
-"die es installieren wird, auf der Standardeingabe übergeben, einen pro Zeile."
+"die es installieren wird, einen pro Zeile, an den angeforderten "
+"standardmäßig auf die Standardeingabe verweisenden Dateideskriptor, "
+"übergeben."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:710
-#, fuzzy
-#| msgid ""
-#| "Version 2 of this protocol dumps more information, including the protocol "
-#| "version, the APT configuration space and the packages, files and versions "
-#| "being changed. Version 2 is enabled by setting <literal>DPkg::Tools::"
-#| "options::cmd::Version</literal> to 2. <literal>cmd</literal> is a command "
-#| "given to <literal>Pre-Install-Pkgs</literal>."
 msgid ""
 "Version 2 of this protocol dumps more information, including the protocol "
 "version, the APT configuration space and the packages, files and versions "
@@ -4614,10 +4628,8 @@ msgid ""
 msgstr ""
 "Version 2 dieses Protokolls gibt mehr Informationen aus, einschließlich der "
 "Protokollversion, dem APT-Konfigurationsraum und den Paketen, Dateien und "
-"den Versionen, die geändert werden. Version 2 wird durch Setzen von "
-"<literal>DPkg::Tools::options::cmd::Version</literal> auf 2 eingeschaltet. "
-"<literal>cmd</literal> ist ein Befehl, der an <literal>Pre-Install-Pkgs</"
-"literal> gegeben wird."
+"den Versionen, die geändert werden. Version 3 fügt jeder ausgegebenen "
+"Version die Architektur und den <literal>MultiArch</literal>-Schalter hinzu."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:715
@@ -4629,6 +4641,13 @@ msgid ""
 "the requested version it will send the information in the highest version it "
 "has support for instead."
 msgstr ""
+"Die Protokollversion, die für den Befehl <literal><replaceable>Befehl</"
+"replaceable></literal> benutzt werden soll, kann durch entsprechendes Setzen "
+"von <literal>DPkg::Tools::options::<replaceable>Befehl</replaceable>::"
+"Version</literal> ausgewählt werden, Voreinstellung ist Version 1. Falls APT "
+"die angefragte Version nicht unterstützt, wird es stattdessen die "
+"Informationen in der höchsten Version senden, für die es Unterstützung "
+"bietet."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:722
@@ -4640,6 +4659,13 @@ msgid ""
 "looking for the environment variable <envar>APT_HOOK_INFO_FD</envar> which "
 "contains the number of the used file descriptor as a confirmation."
 msgstr ""
+"Der Dateideskriptor, der zum Senden der Informationen benutzt wird, kann mit "
+"<literal>DPkg::Tools::options::<replaceable>Befehl</replaceable>::InfoFD</"
+"literal> abgefragt werden. Er ist standardmäßig <literal>0</literal> für die "
+"Standardeingabe und seit Version 0.9.11 verfügbar. Unterstützung für die "
+"Option können Sie finden, indem Sie in die Umgebungsvariable "
+"<envar>APT_HOOK_INFO_FD</envar> schauen. Sie enthält die Nummer des "
+"verwendeten Dateideskriptors als eine Bestätigung."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:732
@@ -6879,26 +6905,19 @@ msgstr ""
 "heruntergeladen."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: sources.list.5.xml:146
-#, fuzzy
-#| msgid ""
-#| "<literal>arch=<replaceable>arch1</replaceable>,<replaceable>arch2</"
-#| "replaceable>,…</literal> can be used to specify for which architectures "
-#| "information should be downloaded. If this option is not set all "
-#| "architectures defined by the <literal>APT::Architectures</literal> option "
-#| "will be downloaded."
+#: sources.list.5.xml:124
 msgid ""
 "<literal>arch+=<replaceable>arch1</replaceable>,<replaceable>arch2</"
 "replaceable>,…</literal> and <literal>arch-=<replaceable>arch1</replaceable>,"
 "<replaceable>arch2</replaceable>,…</literal> which can be used to add/remove "
 "architectures from the set which will be downloaded."
 msgstr ""
-"<literal>arch=<replaceable>Architektur1</replaceable>,"
-"<replaceable>Architektur2</replaceable>, …</literal> kann benutzt werden, um "
-"anzugeben, für welche Architekturen Paketinformationen heruntergeladen "
-"werden sollen. Falls diese Option nicht gesetzt ist, werden alle durch die "
-"Option <literal>APT::Architectures</literal> definierten Architekturen "
-"heruntergeladen."
+"<literal>arch+=<replaceable>Architektur1</replaceable>,"
+"<replaceable>Architektur2</replaceable>, …</literal> und <literal>arch-"
+"=<replaceable>Architektur1</replaceable>,<replaceable>Architektur2</"
+"replaceable>, …</literal>, die benutzt werden können, um der "
+"Zusammenstellung, die heruntergeladen werden soll, Architekturen "
+"hinzuzufügen oder zu entfernen."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
 #: sources.list.5.xml:149
@@ -8749,18 +8768,9 @@ msgstr ""
 
 #. type: <p></p>
 #: guide.sgml:163
-#, fuzzy
-#| msgid ""
-#| "<prgn>apt-get</prgn> has several command line options that are detailed "
-#| "in its man page, <manref section=\"8\" name=\"apt-get\">. The most useful "
-#| "option is <tt>-d</tt> which does not install the fetched files. If the "
-#| "system has to download a large number of package it would be undesired to "
-#| "start installing them in case something goes wrong. When <tt>-d</tt> is "
-#| "used the downloaded archives can be installed by simply running the "
-#| "command that caused them to be downloaded again without <tt>-d</tt>."
 msgid ""
 "<prgn>apt-get</prgn> has several command line options that are detailed in "
-"its man page, <manref name=\"apt-get\" section=\"8\">. The most useful "
+"its man page, <manref section=\"8\" name=\"apt-get\">. The most useful "
 "option is <tt>-d</tt> which does not install the fetched files. If the "
 "system has to download a large number of package it would be undesired to "
 "start installing them in case something goes wrong. When <tt>-d</tt> is used "
index 015c790..80fe6e1 100644 (file)
@@ -233,7 +233,7 @@ void GenContents::Add(const char *Dir,const char *Package)
    
    // The final component if it does not have a trailing /
    if (I - Start >= 1)
-      Root = Grab(Root,Start,Package);
+      Grab(Root,Start,Package);
 }
                                                                        /*}}}*/
 // GenContents::WriteSpace - Write a given number of white space chars /*{{{*/
index 1fea589..265fb1a 100644 (file)
@@ -21,9 +21,9 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/md5.h>
 
+#include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <utime.h>
 #include <unistd.h>
 #include <iostream>
 
@@ -234,14 +234,12 @@ bool MultiCompress::Finalize(unsigned long long &OutSize)
       else
       {
         // Update the mtime if necessary
-        if (UpdateMTime > 0 && 
+        if (UpdateMTime > 0 &&
             (Now - St.st_mtime > (signed)UpdateMTime || St.st_mtime > Now))
         {
-           struct utimbuf Buf;
-           Buf.actime = Buf.modtime = Now;
-           utime(I->Output.c_str(),&Buf);
+           utimensat(AT_FDCWD, I->Output.c_str(), NULL, AT_SYMLINK_NOFOLLOW);
            Changed = true;
-        }           
+        }
       }
       
       // Force the file permissions
index 1288ff1..d2130db 100644 (file)
@@ -52,45 +52,41 @@ bool Override::ReadOverride(string const &File,bool const &Source)
       if (*Pkg == 0)
         continue;
 
+#define APT_FIND_NEXT_FIELD \
+      for (End++; isspace(*End) != 0 && *End != 0; ++End) \
+        /* skip spaces */ ; \
+      Start = End; \
+      for (; isspace(*End) == 0 && *End != 0; ++End) \
+        /* find end of word */ ;
+
+#define APT_WARNING_MALFORMED_LINE(FIELD) \
+      if (*End == 0) \
+      { \
+        _error->Warning(_("Malformed override %s line %llu (%s)"),File.c_str(), \
+                        Counter, FIELD ); \
+        continue; \
+      } \
+      *End = 0;
+
       // Find the package and zero..
-      char *Start = Pkg;
+      char *Start;
       char *End = Pkg;
       for (; isspace(*End) == 0 && *End != 0; End++);
-      if (*End == 0)
-      {
-        _error->Warning(_("Malformed override %s line %llu #1"),File.c_str(),
-                        Counter);
-        continue;
-      }      
-      *End = 0;
+      APT_WARNING_MALFORMED_LINE("pkgname");
+
+      APT_FIND_NEXT_FIELD;
 
       // Find the priority
       if (Source == false)
       {
-        for (End++; isspace(*End) != 0 && *End != 0; End++);
-        Start = End;
-        for (; isspace(*End) == 0 && *End != 0; End++);
-        if (*End == 0)
-        {
-           _error->Warning(_("Malformed override %s line %llu #2"),File.c_str(),
-                           Counter);
-           continue;
-        }
-        *End = 0;
+        APT_WARNING_MALFORMED_LINE("priority");
         Itm.Priority = Start;
+
+        APT_FIND_NEXT_FIELD;
       }
-      
+
       // Find the Section
-      for (End++; isspace(*End) != 0 && *End != 0; End++);
-      Start = End;
-      for (; isspace(*End) == 0 && *End != 0; End++);
-      if (*End == 0)
-      {
-        _error->Warning(_("Malformed override %s line %llu #3"),File.c_str(),
-                        Counter);
-        continue;
-      }      
-      *End = 0;
+      APT_WARNING_MALFORMED_LINE("section");
       Itm.FieldOverride["Section"] = Start;
 
       // Source override files only have the two columns
@@ -99,7 +95,7 @@ bool Override::ReadOverride(string const &File,bool const &Source)
         Mapping[Pkg] = Itm;
         continue;
       }
-      
+
       // Find the =>
       for (End++; isspace(*End) != 0 && *End != 0; End++);
       if (*End != 0)
index fc7a72e..d9c9a1d 100644 (file)
@@ -142,9 +142,9 @@ bool Connect(std::string Host,int Port,const char *Service,int DefPort,int &Fd,
    // Convert the port name/number
    char ServStr[300];
    if (Port != 0)
-      snprintf(ServStr,sizeof(ServStr),"%u",Port);
+      snprintf(ServStr,sizeof(ServStr),"%i", Port);
    else
-      snprintf(ServStr,sizeof(ServStr),"%s",Service);
+      snprintf(ServStr,sizeof(ServStr),"%s", Service);
    
    /* We used a cached address record.. Yes this is against the spec but
       the way we have setup our rotating dns suggests that this is more
@@ -190,7 +190,7 @@ bool Connect(std::string Host,int Port,const char *Service,int DefPort,int &Fd,
            {
               if (DefPort != 0)
               {
-                 snprintf(ServStr,sizeof(ServStr),"%u",DefPort);
+                 snprintf(ServStr, sizeof(ServStr), "%i", DefPort);
                  DefPort = 0;
                  continue;
               }
index e81d002..744cc2b 100644 (file)
@@ -18,7 +18,6 @@
 #include <apt-pkg/hashes.h>
 
 #include <sys/stat.h>
-#include <utime.h>
 #include <unistd.h>
 #include <apti18n.h>
                                                                        /*}}}*/
@@ -71,18 +70,19 @@ bool CopyMethod::Fetch(FetchItem *Itm)
    }
 
    From.Close();
-   To.Close();
-   
+
    // Transfer the modification times
-   struct utimbuf TimeBuf;
-   TimeBuf.actime = Buf.st_atime;
-   TimeBuf.modtime = Buf.st_mtime;
-   if (utime(Itm->DestFile.c_str(),&TimeBuf) != 0)
+   struct timespec times[2];
+   times[0].tv_sec = Buf.st_atime;
+   times[1].tv_sec = Buf.st_mtime;
+   times[0].tv_nsec = times[1].tv_nsec = 0;
+   if (futimens(To.Fd(), times) != 0)
    {
       To.OpFail();
-      return _error->Errno("utime",_("Failed to set modification time"));
+      return _error->Errno("futimens",_("Failed to set modification time"));
    }
-   
+   To.Close();
+
    Hashes Hash;
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
    Hash.AddFD(Fd);
index 979adca..2d05364 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <sys/stat.h>
 #include <sys/time.h>
-#include <utime.h>
 #include <unistd.h>
 #include <signal.h>
 #include <stdio.h>
@@ -953,14 +952,16 @@ void FtpMethod::SigTerm(int)
 {
    if (FailFd == -1)
       _exit(100);
-   close(FailFd);
-   
+
    // Timestamp
-   struct utimbuf UBuf;
-   UBuf.actime = FailTime;
-   UBuf.modtime = FailTime;
-   utime(FailFile.c_str(),&UBuf);
-   
+   struct timespec times[2];
+   times[0].tv_sec = FailTime;
+   times[1].tv_sec = FailTime;
+   times[0].tv_nsec = times[1].tv_nsec = 0;
+   futimens(FailFd, times);
+
+   close(FailFd);
+
    _exit(100);
 }
                                                                        /*}}}*/
@@ -1059,13 +1060,14 @@ bool FtpMethod::Fetch(FetchItem *Itm)
       if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing) == false)
       {
         Fd.Close();
-        
+
         // Timestamp
-        struct utimbuf UBuf;
-        UBuf.actime = FailTime;
-        UBuf.modtime = FailTime;
-        utime(FailFile.c_str(),&UBuf);
-        
+        struct timespec times[2];
+        times[0].tv_sec = FailTime;
+        times[1].tv_sec = FailTime;
+        times[0].tv_nsec = times[1].tv_nsec = 0;
+        futimens(FailFd, times);
+
         // If the file is missing we hard fail and delete the destfile
         // otherwise transient fail
         if (Missing == true) {
@@ -1077,20 +1079,21 @@ bool FtpMethod::Fetch(FetchItem *Itm)
       }
 
       Res.Size = Fd.Size();
+
+      // Timestamp
+      struct timespec times[2];
+      times[0].tv_sec = FailTime;
+      times[1].tv_sec = FailTime;
+      times[0].tv_nsec = times[1].tv_nsec = 0;
+      futimens(Fd.Fd(), times);
+      FailFd = -1;
    }
-   
+
    Res.LastModified = FailTime;
    Res.TakeHashes(Hash);
-   
-   // Timestamp
-   struct utimbuf UBuf;
-   UBuf.actime = FailTime;
-   UBuf.modtime = FailTime;
-   utime(Queue->DestFile.c_str(),&UBuf);
-   FailFd = -1;
 
    URIDone(Res);
-   
+
    return true;
 }
                                                                        /*}}}*/
index 48c8e98..f1edb35 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <sys/stat.h>
 #include <unistd.h>
-#include <utime.h>
 #include <stdio.h>
 #include <errno.h>
 #include <apti18n.h>
@@ -94,32 +93,35 @@ bool GzipMethod::Fetch(FetchItem *Itm)
    }
    
    From.Close();
-   To.Close();
-   
+
    if (Failed == true)
       return false;
-   
+
    // Transfer the modification times
    struct stat Buf;
    if (stat(Path.c_str(),&Buf) != 0)
       return _error->Errno("stat",_("Failed to stat"));
 
-   struct utimbuf TimeBuf;
-   TimeBuf.actime = Buf.st_atime;
-   TimeBuf.modtime = Buf.st_mtime;
-   if (utime(Itm->DestFile.c_str(),&TimeBuf) != 0)
-      return _error->Errno("utime",_("Failed to set modification time"));
+   struct timespec times[2];
+   times[0].tv_sec = Buf.st_atime;
+   times[1].tv_sec = Buf.st_mtime;
+   times[0].tv_nsec = times[1].tv_nsec = 0;
+   if (futimens(To.Fd(), times) != 0)
+   {
+      To.OpFail();
+      return _error->Errno("futimens",_("Failed to set modification time"));
+   }
+   Res.Size = To.FileSize();
+   To.Close();
 
    if (stat(Itm->DestFile.c_str(),&Buf) != 0)
       return _error->Errno("stat",_("Failed to stat"));
-   
+
    // Return a Done response
    Res.LastModified = Buf.st_mtime;
-   Res.Size = Buf.st_size;
    Res.TakeHashes(Hash);
 
    URIDone(Res);
-   
    return true;
 }
                                                                        /*}}}*/
index b22b61e..e1390af 100644 (file)
@@ -97,8 +97,6 @@ void CircleBuf::Reset()
    is non-blocking.. */
 bool CircleBuf::Read(int Fd)
 {
-   unsigned long long BwReadMax;
-
    while (1)
    {
       // Woops, buffer is full
@@ -106,7 +104,7 @@ bool CircleBuf::Read(int Fd)
         return true;
 
       // what's left to read in this tick
-      BwReadMax = CircleBuf::BwReadLimit/BW_HZ;
+      unsigned long long const BwReadMax = CircleBuf::BwReadLimit/BW_HZ;
 
       if(CircleBuf::BwReadLimit) {
         struct timeval now;
index 2a56243..e16e363 100644 (file)
@@ -21,7 +21,6 @@
 
 #include <sys/stat.h>
 #include <sys/time.h>
-#include <utime.h>
 #include <unistd.h>
 #include <signal.h>
 #include <stdio.h>
@@ -405,10 +404,11 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
    curl_easy_getinfo(curl, CURLINFO_FILETIME, &Res.LastModified);
    if (Res.LastModified != -1)
    {
-      struct utimbuf UBuf;
-      UBuf.actime = Res.LastModified;
-      UBuf.modtime = Res.LastModified;
-      utime(File->Name().c_str(),&UBuf);
+      struct timespec times[2];
+      times[0].tv_sec = Res.LastModified;
+      times[1].tv_sec = Res.LastModified;
+      times[0].tv_nsec = times[1].tv_nsec = 0;
+      futimens(File->Fd(), times);
    }
    else
       Res.LastModified = resultStat.st_mtime;
index 8632d6d..89a89d1 100644 (file)
@@ -65,7 +65,7 @@ class HttpsMethod : public pkgAcqMethod
    public:
    FileFd *File;
       
-   HttpsMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig) 
+   HttpsMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig), File(NULL)
    {
       File = 0;
       curl = curl_easy_init();
index 8543663..83ef0d1 100644 (file)
@@ -114,7 +114,7 @@ bool MirrorMethod::Clean(string Dir)
       for(I=list.begin(); I != list.end(); ++I)
       {
         string uri = (*I)->GetURI();
-        if(uri.find("mirror://") != 0)
+        if(uri.compare(0, strlen("mirror://"), "mirror://") != 0)
            continue;
         string BaseUri = uri.substr(0,uri.size()-1);
         if (URItoFileName(BaseUri) == Dir->d_name)
@@ -198,9 +198,9 @@ bool MirrorMethod::RandomizeMirrorFile(string mirror_file)
    // "stable" on the same machine. this is to avoid running into out-of-sync
    // issues (i.e. Release/Release.gpg different on each mirror)
    struct utsname buf;
-   int seed=1, i;
+   int seed=1;
    if(uname(&buf) == 0) {
-      for(i=0,seed=1; buf.nodename[i] != 0; i++) {
+      for(int i=0,seed=1; buf.nodename[i] != 0; ++i) {
          seed = seed * 31 + buf.nodename[i];
       }
    }
@@ -306,7 +306,7 @@ bool MirrorMethod::InitMirrors()
       if (s.size() == 0)
          continue;
       // ignore non http lines
-      if (s.find("http://") != 0)
+      if (s.compare(0, strlen("http://"), "http://") != 0)
          continue;
 
       AllMirrors.push_back(s);
index d76dca6..a441220 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <sys/stat.h>
 #include <sys/time.h>
-#include <utime.h>
 #include <unistd.h>
 #include <signal.h>
 #include <stdio.h>
@@ -395,13 +394,14 @@ void RSHMethod::SigTerm(int sig)
 {
    if (FailFd == -1)
       _exit(100);
-   close(FailFd);
 
-   // Timestamp
-   struct utimbuf UBuf;
-   UBuf.actime = FailTime;
-   UBuf.modtime = FailTime;
-   utime(FailFile.c_str(),&UBuf);
+   // Transfer the modification times
+   struct timespec times[2];
+   times[0].tv_sec = FailTime;
+   times[1].tv_sec = FailTime;
+   times[0].tv_nsec = times[1].tv_nsec = 0;
+   futimens(FailFd, times);
+   close(FailFd);
 
    _exit(100);
 }
@@ -488,10 +488,11 @@ bool RSHMethod::Fetch(FetchItem *Itm)
         Fd.Close();
 
         // Timestamp
-        struct utimbuf UBuf;
-        UBuf.actime = FailTime;
-        UBuf.modtime = FailTime;
-        utime(FailFile.c_str(),&UBuf);
+        struct timespec times[2];
+        times[0].tv_sec = FailTime;
+        times[1].tv_sec = FailTime;
+        times[0].tv_nsec = times[1].tv_nsec = 0;
+        futimens(FailFd, times);
 
         // If the file is missing we hard fail otherwise transient fail
         if (Missing == true)
@@ -501,18 +502,17 @@ bool RSHMethod::Fetch(FetchItem *Itm)
       }
 
       Res.Size = Fd.Size();
+      struct timespec times[2];
+      times[0].tv_sec = FailTime;
+      times[1].tv_sec = FailTime;
+      times[0].tv_nsec = times[1].tv_nsec = 0;
+      futimens(Fd.Fd(), times);
+      FailFd = -1;
    }
 
    Res.LastModified = FailTime;
    Res.TakeHashes(Hash);
 
-   // Timestamp
-   struct utimbuf UBuf;
-   UBuf.actime = FailTime;
-   UBuf.modtime = FailTime;
-   utime(Queue->DestFile.c_str(),&UBuf);
-   FailFd = -1;
-
    URIDone(Res);
 
    return true;
index a212844..e12c23c 100644 (file)
@@ -17,9 +17,9 @@
 #include <apt-pkg/hashes.h>
 #include <apt-pkg/netrc.h>
 
+#include <fcntl.h>
 #include <sys/stat.h>
 #include <sys/time.h>
-#include <utime.h>
 #include <unistd.h>
 #include <signal.h>
 #include <stdio.h>
@@ -368,14 +368,14 @@ void ServerMethod::SigTerm(int)
 {
    if (FailFd == -1)
       _exit(100);
+
+   struct timespec times[2];
+   times[0].tv_sec = FailTime;
+   times[1].tv_sec = FailTime;
+   times[0].tv_nsec = times[1].tv_nsec = 0;
+   futimens(FailFd, times);
    close(FailFd);
-   
-   // Timestamp
-   struct utimbuf UBuf;
-   UBuf.actime = FailTime;
-   UBuf.modtime = FailTime;
-   utime(FailFile.c_str(),&UBuf);
-   
+
    _exit(100);
 }
                                                                        /*}}}*/
@@ -539,11 +539,10 @@ int ServerMethod::Loop()
            File = 0;
            
            // Timestamp
-           struct utimbuf UBuf;
-           time(&UBuf.actime);
-           UBuf.actime = Server->Date;
-           UBuf.modtime = Server->Date;
-           utime(Queue->DestFile.c_str(),&UBuf);
+           struct timespec times[2];
+           times[0].tv_sec = times[1].tv_sec = Server->Date;
+           times[0].tv_nsec = times[1].tv_nsec = 0;
+           utimensat(AT_FDCWD, Queue->DestFile.c_str(), times, AT_SYMLINK_NOFOLLOW);
 
            // Send status to APT
            if (Result == true)
index 4dc6a1f..2b81e61 100644 (file)
@@ -137,7 +137,7 @@ class ServerMethod : public pkgAcqMethod
    virtual ServerState * CreateServerState(URI uri) = 0;
    virtual void RotateDNS() = 0;
 
-   ServerMethod(const char *Ver,unsigned long Flags = 0) : pkgAcqMethod(Ver, Flags), PipelineDepth(0), AllowRedirect(false), Debug(false) {};
+   ServerMethod(const char *Ver,unsigned long Flags = 0) : pkgAcqMethod(Ver, Flags), Server(NULL), File(NULL), PipelineDepth(0), AllowRedirect(false), Debug(false) {};
    virtual ~ServerMethod() {};
 };
 
index ca2f900..5439244 100644 (file)
@@ -3,40 +3,46 @@
 EXIT_CODE=0
 
 # we all like colorful messages
-if expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null && \
-   expr match "$(readlink -f /proc/$$/fd/2)" '/dev/pts/[0-9]\+' > /dev/null; then
-       CERROR="\e[1;31m" # red
-       CWARNING="\e[1;33m" # yellow
-       CMSG="\e[1;32m" # green
-       CINFO="\e[1;96m" # light blue
-       CDEBUG="\e[1;94m" # blue
-       CNORMAL="\e[0;39m" # default system console color
-       CDONE="\e[1;32m" # green
-       CPASS="\e[1;32m" # green
-       CFAIL="\e[1;31m" # red
-       CCMD="\e[1;35m" # pink
+if [ "$MSGCOLOR" != 'NO' ]; then
+       if ! expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null; then
+               export MSGCOLOR='NO'
+       fi
+fi
+
+
+if [ "$MSGCOLOR" != 'NO' ]; then
+       CERROR="\033[1;31m" # red
+       CWARNING="\033[1;33m" # yellow
+       CMSG="\033[1;32m" # green
+       CINFO="\033[1;96m" # light blue
+       CDEBUG="\033[1;94m" # blue
+       CNORMAL="\033[0;39m" # default system console color
+       CDONE="\033[1;32m" # green
+       CPASS="\033[1;32m" # green
+       CFAIL="\033[1;31m" # red
+       CCMD="\033[1;35m" # pink
 fi
 
 msgdie() { echo "${CERROR}E: $1${CNORMAL}" >&2; exit 1; }
 msgwarn() { echo "${CWARNING}W: $1${CNORMAL}" >&2; }
-msgmsg() { echo "${CMSG}$1${CNORMAL}" >&2; }
-msginfo() { echo "${CINFO}I: $1${CNORMAL}" >&2; }
-msgdebug() { echo "${CDEBUG}D: $1${CNORMAL}" >&2; }
-msgdone() { echo "${CDONE}DONE${CNORMAL}" >&2; }
+msgmsg() { echo "${CMSG}$1${CNORMAL}"; }
+msginfo() { echo "${CINFO}I: $1${CNORMAL}"; }
+msgdebug() { echo "${CDEBUG}D: $1${CNORMAL}"; }
+msgdone() { echo "${CDONE}DONE${CNORMAL}"; }
 msgnwarn() { echo -n "${CWARNING}W: $1${CNORMAL}" >&2; }
-msgnmsg() { echo -n "${CMSG}$1${CNORMAL}" >&2; }
-msgninfo() { echo -n "${CINFO}I: $1${CNORMAL}" >&2; }
-msgndebug() { echo -n "${CDEBUG}D: $1${CNORMAL}" >&2; }
+msgnmsg() { echo -n "${CMSG}$1${CNORMAL}"; }
+msgninfo() { echo -n "${CINFO}I: $1${CNORMAL}"; }
+msgndebug() { echo -n "${CDEBUG}D: $1${CNORMAL}"; }
 msgtest() {
        while [ -n "$1" ]; do
-               echo -n "${CINFO}$1${CCMD} " >&2;
-               echo -n "$(echo "$2" | sed -e 's/^aptc/apt-c/' -e 's/^aptg/apt-g/' -e 's/^aptf/apt-f/')${CINFO} " >&2;
+               echo -n "${CINFO}$1${CCMD} "
+               echo -n "$(echo "$2" | sed -e 's/^aptc/apt-c/' -e 's/^aptg/apt-g/' -e 's/^aptf/apt-f/')${CINFO} "
                shift
                if [ -n "$1" ]; then shift; else break; fi
        done
-       echo -n "…${CNORMAL} " >&2;
+       echo -n "…${CNORMAL} "
 }
-msgpass() { echo "${CPASS}PASS${CNORMAL}" >&2; }
+msgpass() { echo "${CPASS}PASS${CNORMAL}"; }
 msgskip() { echo "${CWARNING}SKIP${CNORMAL}" >&2; }
 msgfail() {
        if [ $# -gt 0 ]; then echo "${CFAIL}FAIL: $*${CNORMAL}" >&2;
@@ -57,7 +63,7 @@ if [ $MSGLEVEL -le 2 ]; then
        msgmsg() { true; }
        msgnmsg() { true; }
        msgtest() { true; }
-       msgpass() { echo -n " ${CPASS}P${CNORMAL}" >&2; }
+       msgpass() { echo -n " ${CPASS}P${CNORMAL}"; }
        msgskip() { echo -n " ${CWARNING}S${CNORMAL}" >&2; }
        if [ -n "$CFAIL" ]; then
                msgfail() { echo -n " ${CFAIL}FAIL${CNORMAL}" >&2; EXIT_CODE=$((EXIT_CODE+1)); }
@@ -81,50 +87,59 @@ msgdone() {
           [ "$1" = "die" -a $MSGLEVEL -le 0 ]; then
                true;
        else
-               echo "${CDONE}DONE${CNORMAL}" >&2;
+               echo "${CDONE}DONE${CNORMAL}";
        fi
 }
 
 runapt() {
        msgdebug "Executing: ${CCMD}$*${CDEBUG} "
+       local CMD="$1"
+       shift
        if [ -f ./aptconfig.conf ]; then
-               MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$*
+               MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$CMD "$@"
        elif [ -f ../aptconfig.conf ]; then
-               MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$*
+               MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$CMD "$@"
        else
-               MALLOC_PERTURB_=21 MALLOC_CHECK_=2 LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$*
+               MALLOC_PERTURB_=21 MALLOC_CHECK_=2 LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$CMD "$@"
        fi
 }
-aptconfig() { runapt apt-config $*; }
-aptcache() { runapt apt-cache $*; }
-aptcdrom() { runapt apt-cdrom $*; }
-aptget() { runapt apt-get $*; }
-apt() { runapt apt $*; }
-aptftparchive() { runapt apt-ftparchive $*; }
-aptkey() { runapt apt-key $*; }
-aptmark() { runapt apt-mark $*; }
+aptconfig() { runapt apt-config "$@"; }
+aptcache() { runapt apt-cache "$@"; }
+aptcdrom() { runapt apt-cdrom "$@"; }
+aptget() { runapt apt-get "$@"; }
+aptftparchive() { runapt apt-ftparchive "$@"; }
+aptkey() { runapt apt-key "$@"; }
+aptmark() { runapt apt-mark "$@"; }
+apt() { runapt apt "$@"; }
 aptwebserver() {
-  LD_LIBRARY_PATH=${APTWEBSERVERBINDIR} ${APTWEBSERVERBINDIR}/aptwebserver $*;
+  LD_LIBRARY_PATH=${APTWEBSERVERBINDIR} ${APTWEBSERVERBINDIR}/aptwebserver "$@";
 }
 dpkg() {
-       $(which dpkg) --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log $*
+       command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@"
 }
 aptitude() {
        if [ -f ./aptconfig.conf ]; then
-               APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY}  $(which aptitude) $*
+               APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY}  command aptitude "$@"
        elif [ -f ../aptconfig.conf ]; then
-               APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} $(which aptitude) $*
+               APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} command aptitude "$@"
        else
-               LD_LIBRARY_PATH=${BUILDDIRECTORY}  $(which aptitude) $*
+               LD_LIBRARY_PATH=${BUILDDIRECTORY}  command aptitude "$@"
        fi
 }
 gdb() {
        echo "gdb: run »$*«"
-       APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} $(which gdb) ${BUILDDIRECTORY}/$1 --args $*
+       APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} command gdb ${BUILDDIRECTORY}/$1 --args "$@"
 }
 http() {
        LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/methods/http
 }
+gpg() {
+       # see apt-key for the whole trickery. Setup is done in setupenvironment
+       command gpg --ignore-time-conflict --no-options --no-default-keyring \
+               --homedir "${TMPWORKINGDIRECTORY}/gnupghome" \
+               --no-auto-check-trustdb --trust-model always \
+               "$@"
+}
 
 exitwithstatus() {
         # error if we about to overflow, but ...
@@ -171,7 +186,7 @@ setupenvironment() {
        mkdir rootdir aptarchive keys
        cd rootdir
        mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d
-       mkdir -p var/cache var/lib var/log
+       mkdir -p var/cache var/lib var/log tmp
        mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers
        touch var/lib/dpkg/available
        mkdir -p usr/lib/apt
@@ -197,16 +212,30 @@ setupenvironment() {
        echo "DPKG::options:: \"--root=${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf
        echo "DPKG::options:: \"--force-not-root\";" >> aptconfig.conf
        echo "DPKG::options:: \"--force-bad-path\";" >> aptconfig.conf
-       if ! $(which dpkg) --assert-multi-arch >/dev/null 2>&1; then
+       if ! command dpkg --assert-multi-arch >/dev/null 2>&1; then
                echo "DPKG::options:: \"--force-architecture\";" >> aptconfig.conf # Added to test multiarch before dpkg is ready for it…
        fi
        echo "DPKG::options:: \"--log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log\";" >> aptconfig.conf
        echo 'quiet::NoUpdate "true";' >> aptconfig.conf
        echo "Acquire::https::CaInfo \"${TESTDIR}/apt.pem\";" > rootdir/etc/apt/apt.conf.d/99https
         echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary
-       export LC_ALL=C
+       export LC_ALL=C.UTF-8
        export PATH="${PATH}:/usr/local/sbin:/usr/sbin:/sbin"
        configcompression '.' 'gz' #'bz2' 'lzma' 'xz'
+
+       # gpg needs a trustdb to function, but it can't be invalid (not even empty)
+       # see also apt-key where this trickery comes from:
+       local TRUSTDBDIR="${TMPWORKINGDIRECTORY}/gnupghome"
+       mkdir "$TRUSTDBDIR"
+       chmod 700 "$TRUSTDBDIR"
+       # We also don't use a secret keyring, of course, but gpg panics and
+       # implodes if there isn't one available - and writeable for imports
+       local SECRETKEYRING="${TRUSTDBDIR}/secring.gpg"
+       touch $SECRETKEYRING
+       # now create the trustdb with an (empty) dummy keyring
+       # newer gpg versions are fine without it, but play it safe for now
+       gpg --quiet --check-trustdb --secret-keyring $SECRETKEYRING --keyring $SECRETKEYRING >/dev/null 2>&1
+
        msgdone "info"
 }
 
@@ -248,7 +277,7 @@ configdpkg() {
                fi
        fi
        rm -f rootdir/etc/apt/apt.conf.d/00foreigndpkg
-       if $(which dpkg) --assert-multi-arch >/dev/null 2>&1; then
+       if command dpkg --assert-multi-arch >/dev/null 2>&1 ; then
                local ARCHS="$(getarchitectures)"
                if echo "$ARCHS" | grep -E -q '[^ ]+ [^ ]+'; then
                        DPKGARCH="$(dpkg --print-architecture)"
@@ -392,7 +421,7 @@ Package: $NAME" >> ${BUILDDIR}/debian/control
                | while read SRC; do
                echo "pool/${SRC}" >> ${BUILDDIR}/../${RELEASE}.${DISTSECTION}.srclist
 #              if expr match "${SRC}" '.*\.dsc' >/dev/null 2>&1; then
-#                      gpg --yes --no-default-keyring --secret-keyring ./keys/joesixpack.sec \
+#                      gpg --yes --secret-keyring ./keys/joesixpack.sec \
 #                              --keyring ./keys/joesixpack.pub --default-key 'Joe Sixpack' \
 #                              --clearsign -o "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC"
 #                      mv "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC"
@@ -410,7 +439,14 @@ Package: $NAME" >> ${BUILDDIR}/debian/control
 
                (cd ${BUILDDIR}; dpkg-gencontrol -DArchitecture=$arch)
                (cd ${BUILDDIR}/debian/tmp; md5sum $(find usr/ -type f) > DEBIAN/md5sums)
-               dpkg-deb --build ${BUILDDIR}/debian/tmp ${BUILDDIR}/.. 2> /dev/null > /dev/null
+               local LOG="${BUILDDIR}/../${NAME}_${VERSION}_${arch}.dpkg-deb.log"
+               # ensure the right permissions as dpkg-deb ensists
+               chmod 755 ${BUILDDIR}/debian/tmp/DEBIAN
+               if ! dpkg-deb --build ${BUILDDIR}/debian/tmp ${BUILDDIR}/.. >$LOG 2>&1; then
+                       cat $LOG
+                       false
+               fi
+               rm $LOG
                echo "pool/${NAME}_${VERSION}_${arch}.deb" >> ${BUILDDIR}/../${RELEASE}.${DISTSECTION}.pkglist
        done
 
@@ -426,14 +462,19 @@ buildpackage() {
        local RELEASE=$2
        local SECTION=$3
        local ARCH=$(getarchitecture $4)
-       msgninfo "Build package $(echo "$BUILDDIR" | grep -o '[^/]*$') for ${RELEASE} in ${SECTION}… "
+       local PKGNAME="$(echo "$BUILDDIR" | grep -o '[^/]*$')"
+       local BUILDLOG="$(readlink -f "${BUILDDIR}/../${PKGNAME}_${RELEASE}_${SECTION}.dpkg-bp.log")"
+       msgninfo "Build package ${PKGNAME} for ${RELEASE} in ${SECTION}… "
        cd $BUILDDIR
        if [ "$ARCH" = "all" ]; then
                ARCH="$(dpkg-architecture -qDEB_HOST_ARCH 2> /dev/null)"
        fi
-       local BUILT="$(dpkg-buildpackage -uc -us -a$ARCH 2> /dev/null)"
-       local PKGS="$( echo "$BUILT" | grep '^dpkg-deb: building package' | cut -d'/' -f 2 | sed -e "s#'\.##")"
-       local SRCS="$( echo "$BUILT" | grep '^dpkg-source: info: building' | grep -o '[a-z0-9._+~-]*$')"
+       if ! dpkg-buildpackage -uc -us -a$ARCH >$BUILDLOG 2>&1 ; then
+               cat $BUILDLOG
+               false
+       fi
+       local PKGS="$(grep '^dpkg-deb: building package' $BUILDLOG | cut -d'/' -f 2 | sed -e "s#'\.##")"
+       local SRCS="$(grep '^dpkg-source: info: building' $BUILDLOG | grep -o '[a-z0-9._+~-]*$')"
        cd - > /dev/null
        for PKG in $PKGS; do
                echo "pool/${PKG}" >> ${TMPWORKINGDIRECTORY}/incoming/${RELEASE}.${SECTION}.pkglist
@@ -446,9 +487,9 @@ buildpackage() {
 
 buildaptarchive() {
        if [ -d incoming ]; then
-               buildaptarchivefromincoming $*
+               buildaptarchivefromincoming "$@"
        else
-               buildaptarchivefromfiles $*
+               buildaptarchivefromfiles "$@"
        fi
 }
 
@@ -664,7 +705,12 @@ compressfile() {
 }
 
 # can be overridden by testcases for their pleasure
-getcodenamefromsuite() { echo -n "$1"; }
+getcodenamefromsuite() {
+       case "$1" in
+       unstable) echo 'sid';;
+       *) echo -n "$1";;
+       esac
+}
 getreleaseversionfromsuite() { true; }
 getlabelfromsuite() { true; }
 
@@ -761,7 +807,7 @@ setupaptarchive() {
 
 signreleasefiles() {
        local SIGNER="${1:-Joe Sixpack}"
-       local GPG="gpg --batch --yes --no-default-keyring --trustdb-name rootdir/etc/apt/trustdb.gpg"
+       local GPG="gpg --batch --yes"
        msgninfo "\tSign archive with $SIGNER key… "
        local REXKEY='keys/rexexpired'
        local SECEXPIREBAK="${REXKEY}.sec.bak"
@@ -808,8 +854,7 @@ webserverconfig() {
        downloadfile "http://localhost:8080/_config/set/${1}/${2}" '/dev/null' >/dev/null
        local DOWNLOG='download-testfile.log'
        rm -f "$DOWNLOG"
-       local STATUS="$(mktemp)"
-       addtrap "rm $STATUS;"
+       local STATUS="${TMPWORKINGDIRECTORY}/rootdir/tmp/webserverconfig.status"
        downloadfile "http://localhost:8080/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG"
        if [ "$(cat "$STATUS")" = '200' ]; then
                msgpass
@@ -817,6 +862,7 @@ webserverconfig() {
                cat >&2 "$DOWNLOG"
                msgfail "Statuscode was $(cat "$STATUS")"
        fi
+       rm "$STATUS"
 }
 
 rewritesourceslist() {
@@ -832,10 +878,12 @@ changetowebserver() {
        else
                shift
        fi
-       local LOG='/dev/null'
        if test -x ${APTWEBSERVERBINDIR}/aptwebserver; then
                cd aptarchive
-               aptwebserver -o aptwebserver::fork=1 "$@" >$LOG 2>&1
+               if ! aptwebserver -o aptwebserver::fork=1 "$@" >webserver.log 2>&1 ; then
+                       cat $LOG
+                       false
+               fi
                local PID="$(cat aptwebserver.pid)"
                if [ -z "$PID" ]; then
                        msgdie 'Could not fork aptwebserver successfully'
@@ -924,7 +972,7 @@ Filename: ${2}
 }
 
 checkdiff() {
-       local DIFFTEXT="$($(which diff) -u $* | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')"
+       local DIFFTEXT="$(command diff -u "$@" | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')"
        if [ -n "$DIFFTEXT" ]; then
                echo
                echo "$DIFFTEXT"
@@ -957,7 +1005,7 @@ testequal() {
                shift
        fi
 
-       local COMPAREFILE=$(mktemp)
+       local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequal.comparefile"
        addtrap "rm $COMPAREFILE;"
        echo "$1" > $COMPAREFILE
        shift
@@ -969,10 +1017,9 @@ testequal() {
 }
 
 testequalor2() {
-       local COMPAREFILE1=$(mktemp)
-       local COMPAREFILE2=$(mktemp)
-       local COMPAREAGAINST=$(mktemp)
-       addtrap "rm $COMPAREFILE1 $COMPAREFILE2 $COMPAREAGAINST;"
+       local COMPAREFILE1="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.comparefile1"
+       local COMPAREFILE2="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.comparefile2"
+       local COMPAREAGAINST="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.compareagainst"
        echo "$1" > $COMPAREFILE1
        echo "$2" > $COMPAREFILE2
        shift 2
@@ -998,8 +1045,7 @@ N: Can't select versions from package '$1' as it is purely virtual"
        msgtest "Test for virtual packages" "apt-cache show $PACKAGE"
        VIRTUAL="${VIRTUAL}
 N: No packages found"
-       local COMPAREFILE=$(mktemp)
-       addtrap "rm $COMPAREFILE;"
+       local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testshowvirtual.comparefile"
        local ARCH="$(getarchitecture 'native')"
        echo "$VIRTUAL" | sed -e "s/:$ARCH//" -e 's/:all//' > $COMPAREFILE
        aptcache show -q=0 $PACKAGE 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
@@ -1007,7 +1053,7 @@ N: No packages found"
 
 testnopackage() {
        msgtest "Test for non-existent packages" "apt-cache show $*"
-       local SHOWPKG="$(aptcache show $* 2>&1 | grep '^Package: ')"
+       local SHOWPKG="$(aptcache show "$@" 2>&1 | grep '^Package: ')"
        if [ -n "$SHOWPKG" ]; then
                echo
                echo "$SHOWPKG"
@@ -1019,10 +1065,10 @@ testnopackage() {
 
 testdpkginstalled() {
        msgtest "Test for correctly installed package(s) with" "dpkg -l $*"
-       local PKGS="$(dpkg -l $* 2>/dev/null | grep '^i' | wc -l)"
+       local PKGS="$(dpkg -l "$@" 2>/dev/null | grep '^i' | wc -l)"
        if [ "$PKGS" != $# ]; then
                echo $PKGS
-               dpkg -l $* | grep '^[a-z]'
+               dpkg -l "$@" | grep '^[a-z]'
                msgfail
                return 1
        fi
@@ -1031,10 +1077,10 @@ testdpkginstalled() {
 
 testdpkgnotinstalled() {
        msgtest "Test for correctly not-installed package(s) with" "dpkg -l $*"
-       local PKGS="$(dpkg -l $* 2> /dev/null | grep '^i' | wc -l)"
+       local PKGS="$(dpkg -l "$@" 2> /dev/null | grep '^i' | wc -l)"
        if [ "$PKGS" != 0 ]; then
                echo
-               dpkg -l $* | grep '^[a-z]'
+               dpkg -l "$@" | grep '^[a-z]'
                msgfail
                return 1
        fi
@@ -1042,8 +1088,7 @@ testdpkgnotinstalled() {
 }
 
 testmarkedauto() {
-       local COMPAREFILE=$(mktemp)
-       addtrap "rm $COMPAREFILE;"
+       local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testmarkedauto.comparefile"
        if [ -n "$1" ]; then
                msgtest 'Test for correctly marked as auto-installed' "$*"
                while [ -n "$1" ]; do echo "$1"; shift; done | sort > $COMPAREFILE
@@ -1060,8 +1105,7 @@ testsuccess() {
        else
                msgtest 'Test for successful execution of' "$*"
        fi
-       local OUTPUT=$(mktemp)
-       addtrap "rm $OUTPUT;"
+       local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
        if $@ >${OUTPUT} 2>&1; then
                msgpass
        else
@@ -1077,8 +1121,7 @@ testfailure() {
        else
                msgtest 'Test for failure in  execution of' "$*"
        fi
-       local OUTPUT=$(mktemp)
-       addtrap "rm $OUTPUT;"
+       local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output"
        if $@ >${OUTPUT} 2>&1; then
                echo
                cat $OUTPUT
index 7316016..79d5d1a 100755 (executable)
@@ -2,24 +2,38 @@
 set -e
 
 FAIL=0
+PASS=0
+ALL=0
+
 FAILED_TESTS=""
 DIR=$(readlink -f $(dirname $0))
-if [ "$1" = "-q" ]; then
-       export MSGLEVEL=2
-elif [ "$1" = "-v" ]; then
-       export MSGLEVEL=4
-fi
+while [ -n "$1" ]; do
+       if [ "$1" = "-q" ]; then
+               export MSGLEVEL=2
+       elif [ "$1" = "-v" ]; then
+               export MSGLEVEL=4
+       elif [ "$1" = '--color=no' ]; then
+               export MSGCOLOR='NO'
+       else
+               echo >&2 "WARNING: Unknown parameter »$1« will be ignored"
+       fi
+       shift
+done
+export MSGLEVEL="${MSGLEVEL:-3}"
 
-if expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null; then
+if [ "$MSGCOLOR" != 'NO' ]; then
+       if ! expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null; then
+               export MSGCOLOR='NO'
+       fi
+fi
+if [ "$MSGCOLOR" != 'NO' ]; then
        CTEST='\033[1;32m'
        CHIGH='\033[1;35m'
        CRESET='\033[0m'
-elif [ -z "${MSGLEVEL}" ]; then
-       export MSGLEVEL=2
-fi
-
-if [ -z "$MSGLEVEL" ]; then
-       MSGLEVEL=5
+else
+       CTEST=''
+       CHIGH=''
+       CRESET=''
 fi
 
 for testcase in $(run-parts --list $DIR | grep '/test-'); do
@@ -29,18 +43,23 @@ for testcase in $(run-parts --list $DIR | grep '/test-'); do
                echo "${CTEST}Run Testcase ${CHIGH}$(basename ${testcase})${CRESET}"
        fi
        if ! ${testcase}; then
-                 FAIL=$((FAIL+1))
-                 FAILED_TESTS="$FAILED_TESTS $(basename $testcase)"
-                 echo "$(basename $testcase) ... FAIL"
-        fi
+               FAIL=$((FAIL+1))
+               FAILED_TESTS="$FAILED_TESTS $(basename $testcase)"
+               echo >&2 "$(basename $testcase) ... FAIL"
+       else
+               PASS=$((PASS+1))
+       fi
+       ALL=$((ALL+1))
        if [ "$MSGLEVEL" -le 2 ]; then
                echo
        fi
 done
 
-echo "failures: $FAIL"
-if [ -n "$FAILED_TESTS" ]; then 
-    echo "Failed tests: $FAILED_TESTS";
+echo >&2 "Statistics: $ALL tests were run: $PASS successfully and $FAIL failed"
+if [ -n "$FAILED_TESTS" ]; then
+       echo >&2 "Failed tests: $FAILED_TESTS"
+else
+       echo >&2 'All tests seem to have been run successfully. What could possibly go wrong?'
 fi
 # ensure we don't overflow
 exit $((FAIL <= 255 ? FAIL : 255))
index 6eac079..fce0be0 100755 (executable)
@@ -19,7 +19,8 @@ testdownload() {
                APT="${APT}/${3}"
        fi
        msgtest "Test download of package file $1 with" "$APT"
-       aptget -qq download ${APT} && test -f $1 && msgpass || msgfail
+       testsuccess --nomsg aptget download ${APT}
+       testsuccess test -f $1
        rm $1
 }
 
index 3ee7a9e..083e26d 100755 (executable)
@@ -39,12 +39,24 @@ Need to get 0 B of source archives.
 'file://${APTARCHIVE}/foo_2.0.dsc' foo_2.0.dsc 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e
 'file://${APTARCHIVE}/foo_2.0.tar.gz' foo_2.0.tar.gz 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e" aptget source -q --print-uris foo
 
-# select by release
+# select by release: suite
 testequal "$HEADER
 Selected version '1.0' (stable) for foo
 Need to get 0 B of source archives.
 'file://${APTARCHIVE}/foo_1.0.dsc' foo_1.0.dsc 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e
 'file://${APTARCHIVE}/foo_1.0.tar.gz' foo_1.0.tar.gz 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e" aptget source -q --print-uris foo/stable
+testequal "$HEADER
+Selected version '2.0' (unstable) for foo
+Need to get 0 B of source archives.
+'file://${APTARCHIVE}/foo_2.0.dsc' foo_2.0.dsc 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e
+'file://${APTARCHIVE}/foo_2.0.tar.gz' foo_2.0.tar.gz 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e" aptget source -q --print-uris foo/unstable
+
+# select by release: codename
+testequal "$HEADER
+Selected version '2.0' (sid) for foo
+Need to get 0 B of source archives.
+'file://${APTARCHIVE}/foo_2.0.dsc' foo_2.0.dsc 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e
+'file://${APTARCHIVE}/foo_2.0.tar.gz' foo_2.0.tar.gz 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e" aptget source -q --print-uris foo/sid
 
 # select by version
 testequal "$HEADER
index e9d6843..50ca2bf 100755 (executable)
@@ -35,5 +35,5 @@ testequal "Package files:
  100 ${ROOTDIR}/rootdir/var/lib/dpkg/status
      release a=now
  500 file:${ROOTDIR}/aptarchive/ unstable/main i386 Packages
-     release a=unstable,n=unstable,c=main
+     release a=unstable,n=sid,c=main
 Pinned packages:" aptcache policy
index 9fc807d..15c96cb 100644 (file)
@@ -2,6 +2,7 @@
 #include <rpm/rpmio.h>
 #include <rpm/misc.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <ctype.h>
 
 #define xisdigit(x) isdigit(x)
@@ -12,10 +13,8 @@ using namespace std;
 
 int rpmvercmp(const char * a, const char * b)
 {
-    char oldch1, oldch2;
     char * str1, * str2;
     char * one, * two;
-    int rc;
     int isnum;
 
     /* easy comparison to see if versions are identical */
@@ -53,9 +52,9 @@ int rpmvercmp(const char * a, const char * b)
 
        /* save character at the end of the alpha or numeric segment */
        /* so that they can be restored after the comparison */
-       oldch1 = *str1;
+       char oldch1 = *str1;
        *str1 = '\0';
-       oldch2 = *str2;
+       char oldch2 = *str2;
        *str2 = '\0';
 
        /* take care of the case where the two version segments are */
@@ -81,7 +80,7 @@ int rpmvercmp(const char * a, const char * b)
        /* segments are alpha or if they are numeric.  don't return  */
        /* if they are equal because there might be more segments to */
        /* compare */
-       rc = strcmp(one, two);
+       int rc = strcmp(one, two);
        if (rc) return rc;
 
        /* restore character that was replaced by null above */
index 677b1c8..e950162 100644 (file)
@@ -176,7 +176,7 @@ test:
        equals("7.15.3~", Version);
        equals(Null | pkgCache::Dep::Equals | pkgCache::Dep::Or, Op);
 
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
+       debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch);
        if (StripMultiArch == true)
                equals("overlord-dev", Package);
        else