4 Commits

3 changed files with 59 additions and 21 deletions

View File

@@ -30,6 +30,13 @@ jobs:
Minimal tool to create and publish Git release tags following the vX.Y.Z format. Minimal tool to create and publish Git release tags following the vX.Y.Z format.
```bash
# Quick install
mkdir -p ${HOME}/.local/bin
wget -qO ${HOME}/.local/bin/git-release https://github.com/ObNitram/git-release/releases/download/${{ steps.version.outputs.version }}/git-release
chmod +x ${HOME}/.local/bin/git-release
```
See the [README](https://github.com/${{ github.repository }}/blob/${{ steps.version.outputs.version }}/README.md) for more details. See the [README](https://github.com/${{ github.repository }}/blob/${{ steps.version.outputs.version }}/README.md) for more details.
files: | files: |
git-release git-release

View File

@@ -2,19 +2,24 @@
Minimal tool to create and publish Git release tags following the vX.Y.Z format. Minimal tool to create and publish Git release tags following the vX.Y.Z format.
```bash
# Quick install
mkdir -p ${HOME}/.local/bin
wget -qO ${HOME}/.local/bin/git-release https://github.com/ObNitram/git-release/releases/latest/download/git-release
chmod +x ${HOME}/.local/bin/git-release
```
## Usage ## Usage
**Single project (default):** - From the repository root: `git release`
- From the repository root: `./git-release` or `git release` - Select release type: patch, minor, major, or cancel
- Creates tags in the format `vX.Y.Z` - Confirm the new version
- The script creates and pushes the new tag
**Multi-project:** ### Multi-project support
- From the repository root: `./git-release <projectname>` or `git release <projectname>`
- Creates tags in the format `<projectname>-vX.Y.Z`
- Useful for monorepos with multiple independent release cycles
The script creates an annotated tag and pushes it to the configured remote.
For repositories with multiple projects (monorepos), you can specify the project name as an argument:
`git release <projectname>` will create a tag with the following format `<projectname>-vX.Y.Z`
## Example ## Example
``` ```
@@ -41,13 +46,27 @@ $ git release
``` ```
## Installation ## Installation
- Make the script executable: `chmod +x git-release` It's a single script file:
- (Optional) Create a hard link in your PATH : - Download the `git-release` script from the repository.
`ln "$(pwd)/git-release" "$HOME/.local/bin/git-release"` - Make it executable: `chmod +x git-release`
- Place it in your PATH
It relies on the fact that if git does not find a command, it will look for a script named `git-<command>` in your PATH.
So you can now run `git release` from any git repository.
You can use the following commands to install it:
```bash
mkdir -p ${HOME}/.local/bin
wget -qO ${HOME}/.local/bin/git-release https://github.com/ObNitram/git-release/releases/latest/download/git-release
chmod +x ${HOME}/.local/bin/git-release
```
## Dependencies ## Dependencies
- git - git
## License ## License
- MIT License
- See the repository `LICENSE` file. - See the repository `LICENSE` file.

View File

@@ -2,20 +2,29 @@
# git-release # git-release
# https://github.com/obnitram/git-release # https://github.com/obnitram/git-release
# ------------------------------------------------- # -------------------------------------------------
# Usage: git-release [<projectname>] # Usage: git-release [<projectname>] [-f]
# Accepts tags of the form vX.Y.Z or <projectname>-vX.Y.Z (no prerelease/build). # Accepts tags of the form vX.Y.Z or <projectname>-vX.Y.Z (no prerelease/build).
# Interactively bumps patch/minor/major, creates an annotated tag, # Interactively bumps patch/minor/major, creates an annotated tag,
# and pushes it to origin. # and pushes it to origin.
# #
# Requirements: # Requirements:
# - The last tag MUST match ^v[0-9]+\.[0-9]+\.[0-9]+$ or ^<projectname>-v[0-9]+\.[0-9]+\.[0-9]+$ (or none => starts from v0.0.0) # - The last tag MUST match ^v[0-9]+\.[0-9]+\.[0-9]+$ or ^<projectname>-v[0-9]+\.[0-9]+\.[0-9]+$ (or none => starts from v0.0.0)
# - Working tree must be clean. # - Working tree must be clean (unless -f is used).
set -euo pipefail set -euo pipefail
trap 'echo "❌ ${0##*/} failed at line $LINENO." >&2; exit 1' ERR trap 'echo "❌ ${0##*/} failed at line $LINENO." >&2; exit 1' ERR
# --- Parse optional project name argument --- # --- Parse arguments ---
PROJECT_NAME="${1:-}" FORCE_FLAG=false
PROJECT_NAME=""
for arg in "$@"; do
if [[ "$arg" == "-f" ]]; then
FORCE_FLAG=true
else
PROJECT_NAME="$arg"
fi
done
if [[ -n "$PROJECT_NAME" ]]; then if [[ -n "$PROJECT_NAME" ]]; then
TAG_PREFIX="${PROJECT_NAME}-v" TAG_PREFIX="${PROJECT_NAME}-v"
TAG_PATTERN="${PROJECT_NAME}-v[0-9]*.[0-9]*.[0-9]*" TAG_PATTERN="${PROJECT_NAME}-v[0-9]*.[0-9]*.[0-9]*"
@@ -31,11 +40,14 @@ fi
# --- Safety: ensure we are inside a Git repository --- # --- Safety: ensure we are inside a Git repository ---
git rev-parse --is-inside-work-tree >/dev/null 2>&1 git rev-parse --is-inside-work-tree >/dev/null 2>&1
# --- Safety: require a clean working tree --- # --- Safety: require a clean working tree (unless -f flag is used) ---
if [[ "$FORCE_FLAG" == false ]]; then
if ! git diff-index --quiet HEAD --; then if ! git diff-index --quiet HEAD --; then
echo "⚠️ Uncommitted changes detected. Please commit or stash before releasing." echo "⚠️ Uncommitted changes detected. Please commit or stash before releasing."
echo " Or use -f flag to force the release anyway."
exit 1 exit 1
fi fi
fi
# --- Get strictly matching tags and pick the highest (lexicographic by version) --- # --- Get strictly matching tags and pick the highest (lexicographic by version) ---
# Using Git's glob to only list matching pattern, then version-sort. # Using Git's glob to only list matching pattern, then version-sort.