Add versioning workflow, GUI/VAD updates, and Roo /push command
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
description: "Run increment_and_push.sh with a strong commit message"
|
||||||
|
---
|
||||||
|
|
||||||
|
Run `./increment_and_push.sh` and supply a good git commit message. For example:
|
||||||
|
|
||||||
|
`./increment_and_push.sh "Fixed the bug with nip05 implementation"`
|
||||||
@@ -70,6 +70,26 @@ pactl list short sources
|
|||||||
|
|
||||||
Then set `audio_device=` in `./config.ini` to the source you want.
|
Then set `audio_device=` in `./config.ini` to the source you want.
|
||||||
|
|
||||||
|
## Versioning workflow
|
||||||
|
|
||||||
|
This project uses semantic git tags (`vMAJOR.MINOR.PATCH`) plus header macros in [`src/version.h`](src/version.h).
|
||||||
|
|
||||||
|
Use [`increment_and_push.sh`](increment_and_push.sh) to increment version, update [`VOICE_LINUX_VERSION`](src/version.h:4), commit, tag, and push:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# patch bump (default)
|
||||||
|
./increment_and_push.sh "Fix VAD trigger behavior"
|
||||||
|
|
||||||
|
# minor bump
|
||||||
|
./increment_and_push.sh -m "Add new GUI debug indicators"
|
||||||
|
|
||||||
|
# major bump
|
||||||
|
./increment_and_push.sh -M "Breaking config change"
|
||||||
|
|
||||||
|
# release mode (also runs bash ./build.sh and creates tarball)
|
||||||
|
./increment_and_push.sh -r -m "Release minor update"
|
||||||
|
```
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
- This implementation targets **X11** (not native Wayland).
|
- This implementation targets **X11** (not native Wayland).
|
||||||
|
|||||||
Executable
+243
@@ -0,0 +1,243 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
print_status() { echo -e "${BLUE}[INFO]${NC} $1" >&2; }
|
||||||
|
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" >&2; }
|
||||||
|
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" >&2; }
|
||||||
|
print_error() { echo -e "${RED}[ERROR]${NC} $1" >&2; }
|
||||||
|
|
||||||
|
COMMIT_MESSAGE=""
|
||||||
|
RELEASE_MODE=false
|
||||||
|
VERSION_INCREMENT_TYPE="patch" # patch | minor | major
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
VERSION_FILE="$ROOT_DIR/src/version.h"
|
||||||
|
|
||||||
|
show_usage() {
|
||||||
|
cat <<'EOF'
|
||||||
|
voice_linux increment and push script
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
./increment_and_push.sh [OPTIONS] "commit message"
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-p, --patch Increment patch version (default)
|
||||||
|
-m, --minor Increment minor version
|
||||||
|
-M, --major Increment major version
|
||||||
|
-r, --release Build and create a source tarball after tagging
|
||||||
|
-h, --help Show this help
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
./increment_and_push.sh "Fix VAD trigger logic"
|
||||||
|
./increment_and_push.sh -m "Add live debug indicators"
|
||||||
|
./increment_and_push.sh -M "Breaking config format update"
|
||||||
|
./increment_and_push.sh -r -m "Release minor update"
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
check_git_repo() {
|
||||||
|
if ! git -C "$ROOT_DIR" rev-parse --git-dir >/dev/null 2>&1; then
|
||||||
|
print_error "Not in a git repository: $ROOT_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
require_clean_worktree() {
|
||||||
|
if ! git -C "$ROOT_DIR" diff --quiet || ! git -C "$ROOT_DIR" diff --cached --quiet; then
|
||||||
|
print_error "Working tree is not clean. Commit or stash changes before running this script."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
latest_version_tag() {
|
||||||
|
git -C "$ROOT_DIR" tag -l 'v*.*.*' | sort -V | tail -n 1
|
||||||
|
}
|
||||||
|
|
||||||
|
read_header_version() {
|
||||||
|
if [[ ! -f "$VERSION_FILE" ]]; then
|
||||||
|
echo "v0.1.0"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local v
|
||||||
|
v=$(grep -E '^#define[[:space:]]+VOICE_LINUX_VERSION[[:space:]]+"v[0-9]+\.[0-9]+\.[0-9]+"' "$VERSION_FILE" | sed -E 's/.*"(v[0-9]+\.[0-9]+\.[0-9]+)".*/\1/' || true)
|
||||||
|
if [[ -z "$v" ]]; then
|
||||||
|
echo "v0.1.0"
|
||||||
|
else
|
||||||
|
echo "$v"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_semver() {
|
||||||
|
local v="$1"
|
||||||
|
if [[ "$v" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
|
||||||
|
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]} ${BASH_REMATCH[3]}"
|
||||||
|
else
|
||||||
|
print_error "Invalid version: $v"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
increment_version() {
|
||||||
|
local current="$1"
|
||||||
|
local kind="$2"
|
||||||
|
|
||||||
|
read -r major minor patch < <(parse_semver "$current")
|
||||||
|
|
||||||
|
case "$kind" in
|
||||||
|
major)
|
||||||
|
major=$((major + 1))
|
||||||
|
minor=0
|
||||||
|
patch=0
|
||||||
|
;;
|
||||||
|
minor)
|
||||||
|
minor=$((minor + 1))
|
||||||
|
patch=0
|
||||||
|
;;
|
||||||
|
patch)
|
||||||
|
patch=$((patch + 1))
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "Unknown increment type: $kind"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "v${major}.${minor}.${patch}"
|
||||||
|
}
|
||||||
|
|
||||||
|
update_version_header() {
|
||||||
|
local new_version="$1"
|
||||||
|
read -r major minor patch < <(parse_semver "$new_version")
|
||||||
|
|
||||||
|
if [[ ! -f "$VERSION_FILE" ]]; then
|
||||||
|
print_error "Missing $VERSION_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -i -E "s|^#define[[:space:]]+VOICE_LINUX_VERSION[[:space:]]+\"v[0-9]+\.[0-9]+\.[0-9]+\"|#define VOICE_LINUX_VERSION \"${new_version}\"|" "$VERSION_FILE"
|
||||||
|
sed -i -E "s|^#define[[:space:]]+VOICE_LINUX_VERSION_MAJOR[[:space:]]+[0-9]+|#define VOICE_LINUX_VERSION_MAJOR ${major}|" "$VERSION_FILE"
|
||||||
|
sed -i -E "s|^#define[[:space:]]+VOICE_LINUX_VERSION_MINOR[[:space:]]+[0-9]+|#define VOICE_LINUX_VERSION_MINOR ${minor}|" "$VERSION_FILE"
|
||||||
|
sed -i -E "s|^#define[[:space:]]+VOICE_LINUX_VERSION_PATCH[[:space:]]+[0-9]+|#define VOICE_LINUX_VERSION_PATCH ${patch}|" "$VERSION_FILE"
|
||||||
|
|
||||||
|
print_success "Updated $VERSION_FILE to $new_version"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_or_replace_tag() {
|
||||||
|
local tag="$1"
|
||||||
|
if git -C "$ROOT_DIR" rev-parse "$tag" >/dev/null 2>&1; then
|
||||||
|
print_warning "Tag $tag exists, replacing locally"
|
||||||
|
git -C "$ROOT_DIR" tag -d "$tag" >/dev/null
|
||||||
|
fi
|
||||||
|
git -C "$ROOT_DIR" tag "$tag"
|
||||||
|
print_success "Created tag: $tag"
|
||||||
|
}
|
||||||
|
|
||||||
|
git_commit_push_and_tag() {
|
||||||
|
local version="$1"
|
||||||
|
local message="$2"
|
||||||
|
|
||||||
|
git -C "$ROOT_DIR" add "$VERSION_FILE"
|
||||||
|
git -C "$ROOT_DIR" commit -m "$version - $message" >/dev/null
|
||||||
|
print_success "Committed: $version - $message"
|
||||||
|
|
||||||
|
create_or_replace_tag "$version"
|
||||||
|
|
||||||
|
git -C "$ROOT_DIR" push
|
||||||
|
print_success "Pushed branch"
|
||||||
|
|
||||||
|
if git -C "$ROOT_DIR" push origin "$version"; then
|
||||||
|
print_success "Pushed tag: $version"
|
||||||
|
else
|
||||||
|
print_warning "Tag push failed, trying force push"
|
||||||
|
git -C "$ROOT_DIR" push --force origin "$version"
|
||||||
|
print_success "Force-pushed tag: $version"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
build_and_package_release() {
|
||||||
|
local version="$1"
|
||||||
|
print_status "Running release build with bash ./build.sh"
|
||||||
|
(cd "$ROOT_DIR" && bash ./build.sh)
|
||||||
|
|
||||||
|
local tarball="voice_linux-${version#v}.tar.gz"
|
||||||
|
print_status "Creating source tarball: $tarball"
|
||||||
|
(cd "$ROOT_DIR" && tar -czf "$tarball" \
|
||||||
|
--exclude='.git' \
|
||||||
|
--exclude='.git/*' \
|
||||||
|
--exclude='vendor/whisper.cpp/build/*' \
|
||||||
|
--exclude='*.o' \
|
||||||
|
--exclude='voice_linux' \
|
||||||
|
--exclude='voice_linux_gui' \
|
||||||
|
--exclude='*.tar.gz' \
|
||||||
|
.)
|
||||||
|
print_success "Created tarball: $tarball"
|
||||||
|
}
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
-p|--patch)
|
||||||
|
VERSION_INCREMENT_TYPE="patch"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-m|--minor)
|
||||||
|
VERSION_INCREMENT_TYPE="minor"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-M|--major)
|
||||||
|
VERSION_INCREMENT_TYPE="major"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-r|--release)
|
||||||
|
RELEASE_MODE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ -z "$COMMIT_MESSAGE" ]]; then
|
||||||
|
COMMIT_MESSAGE="$1"
|
||||||
|
else
|
||||||
|
COMMIT_MESSAGE="$COMMIT_MESSAGE $1"
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z "$COMMIT_MESSAGE" ]]; then
|
||||||
|
print_error "Commit message is required"
|
||||||
|
echo ""
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_status "voice_linux increment and push"
|
||||||
|
check_git_repo
|
||||||
|
require_clean_worktree
|
||||||
|
|
||||||
|
LATEST_TAG="$(latest_version_tag || true)"
|
||||||
|
if [[ -z "$LATEST_TAG" ]]; then
|
||||||
|
LATEST_TAG="$(read_header_version)"
|
||||||
|
print_warning "No git version tags found, using header version: $LATEST_TAG"
|
||||||
|
fi
|
||||||
|
|
||||||
|
NEW_VERSION="$(increment_version "$LATEST_TAG" "$VERSION_INCREMENT_TYPE")"
|
||||||
|
print_status "Current: $LATEST_TAG"
|
||||||
|
print_status "Next: $NEW_VERSION"
|
||||||
|
|
||||||
|
update_version_header "$NEW_VERSION"
|
||||||
|
git_commit_push_and_tag "$NEW_VERSION" "$COMMIT_MESSAGE"
|
||||||
|
|
||||||
|
if [[ "$RELEASE_MODE" == true ]]; then
|
||||||
|
build_and_package_release "$NEW_VERSION"
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_success "Done: $NEW_VERSION"
|
||||||
+3
-2
@@ -2,6 +2,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "transcribe.h"
|
#include "transcribe.h"
|
||||||
#include "typer.h"
|
#include "typer.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
@@ -424,8 +425,8 @@ static void on_app_activate(GtkApplication *app, gpointer user_data) {
|
|||||||
gtk_container_add(GTK_CONTAINER(s->window), outer);
|
gtk_container_add(GTK_CONTAINER(s->window), outer);
|
||||||
|
|
||||||
char info[1024];
|
char info[1024];
|
||||||
snprintf(info, sizeof(info), "Device: %s\nModel: %s\nLanguage: %s\nGPU: %s",
|
snprintf(info, sizeof(info), "Version: %s\nDevice: %s\nModel: %s\nLanguage: %s\nGPU: %s",
|
||||||
s->cfg.audio_device, s->cfg.model_path, s->cfg.language, s->use_gpu ? "on" : "off");
|
VOICE_LINUX_VERSION, s->cfg.audio_device, s->cfg.model_path, s->cfg.language, s->use_gpu ? "on" : "off");
|
||||||
GtkWidget *info_label = gtk_label_new(info);
|
GtkWidget *info_label = gtk_label_new(info);
|
||||||
gtk_label_set_xalign(GTK_LABEL(info_label), 0.0f);
|
gtk_label_set_xalign(GTK_LABEL(info_label), 0.0f);
|
||||||
gtk_box_pack_start(GTK_BOX(outer), info_label, FALSE, FALSE, 0);
|
gtk_box_pack_start(GTK_BOX(outer), info_label, FALSE, FALSE, 0);
|
||||||
|
|||||||
+2
-1
@@ -3,6 +3,7 @@
|
|||||||
#include "hotkey.h"
|
#include "hotkey.h"
|
||||||
#include "transcribe.h"
|
#include "transcribe.h"
|
||||||
#include "typer.h"
|
#include "typer.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -112,7 +113,7 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "voice_linux ready\n");
|
fprintf(stderr, "voice_linux %s ready\n", VOICE_LINUX_VERSION);
|
||||||
fprintf(stderr, "hotkey toggle mode: press %s to START recording, press %s again to STOP and transcribe\n", cfg.hotkey, cfg.hotkey);
|
fprintf(stderr, "hotkey toggle mode: press %s to START recording, press %s again to STOP and transcribe\n", cfg.hotkey, cfg.hotkey);
|
||||||
fprintf(stderr, "device: %s | model: %s | language: %s | gpu: %s\n",
|
fprintf(stderr, "device: %s | model: %s | language: %s | gpu: %s\n",
|
||||||
cfg.audio_device, cfg.model_path, cfg.language, use_gpu ? "on" : "off");
|
cfg.audio_device, cfg.model_path, cfg.language, use_gpu ? "on" : "off");
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#ifndef VOICE_VERSION_H
|
||||||
|
#define VOICE_VERSION_H
|
||||||
|
|
||||||
|
#define VOICE_LINUX_VERSION "v0.1.0"
|
||||||
|
#define VOICE_LINUX_VERSION_MAJOR 0
|
||||||
|
#define VOICE_LINUX_VERSION_MINOR 1
|
||||||
|
#define VOICE_LINUX_VERSION_PATCH 0
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user