Merge third_party_http_archive and tf_http_archive repository rules.

PiperOrigin-RevId: 359331157
Change-Id: I34f0fad687b13900b42a60abe9573ae662bfb75e
diff --git a/tensorflow/workspace2.bzl b/tensorflow/workspace2.bzl
index b3532b2..8907896 100644
--- a/tensorflow/workspace2.bzl
+++ b/tensorflow/workspace2.bzl
@@ -830,7 +830,6 @@
     tf_http_archive(
         name = "cython",
         build_file = "//third_party:cython.BUILD",
-        patch_file = "//third_party:cython.patch",
         sha256 = "e2e38e1f0572ca54d6085df3dec8b607d20e81515fb80215aed19c81e8fe2079",
         strip_prefix = "cython-0.29.21",
         system_build_file = "//third_party/systemlibs:cython.BUILD",
diff --git a/third_party/flatbuffers/workspace.bzl b/third_party/flatbuffers/workspace.bzl
index f071a91..69171c9 100644
--- a/third_party/flatbuffers/workspace.bzl
+++ b/third_party/flatbuffers/workspace.bzl
@@ -13,7 +13,6 @@
         ],
         build_file = "//third_party/flatbuffers:BUILD.bazel",
         system_build_file = "//third_party/flatbuffers:BUILD.system",
-        patch_file = "//third_party/flatbuffers:flatbuffers.patch",
         link_files = {
             "//third_party/flatbuffers:build_defs.bzl": "build_defs.bzl",
         },
diff --git a/third_party/llvm/workspace.bzl b/third_party/llvm/workspace.bzl
index 6baf4f7..d99ee75 100644
--- a/third_party/llvm/workspace.bzl
+++ b/third_party/llvm/workspace.bzl
@@ -15,7 +15,7 @@
             "https://storage.googleapis.com/mirror.tensorflow.org/github.com/llvm/llvm-project/archive/{commit}.tar.gz".format(commit = LLVM_COMMIT),
             "https://github.com/llvm/llvm-project/archive/{commit}.tar.gz".format(commit = LLVM_COMMIT),
         ],
