Do not cleanup args.gn imports located in the output directory.

gn cleanup should keep files that are imported by args.gn and located
in the output directory.

Change-Id: I98116dd3f57765a5c160d7b82bd8104a747dd469
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/17360
Commit-Queue: Takuto Ikuta <tikuta@google.com>
Reviewed-by: Dirk Pranke <dpranke@google.com>
Reviewed-by: Takuto Ikuta <tikuta@google.com>
diff --git a/AUTHORS b/AUTHORS
index f7f74c1..956f1db 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -21,6 +21,7 @@
 Vivaldi Technologies AS <*@vivaldi.com>
 Yandex LLC <*@yandex-team.ru>
 
+Aleksei Khoroshilov <akhoroshilov@brave.com>
 Alexis Menard <alexis.menard@intel.com>
 Alfredo Mazzinghi <mzz.lrd@gmail.com>
 Andrew Boyarshin <andrew.boyarshin@gmail.com>
diff --git a/src/gn/command_clean.cc b/src/gn/command_clean.cc
index 6dcc163..c4b80a9 100644
--- a/src/gn/command_clean.cc
+++ b/src/gn/command_clean.cc
@@ -44,13 +44,20 @@
     return false;
   }
 
-  // Erase everything but (user-created) args.gn and the build.ninja files we
-  // just wrote.
-  const base::FilePath::CharType* remaining[]{
+  // Erase everything but (user-created) args.gn, its imports and the
+  // build.ninja files we just wrote.
+  std::vector<base::FilePath::StringType> remaining{
       FILE_PATH_LITERAL("args.gn"),
       FILE_PATH_LITERAL("build.ninja"),
       FILE_PATH_LITERAL("build.ninja.d"),
   };
+  for (const auto& f :
+       setup->build_settings().build_args().build_args_dependency_files()) {
+    if (IsStringInOutputDir(setup->build_settings().build_dir(), f.value())) {
+      remaining.push_back(UTF8ToFilePath(f.GetName()).value());
+    }
+  }
+
   base::FileEnumerator traversal(
       build_dir, false,
       base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES);