[elbe-devel] [PATCH v2 3/7] cdroms: fix difference in pkg lists after bin-cdrom.iso rebuild

Bastian Germann bage at linutronix.de
Fri Jan 15 17:55:28 CET 2021


Am 14.01.21 um 18:07 schrieb Torben Hohn:
> Rebuild of a bin-cdrom.iso results in different packages in the
> build output. This triggers an Error in the "Full Packagelist validation".
> 
> This happens because some packages on the CDROM do not have the same
> Priority set as on the debian mirror. Priority on the CDROM is taken
> from the control file inside the pkg, while the priority on the debian
> mirror is change via an overrides file for some packages.

Typo: changed

> 
> debootstrap looks at the Packages file, to decide which pkgs are required.

no comma involved.

> 
> The fix is to make sure that the generated CDROM has the exact same
> Priorities set as the debian mirror:
> 
> * Extend aptpkgutils.PackageBase with priority fields.
> * Fill them from both APTPAckage and XMLPackage.
> * Extend the schema to allow recording the priority for a pkg.
> * Actually record the new attribute into the DOM, when adding a pkg.
> * add a "prio=" parameter to repomanager.RepoBase.includedeb() and
>    set that everywhere.
> 
> Signed-off-by: Torben Hohn <torben.hohn at linutronix.de>

With the typos fixed:
Reviewed-by: Bastian Germann <bage at linutronix.de>

