Compare commits

...

2 Commits

Author SHA1 Message Date
azalea c0086e3bf8 [+] zstdedit 2026-05-10 01:22:16 +00:00
azalea 43a260191c [+] brup 2026-05-10 01:16:10 +00:00
4 changed files with 168 additions and 1 deletions
+23
View File
@@ -98,6 +98,16 @@ function git-update-main --description 'Checkout and fast-forward the main branc
command git pull --ff-only
end
function git-fetch-main --description 'Fetch the latest main branch from origin'
set -l main_branch $argv[1]
if test -z "$main_branch"
set main_branch (git-main-branch); or return 1
end
command git fetch origin "+refs/heads/$main_branch:refs/remotes/origin/$main_branch"; or return 1
printf '%s\n' "$main_branch"
end
function br --description 'Switch to an existing branch, or create one from updated main'
if test (count $argv) -ne 1
echo 'Usage: br <branch-name>'
@@ -137,6 +147,19 @@ function bru --description 'Update the current branch by rebasing it on updated
command git rebase "$main_branch"
end
function brup --description 'Merge the latest origin main branch into the current branch'
set -l current_branch (command git symbolic-ref --quiet --short HEAD 2>/dev/null)
if test -z "$current_branch"
echo 'Could not determine current branch.'
return 1
end
git-require-clean; or return 1
set -l main_branch (git-fetch-main); or return 1
command git merge "refs/remotes/origin/$main_branch"
end
function git-env --description 'Alias common git subcommands into the shell'
set -l git_commands add bisect branch checkout clone commit diff fetch grep init log merge pull push rebase reset restore show stash tag
for cmd in $git_commands
+25 -1
View File
@@ -547,7 +547,7 @@ function git-main-branch {
}
Write-Error 'Could not determine main branch.'
return 1
return
}
function git-update-main {
@@ -560,6 +560,16 @@ function git-update-main {
Invoke-RawGit pull --ff-only
}
function git-fetch-main {
param([string]$MainBranch)
if (-not $MainBranch) { $MainBranch = git-main-branch | Select-Object -First 1 }
if (-not $MainBranch) { return }
Invoke-RawGit fetch origin "+refs/heads/${MainBranch}:refs/remotes/origin/${MainBranch}"
if ($LASTEXITCODE -ne 0) { return }
Write-Output $MainBranch
}
function br {
param([Parameter(Mandatory = $true)][string]$Branch)
if (-not (Test-GitCleanWorktree)) { return 1 }
@@ -600,6 +610,20 @@ function bru {
Invoke-RawGit rebase $mainBranch
}
function brup {
$currentBranch = Invoke-RawGit symbolic-ref --quiet --short HEAD 2>$null
if ($LASTEXITCODE -ne 0 -or -not $currentBranch) {
Write-Error 'Could not determine current branch.'
return 1
}
if (-not (Test-GitCleanWorktree)) { return 1 }
$mainBranch = git-fetch-main | Select-Object -First 1
if (-not $mainBranch) { return 1 }
Invoke-RawGit merge "refs/remotes/origin/$mainBranch"
}
function git-env {
foreach ($cmd in @('add', 'bisect', 'branch', 'checkout', 'clone', 'commit', 'diff', 'fetch', 'grep', 'init', 'log', 'merge', 'pull', 'push', 'rebase', 'reset', 'restore', 'show', 'stash', 'tag')) {
$name = $cmd
+95
View File
@@ -0,0 +1,95 @@
#!/usr/bin/env bash
set -euo pipefail
usage() {
echo 'Usage: zstdedit <file.zst>'
}
die() {
echo "zstdedit: $*" >&2
exit 1
}
choose_editor() {
if [[ -n "${VISUAL:-}" ]]; then
echo "$VISUAL"
return 0
fi
if [[ -n "${EDITOR:-}" ]]; then
echo "$EDITOR"
return 0
fi
local candidate
for candidate in micro nano vim vi; do
if command -v "$candidate" >/dev/null 2>&1; then
echo "$candidate"
return 0
fi
done
return 1
}
run_editor() {
local file="$1"
local editor
editor=$(choose_editor) || die 'No editor found. Set VISUAL or EDITOR.'
local -a editor_cmd
read -r -a editor_cmd <<<"$editor"
"${editor_cmd[@]}" "$file"
}
if [[ $# -ne 1 ]]; then
usage >&2
exit 1
fi
command -v zstd >/dev/null 2>&1 || die 'zstd is not installed.'
target="$1"
target_dir=$(dirname -- "$target")
target_base=$(basename -- "$target")
[[ -d "$target_dir" ]] || die "Parent directory does not exist: $target_dir"
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/zstdedit.XXXXXX")
compressed_tmp=''
cleanup() {
if [[ -n "$compressed_tmp" ]]; then
rm -f -- "$compressed_tmp"
fi
rm -rf -- "$tmpdir"
}
trap cleanup EXIT
before_file="$tmpdir/before"
edit_file="$tmpdir/${target_base%.zst}"
if [[ -e "$target" ]]; then
[[ -f "$target" ]] || die "Not a regular file: $target"
zstd -q -dc -- "$target" >"$before_file" || die "Failed to decompress: $target"
else
: >"$before_file"
fi
cp -- "$before_file" "$edit_file"
run_editor "$edit_file"
if cmp -s -- "$before_file" "$edit_file"; then
echo 'No changes.'
exit 0
fi
compressed_tmp=$(mktemp -- "$target_dir/.${target_base}.zstdedit.XXXXXX")
zstd -q -f -o "$compressed_tmp" -- "$edit_file" || die 'Failed to recompress edited file.'
if [[ -e "$target" ]]; then
chmod --reference="$target" "$compressed_tmp" 2>/dev/null || true
fi
mv -f -- "$compressed_tmp" "$target"
compressed_tmp=''
echo "Updated $target"
+25
View File
@@ -97,6 +97,16 @@ git-update-main() {
command git pull --ff-only
}
git-fetch-main() {
local main_branch="$1"
if [[ -z "$main_branch" ]]; then
main_branch=$(git-main-branch) || return 1
fi
command git fetch origin "+refs/heads/${main_branch}:refs/remotes/origin/${main_branch}" || return 1
echo "$main_branch"
}
br() {
if [[ $# -ne 1 ]]; then
echo 'Usage: br <branch-name>'
@@ -139,6 +149,21 @@ bru() {
command git rebase "$main_branch"
}
brup() {
local current_branch
current_branch=$(command git symbolic-ref --quiet --short HEAD 2>/dev/null)
if [[ -z "$current_branch" ]]; then
echo 'Could not determine current branch.'
return 1
fi
git-require-clean || return 1
local main_branch
main_branch=$(git-fetch-main) || return 1
command git merge "refs/remotes/origin/$main_branch"
}
# Git environment
git-env() {
git_commands=( add bisect branch checkout clone commit diff fetch grep init log merge pull push rebase reset restore show stash tag )