From 53401988c752e8097419e38b8d3b57f25027398f Mon Sep 17 00:00:00 2001
From: CrazyMax <crazy-max@users.noreply.github.com>
Date: Tue, 20 Oct 2020 19:04:54 +0200
Subject: [PATCH] Labels and build args should not be handled as CSV type

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
---
 README.md                 | 58 +++++++++++++++++----------------------
 __tests__/context.test.ts |  7 ++++-
 dist/index.js             |  4 +--
 src/context.ts            |  4 +--
 4 files changed, 35 insertions(+), 38 deletions(-)

diff --git a/README.md b/README.md
index 8937540..ed8cbc5 100644
--- a/README.md
+++ b/README.md
@@ -592,46 +592,38 @@ with this action:
 
 Following inputs can be used as `step.with` keys
 
-| Name                | Type    | Description                        |
-|---------------------|---------|------------------------------------|
-| `builder`           | String  | Builder instance (see [setup-buildx](https://github.com/docker/setup-buildx-action) action) |
-| `context`           | String  | Build's context is the set of files located in the specified [`PATH` or `URL`](https://docs.docker.com/engine/reference/commandline/build/) (default [Git context](#git-context)) |
-| `file`              | String  | Path to the Dockerfile (default `Dockerfile`) |
-| `build-args`        | List    | List of build-time variables |
-| `labels`            | List    | List of metadata for an image |
-| `tags`              | List    | List of tags |
-| `pull`              | Bool    | Always attempt to pull a newer version of the image (default `false`) |
-| `target`            | String  | Sets the target stage to build |
-| `allow`             | List    | List of [extra privileged entitlement](https://github.com/docker/buildx#--allowentitlement) (eg. `network.host,security.insecure`) |
-| `no-cache`          | Bool    | Do not use cache when building the image (default `false`) |
-| `platforms`         | List    | List of [target platforms](https://github.com/docker/buildx#---platformvaluevalue) for build |
-| `load`              | Bool    | [Load](https://github.com/docker/buildx#--load) is a shorthand for `--output=type=docker` (default `false`) |
-| `push`              | Bool    | [Push](https://github.com/docker/buildx#--push) is a shorthand for `--output=type=registry` (default `false`) |
-| `outputs`           | CSV     | List of [output destinations](https://github.com/docker/buildx#-o---outputpath-typetypekeyvalue) (format: `type=local,dest=path`) |
-| `cache-from`        | CSV     | List of [external cache sources](https://github.com/docker/buildx#--cache-fromnametypetypekeyvalue) (eg. `type=local,src=path/to/dir`) |
-| `cache-to`          | CSV     | List of [cache export destinations](https://github.com/docker/buildx#--cache-tonametypetypekeyvalue) (eg. `type=local,dest=path/to/dir`) |
-| `secrets`           | CSV     | List of secrets to expose to the build (eg. `key=value`, `GIT_AUTH_TOKEN=mytoken`) |
+| Name                | Type     | Description                        |
+|---------------------|----------|------------------------------------|
+| `builder`           | String   | Builder instance (see [setup-buildx](https://github.com/docker/setup-buildx-action) action) |
+| `context`           | String   | Build's context is the set of files located in the specified [`PATH` or `URL`](https://docs.docker.com/engine/reference/commandline/build/) (default [Git context](#git-context)) |
+| `file`              | String   | Path to the Dockerfile (default `Dockerfile`) |
+| `build-args`        | List     | List of build-time variables |
+| `labels`            | List     | List of metadata for an image |
+| `tags`              | List/CSV | List of tags |
+| `pull`              | Bool     | Always attempt to pull a newer version of the image (default `false`) |
+| `target`            | String   | Sets the target stage to build |
+| `allow`             | List/CSV | List of [extra privileged entitlement](https://github.com/docker/buildx#--allowentitlement) (eg. `network.host,security.insecure`) |
+| `no-cache`          | Bool     | Do not use cache when building the image (default `false`) |
+| `platforms`         | List/CSV | List of [target platforms](https://github.com/docker/buildx#---platformvaluevalue) for build |
+| `load`              | Bool     | [Load](https://github.com/docker/buildx#--load) is a shorthand for `--output=type=docker` (default `false`) |
+| `push`              | Bool     | [Push](https://github.com/docker/buildx#--push) is a shorthand for `--output=type=registry` (default `false`) |
+| `outputs`           | List     | List of [output destinations](https://github.com/docker/buildx#-o---outputpath-typetypekeyvalue) (format: `type=local,dest=path`) |
+| `cache-from`        | List     | List of [external cache sources](https://github.com/docker/buildx#--cache-fromnametypetypekeyvalue) (eg. `type=local,src=path/to/dir`) |
+| `cache-to`          | List     | List of [cache export destinations](https://github.com/docker/buildx#--cache-tonametypetypekeyvalue) (eg. `type=local,dest=path/to/dir`) |
+| `secrets`           | List     | List of secrets to expose to the build (eg. `key=value`, `GIT_AUTH_TOKEN=mytoken`) |
 
-> `List` type can be a comma or newline-delimited string
-> ```yaml
-> tags: name/app:latest,name/app:1.0.0
-> ```
-> ```yaml
-> tags: |
->   name/app:latest
->   name/app:1.0.0
-> ```
-
-> `CSV` type must be a newline-delimited string
-> ```yaml
-> cache-from: user/app:cache
-> ```
+> `List` type is a newline-delimited string
 > ```yaml
 > cache-from: |
 >   user/app:cache
 >   type=local,src=path/to/dir
 > ```
 
+> `CSV` type is a comma-delimited string
+> ```yaml
+> tags: name/app:latest,name/app:1.0.0
+> ```
+
 ### outputs
 
 Following outputs are available
diff --git a/__tests__/context.test.ts b/__tests__/context.test.ts
index 133f1d2..b373188 100644
--- a/__tests__/context.test.ts
+++ b/__tests__/context.test.ts
@@ -34,11 +34,13 @@ describe('getArgs', () => {
     [
       '0.4.2',
       new Map<string, string>([
-        // noop
+        ['build-args', 'MY_ARG=val1,val2,val3\nARG=val'],
       ]),
       [
         'buildx',
         'build',
+        '--build-arg', 'MY_ARG=val1,val2,val3',
+        '--build-arg', 'ARG=val',
         '--iidfile', '/tmp/.docker-build-push-jest/iidfile',
         '--file', 'Dockerfile',
         'https://github.com/docker/build-push-action.git#test-jest'
@@ -48,11 +50,14 @@ describe('getArgs', () => {
       '0.4.2',
       new Map<string, string>([
         ['context', '.'],
+        ['labels', 'org.opencontainers.image.title=buildkit\norg.opencontainers.image.description=concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit'],
         ['outputs', 'type=local,dest=./release-out']
       ]),
       [
         'buildx',
         'build',
+        '--label', 'org.opencontainers.image.title=buildkit',
+        '--label', 'org.opencontainers.image.description=concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit',
         '--output', 'type=local,dest=./release-out',
         '--file', 'Dockerfile',
         '.'
diff --git a/dist/index.js b/dist/index.js
index ccd9baa..7bdb2e0 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -14867,8 +14867,8 @@ function getInputs(defaultContext) {
         return {
             context: core.getInput('context') || defaultContext,
             file: core.getInput('file') || 'Dockerfile',
-            buildArgs: yield getInputList('build-args'),
-            labels: yield getInputList('labels'),
+            buildArgs: yield getInputList('build-args', true),
+            labels: yield getInputList('labels', true),
             tags: yield getInputList('tags'),
             pull: /true/i.test(core.getInput('pull')),
             target: core.getInput('target'),
diff --git a/src/context.ts b/src/context.ts
index 1e8b2b9..ab11146 100644
--- a/src/context.ts
+++ b/src/context.ts
@@ -46,8 +46,8 @@ export async function getInputs(defaultContext: string): Promise<Inputs> {
   return {
     context: core.getInput('context') || defaultContext,
     file: core.getInput('file') || 'Dockerfile',
-    buildArgs: await getInputList('build-args'),
-    labels: await getInputList('labels'),
+    buildArgs: await getInputList('build-args', true),
+    labels: await getInputList('labels', true),
     tags: await getInputList('tags'),
     pull: /true/i.test(core.getInput('pull')),
     target: core.getInput('target'),