[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#687255: apt_preferences(5) support for pinning by architecture



Package: apt
Version: 0.9.7.4
Severity: normal
Tags: patch

Moving the discussion about pinning by architecture to a new report.
Original context is <http://bugs.debian.org/670322>

On 11 September 2012 09:18, Daniel Hartwig <mandyke@gmail.com> wrote:
>> Arch-qualification will work for specific-packages stanzas only,
>
> A bit of a hack but it worked when I tested it. apt-cache policy
> listed every armel package as pinned, which is not very nice output
> ;-)

Looks like I misread and thought you were saying that doesn't work.
Sorry for that :-)

>
>> but you can do this:
>> Package: *
>> Pin: release n=squeeze,b=armel
>> Pin-Priority: 991
>
> A better format, though it is not documented or working (?) in 0.9.7.4:

I see where the support for this is in versionmatch.cc and the above
seems to not work because PackageFile::Architecture is never
populated.  Actually, python-apt docs say this is normal:

> class apt_pkg.PackageFile
> …
> architecture
> The architecture of the package file. This attribute normally
> contains an empty string and is thus not very useful.

Is there a reason for that (maybe to do with arch: all)?  Looks like
it could be done in debListParser::LoadReleaseInfo (or
debPackagesIndex::Merge).

I have attached a first attempt at a patch, which partially works
(obviously needs more testing).

Note that the candidate for aptitude /seems/ wrong, but technically
the first stanza (“Package: *”) does not apply since the second is
more specific.  Changing the second to “Package: aptitude:amd64” gives
better output but defeats the purpose of using “b=amd64”, at least on
specific-package stanzas.

Note also in the reportbug info that my apt policy has /two/ entries
for experimental.

-- with patch applied:
$ cat /etc/apt/preferences
Package: *
Pin: release a=experimental,b=i386
Pin-Priority: 991

Package: aptitude
Pin: release a=experimental,b=amd64
Pin-Priority: 992
$ apt-cache policy
Package files:
 100 /var/lib/dpkg/status
     release a=now
 500 http://ftp.iinet.net.au/debian/debian/ experimental/main Translation-en
 991 http://ftp.iinet.net.au/debian/debian/ experimental/main i386 Packages
     release o=Debian,a=experimental,n=experimental,l=Debian,c=main,b=i386
     origin ftp.iinet.net.au
   1 http://ftp.iinet.net.au/debian/debian/ experimental/main amd64 Packages
     release o=Debian,a=experimental,n=experimental,l=Debian,c=main,b=amd64
     origin ftp.iinet.net.au
 500 http://ftp.iinet.net.au/debian/debian/ sid/main Translation-en
 500 http://ftp.iinet.net.au/debian/debian/ sid/main i386 Packages
     release o=Debian,a=unstable,n=sid,l=Debian,c=main,b=i386
     origin ftp.iinet.net.au
 500 http://ftp.iinet.net.au/debian/debian/ sid/main amd64 Packages
     release o=Debian,a=unstable,n=sid,l=Debian,c=main,b=amd64
     origin ftp.iinet.net.au
Pinned packages:
     aptitude:amd64 -> 0.6.9.1-1
     aptitude -> (not found)
$ apt-cache policy aptitude aptitude:amd64
aptitude:
  Installed: 0.6.8.1-1
  Candidate: 0.6.8.1-1
  Package pin: (not found)
  Version table:
     0.6.9.1-1 992
        991 http://ftp.iinet.net.au/debian/debian/ experimental/main i386 Packages
     0.6.8.1-1 992
        500 http://ftp.iinet.net.au/debian/debian/ sid/main i386 Packages
 *** 0.6.8.1-1 992
        100 /var/lib/dpkg/status
aptitude:amd64:
  Installed: (none)
  Candidate: 0.6.9.1-1
  Package pin: 0.6.9.1-1
  Version table:
     0.6.9.1-1 992
          1 http://ftp.iinet.net.au/debian/debian/ experimental/main amd64 Packages
     0.6.8.1-1 992
        500 http://ftp.iinet.net.au/debian/debian/ sid/main amd64 Packages

-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (991, 'experimental'), (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)
Foreign Architectures: amd64

