/* 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 "cmCPackLog.h"
#include "cmGeneratedFileStream.h"
#include "cmGlobalGenerator.h"
#include "cmMakefile.h"
#include "cmSystemTools.h"
#include "cmake.h"

#include "cmsys/SystemTools.hxx"

cmCPackCygwinBinaryGenerator::cmCPackCygwinBinaryGenerator() {}

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 = this->GetOption("CPACK_PACKAGE_NAME");
    packageName += "-";
    packageName += this->GetOption("CPACK_PACKAGE_VERSION");
    packageName          = cmsys::SystemTools::LowerCase(packageName);
    std::string manifest = "/usr/share/doc/";
    manifest += packageName;
    manifest += "/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::vector<std::string>::const_iterator i = files.begin();
            i != files.end(); ++i)
        {
            // remove the temp dir and replace with /usr
            ofs << (*i).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();
}
