* [gentoo-guis] Why I don't like catapult @ 2008-03-30 0:57 Ciaran McCreesh 2008-03-30 10:16 ` René 'Necoro' Neumann 2008-03-30 17:30 ` René 'Necoro' Neumann 0 siblings, 2 replies; 16+ messages in thread From: Ciaran McCreesh @ 2008-03-30 0:57 UTC (permalink / raw To: gentoo-guis [-- Attachment #1: Type: text/plain, Size: 5486 bytes --] Since all catapult discussion appears to be happening here, and I don't feel like registering from some forum that may or may not be read... Catapult, as it stands, probably isn't sanely usable in general and definitely isn't usable for Paludis. Here's why. The API is Broken ----------------- * use of cpv throughout. cpv isn't enough to uniquely identify an ID, especially if there're overlays. cpvr is closer, but still doesn't work if you need to deal with virtuals directly (rather than the thing provided by the virtual) * use of regexes throughout. Every language defines its own, different regex dialect. There's no portability between languages. * No mention of EAPI anywhere. * No mention of error handling anywhere. * Generally lots of hard-coded ebuildy things that don't map well onto future EAPIs or handling of non-ebuilds (e.g. native CRAN support). * Essentially an abstraction of Portage internals, rather than an abstraction of a general package manager. * It's not clear how much of the API would be useful, or that the API provides enough to do something useful. * It's tied onto a single user configuration setup, and has no sane way of handling multiple configurations or unconfigured operation. * sets don't map on to package manager sets. * Administration: - version. But no name? * System: - find_best. What does this do if you give it foo/bar-1 foo/baz-1? What's the point of having this function at all? - find_best_match. What's a search key? If it's a spec, it needs an associated EAPI. What if only_installed is false? Does this mean we want both not installed and installed stuff? - find_packages. As find_best_match for search key. What disambiguation is performed upon the atom? What happens if you pass it something like 'git', which is ambiguous? Regular expressions at this level is silly -- which of the zillion regex flavours do we use? Does it operate on installed, not installed or what? - get_config_path. Unportable. What if the user is using some other config format? - get_deep_option. Deep's a mess; making package managers emulate it via a command line switch is silly. - get_environment. In no way portable. - get_global_key. Again, unportable -- Paludis has no notion of global configuration. - get_merge_command. There's no nice way of using whatever this returns. And it's pointless -- why not just ask the package manager to do the merge? And what about package managers that require an explicit --install? When you ask for --sync or whatever, off what do you base the command? - get_newuse_option. Again, unportable and messy. - get_oneshot_option. Again, unportable and messy. - get_pretend_option. Again, unportable and messy. And probably useless -- what would you do with this? - get_sync_command. What's the point? Why not just ask the package manager to do the sync? - get_unmerge_option. Same. - get_update_option. Same as for get_deep_option. - get_updated_packages. Highly unclear what this really does. - get_use_desc. package should be a cpvr. - get_world_file_path. Unportable. - list_categories. String or regex? - sort_package_list. You don't want stuff sorted the way it's sorted by Paludis. You might want a well defined sort. - split_cpv. Why the weird revision thing? - update_world. Huh? In some ways pointlessly specific, in some ways way too vague. And what's this use flag stuff? We finally just about got people away from setting use flags in places other than config files, and for good reason. * Package - What do all of these do on unknown EAPI? - compare_version. But it takes packages. What's the ordering on foo/bar-1 vs bar/baz-1? - get_actual_use_flags. What's the point of this? - get_dep_packages. Hardcoding three dep classes is icky and doesn't work nicely with future EAPIs. And what's the return value? What about when || is in operation? - get_global_settings. No such thing as a global setting. - get_iuse_flags. What does this do for IUSE defaults? For installed packages, all flags are forced. - get_installed_use_flags. Empty list? Seriously? - get_masking_reason. Is the return value supposed to be used by anything other than a human? - get_matched_dep_packages. Huh? - get_overlay_path. What if it's in an overlay with no on-disk location? What if it's in some format the end tool doesn't recognise? - get_package_path. Ditto. - get_package_settings. What do you mean by everything? Just metadata? And what about EAPI? Some things don't make sense for some EAPIs or some package formats. - get_use_flags. Bad. No legit use. - is_in_system. System is a bad name. - is_testing. How does package.keywords alter whether a package is testing? - use_expanded. Not clear how this works when things aren't really expanded or when expanded keys aren't known. Why DBus? --------- What's the point in using DBus? What does it add over a simplified library with bindings? How does the whole privs thing work? Should anyone who can talk by DBus be allowed to perform privileged operations? Should anyone who can't perform privileged operations be allowed to do unprivileged operations? What about persistence? What's classed as a session? Why force it down to a single session at once? -- Ciaran McCreesh [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-03-30 0:57 [gentoo-guis] Why I don't like catapult Ciaran McCreesh @ 2008-03-30 10:16 ` René 'Necoro' Neumann 2008-03-30 17:30 ` René 'Necoro' Neumann 1 sibling, 0 replies; 16+ messages in thread From: René 'Necoro' Neumann @ 2008-03-30 10:16 UTC (permalink / raw To: ciaran.mccreesh; +Cc: gentoo-guis -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Ciaran McCreesh schrieb: > Since all catapult discussion appears to be happening here, and I don't > feel like registering from some forum that may or may not be read... > > Catapult, as it stands, probably isn't sanely usable in general and > definitely isn't usable for Paludis. Here's why. Thanks for your comments :). I don't have time at the moment too read and discuss them all, but I will do so in the evening ;) The reason I wrote this mail is just to say, that the current API is what it is, because there was no discussion at all (though I asked several people) - so at the moment it is more or less Portato's portage backend. As you are the "Package Management" guru around, I would be glad if we can make catapult something useful together. So again: Thanks for your comments :) - - Necoro -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFH72iI4UOg/zhYFuARApSFAJ41qCcp2xAeQ6ymtT39sGbwUPgaagCfTlPf mBdX0QrjyUQdcFSCNvBBP7U= =xSqx -----END PGP SIGNATURE----- -- gentoo-guis@lists.gentoo.org mailing list ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-03-30 0:57 [gentoo-guis] Why I don't like catapult Ciaran McCreesh 2008-03-30 10:16 ` René 'Necoro' Neumann @ 2008-03-30 17:30 ` René 'Necoro' Neumann 2008-03-30 21:38 ` Ciaran McCreesh 1 sibling, 1 reply; 16+ messages in thread From: René 'Necoro' Neumann @ 2008-03-30 17:30 UTC (permalink / raw To: ciaran.mccreesh; +Cc: gentoo-guis -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 My replies ;) One important remark: I always see the things from the API-user view. I have to use this API in a package manager GUI and thus want to have the API to specify certain functionality. Ciaran McCreesh schrieb: > * use of cpv throughout. cpv isn't enough to uniquely identify an ID, > especially if there're overlays. cpvr is closer, but still doesn't > work if you need to deal with virtuals directly (rather than the thing > provided by the virtual) CPVR sounds reasonable ... and what about using virtual/* for virtuals? Btw: There was the idea of providing a "get_virtuals" function.... > * use of regexes throughout. Every language defines its own, different > regex dialect. There's no portability between languages. True - I thought of using some kind of globbing - thus only allowing "*" and "?" (and perhaps "^" and "$") > * No mention of EAPI anywhere. Why would this be needed? This is only true if "catapult API" == "EAPI". > * No mention of error handling anywhere. True. Currently exceptions are only passed to the caller - but this should definitly be specified somewhere. > * Generally lots of hard-coded ebuildy things that don't map well onto > future EAPIs or handling of non-ebuilds (e.g. native CRAN support). For me - gentoo package management is all about ebuilds. So I can't see, what should changed there. The only thing that should be provided is a feature similar to EAPI (the "catapult API"), so that additional stuff can be specified later on. I don't see a point in thinking about things, that may come somewhere in the future. > * It's tied onto a single user configuration setup, and has no sane way > of handling multiple configurations or unconfigured operation. I don't understand this ... > * sets don't map on to package manager sets. This can easily be changed. But nevertheless, some catapult-wide sets should be defined, that map onto the specific ones in the package managers (e.g. catapult.SET_ALL should be replaced by the specific set in the different managers) > * Administration: > > - version. But no name? I saw this myself some days ago... Really a flaw - but one simple to fix ;) > - find_best. What does this do if you give it foo/bar-1 foo/baz-1? Undefined atm. > What's the point of having this function at all? See very first remark. > - find_best_match. What's a search key? If it's a spec, it needs an > associated EAPI. True. > What if only_installed is false? Does this mean we > want both not installed and installed stuff? Yes. - But perhaps, instead of the "only_installed" flag used here and there, a set-name should be provided. (Which then can be "installed", "uninstalled" or whatever). > - find_packages. As find_best_match for search key. What disambiguation > is performed upon the atom? What happens if you pass it something like > 'git', which is ambiguous? Return everything that fits. It should be on the users side to translate it into something useful. > - get_config_path. Unportable. What if the user is using some other > config format? But the configs (read: package.mask, package.use etc.) have to be at a specified unique location, don't they? > - get_deep_option. Deep's a mess; making package managers emulate it via > a command line switch is silly. If you don't have an equivalent: Return "". > - get_environment. In no way portable. True. Should be dropped. I used it to get unwanted things out of the environment. (E.g. modify EMERGE_DEFAULT_OPTS). But this is really a user thing and should not be here. > - get_global_key. Again, unportable -- Paludis has no notion of global > configuration. get_global_settings and get_package_settings should be merged anyway. > - get_merge_command. There's no nice way of using whatever this returns. > And it's pointless -- why not just ask the package manager to do the > merge? Because catapult should be passive: I.E. only provide information and does not do anything that could be harmful. > And what about package managers that require an explicit > --install? Return: ["pkgmgr", "--install"]. Everything that has "get_xxx_command" should return the complete commandline. > - get_newuse_option. Again, unportable and messy. > > - get_oneshot_option. Again, unportable and messy. Why unportable? - See the remarks to "--deep". > - get_pretend_option. Again, unportable and messy. And probably useless > -- what would you do with this? True. > - get_updated_packages. Highly unclear what this really does. Returns a list of packages, that can be updated. Similar to what "eix-sync" shows at the end of the run. > - get_world_file_path. Unportable. True. > - list_categories. String or regex? Has to be defined. > - sort_package_list. You don't want stuff sorted the way it's sorted by > Paludis. You might want a well defined sort. True. > - split_cpv. Why the weird revision thing? What's so weired about it? > - update_world. Huh? In some ways pointlessly specific, in some ways way > too vague. And what's this use flag stuff? We finally just about got > people away from setting use flags in places other than config files, > and for good reason. Rember: Passive. It should return the packages, that WOULD be updated, if a world-update (or alike) would be run. The parameters are there, to run different scenarios. (Portato for example uses this, to generate the list - taking into account the user saved flags, which aren't saved to configs yet.) > - What do all of these do on unknown EAPI? Again: Why does the API have to care about EAPI? - It's the providers job to care about it. > - compare_version. But it takes packages. What's the ordering on > foo/bar-1 vs bar/baz-1? Currently it would return: ("bar-1", "baz-1") as bar < baz. But this can easily specified different. And a good point to think about error handling again. > - get_actual_use_flags. What's the point of this? In general: Returns all useflags currently set (even the package specific ones). It additionally has the ability to merge in some other flag settings. (Ok - the description in the API-document is a little bit ... strange). > - get_dep_packages. Hardcoding three dep classes is icky and doesn't > work nicely with future EAPIs. Is only hard-coded in the document. (Count this as a doc-error.) > And what's the return value? What about when || is in operation? WWPMD (what would the package manager do): Simplified: Pass the dep-string to the package manager and see what he does with it. The result is returned. > - get_iuse_flags. What does this do for IUSE defaults? For installed > packages, all flags are forced. defaults are returned verbatim. I used to define "forced flags" as: "The flags the user can't change." (like userland_GNU or use.mask'ed flags) > - get_installed_use_flags. Empty list? Seriously? DBus does not know the "empty value". The signature has to be kept in all cases. So: yes - empty list. (Other choice would be an exception...) > - get_masking_reason. Is the return value supposed to be used by > anything other than a human? I doubt it. > - get_matched_dep_packages. Huh? Return all packages the cpv depends on, but which are already installed. "get_dep_packages" and "get_matched_dep_packages" can surely be merged. > - get_overlay_path. What if it's in an overlay with no on-disk location? > What if it's in some format the end tool doesn't recognise? The end tool's problem I'd say. > - get_use_flags. Bad. No legit use. Doc error. Has already been removed several weeks ago. > - is_in_system. System is a bad name. Renaming is easy :) > - is_testing. How does package.keywords alter whether a package is > testing? Just a naming issue - I use "testing" for things that are keyworded "~KEYWORD". > - use_expanded. Not clear how this works when things aren't really > expanded. Return "". The naming is bad here too. > or when expanded keys aren't known. When should that happen? > > Why DBus? > --------- > > What's the point in using DBus? What does it add over a simplified > library with bindings? Library bindings have several disadvantages: - - Providers have to be coded in C. - - How to access portage internals from C-Code? Yes: You can implement python-calls in C... but I think this is messy. Dbus advantages: - - allows some interesting structures: Like dbus+ssh: Contact the Catapult-Service on one machine from another one (remote adminstration) - - bindings already provided - - caching: For example the portage internal caches are kept and don't have to be recreated each time something using catapult is started. > How does the whole privs thing work? Should anyone who can talk by DBus > be allowed to perform privileged operations? Should anyone who can't > perform privileged operations be allowed to do unprivileged operations? I thought of having Catapult being a passive thing. So there is no way of doing privileged actions. > What about persistence? What's classed as a session? Why force it down > to a single session at once? Easier to implement. But it isn't forced. If the provider implements sessions (e.g. using the Dbus-sending-adress as a key) w/o extending API, I can't see a problem. Regards, Necoro -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD4DBQFH784w4UOg/zhYFuARAnZRAJ4hnjiH/2yycAiDCXLnst2EpesyuQCWJNNs 6gPL9qWeiaFgCGzpwbT9cA== =Pdi+ -----END PGP SIGNATURE----- -- gentoo-guis@lists.gentoo.org mailing list ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-03-30 17:30 ` René 'Necoro' Neumann @ 2008-03-30 21:38 ` Ciaran McCreesh 2008-03-30 22:37 ` René 'Necoro' Neumann 0 siblings, 1 reply; 16+ messages in thread From: Ciaran McCreesh @ 2008-03-30 21:38 UTC (permalink / raw To: René 'Necoro' Neumann; +Cc: gentoo-guis [-- Attachment #1: Type: text/plain, Size: 8804 bytes --] On Sun, 30 Mar 2008 19:30:24 +0200 René 'Necoro' Neumann <lists@necoro.eu> wrote: > Ciaran McCreesh schrieb: > > * use of cpv throughout. cpv isn't enough to uniquely identify an > > ID, especially if there're overlays. cpvr is closer, but still > > doesn't work if you need to deal with virtuals directly (rather > > than the thing provided by the virtual) > > CPVR sounds reasonable ... and what about using virtual/* for > virtuals? Btw: There was the idea of providing a "get_virtuals" > function.... The issue with virtuals is that all the package managers do them a bit differently. For Paludis, if you have two different providers of the same virtual installed with the same version and slot, you'll get two IDs that have the same cpvr and that are only distinguished by the package for which they are a virtual. This isn't an issue for us since we use a different PackageID instance for each, but if instead you're using a string to identify things (eww) you're in trouble. > > * use of regexes throughout. Every language defines its own, > > different regex dialect. There's no portability between languages. > > True - I thought of using some kind of globbing - thus only allowing > "*" and "?" (and perhaps "^" and "$") Why support it at all? That's not something that should be in at the package manager level. > > * No mention of EAPI anywhere. > > Why would this be needed? This is only true if "catapult API" == > "EAPI". Well no. When doing pretty much anything with IDs, you have to be aware of the EAPI. Client programs mustn't attempt to do anything with IDs whose EAPI they don't recognise. > > * Generally lots of hard-coded ebuildy things that don't map well > > onto future EAPIs or handling of non-ebuilds (e.g. native CRAN > > support). > > For me - gentoo package management is all about ebuilds. So I can't > see, what should changed there. Future-direction-wise, a lot of people are wanting to handle things like CPAN, CRAN, Gems etc natively in the package manager rather than by writing wrapper ebuilds. > > * It's tied onto a single user configuration setup, and has no sane > > way of handling multiple configurations or unconfigured operation. > > I don't understand this ... Paludis supports multiple configurations. You can, for example, have /etc/paludis, /etc/paludis-mychroot and ~/.paludis-anotherchroot, and Paludis can operate with all of thse. Paludis can also operate on systems where there's no configuration -- for example, you shouldn't need a full config setup just to be able to run QA checks on one particular repository. Portage also sort of has some of this in a very crude way, through PORTAGE_CONFIGROOT. > > * sets don't map on to package manager sets. > > This can easily be changed. But nevertheless, some catapult-wide sets > should be defined, that map onto the specific ones in the package > managers (e.g. catapult.SET_ALL should be replaced by the specific set > in the different managers) I'm not really sure that your concept of sets is right... > > - find_best. What does this do if you give it foo/bar-1 foo/baz-1? > Undefined atm. > > What's the point of having this function at all? > See very first remark. Sure, but you should still define your API in such a way that it's easily generalisable and maps well onto the underlying data. > > What if only_installed is false? Does this mean we > > want both not installed and installed stuff? > Yes. - But perhaps, instead of the "only_installed" flag used here and > there, a set-name should be provided. (Which then can be "installed", > "uninstalled" or whatever). Again, set confusion. Are you viewing set as a collection of IDs or a collection of specs? (It's the latter.) > > - find_packages. As find_best_match for search key. What > > disambiguation is performed upon the atom? What happens if you pass > > it something like 'git', which is ambiguous? > Return everything that fits. It should be on the users side to > translate it into something useful. That's messy. > > - get_config_path. Unportable. What if the user is using some other > > config format? > But the configs (read: package.mask, package.use etc.) have to be at a > specified unique location, don't they? For Paludis? No. NoConfigEnvironment, for example, uses no configuration directory at all. > > - get_deep_option. Deep's a mess; making package managers emulate > > it via a command line switch is silly. > If you don't have an equivalent: Return "". It shouldn't be in the API at all though. > > - get_merge_command. There's no nice way of using whatever this > > returns. And it's pointless -- why not just ask the package manager > > to do the merge? > Because catapult should be passive: I.E. only provide information and > does not do anything that could be harmful. Then it shouldn't even try to provide a way to do the merge stuff. It needs to either do this properly or not at all. > > - get_newuse_option. Again, unportable and messy. > > > > - get_oneshot_option. Again, unportable and messy. > Why unportable? - See the remarks to "--deep". Neither maps on exactly to the Paludis resolver. The Paludis resolver is quite a bit more flexible option-wise than what Portage offers, but there's no exact correspondence between options. > > - split_cpv. Why the weird revision thing? > What's so weired about it? Why is the revision considered special? > > - What do all of these do on unknown EAPI? > Again: Why does the API have to care about EAPI? - It's the providers > job to care about it. If you perform an API call that works on an ID with an unknown EAPI, what's supposed to happen? What about if you perform an API call that works upon an ID with an EAPI known to the package manager but not to the tool? (One example: what happens if we go with DEPENDENCIES for EAPI 2, and if you ask for DEPEND on an EAPI 2 package?) > > - compare_version. But it takes packages. What's the ordering on > > foo/bar-1 vs bar/baz-1? > Currently it would return: ("bar-1", "baz-1") as bar < baz. But this > can easily specified different. And a good point to think about error > handling again. Why the ordering on PN rather than CATEGORY/PN? > > And what's the return value? What about when || is in operation? > WWPMD (what would the package manager do): Simplified: Pass the > dep-string to the package manager and see what he does with it. The > result is returned. The package manager has to have special handling for || throughout. The behaviour of || blocks is rather tricky. > > - get_iuse_flags. What does this do for IUSE defaults? For installed > > packages, all flags are forced. > defaults are returned verbatim. I used to define "forced flags" as: > "The flags the user can't change." (like userland_GNU or use.mask'ed > flags) The user can't change any flags for installed packages. > > - get_masking_reason. Is the return value supposed to be used by > > anything other than a human? > I doubt it. Specify that. > > - get_overlay_path. What if it's in an overlay with no on-disk > > location? What if it's in some format the end tool doesn't > > recognise? > The end tool's problem I'd say. You're providing API calls that make this sort of thing difficult. Not an ideal situation... > > or when expanded keys aren't known. > When should that happen? Installed packages. USE_EXPAND wasn't (and still isn't by some package managers iirc) saved to VDB. > > What's the point in using DBus? What does it add over a simplified > > library with bindings? > > Library bindings have several disadvantages: > - - Providers have to be coded in C. > - - How to access portage internals from C-Code? Yes: You can > implement python-calls in C... but I think this is messy. You can do the translation either way. > > How does the whole privs thing work? Should anyone who can talk by > > DBus be allowed to perform privileged operations? Should anyone who > > can't perform privileged operations be allowed to do unprivileged > > operations? > I thought of having Catapult being a passive thing. So there is no way > of doing privileged actions. Things like querying an uncached package are privileged. > > What about persistence? What's classed as a session? Why force it > > down to a single session at once? > Easier to implement. But it isn't forced. If the provider implements > sessions (e.g. using the Dbus-sending-adress as a key) w/o extending > API, I can't see a problem. But without well-defined session management, you're stuck when it comes to multiple configurations and the like. -- Ciaran McCreesh [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-03-30 21:38 ` Ciaran McCreesh @ 2008-03-30 22:37 ` René 'Necoro' Neumann 2008-04-01 11:04 ` Ciaran McCreesh 0 siblings, 1 reply; 16+ messages in thread From: René 'Necoro' Neumann @ 2008-03-30 22:37 UTC (permalink / raw To: ciaran.mccreesh; +Cc: gentoo-guis -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Ciaran McCreesh schrieb: > On Sun, 30 Mar 2008 19:30:24 +0200 > René 'Necoro' Neumann <lists@necoro.eu> wrote: >> Ciaran McCreesh schrieb: >>> * use of cpv throughout. cpv isn't enough to uniquely identify an >>> ID, especially if there're overlays. cpvr is closer, but still >>> doesn't work if you need to deal with virtuals directly (rather >>> than the thing provided by the virtual) >> CPVR sounds reasonable ... and what about using virtual/* for >> virtuals? Btw: There was the idea of providing a "get_virtuals" >> function.... > > The issue with virtuals is that all the package managers do them a bit > differently. For Paludis, if you have two different providers of the > same virtual installed with the same version and slot, you'll get two > IDs that have the same cpvr and that are only distinguished by the > package for which they are a virtual. This isn't an issue for us since > we use a different PackageID instance for each, but if instead you're > using a string to identify things (eww) you're in trouble. Hmmm - ok then virtuals really need to be thought about. >>> * use of regexes throughout. Every language defines its own, >>> different regex dialect. There's no portability between languages. >> True - I thought of using some kind of globbing - thus only allowing >> "*" and "?" (and perhaps "^" and "$") > > Why support it at all? That's not something that should be in at the > package manager level. That's true ... but catapult is a bit higher than package manager level. And at least the "find_" functions should allow them, to make searching and alike simpler. >>> * No mention of EAPI anywhere. >> Why would this be needed? This is only true if "catapult API" == >> "EAPI". > > Well no. When doing pretty much anything with IDs, you have to be aware > of the EAPI. Client programs mustn't attempt to do anything with IDs > whose EAPI they don't recognise. Hmm ... no. I see you are coming from the package-manager theory side. And there EAPI is important. But I can't see any point here where EAPI plays a role (besides package-IDs (which can be resolved using catapult API versions)), that can't be covered _inside_ the provider. I don't doubt that e.g. the catapult-paludis provider has to deal with EAPI in some way. But the _user_ (or better: application dev) using catapult API does not need to be aware of it. Catapult is of higher level than package management itself. >>> * Generally lots of hard-coded ebuildy things that don't map well >>> onto future EAPIs or handling of non-ebuilds (e.g. native CRAN >>> support). >> For me - gentoo package management is all about ebuilds. So I can't >> see, what should changed there. > > Future-direction-wise, a lot of people are wanting to handle things > like CPAN, CRAN, Gems etc natively in the package manager rather than > by writing wrapper ebuilds. Ok. Perhaps we can postpone this until it gets real. (And then perhaps use scpvr's ;) ... like: cpan:bla-foo/SomePerlPkg-0.13) >>> * It's tied onto a single user configuration setup, and has no sane >>> way of handling multiple configurations or unconfigured operation. >> I don't understand this ... > > Paludis supports multiple configurations. You can, for example, > have /etc/paludis, /etc/paludis-mychroot and ~/.paludis-anotherchroot, > and Paludis can operate with all of thse. Paludis can also operate on > systems where there's no configuration -- for example, you shouldn't > need a full config setup just to be able to run QA checks on one > particular repository. > > Portage also sort of has some of this in a very crude way, through > PORTAGE_CONFIGROOT. As catapult only queries, this can be resolved _inside_ the paludis provider. This of course gets hairy if it comes to libcatapult to provide config-file manipulation... >>> * sets don't map on to package manager sets. >> This can easily be changed. But nevertheless, some catapult-wide sets >> should be defined, that map onto the specific ones in the package >> managers (e.g. catapult.SET_ALL should be replaced by the specific set >> in the different managers) > > I'm not really sure that your concept of sets is right... > A "set" is a "set of packages" for me. You mention a "set of specs" - don't get what kind of "specs" you are referring to here. >>> - find_best. What does this do if you give it foo/bar-1 foo/baz-1? >> Undefined atm. >>> What's the point of having this function at all? >> See very first remark. > > Sure, but you should still define your API in such a way that it's > easily generalisable and maps well onto the underlying data. > Hmm ... Catapult should provide an API to ease developing applications that deal with package managers. So there might be the case here or there that one provider has to do some work to map to the underlying package manager. >>> - find_packages. As find_best_match for search key. What >>> disambiguation is performed upon the atom? What happens if you pass >>> it something like 'git', which is ambiguous? >> Return everything that fits. It should be on the users side to >> translate it into something useful. > > That's messy. > Why? - It's a search function. And I guess in most cases the "return everything that matches" is in case intended. >>> - get_config_path. Unportable. What if the user is using some other >>> config format? >> But the configs (read: package.mask, package.use etc.) have to be at a >> specified unique location, don't they? > > For Paludis? No. NoConfigEnvironment, for example, uses no > configuration directory at all. > This really is an issue... And what is happening if the user wants to set an option (e.g. a useflag) in the "NoConfigEnvironment"? - Is a config directory created and the environment switched? >>> - get_deep_option. Deep's a mess; making package managers emulate >>> it via a command line switch is silly. >> If you don't have an equivalent: Return "". > > It shouldn't be in the API at all though. Hmmm ... it is of course portage-inspired. So you are of course right, that something like this should not be allowed in the API. Nevertheless, I want to provide applications with the ability to run a package manager with different option switches which follow some global semantics. Or do you think, something like this is just not possible and we have to look for another way of doing so? >>> - get_merge_command. There's no nice way of using whatever this >>> returns. And it's pointless -- why not just ask the package manager >>> to do the merge? >> Because catapult should be passive: I.E. only provide information and >> does not do anything that could be harmful. > > Then it shouldn't even try to provide a way to do the merge stuff. It > needs to either do this properly or not at all. Think of the following use case: An application provides an interface that allows users to select a package for installation. Now this application uses catapult and wants to query for the command which has to be run to get this package installed. Using get_merge_command, the app could do: spawn(catapult.system.get_merge_command(), package_list) Catapult isn't the system merging here - it just provides the information to actually _do_ the merge. >>> - split_cpv. Why the weird revision thing? >> What's so weired about it? > > Why is the revision considered special? I'm waiting what's the result of the "-r0"-thread on gentoo-dev before giving an anwer ;) >>> - What do all of these do on unknown EAPI? >> Again: Why does the API have to care about EAPI? - It's the providers >> job to care about it. > > If you perform an API call that works on an ID with an unknown EAPI, > what's supposed to happen? What about if you perform an API call that > works upon an ID with an EAPI known to the package manager but not to > the tool? > > (One example: what happens if we go with DEPENDENCIES for EAPI 2, and if > you ask for DEPEND on an EAPI 2 package?) We have the following cases: 1.) "DEPEND" is a fixed catapult term/constant. Then the provider has to map to "DEPENDENCIES" if it encounters the term and EAPI2 is used. 2.) "DEPEND" is directly passed to the package manager (for example using "get_package_settings"). I think this isn't preferred behavior and only a given set of constants for the "settings" and alike should be used. -> see 1.) >>> - compare_version. But it takes packages. What's the ordering on >>> foo/bar-1 vs bar/baz-1? >> Currently it would return: ("bar-1", "baz-1") as bar < baz. But this >> can easily specified different. And a good point to think about error >> handling again. > > Why the ordering on PN rather than CATEGORY/PN? Hehe ;) - my fault... misread it. Of course it is first sorted using the category. But haven't seen, they are different. >>> And what's the return value? What about when || is in operation? >> WWPMD (what would the package manager do): Simplified: Pass the >> dep-string to the package manager and see what he does with it. The >> result is returned. > > The package manager has to have special handling for || throughout. The > behaviour of || blocks is rather tricky. I guess it is a major problem if the package manager isn't able to handle "||", right? - So I can't see your point here. >>> - get_iuse_flags. What does this do for IUSE defaults? For installed >>> packages, all flags are forced. >> defaults are returned verbatim. I used to define "forced flags" as: >> "The flags the user can't change." (like userland_GNU or use.mask'ed >> flags) > > The user can't change any flags for installed packages. True. But he can re-install it using the changed flags. (Though he isn't using the flags of the installed packages here, but the ones of the uninstalled and overwriting the installed one.) In other words: For this use case, the useflags of installed packages are not seen as "forced flags" per se. >>> - get_masking_reason. Is the return value supposed to be used by >>> anything other than a human? >> I doubt it. > > Specify that. I guess I'm again missing something ;). But I can't see, why it matters if it is intended for human readers or not :). And if there _is_ a difference, there should be no problem in adding a "for_humans" boolean argument to this call. :) Though I don't know, what the masking reason should look like for non-human targets. >>> - get_overlay_path. What if it's in an overlay with no on-disk >>> location? What if it's in some format the end tool doesn't >>> recognise? >> The end tool's problem I'd say. > > You're providing API calls that make this sort of thing difficult. Not > an ideal situation... Just return some kind of an URL. The end tool has to deal with it. >>> or when expanded keys aren't known. >> When should that happen? > > Installed packages. USE_EXPAND wasn't (and still isn't by some package > managers iirc) saved to VDB. Ok - so you are trying to cover the case, that USE_EXPAND changes after installation of a package. My answer would be: This is the fault of the underlying package manager. If USE_EXPAND can't be resolved correctly, the wrong result (what ever that means in the special case) is passed back. Catapult should try to get rid of some flaws - but if it is not possible, we can't do anything here. Bad luck. >>> What's the point in using DBus? What does it add over a simplified >>> library with bindings? >> Library bindings have several disadvantages: >> - - Providers have to be coded in C. >> - - How to access portage internals from C-Code? Yes: You can >> implement python-calls in C... but I think this is messy. > > You can do the translation either way. Right - but I consider it messy. (And I personally am a Python fan boy and really dislike to code in C or even C++). And I think it is quite strange, if you have a Python app, that accesses Catapult-Portage: Python (app) <---> Python (catapult bindings) <---> C (catapult) <---> Python (portage) >>> How does the whole privs thing work? Should anyone who can talk by >>> DBus be allowed to perform privileged operations? Should anyone who >>> can't perform privileged operations be allowed to do unprivileged >>> operations? >> I thought of having Catapult being a passive thing. So there is no way >> of doing privileged actions. > > Things like querying an uncached package are privileged. Yes? - Why? Any user can open an ebuild and have a look at the internals. And if it still matters: DBus allows to define in config files, which users are allowed to do which actions on which bus. >>> What about persistence? What's classed as a session? Why force it >>> down to a single session at once? >> Easier to implement. But it isn't forced. If the provider implements >> sessions (e.g. using the Dbus-sending-adress as a key) w/o extending >> API, I can't see a problem. > > But without well-defined session management, you're stuck when it comes > to multiple configurations and the like. What exactly do you want to store in / link to the session? -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFH8BYr4UOg/zhYFuARAlLnAJ0fdoxjIa3tj3vOz8iMjUDOgLD7cACghPk5 AnSwpVHV1KRy0txxDGHJ0a4= =XoHx -----END PGP SIGNATURE----- -- gentoo-guis@lists.gentoo.org mailing list ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-03-30 22:37 ` René 'Necoro' Neumann @ 2008-04-01 11:04 ` Ciaran McCreesh 2008-04-01 14:11 ` René 'Necoro' Neumann 0 siblings, 1 reply; 16+ messages in thread From: Ciaran McCreesh @ 2008-04-01 11:04 UTC (permalink / raw To: René 'Necoro' Neumann; +Cc: gentoo-guis [-- Attachment #1: Type: text/plain, Size: 10116 bytes --] On Mon, 31 Mar 2008 00:37:31 +0200 René 'Necoro' Neumann <lists@necoro.eu> wrote: > Hmmm - ok then virtuals really need to be thought about. Or just forcibly ignored... > >>> * use of regexes throughout. Every language defines its own, > >>> different regex dialect. There's no portability between languages. > >> True - I thought of using some kind of globbing - thus only > >> allowing "*" and "?" (and perhaps "^" and "$") > > > > Why support it at all? That's not something that should be in at the > > package manager level. > > That's true ... but catapult is a bit higher than package manager > level. And at least the "find_" functions should allow them, to make > searching and alike simpler. Sounds like you need a layered architecture. A low level catapult to package manager layer, and a high level package manager independent extras layer. > Hmm ... no. I see you are coming from the package-manager theory side. > And there EAPI is important. But I can't see any point here where EAPI > plays a role (besides package-IDs (which can be resolved using > catapult API versions)), that can't be covered _inside_ the provider. As soon as you query any kind of information or perform any kind of information on an ID your code must be EAPI aware. > I don't doubt that e.g. the catapult-paludis provider has to deal with > EAPI in some way. But the _user_ (or better: application dev) using > catapult API does not need to be aware of it. Catapult is of higher > level than package management itself. But application developers do have to be aware of EAPI! Otherwise they aren't allowed to query anything about the IDs they receive. > Ok. Perhaps we can postpone this until it gets real. (And then perhaps > use scpvr's ;) ... like: cpan:bla-foo/SomePerlPkg-0.13) Paludis does it already. > > Paludis supports multiple configurations. You can, for example, > > have /etc/paludis, /etc/paludis-mychroot and > > ~/.paludis-anotherchroot, and Paludis can operate with all of thse. > > Paludis can also operate on systems where there's no configuration > > -- for example, you shouldn't need a full config setup just to be > > able to run QA checks on one particular repository. > > > > Portage also sort of has some of this in a very crude way, through > > PORTAGE_CONFIGROOT. > > As catapult only queries, this can be resolved _inside_ the paludis > provider. > This of course gets hairy if it comes to libcatapult to provide > config-file manipulation... How does Paludis know which configuration set it should be using to respond to queries? > A "set" is a "set of packages" for me. You mention a "set of specs" - > don't get what kind of "specs" you are referring to here. A set isn't a set of packages. It's a set of dependency specifications (foo/bar or >=foo/bar-2 or whatever). > >>> - find_packages. As find_best_match for search key. What > >>> disambiguation is performed upon the atom? What happens if you > >>> pass it something like 'git', which is ambiguous? > >> Return everything that fits. It should be on the users side to > >> translate it into something useful. > > > > That's messy. > > Why? - It's a search function. And I guess in most cases the "return > everything that matches" is in case intended. Have a look at what existing tools do when given an ambiguous package name part. They generally error, not do everything. Coding various things gets tricky when you have to manually check that you've only been given a single package name. > >>> - get_config_path. Unportable. What if the user is using some > >>> other config format? > >> But the configs (read: package.mask, package.use etc.) have to be > >> at a specified unique location, don't they? > > > > For Paludis? No. NoConfigEnvironment, for example, uses no > > configuration directory at all. > > > > This really is an issue... And what is happening if the user wants to > set an option (e.g. a useflag) in the "NoConfigEnvironment"? - Is a > config directory created and the environment switched? No. Users can't set options in NoConfigEnvironment. There is literally no configuration beyond the constructing parameters. > Nevertheless, I want to provide applications with the ability to run > a package manager with different option switches which follow some > global semantics. Or do you think, something like this is just not > possible and we have to look for another way of doing so? Doing this via an exec() is the wrong way to do it. If you want it to be sanely usable you need to do it via a proper API. > Think of the following use case: An application provides an interface > that allows users to select a package for installation. Now this > application uses catapult and wants to query for the command which has > to be run to get this package installed. Using get_merge_command, the > app could do: > > spawn(catapult.system.get_merge_command(), package_list) > > Catapult isn't the system merging here - it just provides the > information to actually _do_ the merge. Which is the wrong way of doing it. You might as well ask for a command that outputs DESCRIPTION for a given ID rather than providing an API call to do it directly. > >>> - split_cpv. Why the weird revision thing? > >> What's so weired about it? > > > > Why is the revision considered special? > > I'm waiting what's the result of the "-r0"-thread on gentoo-dev before > giving an anwer ;) Doesn't make much difference either way... Why is the revision the only version part you treat specially? > We have the following cases: > 1.) "DEPEND" is a fixed catapult term/constant. Then the provider has > to map to "DEPENDENCIES" if it encounters the term and EAPI2 is used. Not doable. DEPENDENCIES can't map to DEPEND. DEPEND isn't powerful enough syntactically. > 2.) "DEPEND" is directly passed to the package manager (for example > using "get_package_settings"). I think this isn't preferred behavior > and only a given set of constants for the "settings" and alike should > be used. -> see 1.) Then you'd get a spurious blank result. > >>> And what's the return value? What about when || is in operation? > >> WWPMD (what would the package manager do): Simplified: Pass the > >> dep-string to the package manager and see what he does with it. The > >> result is returned. > > > > The package manager has to have special handling for || throughout. > > The behaviour of || blocks is rather tricky. > > I guess it is a major problem if the package manager isn't able to > handle "||", right? - So I can't see your point here. The package manager handles || on a case by case basis. Anything containing || cannot be flattened to a simple list. > >>> - get_iuse_flags. What does this do for IUSE defaults? For > >>> installed packages, all flags are forced. > >> defaults are returned verbatim. I used to define "forced flags" as: > >> "The flags the user can't change." (like userland_GNU or > >> use.mask'ed flags) > > > > The user can't change any flags for installed packages. > > True. But he can re-install it using the changed flags. (Though he > isn't using the flags of the installed packages here, but the ones of > the uninstalled and overwriting the installed one.) > In other words: For this use case, the useflags of installed packages > are not seen as "forced flags" per se. They are forced for the installed ID. They aren't necessarily forced for other different IDs that can be installed to replace the currently installed ID. The foo/bar-2.0 that you have installed is a completely different ID to any foo/bar-2.0 you happen to have in a repository somewhere. > > >>> - get_masking_reason. Is the return value supposed to be used by > >>> anything other than a human? > >> I doubt it. > > > > Specify that. > > I guess I'm again missing something ;). But I can't see, why it > matters if it is intended for human readers or not :). And if there > _is_ a difference, there should be no problem in adding a > "for_humans" boolean argument to this call. :) > Though I don't know, what the masking reason should look like for > non-human targets. If it's intended to be machine usable, the format has to be fixed. > > >>> - get_overlay_path. What if it's in an overlay with no on-disk > >>> location? What if it's in some format the end tool doesn't > >>> recognise? > >> The end tool's problem I'd say. > > > > You're providing API calls that make this sort of thing difficult. > > Not an ideal situation... > > Just return some kind of an URL. The end tool has to deal with it. Then the name needs changing, and it needs to be documented that the return value is entirely meaningless. > >>> How does the whole privs thing work? Should anyone who can talk by > >>> DBus be allowed to perform privileged operations? Should anyone > >>> who can't perform privileged operations be allowed to do > >>> unprivileged operations? > >> I thought of having Catapult being a passive thing. So there is no > >> way of doing privileged actions. > > > > Things like querying an uncached package are privileged. > > Yes? - Why? Any user can open an ebuild and have a look at the > internals. But they can't write to cache on disk. Remember that Portage needs you to be in the 'portage' group to do anything, and anyone in the 'portage' group can easily obtain root on the box. > >>> What about persistence? What's classed as a session? Why force it > >>> down to a single session at once? > >> Easier to implement. But it isn't forced. If the provider > >> implements sessions (e.g. using the Dbus-sending-adress as a key) > >> w/o extending API, I can't see a problem. > > > > But without well-defined session management, you're stuck when it > > comes to multiple configurations and the like. > > What exactly do you want to store in / link to the session? Which configuration set is active, for one... -- Ciaran McCreesh [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-01 11:04 ` Ciaran McCreesh @ 2008-04-01 14:11 ` René 'Necoro' Neumann 2008-04-01 21:59 ` René 'Necoro' Neumann 2008-04-02 8:34 ` Ciaran McCreesh 0 siblings, 2 replies; 16+ messages in thread From: René 'Necoro' Neumann @ 2008-04-01 14:11 UTC (permalink / raw To: Ciaran McCreesh; +Cc: gentoo-guis -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Ciaran McCreesh schrieb: > > Sounds like you need a layered architecture. A low level catapult to > package manager layer, and a high level package manager independent > extras layer. > Currently working on transforming it ... Will post the results later on :) >> Ok. Perhaps we can postpone this until it gets real. (And then perhaps >> use scpvr's ;) ... like: cpan:bla-foo/SomePerlPkg-0.13) > > Paludis does it already. > So we can set it as the package format? (Though needing further definitions.) >>> Paludis supports multiple configurations. You can, for example, >>> have /etc/paludis, /etc/paludis-mychroot and >>> ~/.paludis-anotherchroot, and Paludis can operate with all of thse. >>> Paludis can also operate on systems where there's no configuration >>> -- for example, you shouldn't need a full config setup just to be >>> able to run QA checks on one particular repository. >>> >>> Portage also sort of has some of this in a very crude way, through >>> PORTAGE_CONFIGROOT. >> As catapult only queries, this can be resolved _inside_ the paludis >> provider. >> This of course gets hairy if it comes to libcatapult to provide >> config-file manipulation... > > How does Paludis know which configuration set it should be using to > respond to queries? > Ok - so we need sessions ... I see two possibilites to implement it: - - pass it as a parameter each time to each function ... Problems: + each function needs an additional parameter ... + how and what to pass using DBus? - I only can think of id-strings ... but this leads to the second possibility - - use the unique dbus service name and store sessions internally: see http://lists.freedesktop.org/archives/dbus/2008-March/009550.html --> now it is back to provider logic In other words: The provider, which needs sessions, can use an internal hashmap with the dbus service name of the client as the key and store the data. This service name is defined to be unique as long as the dbus bus is running. -> No need to support sessions in the official API. >> A "set" is a "set of packages" for me. You mention a "set of specs" - >> don't get what kind of "specs" you are referring to here. > > A set isn't a set of packages. It's a set of dependency specifications > (foo/bar or >=foo/bar-2 or whatever). > k - understood >>>>> - find_packages. As find_best_match for search key. What >>>>> disambiguation is performed upon the atom? What happens if you >>>>> pass it something like 'git', which is ambiguous? >>>> Return everything that fits. It should be on the users side to >>>> translate it into something useful. >>> That's messy. >> Why? - It's a search function. And I guess in most cases the "return >> everything that matches" is in case intended. > > Have a look at what existing tools do when given an ambiguous package > name part. They generally error, not do everything. Coding various > things gets tricky when you have to manually check that you've only > been given a single package name. > As written above, I'm currently working on changing this. >>>>> - get_config_path. Unportable. What if the user is using some >>>>> other config format? >>>> But the configs (read: package.mask, package.use etc.) have to be >>>> at a specified unique location, don't they? >>> For Paludis? No. NoConfigEnvironment, for example, uses no >>> configuration directory at all. >>> >> This really is an issue... And what is happening if the user wants to >> set an option (e.g. a useflag) in the "NoConfigEnvironment"? - Is a >> config directory created and the environment switched? > > No. Users can't set options in NoConfigEnvironment. There is literally > no configuration beyond the constructing parameters. For the moment we can remove this call. But as soon as we want to have libcatapult to provide a central place to allow config file changes, we need a solution for this problem. >> Nevertheless, I want to provide applications with the ability to run >> a package manager with different option switches which follow some >> global semantics. Or do you think, something like this is just not >> possible and we have to look for another way of doing so? > > Doing this via an exec() is the wrong way to do it. If you want it to > be sanely usable you need to do it via a proper API. > >> Think of the following use case: An application provides an interface >> that allows users to select a package for installation. Now this >> application uses catapult and wants to query for the command which has >> to be run to get this package installed. Using get_merge_command, the >> app could do: >> >> spawn(catapult.system.get_merge_command(), package_list) >> >> Catapult isn't the system merging here - it just provides the >> information to actually _do_ the merge. > > Which is the wrong way of doing it. You might as well ask for a command > that outputs DESCRIPTION for a given ID rather than providing an API > call to do it directly. That's true. But I want it for three reasons: - - no security issues - - safe way is more important than nice way: In case the information catapult provided (e.g. dep tree) is not correct (for whatever reason), I don't want it to crash the users system. Thus, it is better to let the package manager to have the final say. - This reason gets obsolete if the providers are maintained by the package manager teams themselves, but this is not the case atm. - - at least in portage I can't see a way to say "hey - portage: install the following packages please", as the logic behind this is done in emerge itself. Is there any other reason to vote against this besides "isn't the nice way"? >>>>> - split_cpv. Why the weird revision thing? >>>> What's so weired about it? >>> Why is the revision considered special? >> I'm waiting what's the result of the "-r0"-thread on gentoo-dev before >> giving an anwer ;) > > Doesn't make much difference either way... Why is the revision the only > version part you treat specially? We could also return "" instead "-r0" if no revision is given. Does not make a difference. >> We have the following cases: >> 1.) "DEPEND" is a fixed catapult term/constant. Then the provider has >> to map to "DEPENDENCIES" if it encounters the term and EAPI2 is used. > > Not doable. DEPENDENCIES can't map to DEPEND. DEPEND isn't powerful > enough syntactically. Now I see, why you want the user to know of the EAPI... Do you think it would be enough to allow to query the EAPI value of a package? Then (taking this example) the client can decide whether to ask for "DEPEND" or "DEPENDENCIES" depending on the EAPI. If for some reason, he asks for "DEPEND" and the package uses EAPI2 an EAPIError or something similar is being thrown. >>>>> And what's the return value? What about when || is in operation? >>>> WWPMD (what would the package manager do): Simplified: Pass the >>>> dep-string to the package manager and see what he does with it. The >>>> result is returned. >>> The package manager has to have special handling for || throughout. >>> The behaviour of || blocks is rather tricky. >> I guess it is a major problem if the package manager isn't able to >> handle "||", right? - So I can't see your point here. > > The package manager handles || on a case by case basis. Anything > containing || cannot be flattened to a simple list. When installing the the package the package manager is taking one of the choices of "||", based on certain information. A similar approach should be used here too. >>>>> - get_iuse_flags. What does this do for IUSE defaults? For >>>>> installed packages, all flags are forced. >>>> defaults are returned verbatim. I used to define "forced flags" as: >>>> "The flags the user can't change." (like userland_GNU or >>>> use.mask'ed flags) >>> The user can't change any flags for installed packages. >> True. But he can re-install it using the changed flags. (Though he >> isn't using the flags of the installed packages here, but the ones of >> the uninstalled and overwriting the installed one.) >> In other words: For this use case, the useflags of installed packages >> are not seen as "forced flags" per se. > > They are forced for the installed ID. They aren't necessarily forced > for other different IDs that can be installed to replace the currently > installed ID. > > The foo/bar-2.0 that you have installed is a completely different ID to > any foo/bar-2.0 you happen to have in a repository somewhere. Postponing this ... have to think about it. >>>>> - get_masking_reason. Is the return value supposed to be used by >>>>> anything other than a human? >>>> I doubt it. >>> Specify that. >> I guess I'm again missing something ;). But I can't see, why it >> matters if it is intended for human readers or not :). And if there >> _is_ a difference, there should be no problem in adding a >> "for_humans" boolean argument to this call. :) >> Though I don't know, what the masking reason should look like for >> non-human targets. > > If it's intended to be machine usable, the format has to be fixed. So let's decide to have it human readable only. >>>>> - get_overlay_path. What if it's in an overlay with no on-disk >>>>> location? What if it's in some format the end tool doesn't >>>>> recognise? >>>> The end tool's problem I'd say. >>> You're providing API calls that make this sort of thing difficult. >>> Not an ideal situation... >> Just return some kind of an URL. The end tool has to deal with it. > > Then the name needs changing, and it needs to be documented that the > return value is entirely meaningless. Name change ok - perhaps s/path/url/ ? "entirely meaningless" - I would use "might be meaningless" instead. >>>>> How does the whole privs thing work? Should anyone who can talk by >>>>> DBus be allowed to perform privileged operations? Should anyone >>>>> who can't perform privileged operations be allowed to do >>>>> unprivileged operations? >>>> I thought of having Catapult being a passive thing. So there is no >>>> way of doing privileged actions. >>> Things like querying an uncached package are privileged. >> Yes? - Why? Any user can open an ebuild and have a look at the >> internals. > > But they can't write to cache on disk. Remember that Portage needs you > to be in the 'portage' group to do anything, and anyone in the > 'portage' group can easily obtain root on the box. Nope - you can query even if you are not in the portage group. Despite the current open issues (btw: I tried to collect them on a wiki page: http://catapult.origo.ethz.ch/wiki/current_issues ), do you think that the whole system can be brought to something useful in the end? -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFH8kJ+4UOg/zhYFuARAjGOAJ9P4D5kZBJPu5FgS7ONmXw7T7E6kACaA0IU YNS2iJrPw7gxB8dJy8U/mEY= =UAQ9 -----END PGP SIGNATURE----- -- gentoo-guis@lists.gentoo.org mailing list ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-01 14:11 ` René 'Necoro' Neumann @ 2008-04-01 21:59 ` René 'Necoro' Neumann 2008-04-02 8:39 ` Ciaran McCreesh 2008-04-02 8:34 ` Ciaran McCreesh 1 sibling, 1 reply; 16+ messages in thread From: René 'Necoro' Neumann @ 2008-04-01 21:59 UTC (permalink / raw To: gentoo-guis; +Cc: Ciaran McCreesh -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 René 'Necoro' Neumann schrieb: > Ciaran McCreesh schrieb: >> Sounds like you need a layered architecture. A low level catapult to >> package manager layer, and a high level package manager independent >> extras layer. > > > Currently working on transforming it ... Will post the results later on :) > Ok - I got some stuff done today: - - find_packages now only supports package specs. It throws an AmbiguousPackage error if there is something ambiguous. Note: if "" is passed as the spec, _everything_ is returned - - list_categories always returns all categories - - filter_list has been implemented as part of libcatapult which takes a globbing string (allowing "*" and "?") and a list - and filters. (Note: This is currently not implemented in a nice way. The python wrappers are longer than the function itself ;)) - - removed get_environment and get_world_file_path from the API - - added the "name()" method to the admin interface - - added first exception/error support. For a detailed listing of currently known errors: http://catapult.origo.ethz.ch/wiki/api_exceptions And I had an idea about getting rid of dbus (at least in some way): Instead of forcing dbus, we first implement catapult as a library. The dbus support is additional and would be a small wrapper on top of this library. So we had both worlds combined. To get the portage code ported, I'm going to have a look into Cython/Pyrex. This is probably not the most performant way - but who cares ;) Only one thing has to be solved: How is it possible to load additional "catapult providers" on the fly? - So similar to the dbus way: You install catapult and additional providers (e.g. catapult-portage) and then load the correct libs at runtime. I guess this can be answered by someone who has a deeper knowledge of C than me ;) For reference - the latest revisions having this changes implemented: catapult rev: 25 catapult-portage rev: 41 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFH8rBM4UOg/zhYFuARAiykAJ9U/ZZhYz0hBbe0mnVrZj+Yva7NIgCfXyMX vGSyAUL8lFjWsNJLQHaCdY0= =OqIs -----END PGP SIGNATURE----- -- gentoo-guis@lists.gentoo.org mailing list ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-01 21:59 ` René 'Necoro' Neumann @ 2008-04-02 8:39 ` Ciaran McCreesh 0 siblings, 0 replies; 16+ messages in thread From: Ciaran McCreesh @ 2008-04-02 8:39 UTC (permalink / raw To: gentoo-guis; +Cc: lists [-- Attachment #1: Type: text/plain, Size: 817 bytes --] On Tue, 01 Apr 2008 23:59:40 +0200 René 'Necoro' Neumann <lists@necoro.eu> wrote: > Only one thing has to be solved: How is it possible to load additional > "catapult providers" on the fly? - So similar to the dbus way: You > install catapult and additional providers (e.g. catapult-portage) and > then load the correct libs at runtime. > I guess this can be answered by someone who has a deeper knowledge of > C than me ;) Unix, rather than C... dlopen. If you're using C++, make provider an ABC and have a virtual ctor that dlopen()s .so files that export a function to make a concrete subclass. If you're using C, use a struct full of function pointers instead, and cry when you're forced to use 1970s style programming. Or use dlsym() a zillion times and cry even more... -- Ciaran McCreesh [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-01 14:11 ` René 'Necoro' Neumann 2008-04-01 21:59 ` René 'Necoro' Neumann @ 2008-04-02 8:34 ` Ciaran McCreesh 2008-04-02 11:58 ` René 'Necoro' Neumann 1 sibling, 1 reply; 16+ messages in thread From: Ciaran McCreesh @ 2008-04-02 8:34 UTC (permalink / raw To: René 'Necoro' Neumann; +Cc: gentoo-guis [-- Attachment #1: Type: text/plain, Size: 7346 bytes --] On Tue, 01 Apr 2008 16:11:10 +0200 René 'Necoro' Neumann <lists@necoro.eu> wrote: > >> Ok. Perhaps we can postpone this until it gets real. (And then > >> perhaps use scpvr's ;) ... like: cpan:bla-foo/SomePerlPkg-0.13) > > > > Paludis does it already. > > So we can set it as the package format? (Though needing further > definitions.) Mm? With Paludis you get things like CRAN as 'just another repository'. > > How does Paludis know which configuration set it should be using to > > respond to queries? When you invoke a Paludis client you can use --environment to specify a configuration set. > Ok - so we need sessions ... > > I see two possibilites to implement it: The third is to have different DBus services per configuration. > That's true. But I want it for three reasons: > - - no security issues > - - safe way is more important than nice way: In case the information > catapult provided (e.g. dep tree) is not correct (for whatever > reason), I don't want it to crash the users system. Thus, it is > better to let the package manager to have the final say. - This > reason gets obsolete if the providers are maintained by the package > manager teams themselves, but this is not the case atm. > - - at least in portage I can't see a way to say "hey - portage: > install the following packages please", as the logic behind this is > done in emerge itself. > > Is there any other reason to vote against this besides "isn't the > nice way"? Yeah. You can't use it to write a decent client. More on that below. > > Doesn't make much difference either way... Why is the revision the > > only version part you treat specially? > > We could also return "" instead "-r0" if no revision is given. Does > not make a difference. Why split revision at all? > Now I see, why you want the user to know of the EAPI... Do you think > it would be enough to allow to query the EAPI value of a package? Then > (taking this example) the client can decide whether to ask for > "DEPEND" or "DEPENDENCIES" depending on the EAPI. > If for some reason, he asks for "DEPEND" and the package uses EAPI2 an > EAPIError or something similar is being thrown. The issue with doing things that way is that every single client has to be updated for every new EAPI. It's probably useful to look at how Paludis and Portage handle EAPIs. Portage basically just has some hardcoded if-else logic ("if the EAPI is 1 then ...") in relevant areas (and doesn't generally enforce EAPI things). This has the advantage that it's quick to code if you have a small number of relatively similar EAPIs. It has the disadvantage that when we introduce a new EAPI someone has to go through and check all those code paths, and add a bunch more. It doesn't scale well to large changes. Paludis does things differently. EAPI-dependent code never directly queries EAPI. Instead, it queries a central class for capabilities (things like "does this EAPI support slot deps?" or "does this EAPI use an ECONF_SOURCE-aware src_compile?"). And rather than hardcoding configuration keys ("get me the DEPEND string" and so on), we have an abstracted high-level interface ("get me the key that holds dependencies that have been parsed into an abstract higher level format") that's sufficiently powerful to deal with all EAPIs, along with non-ebuild packages. This means that clients written using the Paludis EAPI (and, indeed, the core Paludis library) have absolutely no mention or awareness of EAPI anywhere, and yet always behave correctly for all EAPIs. Forcing every client to be EAPI aware and updated for every new EAPI is majorly sucky. On the other hand, the Paludis approach quite possibly only works because we have strong static checking and rich classes... > > The package manager handles || on a case by case basis. Anything > > containing || cannot be flattened to a simple list. > > When installing the the package the package manager is taking one of > the choices of "||", based on certain information. A similar approach > should be used here too. That certain information is the key issue. That certain information, in the dependency resolution case, is a rather complex context that can include things like speculative branch taking on earlier || cases, speculative unmasking and knowledge of packages that aren't installed yet but that will be by the time the ID providing the || is reached for install. For example... The Paludis handling code for || ( ) deps when resolving a normal dependency goes very roughly like this: - Is the || ( ) block empty after removing use? blocks? If so, pretend it's empty. - Try to rewrite the || ( ) block to a single multi-operator dep spec, and use that instead of the || ( ) block if we can. - Are any of the || ( ) children already installed? (Note that this handles complex blocks and the like too...) If so, take that child. - If we have something like || ( a >=b-2 ) and b-1 is installed, take the b-2 branch if we can do so. - Go for the first viable option. - Fall back and go for the first option to get an exception. You can't emulate this logic by flattening. > >> Just return some kind of an URL. The end tool has to deal with it. > > > > Then the name needs changing, and it needs to be documented that the > > return value is entirely meaningless. > > Name change ok - perhaps s/path/url/ ? > > "entirely meaningless" - I would use "might be meaningless" instead. So what's the URL for what Paludis calls VirtualsRepository or InstalledVirtualsRepository? > > But they can't write to cache on disk. Remember that Portage needs > > you to be in the 'portage' group to do anything, and anyone in the > > 'portage' group can easily obtain root on the box. > > Nope - you can query even if you are not in the portage group. Really not a good idea... > Despite the current open issues (btw: I tried to collect them on a > wiki page: http://catapult.origo.ethz.ch/wiki/current_issues ), do > you think that the whole system can be brought to something useful in > the end? I think you have one big issue: you don't have a clear purpose for the API. On the one hand, you're saying that it should be a nice simple API for clients. On the other hand, you're saying that you want to use it for writing a nice fancy GUI. Of the Paludis clients we've experimented with, the one that makes by far the most complex use of the API is the GUI client. This isn't merely because we can -- the only time a GUI becomes useful is when it offers functionality that can't easily be provided quickly by a non-GUI client. A GUI should be able to do things like display a resolution of 'update world with deps', and have little clicky things on each item saying things like "exclude this from the update" (greyed out if the item can't be excluded), "show me a tree of why this package is included in the list" and "select a different item from the || ( ) branch that pulled this dep in". You can't do this without an extremely rich API (and you probably can't do it without lambdas hooked into the resolver...). You definitely can't do this by having a crude "give me a command I can exec()" way of installing things. -- Ciaran McCreesh [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-02 8:34 ` Ciaran McCreesh @ 2008-04-02 11:58 ` René 'Necoro' Neumann 2008-04-02 12:06 ` Ciaran McCreesh 0 siblings, 1 reply; 16+ messages in thread From: René 'Necoro' Neumann @ 2008-04-02 11:58 UTC (permalink / raw To: Ciaran McCreesh; +Cc: gentoo-guis -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 >> Despite the current open issues (btw: I tried to collect them on a >> wiki page: http://catapult.origo.ethz.ch/wiki/current_issues ), do >> you think that the whole system can be brought to something useful in >> the end? > > I think you have one big issue: you don't have a clear purpose for the > API. > > On the one hand, you're saying that it should be a nice simple API for > clients. > > On the other hand, you're saying that you want to use it for writing a > nice fancy GUI. We just have a lack of a common base here. I can't see why these two points are disjoint. The current API is already used for a GUI - and works. The problem I see, is that you (and paludis) always want to be a little bit more fancy and more complex. > Of the Paludis clients we've experimented with, the one that makes by > far the most complex use of the API is the GUI client. This isn't > merely because we can -- the only time a GUI becomes useful is when it > offers functionality that can't easily be provided quickly by a non-GUI > client. Nope - a GUI should provide things which are cumbersome using the commandline. If a GUI offers things, that can't be done using CLI / scripts - the CLI is bad. > A GUI should be able to do things like display a resolution of > 'update world with deps', and have little clicky things on each item > saying things like "exclude this from the update" (greyed out if the > item can't be excluded), "show me a tree of why this package is > included in the list" and "select a different item from the || ( ) > branch that pulled this dep in". You can't do this without an extremely > rich API (and you probably can't do it without lambdas hooked into the > resolver...). You definitely can't do this by having a crude "give me a > command I can exec()" way of installing things. Your description is fancy ... _but_ the things you are describing is an integrated GUI. It's on the same level the CLI is on. This is nothing which is achievable with catapult (at least at the moment). Catapult _uses_ the package manager and is not part of it. Thus also the GUI would _use_ the PM. And as mentioned in my earlier mail, avoiding the exec() stuff and use the manager itself is bad in my eyes for different reasons. And for portage it won't work at all. Thus - I still vote for providing the exec interface. It can be dropped if a nicer solution is found later on. To sum up: I vote for the simple API - to get things done. It can be enhanced later on. And just because I feel like it - the get_x_option and their return values as I see it for paludis: deep : [] newuse: ["--dl-reinstall", "if-use-changed"] pretend: ["--pretend"] oneshot: ["--preserve-world"] - - Necoro -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFH83Ta4UOg/zhYFuARAkofAJ4u7VQrzBzSyQLUEL8a7jfLSUxiCgCfT7f/ PBX30hWht2dQvL4RHOgd0YI= =b4xY -----END PGP SIGNATURE----- -- gentoo-guis@lists.gentoo.org mailing list ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-02 11:58 ` René 'Necoro' Neumann @ 2008-04-02 12:06 ` Ciaran McCreesh 2008-04-02 12:28 ` René 'Necoro' Neumann 0 siblings, 1 reply; 16+ messages in thread From: Ciaran McCreesh @ 2008-04-02 12:06 UTC (permalink / raw To: gentoo-guis; +Cc: lists [-- Attachment #1: Type: text/plain, Size: 2252 bytes --] On Wed, 02 Apr 2008 13:58:18 +0200 René 'Necoro' Neumann <lists@necoro.eu> wrote: > We just have a lack of a common base here. I can't see why these two > points are disjoint. The current API is already used for a GUI - and > works. The problem I see, is that you (and paludis) always want to be > a little bit more fancy and more complex. We want to provide the functionality users need to get the job done. > > Of the Paludis clients we've experimented with, the one that makes > > by far the most complex use of the API is the GUI client. This isn't > > merely because we can -- the only time a GUI becomes useful is when > > it offers functionality that can't easily be provided quickly by a > > non-GUI client. > > Nope - a GUI should provide things which are cumbersome using the > commandline. If a GUI offers things, that can't be done using CLI / > scripts - the CLI is bad. Realistically, there are some potentially useful things that just don't map well onto a command line environment. Dynamic selection of || ( ) choices is a good example of this -- there's no sane way of offering it in a CLI, but in a GUI (or even in ncurses if you push it) it isn't too cumbersome. > Your description is fancy ... _but_ the things you are describing is > an integrated GUI. It's on the same level the CLI is on. > This is nothing which is achievable with catapult (at least at the > moment). Catapult _uses_ the package manager and is not part of it. > Thus also the GUI would _use_ the PM. And thus the GUI will end up delivering a half-arsed minimally functional toy. That isn't what users need. > And as mentioned in my earlier mail, avoiding the exec() stuff and use > the manager itself is bad in my eyes for different reasons. And for > portage it won't work at all. You could implement it for Portage by using exec() yourself... > Thus - I still vote for providing the exec interface. It can be > dropped if a nicer solution is found later on. > > To sum up: I vote for the simple API - to get things done. It can be > enhanced later on. To get what done? If the API can't be used to write a decent app, people are going to stick with the package manager APIs. -- Ciaran McCreesh [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-02 12:06 ` Ciaran McCreesh @ 2008-04-02 12:28 ` René 'Necoro' Neumann 2008-04-02 12:40 ` Ciaran McCreesh 0 siblings, 1 reply; 16+ messages in thread From: René 'Necoro' Neumann @ 2008-04-02 12:28 UTC (permalink / raw To: Ciaran McCreesh; +Cc: gentoo-guis -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Ciaran McCreesh schrieb: >> Your description is fancy ... _but_ the things you are describing is >> an integrated GUI. It's on the same level the CLI is on. >> This is nothing which is achievable with catapult (at least at the >> moment). Catapult _uses_ the package manager and is not part of it. >> Thus also the GUI would _use_ the PM. > > And thus the GUI will end up delivering a half-arsed minimally > functional toy. That isn't what users need. This ended in a fully functional tool - but with a restricted feature set. This isn't an issue for most users though - because the additional features won't be needed by most users. Again: There is a working GUI with it's user base already existing, which _can_ use Catapult already. And I won't describe it as "minimally functional toy". >> And as mentioned in my earlier mail, avoiding the exec() stuff and use >> the manager itself is bad in my eyes for different reasons. And for >> portage it won't work at all. > > You could implement it for Portage by using exec() yourself... > To be honest, this is something I haven't thought about yet ... -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFH83wI4UOg/zhYFuARAq8pAJ4mDNWqHwaTTL8tptuB/99MVkvnrgCeNBVB LAMM2k9aJAb3WCYWJg6lqE4= =pLOp -----END PGP SIGNATURE----- -- gentoo-guis@lists.gentoo.org mailing list ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-02 12:28 ` René 'Necoro' Neumann @ 2008-04-02 12:40 ` Ciaran McCreesh 2008-04-02 13:57 ` René 'Necoro' Neumann 0 siblings, 1 reply; 16+ messages in thread From: Ciaran McCreesh @ 2008-04-02 12:40 UTC (permalink / raw To: gentoo-guis; +Cc: lists [-- Attachment #1: Type: text/plain, Size: 721 bytes --] On Wed, 02 Apr 2008 14:28:56 +0200 René 'Necoro' Neumann <lists@necoro.eu> wrote: > > And thus the GUI will end up delivering a half-arsed minimally > > functional toy. That isn't what users need. > > This ended in a fully functional tool - but with a restricted feature > set. This isn't an issue for most users though - because the > additional features won't be needed by most users. Ah, the Gnome mentality... Except it doesn't work. Most users need at least one feature that most users don't need. > Again: There is a working GUI with it's user base already existing, > which _can_ use Catapult already. And I won't describe it as > "minimally functional toy". I would. -- Ciaran McCreesh [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-02 12:40 ` Ciaran McCreesh @ 2008-04-02 13:57 ` René 'Necoro' Neumann 2008-04-04 7:04 ` Ciaran McCreesh 0 siblings, 1 reply; 16+ messages in thread From: René 'Necoro' Neumann @ 2008-04-02 13:57 UTC (permalink / raw To: gentoo-guis -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Ciaran McCreesh schrieb: > On Wed, 02 Apr 2008 14:28:56 +0200 > René 'Necoro' Neumann <lists@necoro.eu> wrote: >>> And thus the GUI will end up delivering a half-arsed minimally >>> functional toy. That isn't what users need. >> This ended in a fully functional tool - but with a restricted feature >> set. This isn't an issue for most users though - because the >> additional features won't be needed by most users. > > Ah, the Gnome mentality... Except it doesn't work. Most users need at > least one feature that most users don't need. > Hehe :D Ok - so I would declare this match as won by you ;). Now it's your turn: What API additions do you propose? -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFH85C+4UOg/zhYFuARAuiTAJ0cOsv/Pjmq6YaKC6em1pyPnZ60AgCdFy92 QcbLY2KcsFcfE4ZZttXnYMI= =7Atm -----END PGP SIGNATURE----- -- gentoo-guis@lists.gentoo.org mailing list ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [gentoo-guis] Why I don't like catapult 2008-04-02 13:57 ` René 'Necoro' Neumann @ 2008-04-04 7:04 ` Ciaran McCreesh 0 siblings, 0 replies; 16+ messages in thread From: Ciaran McCreesh @ 2008-04-04 7:04 UTC (permalink / raw To: gentoo-guis [-- Attachment #1: Type: text/plain, Size: 335 bytes --] On Wed, 02 Apr 2008 15:57:18 +0200 René 'Necoro' Neumann <lists@necoro.eu> wrote: > Ok - so I would declare this match as won by you ;). Now it's your > turn: What API additions do you propose? That would depend upon the class of tools I was targetting. I'd start by getting a decent set of use cases. -- Ciaran McCreesh [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2008-04-04 7:04 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-03-30 0:57 [gentoo-guis] Why I don't like catapult Ciaran McCreesh 2008-03-30 10:16 ` René 'Necoro' Neumann 2008-03-30 17:30 ` René 'Necoro' Neumann 2008-03-30 21:38 ` Ciaran McCreesh 2008-03-30 22:37 ` René 'Necoro' Neumann 2008-04-01 11:04 ` Ciaran McCreesh 2008-04-01 14:11 ` René 'Necoro' Neumann 2008-04-01 21:59 ` René 'Necoro' Neumann 2008-04-02 8:39 ` Ciaran McCreesh 2008-04-02 8:34 ` Ciaran McCreesh 2008-04-02 11:58 ` René 'Necoro' Neumann 2008-04-02 12:06 ` Ciaran McCreesh 2008-04-02 12:28 ` René 'Necoro' Neumann 2008-04-02 12:40 ` Ciaran McCreesh 2008-04-02 13:57 ` René 'Necoro' Neumann 2008-04-04 7:04 ` Ciaran McCreesh
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox