Make "gn clean out/gn*" work.

Bug: none
Change-Id: I7d3172a3fb1c3d5f1a255162f4240c3d167c2b99
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/8340
Commit-Queue: Nico Weber <thakis@chromium.org>
Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/command_clean.cc b/src/gn/command_clean.cc
index ab0b879..4f2548c 100644
--- a/src/gn/command_clean.cc
+++ b/src/gn/command_clean.cc
@@ -44,29 +44,11 @@
   return result;
 }
 
-}  // namespace
-
-namespace commands {
-
-const char kClean[] = "clean";
-const char kClean_HelpShort[] = "clean: Cleans the output directory.";
-const char kClean_Help[] =
-    "gn clean <out_dir>\n"
-    "\n"
-    "  Deletes the contents of the output directory except for args.gn and\n"
-    "  creates a Ninja build environment sufficient to regenerate the build.\n";
-
-int RunClean(const std::vector<std::string>& args) {
-  if (args.size() != 1) {
-    Err(Location(), "You're holding it wrong.", "Usage: \"gn clean <out_dir>\"")
-        .PrintToStdout();
-    return 1;
-  }
-
+bool CleanOneDir(const std::string& dir) {
   // Deliberately leaked to avoid expensive process teardown.
   Setup* setup = new Setup;
-  if (!setup->DoSetup(args[0], false))
-    return 1;
+  if (!setup->DoSetup(dir, false))
+    return false;
 
   base::FilePath build_dir(setup->build_settings().GetFullPath(
       SourceDir(setup->build_settings().build_dir().value())));
@@ -80,7 +62,7 @@
             "%s does not look like a build directory.\n",
             FilePathToUTF8(build_ninja_d_file.DirName().value()).c_str()))
         .PrintToStdout();
-    return 1;
+    return false;
   }
 
   // Erase everything but the args file, and write a dummy build.ninja file that
@@ -92,7 +74,7 @@
     Err(Location(), "Couldn't read build.ninja in this directory.",
         "Try running \"gn gen\" on it and then re-running \"gn clean\".")
         .PrintToStdout();
-    return 1;
+    return false;
   }
 
   base::FileEnumerator traversal(
@@ -111,7 +93,7 @@
                       static_cast<int>(build_commands.size())) == -1) {
     Err(Location(), std::string("Failed to write build.ninja."))
         .PrintToStdout();
-    return 1;
+    return false;
   }
 
   // Write a .d file for the build which references a nonexistant file.
@@ -121,9 +103,36 @@
                       static_cast<int>(dummy_content.size())) == -1) {
     Err(Location(), std::string("Failed to write build.ninja.d."))
         .PrintToStdout();
+    return false;
+  }
+
+  return true;
+}
+
+}  // namespace
+
+namespace commands {
+
+const char kClean[] = "clean";
+const char kClean_HelpShort[] = "clean: Cleans the output directory.";
+const char kClean_Help[] =
+    "gn clean <out_dir>...\n"
+    "\n"
+    "  Deletes the contents of the output directory except for args.gn and\n"
+    "  creates a Ninja build environment sufficient to regenerate the build.\n";
+
+int RunClean(const std::vector<std::string>& args) {
+  if (args.empty()) {
+    Err(Location(), "Missing argument.", "Usage: \"gn clean <out_dir>...\"")
+        .PrintToStdout();
     return 1;
   }
 
+  for (const auto& dir : args) {
+    if (!CleanOneDir(dir))
+      return 1;
+  }
+
   return 0;
 }