From 044ed0720b9af19ad0e586adf907f77f908f0bf3 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 16 Oct 2026 11:17:24 +0200 Subject: feat(git): gitcfg, global git config through git itself list, set, add and unset over git config --global. --fixed-value lets a write touch one value of a multi-valued key. set and unset check the old value is still there first: --replace-all with no match appends and exits 0, and the file may have changed in an editor since the page read it. Co-Authored-By: Claude Sonnet 5.5 --- desktop/modules/git/gitcfg | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 desktop/modules/git/gitcfg (limited to 'desktop/modules/git/gitcfg') diff --git a/desktop/modules/git/gitcfg b/desktop/modules/git/gitcfg new file mode 100755 index 0000000..df955bf --- /dev/null +++ b/desktop/modules/git/gitcfg @@ -0,0 +1,56 @@ +#!/bin/bash +# +# Copyright (C) 2026 Danilo M. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# The global git config, for the drawer's git page. +# +# gitcfg list git config --global -z --list +# gitcfg set replace the one value equal to +# gitcfg add add a value +# gitcfg unset remove the one value equal to +# +# Every write goes through git config, so the file keeps its comments, layout +# and quoting. --fixed-value makes a value a literal rather than a regex, so a +# write touches one value of a multi-valued key, and the `--` before the key +# keeps a leading dash an argument rather than an option. +# +# A write prints nothing on success. On failure it prints the reason on +# stdout, for the page, and exits 1. + +set -u + +usage() { + printf 'usage: %s list | set | add | unset \n' \ + "${0##*/}" >&2 + exit 2 +} + +g() { + local err + err="$(git config --global "$@" 2>&1)" || { printf '%s\n' "${err:-git config failed}"; exit 1; } +} + +# --replace-all with no value equal to appends and succeeds, and +# --unset of a missing value fails silently, so both check first: the file +# may have changed in the editor since the page read it. +has() { + git config --global --fixed-value --get-all -- "$1" "$2" >/dev/null \ + || { printf '%s no longer holds that value\n' "$1"; exit 1; } +} + +case "${1:-}" in + list) [[ $# -eq 1 ]] || usage; exec git config --global -z --list ;; + set) [[ $# -eq 4 ]] || usage; has "$2" "$3"; g --fixed-value --replace-all -- "$2" "$4" "$3" ;; + add) [[ $# -eq 3 ]] || usage; g --add -- "$2" "$3" ;; + unset) [[ $# -eq 3 ]] || usage; has "$2" "$3"; g --fixed-value --unset -- "$2" "$3" ;; + *) usage ;; +esac -- cgit v1.2.3