fix: string escape in

This commit is contained in:
eric
2026-03-04 05:47:20 +01:00
parent 0d418b6baa
commit fe3547edfc
4 changed files with 45 additions and 34 deletions

View File

@@ -36,6 +36,7 @@
extraShellHook ? "", extraShellHook ? "",
additionalHooks ? { }, additionalHooks ? { },
tools ? [ ], tools ? [ ],
includeStandardPackages ? true,
# tools = list of { name, bin, versionCmd, color? } # tools = list of { name, bin, versionCmd, color? }
# e.g. { name = "Bun"; bin = "${pkgs.bun}/bin/bun"; versionCmd = "--version"; color = "YELLOW"; } # e.g. { name = "Bun"; bin = "${pkgs.bun}/bin/bun"; versionCmd = "--version"; color = "YELLOW"; }
formatters ? { }, formatters ? { },
@@ -49,6 +50,13 @@
}: }:
let let
pkgs = import nixpkgs { inherit system; }; pkgs = import nixpkgs { inherit system; };
standardPackages = with pkgs; [
nixfmt
gitlint
gitleaks
shfmt
];
selectedStandardPackages = pkgs.lib.optionals includeStandardPackages standardPackages;
oxfmtEnabled = features.oxfmt or false; oxfmtEnabled = features.oxfmt or false;
oxfmtPackages = pkgs.lib.optionals oxfmtEnabled [ oxfmtPackages = pkgs.lib.optionals oxfmtEnabled [
@@ -106,7 +114,7 @@
formatter = treefmtEval.config.build.wrapper; formatter = treefmtEval.config.build.wrapper;
shell = pkgs.mkShell { shell = pkgs.mkShell {
packages = extraPackages ++ oxfmtPackages; packages = selectedStandardPackages ++ extraPackages ++ oxfmtPackages;
buildInputs = pre-commit-check.enabledPackages; buildInputs = pre-commit-check.enabledPackages;
@@ -114,7 +122,7 @@
${pre-commit-check.shellHook} ${pre-commit-check.shellHook}
if [ -t 1 ]; then if [ -t 1 ]; then
command -v tput >/dev/null 2>&1 && tput clear || printf '\033c' # command -v tput >/dev/null 2>&1 && tput clear || printf '\033c'
fi fi
GREEN='\033[1;32m' GREEN='\033[1;32m'
@@ -258,10 +266,6 @@
env = self.lib.mkDevShell { env = self.lib.mkDevShell {
inherit system; inherit system;
extraPackages = with pkgs; [ extraPackages = with pkgs; [
nixfmt-rfc-style
gitlint
gitleaks
shfmt
self.packages.${system}.release self.packages.${system}.release
]; ];
tools = [ tools = [

View File

@@ -16,14 +16,14 @@ usage() {
cmd="$(basename "$0")" cmd="$(basename "$0")"
printf '%s\n' \ printf '%s\n' \
"Usage:" \ "Usage:" \
" ${cmd} [major|minor|patch] [stable|${channelList}]" \ " ${cmd} [major|minor|patch] [stable|__CHANNEL_LIST__]" \
" ${cmd} set <version>" \ " ${cmd} set <version>" \
"" \ "" \
"Bump types:" \ "Bump types:" \
" (none) bump patch, keep current channel" \ " (none) bump patch, keep current channel" \
" major/minor/patch bump the given part, keep current channel" \ " major/minor/patch bump the given part, keep current channel" \
" stable / full remove prerelease suffix" \ " stable / full remove prerelease suffix" \
" ${channelList} switch channel (bumps prerelease number if same base+channel)" \ " __CHANNEL_LIST__ switch channel (bumps prerelease number if same base+channel)" \
"" \ "" \
"Examples:" \ "Examples:" \
" ${cmd} # patch bump on current channel" \ " ${cmd} # patch bump on current channel" \
@@ -64,9 +64,9 @@ parse_base_version() {
echo "Error: invalid base version '$v' (expected x.y.z)" >&2 echo "Error: invalid base version '$v' (expected x.y.z)" >&2
exit 1 exit 1
fi fi
MAJOR="''${BASH_REMATCH[1]}" MAJOR="${BASH_REMATCH[1]}"
MINOR="''${BASH_REMATCH[2]}" MINOR="${BASH_REMATCH[2]}"
PATCH="''${BASH_REMATCH[3]}" PATCH="${BASH_REMATCH[3]}"
} }
parse_full_version() { parse_full_version() {
@@ -75,11 +75,11 @@ parse_full_version() {
PRERELEASE_NUM="" PRERELEASE_NUM=""
if [[ $v =~ ^([0-9]+\.[0-9]+\.[0-9]+)-([a-zA-Z]+)\.([0-9]+)$ ]]; then if [[ $v =~ ^([0-9]+\.[0-9]+\.[0-9]+)-([a-zA-Z]+)\.([0-9]+)$ ]]; then
BASE_VERSION="''${BASH_REMATCH[1]}" BASE_VERSION="${BASH_REMATCH[1]}"
CHANNEL="''${BASH_REMATCH[2]}" CHANNEL="${BASH_REMATCH[2]}"
PRERELEASE_NUM="''${BASH_REMATCH[3]}" PRERELEASE_NUM="${BASH_REMATCH[3]}"
elif [[ $v =~ ^([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then elif [[ $v =~ ^([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then
BASE_VERSION="''${BASH_REMATCH[1]}" BASE_VERSION="${BASH_REMATCH[1]}"
else else
echo "Error: invalid version '$v' (expected x.y.z or x.y.z-channel.N)" >&2 echo "Error: invalid version '$v' (expected x.y.z or x.y.z-channel.N)" >&2
exit 1 exit 1
@@ -90,7 +90,7 @@ parse_full_version() {
validate_channel() { validate_channel() {
local ch="$1" local ch="$1"
[[ $ch == "stable" ]] && return 0 [[ $ch == "stable" ]] && return 0
local valid_channels="${channelList}" local valid_channels="__CHANNEL_LIST__"
for c in $valid_channels; do for c in $valid_channels; do
[[ $ch == "$c" ]] && return 0 [[ $ch == "$c" ]] && return 0
done done
@@ -106,14 +106,14 @@ version_cmp() {
local base1="" pre1="" base2="" pre2="" local base1="" pre1="" base2="" pre2=""
if [[ $v1 =~ ^([0-9]+\.[0-9]+\.[0-9]+)-(.+)$ ]]; then if [[ $v1 =~ ^([0-9]+\.[0-9]+\.[0-9]+)-(.+)$ ]]; then
base1="''${BASH_REMATCH[1]}" base1="${BASH_REMATCH[1]}"
pre1="''${BASH_REMATCH[2]}" pre1="${BASH_REMATCH[2]}"
else else
base1="$v1" base1="$v1"
fi fi
if [[ $v2 =~ ^([0-9]+\.[0-9]+\.[0-9]+)-(.+)$ ]]; then if [[ $v2 =~ ^([0-9]+\.[0-9]+\.[0-9]+)-(.+)$ ]]; then
base2="''${BASH_REMATCH[1]}" base2="${BASH_REMATCH[1]}"
pre2="''${BASH_REMATCH[2]}" pre2="${BASH_REMATCH[2]}"
else else
base2="$v2" base2="$v2"
fi fi
@@ -150,14 +150,14 @@ bump_base_version() {
exit 1 exit 1
;; ;;
esac esac
BASE_VERSION="''${MAJOR}.''${MINOR}.''${PATCH}" BASE_VERSION="${MAJOR}.${MINOR}.${PATCH}"
} }
compute_full_version() { compute_full_version() {
if [[ $CHANNEL == "stable" || -z $CHANNEL ]]; then if [[ $CHANNEL == "stable" || -z $CHANNEL ]]; then
FULL_VERSION="$BASE_VERSION" FULL_VERSION="$BASE_VERSION"
else else
FULL_VERSION="''${BASE_VERSION}-''${CHANNEL}.''${PRERELEASE_NUM:-1}" FULL_VERSION="${BASE_VERSION}-${CHANNEL}.${PRERELEASE_NUM:-1}"
fi fi
export BASE_VERSION CHANNEL PRERELEASE_NUM FULL_VERSION export BASE_VERSION CHANNEL PRERELEASE_NUM FULL_VERSION
} }
@@ -188,27 +188,31 @@ validate_commit_message() {
# ── version file generation ──────────────────────────────────────────────── # ── version file generation ────────────────────────────────────────────────
generate_version_files() { generate_version_files() {
${versionFilesScript} :
__VERSION_FILES__
} }
# ── user-provided hooks ──────────────────────────────────────────────────── # ── user-provided hooks ────────────────────────────────────────────────────
do_read_version() { do_read_version() {
${readVersion} :
__READ_VERSION__
} }
do_write_version() { do_write_version() {
${writeVersion} :
__WRITE_VERSION__
} }
do_post_version() { do_post_version() {
${postVersion} :
__POST_VERSION__
} }
# ── main ─────────────────────────────────────────────────────────────────── # ── main ───────────────────────────────────────────────────────────────────
main() { main() {
[[ ''${1-} == "-h" || ''${1-} == "--help" ]] && usage && exit 0 [[ ${1-} == "-h" || ${1-} == "--help" ]] && usage && exit 0
require_clean_git require_clean_git
START_HEAD="$(git rev-parse HEAD)" START_HEAD="$(git rev-parse HEAD)"
@@ -218,13 +222,13 @@ main() {
raw_version="$(do_read_version)" raw_version="$(do_read_version)"
parse_full_version "$raw_version" parse_full_version "$raw_version"
log "Current: base=$BASE_VERSION channel=$CHANNEL pre=''${PRERELEASE_NUM:-}" log "Current: base=$BASE_VERSION channel=$CHANNEL pre=${PRERELEASE_NUM:-}"
local action="''${1-}" local action="${1-}"
shift || true shift || true
if [[ $action == "set" ]]; then if [[ $action == "set" ]]; then
local newv="''${1-}" local newv="${1-}"
[[ -z $newv ]] && echo "Error: 'set' requires a version argument" >&2 && exit 1 [[ -z $newv ]] && echo "Error: 'set' requires a version argument" >&2 && exit 1
compute_full_version compute_full_version
local current_full="$FULL_VERSION" local current_full="$FULL_VERSION"
@@ -251,20 +255,20 @@ main() {
"") part="patch" ;; "") part="patch" ;;
major | minor | patch) major | minor | patch)
part="$action" part="$action"
target_channel="''${1-}" target_channel="${1-}"
;; ;;
stable | full) stable | full)
[[ -n ''${1-} ]] && echo "Error: '$action' takes no second argument" >&2 && usage && exit 1 [[ -n ${1-} ]] && echo "Error: '$action' takes no second argument" >&2 && usage && exit 1
target_channel="stable" target_channel="stable"
;; ;;
*) *)
# check if action is a valid channel # check if action is a valid channel
local is_channel=0 local is_channel=0
for c in ${channelList}; do for c in __CHANNEL_LIST__; do
[[ $action == "$c" ]] && is_channel=1 && break [[ $action == "$c" ]] && is_channel=1 && break
done done
if [[ $is_channel == 1 ]]; then if [[ $is_channel == 1 ]]; then
[[ -n ''${1-} ]] && echo "Error: channel-only bump takes no second argument" >&2 && usage && exit 1 [[ -n ${1-} ]] && echo "Error: channel-only bump takes no second argument" >&2 && usage && exit 1
target_channel="$action" target_channel="$action"
else else
echo "Error: unknown argument '$action'" >&2 echo "Error: unknown argument '$action'" >&2

1
result Symbolic link
View File

@@ -0,0 +1 @@
/nix/store/acl2f263ncy3zfy38cipk2idmqnnvp9x-release

View File

@@ -32,6 +32,8 @@
env = devshell-lib.lib.mkDevShell { env = devshell-lib.lib.mkDevShell {
inherit system; inherit system;
# includeStandardPackages = false; # opt out of nixfmt/gitlint/gitleaks/shfmt defaults
extraPackages = with pkgs; [ extraPackages = with pkgs; [
# add your tools here, e.g.: # add your tools here, e.g.:
# go # go