<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ 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">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.archiva</groupId>
    <artifactId>archiva-parent</artifactId>
    <version>19-SNAPSHOT</version>
  </parent>
  <artifactId>redback-site</artifactId>
  <name>Redback :: Site</name>
  <packaging>pom</packaging>
  <version>2.2-SNAPSHOT</version>
  <properties>
    <redbackVersion>${project.version}</redbackVersion>

    <scmPubCheckoutDirectory>site-content</scmPubCheckoutDirectory>

    <siteRepositoryUrl>scm:git:https://gitbox.apache.org/repos/asf/archiva-web-content-INVALID.git</siteRepositoryUrl>
    <site.staging.base>${project.basedir}</site.staging.base>

  </properties>
  <scm>
    <connection>scm:git:https://gitbox.apache.org/repos/asf/archiva-redback-site.git</connection>
    <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/archiva-redback-site.git</developerConnection>
    <url>https://github.com/apache/archiva-redback-site</url>
  </scm>

  <distributionManagement>
   <site>
     <id>apache.website.svnpub</id>
     <name>Redback Website</name>
     <url>${siteRepositoryUrl}</url>
   </site>
  </distributionManagement>

  <build>

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-scm-publish-plugin</artifactId>
        <configuration>
          <checkinComment>Apache Redback Main site deployment</checkinComment>
          <skipDeletedFiles>true</skipDeletedFiles>
          <content>${project.build.directory}/staging</content>
          <tryUpdate>true</tryUpdate>
        </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>${site.staging.base}/target/staging/redback/</stagingDirectory>
        </configuration>
        <executions>
          <execution>
            <id>stage-for-scm-publish</id>
            <phase>post-site</phase>
            <goals>
              <goal>stage</goal>
            </goals>
            <configuration>
              <skipDeploy>false</skipDeploy>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <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>ci-management</report>
              <report>mailing-lists</report>
              <report>issue-management</report>
              <report>licenses</report>
              <report>team</report>
              <report>scm</report>
            </reports>
          </reportSet>
        </reportSets>
        <configuration>
          <anonymousConnection>scm:git:https://github.com/apache/archiva-redback-core.git</anonymousConnection>
          <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/archiva-redback-core.git</developerConnection>
          <webAccessUrl>https://github.com/apache/archiva-redback-core</webAccessUrl>
          <checkoutDirectoryName>redback-core</checkoutDirectoryName>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <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>${siteRepositoryUrl}</argument>
                  </arguments>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>
