Skip to content

Commit

Permalink
Merge pull request #68 from Andrew-Chen-Wang/in-source-to-in-wiki-links
Browse files Browse the repository at this point in the history
Add in-source to in-wiki link transformer
  • Loading branch information
jcbhmr authored Jul 16, 2023
2 parents 02bdea5 + e17592a commit 6581fc5
Show file tree
Hide file tree
Showing 10 changed files with 173 additions and 105 deletions.
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 @@ -64,6 +64,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 @@ -75,7 +83,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 @@ -86,3 +94,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.

0 comments on commit 6581fc5

Please sign in to comment.