]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-get.cc
warning: cast from type A to type B casts away qualifiers [-Wcast-qual]
[apt.git] / cmdline / apt-get.cc
index 15742c8e51f9a9b4bfb621ca152e5fe76c67fd9c..f8de80a91c40a75f40b471705a66633ff44f3d56 100644 (file)
@@ -15,7 +15,7 @@
       upgrade - Smart-Download the newest versions of all packages
       dselect-upgrade - Follows dselect's changes to the Status: field
                        and installes new and removes old packages
       upgrade - Smart-Download the newest versions of all packages
       dselect-upgrade - Follows dselect's changes to the Status: field
                        and installes new and removes old packages
-      dist-upgrade - Powerfull upgrader designed to handle the issues with
+      dist-upgrade - Powerful upgrader designed to handle the issues with
                     a new distribution.
       install - Download and install a given package (by name, not by .deb)
       check - Update the package cache and check for broken packages
                     a new distribution.
       install - Download and install a given package (by name, not by .deb)
       check - Update the package cache and check for broken packages
@@ -135,28 +135,36 @@ bool TryToInstallBuildDep(pkgCache::PkgIterator Pkg,pkgCacheFile &Cache,
 }
                                                                        /*}}}*/
 
 }
                                                                        /*}}}*/
 
-// FIXME: move into more generic code (metaindex ?)
-std::string MetaIndexFileName(metaIndex *metaindex)
+
+// helper that can go wit hthe next ABI break
+#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13)
+std::string MetaIndexFileNameOnDisk(metaIndex *metaindex)
 {
    // FIXME: this cast is the horror, the horror
    debReleaseIndex *r = (debReleaseIndex*)metaindex;
 
    // see if we have a InRelease file
 {
    // FIXME: this cast is the horror, the horror
    debReleaseIndex *r = (debReleaseIndex*)metaindex;
 
    // see if we have a InRelease file
-   std::string PathInRelease =  _config->FindDir("Dir::State::lists") +
-      URItoFileName(r->MetaIndexURI("InRelease"));
+   std::string PathInRelease =  r->MetaIndexFile("InRelease");
    if (FileExists(PathInRelease))
       return PathInRelease;
 
    // and if not return the normal one
    if (FileExists(PathInRelease))
       return PathInRelease;
 
    // and if not return the normal one
-   return _config->FindDir("Dir::State::lists") +
-      URItoFileName(r->MetaIndexURI("Release"));
+   if (FileExists(PathInRelease))
+      return r->MetaIndexFile("Release");
+
+   return "";
 }
 }
+#endif
 
 
+// GetReleaseForSourceRecord - Return Suite for the given srcrecord    /*{{{*/
+// ---------------------------------------------------------------------
+/* */
 std::string GetReleaseForSourceRecord(pkgSourceList *SrcList,
                                       pkgSrcRecords::Parser *Parse)
 {
    // try to find release
 std::string GetReleaseForSourceRecord(pkgSourceList *SrcList,
                                       pkgSrcRecords::Parser *Parse)
 {
    // try to find release
-   const pkgIndexFile& SI = Parse->Index();
+   const pkgIndexFile& CurrentIndexFile = Parse->Index();
+
    for (pkgSourceList::const_iterator S = SrcList->begin(); 
         S != SrcList->end(); ++S)
    {
    for (pkgSourceList::const_iterator S = SrcList->begin(); 
         S != SrcList->end(); ++S)
    {
@@ -164,19 +172,25 @@ std::string GetReleaseForSourceRecord(pkgSourceList *SrcList,
       for (vector<pkgIndexFile *>::const_iterator IF = Indexes->begin();
            IF != Indexes->end(); ++IF)
       {
       for (vector<pkgIndexFile *>::const_iterator IF = Indexes->begin();
            IF != Indexes->end(); ++IF)
       {
-         if (&SI == (*IF))
+         if (&CurrentIndexFile == (*IF))
          {
          {
-            std::string path = MetaIndexFileName(*S);
-            indexRecords records;
-            records.Load(path);
-            return records.GetSuite();
+#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13)
+            std::string path = MetaIndexFileNameOnDisk(*S);
+#else
+            std::string path = (*S)->LocalFileName();
+#endif
+            if (path != "") 
+            {
+               indexRecords records;
+               records.Load(path);
+               return records.GetSuite();
+            }
          }
       }
    }
    return "";
 }
          }
       }
    }
    return "";
 }
-
-
+                                                                       /*}}}*/
 // FindSrc - Find a source record                                      /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 // FindSrc - Find a source record                                      /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -184,18 +198,31 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
                               pkgSrcRecords &SrcRecs,string &Src,
                               CacheFile &CacheFile)
 {
                               pkgSrcRecords &SrcRecs,string &Src,
                               CacheFile &CacheFile)
 {
-   string VerTag;
+   string VerTag, UserRequestedVerTag;
+   string ArchTag = "";
    string RelTag = _config->Find("APT::Default-Release");
    string TmpSrc = Name;
    pkgDepCache *Cache = CacheFile.GetDepCache();
 
    string RelTag = _config->Find("APT::Default-Release");
    string TmpSrc = Name;
    pkgDepCache *Cache = CacheFile.GetDepCache();
 
-   // extract the version/release from the pkgname
-   const size_t found = TmpSrc.find_last_of("/=");
-   if (found != string::npos) {
-      if (TmpSrc[found] == '/')
-        RelTag = TmpSrc.substr(found+1);
-      else
-        VerTag = TmpSrc.substr(found+1);
+   // extract release
+   size_t found = TmpSrc.find_last_of("/");
+   if (found != string::npos) 
+   {
+      RelTag = TmpSrc.substr(found+1);
+      TmpSrc = TmpSrc.substr(0,found);
+   }
+   // extract the version
+   found = TmpSrc.find_last_of("=");
+   if (found != string::npos) 
+   {
+      VerTag = UserRequestedVerTag = TmpSrc.substr(found+1);
+      TmpSrc = TmpSrc.substr(0,found);
+   }
+   // extract arch 
+   found = TmpSrc.find_last_of(":");
+   if (found != string::npos) 
+   {
+      ArchTag = TmpSrc.substr(found+1);
       TmpSrc = TmpSrc.substr(0,found);
    }
 
       TmpSrc = TmpSrc.substr(0,found);
    }
 
@@ -203,10 +230,25 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
       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");
       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);
