Read-only mirror — the public repositories of the Forgejo instance, refreshed every 10 minutes. The live instance (fg.dieschoenewolke.de) is reachable only over the VPN; clone here with https://git.dieschoenewolke.de/git/<owner>/<repo>.git.
summaryrefslogtreecommitdiff
path: root/src/misc/generate-docs.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc/generate-docs.ts')
-rw-r--r--src/misc/generate-docs.ts102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/misc/generate-docs.ts b/src/misc/generate-docs.ts
new file mode 100644
index 0000000..c882c55
--- /dev/null
+++ b/src/misc/generate-docs.ts
@@ -0,0 +1,102 @@
+import * as fs from 'fs'
+import * as os from 'os'
+import * as path from 'path'
+import * as yaml from 'js-yaml'
+
+//
+// SUMMARY
+//
+// This script rebuilds the usage section in the README.md to be consistent with the action.yml
+
+function updateUsage(
+ actionReference: string,
+ actionYamlPath: string = 'action.yml',
+ readmePath: string = 'README.md',
+ startToken: string = '<!-- start usage -->',
+ endToken: string = '<!-- end usage -->'
+): void {
+ if (!actionReference) {
+ throw new Error('Parameter actionReference must not be empty')
+ }
+
+ // Load the action.yml
+ const actionYaml = yaml.safeLoad(fs.readFileSync(actionYamlPath).toString())
+
+ // Load the README
+ const originalReadme = fs.readFileSync(readmePath).toString()
+
+ // Find the start token
+ const startTokenIndex = originalReadme.indexOf(startToken)
+ if (startTokenIndex < 0) {
+ throw new Error(`Start token '${startToken}' not found`)
+ }
+
+ // Find the end token
+ const endTokenIndex = originalReadme.indexOf(endToken)
+ if (endTokenIndex < 0) {
+ throw new Error(`End token '${endToken}' not found`)
+ } else if (endTokenIndex < startTokenIndex) {
+ throw new Error('Start token must appear before end token')
+ }
+
+ // Build the new README
+ const newReadme: string[] = []
+
+ // Append the beginning
+ newReadme.push(originalReadme.substr(0, startTokenIndex + startToken.length))
+
+ // Build the new usage section
+ newReadme.push('```yaml', `- uses: ${actionReference}`, ' with:')
+ const inputs = actionYaml.inputs
+ let firstInput = true
+ for (const key of Object.keys(inputs)) {
+ const input = inputs[key]
+
+ // Line break between inputs
+ if (!firstInput) {
+ newReadme.push('')
+ }
+
+ // Constrain the width of the description
+ const width = 80
+ let description = input.description as string
+ while (description) {
+ // Longer than width? Find a space to break apart
+ let segment: string = description
+ if (description.length > width) {
+ segment = description.substr(0, width + 1)
+ while (!segment.endsWith(' ')) {
+ segment = segment.substr(0, segment.length - 1)
+ }
+ } else {
+ segment = description
+ }
+
+ description = description.substr(segment.length) // Remaining
+ segment = segment.trimRight() // Trim the trailing space
+ newReadme.push(` # ${segment}`)
+ }
+
+ // Input and default
+ if (input.default !== undefined) {
+ newReadme.push(` # Default: ${input.default}`)
+ }
+ newReadme.push(` ${key}: ''`)
+
+ firstInput = false
+ }
+
+ newReadme.push('```')
+
+ // Append the end
+ newReadme.push(originalReadme.substr(endTokenIndex))
+
+ // Write the new README
+ fs.writeFileSync(readmePath, newReadme.join(os.EOL))
+}
+
+updateUsage(
+ 'actions/checkout@preview',
+ path.join(__dirname, '..', '..', 'action.yml'),
+ path.join(__dirname, '..', '..', 'README.md')
+)