-        additional_build_files = {
+        link_files = {
             "//third_party/llvm:llvm.autogenerated.BUILD": "llvm/BUILD",
             "//third_party/mlir:BUILD": "mlir/BUILD",
             "//third_party/mlir:test.BUILD": "mlir/test/BUILD",
diff --git a/third_party/repo.bzl b/third_party/repo.bzl
index f9e5a09..d27106d 100644
--- a/third_party/repo.bzl
+++ b/third_party/repo.bzl
@@ -27,27 +27,13 @@
         return False
     return name in [n.strip() for n in syslibenv.split(",")]
 
-# Apply a patch_file to the repository root directory.
-def _apply_patch(ctx, patch_file):
-    ctx.patch(patch_file, strip = 1)
+def _get_link_dict(ctx, link_files, build_file):
+    if build_file:
+        # Use BUILD.bazel because it takes precedence over BUILD.
+        link_files = dict(link_files, **{build_file: "BUILD.bazel"})
+    return {ctx.path(v): Label(k) for k, v in link_files.items()}
 
-def _maybe_label(label_string):
-    return Label(label_string) if label_string else None
-
-def _label_path_dict(ctx, dict):
-    return {Label(k): ctx.path(v) for k, v in dict.items()}
-
-def _tf_http_archive(ctx):
-    # Construct all labels early on to prevent rule restart. We want the
-    # attributes to be strings instead of labels because they refer to files
-    # in the TensorFlow repository, not files in repos depending on TensorFlow.
-    # See also https://github.com/bazelbuild/bazel/issues/10515.
-    patch_file = _maybe_label(ctx.attr.patch_file)
-    build_file = _maybe_label(ctx.attr.build_file)
-    system_build_file = _maybe_label(ctx.attr.system_build_file)
-    system_link_files = _label_path_dict(ctx, ctx.attr.system_link_files)
-    additional_build_files = _label_path_dict(ctx, ctx.attr.additional_build_files)
-
+def _tf_http_archive_impl(ctx):
     if len(ctx.attr.urls) < 2 or "mirror.tensorflow.org" not in ctx.attr.urls[0]:
         fail("tf_http_archive(urls) must have redundant URLs. The " +
              "mirror.tensorflow.org URL must be present and it must come first. " +
@@ -55,36 +41,36 @@
              "put the correctly formatted mirror URL there anyway, because " +
              "someone will come along shortly thereafter and mirror the file.")
 
-    use_syslib = _use_system_lib(ctx, ctx.attr.name)
+    # Construct all labels early on to prevent rule restart. We want the
+    # attributes to be strings instead of labels because they refer to files
+    # in the TensorFlow repository, not files in repos depending on TensorFlow.
+    # See also https://github.com/bazelbuild/bazel/issues/10515.
+    link_dict = _get_link_dict(ctx, ctx.attr.link_files, ctx.attr.build_file)
 
-    if not use_syslib:
+    if _use_system_lib(ctx, ctx.attr.name):
+        link_dict.update(_get_link_dict(
+            ctx = ctx,
+            link_files = ctx.attr.system_link_files,
+            build_file = ctx.attr.system_build_file,
+        ))
+    else:
+        patch_file = ctx.attr.patch_file
+        patch_file = Label(patch_file) if patch_file else None
         ctx.download_and_extract(
-            ctx.attr.urls,
-            "",
-            ctx.attr.sha256,
-            ctx.attr.type,
-            ctx.attr.strip_prefix,
+            url = ctx.attr.urls,
+            sha256 = ctx.attr.sha256,
+            type = ctx.attr.type,
+            stripPrefix = ctx.attr.strip_prefix,
         )
         if patch_file:
-            _apply_patch(ctx, patch_file)
+            ctx.patch(patch_file, strip = 1)
 
-    if use_syslib and system_build_file:
-        # Use BUILD.bazel to avoid conflict with third party projects with
-        # BUILD or build (directory) underneath.
-        ctx.template("BUILD.bazel", system_build_file, executable = False)
-    elif build_file:
-        # Use BUILD.bazel to avoid conflict with third party projects with
-        # BUILD or build (directory) underneath.
-        ctx.template("BUILD.bazel", build_file, executable = False)
-
-    if use_syslib:
-        for label, path in system_link_files.items():
-            ctx.symlink(label, path)
-
-    for label, path in additional_build_files.items():
+    for path, label in link_dict.items():
+        ctx.delete(path)
         ctx.symlink(label, path)
 
 tf_http_archive = repository_rule(
+    implementation = _tf_http_archive_impl,
     attrs = {
         "sha256": attr.string(mandatory = True),
         "urls": attr.string_list(mandatory = True),
@@ -93,13 +79,10 @@
         "patch_file": attr.string(),
         "build_file": attr.string(),
         "system_build_file": attr.string(),
+        "link_files": attr.string_dict(),
         "system_link_files": attr.string_dict(),
-        "additional_build_files": attr.string_dict(),
     },
-    environ = [
-        "TF_SYSTEM_LIBS",
-    ],
-    implementation = _tf_http_archive,
+    environ = ["TF_SYSTEM_LIBS"],
     doc = """Downloads and creates Bazel repos for dependencies.
 
 This is a swappable replacement for both http_archive() and
@@ -112,83 +95,6 @@
 'str(Label("//:bar"))').""",
 )
 
-def _third_party_http_archive(ctx):
-    # Construct all labels early on to prevent rule restart. We want the
-    # attributes to be strings instead of labels because they refer to files
-    # in the TensorFlow repository, not files in repos depending on TensorFlow.
-    # See also https://github.com/bazelbuild/bazel/issues/10515.
-    build_file = _maybe_label(ctx.attr.build_file)
-    system_build_file = _maybe_label(ctx.attr.system_build_file)
-    patch_file = _maybe_label(ctx.attr.patch_file)
-    link_files = _label_path_dict(ctx, ctx.attr.link_files)
-    system_link_files = _label_path_dict(ctx, ctx.attr.system_link_files)
-
-    if len(ctx.attr.urls) < 2 or "mirror.tensorflow.org" not in ctx.attr.urls[0]:
-        fail("tf_http_archive(urls) must have redundant URLs. The " +
-             "mirror.tensorflow.org URL must be present and it must come first. " +
-             "Even if you don't have permission to mirror the file, please " +
-             "put the correctly formatted mirror URL there anyway, because " +
-             "someone will come along shortly thereafter and mirror the file.")
-
-    use_syslib = _use_system_lib(ctx, ctx.attr.name)
-
-    # Use "BUILD.bazel" to avoid conflict with third party projects that contain a
-    # file or directory called "BUILD"
-    buildfile_path = ctx.path("BUILD.bazel")
-
-    if use_syslib:
-        if ctx.attr.system_build_file == None:
-            fail("Bazel was configured with TF_SYSTEM_LIBS to use a system " +
-                 "library for %s, but no system build file for %s was configured. " +
-                 "Please add a system_build_file attribute to the repository rule" +
-                 "for %s." % (ctx.attr.name, ctx.attr.name, ctx.attr.name))
-        ctx.symlink(Label(ctx.attr.system_build_file), buildfile_path)
-
-    else:
-        ctx.download_and_extract(
-            ctx.attr.urls,
-            "",
-            ctx.attr.sha256,
-            ctx.attr.type,
-            ctx.attr.strip_prefix,
-        )
-        if ctx.attr.patch_file:
-            _apply_patch(ctx, Label(ctx.attr.patch_file))
-        ctx.symlink(Label(ctx.attr.build_file), buildfile_path)
-
-    link_dict = {}
-    if use_syslib:
-        link_dict.update(system_link_files)
-
-    for label, path in link_files.items():
-        # if syslib and link exists in both, use the system one
-        if path not in link_dict.values():
-            link_dict[label] = path
-
-    for label, path in link_dict.items():
-        ctx.symlink(label, path)
-
-# Downloads and creates Bazel repos for dependencies.
-#
-# This is an upgrade for tf_http_archive that works with go/tfbr-thirdparty.
-#
-# For link_files, specify each dict entry as:
-# "//path/to/source:file": "localfile"
-third_party_http_archive = repository_rule(
-    attrs = {
-        "sha256": attr.string(mandatory = True),
-        "urls": attr.string_list(
-            mandatory = True,
-            allow_empty = False,
-        ),
-        "strip_prefix": attr.string(),
-        "type": attr.string(),
-        "build_file": attr.string(mandatory = True),
-        "system_build_file": attr.string(),
-        "patch_file": attr.string(),
-        "link_files": attr.string_dict(),
-        "system_link_files": attr.string_dict(),
-    },
-    environ = ["TF_SYSTEM_LIBS"],
-    implementation = _third_party_http_archive,
-)
+# Introduced for go/tfbr-thirdparty, now alias of tf_http_archive.
+# TODO(csigg): Update call sites and remove.
+third_party_http_archive = tf_http_archive