From 088c891619375d4d26cc1dddc618308fcdccb570 Mon Sep 17 00:00:00 2001 From: Fredrik Paulsson Date: Wed, 24 Jan 2024 16:21:17 +0100 Subject: [PATCH] feat: replace `curl_upload` with `curl_upload_file` BREAKING CHANGE: `curl_upload` is removed, long live `curl_upload_file`. We hope to add `curl_upload` back in to allow uploads of multiple files. There are complexities due to the correct mapping of filepaths. It may be that packaging multiple files into a archive with `rules_pkg` and then uploading that archive is a better way forward anyway. --- curl/upload/defs.bzl | 5 ----- curl/upload/{ => file}/BUILD.bazel | 2 +- curl/upload/file/defs.bzl | 5 +++++ curl/upload/{ => file}/nt.tmpl.bat | 0 curl/upload/{ => file}/posix.tmpl.sh | 28 +++++++++++------------ curl/upload/{ => file}/rule.bzl | 33 ++++++++++++++-------------- e2e/upload/{ => file}/BUILD.bazel | 9 ++++---- e2e/upload/{ => file}/fixture.txt | 2 +- 8 files changed, 41 insertions(+), 43 deletions(-) delete mode 100644 curl/upload/defs.bzl rename curl/upload/{ => file}/BUILD.bazel (95%) create mode 100644 curl/upload/file/defs.bzl rename curl/upload/{ => file}/nt.tmpl.bat (100%) rename curl/upload/{ => file}/posix.tmpl.sh (72%) rename curl/upload/{ => file}/rule.bzl (73%) rename e2e/upload/{ => file}/BUILD.bazel (72%) rename e2e/upload/{ => file}/fixture.txt (68%) diff --git a/curl/upload/defs.bzl b/curl/upload/defs.bzl deleted file mode 100644 index 38c8a3e..0000000 --- a/curl/upload/defs.bzl +++ /dev/null @@ -1,5 +0,0 @@ -load(":rule.bzl", _upload = "upload") - -visibility("public") - -curl_upload = _upload diff --git a/curl/upload/BUILD.bazel b/curl/upload/file/BUILD.bazel similarity index 95% rename from curl/upload/BUILD.bazel rename to curl/upload/file/BUILD.bazel index 9d5f211..7a7b0b0 100644 --- a/curl/upload/BUILD.bazel +++ b/curl/upload/file/BUILD.bazel @@ -10,7 +10,7 @@ alias( "@rules_toolchain//toolchain/constraint/os:windows": ":nt.tmpl.bat", "//conditions:default": ":posix.tmpl.sh", }, - no_match_error = "No script template available for `curl_upload`", + no_match_error = "No script template available for `curl_upload_file`", ), visibility = ["//visibility:public"], ) diff --git a/curl/upload/file/defs.bzl b/curl/upload/file/defs.bzl new file mode 100644 index 0000000..fd8860c --- /dev/null +++ b/curl/upload/file/defs.bzl @@ -0,0 +1,5 @@ +load(":rule.bzl", _file = "file") + +visibility("public") + +curl_upload_file = _file diff --git a/curl/upload/nt.tmpl.bat b/curl/upload/file/nt.tmpl.bat similarity index 100% rename from curl/upload/nt.tmpl.bat rename to curl/upload/file/nt.tmpl.bat diff --git a/curl/upload/posix.tmpl.sh b/curl/upload/file/posix.tmpl.sh similarity index 72% rename from curl/upload/posix.tmpl.sh rename to curl/upload/file/posix.tmpl.sh index 5ba868e..efa7a3b 100644 --- a/curl/upload/posix.tmpl.sh +++ b/curl/upload/file/posix.tmpl.sh @@ -5,11 +5,12 @@ set -o errexit -o nounset # Bazel substitutions CURL="{{curl}}" -SRCS="{{srcs}}" +SRC="{{src}}" +DST="{{dst}}" URL="{{url}}" RETRY="{{retry}}" RETRY_DELAY="{{retry_delay}}" -readonly CURL SRCS URL RETRY RETRY_DELAY +readonly CURL SRC DST URL RETRY RETRY_DELAY # Runfiles RUNFILES_DIR="${RUNFILES_DIR-${0}.runfiles}" @@ -48,17 +49,14 @@ while test 0 -ne "${#}"; do done readonly ENDPOINT -printf "%s\n" "${SRCS}" | - while IFS= read -r SRC; do - printf >&2 "Uploading: %s\n" "${SRC}" +printf >&2 "Uploading: %s to %s\n" "${SRC}" "${ENDPOINT}/${DST}" - # Do the upload - "${RUNFILES}/${CURL}" \ - --netrc \ - --location \ - --progress-bar \ - --retry "${RETRY}" \ - --retry-delay "${RETRY_DELAY}" \ - --upload-file "${RUNFILES}/${SRC}" \ - "${ENDPOINT}/${SRC}" - done +# Do the upload +"${RUNFILES}/${CURL}" \ + --netrc \ + --location \ + --progress-bar \ + --retry "${RETRY}" \ + --retry-delay "${RETRY_DELAY}" \ + --upload-file "${RUNFILES}/${SRC}" \ + "${ENDPOINT}/${DST}" diff --git a/curl/upload/rule.bzl b/curl/upload/file/rule.bzl similarity index 73% rename from curl/upload/rule.bzl rename to curl/upload/file/rule.bzl index e77a280..3c8f2df 100644 --- a/curl/upload/rule.bzl +++ b/curl/upload/file/rule.bzl @@ -1,26 +1,29 @@ visibility("//curl/...") -DOC = """Uploads files to a URL endpoint with cURL. +DOC = """Upload a file to a URL endpoint with cURL. ```py -upload( - name = "upload", - srcs = [ - ":data" - ], +file( + name = "upload_file", + src = ":data", + dst = "data" url = "https://host.name.to.upload", ) ``` """ ATTRS = { - "srcs": attr.label_list( - doc = "Files to be uploaded.", + "src": attr.label( + doc = "File to be uploaded.", + mandatory = True, + allow_single_file = True, + ), + "dst": attr.string( + doc = "The filename to upload as.", mandatory = True, - allow_files = True, ), "url": attr.string( - doc = "URL endpoint for file uploads.", + doc = "URL endpoint for file upload.", mandatory = True, ), "retry": attr.int( @@ -38,9 +41,6 @@ ATTRS = { ), } -def _map(x): - return x.short_path - def implementation(ctx): curl = ctx.toolchains["//curl/toolchain/cli:type"] @@ -51,7 +51,8 @@ def implementation(ctx): substitutions.add("{{url}}", ctx.attr.url.rstrip("/")) substitutions.add("{{retry}}", str(ctx.attr.retry)) substitutions.add("{{retry_delay}}", str(ctx.attr.retry_delay)) - substitutions.add_joined("{{srcs}}", depset(ctx.files.srcs), join_with = "\n", map_each = _map) + substitutions.add("{{src}}", str(ctx.file.src.short_path)) + substitutions.add("{{dst}}", str(ctx.attr.dst)) ctx.actions.expand_template( template = ctx.file.template, @@ -61,7 +62,7 @@ def implementation(ctx): ) files = depset([executable]) - runfiles = ctx.runfiles([curl.executable] + ctx.files.srcs) + runfiles = ctx.runfiles([curl.executable] + ctx.files.src) return DefaultInfo( executable = executable, @@ -69,7 +70,7 @@ def implementation(ctx): runfiles = runfiles, ) -upload = rule( +file = rule( doc = DOC, attrs = ATTRS, implementation = implementation, diff --git a/e2e/upload/BUILD.bazel b/e2e/upload/file/BUILD.bazel similarity index 72% rename from e2e/upload/BUILD.bazel rename to e2e/upload/file/BUILD.bazel index 69b824e..6259557 100644 --- a/e2e/upload/BUILD.bazel +++ b/e2e/upload/file/BUILD.bazel @@ -1,12 +1,11 @@ load("@bazel_skylib//rules:diff_test.bzl", "diff_test") -load("@rules_curl//curl/upload:defs.bzl", "curl_upload") +load("@rules_curl//curl/upload/file:defs.bzl", "curl_upload_file") -curl_upload( +curl_upload_file( name = "upload", testonly = True, - srcs = [ - ":fixture.txt", - ], + src = ":fixture.txt", + dst = "directory/fixture.txt", url = "https://test.case", ) diff --git a/e2e/upload/fixture.txt b/e2e/upload/file/fixture.txt similarity index 68% rename from e2e/upload/fixture.txt rename to e2e/upload/file/fixture.txt index c754bbf..52ca57b 100644 --- a/e2e/upload/fixture.txt +++ b/e2e/upload/file/fixture.txt @@ -7,4 +7,4 @@ 1 --upload-file fixture.txt -https://test.case/upload/fixture.txt +https://test.case/directory/fixture.txt -- GitLab