TikiFestStrasbourg
At this time, I think there is nothing more important in an Open Source project than to have face to face meetings. I spent the last week in Strasbourg for the TikiFest. I don’t think any of us really knew what was going to happen. I had this idea that it was a perfect moment to release the next major version of Tikiwiki. Some thought it was about security or other technical aspects. We were all wrong. During those days, we got to know each other a little more. For the last years, we have been discussing over IRC, exchanging an occasional email, but we really didn’t know each other. I think that this alone will change the project’s dynamics in the future.
Sitting together in the same room working on the project made it clear that we were all facing similar issues. We could discuss them and see how to improve the situation in the future. No mailing list or chat session could have done as much. We would get up early in the morning and not really see time fly by, alternating between discussions and code. Only our stomachs could bring us back to reality, and that was usually very late.
One of the most important changes that we made is change the release schedule, or create one for that matter. It has been over 3 years since the last major release. Trunk changed so much, we barely know what has been added. The changelog is terrific and certainly not useful to anyone due to the very long length. We decided to release twice a year. The primary reason why we could never really release is that new stuff kept being added in. The reason it came to be that way was that everyone needed that other feature to be added before the release. Otherwise, it would be years before it would be part of a stable release. Well, it has been years since we had a major stable release.
Getting more frequent releases was an easy decision. The discussion was in fact, very short. I think we had everything settled in the morning of the very first day. Later on, this allowed us to assign dates for some major changes, like fully dropping PHP 4 support. Timed-based releases have huge advantages when it comes to open source projects. It allows to observe how things are evolving, take decisions and still provide users with a decent amount of information. It’s not about saying that somewhere in the future we will drop PHP 4. We can provide a month and base it on the growth of PHP 5.
I really have the feeling I am now working on a new project, even if very little of the code changed during those last few days. Just like many other events where developers gather and discuss critical issues, I have some doubts about wether everything discussed will end up being done. However, I have a good feeling. The team is committed and deeply involved in the project. It’s a great thing to know we all share a common vision.
During the entire week, we didn’t have so many hot debates (except maybe one where I exaggeratedly bursted out). Some things are just plain good for a project, and when a project ran without any major guidance for years, some basic, typical, structures are welcome by everyone. One of the only issues we couldn’t quite agree on was what to accept in stable branches. Tikiwiki has a long history of being free for all, which was convenient for every major contributors. With the new model, stable branches are required. Not accepting new features is obvious. Some minor enhancements are acceptable, some not. UI enhancements are even harder to decide on. What is a bug anyway? Is it a major one? What is major? What to accept is an entire gray zone. It’s extremely subjective. I had to rollback commits. I hate doing that. Without people to discuss the issue in front of me, I don’t think I could have done it. In total, we reviewed around 8 commits made after RC1. It took us at least 2 hours to decide which one we couldn’t accept.
Rejecting someone’s contribution is hard. At least I could motivate myself by the fact that this was only the stable branch. They could still apply their patch on trunk. However, with faster release cycles, we will have to keep trunk as somewhat stable. We already have this idea of experimental branches (or feature branches) for new things to mature before being merged, but it really adds overhead. Subversion is quite hard to handle on the branching and merging issues. If you are familiar with version control, it really all makes sense, but it’s a barrier to entry. I started writing scripts to do the hard work, but they still require people using a shell to use them.
Establishing a software process to ensure quality without breaking the team dynamics is hard. Doing it on a community of volunteers is even harder. Some well known best practices just don’t apply. Unit testing? Forget it. Iterative development? We don’t even know what people will be working on or when they will have time to do it. With at least 6 years of development, people got used to their way and, let’s face it, it worked so far. Only part that didn’t work is that the software could never quite release. The decisions we took in Strasbourg were required to improve the releasability of Tikiwiki. I hope it will work out with the community.
For every other decision other than the release cycle, we basically had to take accountability for it. We built some sort of road map, but it can’t really apply to anyone else as we can’t assign tasks to anyone. People will keep volunteering on what they want and we have no control over that. This leads to a strange phenomenon in the roadmap. The roadmap is more about dropping things than about adding things. Tikiwiki is huge. It has features for everything. Letting people add whatever they want has always been very important. It lead to features no one could have imagined with incremental changes and clever combination of features. However, for all the great things that happened, some things were added and forgotten by their authors, remained obscur, unmaintained and unused. For all we know, it might not work at all as it rot and broke. These things are a burden for the project administrators, so they will gradually be removed. Ideally, things like removing unmaintained features and dropping support for older technologies will reduce the weight we have to carry and allow to build greater things.


You mentioned scripts to do merges… I recommend using this:
http://www.orcaware.com/svn/wiki/Svnmerge.py
Not only does it work very well, but its process has now been integrated into Subversion 1.5 itself.
If your scripts do anything more than that, I’d be interested in finding out if they can help me out?
The problem with Subversion 1.5 is that it’s not fully deployed yet. Anyone attempting to merge with an older version would break it for everyone else. The scripts we have been using for a few months only write the last merge version number as part of the commit message and look it up. It works great. There are also some safeguards to make sure merges are only made on unmodified working copies and to make sure merges are made from/to branches that make sense. Since 1.5 is introduced, it’s meta-data in properties also gets creates. Maybe we’ll be able to use it someday, but I think I would still keep the scripts for the safeguards.
I tried it and it works nicely for most cases, but the fact that it modifies properties is annoying. Sometimes I attempt to merge and realize there are more conflicts than I can resolve. Usually, I could just revert everything and move on. Now, one must make sure not to forget to rollback the root folder, otherwise, all tracking breaks.
The first time I read the documentation for the new feature, sometimes before the release, it really did not make me feel confident about the stability. A little bit like the first presentation I heard about git.
I would have thought that the 1.5 merge-tracking would have been client-side, but apparently you need to update everything. Still, you can use older clients, you just won’t be able to do merges without upgrading (not ideal). That said, I’m still using svnmerge.py myself (most of my stuff is on Google Code, so…).
svnmerge.py also checks for your client to be clean before doing anything, and it will only do merges from branches that have been “initialized”, so it won’t do merges that don’t make sense.
When you do a merge with it, the updated properties are committed along with the merge itself, so if you decide to abort it because there’s too many conflicts, “svn revert -R .” at the top will erase all traces that you ever attempted the merge (well, it might leave some files in your working copy, if there was added files, but that’s normal), no need to rollback anything else.
You can also cherry-pick revisions to be merged, which I’m not a big fan of, but can be pretty handy on occasion, and the next time you do a merge, it’ll skip those revisions correctly.
svnmerge.py doesn’t do anything magical that you wouldn’t be able to do yourself with the command-line, so overall, it sounds pretty similar to what your tool does.
Is there somewhere I can pick it up?
Straight from TikiWiki’s repository.
https://tikiwiki.svn.sourceforge.net/svnroot/tikiwiki/trunk/doc/devtools/