+   pkgCache::PkgIterator Pkg;
+   if (ArchTag != "")
+      Pkg = Cache->FindPkg(TmpSrc, ArchTag);
+   else
+      Pkg = Cache->FindPkg(TmpSrc);
+
+   // if we can't find a package but the user qualified with a arch,
+   // error out here
+   if (Pkg.end() && ArchTag != "")
+   {
+      Src = Name;
+      _error->Error(_("Can not find a package for architecture '%s'"),
+                    ArchTag.c_str());
+      return 0;
+   }
+
    if (MatchSrcOnly == false && Pkg.end() == false) 
    {
    if (MatchSrcOnly == false && Pkg.end() == false) 
    {
-      if(VerTag.empty() == false || RelTag.empty() == false) 
+      if(VerTag != "" || RelTag != "" || ArchTag != "")
       {
         bool fuzzy = false;
         // we have a default release, try to locate the pkg. we do it like
       {
         bool fuzzy = false;
         // we have a default release, try to locate the pkg. we do it like
@@ -226,6 +268,17 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
               if (Ver.end() == true)
                  break;
            }
               if (Ver.end() == true)
                  break;
            }
+
+            // ignore arches that are not for us
+            if (ArchTag != "" && Ver.Arch() != ArchTag)
+               continue;
+
+            // pick highest version for the arch unless the user wants
+            // something else
+            if (ArchTag != "" && VerTag == "" && RelTag == "")
+               if(Cache->VS().CmpVersion(VerTag, Ver.VerStr()) < 0)
+                  VerTag = Ver.VerStr();
+
            // We match against a concrete version (or a part of this version)
            if (VerTag.empty() == false &&
                (fuzzy == true || Cache->VS().CmpVersion(VerTag, Ver.VerStr()) != 0) && // exact match
            // We match against a concrete version (or a part of this version)
            if (VerTag.empty() == false &&
                (fuzzy == true || Cache->VS().CmpVersion(VerTag, Ver.VerStr()) != 0) && // exact match
@@ -266,6 +319,20 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
               break;
         }
       }
               break;
         }
       }
