From f7615f5917213b24245d49ba96693d0f5375a414 Mon Sep 17 00:00:00 2001 From: Jon Church Date: Fri, 30 Jan 2026 13:54:13 -0500 Subject: [PATCH] Add `include-hidden-files` input # The Problem Hidden files and directories (e.g. `.well-known`) are unconditionally excluded from the tar archive. There is no way to include them. (#129) # The Solution Add an `include-hidden-files` input (default `false`) that skips the `--exclude=.[^/]*` pattern when set to `true`. `.git` and `.github` are always excluded regardless. Test coverage added for the new option. I think this is the right approach rather than #134. Keep the default behavior safe, and give a sane option to users who know what they're doing. It was safe enough for upload-artifact, it should be safe enough here. # Context `actions/upload-artifact` introduced hidden file exclusion and a corresponding `include-hidden-files` option in [v4.4.0](https://github.com/actions/upload-artifact/releases/tag/v4.4.0). This action adopted the same exclusion behavior in its tar step but never added the equivalent option. This PR closes that gap. The only sane workaround without this option is to drop this action, manually create the tar, and hand it to `upload-artifact` directly. See [expressjs/expressjs.com#2173](https://github.com/expressjs/expressjs.com/pull/2173) for an example. --- .github/workflows/test-hosted-runners.yml | 43 +++++++++++++++++++++++ README.md | 1 + action.yml | 10 ++++-- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-hosted-runners.yml b/.github/workflows/test-hosted-runners.yml index 0d31739..1b52cea 100644 --- a/.github/workflows/test-hosted-runners.yml +++ b/.github/workflows/test-hosted-runners.yml @@ -57,3 +57,46 @@ jobs: - name: Check for absence of symlinks run: if [ $(find artifact2 -type l | wc -l) != 0 ]; then echo "Symlinks found"; exit 1; fi shell: bash + + test-include-hidden: + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Generate files + run: mkdir artifact && mkdir artifact2 && cd artifact && ../script/new-artifact.sh + shell: bash + + - name: Upload Pages artifact + uses: ./ + with: + name: pages-artifact-hidden-${{ matrix.os }} + path: artifact + include-hidden-files: true + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: pages-artifact-hidden-${{ matrix.os }} + path: artifact2 + + - name: Extract artifact + run: tar -xf artifact2/artifact.tar -C artifact2 && rm artifact2/artifact.tar + shell: bash + + - name: Check for presence of hidden files + run: if [ $(find artifact2 -regex ".*/\..*" | wc -l) == 0 ]; then echo "Hidden files not found"; exit 1; fi + shell: bash + + - name: Compare files + run: diff -qr artifact artifact2 + shell: bash + + - name: Check for absence of symlinks + run: if [ $(find artifact2 -type l | wc -l) != 0 ]; then echo "Symlinks found"; exit 1; fi + shell: bash diff --git a/README.md b/README.md index 76a6330..b24037f 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ jobs: | `name` | `false` | `github-pages` | Artifact name | | `path` | `true` | `_site/` | Path of the directory containing the static assets | | `retention-days` | `false` | `1` | Duration after which artifact will expire in days | +| `include-hidden-files` | `false` | `false` | Include hidden files and directories (those starting with a dot) in the artifact. Excludes `.git` and `.github` regardless. | ### Outputs 📤 diff --git a/action.yml b/action.yml index 35eb538..7afb508 100644 --- a/action.yml +++ b/action.yml @@ -14,6 +14,10 @@ inputs: description: "Duration after which artifact will expire in days." required: false default: "1" + include-hidden-files: + description: "Include hidden files and directories (those starting with a dot) in the artifact. Excludes .git and .github regardless." + required: false + default: "false" outputs: artifact_id: description: "The ID of the artifact that was uploaded." @@ -32,7 +36,7 @@ runs: -cvf "$RUNNER_TEMP/artifact.tar" \ --exclude=.git \ --exclude=.github \ - --exclude=".[^/]*" \ + ${{ inputs.include-hidden-files != 'true' && '--exclude=.[^/]*' || '' }} \ . echo ::endgroup:: env: @@ -50,7 +54,7 @@ runs: -cvf "$RUNNER_TEMP/artifact.tar" \ --exclude=.git \ --exclude=.github \ - --exclude=".[^/]*" \ + ${{ inputs.include-hidden-files != 'true' && '--exclude=.[^/]*' || '' }} \ . echo ::endgroup:: env: @@ -68,7 +72,7 @@ runs: -cvf "$RUNNER_TEMP\artifact.tar" \ --exclude=.git \ --exclude=.github \ - --exclude=".[^/]*" \ + ${{ inputs.include-hidden-files != 'true' && '--exclude=.[^/]*' || '' }} \ --force-local \ "." echo ::endgroup::