Write .gitignore file to build directory

This causes build directories to be ignored by default by tools such as
git, jj and rg. The idea was taken from the Meson build tool [1].

[1] https://mesonbuild.com/FAQ.html#how-do-i-ignore-the-build-directory-in-my-vcs

Change-Id: Ic3e6589bce78079e98f9f413d1eb15692bb71649
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/18500
Commit-Queue: David Turner <digit@google.com>
Reviewed-by: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/command_gen.cc b/src/gn/command_gen.cc
index e373c89..1e53b77 100644
--- a/src/gn/command_gen.cc
+++ b/src/gn/command_gen.cc
@@ -9,6 +9,7 @@
 #include <unordered_map>
 
 #include "base/command_line.h"
+#include "base/files/file_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/timer/elapsed_timer.h"
@@ -490,6 +491,19 @@
   return true;
 }
 
+bool WriteIgnoreFile(Setup& setup, Err* err) {
+  // Write a .gitignore file that causes the build directory to be ignored.
+  base::FilePath output_path =
+      setup.build_settings()
+          .GetFullPath(setup.build_settings().build_dir())
+          .Append(FILE_PATH_LITERAL(".gitignore"));
+
+  if (base::PathExists(output_path))
+    return true;
+
+  return WriteFile(output_path, "# Created by GN\n*\n", err);
+}
+
 }  // namespace
 
 const char kGen[] = "gen";
@@ -871,6 +885,11 @@
     return 1;
   }
 
+  if (!WriteIgnoreFile(*setup, &err)) {
+    err.PrintToStdout();
+    return 1;
+  }
+
   TickDelta elapsed_time = timer.Elapsed();
 
   if (!command_line->HasSwitch(switches::kQuiet)) {