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

  * test your setup

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

  * dry run of the release process

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

  * run rat:

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

  * 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 vxquery-dev

  * after success on vxquery-dev send out <<<[VOTE]>>> e-mail on general@i.a.o

  * 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@a.o, general@i.a.o, and vxquery-dev

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

