Add option to specify where to look for .editorconfig files.

Adds a --config|c option which takes a directory in which the search for
.editorconfig files will start.

When --config|c is used together with explicit filenames of files to format,
.editorconfig is searched only in --config directory, and not in directories
where files are.

Fixes #240.
This commit is contained in:
Andrii Shyshkalov 2016-05-04 12:41:41 +02:00
parent 049b151bac
commit afd5799eb1
1 changed files with 37 additions and 7 deletions

View File

@ -16,7 +16,7 @@ else
import std.stdio : stdout, stdin, stderr, writeln, File;
import dfmt.config : Config;
import dfmt.formatter : format;
import std.path : buildPath, expandTilde;
import std.path : buildPath, dirName, expandTilde;
import dfmt.editorconfig : getConfigFor;
import std.getopt : getopt, GetOptException;
@ -27,6 +27,7 @@ else
optConfig.pattern = "*.d";
bool showHelp;
bool showVersion;
string explicitConfigDir;
void handleBooleans(string option, string value)
{
@ -68,6 +69,7 @@ else
"version", &showVersion,
"align_switch_statements", &handleBooleans,
"brace_style", &optConfig.dfmt_brace_style,
"config|c", &explicitConfigDir,
"end_of_line", &optConfig.end_of_line,
"help|h", &showHelp,
"indent_size", &optConfig.indent_size,
@ -111,14 +113,14 @@ else
// On Windows, set stdout to binary mode (needed for correct EOL writing)
// See Phobos' stdio.File.rawWrite
{
import std.stdio: fileno, _O_BINARY, setmode;
import std.stdio : fileno, _O_BINARY, setmode;
immutable fd = fileno(output.getFP());
setmode(fd, _O_BINARY);
version (CRuntime_DigitalMars)
{
import core.atomic : atomicOp;
import core.stdc.stdio: __fhnd_info, FHND_TEXT;
import core.stdc.stdio : __fhnd_info, FHND_TEXT;
atomicOp!"&="(__fhnd_info[fd], ~FHND_TEXT);
}
@ -127,11 +129,31 @@ else
ubyte[] buffer;
Config explicitConfig;
if (explicitConfigDir)
{
import std.path : exists, isDir;
if (!exists(explicitConfigDir) || !isDir(explicitConfigDir))
{
stderr.writeln("--config_dir|c must specify existing directory path");
return 1;
}
explicitConfig = getConfigFor!Config(explicitConfigDir);
explicitConfig.pattern = "*.d";
}
if (readFromStdin)
{
import std.file : getcwd;
Config config;
config.initializeWithDefaults();
config.merge(optConfig, null);
if (explicitConfigDir != "")
{
config.merge(explicitConfig, buildPath(explicitConfigDir, "dummy.d"));
}
config.merge(optConfig, buildPath(getcwd(), "dummy.d"));
if (!config.isValid())
return 1;
ubyte[4096] inputBuffer;
@ -165,9 +187,16 @@ else
}
Config config;
config.initializeWithDefaults();
Config fileConfig = getConfigFor!Config(path);
fileConfig.pattern = "*.d";
config.merge(fileConfig, path);
if (explicitConfigDir != "")
{
config.merge(explicitConfig, buildPath(explicitConfigDir, "dummy.d"));
}
else
{
Config fileConfig = getConfigFor!Config(path);
fileConfig.pattern = "*.d";
config.merge(fileConfig, path);
}
config.merge(optConfig, path);
if (!config.isValid())
return 1;
@ -207,6 +236,7 @@ https://github.com/Hackerpilot/dfmt
Options:
--help, -h Print this help message
--inplace, -i Edit files in place
--config_dir, -c Path to directory to load .editconfig file from.
--version Print the version number and then exit
Formatting Options: