Переглянути джерело

* cmdline/apt-get.cc:
- source should displays 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)

Michael Vogt 16 роки тому
батько
коміт
fb3dc57975
3 змінених файлів з 175 додано та 154 видалено
  1. 100 94
      cmdline/apt-get.cc
  2. 4 0
      debian/changelog
  3. 71 60
      po/apt-all.pot

+ 100 - 94
cmdline/apt-get.cc

@@ -1243,136 +1243,142 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
 			       pkgSrcRecords &SrcRecs,string &Src,
 			       pkgDepCache &Cache)
 {
-   // We want to pull the version off the package specification..
    string VerTag;
-   string DefRel;
+   string DefRel = _config->Find("APT::Default-Release");
    string TmpSrc = Name;
-   const size_t found = TmpSrc.find_last_of("/=");
 
-   // honor default release
-   if (found != string::npos && TmpSrc[found] == '/')
-   {
-      DefRel = TmpSrc.substr(found+1);
+   // extract the version/release from the pkgname
+   const size_t found = TmpSrc.find_last_of("/=");
+   if (found != string::npos) {
+      if (TmpSrc[found] == '/')
+	 DefRel = TmpSrc.substr(found+1);
+      else
+	 VerTag = TmpSrc.substr(found+1);
       TmpSrc = TmpSrc.substr(0,found);
    }
-   else
-      DefRel = _config->Find("APT::Default-Release");
-
-   pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
 
-   if (found != string::npos && TmpSrc[found] == '=')
+   /* Lookup the version of the package we would install if we were to
+      install a version and determine the source package name, then look
+      in the archive for a source package of the same name. */
+   bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source");
+   const pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
+   if (MatchSrcOnly == false && Pkg.end() == false) 
    {
-      VerTag = TmpSrc.substr(found+1);
-      TmpSrc = TmpSrc.substr(0,found);
-   } 
-   else  if(!Pkg.end() && DefRel.empty() == false)
-   {
-      // we have a default release, try to locate the pkg. we do it like
-      // this because GetCandidateVer() will not "downgrade", that means
-      // "apt-get source -t stable apt" won't work on a unstable system
-      for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; 
-	   Ver++)
+      if(VerTag.empty() == false || DefRel.empty() == false) 
       {
-	 for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false;
-	      VF++)
+	 // we have a default release, try to locate the pkg. we do it like
+	 // this because GetCandidateVer() will not "downgrade", that means
+	 // "apt-get source -t stable apt" won't work on a unstable system
+	 for (pkgCache::VerIterator Ver = Pkg.VersionList();
+	      Ver.end() == false; Ver++) 
 	 {
-	    /* If this is the status file, and the current version is not the
-	       version in the status file (ie it is not installed, or somesuch)
-	       then it is not a candidate for installation, ever. This weeds
-	       out bogus entries that may be due to config-file states, or
-	       other. */
-	    if ((VF.File()->Flags & pkgCache::Flag::NotSource) == 
-		pkgCache::Flag::NotSource && Pkg.CurrentVer() != Ver)
-	    continue;
-	    
-	    if((VF.File().Archive() != 0 && VF.File().Archive() == DefRel) ||
-		(VF.File().Codename() != 0 && VF.File().Codename() == DefRel))
+	    for (pkgCache::VerFileIterator VF = Ver.FileList();
+		 VF.end() == false; VF++) 
 	    {
-	       pkgRecords::Parser &Parse = Recs.Lookup(VF);
-	       VerTag = Parse.SourceVer();
-	       if (VerTag.empty())
-		  VerTag = Ver.VerStr();
-	       break;
+	       /* If this is the status file, and the current version is not the
+		  version in the status file (ie it is not installed, or somesuch)
+		  then it is not a candidate for installation, ever. This weeds
+		  out bogus entries that may be due to config-file states, or
+		  other. */
+	       if ((VF.File()->Flags & pkgCache::Flag::NotSource) ==
+		   pkgCache::Flag::NotSource && Pkg.CurrentVer() != Ver)
+		  continue;
+
+	       // We match against a concrete version (or a part of this version)
+	       if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.VerStr(), VerTag.size()) != 0)
+		  continue;
+
+	       // or we match against a release
+	       if(VerTag.empty() == false ||
+		  (VF.File().Archive() != 0 && VF.File().Archive() == DefRel) ||
+		  (VF.File().Codename() != 0 && VF.File().Codename() == DefRel)) 
+	       {
+		  pkgRecords::Parser &Parse = Recs.Lookup(VF);
+		  Src = Parse.SourcePkg();
+		  if (VerTag.empty() == true)
+		     VerTag = Parse.SourceVer();
+		  break;
+	       }
 	    }
 	 }
