On Fri, Oct 5, 2012 at 5:37 PM, James Antill <[email protected]>wrote:
> 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().
>
>
> _______________________________________________
> Yum-devel mailing list
> [email protected]
> http://lists.baseurl.org/mailman/listinfo/yum-devel
>
>
I really don't like the ways this is going, if we want presto in core, so
lets us do that, these kind of hacks make me shake all over :)
The rmdir_f is also "very" scary, it might need some extra check so it is
not possible to do self.rmdir_f('/')
Tim
_______________________________________________
Yum-devel mailing list
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel