#!/usr/bin/env python3
# encoding: utf-8
"""
release_vars.py

Created by Jonathan Burke on 2013-02-05.

Copyright (c) 2014 University of Washington. All rights reserved.
"""

# See release_development.html for an explanation of how the release process works
# it will be invaluable when trying to understand the scripts that drive the
# release process

import os
import pwd
import subprocess
import shlex


# ---------------------------------------------------------------------------------
# The only methods that should go here are methods that help define global release
# variables.  All other methods that aid in release should go in release_utils.py


def getAndAppend(name, append):
    """Retrieves the given environment variable and appends the given string to
    its value and returns the new value. The environment variable is not
    modified. Returns an empty string if the environment variable does not
    exist."""
    if name in os.environ:
        return os.environ[name] + append

    else:
        return ""


def execute(command_args, halt_if_fail=True, capture_output=False, working_dir=None):
    """Execute the given command.
    If capture_output is true, then return the output (and ignore the halt_if_fail argument).
    If capture_output is not true, return the return code of the subprocess call."""

    if working_dir is not None:
        print("Executing in %s: %s" % (working_dir, command_args))
    else:
        print("Executing: %s" % (command_args))
    args = shlex.split(command_args) if isinstance(command_args, str) else command_args

    if capture_output:
        process = subprocess.Popen(args, stdout=subprocess.PIPE, cwd=working_dir)
        out = process.communicate()[0]
        process.wait()
        return out

    else:
        result = subprocess.call(args, cwd=working_dir)
        if halt_if_fail and result:
            raise Exception("Error %s while executing %s" % (result, args))
        return result


# ---------------------------------------------------------------------------------

# The location the test site is built in
DEV_SITE_URL = "https://checkerframework.org/dev"
DEV_SITE_DIR = "/cse/www2/types/checker-framework/dev"

# The location the test site is pushed to when it is ready
LIVE_SITE_URL = "https://checkerframework.org"
LIVE_SITE_DIR = "/cse/www2/types/checker-framework"

# Per-user directory for the temporary files created by the release process
# ("USER = os.getlogin()" does not work; see http://bugs.python.org/issue584566.
# Another alternative is: USER = os.getenv('USER').)
TMP_DIR = "/scratch/" + pwd.getpwuid(os.geteuid())[0] + "/cf-release"

# Location this and other release scripts are contained in
SCRIPTS_DIR = TMP_DIR + "/checker-framework/docs/developer/release"

# Location in which we will download files to run sanity checks
SANITY_DIR = TMP_DIR + "/sanity"

# The existence of this file indicates that release_build completed.
# It is deleted at the beginning of a release_build run, and at the
# end of a release_push run.
RELEASE_BUILD_COMPLETED_FLAG_FILE = TMP_DIR + "/release-build-completed"

# Every time a release is built the changes/tags are pushed here
INTERM_REPO_ROOT = TMP_DIR + "/interm"
INTERM_CHECKER_REPO = os.path.join(INTERM_REPO_ROOT, "checker-framework")
INTERM_ANNO_REPO = os.path.join(INTERM_REPO_ROOT, "annotation-tools")

# The central repositories for Checker Framework related projects
LIVE_ANNO_REPO = "git@github.com:typetools/annotation-tools.git"
LIVE_CHECKER_REPO = "git@github.com:typetools/checker-framework.git"
PLUME_SCRIPTS_REPO = "https://github.com/plume-lib/plume-scripts"
CHECKLINK_REPO = "https://github.com/plume-lib/checklink"
PLUME_BIB_REPO = "https://github.com/mernst/plume-bib"
STUBPARSER_REPO = "https://github.com/typetools/stubparser"

# Location of the project directories in which we will build the actual projects.
# When we build these projects are pushed to the INTERM repositories.
BUILD_DIR = TMP_DIR + "/build/"
CHECKER_FRAMEWORK = os.path.join(BUILD_DIR, "checker-framework")
CHECKER_FRAMEWORK_RELEASE = os.path.join(CHECKER_FRAMEWORK, "docs/developer/release")