+	 if (Src.empty() == true) 
+	 {
+	    if (VerTag.empty() == false)
+	       _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str());
+	    else
+	       _error->Warning(_("Ignore unavailable target release '%s' of package '%s'"), DefRel.c_str(), TmpSrc.c_str());
+	    VerTag.clear();
+	    DefRel.clear();
+	 }
       }
-   }
-
-   /* Lookup the version of the package we would install if we were to
-      install a version and determine the source package name, then look
-      in the archive for a source package of the same name. */
-   bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source");
-   if (MatchSrcOnly == false)
-   {
-      if (Pkg.end() == false)
+      if (VerTag.empty() == true && DefRel.empty() == true) 
       {
+	 // if we don't have a version or default release, use the CandidateVer to find the Source
 	 pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);
-	 if (Ver.end() == false)
+	 if (Ver.end() == false) 
 	 {
 	    pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
 	    Src = Parse.SourcePkg();
+	    VerTag = Parse.SourceVer();
 	 }
-      }   
+      }
+   }
+
+   if (Src.empty() == true)
+      Src = TmpSrc;
+   else 
+   {
+      /* if we have a source pkg name, make sure to only search
+	 for srcpkg names, otherwise apt gets confused if there
+	 is a binary package "pkg1" and a source package "pkg1"
+	 with the same name but that comes from different packages */
+      MatchSrcOnly = true;
+      if (Src != TmpSrc) 
+      {
+	 ioprintf(c1out, _("Picking '%s' as source package instead of '%s'\n"), Src.c_str(), TmpSrc.c_str());
+      }
    }
 
    // The best hit
    pkgSrcRecords::Parser *Last = 0;
    unsigned long Offset = 0;
    string Version;
-   bool IsMatch = false;
 
-   // No source package name..
-   if (Src.empty() == true)
-      Src = TmpSrc;
-   else 
-      // if we have a source pkg name, make sure to only search
-      // for srcpkg names, otherwise apt gets confused if there
-      // is a binary package "pkg1" and a source package "pkg1"
-      // with the same name but that comes from different packages
-      MatchSrcOnly = true;
-   
-   // If we are matching by version then we need exact matches to be happy
-   if (VerTag.empty() == false)
-      IsMatch = true;
-   
    /* Iterate over all of the hits, which includes the resulting
       binary packages in the search */
    pkgSrcRecords::Parser *Parse;
-   SrcRecs.Restart();
-   while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0)
+   while (true) 
    {
-      string Ver = Parse->Version();
-
-      // show name mismatches
-      if (IsMatch == true && Parse->Package() != Src)       
-	 ioprintf(c1out,  _("No source package '%s' picking '%s' instead\n"), Src.c_str(), Parse->Package().c_str());
-      
-      if (VerTag.empty() == false)
+      SrcRecs.Restart();
+      while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0) 
       {
-	 /* Don't want to fall through because we are doing exact version 
-	    matching. */
-	 if (Cache.VS().CmpVersion(VerTag,Ver) != 0)
+	 const string Ver = Parse->Version();
+
+	 // Ignore all versions which doesn't fit
+	 if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.c_str(), VerTag.size()) != 0)
 	    continue;
-	 
-	 Last = Parse;
-	 Offset = Parse->Offset();
-	 break;
+
+	 // Newer version or an exact match? Save the hit
+	 if (Last == 0 || Cache.VS().CmpVersion(Version,Ver) < 0) {
+	    Last = Parse;
+	    Offset = Parse->Offset();
+	    Version = Ver;
+	 }
+
+	 // was the version check above an exact match? If so, we don't need to look further
+	 if (VerTag.empty() == false && VerTag.size() == Ver.size())
+	    break;
       }
