When will be CVS replaced by modern version control system?

Lennert Buytenhek buytenh at marvell.com
Fri Nov 9 11:22:09 UTC 2007

On Fri, Nov 09, 2007 at 10:52:30AM +0100, Karel Zak wrote:

> > And sure it is not very convenient for developpers, because
> > developpers typically do not want to think about this stuff and would
> > be happy to have their IDE directly plugged into production or user
> > systems. But that's basic maintenance discipline that makes everyone
> > else's life easier.
> I think the best way (for Fedora project) is Tom Mraz's suggestion:
> use stupid central CVS as a storage for patch files and locally use
> scripts that convert these patches as code to/from real DVCS.

I've been doing something like that, but only for the packaging
(i.e. no exploded trees.)  I have a local CVS->git conversion of the
Fedora CVS tree which I use for things like:

1. Being able to quickly see the history of a package and changes
   between packaging in different versions of that package without
   having to go through the CVS server (which is on another
   continent than the one I am on -- I guess the latency from the US
   is probably not too bad.)

2. Visualising branches with gitk, to make it easier to see where
   F-7/F-8 branches have forked off from devel, etc.

3. Maintaining trivial patches for the ARM port such as the one in
   BZ#245441 (when a new upstream release comes out, just run 'git
   pull' and be done.)

4. Maintaining not-so-trivial patches, such as patches to make
   packages build cross, or patches to make packages build with
   uClibc instead of glibc.

There are a number of observations to be made about keeping local
changes to packages:

- For patches in category (3), you could argue that these should
  just be merged upstream, and that would remove the need to make
  maintainance of separate patches easier.

  The truth is that they aren't always merged quickly, and giving
  arch teams unrestricted CVS access only solves part of the problem
  (e.g. what if you want to commit a patch that solves an issue but
  you're not sure whether the maintainer will like it, but he
  isn't responding -- you'll still have to maintain the patches
  separately somehow for some time.)

- Also, the patches in category (4) are unlikely to be merged into
  Fedora any time soon, and the "We can stick with CVS because we
  don't have to make life easier for forks because those people
  should just be working on upstream Fedora instead" argument doesn't
  really apply, because we have enough local changes that you wouldn't
  even _want_ to have in Fedora. ;-)

- Besides, the existence of OLPC-2 branches for various packages
  suggests that we _do_ want to accommodate forks to a limited

  Note that in a distributed VCS, the OLPC-2 specific stuff wouldn't
  have to live on the main Fedora VCS server, and could very easily
  live on a separate box.  (Whether this is desirable for the OLPC-2
  stuff or not is a separate issue, I'm just saying that it is easily
  possible in a DVCS.)  (And whether the result can still be called
  Fedora or not is also a separate issue.)

- [ Also, putting our cross/uClibc patches in a VCS that understands
    branches makes it easier for us to keep those sets of patches on
    different branches, i.e. keep them separate, and only merge them
    the moment you want to build a package.          ]

If you have a need to maintain local changes to packages, IMHO
you're _much_ better off if you keep them in a VCS that is connected
to the upstream Fedora VCS in some sense.

I _could_ just have checked out Fedora CVS, committed that into my
own CVS tree, and started hacking on that, but then I would just be
making life a lot harder for myself, as that would make pulling in
new upstream changes hell, and would probably lead to a permanent

As an example, Fedora's rpm packaging looks somewhat like this in


The tags in the upper half correspond with tags in CVS.  The heads
on the bottom correspond with each of the branches in CVS -- note
how that in the git conversion, different branches live in one
repository, and are merely different versions of the same thing,
instead of living in separate subdirectories in the same module.

To see the individual commits, click on 'shortlog' next to the
branch name (under 'heads'.)

In gitk, it ends up looking something like this:


Note that it is really easy to see:
- where F-7/F-8 forked off from devel
- whether there have been patches applied to F-7 or F-8 that
  haven't been committed to devel yet or vice versa
- etc.

Two more examples (gcc and glibc) are here:

More information about the fedora-devel-list mailing list