> ---
>   elbepack/aptpkgutils.py                | 22 ++++++++++++++++------
>   elbepack/cdroms.py                     |  4 ++--
>   elbepack/commands/fetch_initvm_pkgs.py |  2 +-
>   elbepack/elbexml.py                    |  2 ++
>   elbepack/repomanager.py                | 18 +++++++++++-------
>   schema/dbsfed.xsd                      |  7 +++++++
>   6 files changed, 39 insertions(+), 16 deletions(-)
> 
> diff --git a/elbepack/aptpkgutils.py b/elbepack/aptpkgutils.py
> index 49a02dfb8..407b25caa 100644
> --- a/elbepack/aptpkgutils.py
> +++ b/elbepack/aptpkgutils.py
> @@ -143,8 +143,10 @@ class PackageBase:
>   
>       # pylint: disable=too-many-instance-attributes
>   
> -    def __init__(self, name, installed_version,
> -                 candidate_version, installed_md5, candidate_md5,
> +    def __init__(self, name,
> +                 installed_version, candidate_version,
> +                 installed_md5, candidate_md5,
> +                 installed_prio, candidate_prio,
>                    state, is_auto_installed, origin, architecture):
>   
>           # pylint: disable=too-many-arguments
> @@ -154,6 +156,8 @@ class PackageBase:
>           self.candidate_version = candidate_version
>           self.installed_md5 = installed_md5
>           self.candidate_md5 = candidate_md5
> +        self.installed_prio = installed_prio
> +        self.candidate_prio = candidate_prio
>           self.state = state
>           self.is_auto_installed = is_auto_installed
>           self.origin = origin
> @@ -179,6 +183,8 @@ class APTPackage(PackageBase):
>           cver = pkg.candidate and pkg.candidate.version
>           imd5 = pkg.installed and apt_pkg_md5(pkg.installed)
>           cmd5 = pkg.candidate and apt_pkg_md5(pkg.candidate)
> +        iprio = pkg.installed and pkg.installed.priority
> +        cprio = pkg.candidate and pkg.candidate.priority
>   
>           self.state = pkgstate(pkg)
>           self.is_auto_installed = pkg.is_auto_installed
> @@ -195,15 +201,19 @@ class APTPackage(PackageBase):
>               arch = None
>               self.installed_deb = None
>   
> -        PackageBase.__init__(self, pkg.name, iver,
> -                             cver, imd5, cmd5,
> +        PackageBase.__init__(self, pkg.name,
> +                             iver, cver,
> +                             imd5, cmd5,
> +                             iprio, cprio,
>                                pkgstate(pkg), pkg.is_auto_installed,
>                                origin, arch)
>   
>   
>   class XMLPackage(PackageBase):
>       def __init__(self, node, arch):
> -        PackageBase.__init__(self, node.et.text, node.et.get('version'),
> -                             None, node.et.get('md5'), None,
> +        PackageBase.__init__(self, node.et.text,
> +                             node.et.get('version'), None,
> +                             node.et.get('md5'), None,
> +                             node.et.get('prio'), None,
>                                INSTALLED, node.et.get('auto') == 'true',
>                                None, arch)
> diff --git a/elbepack/cdroms.py b/elbepack/cdroms.py
> index 7bb046416..e0f8749bc 100644
> --- a/elbepack/cdroms.py
> +++ b/elbepack/cdroms.py
> @@ -161,7 +161,7 @@ def mk_binary_cdrom(rfs, arch, codename, init_codename, xml, target):
>                   deb = cache.download_binary(pkg.name,
>                                               '/var/cache/elbe/binaries/main',
>                                               pkg.installed_version)
> -                target_repo.includedeb(deb, 'main')
> +                target_repo.includedeb(deb, 'main', prio=pkg.installed_prio)
>               except ValueError:
>                   logging.error("No package '%s'", pkg_id)
>               except FetchError:
> @@ -177,7 +177,7 @@ def mk_binary_cdrom(rfs, arch, codename, init_codename, xml, target):
>               deb = cache.download_binary(pkg.name,
>                                           '/var/cache/elbe/binaries/added',
>                                           pkg.installed_version)
> -            target_repo.includedeb(deb, 'added', pkg.name, True)
> +            target_repo.includedeb(deb, 'added', pkg.name, prio=pkg.installed_prio, force=True)
>           except KeyError as ke:
>               logging.error(str(ke))
>           except ValueError:
> diff --git a/elbepack/commands/fetch_initvm_pkgs.py b/elbepack/commands/fetch_initvm_pkgs.py
> index 81dd6cd20..7524714eb 100644
> --- a/elbepack/commands/fetch_initvm_pkgs.py
> +++ b/elbepack/commands/fetch_initvm_pkgs.py
> @@ -116,7 +116,7 @@ def run_command(argv):
>                       deb = fetch_binary(pkgver,
>                                          opt.archive,
>                                          ElbeAcquireProgress(cb=None))
> -                    repo.includedeb(deb, 'main')
> +                    repo.includedeb(deb, 'main', prio=pkgver.priority)
>                   except ValueError:
>                       logging.exception('No package "%s"', pkg_id)
>                   except FetchError:
> diff --git a/elbepack/elbexml.py b/elbepack/elbexml.py
> index fb488bb00..2a8799aff 100644
> --- a/elbepack/elbexml.py
> +++ b/elbepack/elbexml.py
> @@ -380,9 +380,11 @@ class ElbeXML:
>           if aptpkg.installed_version is not None:
>               pak.et.set('version', aptpkg.installed_version)
>               pak.et.set('md5', aptpkg.installed_md5)
> +            pak.et.set('prio', aptpkg.installed_prio)
>           else:
>               pak.et.set('version', aptpkg.candidate_version)
>               pak.et.set('md5', aptpkg.candidate_md5)
> +            pak.et.set('prio', aptpkg.candidate_prio)
>   
>           if aptpkg.is_auto_installed:
>               pak.et.set('auto', 'true')
> diff --git a/elbepack/repomanager.py b/elbepack/repomanager.py
> index 672ed1e6e..b58fb9c3d 100644
> --- a/elbepack/repomanager.py
> +++ b/elbepack/repomanager.py
> @@ -178,7 +178,7 @@ class RepoBase:
>                                                            att.codename)
>               do(cmd, env_add={'GNUPGHOME': '/var/cache/elbe/gnupg'})
>   
> -    def _includedeb(self, path, codename, components=None):
> +    def _includedeb(self, path, codename, components=None, prio=None):
>           if self.maxsize:
>               new_size = self.fs.disk_usage("") + os.path.getsize(path)
>               if new_size > self.maxsize:
> @@ -189,6 +189,9 @@ class RepoBase:
>                         "--export=never",
>                         '--basedir "%s"' % self.fs.path]
>   
> +        if prio is not None:
> +            global_opt.append(f'--priority {prio}')
> +
>           if components is not None:
>               # Compatibility with old callers
>               if isinstance(components, str):
> @@ -199,10 +202,12 @@ class RepoBase:
>   
>           do(cmd % (global_opt, codename, path))
>   
> -    def includedeb(self, path, components=None, pkgname=None, force=False):
> +    def includedeb(self, path, components=None, pkgname=None, force=False, prio=None):
>           # pkgname needs only to be specified if force is enabled
>           try:
> -            self._includedeb(path, self.repo_attr.codename, components)
> +            self._includedeb(path, self.repo_attr.codename,
> +                             components=components,
> +                             prio=prio)
>           except CommandError as ce:
>               if force and pkgname is not None:
>                   # Including deb did not work.
> @@ -211,13 +216,12 @@ class RepoBase:
>                   #
>                   # Try remove, and add again.
>                   self.removedeb(pkgname, components)
> -                self._includedeb(path, self.repo_attr.codename, components)
> +                self._includedeb(path, self.repo_attr.codename,
> +                                 components=components,
> +                                 prio=prio)
>               else:
>                   raise ce
>   
> -    def include_init_deb(self, path, components=None):
> -        self._includedeb(path, self.init_attr.codename, components)
> -
>       def _include(self, path, codename, components=None):
>   
>           cmd        = 'reprepro %s include %s %s'
> diff --git a/schema/dbsfed.xsd b/schema/dbsfed.xsd
> index 95385dc90..2bdd92ef2 100644
> --- a/schema/dbsfed.xsd
> +++ b/schema/dbsfed.xsd
> @@ -2581,6 +2581,13 @@
>               </documentation>
>             </annotation>
>           </attribute>
> +        <attribute name="prio" type="string" use="optional">
> +          <annotation>
> +            <documentation>
> +              priority of the package in the original repository.
> +            </documentation>
> +          </annotation>
> +        </attribute>
>           <attribute name="on_src_cd" type="string" use="optional">
>             <annotation>
>               <documentation>
> 


More information about the elbe-devel mailing list