diff options
author | w0rp <devw0rp@gmail.com> | 2017-02-09 00:28:32 +0000 |
---|---|---|
committer | w0rp <devw0rp@gmail.com> | 2017-02-09 00:28:32 +0000 |
commit | bf2075cd0cd6a9e1ea535fe66a7d0483bb5c97a9 (patch) | |
tree | f50159022525eb218b948207086f00b29aa9b466 /stdin_wrapper.d | |
parent | db835fa0a10140d9d169ae686da12bca531ff42f (diff) | |
download | ale-bf2075cd0cd6a9e1ea535fe66a7d0483bb5c97a9.zip |
Revert "Add a Batch stdin wrapper script"
This reverts commit 76a03b07099ec32135be4c7d9a7283343972b0af.
Diffstat (limited to 'stdin_wrapper.d')
-rw-r--r-- | stdin_wrapper.d | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/stdin_wrapper.d b/stdin_wrapper.d new file mode 100644 index 00000000..8714bc2a --- /dev/null +++ b/stdin_wrapper.d @@ -0,0 +1,84 @@ +// Author: w0rp <devw0rp@gmail.com> +// Description: This file provides a D program for implementing +// the stdin-wrapper on Windows. + +import std.algorithm; +import std.array; +import std.file; +import std.process; +import std.stdio; +import std.path; + +@safe +auto createTemporaryFilename(string fileExtension) { + import std.uuid; + + string filename; + + do { + const randomPart = randomUUID().toString.replace("-", "_"); + + filename = buildPath(tempDir(), "ale_" ~ randomPart ~ fileExtension); + } while (exists(filename)); + + return filename; +} + +@trusted +void readStdinToFile(ref File tempFile) { + stdin.byChunk(4096).copy(tempFile.lockingTextWriter()); +} + +// Expand program names like "csslint" to "csslint.cmd" +// D is not able to perform this kind of expanstion in spawnProcess +@safe +string expandedProgramName(string name) { + auto extArray = environment["PATHEXT"].split(";"); + + foreach(pathDir; environment["PATH"].split(";")) { + foreach(extension; extArray) { + const candidate = buildPath(pathDir, name ~ extension); + + if (exists(candidate)) { + return candidate; + } + } + } + + // We were given a full path for a program name, so use that. + if (exists(name)) { + return name; + } + + return ""; +} + +@trusted +int runLinterProgram(string[] args) { + const expandedName = expandedProgramName(args[0]); + + writeln(expandedName); + + if (expandedName) { + return wait(spawnProcess([expandedName] ~ args[1..$])); + } + + return 1; +} + +@safe +int main(string[] args) { + const filename = createTemporaryFilename(args[1]); + + auto tempFile = File(filename, "w"); + + scope(exit) { + tempFile.close(); + remove(filename); + } + + readStdinToFile(tempFile); + tempFile.close(); + + return runLinterProgram(args[2..$] ~ [filename]); +} |