* CVS Access Here we describe how one obtains commit access to the Mono CVS repository and the responsibilities that come with that access privilege. These only apply to the Mono CVS repository, and not to the Mono Community repositories at Novell Forge. ** What is CVS? Briefly, CVS is a system tool used to store and maintain files and a history of their changes over time. The Mono source code and related files are kept on a CVS server at Ximian. ** What Access? We mean "commit" access. This is the privilege to make permanent changes to the Mono source code and related files. You need an account created by the CVS server administrator in order to commit changes to the files on that server. ** How Does One Obtain Access? Any active Mono developer can get a CVS account. Normally one is considered an 'active' developer after sending several patches to the mailing lists and/or bugzilla for review. If you are not a developer, but want to access the latest sources, please see the AnonCVS instructions. If you are not a direct contributor to Mono, but want to host your .NET or Mono-based project, you can use Novell Forge. If you feel you are ready for a CVS account send an e-mail to miguel with your public OpenSSH key for this purpose. We only support SSH2 at this point. * Policies It is necessary that everyone with CVS commit access respect and adhere to the following rules. If you ask for and are granted CVS access, you are agreeing to follow these policies. ** Code License If you are about to commit code to a module, the code that is being committed should be released under the same license as the code that the module has. Check the license if you are unsure, but it is basically: class libraries X11; compiler and tools: GPL; runtime: LGPL. If in doubt, check with the maintainers of the module, or send mail to mono-hackers-list@ximian.com. ** Changing code Even if you have CVS commit access, that doesn't mean you can change code at will in any directory or module. Directories and Namespaces have a sort of unofficial ownership. If you are not the owner of a piece of code and you want to make changes/fixes to it, there are two cases. Note: If the patch is an addition of code and doesn't change any of the existing code, the rules are slightly relaxed: there is more freedom in committing such changes, if they don't interfere with the existing codebase. ** Owning Code Now, how do you get to be the owner of a chunk of code? The answer is simple. You wrote the code, so you're the unofficial owner. There is also another way. After sending a few patches for the code, the owner (or the core developers of mono, if the owner somehow disappeared) trusts you and tells you you're free to commit without getting his review first. Here is a (partial) list of namespaces/directories with their owners: If you are the owner of a piece of code, feel free to commit code, and delegate the work to others. But, if you're not the owner of the code, committing a rewrite without getting a review first is not good cvsitizenship (especially when the rewrite claimed to fix bugs, but not a single regression test has been added to the suite). ** Commit Rules Once you know you can commit a patch (because of the rules above) there are a few other small rules to follow: Also, remember to pat yourself on the back after the commit, smile and think we're a step closer to a better free software world. * Branches We have branched the CVS modules `mono', `mcs' and `libgdiplus', the tag to fetch these branches is: `mono-1-0', so you use the following command to fetch the mono-1-0 branches:
	cvs co -r mono-1-0 mono 
	cvs co -r mono-1-0 mcs
	cvs co -r mono-1-0 libgdiplus
I personally use a directory called `mono-1-0' to keep these together and a separate directory keeps my HEAD development, and I configure each one to different prefixes, so I can test and run code with HEAD or mono-1-0. *** mono-1-0 policy This branch will only get bug fixes to critical and major errors. You must still get approval from the maintainer of the code to check-in code into this branch. Before submitting a patch for this branch, you should run all appropriate regression tests. Upcoming mono-1.0.x versions will be produced from this branch. *** mono HEAD policy HEAD should continue to build at all times: HEAD is not a dumping ground for partial work: you still must ensure that the build is not broken, and that no regressions are caused. Unlike the main branch, you do not need approval to minor changes, the same old rules apply. But for any large architectural change, you must check with the maintainers and get approval for the patches. For these large changes, if you are touching someone else's code, you should contact the maintainer of that code and get approval from them. You must assume that HEAD will be packaged and distributed at any point, this will be the branch that we use for making the mono-1.1.x releases that will lead to our stable mono-1.2.x release. So, the bottom line is: do not check-in known regressions that break the build. A lot of work is underway, and we must ensure the tree works. * Using CVS. This is a small tutorial for using CVS. ** Generating an SSH key If you are using SSH version 2, please generate your key using:
	ssh-keygen -t rsa
And mail miguel the id_rsa.pub file. If you are using SSH version 1, run:
	ssh-keygen
And mail miguel your identity.pub file. If you are using SSH from SSH Communications Security (they offer a free SSH client for personal use), you have to use OpenSSH to convert your public key to the required format. You have to use OpenSSH's ssh-keygen program and write the following:
	ssh-keygen -i -f id_XXX.pub > my_public_key.pub
where the file id_XXX.pub is your public key file, normally located under ~/.ssh/ or ~/.ssh2/. Send to miguel the my_public_key.pub file. The *exact* format for this file must be:
	ssh-rsa XXXXX....
You will need CVS and SSH. Windows users can get both by installing Cygwin (http://www.cygwin.com) Unix users will probably have those tools installed already. ** Checking out the sources To check out the sources for the first time from the repository, use this command:
	export CVS_RSH=ssh
	export CVSROOT=username@mono-cvs.ximian.com:/cvs/public
	cvs -z3 co mcs mono
** Updating your sources Every day people will be making changes, to get your latest updated sources, use:
	cvs -z3 update -Pd mcs mono
Note: The '-z3' enables compression for the whole cvs action. The '-Pd' makes the update operation (P)rune directories that have been deleted and get new (d)irectories added to the repository. ** Making patches Usually you will want to make a patch to contribute, and let other people review it before committing it. To obtain such a "patch", you type:
	cd directory-you-want-to-diff
	cvs -z3 diff -u > file.diff
	mail mono-list@ximian.com < file.diff
** Committing your work Once you get approval to commit to the CVS, or if you are committing code that you are the maintainer of, you will want to commit your code to CVS. To do this, you have to "add" any new files that you created:
	cvs add new-file.cs
And then commit your changes to the repository:
	cvs commit file-1.cs file-2.cs
* Using SVN This is a small tutorial for using SVN (subversion). For a more complete tutorial on subversion, look at the svn book or the svn homepage ** Generating a key Follow the cvs instructions above. ** Checking out the sources To checkout the sources for the first time use the command: Note: You should be running 0.35.1 (latest) of svn before attempting anything here.
	svn co svn+ssh://mono-cvs.ximian.com/svn/monodevelop/trunk/MonoDevelop
If you have a different username on mono-cvs and the local computer you can do the following:
	svn co svn+ssh://username@mono-cvs.ximian.com/svn/monodevelop/trunk/MonoDevelop
before checking out. ** Updating your sources You can update your repository to the latest copy of MonoDevelop by running the following command:
	svn up
from inside your repository. ** Committing your work Before you commit anything, you should first update to the latest sources by following the updating directions. After you are up to date you need to run a:
	svn add filename
for every file that you have created. You can get a list of these files by running:
	svn status
After all the files are added, run:
	svn commit
to commit your changes. ** For more information Look at the MonoDevelop website (coming soon) * Keeping track of changes. We provide two e-mail based mechanisms to keep track of changes to the code base: We hope to offer LXR and Bonsai in the future as well. To subscribe, send an email message to mono-cvs-list-request@ximian.com and in the body of the message put `subscribe'. This will send you an email message every time a change is made to the CVS repository, together with the information that the author of the changes submitted. You might also want to track the live changes, subscribe to the mono-patches@ximian.com to receive the patches as they are checked into CVS.