[Yum-devel] [PATCH 3/3] background downloading: presto hacks
James Antill
james.antill at redhat.com
Fri Oct 5 15:37:59 UTC 2012
On Fri, 2012-10-05 at 15:50 +0200, Zdeněk Pavlas wrote:
> ---
> cli.py | 28 +++++++++++++++++++++++++++-
> yum/misc.py | 10 ++++++++++
> 2 files changed, 37 insertions(+), 1 deletions(-)
>
> diff --git a/cli.py b/cli.py
> index 3499273..28d520f 100755
> --- a/cli.py
> +++ b/cli.py
> @@ -42,7 +42,7 @@ from yum import _, P_
> from yum.rpmtrans import RPMTransaction
> import signal
> import yumcommands
> -import tempfile
> +import tempfile, shutil
>
> from yum.i18n import to_unicode, to_utf8, exception2msg
>
> @@ -568,6 +568,29 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
> po.basepath
> po.returnChecksums()
>
> + # downloadPkgs() will run predownload hooks without yum lock, so plugins may break.
> + # This is a presto-specific hack. We'll probably have to merge it to core anyway.
> + moved = []
> + presto, conf = self.plugins._plugins.get('presto') or (None, None)
> + if conf and conf.getboolean('main', 'enabled'):
> + repos = {}
> + for po in downloadpkgs:
> + if po.state == yum.constants.TS_UPDATE:
> + repos[po.repo] = repos.get(po.repo, 0) + po.size
> + for repo in repos:
> + try: md = repo.repoXML.getData('prestodelta')
> + except yum.Errors.YumRepoMDError: continue
> + if int(md.size) > repos[repo]:
> + continue
> +
> + # Presto may use this repository- move it.
> + old = repo.cachedir
> + new = tempfile.mkdtemp(dir=old)
> + fn = repo._retrieveMD('prestodelta')
> + os.link(fn, new +'/'+ os.path.basename(fn))
> + repo._dir_setup_cachedir = new
> + moved.append((repo, old, new))
The metadata's official label is "deltainfo" ... but really if we call
_retrieveMD() without the lock held we aren't going to have a good time.
> # close DBs, unlock
> self.repos.close()
> self.closeRpmDB()
> @@ -601,6 +624,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
> # remove temporary directories
> for tmp in tmpdir.values():
> os.rmdir(tmp)
> + for repo, old, new in moved:
> + yum.misc.rmdir_f(new)
> + repo._dir_setup_cachedir = old
>
> if len(problems) > 0:
> errstring = ''
> diff --git a/yum/misc.py b/yum/misc.py
> index 0fd3e90..8d23770 100644
> --- a/yum/misc.py
> +++ b/yum/misc.py
> @@ -1208,3 +1208,13 @@ def cElementTree_xmlparse(filename):
> """ Lazily load/run: cElementTree.parse """
> _cElementTree_import()
> return __cached_cElementTree.parse(filename)
> +
> +def rmdir_f(path):
> + """ rm -rf path """
> + for fn in os.listdir(path):
> + fn = path +'/'+ fn
> + if os.path.isdir(fn):
> + rmdir_f(fn)
> + else:
> + os.unlink(fn)
> + os.rmdir(path)
This is a really bad name, the stat_f and unlink_f functions mean "this
function doesn't throw some/all exceptions" ... "rm -rf" is also in the
std. library as shutils.rmtree().
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part
URL: <http://lists.baseurl.org/pipermail/yum-devel/attachments/20121005/84dc6572/attachment.asc>
More information about the Yum-devel
mailing list