/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#include "cmCPackCygwinBinaryGenerator.h"

#include "cmsys/SystemTools.hxx"

#include "cmCPackLog.h"
#include "cmGeneratedFileStream.h"
#include "cmGlobalGenerator.h"
#include "cmMakefile.h"
#include "cmSystemTools.h"
#include "cmake.h"

cmCPackCygwinBinaryGenerator::cmCPackCygwinBinaryGenerator()
  : cmCPackArchiveGenerator(cmArchiveWrite::CompressBZip2, "paxr", ".tar.bz2")
{
}

cmCPackCygwinBinaryGenerator::~cmCPackCygwinBinaryGenerator()
{
}

int cmCPackCygwinBinaryGenerator::InitializeInternal()
{
  this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr");
  this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "0");
  return this->Superclass::InitializeInternal();
}

int cmCPackCygwinBinaryGenerator::PackageFiles()
{
  std::string packageName =
    cmStrCat(this->GetOption("CPACK_PACKAGE_NAME"), '-',
             this->GetOption("CPACK_PACKAGE_VERSION"));
  packageName = cmsys::SystemTools::LowerCase(packageName);
  std::string manifest = cmStrCat("/usr/share/doc/", packageName, "/MANIFEST");
  std::string manifestFile = this->GetOption("CPACK_TEMPORARY_DIRECTORY");
  // Create a MANIFEST file that contains all of the files in
  // the tar file
  std::string tempdir = manifestFile;
  manifestFile += manifest;
  // create an extra scope to force the stream
  // to create the file before the super class is called
  {
    cmGeneratedFileStream ofs(manifestFile.c_str());
    for (std::string const& file : files) {
      // remove the temp dir and replace with /usr
      ofs << file.substr(tempdir.size()) << "\n";
    }
    ofs << manifest << "\n";
  }
  // add the manifest file to the list of all files
  files.push_back(manifestFile);

  // create the bzip2 tar file
  return this->Superclass::PackageFiles();
}

const char* cmCPackCygwinBinaryGenerator::GetOutputExtension()
{
  this->OutputExtension = "-";
  const char* patchNumber = this->GetOption("CPACK_CYGWIN_PATCH_NUMBER");
  if (!patchNumber) {
    patchNumber = "1";
    cmCPackLogger(cmCPackLog::LOG_WARNING,
                  "CPACK_CYGWIN_PATCH_NUMBER not specified using 1"
                    << std::endl);
  }
  this->OutputExtension += patchNumber;
  this->OutputExtension += ".tar.bz2";
  return this->OutputExtension.c_str();
}
