Where to send tag patches?

Benjamin Mesing bensmail@gmx.net
Sun, 23 May 2004 15:53:56 +0200


--=-1mvNHMHn4/PNJk589HnW
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Hello,

> > BTW, in the meantime I'm considering splitting the backend search code
> > from debtags-edit into a libdebtags library which can wrap libtagcoll
> > and libapt-pkg and provide debian-specific tagged collection functions,
> > including vocabulary management.  This was planned for a long time, and
> > it seems it may be the right time for it to happen.
> This sounds great. I will think about my needs during the weekend, even
> though they should nearly match the ones for your program. And there
> should be some people who would benefit from such a library (synaptic,
> installers, ...). So it should be thought through to provide a powerfull
> and easy to use API for libtagcoll and the cumbersome apt library. 

I don't think that there is a neccessity to wrap the tagcoll library as
in my opinion it is well designed. The most serious flaw is the lack of
documentation - I don't like sniffing around in foreign source :-)
Here are the features I would like to see in the library you plan:
Debtags:
      * A documenation would be great including a tutorial of how the
        data flows. For me, who did not know the consumer princip, it
        was hard to figure out, how all this stuff works. If  in a short
        introduction the principles are explained it should be much
        easier for newcomers.
      * as you mentioned earlier it would be great to implement a query
        like - return all packages that match at least the given tagset
      * the Vocabulary class available in the debtags program should
        find its way into the official libary
      * request a tree from the vocabulary that mirrors the hierarchy of
        the tags

Apt:
      * an easy interface to obtain information about a package with a
        given name (author, description..) perhaps allowing different
        modes off access
              * fast access with a bigger memory usage (i.e. cache the
                information in the RAM) and a longer startup time
              * slower access - access the information on disk but with
                minimum of RAM usage and faster startup time
      * an interface to search the database for packages
      * the classes should have an EASY construction method (and also
        perhaps a little documentation if an easy construction should
        not be possible). I.e. the user should not have to care about
        MMaps, pkgCache or pkgSourceList at all. I really get confused
        by this, and still do not really know what they do.

I've attached a class diagram which shows a quick idea on the apt
interface that flows through my mind.

Greetings Ben

--=-1mvNHMHn4/PNJk589HnW
Content-Disposition: attachment; filename=aptDB.png
Content-Type: image/png; name=aptDB.png
Content-Transfer-Encoding: base64

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
JeUEAAAAAElFTkSuQmCC

--=-1mvNHMHn4/PNJk589HnW--