+
+      if (Src == "" && ArchTag != "")
+      {
+         if (VerTag != "")
+            _error->Error(_("Can not find a package '%s' with version '%s'"),
+                          Pkg.FullName().c_str(), VerTag.c_str());
+         if (RelTag != "")
+            _error->Error(_("Can not find a package '%s' with release '%s'"),
+                          Pkg.FullName().c_str(), RelTag.c_str());
+         Src = Name;
+         return 0;
+      }
+
+
       if (Src.empty() == true)
       {
         // if we don't have found a fitting package yet so we will
       if (Src.empty() == true)
       {
         // if we don't have found a fitting package yet so we will
@@ -304,7 +371,6 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
    pkgSrcRecords::Parser *Last = 0;
    unsigned long Offset = 0;
    string Version;
    pkgSrcRecords::Parser *Last = 0;
    unsigned long Offset = 0;
    string Version;
-   string FoundRel;
    pkgSourceList *SrcList = CacheFile.GetSourceList();
 
    /* Iterate over all of the hits, which includes the resulting
    pkgSourceList *SrcList = CacheFile.GetSourceList();
 
    /* Iterate over all of the hits, which includes the resulting
@@ -316,21 +382,19 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
       while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0) 
       {
         const string Ver = Parse->Version();
       while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0) 
       {
         const string Ver = Parse->Version();
-         const string Rel = GetReleaseForSourceRecord(SrcList, Parse);
 
 
-         if (RelTag != "" && Rel == RelTag)
+         // See if we need to look for a specific release tag
+         if (RelTag != "" && UserRequestedVerTag == "")
          {
          {
-            ioprintf(c1out, "Selectied version '%s' (%s) for %s\n", 
-                     Ver.c_str(), RelTag.c_str(), Src.c_str());
-            Last = Parse;
-            Offset = Parse->Offset();
-            Version = Ver;
-            FoundRel = RelTag;
-            break;
-         }
+            const string Rel = GetReleaseForSourceRecord(SrcList, Parse);
 
 
-         if (RelTag.empty() == false && (RelTag == FoundRel))
-            break;
+            if (Rel == RelTag)
+            {
+               Last = Parse;
+               Offset = Parse->Offset();
+               Version = Ver;
+            }
+         }
 
         // Ignore all versions which doesn't fit
         if (VerTag.empty() == false &&
 
         // Ignore all versions which doesn't fit
         if (VerTag.empty() == false &&
@@ -344,14 +408,18 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
            Version = Ver;
         }
 
            Version = Ver;
         }
 
-        // was the version check above an exact match? If so, we don't need to look further
+        // was the version check above an exact match?
+         // If so, we don't need to look further
          if (VerTag.empty() == false && (VerTag == Ver))
          if (VerTag.empty() == false && (VerTag == Ver))
-         {
            break;
            break;
-         }
       }
       }
+      if (UserRequestedVerTag == "" && Version != "" && RelTag != "")
+         ioprintf(c1out, "Selected version '%s' (%s) for %s\n", 
+                  Version.c_str(), RelTag.c_str(), Src.c_str());
+
       if (Last != 0 || VerTag.empty() == true)
         break;
       if (Last != 0 || VerTag.empty() == true)
         break;
+      _error->Error(_("Can not find version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str());
       return 0;
    }
 
       return 0;
    }
 
@@ -445,7 +513,7 @@ bool DoDSelectUpgrade(CommandLine &CmdL)
    }
 
    /* Resolve any problems that dselect created, allupgrade cannot handle
    }
 
    /* Resolve any problems that dselect created, allupgrade cannot handle
-      such things. We do so quite agressively too.. */
+      such things. We do so quite aggressively too.. */
    if (Cache->BrokenCount() != 0)
    {      
       pkgProblemResolver Fix(Cache);
    if (Cache->BrokenCount() != 0)
    {      
       pkgProblemResolver Fix(Cache);
@@ -562,8 +630,8 @@ bool DoDownload(CommandLine &CmdL)
       return false;
 
    APT::CacheSetHelper helper(c0out);
       return false;
 
    APT::CacheSetHelper helper(c0out);
-   APT::VersionList verset = APT::VersionList::FromCommandLine(Cache,
-               CmdL.FileList + 1, APT::VersionList::CANDIDATE, helper);
+   APT::VersionSet verset = APT::VersionSet::FromCommandLine(Cache,
+               CmdL.FileList + 1, APT::VersionSet::CANDIDATE, helper);
 
    if (verset.empty() == true)
       return false;
 
    if (verset.empty() == true)
       return false;
@@ -582,7 +650,7 @@ bool DoDownload(CommandLine &CmdL)
    std::string const cwd = SafeGetCWD();
    _config->Set("Dir::Cache::Archives", cwd);
    int i = 0;
    std::string const cwd = SafeGetCWD();
    _config->Set("Dir::Cache::Archives", cwd);
    int i = 0;
-   for (APT::VersionList::const_iterator Ver = verset.begin();
+   for (APT::VersionSet::const_iterator Ver = verset.begin();
         Ver != verset.end(); ++Ver, ++i)
    {
       pkgAcquire::Item *I = new pkgAcqArchive(&Fetcher, SrcList, &Recs, *Ver, storefile[i]);
         Ver != verset.end(); ++Ver, ++i)
    {
       pkgAcquire::Item *I = new pkgAcqArchive(&Fetcher, SrcList, &Recs, *Ver, storefile[i]);
@@ -610,14 +678,17 @@ bool DoDownload(CommandLine &CmdL)
 
    // copy files in local sources to the current directory
    for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); ++I)
 
    // copy files in local sources to the current directory
    for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); ++I)
-      if ((*I)->Local == true && (*I)->Status == pkgAcquire::Item::StatDone)
+   {
+      std::string const filename = cwd + flNotDir((*I)->DestFile);
+      if ((*I)->Local == true &&
+          filename != (*I)->DestFile &&
+          (*I)->Status == pkgAcquire::Item::StatDone)
       {
       {
-        std::string const filename = cwd + flNotDir((*I)->DestFile);
         std::ifstream src((*I)->DestFile.c_str(), std::ios::binary);
         std::ofstream dst(filename.c_str(), std::ios::binary);
         dst << src.rdbuf();
       }
         std::ifstream src((*I)->DestFile.c_str(), std::ios::binary);
         std::ofstream dst(filename.c_str(), std::ios::binary);
         dst << src.rdbuf();
       }
-
+   }
    return Failed == false;
 }
                                                                        /*}}}*/
    return Failed == false;
 }
                                                                        /*}}}*/
