diff --git a/.gitignore b/.gitignore index e0c01f2..bcbcf73 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ dvm/dvm/dvm bin/dvm *.deps .dub -bin/* \ No newline at end of file +bin/* +tmp diff --git a/dub.json b/dub.json index 455889a..f3bd62d 100644 --- a/dub.json +++ b/dub.json @@ -12,7 +12,7 @@ "targetPath": "bin", "sourcePaths": ["dvm"], "importPaths": ["dvm"], - "stringImportPaths": ["resources"], + "stringImportPaths": ["resources", "tmp"], "excludedSourceFiles-posix": [ "dvm/util/DvmRegistry.d", @@ -25,5 +25,13 @@ "dependencies": { "mambo": "~>0.0.9" - } + }, + + "preGenerateCommands-posix": [ + "$$DC -run $PACKAGE_DIR/tools/generate_version.d" + ], + + "preGenerateCommands-windows": [ + "%DC% -run $PACKAGE_DIR/tools/generate_version.d" + ] } diff --git a/dvm/dvm/Version.d b/dvm/dvm/Version.d index 603fff4..76dca15 100644 --- a/dvm/dvm/Version.d +++ b/dvm/dvm/Version.d @@ -6,4 +6,7 @@ */ module dvm.dvm.Version; -enum Version = "0.4.5"; +import std.range : drop; +import std.string : strip; + +enum Version = import("version").strip.drop(1); diff --git a/tools/generate_version.d b/tools/generate_version.d new file mode 100755 index 0000000..d8bf08a --- /dev/null +++ b/tools/generate_version.d @@ -0,0 +1,36 @@ +import std.file : exists, mkdirRecurse, readText, write; +import std.path : buildPath; +import std.process : execute, env = environment; +import std.string : strip; + +enum outputDirectory = "tmp"; +enum versionFile = "version"; + +void main() +{ + const outputDirectory = env.get("DUB_PACKAGE_DIR", ".").buildPath("tmp"); + + mkdirRecurse(outputDirectory); + + outputDirectory + .buildPath("version") + .updateIfChanged(generateVersion); +} + +string generateVersion() +{ + const result = execute(["git", "describe", "--dirty", "--tags", "--always"]); + + if (result.status != 0) + throw new Exception("Failed to execute 'git describe'"); + + return result.output.strip; +} + +void updateIfChanged(const string path, const string content) +{ + const existingContent = path.exists ? path.readText : ""; + + if (content != existingContent) + write(path, content); +}