Use cat instead of read -r to stream stdin to file (#120)

* Use `cat` instead of `read -r` to stream stdin to file

* Cleanup dmd-wrapper

* Fix typo

* Make wrapper work on macOS

* Use fifo instead of temporary file

* Fix stdin-wrapper

* Use `awk` instead of `read` hackery

* Finish refactoring

* Fix `exec` issue

* Add myself as an coauthor of wrapper scripts (no shame at all :P)

* Fix dmd-wrapper

* Extract check_dubfile
This commit is contained in:
Łukasz Jan Niemier 2016-10-22 14:52:49 +02:00 committed by w0rp
parent 216eadbcbe
commit e293e0b5ab
2 changed files with 43 additions and 34 deletions

View File

@ -1,40 +1,41 @@
#!/bin/bash -eu
#!/usr/bin/env bash
# Author: w0rp <devw0rp@gmail.com>
# Author: w0rp <devw0rp@gmail.com>, hauleth <lukasz@niemier.pl>
# Description: This script wraps DMD so we can get something which is capable of reading
# D code from stdin.
temp_file=`mktemp`
mv "$temp_file" "$temp_file".d
temp_file="$temp_file".d
set -eu
trap "rm $temp_file" EXIT
check_dubfile() {
[[ -e "$1/dub.json" || -e "$1/dub.sdl" || -e "$1/package.json" ]]
}
while read; do
echo "$REPLY" >> "$temp_file"
done
traverse() {
path=$(pwd)
while [ "$path" != "/" ] \
&& ! check_dubfile "$path"
do
path=$(dirname "$path")
done
# Read imports from DUB.
original_path="$(pwd)"
path="$original_path"
import_line_options=''
echo "$path"
}
# We need to look for variable configuration files in parent directories.
while [ "$path" != '/' ]; do
if [ -f "$path/dub.sdl" ] || [ -f "$path/dub.json" ] || [ -f "$path/package.json" ]; then
import_line_options() {
root="$(traverse)"
cd "$path"
if check_dubfile "$root"
then
dub describe --root="$root" --import-paths | awk '{ print "-I" $0 }'
else
echo -n
fi
}
while read import_line; do
import_line_options="$import_line_options -I$import_line"
done <<< "$(dub describe --import-paths)"
temp_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'ale_linters')
temp_file="$temp_dir/file.d"
trap 'rm -r "$temp_dir"' EXIT
cd "$original_path"
cp /dev/stdin "$temp_file"
break
fi
path="$(dirname "$path")"
done
dmd $import_line_options "$@" "$temp_file"
dmd $(import_line_options) "$@" "$temp_file"

View File

@ -1,20 +1,28 @@
#!/usr/bin/env bash
# Author: w0rp <devw0rp@gmail.com>
# Authors: w0rp <devw0rp@gmail.com>, hauleth <lukasz@niemier.pl>
# Description: This script implements a wrapper for any program which does not accept
# stdin input on most Unix machines. The input to the script is read to a
# temporary file, and the first argument sets a particular file extension
# for the temporary file.
set -eu
# All of the following arguments are read as command to run.
file_extension="$1"
shift
temp_file=$(mktemp --tmpdir "ale-XXXXXXXXX$file_extension")
trap 'rm $temp_file' EXIT
temp_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'ale_linter')
temp_file="$temp_dir/file$file_extension"
trap 'rm -r "$temp_dir"' EXIT
while read -r; do
echo "$REPLY" >> "$temp_file"
done
# In perfect world it wouldn't be needed, but some tools (`go vet`, I am looking
# at you) do not fit in line and require filename ending. Otherwise it would be
# simple as
#
# "$@" /dev/stdin
#
# without all that hackery with copying `/dev/stdin`
cp /dev/stdin "$temp_file"
"$@" "$temp_file"