 ------
 Developers centre - Committer Environment
 ------
 Vincent Siveton
 ------
 2006-10-01
 ------

~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License.  You may obtain a copy of the License at
~~
~~   http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied.  See the License for the
~~ specific language governing permissions and limitations
~~ under the License.

~~ NOTE: For help with the syntax of this file, see:
~~ https://maven.apache.org/doxia/references/apt-format.html

Introduction

 This document is intended to set up the Maven committer environment.

{Source File Encoding}

 When editing source files, make sure you use the right file encoding. For the Maven project, UTF-8 has been chosen
 as the default file encoding. UTF-8 is an encoding scheme for the Unicode character set and as such allows to encode
 all characters that Java can handle. The source files should not contain the byte order mark (BOM). There can be
 exceptions to this general rule, e.g. properties files are usually encoded using ISO-8859-1 as per the JRE API, so
 please keep this in mind, too.

Subversion Configuration

 Before committing files in subversion repository, you need to read the
 {{{https://www.apache.org/dev/version-control.html#https-svn}Committer Subversion Access}}
 document and you must set your svn client with this properties file: {{{./svn-eol-style.txt}svn-eol-style.txt}}

{Maven Code Style}

 The following sections show how to set up the code style for Maven in IDEA and Eclipse.
 It is strongly preferred that patches use this style before they are supplied.

* IntelliJ IDEA 4.5+

 Download <<<{{{./maven-idea-codestyle.xml}maven-idea-codestyle.xml}}>>> and copy it to
 <<<~~/Library/Preferences/IntelliJIdeaxx/codestyles>>> then restart IDEA (with xx your idea version). On Windows, try
 <<<C:\Documents and Settings\\<username\>\.IntelliJIDEA\config\codestyles>>>

 After this, restart IDEA and open the settings to select the new code style.

* Eclipse 3.2+

 Download <<<{{{./maven-eclipse-codestyle.xml}maven-eclipse-codestyle.xml}}>>>.

 After this, select Window \> Preferences, and open up the configuration for Java \> Code
 Style \> Code Formatter. Click on the button labeled Import... and select the file you
 downloaded. Give the style a name, and click OK.

Setting up SSH public/private keys

 By default, SSH (Secure Shell) asks you to enter your password each time, i.e.:

+-----+
>ssh YOUR_APACHE_USERNAME@people.apache.org
Password:
+-----+

 SSH can be set up with public/private key pairs so that you don't have to type the password each time.
 You need to execute the following on your development machine:

+-----+
> cd ~/.ssh
> ssh-keygen -t dsa -f YOUR_APACHE_USERNAME@apache.org -C YOUR_APACHE_USERNAME@apache.org
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): (just type return)
Enter same passphrase again: (just type return)
Your identification has been saved in YOUR_APACHE_USERNAME@apache.org.
Your public key has been saved in YOUR_APACHE_USERNAME@apache.org.pub.
The key fingerprint is:
0c:16:c7:44:9e:a6:2c:c0:8a:87:04:07:a0:5b:94:d2 YOUR_APACHE_USERNAME@apache.org
+-----+

 Then, paste the content of the local <<<~/.ssh/YOUR_APACHE_USERNAME.pub>>> file into the file
 <<</home/YOUR_APACHE_USERNAME/.ssh/authorized_keys>>> on the Apache remote host.

 <<Note>>: under Cygwin, it is located at <<<\{cygwin.install.path\}\home\YOUR_MACHINE_USERNAME\.ssh>>>. You need
 to copy the content of <<<\{cygwin.install.path\}\home\YOUR_MACHINE_USERNAME\.ssh>>> into
 <<<C:\Documents and Settings\YOUR_MACHINE_USERNAME\.ssh>>> for Maven.

 You also need to modify the <<<~/.ssh/config>>> to use this identity file when communicating with *.apache.org

+-----+
Host *.apache.org
User=YOUR_APACHE_USERNAME
IdentityFile=~/.ssh/YOUR_APACHE_USERNAME@apache.org
+-----+

 To test the installation, try to log in again on Apache. You should not be asked for your password any more.

+-----+
 > ssh YOUR_APACHE_USERNAME@people.apache.org
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
	The Regents of the University of California.  All rights reserved.

FreeBSD 8.2-RELEASE-p4 (GENERIC) #1 r226043: Wed Oct  5 18:45:41 UTC 2011

This is minotaur.apache.org (a.k.a. people.apache.org). 
...
YOUR_APACHE_USERNAME@minotaur:~$
+-----+

Useful software

 The Maven Team uses several software. Here is a partial list:

 * {{{http://www.cygwin.com/}Cygwin}}: collection of free software tools to allow various versions of Microsoft
   Windows to act somewhat like a Unix system

 * {{{http://winscp.net/}WinSCP}}: SFTP client for Windows.

 * {{{http://tortoisesvn.tigris.org/}TortoiseSVN}}: Subversion client, implemented as a Windows shell extension.

 * {{{http://www.gnupg.org/}GnuPG}}: GNU Privacy Guard.
