=== modified file 'cmdline/apt-get.cc' --- cmdline/apt-get.cc 2010-07-18 16:24:17 +0000 +++ cmdline/apt-get.cc 2010-11-08 18:57:46 +0000 @@ -2856,9 +2856,11 @@ for (const char **I = CmdL.FileList + 1; *I != 0; I++,pos++) { const char *p; + char *VerTag = NULL; int eq = 0, gt = 0, lt = 0; const char *sep = strpbrk(*I,"=><"); string FirstConst; + pkgCache::VerIterator MatchedVer = NULL; if (strcmp(*I,"aux:")==0) { @@ -2881,17 +2883,46 @@ // *sep = '\0'; } + /* Check for versioned requests */ + char *S = *I; + char *Slash = strchr(S, '='); + if (Slash != 0) + { + *Slash = 0; + VerTag = Slash + 1; + } + pkgCache::PkgIterator Pkg = Cache.FindPkg(*I); - if (Pkg.end() == true) - { - _error->Warning(_("Unable to locate package %s"),*I); - continue; - } - Colours[Pkg->ID] = 2; - - //Top of the list is the version with higher priority - // ToDo: Check against operator passed by user - pkgCache::VerIterator Ver = Pkg.VersionList(); + if (Pkg.end() == true) + { + _error->Warning(_("Unable to locate package %s"),*I); + continue; + } + /*Find the specific version if requested */ + if (VerTag != NULL) + { + pkgVersionMatch Match(VerTag, pkgVersionMatch::Version); + + MatchedVer = Match.Find(Pkg); + + if (Ver.end() == true) + { + _error->Warning(_("Version '%s' for '%s' was not found"), + VerTag,Pkg.Name()); + continue; + } + /* Warn if we chose a not exactly-equal match */ + if (strcmp(VerTag,Ver.VerStr()) != 0) + { + ioprintf(c1out,_("Selected version %s (%s) for %s\n"), + Ver.VerStr(),Ver.RelStr().c_str(),Pkg.Name()); + } + + } + Colours[Pkg->ID] = 2; + + /* Choose APTs candidate version if unversioned request or choose specific matched version */ + pkgCache::VerIterator Ver = MatchedVer== NULL ? Pkg.VersionList(): MatchedVer; if (Ver == NULL){ // If the user wants to install a virtual package we have to expand the reverse provides