<!--
  ~ 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>3.0.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>archiva-docs</artifactId>
  <packaging>pom</packaging>
  <name>Archiva :: Documentation</name>
  <url>https://archiva.apache.org/docs/${project.version}/</url>

  <properties>
    <siteFilePath>${user.home}/archiva-sites/archiva-docs-${project.version}/</siteFilePath>
    <maven.build.timestamp.format>yyyy-MM-dd</maven.build.timestamp.format>
    <releaseDate>${maven.build.timestamp}</releaseDate>
    <!-- The git repository, where the site content is placed -->
    <siteRepositoryUrl>scm:git:https://gitbox.apache.org/repos/asf/archiva-web-content.git</siteRepositoryUrl>
    <scmPubCheckoutDirectory>${basedir}/.site-content</scmPubCheckoutDirectory>
    <scmPublishBranch>asf-staging</scmPublishBranch>
    <scmPublishPath>/docs/${project.version}</scmPublishPath>
  </properties>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.rat</groupId>
          <artifactId>apache-rat-plugin</artifactId>
          <configuration>
            <excludes>
              <exclude>src/site/resources/css/*.css</exclude>
              <exclude>src/site/resources/js/*.js</exclude>
              <exclude>*.sh</exclude>
              <exclude>.site-content/**</exclude>
              <exclude>git-sparse-checkout-pattern</exclude>
              <exclude>README.*</exclude> 
            </excludes>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <!--
        SCM Publish plugin.
             We deactivated the deletion, because the patterns for ignorePathsToDelete does only use the file/directory names
             not the relative paths.
             Site plugin is deploying into the subdirectory docs/${project.version} the publish plugin is copying from
             target directly.
        -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-scm-publish-plugin</artifactId>
        <configuration>
          <checkinComment>Apache Archiva Versioned docs for ${project.version}</checkinComment>
          <skipDeletedFiles>true</skipDeletedFiles>
          <content>${project.build.directory}/staging</content>
          <tryUpdate>true</tryUpdate>
<!--
          <ignorePathsToDelete>
            <path>%regex[^(?!docs/).*$]</path>
          </ignorePathsToDelete>
-->
        </configuration>
        <executions>
          <execution>
            <id>scm-publish</id>
            <phase>site-deploy</phase>
            <goals>
              <goal>publish-scm</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <configuration>
          <skipDeploy>true</skipDeploy>
          <stagingDirectory>${project.build.directory}/staging${scmPublishPath}/</stagingDirectory>
        </configuration>
        <executions>
          <execution>
            <id>site-generate-resources</id>
            <phase>generate-resources</phase>
            <goals>
              <goal>site</goal>
            </goals>
          </execution>
          <execution>
            <id>stage-for-scm-publish</id>
            <phase>post-site</phase>
            <goals>
              <goal>stage</goal>
            </goals>
            <configuration>
              <skipDeploy>false</skipDeploy>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>archiva-rest-api-docs-extract</id>
            <phase>site</phase>
            <goals>
              <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
              <includeArtifactIds>archiva-rest-api,archiva-web-common,redback-rest-api</includeArtifactIds>
              <outputDirectory>${project.build.directory}/site/</outputDirectory>
              <excludes>META-INF/**,org/**</excludes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <finalName>apache-archiva-${project.version}</finalName>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.apache.archiva</groupId>
      <artifactId>archiva-rest-api</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.archiva</groupId>
      <artifactId>archiva-web-common</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.archiva.redback</groupId>
      <artifactId>redback-rest-api</artifactId>
    </dependency>
  </dependencies>

  <reporting>
    <excludeDefaults>true</excludeDefaults>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <version>${maven-project-info-reports-plugin.version}</version>
        <reportSets>
          <reportSet>
            <reports>
              <report>licenses</report>
              <report>team</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
    </plugins>
  </reporting>

  <distributionManagement>
    <site>
      <id>apache.website</id>
      <url>${siteRepositoryUrl}</url>
    </site>
  </distributionManagement>

  <profiles>
    <!--
    This runs a sparse git checkout for the web site content repository that contains only the doc directory.
    The profile is activated only, if the checkout directory does not exist.
    The executor runs a shell script.
    -->
    <profile>
      <id>site-checkout</id>
      <activation>
        <file>
          <missing>${scmPubCheckoutDirectory}</missing>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <inherited>false</inherited>
            <executions>
              <execution>
                <id>prepare-checkout</id>
                <phase>pre-site</phase>
                <goals>
                  <goal>exec</goal>
                </goals>
                <configuration>
                  <executable>checkoutSite.sh</executable>
                  <workingDirectory>${project.basedir}</workingDirectory>
                  <arguments>
                    <argument>-d</argument>
                    <argument>${scmPubCheckoutDirectory}</argument>
                    <argument>-b</argument>
                    <argument>${scmPublishBranch}</argument>
                    <argument>${siteRepositoryUrl}</argument>
                  </arguments>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>


</project>
