Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(228)

Unified Diff: tools/gn/function_get_path_info.cc

Issue 334333005: Add directory extraction to GN path handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge to new file template function Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/filesystem_utils.cc ('k') | tools/gn/function_get_path_info_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/function_get_path_info.cc
diff --git a/tools/gn/function_get_path_info.cc b/tools/gn/function_get_path_info.cc
index 23f690cfdc096e2ef90eb011e16ded80316189b2..ea6651c2f0219bed5b1cc1725a13e720eba7af68 100644
--- a/tools/gn/function_get_path_info.cc
+++ b/tools/gn/function_get_path_info.cc
@@ -20,9 +20,25 @@ enum What {
WHAT_EXTENSION,
WHAT_DIR,
WHAT_ABSPATH,
+ WHAT_GEN_DIR,
+ WHAT_OUT_DIR,
};
-std::string GetOnePathInfo(const SourceDir& current_dir,
+// Returns the directory containing the input (resolving it against the
+// |current_dir|), regardless of whether the input is a directory or a file.
+SourceDir DirForInput(const SourceDir& current_dir,
+ const std::string& input_string) {
+ if (!input_string.empty() && input_string[input_string.size() - 1] == '/') {
+ // Input is a directory.
+ return current_dir.ResolveRelativeDir(input_string);
+ }
+
+ // Input is a directory.
+ return current_dir.ResolveRelativeFile(input_string).GetDir();
+}
+
+std::string GetOnePathInfo(const Settings* settings,
+ const SourceDir& current_dir,
What what,
const Value& input,
Err* err) {
@@ -62,6 +78,16 @@ std::string GetOnePathInfo(const SourceDir& current_dir,
return std::string("//.");
return dir_incl_slash.substr(0, dir_incl_slash.size() - 1).as_string();
}
+ case WHAT_GEN_DIR: {
+ return DirectoryWithNoLastSlash(
+ GetGenDirForSourceDir(settings,
+ DirForInput(current_dir, input_string)));
+ }
+ case WHAT_OUT_DIR: {
+ return DirectoryWithNoLastSlash(
+ GetOutputDirForSourceDir(settings,
+ DirForInput(current_dir, input_string)));
+ }
case WHAT_ABSPATH: {
if (!input_string.empty() && input_string[input_string.size() - 1] == '/')
return current_dir.ResolveRelativeDir(input_string).value();
@@ -123,6 +149,16 @@ const char kGetPathInfo_Help[] =
" will be appended such that it is always legal to append a slash\n"
" and a filename and get a valid path.\n"
"\n"
+ " \"out_dir\"\n"
+ " The output file directory corresponding to the path of the\n"
+ " given file, not including a trailing slash.\n"
+ " \"//foo/bar/baz.txt\" => \"//out/Default/obj/foo/bar\"\n"
+
+ " \"gen_dir\"\n"
+ " The generated file directory corresponding to the path of the\n"
+ " given file, not including a trailing slash.\n"
+ " \"//foo/bar/baz.txt\" => \"//out/Default/gen/foo/bar\"\n"
+ "\n"
" \"abspath\"\n"
" The full absolute path name to the file or directory. It will be\n"
" resolved relative to the currebt directory, and then the source-\n"
@@ -168,6 +204,10 @@ Value RunGetPathInfo(Scope* scope,
what = WHAT_EXTENSION;
} else if (args[1].string_value() == "dir") {
what = WHAT_DIR;
+ } else if (args[1].string_value() == "out_dir") {
+ what = WHAT_OUT_DIR;
+ } else if (args[1].string_value() == "gen_dir") {
+ what = WHAT_GEN_DIR;
} else if (args[1].string_value() == "abspath") {
what = WHAT_ABSPATH;
} else {
@@ -177,13 +217,15 @@ Value RunGetPathInfo(Scope* scope,
const SourceDir& current_dir = scope->GetSourceDir();
if (args[0].type() == Value::STRING) {
- return Value(function, GetOnePathInfo(current_dir, what, args[0], err));
+ return Value(function, GetOnePathInfo(scope->settings(), current_dir, what,
+ args[0], err));
} else if (args[0].type() == Value::LIST) {
const std::vector<Value>& input_list = args[0].list_value();
Value result(function, Value::LIST);
for (size_t i = 0; i < input_list.size(); i++) {
result.list_value().push_back(Value(function,
- GetOnePathInfo(current_dir, what, input_list[i], err)));
+ GetOnePathInfo(scope->settings(), current_dir, what,
+ input_list[i], err)));
if (err->has_error())
return Value();
}
« no previous file with comments | « tools/gn/filesystem_utils.cc ('k') | tools/gn/function_get_path_info_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698