Add a Batch stdin wrapper script

This commit is contained in:
w0rp 2016-12-13 09:50:42 +00:00
parent 70e379cc46
commit 76a03b0709
4 changed files with 23 additions and 85 deletions

View File

@ -8,7 +8,7 @@ function! s:FindWrapperScript() abort
if filereadable(l:path)
if has('win32')
return l:path . '.exe'
return l:path . '.bat'
endif
return l:path

22
stdin-wrapper.bat Normal file
View File

@ -0,0 +1,22 @@
@echo off
REM Get a unique directory name in the temporary directory
:loop
set "directory=%tmp%\ale_%RANDOM%"
if exist "%directory%" goto :loop
REM Use a filename with the same file extension
mkdir "%directory%"
set filename="%directory%\file%1"
REM Get all arguments after the first to run as a command
for /f "tokens=1,* delims= " %%a in ("%*") do set command_args=%%b
REM Read all stdin data to the filename
more > "%filename%"
REM Run the command on the file
%command_args% "%filename%"
REM Delete the temporary directory
rmdir "%directory%" /s /q

Binary file not shown.

View File

@ -1,84 +0,0 @@
// 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]);
}