## Requirements
A list of requirements for a possible replacement for CVS as repo software for NetBSD and pkgsrc so we don't keep starting over listing these (and forgetting half) all of the time:
- the license would be nice to be BSDish, must be open source and free to use
- the software should be includeable in NetBSD base without too much excess baggage
- it should be possible to do development on old or small hardware
- it must support automated updating of source trees
- it must support branches
- there should be a conversion for the present history (that actually works)
- the resulting repository must not break easily
- the software should be reasonably mature and reliable
- checkout of a pkgsrc tree must be feasible on a 32MB system
- checkout of a stable pkgsrc tree and then updating select package subdirs to the latest version of the main branch should be possible
- lasting removal of legally tainted code must be possible
Please add/correct.
***
## Experiences in using the software
### Experiences with Fossil
#### Aleksej Saushev (asau)
I started using it before conversion tool were available
(basically it isn't available yet, to my knowledge Joerg is working on it),
in addition I wanted to start as soon as possible
and to try operation with no conversion tool available.
Thus I've tried to simulate working with "vendor branches".
For now Fossil lacks some essential features and has other severe problems:
1. No support for vendor branches.
* Redundant to "There's no support for importing vendor source"?
1. It is impossible to merge between trees growing from the very root.
The initial commit is too special, this prevents using these trees for vendor branches.
* Fixed in [4e3cd6ce4e].
1. There's no support for importing vendor source,
even "addremove" command isn't in trunk at the time of writing.
* It has been merged to trunk and is part of the pkgsrc version.
1. Merge state sticks. You can't undo it.
* Not sure what you mean, but "revert" resets the merge state since [d13054ce84].
1. You can't amend your source when you've just merged, you are forced to commit after merge.
* To clarify, the merge has to be committed first, no separate commits are possible from the checkout before that.
1. You can't tune diff command to ignore RCS keywords.
* Since RCS keywords are not really a native command, it is no surprise. An external diff program can be used for this purpose though.
1. You can't diff single file between two given versions.
* diff --from version1 --to version2 path/to/file
1. There's no way to change commit messages.
* easily done via ui.
1. There's no documented way to select commit messages of current branch, or branch by given commit id.
Or there's a bug preventing it.
* fossil info <commitid>
1. Commands are underdocumented, usage messages don't list many available options.
This applies to trunk at least, there's a branch that states documentation as its goal.
1. There's no convenient way to look at commit contents: files affected, diff.
* fossil ui and use a web browser
Some of above problems are reported.
Note, all problems above are usability problems, I didn't explore e.g. scalability,
Joerg did and had problems, but this is another story.
### Experiences with git
please fill in
### Experiences with Subversion
please fill in
### Experiences with Bazaar
#### Jonathan Perkin (sketch)
We use bzr at work (MySQL), and while it has a number of problems, it does make dev work easy.
The Good
* easy to use
* shared repositories keep local disk usage down
* commercial backing (Canonical)
* cross-platform (works on Windows)
* numerous GUI available
The Bad:
* slow
* requires python
The Ugly:
* can be really slow
* changing repository formats is a hassle
A basic example workflow
<pre>
# create a local shared repository. all objects are held in a .bzr sub-directory, with branches essentially a lightweight checkout
$ bzr init-repo bzr
$ cd bzr
# fetch HEAD, will take a long time, depending on connectivity
$ bzr branch bzr+ssh://bzr.netbsd.org/netbsd-trunk
# fetch netbsd-5, as we already have the majority of the code in netbsd-trunk (and therefore .bzr), this takes a fraction of the time
$ bzr branch bzr+ssh://bzr.netbsd.org//netbsd-5
# ok, let's do some dev work
$ bzr branch netbsd-trunk netbsd-trunk-sketch-fix-msk
$ cd netbsd-trunk-sketch-fix-msk; hack hack hack
# the usual cycle of hack/commit/merge
$ bzr diff # show uncommitted diffs
$ bzr commit # commit to local clone
$ bzr merge ../netbsd-trunk # update clone to latest local trunk, OR
$ bzr merge bzr+ssh://bzr.netbsd.org/netbsd-trunk # merge directly from upstream
# publish our tree for others to review/hack on
$ bzr push bzr+ssh://bzr.netbsd.org/netbsd-trunk-fix-msk
# got reviewed/tested, let's push it
$ bzr merge bzr+ssh://bzr.netbsd.org/netbsd-trunk
$ bzr missing bzr+ssh://bzr.netbsd.org/netbsd-trunk # show changeset differences
$ bzr push bzr+ssh://bzr.netbsd.org/netbsd-trunk
</pre>
I personally find this approach a lot more natural than git's way of managing branches itself inside a single working directory.
***
## Conversion experiences
### git
Conversion of all modules to git succeeded using fromcvs togit. The resulting git repository of src contains several errors where files have a wrong version (eg in hunt/Makefile the contents of the file on the vendor branch appear as tip of the master branch, which is quite wrong).
There have been no reports of errors in the other modules; this may be due to a lack of testing.
### hg
Conversion of src failed. Afair the rest worked when using Mercurial 1.3.*. Alas, fromcvs tohg is not compatible with Mercurial 1.4 which is in pkgsrc now and is the version to use with Python 2.6 (afair). Two identified problems:
<pre>
self.ui = ui.ui(interactive = False)
</pre>
wants to be
<pre>
self.ui = ui.ui()
self.ui.setconfig('ui', 'interactive', 'off')
</pre>
in /usr/pkg/share/fromcvs/tohg.py line 10 (easily fixed, obviously)
and
<pre>
n = self.hgrepo.commit(files = files,
text = text,
user = user,
date = "%s 0" % date,
p1 = p1,
p2 = p2,
extra = {'branch': branch})
</pre>
needs to be replaces with something that works with the 1.4 commit that looks like this:
<pre>
def commit(self, text="", user=None, date=None, match=None, force=False,
editor=False, extra={}):
</pre>
which is where I remembered that I wasn't planning to learn Python this week.
Next try: hg convert on pkgsrc
<pre>
--- /usr/pkg/lib/python2.6/site-packages/hgext/convert/cvsps.py 2009-12-02 01:30:45.000000000 +0000
+++ /tmp/cvsps.py 2010-01-20 12:52:11.000000000 +0000
@@ -271,14 +271,14 @@
tags[rev].append(match.group(1))
branchmap[match.group(1)] = match.group(2)
- elif re_31.match(line):
+ elif re_31.match(line) and re_50.match(peek):
state = 5
elif re_32.match(line):
state = 0
elif state == 4:
# expecting '------' separator before first revision
- if re_31.match(line):
+ if re_31.match(line) and re_50.match(peek):
state = 5
else:
assert not re_32.match(line), _('must have at least '
@@ -357,7 +357,7 @@
elif state == 8:
# store commit log message
- if re_31.match(line):
+ if re_31.match(line) and re_50.match(peek):
state = 5
store = True
elif re_32.match(line):
</pre>
helps it to cope with the output of cvs rlog -N -r1.66 pkgsrc/databases/rrdtool/Makefile (that's the easy one)
but then it tries to parse the output of (eg) cvs rlog -N -r1.19 pkgsrc/graphics/dcraw/Makefile and it's not clear
to me how it could hope to get that one right just from cvs rlog, and all alternatives are going to be rather tedious
and I'm still not planning to learn Python this week. If you feel more energetic, feel free to hand over patches.