Deprecate native git_repository

The skylark implementation of git_repository is a drop-in replacement
for the native workspace rule. So deprecate the latter to avoid having
two implementations of the same. Also, the native rule pulls in quite
some dependencies.

RELNOTES: The native git_repository rule is deprecated. Use the
  Skylark version available via load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
  instead.

Change-Id: Id75d8e7b7377acd1092c4ba993f488be86c03fa0
PiperOrigin-RevId: 187466931
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/GitRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/GitRepositoryFunction.java
index 0e203a5..705f014 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/GitRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/GitRepositoryFunction.java
@@ -22,6 +22,9 @@
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue;
 import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
+import com.google.devtools.build.lib.skyframe.PrecomputedValue;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
@@ -50,6 +53,22 @@
   public RepositoryDirectoryValue.Builder fetch(Rule rule, Path outputDirectory,
       BlazeDirectories directories, Environment env, Map<String, String> markerData)
       throws InterruptedException, RepositoryFunctionException {
+    // Deprecation in favor of the Skylark variant.
+    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (skylarkSemantics == null) {
+      return null;
+    }
+    if (skylarkSemantics.incompatibleRemoveNativeGitRepository()) {
+      throw new RepositoryFunctionException(
+          new EvalException(null,
+              "The native git_repository rule is deprecated."
+              + " load(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\") for a"
+              + " replacement."
+              + "\nUse --incompatible_remove_native_git_repository=false to temporarily continue"
+              + " using the native rule."),
+          Transience.PERSISTENT);
+    }
+
     createDirectory(outputDirectory, rule);
     GitCloner.clone(rule, outputDirectory, env.getListener(), clientEnvironment, downloader);
     return RepositoryDirectoryValue.builder().setPath(outputDirectory);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/NewGitRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/NewGitRepositoryFunction.java
index f5d567a..9be0ea4 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/NewGitRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/NewGitRepositoryFunction.java
@@ -19,8 +19,12 @@
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.rules.repository.NewRepositoryFileHandler;
 import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue;
+import com.google.devtools.build.lib.skyframe.PrecomputedValue;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
+import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
 import java.util.Map;
 
 /**
@@ -35,6 +39,22 @@
   public RepositoryDirectoryValue.Builder fetch(Rule rule, Path outputDirectory,
       BlazeDirectories directories, Environment env, Map<String, String> markerData)
       throws InterruptedException, RepositoryFunctionException {
+    // Deprecation in favor of the Skylark variant.
+    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (skylarkSemantics == null) {
+      return null;
+    }
+    if (skylarkSemantics.incompatibleRemoveNativeGitRepository()) {
+      throw new RepositoryFunctionException(
+          new EvalException(null,
+              "The native git_repository rule is deprecated."
+              + " load(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\") for a"
+              + " replacement."
+              + "\nUse --incompatible_remove_native_git_repository=false to temporarily continue"
+              + " using the native rule."),
+          Transience.PERSISTENT);
+    }
+
     NewRepositoryFileHandler fileHandler = new NewRepositoryFileHandler(directories.getWorkspace());
     if (!fileHandler.prepareFile(rule, env)) {
       return null;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
index a40ca66..9f729b5 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
@@ -52,6 +52,7 @@
     codedOut.writeBoolNoTag(semantics.incompatibleDisallowUncalledSetConstructor());
     codedOut.writeBoolNoTag(semantics.incompatibleLoadArgumentIsLabel());
     codedOut.writeBoolNoTag(semantics.incompatibleNewActionsApi());
+    codedOut.writeBoolNoTag(semantics.incompatibleRemoveNativeGitRepository());
     codedOut.writeBoolNoTag(semantics.incompatibleRemoveNativeHttpArchive());
     codedOut.writeBoolNoTag(semantics.incompatibleShowAllPrintMessages());
     codedOut.writeBoolNoTag(semantics.incompatibleStringIsNotIterable());
@@ -73,6 +74,7 @@
     builder.incompatibleDisallowUncalledSetConstructor(codedIn.readBool());
     builder.incompatibleLoadArgumentIsLabel(codedIn.readBool());
     builder.incompatibleNewActionsApi(codedIn.readBool());
+    builder.incompatibleRemoveNativeGitRepository(codedIn.readBool());
     builder.incompatibleRemoveNativeHttpArchive(codedIn.readBool());
     builder.incompatibleShowAllPrintMessages(codedIn.readBool());
     builder.incompatibleStringIsNotIterable(codedIn.readBool());
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
index c3e0d82..3f22d8c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -171,6 +171,19 @@
   public boolean incompatibleNewActionsApi;
 
   @Option(
+    name = "incompatible_remove_native_git_repository",
+    defaultValue = "false",
+    category = "incompatible changes",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE},
+    help =
+        "If set to true, the native git_repository rules are disabled; only the skylark version "
+            + "will be available"
+  )
+  public boolean incompatibleRemoveNativeGitRepository;
+
+  @Option(
     name = "incompatible_remove_native_http_archive",
     defaultValue = "false",
     category = "incompatible changes",
@@ -232,6 +245,7 @@
         .incompatibleDisallowUncalledSetConstructor(incompatibleDisallowUncalledSetConstructor)
         .incompatibleLoadArgumentIsLabel(incompatibleLoadArgumentIsLabel)
         .incompatibleNewActionsApi(incompatibleNewActionsApi)
+        .incompatibleRemoveNativeGitRepository(incompatibleRemoveNativeGitRepository)
         .incompatibleRemoveNativeHttpArchive(incompatibleRemoveNativeHttpArchive)
         .incompatibleShowAllPrintMessages(incompatibleShowAllPrintMessages)
         .incompatibleStringIsNotIterable(incompatibleStringIsNotIterable)
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
index c5dca8e..85f5c08 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -53,6 +53,8 @@
   public abstract boolean incompatibleNewActionsApi();
   public abstract boolean incompatibleShowAllPrintMessages();
 
+  public abstract boolean incompatibleRemoveNativeGitRepository();
+
   public abstract boolean incompatibleRemoveNativeHttpArchive();
 
   public abstract boolean incompatibleStringIsNotIterable();
@@ -82,6 +84,7 @@
           .incompatibleDisallowUncalledSetConstructor(true)
           .incompatibleLoadArgumentIsLabel(true)
           .incompatibleNewActionsApi(false)
+          .incompatibleRemoveNativeGitRepository(false)
           .incompatibleRemoveNativeHttpArchive(false)
           .incompatibleShowAllPrintMessages(true)
           .incompatibleStringIsNotIterable(false)
@@ -106,6 +109,8 @@
     public abstract Builder incompatibleLoadArgumentIsLabel(boolean value);
     public abstract Builder incompatibleNewActionsApi(boolean value);
 
+    public abstract Builder incompatibleRemoveNativeGitRepository(boolean value);
+
     public abstract Builder incompatibleRemoveNativeHttpArchive(boolean value);
 
     public abstract Builder incompatibleShowAllPrintMessages(boolean value);