first commit
This commit is contained in:
commit
5d43a218cc
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
170
README.md
Normal file
170
README.md
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
# Autoversion-action
|
||||||
|
|
||||||
|
This action will detect new version.
|
||||||
|
|
||||||
|
### Tagging: Part of a Complete Deployment Solution
|
||||||
|
This action works well in combination with:
|
||||||
|
|
||||||
|
- [actions/create-release](https://github.com/actions/create-release) (Auto-release)
|
||||||
|
- [author/action-publish](https://github.com/author/action-publish) (Auto-publish JavaScript/Node modules)
|
||||||
|
- [author/action-rollback](https://github.com/author/action-rollback) (Auto-rollback releases on failures)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
The following is an example `.gitea/workflows/main.yml` that will execute when a `push` to the `master` branch occurs.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: Detect Tag
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: butlerlogic/action-autotag@stable
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: "${{ secrets.GITEA_TOKEN }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
To make this work, the workflow must have the checkout action _before_ the autotag action.
|
||||||
|
|
||||||
|
This **order** is important!
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: butlerlogic/action-autotag@stable
|
||||||
|
```
|
||||||
|
|
||||||
|
**If the repository is not checked out first, the autotagger cannot find the source files.**
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
The `GITEA_TOKEN` **must** be provided. Without this, it is not possible to create a new tag. Make sure the autotag action looks like the following example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: butlerlogic/action-autotag@stable
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: "${{ secrets.GITEA_TOKEN }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
The action will automatically extract the token at runtime. **DO NOT MANUALLY ENTER YOUR TOKEN.** If you put the actual token in your workflow file, you'll make it accessible (in plaintext) to anyone who ever views the repository (it will be in your git history).
|
||||||
|
|
||||||
|
## Optional Configuration Options
|
||||||
|
|
||||||
|
There are several options to customize how the tag is created.
|
||||||
|
|
||||||
|
### root
|
||||||
|
|
||||||
|
Depending on the selected strategy, autotagger will look for the confgured identify file (i.e. `package.json`, `composer.json`, `Dockerfile`, etc) in the project root. If the file is located in a subdirectory, this option can be used to point to the correct file.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: butlerlogic/action-autotag@1.0.0
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: "${{ secrets.GITEA_TOKEN }}"
|
||||||
|
with:
|
||||||
|
strategy: regex # Optional since regex_pattern is defined
|
||||||
|
root: "/path/to/subdirectory/my.file"
|
||||||
|
regex_pattern: "version=([0-9\.])"
|
||||||
|
```
|
||||||
|
|
||||||
|
The version will be extracted by scanning the content of `/path/to/subdirectory/my.file` for a string like `version=1.0.0`. See the `regex_pattern` option for more details.
|
||||||
|
|
||||||
|
### regex_pattern
|
||||||
|
|
||||||
|
An optional attribute containing the regular expression used to extract the version number.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: butlerlogic/action-autotag@1.0.0
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: "${{ secrets.GITEA_TOKEN }}"
|
||||||
|
with:
|
||||||
|
regex_pattern: "version=([0-9\.]{5}([-\+][\w\.0-9]+)?)"
|
||||||
|
```
|
||||||
|
|
||||||
|
This attribute is used as the first argument of a [RegExp](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp) object. The first "group" (i.e. what's in the main set of parenthesis/the whole version number) will be used as the version number. For an example, see this [working example](https://regexr.com/51r8j).
|
||||||
|
|
||||||
|
The pattern described in this example is a simplistic one. If you need a more explicit one the [complete semver pattern](https://regex101.com/r/vkijKf/1/) is:
|
||||||
|
|
||||||
|
```
|
||||||
|
^((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)$
|
||||||
|
```
|
||||||
|
|
||||||
|
As of `1.1.2`, JavaScript named patterns are supported, where the group named `version` will be used to populate the tag. For example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: butlerlogic/action-autotag@1.0.0
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: "${{ secrets.GITEA_TOKEN }}"
|
||||||
|
with:
|
||||||
|
regex_pattern: "(version=)(?<version>[\d+\.]{3}([-\+][\w\.0-9]+)?)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### tag_prefix
|
||||||
|
|
||||||
|
By default, [semantic versioning](https://semver.org/) is used, such as `1.0.0`. A prefix can be used to add text before the tag name. For example, if `tag_prefix` is set to `v`, then the tag would be labeled as `v1.0.0`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: butlerlogic/action-autotag@1.0.0
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: "${{ secrets.GITEA_TOKEN }}"
|
||||||
|
with:
|
||||||
|
tag_prefix: "v"
|
||||||
|
```
|
||||||
|
|
||||||
|
### tag_message
|
||||||
|
|
||||||
|
This is the annotated commit message associated with the tag. By default, a changelog will be generated from the commits between the latest tag and the current reference (HEAD). Setting this option will override the message.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: butlerlogic/action-autotag@1.0.0
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: "${{ secrets.GITEA_TOKEN }}"
|
||||||
|
with:
|
||||||
|
tag_message: "Custom message goes here."
|
||||||
|
```
|
||||||
|
|
||||||
|
### commit_message_template
|
||||||
|
|
||||||
|
By default, a changelog is generated, containing the commit messages since the last release. The message is generated by applying a commit message template to each commit's data attributes.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: butlerlogic/action-autotag@1.0.0
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: "${{ secrets.GITEA_TOKEN }}"
|
||||||
|
with:
|
||||||
|
commit_message_template: "({{sha}} by {{author}}) {{message}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
Optional data points:
|
||||||
|
|
||||||
|
1. `number` The commit number (relevant to the overall list)
|
||||||
|
1. `message` The commit message.
|
||||||
|
1. `author` The author of the commit.
|
||||||
|
1. `sha` The SHA value representing the commit.
|
||||||
|
|
||||||
|
The default is `{{number}}) {{message}} ({{author}})\nSHA: {{sha}}\n`.
|
||||||
|
|
||||||
|
_Example output:_
|
||||||
|
|
||||||
|
```
|
||||||
|
1) Update README.md (coreybutler)
|
||||||
|
(SHA: c5e09fc45106a4b27b8f4598fb79811b589a4684)
|
||||||
|
|
||||||
|
2) Added metadoc capability to introspect the shell/commands. (coreybutler)
|
||||||
|
(SHA: b690be366a5636d51b1245a1b39c86102ddb8a81)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Developer Notes
|
||||||
|
|
||||||
|
If you are building an action that runs after this one, be aware this action produces several [outputs](https://help.github.com/en/articles/metadata-syntax-for-github-actions#outputs):
|
||||||
|
|
||||||
|
1. `tagname` will be empty if no tag was created, or it will be the value of the new tag.
|
||||||
|
1. `tagcreated`: `yes` or `no`.
|
||||||
|
1. `version` will be the extracted/provided version.
|
||||||
|
|
||||||
|
---
|
32
action.yml
Normal file
32
action.yml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
name: "autoversion"
|
||||||
|
description: "Automatically detect new tags for new versions"
|
||||||
|
author: "Al Azhar"
|
||||||
|
branding:
|
||||||
|
icon: "tag"
|
||||||
|
color: "blue"
|
||||||
|
inputs:
|
||||||
|
filepath:
|
||||||
|
description: Autotag will look for the appropriate file in in this location (relative to project root).
|
||||||
|
required: true
|
||||||
|
default: './'
|
||||||
|
regex_pattern:
|
||||||
|
description: An optional attribute containing the regular expression used to extract the version number.
|
||||||
|
required: true
|
||||||
|
tag_prefix:
|
||||||
|
description: By default, package.json uses semantic versioning, such as "1.0.0". A prefix can be used to add text before the tag name. For example, if tag_prefx is set to "v", then the tag would be labeled as "v1.0.0".
|
||||||
|
required: false
|
||||||
|
log_template:
|
||||||
|
description: "The commit message template (per commit). Default is `{{number}}) {{message}} ({{author}})\nSHA: {{sha}}\n`"
|
||||||
|
required: false
|
||||||
|
outputs:
|
||||||
|
tagname:
|
||||||
|
description: Returns the new tag value. Empty if a tag is not created.
|
||||||
|
changelog:
|
||||||
|
description: Returns list commit message from previous commit.
|
||||||
|
version:
|
||||||
|
description: The version, as defined in package.json or explicitly set in the input.
|
||||||
|
prerelease:
|
||||||
|
description: Is the new version prerelease.
|
||||||
|
runs:
|
||||||
|
using: "node20"
|
||||||
|
main: "dist/index.js"
|
35777
dist/index.js
vendored
Normal file
35777
dist/index.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
dist/package.json
vendored
Normal file
3
dist/package.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"type": "module"
|
||||||
|
}
|
98
package-lock.json
generated
Normal file
98
package-lock.json
generated
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
{
|
||||||
|
"name": "autoversion",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"name": "autoversion",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@actions/core": "^1.10.0",
|
||||||
|
"gitea-js": "1.22.0",
|
||||||
|
"semver": "^7.3.8"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@vercel/ncc": "^0.38.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@actions/core": {
|
||||||
|
"version": "1.10.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz",
|
||||||
|
"integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==",
|
||||||
|
"dependencies": {
|
||||||
|
"@actions/http-client": "^2.0.1",
|
||||||
|
"uuid": "^8.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@actions/http-client": {
|
||||||
|
"version": "2.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.1.tgz",
|
||||||
|
"integrity": "sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==",
|
||||||
|
"dependencies": {
|
||||||
|
"tunnel": "^0.0.6",
|
||||||
|
"undici": "^5.25.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@fastify/busboy": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@vercel/ncc": {
|
||||||
|
"version": "0.38.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.1.tgz",
|
||||||
|
"integrity": "sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==",
|
||||||
|
"dev": true,
|
||||||
|
"bin": {
|
||||||
|
"ncc": "dist/ncc/cli.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/gitea-js": {
|
||||||
|
"version": "1.22.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/gitea-js/-/gitea-js-1.22.0.tgz",
|
||||||
|
"integrity": "sha512-vG3yNU2NKX7vbsqHH5U3q0u3OmWWh3c4nvyWtx022jQEDJDZP47EoGurXCmOhzvD5AwgUV6r+lVAz+Fa1dazgg=="
|
||||||
|
},
|
||||||
|
"node_modules/semver": {
|
||||||
|
"version": "7.6.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
|
||||||
|
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
|
||||||
|
"bin": {
|
||||||
|
"semver": "bin/semver.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tunnel": {
|
||||||
|
"version": "0.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
||||||
|
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/undici": {
|
||||||
|
"version": "5.28.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
|
||||||
|
"integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
|
||||||
|
"dependencies": {
|
||||||
|
"@fastify/busboy": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/uuid": {
|
||||||
|
"version": "8.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||||
|
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||||
|
"bin": {
|
||||||
|
"uuid": "dist/bin/uuid"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
package.json
Normal file
25
package.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "autoversion",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Automatically create a tag whenever the version changes in file version",
|
||||||
|
"main": "main.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node ./src/main.js",
|
||||||
|
"package": "ncc build ./src/main.js -o dist"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"actions",
|
||||||
|
"node",
|
||||||
|
"setup"
|
||||||
|
],
|
||||||
|
"author": "Al Azhar",
|
||||||
|
"type": "module",
|
||||||
|
"dependencies": {
|
||||||
|
"@actions/core": "^1.10.0",
|
||||||
|
"semver": "^7.3.8",
|
||||||
|
"gitea-js": "1.22.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@vercel/ncc": "^0.38.1"
|
||||||
|
}
|
||||||
|
}
|
36
src/lib/regex.js
Normal file
36
src/lib/regex.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { existsSync, statSync, readFileSync } from 'fs'
|
||||||
|
import { resolve } from 'path'
|
||||||
|
|
||||||
|
export default class Regex {
|
||||||
|
constructor (root = './', pattern) {
|
||||||
|
root = resolve(root)
|
||||||
|
|
||||||
|
if (statSync(root).isDirectory()) {
|
||||||
|
throw new Error(`${root} is a directory. The Regex tag identification strategy requires a file.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!existsSync(root)) {
|
||||||
|
throw new Error(`"${root}" does not exist.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.content = readFileSync(root).toString()
|
||||||
|
|
||||||
|
let content = pattern.exec(this.content)
|
||||||
|
if (!content) {
|
||||||
|
this._version = null
|
||||||
|
// throw new Error(`Could not find pattern matching "${pattern.toString()}" in "${root}".`)
|
||||||
|
} else if (content.groups && content.groups.version) {
|
||||||
|
this._version = content.groups.version
|
||||||
|
} else {
|
||||||
|
this._version = content[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get version () {
|
||||||
|
return this._version
|
||||||
|
}
|
||||||
|
|
||||||
|
get versionFound () {
|
||||||
|
return this._version !== null
|
||||||
|
}
|
||||||
|
}
|
34
src/lib/setup.js
Normal file
34
src/lib/setup.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import core from '@actions/core'
|
||||||
|
import { readdirSync } from 'fs'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
|
export default class Setup {
|
||||||
|
static debug () {
|
||||||
|
// Metadate for debugging
|
||||||
|
// core.debug(
|
||||||
|
// ` Available environment variables:\n -> ${Object.keys(process.env)
|
||||||
|
// .map(i => i + ' :: ' + process.env[i])
|
||||||
|
// .join('\n -> ')}`
|
||||||
|
// )
|
||||||
|
|
||||||
|
const dir = readdirSync(path.resolve(process.env.GITHUB_WORKSPACE), { withFileTypes: true })
|
||||||
|
.map(entry => {
|
||||||
|
return `${entry.isDirectory() ? '> ' : ' - '}${entry.name}`
|
||||||
|
})
|
||||||
|
.join('\n')
|
||||||
|
|
||||||
|
console.log({dir})
|
||||||
|
|
||||||
|
core.debug(` Working Directory: ${process.env.GITHUB_WORKSPACE}:\n${dir}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
static requireAnyEnv () {
|
||||||
|
for (const arg of arguments) {
|
||||||
|
if (!process.env.hasOwnProperty(arg)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('At least one of the following environment variables is required: ' + Array.slice(arguments).join(', '))
|
||||||
|
}
|
||||||
|
}
|
109
src/lib/tag.js
Normal file
109
src/lib/tag.js
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
import core from '@actions/core'
|
||||||
|
import os from 'os'
|
||||||
|
import { giteaApi } from 'gitea-js'
|
||||||
|
|
||||||
|
const gitea = giteaApi(process.env.GITEA_URL, {
|
||||||
|
token: process.env.GITEA_TOKEN, // generate one at https://gitea.example.com/user/settings/applications
|
||||||
|
customFetch: fetch,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get owner and repo from context of payload that triggered the action
|
||||||
|
const [ owner, repo ] = process.env.GITHUB_REPOSITORY.split('/')
|
||||||
|
|
||||||
|
export default class Tag {
|
||||||
|
constructor (prefix, version) {
|
||||||
|
this.prefix = prefix
|
||||||
|
this.version = version
|
||||||
|
this._tags = null
|
||||||
|
this._exists = null
|
||||||
|
}
|
||||||
|
|
||||||
|
get name () {
|
||||||
|
return `${this.prefix.trim()}${this.version.trim()}`
|
||||||
|
}
|
||||||
|
|
||||||
|
get message() {
|
||||||
|
return (async () => {
|
||||||
|
try {
|
||||||
|
let tags = await this.getTags()
|
||||||
|
|
||||||
|
if (tags.length === 0) {
|
||||||
|
return `Version ${this.version}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const changelog = await gitea.repos.repoCompareDiff(owner, repo, tags.shift().name + "..." + process.env.GITHUB_REF_NAME ?? 'main' )
|
||||||
|
|
||||||
|
const tpl = (core.getInput('log_template', { required: false }) || '').trim()
|
||||||
|
|
||||||
|
return changelog.data.commits
|
||||||
|
.map(
|
||||||
|
(commit, i) => {
|
||||||
|
if (tpl.length > 0) {
|
||||||
|
return tpl
|
||||||
|
.replace(/\{\{\s?(number)\s?\}\}/gi, i + 1)
|
||||||
|
.replace(/\{\{\s?(message)\s?\}\}/gi, commit.commit.message)
|
||||||
|
.replace(/\{\{\s?(author)\s?\}\}/gi, commit.hasOwnProperty('author') ? (commit.author.hasOwnProperty('login') ? commit.author.login : '') : '')
|
||||||
|
.replace(/\{\{\s?(sha)\s?\}\}/gi, commit.sha)
|
||||||
|
.trim() + '\n'
|
||||||
|
} else {
|
||||||
|
return `${i === 0 ? '\n' : ''}${i + 1}) ${commit.commit.message}${
|
||||||
|
commit.hasOwnProperty('author')
|
||||||
|
? commit.author.hasOwnProperty('login')
|
||||||
|
? ' (' + commit.author.login + ')'
|
||||||
|
: ''
|
||||||
|
: ''
|
||||||
|
}\n(SHA: ${commit.sha})\n`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.join('\n')
|
||||||
|
} catch (e) {
|
||||||
|
core.warning('Failed to generate changelog from commits: ' + e.message + os.EOL)
|
||||||
|
return `Version ${this.version}`
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
get prerelease () {
|
||||||
|
return /([0-9\.]{5}(-[\w\.0-9]+)?)/i.test(this.version)
|
||||||
|
}
|
||||||
|
|
||||||
|
get previous () {
|
||||||
|
return (async () => {
|
||||||
|
try {
|
||||||
|
const tags = await this.getTags()
|
||||||
|
|
||||||
|
return tags.shift().name;
|
||||||
|
} catch(e) {
|
||||||
|
return "0.0.0";
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
async getTags () {
|
||||||
|
if (this._tags !== null) {
|
||||||
|
return this._tags.data
|
||||||
|
}
|
||||||
|
|
||||||
|
this._tags = await gitea.repos.repoListTags(owner, repo)
|
||||||
|
|
||||||
|
return this._tags.data
|
||||||
|
}
|
||||||
|
|
||||||
|
async exists () {
|
||||||
|
if (this._exists !== null) {
|
||||||
|
return this._exists
|
||||||
|
}
|
||||||
|
const currentTag = this.name
|
||||||
|
const tags = await this.getTags()
|
||||||
|
|
||||||
|
for (const tag of tags) {
|
||||||
|
if (tag.name === currentTag) {
|
||||||
|
this._exists = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._exists = false
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
85
src/main.js
Normal file
85
src/main.js
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import * as core from '@actions/core'
|
||||||
|
import os from 'os'
|
||||||
|
import semver from 'semver'
|
||||||
|
import Setup from './lib/setup.js'
|
||||||
|
import Tag from './lib/tag.js'
|
||||||
|
import Regex from './lib/regex.js'
|
||||||
|
|
||||||
|
async function run () {
|
||||||
|
try {
|
||||||
|
Setup.debug()
|
||||||
|
Setup.requireAnyEnv('GITEA_TOKEN', 'INPUT_GITEA_TOKEN')
|
||||||
|
|
||||||
|
// Identify the root directory to use for auto-identifying a tag version
|
||||||
|
const filepath = core.getInput('filepath', { required: true })
|
||||||
|
|
||||||
|
// Retrieve the Regex pattern
|
||||||
|
const pattern = core.getInput('regex_pattern', { required: true })
|
||||||
|
|
||||||
|
core.info(`filepath : ${ filepath }`)
|
||||||
|
core.info(`regex_pattern : ${ pattern }`)
|
||||||
|
|
||||||
|
// Extract the version number using the supplied Regex
|
||||||
|
let version = (new Regex(filepath, new RegExp(pattern, 'gim'))).version
|
||||||
|
|
||||||
|
if (!version) {
|
||||||
|
throw new Error(`No version identified extraction with the /${ pattern }/gim pattern.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
core.info(`version ${ version } detected`)
|
||||||
|
|
||||||
|
const [major, minor, patch, pre] = version.split(".")
|
||||||
|
version = `${major}.${minor}.${patch}${pre ? "-beta." + pre : ""}`
|
||||||
|
|
||||||
|
core.info(`version translated to ${ version }`)
|
||||||
|
|
||||||
|
// Configure a tag using the identified version
|
||||||
|
const tag = new Tag(
|
||||||
|
core.getInput('tag_prefix', { required: false }),
|
||||||
|
version
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get min
|
||||||
|
const minVersion = await tag.previous
|
||||||
|
|
||||||
|
core.info(`Previous version ${ minVersion }`)
|
||||||
|
|
||||||
|
// Ensure that version and minVersion are valid SemVer strings
|
||||||
|
const versionSemVer = semver.coerce(version, { includePrerelease: pre})
|
||||||
|
const minVersionSemVer = semver.coerce(minVersion , { includePrerelease: pre})
|
||||||
|
|
||||||
|
if (!minVersionSemVer) {
|
||||||
|
core.info(`Skipping min version check. ${minVersion} is not valid SemVer`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!versionSemVer) {
|
||||||
|
core.info(`Skipping min version check. ${version} is not valid SemVer`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minVersionSemVer && versionSemVer && semver.lt(versionSemVer, minVersionSemVer)) {
|
||||||
|
core.info(`Version "${version}" is lower than minimum "${minVersion}"`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
core.notice(`Recognized "${version}"`)
|
||||||
|
core.setOutput('version', version)
|
||||||
|
core.debug(` Detected version ${version}`)
|
||||||
|
|
||||||
|
// Check for existance of tag and abort (short circuit) if it already exists.
|
||||||
|
if (await tag.exists()) {
|
||||||
|
core.warning(`"${tag.name}" tag already exists.` + os.EOL)
|
||||||
|
core.setOutput('tagname', '')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// The tag setter will autocorrect the message if necessary.
|
||||||
|
core.setOutput('changelog', await tag.message)
|
||||||
|
core.setOutput('prerelease', tag.prerelease ? 'yes' : 'no')
|
||||||
|
core.setOutput('tagname', tag.name)
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(error.message + '\n' + error.stack)
|
||||||
|
core.setOutput('tagname', '')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run()
|
8
src/package.json
Normal file
8
src/package.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "autoversion",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "main.js",
|
||||||
|
"author": "Al Azhar",
|
||||||
|
"type": "module"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user