# If a new Gradle wrapper was recently installed, the first ./gradlew command may output:
#   Downloading https://services.gradle.org/distributions/gradle-6.6.1-bin.zip
# This first call might output Gradle diagnostics, such as "downloading".
execute("./gradlew version -q", True, True, TMP_DIR + "/checker-framework")
CF_VERSION = (
    execute("./gradlew version -q", True, True, TMP_DIR + "/checker-framework")
    .strip()
    .decode("utf-8")
)

ANNO_TOOLS = os.path.join(BUILD_DIR, "annotation-tools")
ANNO_FILE_UTILITIES = os.path.join(ANNO_TOOLS, "annotation-file-utilities")

PLUME_SCRIPTS = os.path.join(BUILD_DIR, "plume-scripts")
CHECKLINK = os.path.join(BUILD_DIR, "checklink")
PLUME_BIB = os.path.join(BUILD_DIR, "plume-bib")
STUBPARSER = os.path.join(BUILD_DIR, "stubparser")

BUILD_REPOS = (CHECKER_FRAMEWORK, ANNO_TOOLS)
INTERM_REPOS = (INTERM_CHECKER_REPO, INTERM_ANNO_REPO)

INTERM_TO_BUILD_REPOS = (
    (INTERM_CHECKER_REPO, CHECKER_FRAMEWORK),
    (INTERM_ANNO_REPO, ANNO_TOOLS),
)

LIVE_TO_INTERM_REPOS = (
    (LIVE_CHECKER_REPO, INTERM_CHECKER_REPO),
    (LIVE_ANNO_REPO, INTERM_ANNO_REPO),
)

AFU_LIVE_SITE = os.path.join(LIVE_SITE_DIR, "annotation-file-utilities")
AFU_LIVE_RELEASES_DIR = os.path.join(AFU_LIVE_SITE, "releases")

CHECKER_LIVE_RELEASES_DIR = os.path.join(LIVE_SITE_DIR, "releases")

os.environ["PARENT_DIR"] = BUILD_DIR
os.environ["CHECKERFRAMEWORK"] = CHECKER_FRAMEWORK
perl_libs = TMP_DIR + "/homes/gws/mernst/bin/src/perl:/usr/share/perl5/"
# Environment variables for tools needed during the build
os.environ["PLUME_SCRIPTS"] = PLUME_SCRIPTS
os.environ["CHECKLINK"] = CHECKLINK
os.environ["BIBINPUTS"] = ".:" + PLUME_BIB
os.environ["TEXINPUTS"] = ".:/homes/gws/mernst/tex/sty:/homes/gws/mernst/tex:..:"
os.environ["PERLLIB"] = getAndAppend("PERLLIB", ":") + perl_libs
os.environ["PERL5LIB"] = getAndAppend("PERL5LIB", ":") + perl_libs
# Still needed for santiy checks
os.environ["JAVA_8_HOME"] = "/usr/lib/jvm/java-1.8.0-openjdk/"
os.environ["JAVA_HOME"] = os.environ["JAVA_8_HOME"]

EDITOR = os.getenv("EDITOR")
if EDITOR is None:
    EDITOR = "emacs"

PATH = os.environ["JAVA_HOME"] + "/bin:" + os.environ["PATH"]
PATH = PATH + ":/usr/bin"
PATH = PATH + ":" + PLUME_SCRIPTS
PATH = PATH + ":" + CHECKLINK
PATH = PATH + ":/homes/gws/mernst/.local/bin"  # for html5validator
PATH = PATH + ":."
os.environ["PATH"] = PATH

# Tools that must be on your PATH (besides common Unix ones like grep)
TOOLS = ["hevea", "perl", "java", "latex", "mvn", "hg", "git", "html5validator", EDITOR]
