Mercurial/Cws
This page discusses the Mercurial part of handling child workspaces (CWSs). It assumes some basic Mercurial knowledge which you can find here.
Contents
Other Mercurial Topics
- Setting up Mercurial
- Migrating existing CVS or SVN based child workspaces to Mercurial
- Using Mercurial with OpenOffice.org: getting started
- Tips and Tricks
The OpenOffice.org repository setup
The OpenOffice.org Mercurial repository is huge, it contains more than 260000 changesets and exceeds 1 GiB in size. Repeatably exchanging this vast numbers of changesets over the Net is prohibitive and wasteful. It's also not necessary. We were careful to employ a setup which is designed to minimize the number of changesets exchanged over the Net. The basic idea is to create a so called 'outgoing' repository for each CWS on the main OOo SCM server. The 'outgoing' repository already has each changeset up to and including the milestone the CWS was created on. It is meant as the main collaboration tool around the child workspace and is also the place where release engineering will fetch a child workspace when it's ready for integration.
Workflow
The workflow is best explained with an example:
Creating the child workspace in EIS
Create child workspace with name foo42, latest available milestone:
$ cws create --hg DEV300 foo42
This command will register CWS foo42 with EIS and set it's SCM property to Mercurial. An 'outgoing' repository will be created (this may take up to one hour) on the SCM server where you can publish your changes.
As an alternative way you can use the EIS web fronted to create the CWS and set it to status 'new'. Don't forget to set the SCM property to 'HG'.
Preparing the working tree
Method A
Make sure that your local pristine copy contains the latest milestone.
$ cd <local_pristine_copy> $ hg pull http://hg.services.openoffice.org/DEV300
Clone your working tree from the pristine local copy
$ hg clone <local_pristine_copy> foo42
Change the default push location to the OOo SCM server
$ echo 'default-push=ssh://hg@hg.services.openoffice.org/cws/foo42' >> foo42/.hg/hgrc
If there are already changes in the outgoing repository pull them into your working tree
$ cd foo42 $ hg pull -u http://hg.services.openoffice.org/cws/foo42
Method B
If there is a proper $HOME/.cwsrc configuration (see below), you can use the cws fetch command.
$ cws fetch -c foo42 foo42
Make sure that either your local source contains the used milestone *or* the 'outgoing' repository is already available on the server. Otherwise you might base your working tree on an older milestone. If this happened, just do a pull/update from http://hg.services.openoffice.org/DEV300 |
The cws fetch command adds the default-push location and a hook (prevent the commit of CR/LF in changed files), no need to configure this by hand.
Commit changes
Not much to be said here. Please format the first line of the commit message according to the example below:
$ hg commit -m"foo42: #i4711#: implement feature foo" foo.cxx
Remember, hg commit will search the whole tree for to be committed changes if no file/directory is specified. |
Publishing changes
Committing changes just does add them to your local repository. For publishing your changes to the OOo developer community just push them to the 'outgoing' repository.
$ hg push ssh://hg@hg.services.openoffice.org/cws/foo42
If the repository hgrc has the correct "default-push" entry the URL can be omitted.
Merge changes from the latest milestone in to the CWS
Updating your CWS to the latest milestone is easier and by *far* faster than with CVS and SVN.
First pull the latest changes from DEV300 into your CWS:
$ cd foo42 $ hg pull http://hg.services.openoffice.org/DEV300 $ hg merge
Often enough the merge might result in conflicts. You can list the merged files with and without conflicts with
$ hg resolve -l
Once a conflict is fixed mark the corresponding file as resolved:
$ hg resolve -m <conflicted_file>
To start over with the merge process (this will loose all your conflict resolutions up to now!!!):
$ hg resolve -a
When every conflict is resolved commit the result of the merge:
$ hg commit -m"foo42: merge with DEV300 m60"
When you are satisfied with merge don't forget to bump up the milestone in EIS:
$ hg push ssh://hg@hg.services.openoffice.org/cws/foo42 $ cws setcurrent -m m60
The milestone can also be changed via EIS web front end.
Integration
When the CWS is nominated, RE will take the changesets from the 'outgoing' repository. Obviously at this point latest your changesets must be published there.
RE might ask you to update your CWS again if there are to many conflicts. Just do another pull/merge/resolve/commit/push cycle then.
Configuring cws fetch
cws fetch can be configured to make use of LOCAL (means: on the same disk) and LAN resources for fast clone operations.
Simply configure the following entries in your $HOME/.cwsrc
# Directory where pristine copies of OOo master workspaces (ie. DEV300) are kept on the local disk # HG_LOCAL_SOURCE= # Example: HG_LOCAL_SOURCE=/export/hg_clean # URL where pristine copies of OOo master workspaces (ie. DEV300) are available in a LAN # HG_LAN_SOURCE= # Example: HG_LAN_SOURCE=http://myserver.example.com:8000/ # The OOo SCM server HG_REMOTE_SOURCE=http://hg.services.openoffice.org