[Yum] building plugin that simulates repository...

James Antill james-yum at and.org
Fri Oct 14 13:31:10 UTC 2011


Dmitry Makovey <dmitry at athabascau.ca> writes:

> Hi James,
>
> thanks for the reply! Some clarifications inline...
>
> On Thursday, October 13, 2011, James Antill wrote:
>> Dmitry Makovey <dmitry at athabascau.ca> writes:
>> > Hi,
>> > 
>> > I'm trying to build a plugin that would dynamically "inject" local
>> > "repositories" (which are nothing more than collections of RPM files) but
>> > I keep on bumping into problems. Latest one is:
>> > 
>> > File "/usr/lib/python2.4/site-packages/yum/packages.py", line 1145, in
>> > __getattr__
>> > 
>> >     return self.hdr[thing]
>> > 
>> > KeyError: 'unknown header tag'
[...]
>>  Change the code to what is done upstream (gives the attribute name),
>> will help debugging a lot. 
>
> you got me there. What do you mean? So far I'm stuck trying to figure out what 
> the hdr['tag'] should include - from what I've seen _populatePrco() is 
> supposed to do exactly that, but apparently it doesn't. 

 This is __getattr__ from current upstream:

    def __getattr__(self, thing):
        #FIXME - if an error - return AttributeError, not KeyError 
        # ONLY FIX THIS AFTER THE API BREAK
        if thing.startswith('__') and thing.endswith('__'):
            # If these existed, then we wouldn't get here ...
            # So these are missing.
            raise AttributeError, "%s has no attribute %s" % (self, thing)
        try:
            return self.hdr[thing]
        except KeyError:
            #  Note above, API break to fix this ... this at least is a nicer
            # msg. so we know what we accessed that is bad.
            raise KeyError, "%s has no attribute %s" % (self, thing)
        except ValueError:
            #  Note above, API break to fix this ... this at least is a nicer
            # msg. so we know what we accessed that is bad.
            raise ValueError, "%s has no attribute %s" % (self, thing)

[...]
>   File "/usr/lib/python2.4/site-packages/yum/packages.py", line 1145, in 
> __getattr__
>     return self.hdr[thing]
> KeyError: 'unknown header tag'

...which will at least tell you what 'thing' is here, which should
give some idea about why it can't find it.

>>  The attached code looks like it should work (just creating a normal
>> PackageSack() out of YumLocalPackages(), AIUI). So you should be able
>> to debug it and have it work ... and I'd thought about adding
>> something like that to core yum too, for a few reasons, so parts of it
>> could go upstream.
>
> thus the intent to go as "generic" as I can get away with. 

 *nods*

>>  However if you don't need to squeeze every last bit of speed out of
>> it, look at what the tmprepo plugin does and just do that (I'm
>> assuming it the tmprepo way isn't _much_ slower).
>
> tmprepo is where I've got the "inspiration" but turned out it was creating 
> temp files on a disk (in other words being a bit "hackish").

 Yeh, it's not great (relies on createrepo etc.) ... but it works. If
you create a real "dir. repo" then it'd probably move to using that
pretty quickly :)

-- 
James Antill -- james at and.org


More information about the Yum mailing list