{"thread":{"id":"28861","subject":"A Python script to put CTAN into git (from DVDs)","startedAt":"2011-11-06T15:17:54Z","lastAt":"2011-11-07T22:03:09Z","messageCount":7,"participants":["Jonathan Fine","Jakub Narebski"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"178967","messageId":"4EB6A522.3020909@pytex.org","threadId":"28861","inReplyTo":null,"subject":"A Python script to put CTAN into git (from DVDs)","fromName":"Jonathan Fine","fromEmail":"jfine@pytex.org","sentAt":"2011-11-06T15:17:54Z","receivedAt":"2011-11-06T15:17:54Z","isPatch":false,"sender":{"key":"jfine@pytex.org","avatar":"https://gravatar.com/avatar/62650308ca161e461162319339b9b6f6efe7807e47339baf4644f6feb3d47cbf?d=mp&s=160"},"body":"Hi\n\nThis it to let you know that I'm writing (in Python) a script that \nplaces the content of CTAN into a git repository.\n     https://bitbucket.org/jfine/python-ctantools\n\nI'm working from the TeX Collection DVDs that are published each year by \nthe TeX user groups, which contain a snapshot of CTAN (about 100,000 \nfiles occupying 4Gb), which means I have to unzip folders and do a few \nother things.\n\nCTAN is the Comprehensive TeX Archive Network.  CTAN keeps only the \nlatest version of each file, but old CTAN snapshots will provide many \nearlier versions.\n\nI'm working on putting old CTAN files into modern version control. \nMartin Scharrer is working in the other direction.  He's putting new \nfiles added to CTAN into Mercurial.\n     http://ctanhg.scharrer-online.de/\n\nMy script works already as a proof of concept, but needs more work (and \ndocumentation) before it becomes useful.  I've requested that follow up \ngoes to comp.text.tex.\n\nLonger terms goals are git as\n* http://en.wikipedia.org/wiki/Content-addressable_storage\n* a resource editing and linking system\n\nIf you didn't know, a git tree is much like an immutable JSON object, \nexcept that it does not have arrays or numbers.\n\nIf my project interests you, reply to this message or contact me \ndirectly (or both).\n\n-- \nJonathan\n"},{"id":"178969","messageId":"m37h3d430e.fsf@localhost.localdomain","threadId":"28861","inReplyTo":"4EB6A522.3020909@pytex.org","subject":"Re: A Python script to put CTAN into git (from DVDs)","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2011-11-06T16:42:23Z","receivedAt":"2011-11-06T16:42:23Z","isPatch":false,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Jonathan Fine <jfine@pytex.org> writes:\n\n> Hi\n> \n> This it to let you know that I'm writing (in Python) a script that\n> places the content of CTAN into a git repository.\n>      https://bitbucket.org/jfine/python-ctantools\n\nI hope that you meant \"repositories\" (plural) here, one per tool,\nrather than putting all of CTAN into single Git repository.\n \n> I'm working from the TeX Collection DVDs that are published each year\n> by the TeX user groups, which contain a snapshot of CTAN (about\n> 100,000 files occupying 4Gb), which means I have to unzip folders and\n> do a few other things.\n\nThere is 'contrib/fast-import/import-zips.py' in git.git repository.\nIf you are not using it, or its equivalent, it might be worth checking\nout.\n \n> CTAN is the Comprehensive TeX Archive Network.  CTAN keeps only the\n> latest version of each file, but old CTAN snapshots will provide many\n> earlier versions.\n\nThere was similar effort done in putting CPAN (Comprehensive _Perl_\nArchive Network) in Git, hosting repositories on GitHub[1], by the name\nof gitPAN, see e.g.:\n\n  \"The gitPAN Import is Complete\"\n  http://perlisalive.com/articles/36\n \n[1]: https://github.com/gitpan\n\n> I'm working on putting old CTAN files into modern version\n> control. Martin Scharrer is working in the other direction.  He's\n> putting new files added to CTAN into Mercurial.\n>      http://ctanhg.scharrer-online.de/\n\nNb. thanks to tools such as git-hg and fast-import / fast-export\nwe have quite good interoperability and convertability between\nGit and Mercurial.\n\nP.S. I'd point to reposurgeon tool, which can be used to do fixups\nafter import, but it would probably won't work on such large (set of)\nrepositories.\n\nP.P.S. Can you forward it to comp.text.tex?\n-- \nJakub Narębski\n"},{"id":"178973","messageId":"4EB6CFBB.2090901@pytex.org","threadId":"28861","inReplyTo":"mailman.2464.1320597747.27778.python-list@python.org","subject":"Re: A Python script to put CTAN into git (from DVDs)","fromName":"Jonathan Fine","fromEmail":"jfine@pytex.org","sentAt":"2011-11-06T18:19:39Z","receivedAt":"2011-11-06T18:19:39Z","isPatch":false,"sender":{"key":"jfine@pytex.org","avatar":"https://gravatar.com/avatar/62650308ca161e461162319339b9b6f6efe7807e47339baf4644f6feb3d47cbf?d=mp&s=160"},"body":"On 06/11/11 16:42, Jakub Narebski wrote:\n> Jonathan Fine<jfine@pytex.org>  writes:\n>\n>> Hi\n>>\n>> This it to let you know that I'm writing (in Python) a script that\n>> places the content of CTAN into a git repository.\n>>       https://bitbucket.org/jfine/python-ctantools\n>\n> I hope that you meant \"repositories\" (plural) here, one per tool,\n> rather than putting all of CTAN into single Git repository.\n\nThere are complex dependencies among LaTeX macro packages, and TeX is \noften distributed and installed from a DVD.  So it makes sense here to \nput *all* the content of a DVD into a repository.\n\nOnce you've done that, it is then possible and sensible to select \nsuitable interesting subsets, such as releases of a particular package. \nUsers could even define their own subsets, such as \"all resources needed \nto process this file, exactly as it processes on my machine\".\n\nIn addition, many TeX users have a TeX DVD.  If they import it into a \ngit repository (using for example my script) then the update from 2011 \nto 2012 would require much less bandwidth.\n\nFinally, I'd rather be working within git that modified copy of the ISO \nwhen doing the subsetting.  I'm pretty sure that I can manage to pull \nthe small repositories from the big git-CTAN repository.\n\nBut as I proceed, perhaps I'll change my mind (smile).\n\n>> I'm working from the TeX Collection DVDs that are published each year\n>> by the TeX user groups, which contain a snapshot of CTAN (about\n>> 100,000 files occupying 4Gb), which means I have to unzip folders and\n>> do a few other things.\n>\n> There is 'contrib/fast-import/import-zips.py' in git.git repository.\n> If you are not using it, or its equivalent, it might be worth checking\n> out.\n\nWell, I didn't know about that.  I took a look, and it doesn't do what I \nwant.  I need to walk the tree (on a mounted ISO) and unpack some (but \nnot all) zip files as I come across them.  For details see:\n \nhttps://bitbucket.org/jfine/python-ctantools/src/tip/ctantools/filetools.py\n\nIn addition, I don't want to make a commit.  I just want to make a ref \nat the end of building the tree.  This is because I want the import of a \nTeX DVD to give effectively identical results for all users, and so any \ncommit information would be effectively constant.\n\n>> CTAN is the Comprehensive TeX Archive Network.  CTAN keeps only the\n>> latest version of each file, but old CTAN snapshots will provide many\n>> earlier versions.\n>\n> There was similar effort done in putting CPAN (Comprehensive _Perl_\n> Archive Network) in Git, hosting repositories on GitHub[1], by the name\n> of gitPAN, see e.g.:\n>\n>    \"The gitPAN Import is Complete\"\n>    http://perlisalive.com/articles/36\n>\n> [1]: https://github.com/gitpan\n\nThis is really good to know!!!  Not only has this been done already, for \nsimilar reasons, but github is hosting it.  Life is easier when there is \na good example to follow.\n\n>> I'm working on putting old CTAN files into modern version\n>> control. Martin Scharrer is working in the other direction.  He's\n>> putting new files added to CTAN into Mercurial.\n>>       http://ctanhg.scharrer-online.de/\n>\n> Nb. thanks to tools such as git-hg and fast-import / fast-export\n> we have quite good interoperability and convertability between\n> Git and Mercurial.\n>\n> P.S. I'd point to reposurgeon tool, which can be used to do fixups\n> after import, but it would probably won't work on such large (set of)\n> repositories.\n\nThank you for the pointer to reposurgeon.  My approach is a bit \ndifferent.  First, get all the files into git, and then 'edit the tree' \nto create new trees.  And then commit worthwhile new trees.\n\nAs I recall the first 'commit' to the git repository for the Linux \nkernel was just a tree, with a reference to that tree as a tag.  But no \ncommit.\n\n> P.P.S. Can you forward it to comp.text.tex?\n\nDone.\n\n-- \nJonathan\n"},{"id":"178983","messageId":"m3zkg92dxq.fsf@localhost.localdomain","threadId":"28861","inReplyTo":"4EB6CFBB.2090901@pytex.org","subject":"Re: A Python script to put CTAN into git (from DVDs)","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2011-11-06T20:29:28Z","receivedAt":"2011-11-06T20:29:28Z","isPatch":false,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"The following message is a courtesy copy of an article\nthat has been posted to comp.lang.python,comp.text.tex as well.\n\nJonathan Fine <jfine@pytex.org> writes:\n> On 06/11/11 16:42, Jakub Narebski wrote:\n>> Jonathan Fine<jfine@pytex.org>  writes:\n>>\n>>> This it to let you know that I'm writing (in Python) a script that\n>>> places the content of CTAN into a git repository.\n>>>       https://bitbucket.org/jfine/python-ctantools\n>>\n>> I hope that you meant \"repositories\" (plural) here, one per tool,\n>> rather than putting all of CTAN into single Git repository.\n\n[moved]\n>> There was similar effort done in putting CPAN (Comprehensive _Perl_\n>> Archive Network) in Git, hosting repositories on GitHub[1], by the name\n>> of gitPAN, see e.g.:\n>>\n>>    \"The gitPAN Import is Complete\"\n>>    http://perlisalive.com/articles/36\n>>\n>> [1]: https://github.com/gitpan\n[/moved]\n \n> There are complex dependencies among LaTeX macro packages, and TeX is\n> often distributed and installed from a DVD.  So it makes sense here to\n> put *all* the content of a DVD into a repository.\n\nNote that for gitPAN each \"distribution\" (usually but not always\ncorresponding to single Perl module) is in separate repository.\nThe dependencies are handled by CPAN / CPANPLUS / cpanm client\n(i.e. during install).\n \nPutting all DVD (is it \"TeX Live\" DVD by the way?) into single\nrepository would put quite a bit of stress to git; it was created for\nsoftware development (although admittedly of large project like Linux\nkernel), not 4GB+ trees.\n\n> Once you've done that, it is then possible and sensible to select\n> suitable interesting subsets, such as releases of a particular\n> package. Users could even define their own subsets, such as \"all\n> resources needed to process this file, exactly as it processes on my\n> machine\".\n\nThis could be handled using submodules, by having superrepository that\nconsist solely of references to other repositories by the way of\nsubmodules... plus perhaps some administrativa files (like README for\nwhole CTAN, or search tool, or DVD install, etc.)\n\nThis could be the used to get for example contents of DVD from 2010.\n\n\nBut even though submodules (c.f. Subversion svn:external, Mecurial\nforest extension, etc.) are in Git for quite a bit of time, it doesn't\nhave best user interface.\n \n> In addition, many TeX users have a TeX DVD.  If they import it into a\n> git repository (using for example my script) then the update from 2011\n> to 2012 would require much less bandwidth.\n\n???\n\n> Finally, I'd rather be working within git that modified copy of the\n> ISO when doing the subsetting.  I'm pretty sure that I can manage to\n> pull the small repositories from the big git-CTAN repository.\n\nNo you cannot.  It is all or nothing; there is no support for partial\n_clone_ (yet), and it looks like it is a hard problem.\n\nNb. there is support for partial _checkout_, but this is something\ndifferent.\n\n> But as I proceed, perhaps I'll change my mind (smile).\n> \n>>> I'm working from the TeX Collection DVDs that are published each year\n>>> by the TeX user groups, which contain a snapshot of CTAN (about\n>>> 100,000 files occupying 4Gb), which means I have to unzip folders and\n>>> do a few other things.\n>>\n>> There is 'contrib/fast-import/import-zips.py' in git.git repository.\n>> If you are not using it, or its equivalent, it might be worth checking\n>> out.\n> \n> Well, I didn't know about that.  I took a look, and it doesn't do what\n> I want.  I need to walk the tree (on a mounted ISO) and unpack some\n> (but not all) zip files as I come across them.  For details see:\n>  https://bitbucket.org/jfine/python-ctantools/src/tip/ctantools/filetools.py\n> \n> In addition, I don't want to make a commit.  I just want to make a ref\n> at the end of building the tree.  This is because I want the import of\n> a TeX DVD to give effectively identical results for all users, and so\n> any commit information would be effectively constant.\n\nCommit = tree + parent + metadata.\n\nI think you would very much want to have linear sequence of trees,\nordered via DAG of commits.  \"Naked\" trees are rather bad idea, I think.\n \n> As I recall the first 'commit' to the git repository for the Linux\n> kernel was just a tree, with a reference to that tree as a tag.  But\n> no commit.\n\nThat was a bad accident that there is a tag that points directly to a\ntree of _initial import_, not something to copy.\n\n-- \nJakub Narębski\n"},{"id":"179072","messageId":"4EB83DDD.1080103@pytex.org","threadId":"28861","inReplyTo":"m3zkg92dxq.fsf@localhost.localdomain","subject":"Re: A Python script to put CTAN into git (from DVDs)","fromName":"Jonathan Fine","fromEmail":"jfine@pytex.org","sentAt":"2011-11-07T20:21:49Z","receivedAt":"2011-11-07T20:21:49Z","isPatch":false,"sender":{"key":"jfine@pytex.org","avatar":"https://gravatar.com/avatar/62650308ca161e461162319339b9b6f6efe7807e47339baf4644f6feb3d47cbf?d=mp&s=160"},"body":"On 06/11/11 20:28, Jakub Narebski wrote:\n\n> Note that for gitPAN each \"distribution\" (usually but not always\n> corresponding to single Perl module) is in separate repository.\n> The dependencies are handled by CPAN / CPANPLUS / cpanm client\n> (i.e. during install).\n\nThank you for your interest, Jakub, and also for this information.  With \nTeX there's a difficult which Perl, I think, does not have.  With TeX we \nprocess documents, which may demand specific versions of packages. \nLaTeX users are concerned that move on to a later version will cause \ndocuments to break.\n\n> Putting all DVD (is it \"TeX Live\" DVD by the way?) into single\n> repository would put quite a bit of stress to git; it was created for\n> software development (although admittedly of large project like Linux\n> kernel), not 4GB+ trees.\n\nI'm impressed by how well git manages it.  It took about 15 minutes to \nbuild the 4GB tree, and it was disk speed rather than CPU which was the \nbottleneck.\n\n>> Once you've done that, it is then possible and sensible to select\n>> suitable interesting subsets, such as releases of a particular\n>> package. Users could even define their own subsets, such as \"all\n>> resources needed to process this file, exactly as it processes on my\n>> machine\".\n>\n> This could be handled using submodules, by having superrepository that\n> consist solely of references to other repositories by the way of\n> submodules... plus perhaps some administrativa files (like README for\n> whole CTAN, or search tool, or DVD install, etc.)\n>\n> This could be the used to get for example contents of DVD from 2010.\n\nWe may be at cross purposes.  My first task is get the DVD tree into \ngit, performing necessary transformations such as expanding zip files \nalong the way.  Breaking the content into submodules can, I believe, be \ndone afterwards.\n\nWith DVDs from several years it could take several hours to load \neverything into git.  For myself, I'd like to do that once, more or less \nas a batch process, and then move on to the more interesting topics. \nGetting the DVD contents into git is already a significant piece of work.\n\nOnce done, I can them move on to what you're interested in, which is \norganising the material.  And I hope that others in the TeX community \nwill get involved with that, because I'm not building this repository \njust for myself.\n\n> But even though submodules (c.f. Subversion svn:external, Mecurial\n> forest extension, etc.) are in Git for quite a bit of time, it doesn't\n> have best user interface.\n>\n>> In addition, many TeX users have a TeX DVD.  If they import it into a\n>> git repository (using for example my script) then the update from 2011\n>> to 2012 would require much less bandwidth.\n>\n> ???\n\nA quick way to bring your TeX distribution up to date is to do a delta \nwith a later distribution, and download the difference.  That's what git \ndoes, and it does it well.  So I'm keen to convert a TeX DVD into a git \nrepository, and then differences can be downloaded.\n\n>> Finally, I'd rather be working within git that modified copy of the\n>> ISO when doing the subsetting.  I'm pretty sure that I can manage to\n>> pull the small repositories from the big git-CTAN repository.\n>\n> No you cannot.  It is all or nothing; there is no support for partial\n> _clone_ (yet), and it looks like it is a hard problem.\n>\n> Nb. there is support for partial _checkout_, but this is something\n> different.\n\n From what I know, I'm confident that I can achieve what I want using \ngit.  I'm also confident that my approach is not closing off any \npossible approached.  But if I'm wrong you'll be able to say: I told you so.\n\n> Commit = tree + parent + metadata.\n\nActually, any number of parents, including none.  What metadata do I \nhave to provide?  At this time nothing, I think, beyond that provided by \nthe name of a reference (to the root of a tree).\n\n> I think you would very much want to have linear sequence of trees,\n> ordered via DAG of commits.  \"Naked\" trees are rather bad idea, I think.\n>\n>> As I recall the first 'commit' to the git repository for the Linux\n>> kernel was just a tree, with a reference to that tree as a tag.  But\n>> no commit.\n>\n> That was a bad accident that there is a tag that points directly to a\n> tree of _initial import_, not something to copy.\n\nBecause git is a distributed version control system, anyone who wants to \ncan create such a directed acyclic graph of commits.  And if it's useful \nI'll gladly add it to my copy of the repository.\n\nbest regards\n\n\nJonathan\n"},{"id":"179088","messageId":"m3ipmv38o2.fsf@localhost.localdomain","threadId":"28861","inReplyTo":"4EB83DDD.1080103@pytex.org","subject":"Re: A Python script to put CTAN into git (from DVDs)","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2011-11-07T21:50:23Z","receivedAt":"2011-11-07T21:50:23Z","isPatch":false,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"The following message is a courtesy copy of an article\nthat has been posted to comp.text.tex as well.\n\nJonathan Fine <jfine@pytex.org> writes:\n> On 06/11/11 20:28, Jakub Narebski wrote:\n> \n> > Note that for gitPAN each \"distribution\" (usually but not always\n> > corresponding to single Perl module) is in separate repository.\n> > The dependencies are handled by CPAN / CPANPLUS / cpanm client\n> > (i.e. during install).\n> \n> Thank you for your interest, Jakub, and also for this information.\n> With TeX there's a difficult which Perl, I think, does not have.  With\n> TeX we process documents, which may demand specific versions of\n> packages. LaTeX users are concerned that move on to a later version\n> will cause documents to break.\n\nHow you can demand specific version of package?\n\nIn the \"\\usepackage[options]{packages}[version]\" LaTeX command the\n<version> argument specifies _minimal_ (oldest) version.  The same\nis true for Perl \"use Module VERSION LIST\".\n \nNevertheless while with \"use Module VERSION\" / \"use Module VERSION LIST\"\nyou can request minimal version of Perl Module, the META build-time spec \ncan include requirement of exact version of required package:\n\nhttp://p3rl.org/CPAN::Meta::Spec\n\n  Version Ranges\n  ~~~~~~~~~~~~~~\n\n  Some fields (prereq, optional_features) indicate the particular\n  version(s) of some other module that may be required as a\n  prerequisite. This section details the Version Range type used to\n  provide this information.\n\n  The simplest format for a Version Range is just the version number\n  itself, e.g. 2.4. This means that *at least* version 2.4 must be\n  present. To indicate that *any* version of a prerequisite is okay,\n  even if the prerequisite doesn't define a version at all, use the\n  version 0.\n\n  Alternatively, a version range *may* use the operators < (less than),\n  <= (less than or equal), > (greater than), >= (greater than or\n  equal), == (equal), and != (not equal). For example, the\n  specification < 2.0 means that any version of the prerequisite less\n  than 2.0 is suitable.\n\n  For more complicated situations, version specifications *may* be\n  AND-ed together using commas. The specification >= 1.2, != 1.5, <\n  2.0 indicates a version that must be *at least* 1.2, *less than* 2.0,\n  and *not equal to* 1.5.\n\n> > Putting all DVD (is it \"TeX Live\" DVD by the way?) into single\n> > repository would put quite a bit of stress to git; it was created for\n> > software development (although admittedly of large project like Linux\n> > kernel), not 4GB+ trees.\n> \n> I'm impressed by how well git manages it.  It took about 15 minutes to\n> build the 4GB tree, and it was disk speed rather than CPU which was\n> the bottleneck.\n\nI still think that using modified contrib/fast-import/import-zips.py\n(or import-tars.perl, or import-directories.perl) would be a better\nsolution here...\n \n[...]\n> We may be at cross purposes.  My first task is get the DVD tree into\n> git, performing necessary transformations such as expanding zip files\n> along the way.  Breaking the content into submodules can, I believe,\n> be done afterwards.\n\n'reposurgeon' might help there... or might not.  Same with git-subtree\ntool.\n\nBut now I understand that you are just building tree objects, and\ncreating references to them (with implicit ordering given by names,\nI guess).  This is to be a start of further work, isn't it?\n\n> With DVDs from several years it could take several hours to load\n> everything into git.  For myself, I'd like to do that once, more or\n> less as a batch process, and then move on to the more interesting\n> topics. Getting the DVD contents into git is already a significant\n> piece of work.\n> \n> Once done, I can them move on to what you're interested in, which is\n> organising the material.  And I hope that others in the TeX community\n> will get involved with that, because I'm not building this repository\n> just for myself.\n\n[...]\n\n> > > In addition, many TeX users have a TeX DVD.  If they import it into a\n> > > git repository (using for example my script) then the update from 2011\n> > > to 2012 would require much less bandwidth.\n> >\n> > ???\n> \n> A quick way to bring your TeX distribution up to date is to do a delta\n> with a later distribution, and download the difference.  That's what\n> git does, and it does it well.  So I'm keen to convert a TeX DVD into\n> a git repository, and then differences can be downloaded.\n\nHere perhaps you should take a look at git-based 'bup' backup system.\n\nAnyway I am not sure if for git to be able to generate deltas well you\nhave to have DAG of commits, so Git can notice what you have and what\nyou have not.  Trees might be not enough here. (!)\n \n> > Commit = tree + parent + metadata.\n> \n> Actually, any number of parents, including none.  What metadata do I\n> have to provide?  At this time nothing, I think, beyond that provided\n> by the name of a reference (to the root of a tree).\n\nMetadata = commit message (here you can e.g. put the official name of\nDVD), author and committer info (name, email, date and time, timezone;\ndate and time you can get from mtime / creation time of DVD). \n\n[cut]\n \n-- \nJakub Narębski\n"},{"id":"179089","messageId":"4EB8559D.8080704@pytex.org","threadId":"28861","inReplyTo":"m3ipmv38o2.fsf@localhost.localdomain","subject":"Re: A Python script to put CTAN into git (from DVDs)","fromName":"Jonathan Fine","fromEmail":"jfine@pytex.org","sentAt":"2011-11-07T22:03:09Z","receivedAt":"2011-11-07T22:03:09Z","isPatch":false,"sender":{"key":"jfine@pytex.org","avatar":"https://gravatar.com/avatar/62650308ca161e461162319339b9b6f6efe7807e47339baf4644f6feb3d47cbf?d=mp&s=160"},"body":"On 07/11/11 21:49, Jakub Narebski wrote:\n\n[snip]\n\n> But now I understand that you are just building tree objects, and\n> creating references to them (with implicit ordering given by names,\n> I guess).  This is to be a start of further work, isn't it?\n\nYes, that's exactly the point, and my apologies if I was not clear enough.\n\nI'll post again when I've finished the script and performed placed \nseveral years of DVD into git.  Then the discussion will be more \nconcrete - we have this tree, how do we make it more useful.\n\nThank you for your contributions, particularly telling me about gitpan.\n\n-- \nJonathan\n"}]}