Kernel: Linux 2.6.32-5-686-bigmem (SMP w/1 CPU core)
Locale: LANG=en_AU.utf8, LC_CTYPE=en_AU.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages apt depends on:
ii  debian-archive-keyring  2010.08.28
ii  gnupg                   1.4.11-3
ii  libapt-pkg4.12          0.9.7.4
ii  libc6                   2.13-35
ii  libgcc1                 1:4.7.1-7
ii  libstdc++6              4.7.1-7

apt recommends no packages.

Versions of packages apt suggests:
pn  apt-doc     <none>
ii  aptitude    0.6.8.1-1
ii  dpkg-dev    1.16.8
ii  python-apt  0.8.7
ii  synaptic    0.75.13
ii  xz-utils    5.1.1alpha+20110809-3

-- no debconf information
=== modified file 'apt-pkg/deb/debindexfile.cc'
--- apt-pkg/deb/debindexfile.cc	2012-06-16 17:55:43 +0000
+++ apt-pkg/deb/debindexfile.cc	2012-09-11 07:21:28 +0000
@@ -340,7 +340,7 @@
       FileFd Rel(ReleaseFile,FileFd::ReadOnly);
       if (_error->PendingError() == true)
 	 return false;
-      Parser.LoadReleaseInfo(File,Rel,Section);
+      Parser.LoadReleaseInfo(File,Rel,Section,Architecture);
    }
    
    return true;

=== modified file 'apt-pkg/deb/deblistparser.cc'
--- apt-pkg/deb/deblistparser.cc	2012-07-09 15:42:25 +0000
+++ apt-pkg/deb/deblistparser.cc	2012-09-11 08:03:10 +0000
@@ -779,13 +779,16 @@
 // ---------------------------------------------------------------------
 /* */
 bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
-				    FileFd &File, string component)
+				    FileFd &File, string component, string architecture)
 {
    // apt-secure does no longer download individual (per-section) Release
    // file. to provide Component pinning we use the section name now
    map_ptrloc const storage = WriteUniqString(component);
    FileI->Component = storage;
 
+   map_ptrloc const storage_arch = WriteUniqString(architecture);
+   FileI->Architecture = storage_arch;
+
    // FIXME: Code depends on the fact that Release files aren't compressed
    FILE* release = fdopen(dup(File.Fd()), "r");
    if (release == NULL)
@@ -830,7 +833,7 @@
       ++lineEnd;
 
       // which datastorage need to be updated
-      enum { Suite, Component, Version, Origin, Codename, Label, None } writeTo = None;
+      enum { Suite, Component, Version, Origin, Codename, Label, Architecture, None } writeTo = None;
       if (buffer[0] == ' ')
 	 ;
       #define APT_PARSER_WRITETO(X) else if (strncmp(#X, buffer, len) == 0) writeTo = X;
@@ -840,6 +843,7 @@
       APT_PARSER_WRITETO(Origin)
       APT_PARSER_WRITETO(Codename)
       APT_PARSER_WRITETO(Label)
+      APT_PARSER_WRITETO(Architecture)
       #undef APT_PARSER_WRITETO
       #define APT_PARSER_FLAGIT(X) else if (strncmp(#X, buffer, len) == 0) \
 	 pkgTagSection::FindFlag(FileI->Flags, pkgCache::Flag:: X, dataStart, lineEnd);
@@ -879,6 +883,7 @@
 	 case Origin: FileI->Origin = storage; break;
 	 case Codename: FileI->Codename = storage; break;
 	 case Label: FileI->Label = storage; break;
+	 case Architecture: FileI->Architecture = storage; break;
 	 case None: break;
 	 }
       }

=== modified file 'apt-pkg/deb/deblistparser.h'
--- apt-pkg/deb/deblistparser.h	2011-12-13 00:22:38 +0000
+++ apt-pkg/deb/deblistparser.h	2012-09-11 07:20:30 +0000
@@ -71,7 +71,7 @@
    virtual bool Step();
    
    bool LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,FileFd &File,
-			std::string section);
+			std::string section, std::string architecture);
    
    static const char *ParseDepends(const char *Start,const char *Stop,
 			    std::string &Package,std::string &Ver,unsigned int &Op,


Reply to: