aboutsummaryrefslogtreecommitdiffstats
path: root/solc/CommandLineInterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'solc/CommandLineInterface.cpp')
-rw-r--r--solc/CommandLineInterface.cpp51
1 files changed, 36 insertions, 15 deletions
diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp
index d3d234c3..bd5e2eb1 100644
--- a/solc/CommandLineInterface.cpp
+++ b/solc/CommandLineInterface.cpp
@@ -116,6 +116,7 @@ static string const g_strStandardJSON = "standard-json";
static string const g_strStrictAssembly = "strict-assembly";
static string const g_strPrettyJson = "pretty-json";
static string const g_strVersion = "version";
+static string const g_strIgnoreMissingFiles = "ignore-missing";
static string const g_argAbi = g_strAbi;
static string const g_argPrettyJson = g_strPrettyJson;
@@ -152,6 +153,7 @@ static string const g_argStandardJSON = g_strStandardJSON;
static string const g_argStrictAssembly = g_strStrictAssembly;
static string const g_argVersion = g_strVersion;
static string const g_stdinFileName = g_stdinFileNameStr;
+static string const g_argIgnoreMissingFiles = g_strIgnoreMissingFiles;
/// Possible arguments to for --combined-json
static set<string> const g_combinedJsonArgs
@@ -398,8 +400,9 @@ void CommandLineInterface::handleGasEstimation(string const& _contract)
}
}
-void CommandLineInterface::readInputFilesAndConfigureRemappings()
+bool CommandLineInterface::readInputFilesAndConfigureRemappings()
{
+ bool ignoreMissing = m_args.count(g_argIgnoreMissingFiles);
bool addStdin = false;
if (!m_args.count(g_argInputFile))
addStdin = true;
@@ -416,13 +419,27 @@ void CommandLineInterface::readInputFilesAndConfigureRemappings()
auto infile = boost::filesystem::path(path);
if (!boost::filesystem::exists(infile))
{
- cerr << "Skipping non-existent input file \"" << infile << "\"" << endl;
+ if (!ignoreMissing)
+ {
+ cerr << "\"" << infile << "\" is not found" << endl;
+ return false;
+ }
+ else
+ cerr << "\"" << infile << "\" is not found. Skipping." << endl;
+
continue;
}
if (!boost::filesystem::is_regular_file(infile))
{
- cerr << "\"" << infile << "\" is not a valid file. Skipping" << endl;
+ if (!ignoreMissing)
+ {
+ cerr << "\"" << infile << "\" is not a valid file" << endl;
+ return false;
+ }
+ else
+ cerr << "\"" << infile << "\" is not a valid file. Skipping." << endl;
+
continue;
}
@@ -433,6 +450,8 @@ void CommandLineInterface::readInputFilesAndConfigureRemappings()
}
if (addStdin)
m_sourceCodes[g_stdinFileName] = dev::readStandardInput();
+
+ return true;
}
bool CommandLineInterface::parseLibraryOption(string const& _input)
@@ -599,7 +618,8 @@ Allowed options)",
g_argAllowPaths.c_str(),
po::value<string>()->value_name("path(s)"),
"Allow a given path for imports. A list of paths can be supplied by separating them with a comma."
- );
+ )
+ (g_argIgnoreMissingFiles.c_str(), "Ignore missing files.");
po::options_description outputComponents("Output Components");
outputComponents.add_options()
(g_argAst.c_str(), "AST of all source files.")
@@ -616,7 +636,7 @@ Allowed options)",
(g_argNatspecUser.c_str(), "Natspec user documentation of all contracts.")
(g_argNatspecDev.c_str(), "Natspec developer documentation of all contracts.")
(g_argMetadata.c_str(), "Combined Metadata JSON whose Swarm hash is stored on-chain.")
- (g_argFormal.c_str(), "Translated source suitable for formal analysis.");
+ (g_argFormal.c_str(), "Translated source suitable for formal analysis. (Deprecated)");
desc.add(outputComponents);
po::options_description allOptions = desc;
@@ -680,7 +700,7 @@ bool CommandLineInterface::processInput()
try
{
auto path = boost::filesystem::path(_path);
- auto canonicalPath = boost::filesystem::canonical(path);
+ auto canonicalPath = weaklyCanonicalFilesystemPath(path);
bool isAllowed = false;
for (auto const& allowedDir: m_allowedDirectories)
{
@@ -696,16 +716,16 @@ bool CommandLineInterface::processInput()
}
if (!isAllowed)
return ReadCallback::Result{false, "File outside of allowed directories."};
- else if (!boost::filesystem::exists(path))
+
+ if (!boost::filesystem::exists(canonicalPath))
return ReadCallback::Result{false, "File not found."};
- else if (!boost::filesystem::is_regular_file(canonicalPath))
+
+ if (!boost::filesystem::is_regular_file(canonicalPath))
return ReadCallback::Result{false, "Not a valid file."};
- else
- {
- auto contents = dev::readFileAsString(canonicalPath.string());
- m_sourceCodes[path.string()] = contents;
- return ReadCallback::Result{true, contents};
- }
+
+ auto contents = dev::readFileAsString(canonicalPath.string());
+ m_sourceCodes[path.string()] = contents;
+ return ReadCallback::Result{true, contents};
}
catch (Exception const& _exception)
{
@@ -741,7 +761,8 @@ bool CommandLineInterface::processInput()
return true;
}
- readInputFilesAndConfigureRemappings();
+ if (!readInputFilesAndConfigureRemappings())
+ return false;
if (m_args.count(g_argLibraries))
for (string const& library: m_args[g_argLibraries].as<vector<string>>())