-				  
-      // Newer version or an exact match
-      if (Last == 0 || Cache.VS().CmpVersion(Version,Ver) < 0 || 
-	  (Parse->Package() == Src && IsMatch == false))
-      {
-	 IsMatch = Parse->Package() == Src;
-	 Last = Parse;
-	 Offset = Parse->Offset();
-	 Version = Ver;
-      }      
+      if (Last != 0 || VerTag.empty() == true)
+	 break;
+      //if (VerTag.empty() == false && Last == 0)
+      _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str());
+      VerTag.clear();
    }
-   
+
    if (Last == 0 || Last->Jump(Offset) == false)
       return 0;
-   
+
    return Last;
 }
 									/*}}}*/

+ 4 - 0
debian/changelog

@@ -58,6 +58,10 @@ apt (0.7.25) UNRELEASED; urgency=low
     - 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 doesn't need the complete version for match (Closes: #245250)
+    - source ignores versions/releases if not available (Closes: #377424)
 
   [ Julian Andres Klode ]
   * doc/apt.conf.5.xml:

+ 71 - 60
po/apt-all.pot

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-30 18:47+0200\n"
+"POT-Creation-Date: 2009-10-19 21:03+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -151,7 +151,7 @@ msgstr ""
 
 #: cmdline/apt-cache.cc:1718 cmdline/apt-cdrom.cc:134 cmdline/apt-config.cc:70
 #: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:547
-#: cmdline/apt-get.cc:2651 cmdline/apt-sortpkgs.cc:144
+#: cmdline/apt-get.cc:2645 cmdline/apt-sortpkgs.cc:144
 #, c-format
 msgid "%s %s for %s compiled on %s %s\n"
 msgstr ""
@@ -549,7 +549,7 @@ msgstr ""
 msgid "Y"
 msgstr ""
 
-#: cmdline/apt-get.cc:149 cmdline/apt-get.cc:1720
+#: cmdline/apt-get.cc:149 cmdline/apt-get.cc:1714
 #, c-format
 msgid "Regex compilation error - %s"
 msgstr ""
@@ -708,11 +708,11 @@ msgstr ""
 msgid "Internal error, Ordering didn't finish"
 msgstr ""
 
-#: cmdline/apt-get.cc:811 cmdline/apt-get.cc:2062 cmdline/apt-get.cc:2095
+#: cmdline/apt-get.cc:811 cmdline/apt-get.cc:2056 cmdline/apt-get.cc:2089
 msgid "Unable to lock the download directory"
 msgstr ""
 
-#: cmdline/apt-get.cc:821 cmdline/apt-get.cc:2143 cmdline/apt-get.cc:2392
+#: cmdline/apt-get.cc:821 cmdline/apt-get.cc:2137 cmdline/apt-get.cc:2386
 #: apt-pkg/cachefile.cc:65
 msgid "The list of sources could not be read."
 msgstr ""
@@ -741,7 +741,7 @@ msgstr ""
 msgid "After this operation, %sB disk space will be freed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:866 cmdline/apt-get.cc:2238
+#: cmdline/apt-get.cc:866 cmdline/apt-get.cc:2232
 #, c-format
 msgid "Couldn't determine free space in %s"
 msgstr ""
@@ -775,7 +775,7 @@ msgstr ""
 msgid "Do you want to continue [Y/n]? "
 msgstr ""
 
-#: cmdline/apt-get.cc:989 cmdline/apt-get.cc:2289 apt-pkg/algorithms.cc:1389
+#: cmdline/apt-get.cc:989 cmdline/apt-get.cc:2283 apt-pkg/algorithms.cc:1389
 #, c-format
 msgid "Failed to fetch %s  %s\n"
 msgstr ""
@@ -784,7 +784,7 @@ msgstr ""
 msgid "Some files failed to download"
 msgstr ""
 
-#: cmdline/apt-get.cc:1008 cmdline/apt-get.cc:2298
+#: cmdline/apt-get.cc:1008 cmdline/apt-get.cc:2292
 msgid "Download complete and in download only mode"
 msgstr ""
 
@@ -876,39 +876,50 @@ msgstr ""
 msgid "Selected version %s (%s) for %s\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1348
+#. if (VerTag.empty() == false && Last == 0)
+#: cmdline/apt-get.cc:1301 cmdline/apt-get.cc:1363
 #, c-format
-msgid "No source package '%s' picking '%s' instead\n"
+msgid "Ignore unavailable version '%s' of package '%s'"
 msgstr ""
 
-#: cmdline/apt-get.cc:1385
+#: cmdline/apt-get.cc:1303
+#, c-format
+msgid "Ignore unavailable target release '%s' of package '%s'"
+msgstr ""
+
+#: cmdline/apt-get.cc:1328
+#, c-format
+msgid "Picking '%s' as source package instead of '%s'\n"
+msgstr ""
+
+#: cmdline/apt-get.cc:1379
 msgid "The update command takes no arguments"
 msgstr ""
 
-#: cmdline/apt-get.cc:1398
+#: cmdline/apt-get.cc:1392
 msgid "Unable to lock the list directory"
 msgstr ""
 
-#: cmdline/apt-get.cc:1454
+#: cmdline/apt-get.cc:1448
 msgid "We are not supposed to delete stuff, can't start AutoRemover"
 msgstr ""
 
-#: cmdline/apt-get.cc:1503
+#: cmdline/apt-get.cc:1497
 msgid ""
 "The following packages were automatically installed and are no longer "
 "required:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1505
+#: cmdline/apt-get.cc:1499
 #, c-format
 msgid "%lu packages were automatically installed and are no longer required.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1506
+#: cmdline/apt-get.cc:1500
 msgid "Use 'apt-get autoremove' to remove them."
 msgstr ""
 
-#: cmdline/apt-get.cc:1511
+#: cmdline/apt-get.cc:1505
 msgid ""
 "Hmm, seems like the AutoRemover destroyed something which really\n"
 "shouldn't happen. Please file a bug report against apt."
@@ -924,49 +935,49 @@ msgstr ""
 #. "that package should be filed.") << endl;
 #. }
 #.
-#: cmdline/apt-get.cc:1514 cmdline/apt-get.cc:1804
+#: cmdline/apt-get.cc:1508 cmdline/apt-get.cc:1798
 msgid "The following information may help to resolve the situation:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1518
+#: cmdline/apt-get.cc:1512
 msgid "Internal Error, AutoRemover broke stuff"
 msgstr ""
 
-#: cmdline/apt-get.cc:1537
+#: cmdline/apt-get.cc:1531
 msgid "Internal error, AllUpgrade broke stuff"
 msgstr ""
 
-#: cmdline/apt-get.cc:1592
+#: cmdline/apt-get.cc:1586
 #, c-format
 msgid "Couldn't find task %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:1707 cmdline/apt-get.cc:1743
+#: cmdline/apt-get.cc:1701 cmdline/apt-get.cc:1737
 #, c-format
 msgid "Couldn't find package %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:1730
+#: cmdline/apt-get.cc:1724
 #, c-format
 msgid "Note, selecting %s for regex '%s'\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1761
+#: cmdline/apt-get.cc:1755
 #, c-format
 msgid "%s set to manually installed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1774
+#: cmdline/apt-get.cc:1768
 msgid "You might want to run `apt-get -f install' to correct these:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1777
+#: cmdline/apt-get.cc:1771
 msgid ""
 "Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a "
 "solution)."
 msgstr ""
 
-#: cmdline/apt-get.cc:1789
+#: cmdline/apt-get.cc:1783
 msgid ""
 "Some packages could not be installed. This may mean that you have\n"
 "requested an impossible situation or if you are using the unstable\n"
@@ -974,152 +985,152 @@ msgid ""
 "or been moved out of Incoming."
 msgstr ""
 
-#: cmdline/apt-get.cc:1807
+#: cmdline/apt-get.cc:1801
 msgid "Broken packages"
 msgstr ""
 
-#: cmdline/apt-get.cc:1836
+#: cmdline/apt-get.cc:1830
 msgid "The following extra packages will be installed:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1925
+#: cmdline/apt-get.cc:1919
 msgid "Suggested packages:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1926
+#: cmdline/apt-get.cc:1920
 msgid "Recommended packages:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1955
+#: cmdline/apt-get.cc:1949
 msgid "Calculating upgrade... "
 msgstr ""
 
-#: cmdline/apt-get.cc:1958 methods/ftp.cc:707 methods/connect.cc:112
+#: cmdline/apt-get.cc:1952 methods/ftp.cc:707 methods/connect.cc:112
 msgid "Failed"
 msgstr ""
 
-#: cmdline/apt-get.cc:1963
+#: cmdline/apt-get.cc:1957
 msgid "Done"
 msgstr ""
 
-#: cmdline/apt-get.cc:2030 cmdline/apt-get.cc:2038
+#: cmdline/apt-get.cc:2024 cmdline/apt-get.cc:2032
 msgid "Internal error, problem resolver broke stuff"
 msgstr ""
 
-#: cmdline/apt-get.cc:2138
+#: cmdline/apt-get.cc:2132
 msgid "Must specify at least one package to fetch source for"
 msgstr ""
 
-#: cmdline/apt-get.cc:2168 cmdline/apt-get.cc:2410
+#: cmdline/apt-get.cc:2162 cmdline/apt-get.cc:2404
 #, c-format
 msgid "Unable to find a source package for %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:2217
+#: cmdline/apt-get.cc:2211
 #, c-format
 msgid "Skipping already downloaded file '%s'\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2248
+#: cmdline/apt-get.cc:2242
 #, c-format
 msgid "You don't have enough free space in %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:2254
+#: cmdline/apt-get.cc:2248
 #, c-format
 msgid "Need to get %sB/%sB of source archives.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2257
+#: cmdline/apt-get.cc:2251
 #, c-format
 msgid "Need to get %sB of source archives.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2263
+#: cmdline/apt-get.cc:2257
 #, c-format
 msgid "Fetch source %s\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2294
+#: cmdline/apt-get.cc:2288
 msgid "Failed to fetch some archives."
 msgstr ""
 
-#: cmdline/apt-get.cc:2322
+#: cmdline/apt-get.cc:2316
 #, c-format
 msgid "Skipping unpack of already unpacked source in %s\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2334
+#: cmdline/apt-get.cc:2328
 #, c-format
 msgid "Unpack command '%s' failed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2335
+#: cmdline/apt-get.cc:2329
 #, c-format
 msgid "Check if the 'dpkg-dev' package is installed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2352
+#: cmdline/apt-get.cc:2346
 #, c-format
 msgid "Build command '%s' failed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2371
+#: cmdline/apt-get.cc:2365
 msgid "Child process failed"
 msgstr ""
 
-#: cmdline/apt-get.cc:2387
+#: cmdline/apt-get.cc:2381
 msgid "Must specify at least one package to check builddeps for"
 msgstr ""
 
-#: cmdline/apt-get.cc:2415
+#: cmdline/apt-get.cc:2409
 #, c-format
 msgid "Unable to get build-dependency information for %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:2435
+#: cmdline/apt-get.cc:2429
 #, c-format
 msgid "%s has no build depends.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2487
+#: cmdline/apt-get.cc:2481
 #, c-format
 msgid ""
 "%s dependency for %s cannot be satisfied because the package %s cannot be "
 "found"
 msgstr ""
 
-#: cmdline/apt-get.cc:2540
+#: cmdline/apt-get.cc:2534
 #, c-format
 msgid ""
 "%s dependency for %s cannot be satisfied because no available versions of "
 "package %s can satisfy version requirements"
 msgstr ""
 
-#: cmdline/apt-get.cc:2576
+#: cmdline/apt-get.cc:2570
 #, c-format
 msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new"
 msgstr ""
 
-#: cmdline/apt-get.cc:2603
+#: cmdline/apt-get.cc:2597
 #, c-format
 msgid "Failed to satisfy %s dependency for %s: %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:2619
+#: cmdline/apt-get.cc:2613
 #, c-format
 msgid "Build-dependencies for %s could not be satisfied."
 msgstr ""
 
-#: cmdline/apt-get.cc:2624
+#: cmdline/apt-get.cc:2618
 msgid "Failed to process build dependencies"
 msgstr ""
 
-#: cmdline/apt-get.cc:2656
+#: cmdline/apt-get.cc:2650
 msgid "Supported modules:"
 msgstr ""
 
-#: cmdline/apt-get.cc:2697
+#: cmdline/apt-get.cc:2691
 msgid ""
 "Usage: apt-get [options] command\n"
 "       apt-get [options] install|remove pkg1 [pkg2 ...]\n"
@@ -1163,7 +1174,7 @@ msgid ""
 "                       This APT has Super Cow Powers.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2864
+#: cmdline/apt-get.cc:2858
 msgid ""
 "NOTE: This is only a simulation!\n"
 "      apt-get needs root privileges for real execution.\n"