~~ 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.

Releasing Apache VXQuery\x99

* One time steps

  * set up directory structure

    There usually are 3 directories at the same level

    * the source directory <<<vxquery>>>,

    * the <<<site>>> directory, and

    * the distribution directory <<<dist>>>.

    The source directory is version-controlled by <<<git>>>, the other two
    are version controlled by <<<svn>>>.
    While the source directory and the distribution directory can have
    arbitrary names and locations, the <<<site>>> directory has to be called
    <<<site>>> and it needs to be at the same level as the source directory
    to enable site deployment.

    Assuming that the source directory is available one can create the
    directory structure by going to the directory that contains the
    source directory and checking out the distribution and site
    directories:

---
$ svn co https://dist.apache.org/repos/dist/release/vxquery dist
$ svn co https://svn.apache.org/repos/asf/vxquery/site
---

  * add your key to the <<<KEYS>>> file

    Change into the <<<dist>>> directory and run

---
(gpg --list-sigs <your name> && gpg2 --armor --export <your name>) >> KEYS
---

    and then check the new <<<KEYS>>> file into svn

---
$ svn ci -m "add [YOUR NAME]'s key to KEYS file"
---

  * create an encrypted version of your Apache LDAP password for the nexus repository at {{{https://repository.apache.org/}https://repository.apache.org/}}

    Follow the steps in the {{{http://maven.apache.org/guides/mini/guide-encryption.html}Password Encryption}}
    guide to encrypt a master password and to encrypt your Apache LDAP password.
    (It's nicer if you have maven > 3.2.1 to do this.)

  * add to <<<~/.m2/settings.xml>>>

    * for the upload to the nexus repository

---
  <servers>
    <!-- To publish a snapshot of some part of Maven -->
    <server>
      <id>apache.snapshots.https</id>
      <username>[YOUR APACHE LDAP USERNAME]</username>
      <password>[YOUR APACHE LDAP PASSWORD] (encrypted)</password>
    </server>
    <!-- To stage a release of some part of Maven -->
    <server>
      <id>apache.releases.https</id>
      <username>[YOUR APACHE LDAP USERNAME]</username>
      <password>[YOUR APACHE LDAP PASSWORD] (encrypted)</password>
    </server>
   ...
  </servers>
---

    * to sign the artifacts

---
  <profiles>
    <profile>
      <id>apache-release</id>
      <properties>
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>...</gpg.passphrase>
      </properties>
    </profile>
  </profiles>
---

  * Download Apache Rat from {{{https://creadur.apache.org/rat/download_rat.cgi}https://creadur.apache.org/rat/download_rat.cgi}}.

* Each time steps

  * clean up

---
$ mvn clean
---

  * run rat (always do this on a clean source folder):

---
$ java -jar ~/Downloads/apache-rat-0.11/apache-rat-0.11.jar -d . -E .rat-excludes
---

  * test your setup

---
$ mvn install -Papache-release
---

  * dry run of the release process

---
$ mvn release:prepare -DdryRun=true
---

  * check (and fix) the content of the <<<LICENSE>>> and <<<NOTICE>>> files (especially the date) and the copyright dates in changed files

  * release to the staging repository

---
$ mvn release:prepare
$ mvn release:perform
---

  * close the staging repository at {{{https://repository.apache.org/}https://repository.apache.org/}}

  * check that the artifacts are available in the repository

  * send out <<<[VOTE]>>> e-mail on dev@vxquery.apache.org

  * after successful vote promote staging repository {{{https://repository.apache.org/}https://repository.apache.org/}}

  * add new source artifacts (archive + signature + hashes) to svn {{{https://dist.apache.org/repos/dist/release/vxquery}https://dist.apache.org/repos/dist/release/vxquery}} and remove old release dirctory

  * commit changes to svn

  * update the <<<site>>> branch in git from the from the release-tag

  * build a new site and deploy it to <<<../site>>>

---
$ mvn site site:deploy
---

  * submit the site to svn

---
$ cd ../site
$ svn st | awk '/\?/ { print $2 }' | xargs svn add # add all new files
$ svn ci -m"updated site"
$ cd -
---

  * wait a few days for the mirroring of the release artifacts

  * send <<<[ANNOUNCE]>>> e-mail to announce@apache.org and dev@vxquery.apache.org

* References

  * {{{https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven}How To Generate PGP Signatures With Maven}}

  * {{{https://www.apache.org/dev/publishing-maven-artifacts.html}Publishing Maven Artifacts}}

~~ * Handling issues
~~
~~ ** Undo release plugin:
~~
~~ ---
~~ $ svn merge -r 1526098:1524606 https://svn.apache.org/repos/asf/vxquery/branches/vxquery_0_2_staging
~~ $ svn del -m "re-releasing build" https://svn.apache.org/repos/asf/vxquery/tags/apache-vxquery-0.2-incubating
~~ ---

