Fork and merge DSCM
Fork and merge DSCMs (Distributed Source Control Managers)
Freenet supports Git and Mercurial reasonably well out of the box as both can publish to standard web servers.
However, it would be better to be able to fork a repository and then publish only your changes without having to reinsert everything. Various git-over-freenet and mercurial-over-freenet tools have been developed, mostly anonymously, to make this easier.
There is a special case where directory objects are gigantic. So far the only obvious case is Wiki over Freenet. E.g. convert a full english Wikipedia dump into a git repository via Levitation, insert it to Freenet. Then try to change something - you will have to copy the entire directory, and it's enormous. A better solution might be to use some variant of B-tree indexes for the directory.
- For this reason Infocalypse (Mercurial over Freenet) inserts bundles with several changesets which get pulled in order to update the history.
Another important point is that data can be lost on Freenet. It can always be reinserted by the originator, but it means it is important to have checkpoints as git generally only stores diffs for example.
Actually, Git stores full objects for each revision. The diff is calculated on demand. (Mercurial is the DSCM that stores diffs with an occasional checkpoint.)
Infocalypse (Mercurial over Freenet) allows for reinserting all data but the top-key as normal user, so it offers very good persistency. It’s also optimized for minimizing the number of requests for updates. ArneBab uses it for serving the full Freenet code history in Freenet.
A practical problem is that the Java git client is far from being full featured. And anything we bundle will need to be written in Java.
saces is working on a git plugin for Freenet as of 1 March 2010. This will be a server, with complete control over bundling etc, but will integrate cleanly with command line tools. It will reuse objects when forking, reinserting only what is necessary. He suggests that we could have one repository per wiki term in a git-based wiki, but have them reuse objects within an uber-repository. See SchwachkopfEinsteck, which literally translates as "git plugin". Screenshot here (but it is not yet functional)