From 026f60e2c5601c4db42220cd20af9bfe066b2d83 Mon Sep 17 00:00:00 2001
From: Michael Vogt <michael.vogt@ubuntu.com>
Date: Tue, 18 Oct 2005 13:36:47 +0000
Subject: * inital support for "apt-get source -t dist" (but no downgrades yet

---
 cmdline/apt-get.cc | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

(limited to 'cmdline/apt-get.cc')

diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index a22d881b6..55681d59e 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1194,8 +1194,16 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
    {
       VerTag = string(TmpSrc.begin() + Slash + 1,TmpSrc.end());
       TmpSrc = string(TmpSrc.begin(),TmpSrc.begin() + Slash);
+   } else if(_config->Find("APT::Default-Release") != "") {
+      // if we have a Default-Release (-t) we want a exact match
+      // FIXME: we won't support downgrades 
+      // (i.e. -t stable won't work on a unstable system
+      pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
+      if(Pkg.end() == false) {
+	 pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);  
+	 VerTag = Ver.VerStr();
+      }
    }
-   
    /* 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. In theory
-- 
cgit v1.2.3


From aca056a93dda08ad03690b4b70295832a723a655 Mon Sep 17 00:00:00 2001
From: Michael Vogt <michael.vogt@ubuntu.com>
Date: Tue, 18 Oct 2005 22:42:09 +0000
Subject: * full support for apt-get source -t now (and honor pining too)

---
 cmdline/apt-get.cc | 61 +++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 17 deletions(-)

(limited to 'cmdline/apt-get.cc')

diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 55681d59e..82f202103 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1190,35 +1190,62 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
    string VerTag;
    string TmpSrc = Name;
    string::size_type Slash = TmpSrc.rfind('=');
+
+   // honor pining and default release
+   string DefRel = _config->Find("APT::Default-Release");
+
+   pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
+   pkgCache::VerIterator CandVer = Cache.GetCandidateVer(Pkg);  
+   if(Pkg.end() == false) 
+   {
+      VerTag = CandVer.VerStr();
+   }
+
    if (Slash != string::npos)
    {
       VerTag = string(TmpSrc.begin() + Slash + 1,TmpSrc.end());
       TmpSrc = string(TmpSrc.begin(),TmpSrc.begin() + Slash);
-   } else if(_config->Find("APT::Default-Release") != "") {
-      // if we have a Default-Release (-t) we want a exact match
-      // FIXME: we won't support downgrades 
-      // (i.e. -t stable won't work on a unstable system
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
-      if(Pkg.end() == false) {
-	 pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);  
-	 VerTag = Ver.VerStr();
+   } 
+   else  if(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++)
+      {
+	 for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false;
+	      VF++)
+	 {
+	    /* 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;
+	    
+	    //std::cout << VF.File().Archive() << std::endl;
+	    if(VF.File().Archive() == DefRel) 
+	    {
+	       VerTag = Ver.VerStr();
+	       break;
+	    }
+	 }
       }
    }
+
    /* 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. In theory
-      we could stash the version string as well and match that too but
-      today there aren't multi source versions in the archive. */
-   if (_config->FindB("APT::Get::Only-Source") == false && 
-       VerTag.empty() == true)
+      in the archive for a source package of the same name. */
+   if (_config->FindB("APT::Get::Only-Source") == false)
    {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
       if (Pkg.end() == false)
       {
-	 pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);      
-	 if (Ver.end() == false)
+	 if (CandVer.end() == false)
 	 {
-	    pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
+	    pkgRecords::Parser &Parse = Recs.Lookup(CandVer.FileList());
 	    Src = Parse.SourcePkg();
 	 }
       }   
-- 
cgit v1.2.3


From d87116efb8c7382cc463f5208277470fce129d12 Mon Sep 17 00:00:00 2001
From: Michael Vogt <michael.vogt@ubuntu.com>
Date: Wed, 19 Oct 2005 12:34:19 +0000
Subject: * fix segfault when there is no Archive for a VerFile

---
 cmdline/apt-get.cc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'cmdline/apt-get.cc')

diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 82f202103..3ffb740a6 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1227,7 +1227,7 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
 	    continue;
 	    
 	    //std::cout << VF.File().Archive() << std::endl;
-	    if(VF.File().Archive() == DefRel) 
+	    if(VF.File().Archive() && (VF.File().Archive() == DefRel)) 
 	    {
 	       VerTag = Ver.VerStr();
 	       break;
-- 
cgit v1.2.3


From ce6162bed91fd2e508d751d3d88dd16f3d97c8d3 Mon Sep 17 00:00:00 2001
From: Michael Vogt <michael.vogt@ubuntu.com>
Date: Wed, 19 Oct 2005 13:51:20 +0000
Subject: * don't get candidate release as version tag for FindSrc by default.
 because it break for bin-NMUs :/ (e.g. dpkg source is 1.13.11, but i386
 version string is 1.13.11.0.1)

---
 cmdline/apt-get.cc | 18 +++++-------------
 1 file changed, 5 insertions(+), 13 deletions(-)

(limited to 'cmdline/apt-get.cc')

diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 3ffb740a6..6e17611cb 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1191,15 +1191,9 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
    string TmpSrc = Name;
    string::size_type Slash = TmpSrc.rfind('=');
 
-   // honor pining and default release
+   // honor default release
    string DefRel = _config->Find("APT::Default-Release");
-
    pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
-   pkgCache::VerIterator CandVer = Cache.GetCandidateVer(Pkg);  
-   if(Pkg.end() == false) 
-   {
-      VerTag = CandVer.VerStr();
-   }
 
    if (Slash != string::npos)
    {
@@ -1243,9 +1237,10 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
    {
       if (Pkg.end() == false)
       {
-	 if (CandVer.end() == false)
+	 pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);
+	 if (Ver.end() == false)
 	 {
-	    pkgRecords::Parser &Parse = Recs.Lookup(CandVer.FileList());
+	    pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
 	    Src = Parse.SourcePkg();
 	 }
       }   
@@ -1300,10 +1295,7 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
       }      
    }
    
-   if (Last == 0)
-      return 0;
-   
-   if (Last->Jump(Offset) == false)
+   if (Last == 0 || Last->Jump(Offset) == false)
       return 0;
    
    return Last;
-- 
cgit v1.2.3