 -----
 How We Do Things
 -----
 -----
 2017-08-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:
~~ http://maven.apache.org/guides/mini/guide-apt-format.html

How We Do Things

 Below are the conventions we follow in Archiva.

* Continuous Integration

   We use the Jenkins Apache instance for building Archiva (and redback dependencies) on scm changes.

   See the tab with various builds: {{{https://builds.apache.org/view/A-D/view/Archiva/}Archiva tab}}

   You can test fresh builds with downloading from this Jenkins job {{{https://builds.apache.org/job/archiva-master-build/}archiva-master-build/}}:

   * {{{https://builds.apache.org/job/archiva-master-build/lastSuccessfulBuild/artifact/archiva-jetty/target/apache-archiva-${archivaCurrentDevVersion}-bin.zip}standalone with embeded jetty}} (unzip then cd bin;./archiva start running on 8080)

   * {{{https://builds.apache.org/job/archiva-master-build/lastSuccessfulBuild/artifact/archiva-modules/archiva-web/archiva-webapp/target/archiva-webapp-${archivaCurrentDevVersion}-SNAPSHOT.war}war webapp js}}



* Code Style

  There isn't any code style that needs to be followed as long as it is consistent, can be checked in checkstyle, can be
  formatted in Eclipse, IDEA and NetBeans. And the following rules must be followed:

   [[1]] Use spaces, not tabs

          * 4 spaces for Java

          * 2 spaces for XML

   [[2]] 120 column wrap, not 80

   [[3]] Wrap on spaces, not on '.' in a method call


   You can use the existing codestyle files:

   * {{{./archiva-idea-codestyle.xml}idea}}

   * {{{./archiva-eclipse-codestyle.xml}eclipse}}

   []

* Versioning

  It has been established in the community that the following style would be followed for the versioning of releases:

-----
Milestones -> Final -> Patch releases (e.g. 1.1-M1, 1.1-M2, 1.1, 1.1.1, 1.1.2 )
-----

  As much as possible, the team is aiming for frequent releases. If the roadmap for the current development version is
  big, milestone releases can be applied until the final release. But if the roadmap is composed of just a small number
  of issues, we could proceed immediately to preparing a release candidate and push it out as the final release once it
  passes the vote.

* References

  * {{{http://old.nabble.com/Fwd%3A-What-do-we-need-to-establish--td17098487.html} Mailing list discussion regarding conventions}}
       

