add provides_file and replaces_file for dpkg_deb (#1049)

* Add provides_file and replaces_file

* fix links

* Expand @file references in provides and replaces fields
diff --git a/pkg/private/deb/deb.bzl b/pkg/private/deb/deb.bzl
index d385ed5..29c7acc 100644
--- a/pkg/private/deb/deb.bzl
+++ b/pkg/private/deb/deb.bzl
@@ -160,10 +160,23 @@
         args.add("--pre_depends", d)
     for d in ctx.attr.recommends:
         args.add("--recommends", d)
-    for d in ctx.attr.replaces:
-        args.add("--replaces", d)
-    for d in ctx.attr.provides:
-        args.add("--provides", d)
+    if ctx.attr.replaces_file:
+        if ctx.attr.replaces:
+            fail("Both replaces and replaces_file attributes were specified")
+        args.add("--replaces", "@" + ctx.file.replaces_file.path)
+        files.append(ctx.file.replaces_file)
+    elif ctx.attr.replaces:
+        for d in ctx.attr.replaces:
+            args.add("--replaces", d)
+
+    if ctx.attr.provides_file:
+        if ctx.attr.provides:
+            fail("Both provides and provides_file attributes were specified")
+        args.add("--provides", "@" + ctx.file.provides_file.path)
+        files.append(ctx.file.provides_file)
+    elif ctx.attr.provides:
+        for d in ctx.attr.provides:
+            args.add("--provides", d)
 
     args.set_param_file_format("flag_per_line")
     args.use_param_file("@%s", use_always = True)
@@ -351,9 +364,14 @@
             default = [],
         ),
         "provides": attr.string_list(
-            doc = """See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps.""",
+            doc = """See https://www.debian.org/doc/debian-policy/ch-relationships.html#virtual-packages-provides.""",
             default = [],
         ),
+        "provides_file": attr.label(
+            doc = """File that contains a list of provided packages. Must not be used with `provides`.
+            See https://www.debian.org/doc/debian-policy/ch-relationships.html#virtual-packages-provides.""",
+            allow_single_file = True,
+        ),
         "predepends": attr.string_list(
             doc = """See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps.""",
             default = [],
@@ -363,9 +381,14 @@
             default = [],
         ),
         "replaces": attr.string_list(
-            doc = """See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps.""",
+            doc = """See https://www.debian.org/doc/debian-policy/ch-relationships.html#overwriting-files-and-replacing-packages-replaces.""",
             default = [],
         ),
+        "replaces_file": attr.label(
+            doc = """File that contains a list of replaced packages. Must not be used with `replaces`.
+            See https://www.debian.org/doc/debian-policy/ch-relationships.html#overwriting-files-and-replacing-packages-replaces.""",
+            allow_single_file = True,
+        ),
         "suggests": attr.string_list(
             doc = """See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps.""",
             default = [],
diff --git a/pkg/private/deb/make_deb.py b/pkg/private/deb/make_deb.py
index d1557ba..ee9bdc3 100644
--- a/pkg/private/deb/make_deb.py
+++ b/pkg/private/deb/make_deb.py
@@ -408,8 +408,8 @@
       enhances=options.enhances,
       preDepends=options.pre_depends,
       recommends=options.recommends,
-      replaces=options.replaces,
-      provides=options.provides,
+      replaces=GetFlagValues(options.replaces),
+      provides=GetFlagValues(options.provides),
       homepage=helpers.GetFlagValue(options.homepage),
       license=helpers.GetFlagValue(options.license),
       builtUsing=helpers.GetFlagValue(options.built_using),