"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deploy = exports.generateBranch = exports.switchToBaseBranch = exports.init = void 0;
const core_1 = require("@actions/core");
const io_1 = require("@actions/io");
const fs_1 = __importDefault(require("fs"));
const constants_1 = require("./constants");
const execute_1 = require("./execute");
const util_1 = require("./util");
/* Initializes git in the workspace. */
function init(action) {
    return __awaiter(this, void 0, void 0, function* () {
        try {
            util_1.hasRequiredParameters(action);
            core_1.info(`Deploying using ${action.tokenType}… 🔑`);
            core_1.info('Configuring git…');
            yield execute_1.execute(`git init`, action.workspace, action.silent);
            yield execute_1.execute(`git config user.name "${action.name}"`, action.workspace, action.silent);
            yield execute_1.execute(`git config user.email "${action.email}"`, action.workspace, action.silent);
            try {
                yield execute_1.execute(`git remote rm origin`, action.workspace, action.silent);
                if (action.isTest) {
                    throw new Error();
                }
            }
            catch (_a) {
                core_1.info('Attempted to remove origin but failed, continuing…');
            }
            yield execute_1.execute(`git remote add origin ${action.repositoryPath}`, action.workspace, action.silent);
            if (action.preserve) {
                core_1.info(`Stashing workspace changes… ⬆️`);
                yield execute_1.execute(`git stash`, action.workspace, action.silent);
            }
            yield execute_1.execute(`git fetch --no-recurse-submodules`, action.workspace, action.silent);
            core_1.info('Git configured… 🔧');
        }
        catch (error) {
            throw new Error(`There was an error initializing the repository: ${util_1.suppressSensitiveInformation(error.message, action)} ❌`);
        }
    });
}
exports.init = init;
/* Switches to the base branch. */
function switchToBaseBranch(action) {
    return __awaiter(this, void 0, void 0, function* () {
        try {
            util_1.hasRequiredParameters(action);
            yield execute_1.execute(`git checkout --progress --force ${action.baseBranch ? action.baseBranch : action.defaultBranch}`, action.workspace, action.silent);
        }
        catch (error) {
            throw new Error(`There was an error switching to the base branch: ${util_1.suppressSensitiveInformation(error.message, action)} ❌`);
        }
    });
}
exports.switchToBaseBranch = switchToBaseBranch;
/* Generates the branch if it doesn't exist on the remote. */
function generateBranch(action) {
    return __awaiter(this, void 0, void 0, function* () {
        try {
            util_1.hasRequiredParameters(action);
            core_1.info(`Creating the ${action.branch} branch…`);
            yield switchToBaseBranch(action);
            yield execute_1.execute(`git checkout --orphan ${action.branch}`, action.workspace, action.silent);
            yield execute_1.execute(`git reset --hard`, action.workspace, action.silent);
            yield execute_1.execute(`git commit --no-verify --allow-empty -m "Initial ${action.branch} commit"`, action.workspace, action.silent);
            yield execute_1.execute(`git push --force ${action.repositoryPath} ${action.branch}`, action.workspace, action.silent);
            yield execute_1.execute(`git fetch`, action.workspace, action.silent);
            core_1.info(`Created the ${action.branch} branch… 🔧`);
        }
        catch (error) {
            throw new Error(`There was an error creating the deployment branch: ${util_1.suppressSensitiveInformation(error.message, action)} ❌`);
        }
    });
}
exports.generateBranch = generateBranch;
/* Runs the necessary steps to make the deployment. */
function deploy(action) {
    return __awaiter(this, void 0, void 0, function* () {
        const temporaryDeploymentDirectory = 'github-pages-deploy-action-temp-deployment-folder';
        const temporaryDeploymentBranch = `github-pages-deploy-action/${Math.random()
            .toString(36)
            .substr(2, 9)}`;
        core_1.info('Starting to commit changes…');
        try {
            util_1.hasRequiredParameters(action);
            const commitMessage = !util_1.isNullOrUndefined(action.commitMessage)
                ? action.commitMessage
                : `Deploying to ${action.branch} from ${action.baseBranch} ${process.env.GITHUB_SHA ? `@ ${process.env.GITHUB_SHA}` : ''} 🚀`;
            /*
                Checks to see if the remote exists prior to deploying.
                If the branch doesn't exist it gets created here as an orphan.
              */
            const branchExists = yield execute_1.execute(`git ls-remote --heads ${action.repositoryPath} ${action.branch} | wc -l`, action.workspace, action.silent);
            if (!branchExists && !action.isTest) {
                yield generateBranch(action);
            }
            // Checks out the base branch to begin the deployment process.
            yield switchToBaseBranch(action);
            yield execute_1.execute(`git fetch ${action.repositoryPath}`, action.workspace, action.silent);
            if (action.lfs) {
                // Migrates data from LFS so it can be comitted the "normal" way.
                core_1.info(`Migrating from Git LFS… ⚓`);
                yield execute_1.execute(`git lfs migrate export --include="*" --yes`, action.workspace, action.silent);
            }
            if (action.preserve) {
                core_1.info(`Applying stashed workspace changes… ⬆️`);
                try {
                    yield execute_1.execute(`git stash apply`, action.workspace, action.silent);
                    if (action.isTest) {
                        throw new Error();
                    }
                }
                catch (_a) {
                    core_1.info('Unable to apply from stash, continuing…');
                }
            }
            yield execute_1.execute(`git worktree add --checkout ${temporaryDeploymentDirectory} origin/${action.branch}`, action.workspace, action.silent);
            // Ensures that items that need to be excluded from the clean job get parsed.
            let excludes = '';
            if (action.clean && action.cleanExclude) {
                try {
                    const excludedItems = typeof action.cleanExclude === 'string'
                        ? JSON.parse(action.cleanExclude)
                        : action.cleanExclude;
                    for (const item of excludedItems) {
                        excludes += `--exclude ${item} `;
                    }
                }
                catch (_b) {
                    core_1.info('There was an error parsing your CLEAN_EXCLUDE items. Please refer to the README for more details. ❌');
                }
            }
            if (action.targetFolder) {
                core_1.info(`Creating target folder if it doesn't already exist… 📌`);
                yield io_1.mkdirP(`${temporaryDeploymentDirectory}/${action.targetFolder}`);
            }
            /*
              Pushes all of the build files into the deployment directory.
              Allows the user to specify the root if '.' is provided.
              rsync is used to prevent file duplication. */
            yield execute_1.execute(`rsync -q -av --checksum --progress ${action.folder}/. ${action.targetFolder
                ? `${temporaryDeploymentDirectory}/${action.targetFolder}`
                : temporaryDeploymentDirectory} ${action.clean
                ? `--delete ${excludes} ${!fs_1.default.existsSync(`${action.folder}/CNAME`) ? '--exclude CNAME' : ''} ${!fs_1.default.existsSync(`${action.folder}/.nojekyll`)
                    ? '--exclude .nojekyll'
                    : ''}`
                : ''}  --exclude .ssh --exclude .git --exclude .github ${action.folder === action.root
                ? `--exclude ${temporaryDeploymentDirectory}`
                : ''}`, action.workspace, action.silent);
            const hasFilesToCommit = yield execute_1.execute(`git status --porcelain`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
            if (!hasFilesToCommit && !action.isTest) {
                return constants_1.Status.SKIPPED;
            }
            // Commits to GitHub.
            yield execute_1.execute(`git add --all .`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
            yield execute_1.execute(`git checkout -b ${temporaryDeploymentBranch}`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
            yield execute_1.execute(`git commit -m "${commitMessage}" --quiet --no-verify`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
            yield execute_1.execute(`git push --force ${action.repositoryPath} ${temporaryDeploymentBranch}:${action.branch}`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
            core_1.info(`Changes committed to the ${action.branch} branch… 📦`);
            if (action.singleCommit) {
                yield execute_1.execute(`git fetch ${action.repositoryPath}`, action.workspace, action.silent);
                yield execute_1.execute(`git checkout --orphan ${action.branch}-temp`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
                yield execute_1.execute(`git add --all .`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
                yield execute_1.execute(`git commit -m "${commitMessage}" --quiet --no-verify`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
                yield execute_1.execute(`git branch -M ${action.branch}-temp ${action.branch}`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
                yield execute_1.execute(`git push origin ${action.branch} --force`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
                core_1.info('Cleared git history… 🚿');
            }
            yield execute_1.execute(`git checkout --progress --force ${action.defaultBranch}`, action.workspace, action.silent);
            return constants_1.Status.SUCCESS;
        }
        catch (error) {
            throw new Error(`The deploy step encountered an error: ${util_1.suppressSensitiveInformation(error.message, action)} ❌`);
        }
        finally {
            // Cleans up temporary files/folders and restores the git state.
            core_1.info('Running post deployment cleanup jobs… 🗑️');
            yield execute_1.execute(`git worktree remove ${temporaryDeploymentDirectory} --force`, action.workspace, action.silent);
            yield io_1.rmRF(temporaryDeploymentDirectory);
        }
    });
}
exports.deploy = deploy;
