[elbe-devel] [PATCH 2/5] rpcaptcache: Make download_source better
Olivier Dion
dion at linutronix.de
Wed May 20 04:27:00 CEST 2020
The method used to download the source package from a binary package
description. This is changed in order to be able to download source
packages that are not reference by the binary packages cache.
A reverse lookup has been tried before without much success and
python-apt lacks of any such binding. Thus, will do what fetch_source
used to do, but without passing from any binary packages.
Signed-off-by: Olivier Dion <dion at linutronix.de>
---
elbepack/rpcaptcache.py | 67 ++++++++++++++++++++++++++++++++++-------
1 file changed, 56 insertions(+), 11 deletions(-)
diff --git a/elbepack/rpcaptcache.py b/elbepack/rpcaptcache.py
index 14c3f654..847b41cd 100644
--- a/elbepack/rpcaptcache.py
+++ b/elbepack/rpcaptcache.py
@@ -16,8 +16,9 @@ import time
from multiprocessing.util import Finalize
from multiprocessing.managers import BaseManager
-from apt_pkg import config, version_compare, TagFile
+from apt_pkg import config, version_compare, TagFile, SourceRecords, Acquire, AcquireFile
from apt import Cache
+from apt.package import FetchError
from elbepack.aptprogress import (ElbeAcquireProgress, ElbeInstallProgress,
ElbeOpProgress)
@@ -333,17 +334,61 @@ class RPCAPTCache(InChRootObject):
ElbeAcquireProgress())
return self.rfs.fname(rel_filename)
- def download_source(self, pkgname, path, version=None):
- p = self.cache[pkgname]
- if version is None:
- pkgver = p.installed
- else:
- pkgver = p.versions[version]
+ def download_source(self, src_name, src_version, dest_dir):
+
+ allow_untrusted = config.find_b("APT::Get::AllowUnauthenticated",
+ False)
+
+ rec = SourceRecords()
+ acq = Acquire(ElbeAcquireProgress())
+
+ # poorman's iterator
+ while True:
+ next_p = rec.lookup(src_name)
+ # End of the list?
+ if not next_p:
+ raise ("No source found for %s_%s" % (src_name, src_version))
+ if src_version == rec.version:
+ break
+
+ # We don't allow untrusted package and the package is not
+ # marks as trusted
+ if not (allow_untrusted or rec.index.is_trusted):
+ raise FetchError("Can't fetch source %s_%s; Source %r is not trusted" %
+ (src_name, src_version, rec.index.describe))
+
+ # Copy from src to dst all files of the source package
+ dsc = None
+ files = []
+ for _file in rec.files:
+ src = os.path.basename(_file.path)
+ dst = os.path.join(dest_dir, src)
+
+ if 'dsc' == _file.type:
+ dsc = dst
+
+ if not (allow_untrusted or _file.hashes.usable):
+ raise FetchError("Can't fetch file %s. No trusted hash found." % dst)
+
+ # acq is accumlating the AcquireFile, the files list only
+ # exists to prevent Python from GC the object .. I guess.
+ # Anyway, if we don't keep the list, We will get an empty
+ # directory
+ files.append(AcquireFile(acq, rec.index.archive_uri(_file.path),
+ _file.hashes, _file.size, src, destfile=dst))
+ acq.run()
+
+ if dsc is None:
+ raise ValueError("No source found for %s_%s" %
+ (src_name, src_version))
+
+ for item in acq.items:
+ if item.STAT_DONE != item.status:
+ raise FetchError("Can't fetch item %s: %s" %
+ (item.destfile, item.error_text))
+
+ return self.rfs.fname(os.path.abspath(dsc))
- rel_filename = pkgver.fetch_source(path,
- ElbeAcquireProgress(),
- unpack=False)
- return self.rfs.fname(rel_filename)
def get_rpcaptcache(rfs, arch,
notifier=None, norecommend=False, noauth=True):
--
2.26.2
More information about the elbe-devel
mailing list