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

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <parent>
    <groupId>org.apache.archiva</groupId>
    <artifactId>archiva</artifactId>
    <version>1.3.9</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>archiva-docs</artifactId>
  <packaging>pom</packaging>
  <name>Archiva Documentation</name>
  <url>http://archiva.apache.org/docs/${project.version}/</url>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-site-plugin</artifactId>
        <executions>
          <execution>
            <id>site</id>
            <phase>package</phase>
            <goals>
              <goal>site</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptor>src/site/assembly/docs.xml</descriptor>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <finalName>apache-archiva-${project.version}</finalName>
  </build>

  <reporting>
    <excludeDefaults>true</excludeDefaults>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <version>2.0.1</version>
        <reportSets>
          <reportSet>
            <reports>
              <report>license</report>
              <report>project-team</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
    </plugins>
  </reporting>

  <distributionManagement>
    <site>
      <id>apache.website</id>
      <url>scm:svn:https://svn.apache.org/repos/asf/archiva/site-content/docs/${project.version}</url>
    </site>
  </distributionManagement>

  <profiles>
    <profile>
      <id>release</id>
      <!-- TODO: this deploys directly - what about staging? -->
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>                         
            <artifactId>maven-scm-publish-plugin</artifactId>                   
            <configuration>                                                     
              <checkinComment>Apache Archiva Versioned docs for ${project.version}</checkinComment>
              <content>${project.build.directory}/site</content>
            </configuration>                                                    
            <executions>                                                        
              <execution>                                                       
                <id>scm-publish</id>                                            
                <phase>deploy</phase>                                      
                <goals>                                                         
                  <goal>publish-scm</goal>                                      
                </goals>                                                        
              </execution>                                                      
            </executions>                                                       
          </plugin>                                                
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <executions>
              <execution>
                <id>enforce-beanshell</id>
                <goals>
                  <goal>enforce</goal>
                </goals>
                <configuration>
                  <rules>
                    <evaluateBeanshell>
                      <message>Site descriptor needs to be updated for the current release version</message>
                      <condition>
                        <![CDATA[
                          javax.xml.xpath.XPath xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
                          org.xml.sax.InputSource is = new org.xml.sax.InputSource( new java.io.FileInputStream( "${basedir}/src/site/site.xml" ) );
                          xpath.evaluate( "//project/body/breadcrumbs/item[@name='${project.version}']/@href", is ).equals( "/index.html" )
                        ]]>
                      </condition>
                    </evaluateBeanshell>
                    <evaluateBeanshell>
                      <message>Release notes need to be updated for the current release version</message>
                      <condition>
                        <![CDATA[
                          org.codehaus.plexus.util.FileUtils.fileRead( "${basedir}/src/site/apt/release-notes.apt" ).indexOf( "Release Notes for Archiva ${project.version}" ) >= 0
                        ]]>
                      </condition>
                    </evaluateBeanshell>
                  </rules>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>
