Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add in-source to in-wiki link transformer for v5 #73

Merged
merged 1 commit into from
Jul 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
*.sh eol=lf
cliw eol=lf
cli.ts eol=lf
2 changes: 2 additions & 0 deletions .github/workflows/test-action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ on:
branches: "master"
paths-ignore:
- .gitignore
- .gitattributes
- LICENSE
- README.md
- .github/**
- "!.github/workflows/test-action.yml"
pull_request:
paths-ignore:
- .gitignore
- .gitattributes
- LICENSE
- README.md
- .github/**
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# https://github.com/jcbhmr/deno_wrapper
.deno
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"deno.enable": true
}
44 changes: 21 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,11 @@ is specific to GitHub wikis.
not push to the remote wiki. The default is `false`. This is useful for
testing.

- **`preprocess`:** If this option is true, we will preprocess the wiki to move
the `README.md` to `Home.md` as well as rewriting all `.md` links to be bare
links. This helps ensure that the Markdown works in source control as well as
the wiki. The default is true.

#### `strategy:` input

There are some specific usecases where using `strategy: init` might be better
Expand All @@ -133,28 +138,6 @@ than the default `strategy: clone`.
tab. This is essentially the concatenation of `${{ github.server_url }}`,
`${{ github.repository }}`, and the `/wiki` page.

### Preprocessing

You may wish to strip the `[link](page.md)` `.md` suffix from your links to make
them viewable in GitHub source view (with the `.md`) _as well as_ in GitHub wiki
(without the `.md`; pretty URLs!). You can use a preprocessing action like
[Strip MarkDown extensions from links action] to remove those `.md` suffixes
before using this action. Here's an example:

```yml
publish-wiki:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: impresscms-dev/[email protected]
with:
path: wiki
- uses: Andrew-Chen-Wang/github-wiki-action@v4
```

❤️ If you have an awesome preprocessor action that you want to add here, let us
know! We'd love to add an example.

### Cross-repo wikis

You _can_ use this action to deploy your octocat/mega-docs repository to the
Expand Down Expand Up @@ -189,9 +172,24 @@ jobs:
path: .
```

## Development

![Deno](https://img.shields.io/static/v1?style=for-the-badge&message=Deno&color=000000&logo=Deno&logoColor=FFFFFF&label=)
![GitHub Actions](https://img.shields.io/static/v1?style=for-the-badge&message=GitHub+Actions&color=2088FF&logo=GitHub+Actions&logoColor=FFFFFF&label=)

This GitHub Action uses a self-downloaded version of Deno. See `cliw` for the
`cli.ts` wrapper script that downloads the Deno binary and runs the TypeScript
code. The main script itself is ~100 lines of code, so it's not too bad.

ℹ Because the version of Deno is _pinned_, it's recommended to every-so-often
bump it to the latest version.

To test the action, open a PR! The `test-action.yml` workflow will run the code
with `dry-run: true` as well as a real run! Yes, this does get tedious swapping
between your IDE and the PR, but it's the easiest way to test the action.

<!-- prettier-ignore-start -->
[Decathlon/wiki-page-creator-action#11]: https://github.com/Decathlon/wiki-page-creator-action/issues/11
[supported markup languages]: https://github.com/github/markup#markups
[Strip MarkDown extensions from links action]: https://github.com/marketplace/actions/strip-markdown-extensions-from-links-action
[PAT]: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token
<!-- prettier-ignore-end -->
11 changes: 10 additions & 1 deletion action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ inputs:
push to the remote wiki. The default is false. This is useful for testing.
required: true
default: false
preprocess:
description: >-
If this option is true, we will preprocess the wiki to move the README.md
to Home.md as well as rewriting all .md links to be bare links. This helps
ensure that the Markdown works in source control as well as the wiki. The
default is true.
required: true
default: true
outputs:
wiki_url:
description: >-
Expand All @@ -74,7 +82,7 @@ runs:
using: composite
steps:
- id: main
run: '"${GITHUB_ACTION_PATH%/}/src/$INPUT_STRATEGY.sh"'
run: '"${GITHUB_ACTION_PATH%/}/cliw"'
shell: bash
env:
INPUT_STRATEGY: ${{ inputs.strategy }}
Expand All @@ -85,3 +93,4 @@ runs:
INPUT_COMMIT_MESSAGE: ${{ inputs.commit-message }}
INPUT_IGNORE: ${{ inputs.ignore }}
INPUT_DRY_RUN: ${{ inputs.dry-run }}
INPUT_PREPROCESS: ${{ inputs.preprocess }}
101 changes: 101 additions & 0 deletions cli.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#!/usr/bin/env -S deno run -Aq
// Copyright 2023 Jacob Hummer
// SPDX-License-Identifier: Apache-2.0
import process from "node:process";
import {
readFile,
writeFile,
appendFile,
readdir,
rename,
} from "node:fs/promises";
import { existsSync } from "node:fs";
import { copy } from "npm:fs-extra@^11.1.1";
import * as core from "npm:@actions/core@^1.10.0";
import { temporaryDirectory } from "npm:tempy@^3.1.0";
import { $ } from "npm:zx@^7.2.2";
import { remark } from "npm:remark@^14.0.3";
import { visit } from "npm:unist-util-visit@^5.0.0";
import { resolve } from "node:path";

core.startGroup("process.env");
console.table(process.env);
core.endGroup();

const serverURL = core.getInput("github_server_url");
const repo = core.getInput("repository");
const wikiGitURL = `${serverURL}/${repo}.wiki.git`;
const workspacePath = process.cwd();
const d = temporaryDirectory();
process.chdir(d);
$.cwd = d;

process.env.GH_TOKEN = core.getInput("token");
process.env.GH_HOST = new URL(core.getInput("github_server_url")).host;
await $`gh auth setup-git`;

if (core.getInput("strategy") === "clone") {
await $`git config --global --add safe.directory ${process.cwd()}`;
await $`git clone ${wikiGitURL} .`;
} else if (core.getInput("strategy") === "init") {
await $`git init -b master`;
await $`git remote add origin ${wikiGitURL}`;
await $`git fetch`;
} else {
throw new DOMException("Unknown strategy", "NotSupportedError");
}

// https://github.com/stefanzweifel/git-auto-commit-action/blob/master/action.yml#L35-L42
await $`git config user.name github-actions[bot]`;
await $`git config user.email 41898282+github-actions[bot]@users.noreply.github.com`;

await appendFile(".git/info/exclude", core.getInput("ignore"));
await copy(resolve(workspacePath, core.getInput("path")), process.cwd());

if (core.getBooleanInput("preprocess")) {
// https://github.com/nodejs/node/issues/39960
if (existsSync("README.md")) {
await rename("README.md", "Home.md");
console.log("Moved README.md to Home.md");
}

const mdRe = /\.(?:md|markdown|mdown|mkdn|mkd|mdwn|mkdown|ron)$/;
const plugin = () => (tree: any) =>
visit(tree, ["link", "linkReference"], (node: any) => {
if (!mdRe.test(node.url)) {
return;
}
if (!new URL(node.url, "file:///-/").href.startsWith("file:///-/")) {
return;
}

const x = node.url;
node.url = node.url.replace(mdRe, "");
if (new URL(node.url, "file:///-/").href === "file:///-/README") {
node.url = "Home";
}

console.log(`Rewrote ${x} to ${node.url}`);
});
for (const file of await readdir($.cwd!)) {
if (!mdRe.test(file)) {
continue;
}

let md = await readFile(file, "utf-8");
md = (await remark().use(plugin).process(md)).toString();
await writeFile(file, md);
}
}

await $`git add -Av`;
await $`git commit --allow-empty -m ${core.getInput("commit_message")}`;

if (core.getBooleanInput("dry_run")) {
await $`git show`;
await $`git push -f origin master --dry-run`;
} else {
await $`git push -f origin master`;
}

core.setOutput("wiki_url", `${serverURL}/${repo}/wiki`);
32 changes: 32 additions & 0 deletions cliw
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/sh
# Copyright 2023 Jacob Hummer
# SPDX-License-Identifier: Apache-2.0
# Based on https://github.com/jcbhmr/deno_wrapper
set -e
# https://stackoverflow.com/a/29835459
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
deno_dir="$script_dir/.deno"

# https://manpages.ubuntu.com/manpages/kinetic/en/man1/chronic.1.html
chronic() (
set +e
output=$($@ 2>&1)
exit_code=$?
set -e
if [ "$exit_code" -ne 0 ]; then
echo "$output" >&2
fi
return "$exit_code"
)

if [ ! -d "$deno_dir" ]; then
# https://github.com/denoland/deno_install#readme
export DENO_INSTALL=$deno_dir
curl -fsSL https://deno.land/x/install/install.sh | chronic sh -s "v1.35.1"
fi

# https://github.com/denoland/deno_install/blob/master/install.sh#L53
export DENO_INSTALL=$deno_dir
export PATH="$DENO_INSTALL/bin:$PATH"

exec "$script_dir/cli.ts" "$@"
40 changes: 0 additions & 40 deletions src/clone.sh

This file was deleted.

40 changes: 0 additions & 40 deletions src/init.sh

This file was deleted.