@@ -899,6 +970,12 @@ bool DoSource(CommandLine &CmdL)
            string buildopts = _config->Find("APT::Get::Host-Architecture");
            if (buildopts.empty() == false)
               buildopts = "-a" + buildopts + " ";
            string buildopts = _config->Find("APT::Get::Host-Architecture");
            if (buildopts.empty() == false)
               buildopts = "-a" + buildopts + " ";
+
+           // get all active build profiles
+           std::string const profiles = APT::Configuration::getBuildProfilesString();
+           if (profiles.empty() == false)
+              buildopts.append(" -P").append(profiles).append(" ");
+
            buildopts.append(_config->Find("DPkg::Build-Options","-b -uc"));
 
            // Call dpkg-buildpackage
            buildopts.append(_config->Find("DPkg::Build-Options","-b -uc"));
 
            // Call dpkg-buildpackage
@@ -1468,14 +1545,12 @@ bool DoChangelog(CommandLine &CmdL)
    bool const downOnly = _config->FindB("APT::Get::Download-Only", false);
 
    char tmpname[100];
    bool const downOnly = _config->FindB("APT::Get::Download-Only", false);
 
    char tmpname[100];
-   char* tmpdir = NULL;
+   const char* tmpdir = NULL;
    if (downOnly == false)
    {
    if (downOnly == false)
    {
-      const char* const tmpDir = getenv("TMPDIR");
-      if (tmpDir != NULL && *tmpDir != '\0')
-        snprintf(tmpname, sizeof(tmpname), "%s/apt-changelog-XXXXXX", tmpDir);
-      else
-        strncpy(tmpname, "/tmp/apt-changelog-XXXXXX", sizeof(tmpname));
+      std::string systemTemp = GetTempDir();
+      snprintf(tmpname, sizeof(tmpname), "%s/apt-changelog-XXXXXX", 
+               systemTemp.c_str());
       tmpdir = mkdtemp(tmpname);
       if (tmpdir == NULL)
         return _error->Errno("mkdtemp", "mkdtemp failed");
       tmpdir = mkdtemp(tmpname);
       if (tmpdir == NULL)
         return _error->Errno("mkdtemp", "mkdtemp failed");
@@ -1611,14 +1686,6 @@ void SigWinch(int)
    if (ioctl(1, TIOCGWINSZ, &ws) != -1 && ws.ws_col >= 5)
       ScreenWidth = ws.ws_col - 1;
 #endif
    if (ioctl(1, TIOCGWINSZ, &ws) != -1 && ws.ws_col >= 5)
       ScreenWidth = ws.ws_col - 1;
 #endif
-}
-                                                                       /*}}}*/
-bool DoUpgrade(CommandLine &CmdL)                                      /*{{{*/
-{
-   if (_config->FindB("APT::Get::Upgrade-Allow-New", false) == true)
-      return DoUpgradeWithAllowNewPackages(CmdL);
-   else
-      return DoUpgradeNoNewPackages(CmdL);
 }
                                                                        /*}}}*/
 int main(int argc,const char *argv[])                                  /*{{{*/
 }
                                                                        /*}}}*/
 int main(int argc,const char *argv[])                                  /*{{{*/
@@ -1675,10 +1742,6 @@ int main(int argc,const char *argv[])                                    /*{{{*/
    // see if we are in simulate mode
    CheckSimulateMode(CmdL);
 
    // see if we are in simulate mode
    CheckSimulateMode(CmdL);
 
-   // Deal with stdout not being a tty
-   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
-      _config->Set("quiet","1");
-
    // Setup the output streams
    InitOutput();
 
    // Setup the output streams
    InitOutput();