<?xml version="1.0"?>
<!--suppress JSUnresolvedVariable, JSUnresolvedFunction -->
<project>

    <property name="project.dir" location="${basedir}" />

    <macrodef name="git-rev">
        <attribute name="path" default="${project.dir}" />
        <attribute name="property" default="project.revision" />
        <sequential>
            <script language="javascript" taskname="version"><![CDATA[
                (function () {
                    // 为兼容 Windows 的路径分隔符，暂时只能使用这么特殊的方式读取宏变量
                    // path:  @{path}
                    var text = self.runtimeConfigurableWrapper.text.toString();
                    var dir = project.resolveFile(text.match(/\/\/\s*path: *(.*)/)[1]).absoluteFile;
                    var propertyName = "@{property}";

                    function fail(message) {
                        var endTask = project.createTask("fail");
                        endTask.taskName = "???";
                        endTask.message = message;
                        endTask.log(message);
                        endTask.perform();
                    }

                    if (!dir.exists()) {
                        return fail("No such file or directory: " + dir);
                    }

                    var process = new java.lang.ProcessBuilder("git", "rev-parse", "HEAD").directory(dir).start();
                    var out = new java.io.BufferedReader(new java.io.InputStreamReader(process.inputStream, "ascii")).readLine();
                    if (process.waitFor() === 0 && out) {
                        var result = out.substring(0, 8);
                        project.setProperty(propertyName, result);
                        self.log(propertyName + " => " + result + " (git)");
                        return;
                    }

                    fail("Not tracked by git: " + dir);
                })();
                ]]></script>
        </sequential>
    </macrodef>

    <macrodef name="project-version-from-package-json">
        <attribute name="dir" default="${project.dir}" />
        <!-- 输入: 比如: "-dev" -->
        <attribute name="suffix" default="" />
        <!-- 输出: 比如 1.0.0-dev -->
        <attribute name="property" default="project.version" />
        <sequential>
            <script language="javascript" taskname="version"><![CDATA[
                (function () {
                    // 为兼容 Windows 的路径分隔符，暂时只能使用这么特殊的方式读取宏变量
                    // dir:  @{dir}
                    var text = self.runtimeConfigurableWrapper.text.toString();
                    var dir = project.resolveFile(text.match(/\/\/\s*dir: *(.*)/)[1]).absoluteFile;
                    var propertyName = "@{property}";

                    var content = java.nio.file.Files.readAllBytes(new java.io.File(dir, "package.json").toPath());
                    var result = JSON.parse(new java.lang.String(content, "utf8")).version + "@{suffix}";

                    project.setProperty(propertyName, result);
                    self.log(propertyName + " => " + result);
                })();
                ]]></script>
        </sequential>
    </macrodef>

    <macrodef name="project-build-revision">
        <attribute name="dir" default="${project.dir}" />
        <!-- 输出: 比如 build 20180504(abc12345) -->
        <attribute name="property.build" default="project.build" />
        <!-- 输出: 比如 20180504 -->
        <attribute name="property.date" default="@{property.build}.date" />
        <!-- 输出: 比如 abc12345 -->
        <attribute name="property.revision" default="project.revision" />
        <sequential>
            <tstamp>
                <format property="@{property.date}" pattern="yyyyMMdd" locale="en" />
            </tstamp>
            <git-rev property="@{property.revision}" path="@{dir}" />
            <!--suppress AntResolveInspection -->
            <property name="@{property.build}" value="build ${@{property.date}}(${@{property.revision}})" />
        </sequential>
    </macrodef>

    <macrodef name="project-version-init">
        <attribute name="dir" default="${project.dir}" />
        <!-- 输入: 比如: "Coremail" --><!--suppress AntResolveInspection -->
        <attribute name="title" default="${project.title}" />
        <!-- 输入: 比如: " dev" -->
        <attribute name="suffix" default="" />
        <!-- 输出: 比如 XT5.0.8 dev -->
        <attribute name="property.version" default="project.version" />
        <!-- 输出: 比如 build 20180504(abc12345) -->
        <attribute name="property.build" default="project.build" />
        <!-- 输出: 比如 20180504 -->
        <attribute name="property.date" default="@{property.build}.date" />
        <!-- 输出: 比如 abc12345 -->
        <attribute name="property.revision" default="project.revision" />
        <sequential>
            <project-version-from-package-json
                dir="@{dir}"
                suffix="@{suffix}"
                property="@{property.version}" />
            <project-build-revision
                dir="@{dir}"
                property.build="@{property.build}"
                property.date="@{property.date}"
                property.revision="@{property.revision}" />
            <!--suppress AntResolveInspection -->
            <echo message="@{title} ${@{property.version}} ${@{property.build}}" taskname="version" />
        </sequential>
    </macrodef>
</project>
