/*
 * 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.
 */

// This project puts together a "distribution", assembling dependencies from
// various other projects.

plugins {
  id 'base'
  id 'distribution'
}

description = 'Solr distribution packaging'

ext {
  distDir = file("$buildDir/solr-${version}")
  devDir = file("$buildDir/dev")
}

configurations {
  distSolr {
    transitive = false
  }
  distSolrj
  contrib
  example
  server
  docs
  docker
}

dependencies {
  distSolrj project(":solr:solrj")

  [":solr:contrib:analysis-extras",
   ":solr:contrib:analytics",
   ":solr:contrib:extraction",
   ":solr:contrib:clustering",
   ":solr:contrib:jaegertracer-configurator",
   ":solr:contrib:langid",
   ":solr:contrib:ltr",
   ":solr:contrib:prometheus-exporter",
   ":solr:contrib:scripting"
  ].each { contribName ->
    distSolr project(contribName)
    contrib  project(path: contribName, configuration: "packaging")
  }

  distSolr project(":solr:core")
  distSolr project(":solr:server")
  distSolr project(":solr:solrj")
  distSolr project(":solr:test-framework")

  example project(path: ":solr:example", configuration: "packaging")
  server project(path: ":solr:server", configuration: "packaging")

  // Copy files from documentation output
  docs project(path: ':solr:documentation', configuration: 'minimalSite')

  docker project(path: ':solr:docker', configuration: 'packaging')
}

distributions {
  main {
    distributionBaseName = 'solr'
    contents {
      // TODO: This is missing module README files, as compared to 8x

      // Manually correct posix permissions (matters when packaging on Windows).
      filesMatching([
          "**/*.sh",
          "**/bin/post",
          "**/bin/postlogs",
          "**/bin/solr",
          "**/bin/init.d/solr",
          "**/bin/solr-exporter",
          "**/docker/scripts/*",
      ]) { copy ->
        copy.setMode(0755)
      }

      from(project(":solr").projectDir, {
        include "bin/**"
        include "licenses/**"
        exclude "licenses/README.committers.txt"
        include "CHANGES.txt"
        include "LICENSE.txt"
        include "NOTICE.txt"
        include "README.md"
      })

      // Should we include Lucene changes?
      /*
        from(project(":lucene").projectDir, {
          include "CHANGES.txt"
          rename { file -> 'LUCENE_CHANGES.txt' }
        })
      */

      from(configurations.contrib, {
        into "contrib"
      })

      from(configurations.distSolr, {
        into "dist"
      })

      from(configurations.distSolrj - configurations.distSolr, {
        into "dist/solrj-lib"
      })

      from(configurations.example, {
        into "example"
      })

      from(configurations.server, {
        into "server"
      })

      from(configurations.docs, {
        into "docs"
      })

      from(configurations.docker, {
        into "docker"
      })

    }
  }
}

installDist {
  into distDir
}

task dev(type: Copy) {
  description "Assemble Solr distribution into 'development' folder at ${devDir}"
  group "build"

  from installDist.outputs
  into devDir
}

assemble.dependsOn installDist
