Feature: Add interactive git attributes generator
Some checks failed
ci / build (macos-latest) (push) Waiting to run
ci / build (ubuntu-20.04) (push) Waiting to run
ci / build (ubuntu-22.04) (push) Failing after 1s

This commit is contained in:
sandroid 2025-02-11 18:51:29 +01:00 committed by sandr01d
parent 408fe6033a
commit 0d65efc769
4 changed files with 50 additions and 10 deletions

View file

@ -184,6 +184,7 @@ forgit_show=gso
forgit_add=ga forgit_add=ga
forgit_reset_head=grh forgit_reset_head=grh
forgit_ignore=gi forgit_ignore=gi
forgit_attributes=gat
forgit_checkout_file=gcf forgit_checkout_file=gcf
forgit_checkout_branch=gcb forgit_checkout_branch=gcb
forgit_branch_delete=gbd forgit_branch_delete=gbd
@ -263,14 +264,15 @@ Forgit will use the default configured pager from git (`core.pager`,
`pager.show`, `pager.diff`) but can be altered with the following environment `pager.show`, `pager.diff`) but can be altered with the following environment
variables: variables:
| Use case | Option | Fallbacks to | | Use case | Option | Fallbacks to |
| ------------ | ------------------- | --------------------------------------------- | | ------------------------ | ------------------------- | ------------------------------------------------- |
| common pager | `FORGIT_PAGER` | `git config core.pager` _or_ `cat` | | common pager | `FORGIT_PAGER` | `git config core.pager` _or_ `cat` |
| pager on `git show` | `FORGIT_SHOW_PAGER` | `git config pager.show` _or_ `$FORGIT_PAGER` | | pager on `git show` | `FORGIT_SHOW_PAGER` | `git config pager.show` _or_ `$FORGIT_PAGER` |
| pager on `git diff` | `FORGIT_DIFF_PAGER` | `git config pager.diff` _or_ `$FORGIT_PAGER` | | pager on `git diff` | `FORGIT_DIFF_PAGER` | `git config pager.diff` _or_ `$FORGIT_PAGER` |
| pager on `git blame` | `FORGIT_BLAME_PAGER` | `git config pager.blame` _or_ `$FORGIT_PAGER` | | pager on `git blame` | `FORGIT_BLAME_PAGER` | `git config pager.blame` _or_ `$FORGIT_PAGER` |
| pager on `gitignore` | `FORGIT_IGNORE_PAGER` | `bat -l gitignore --color always` _or_ `cat` | | pager on `gitignore` | `FORGIT_IGNORE_PAGER` | `bat -l gitignore --color always` _or_ `cat` |
| git log format | `FORGIT_GLO_FORMAT` | `%C(auto)%h%d %s %C(black)%C(bold)%cr%reset` | | pager on `gitatrributes` | `FORGIT_ATTRIBUTES_PAGER` | `bat -l gitattributes --color always` _or_ `cat` |
| git log format | `FORGIT_GLO_FORMAT` | `%C(auto)%h%d %s %C(black)%C(bold)%cr%reset` |
## fzf options ## fzf options
@ -295,6 +297,7 @@ Customizing fzf options for each command individually is also supported:
| `glo` | `FORGIT_LOG_FZF_OPTS` | | `glo` | `FORGIT_LOG_FZF_OPTS` |
| `grl` | `FORGIT_REFLOG_FZF_OPTS` | | `grl` | `FORGIT_REFLOG_FZF_OPTS` |
| `gi` | `FORGIT_IGNORE_FZF_OPTS` | | `gi` | `FORGIT_IGNORE_FZF_OPTS` |
| `gat` | `FORGIT_ATTRIBUTES_FZF_OPTS` |
| `gd` | `FORGIT_DIFF_FZF_OPTS` | | `gd` | `FORGIT_DIFF_FZF_OPTS` |
| `gso` | `FORGIT_SHOW_FZF_OPTS` | | `gso` | `FORGIT_SHOW_FZF_OPTS` |
| `grh` | `FORGIT_RESET_HEAD_FZF_OPTS` | | `grh` | `FORGIT_RESET_HEAD_FZF_OPTS` |
@ -349,7 +352,7 @@ export FORGIT_LOG_FZF_OPTS='
- [`delta`](https://github.com/dandavison/delta) / [`diff-so-fancy`](https://github.com/so-fancy/diff-so-fancy): For better human-readable diffs. - [`delta`](https://github.com/dandavison/delta) / [`diff-so-fancy`](https://github.com/so-fancy/diff-so-fancy): For better human-readable diffs.
- [`bat`](https://github.com/sharkdp/bat.git): Syntax highlighting for `gitignore`. - [`bat`](https://github.com/sharkdp/bat.git): Syntax highlighting for `gitignore` and `gitattributes`.
- [`emoji-cli`](https://github.com/wfxr/emoji-cli): Emoji support for `git log`. - [`emoji-cli`](https://github.com/wfxr/emoji-cli): Emoji support for `git log`.
@ -379,7 +382,7 @@ If you're having issues after updating, and commands such as `forgit::add` or al
- Most of the commands accept optional arguments (e.g., `glo develop`, `glo f738479..188a849b -- main.go`, `gco main`). - Most of the commands accept optional arguments (e.g., `glo develop`, `glo f738479..188a849b -- main.go`, `gco main`).
- `gd` supports specifying revision(e.g., `gd HEAD~`, `gd v1.0 README.md`). - `gd` supports specifying revision(e.g., `gd HEAD~`, `gd v1.0 README.md`).
- Call `gi` with arguments to get the wanted `.gitignore` contents directly(e.g., `gi cmake c++`). - Call `gi` or `gat` with arguments to get the wanted `.gitignore`/`.gitattributes` contents directly(e.g., `gi cmake c++`).
# 📃 License # 📃 License

View file

@ -164,6 +164,7 @@ _forgit_get_pager() {
show) echo -n "${FORGIT_SHOW_PAGER:-$(git config pager.show || _forgit_get_pager)}" ;; show) echo -n "${FORGIT_SHOW_PAGER:-$(git config pager.show || _forgit_get_pager)}" ;;
diff) echo -n "${FORGIT_DIFF_PAGER:-$(git config pager.diff || _forgit_get_pager)}" ;; diff) echo -n "${FORGIT_DIFF_PAGER:-$(git config pager.diff || _forgit_get_pager)}" ;;
ignore) echo -n "${FORGIT_IGNORE_PAGER:-$(hash bat &>/dev/null && echo 'bat -l gitignore --color=always' || echo 'cat')}" ;; ignore) echo -n "${FORGIT_IGNORE_PAGER:-$(hash bat &>/dev/null && echo 'bat -l gitignore --color=always' || echo 'cat')}" ;;
attributes) echo -n "${FORGIT_ATTRIBUTES_PAGER:-$(hash bat &>/dev/null && echo 'bat -l gitattributes --color=always' || echo 'cat')}" ;;
blame) echo -n "${FORGIT_BLAME_PAGER:-$(git config pager.blame || _forgit_get_pager)}" ;; blame) echo -n "${FORGIT_BLAME_PAGER:-$(git config pager.blame || _forgit_get_pager)}" ;;
enter) echo -n "${FORGIT_ENTER_PAGER:-"LESS='-r' less"}" ;; enter) echo -n "${FORGIT_ENTER_PAGER:-"LESS='-r' less"}" ;;
*) echo "pager not found: $1" >&2 ;; *) echo "pager not found: $1" >&2 ;;
@ -1075,6 +1076,34 @@ _forgit_ignore() {
_forgit_path_get "$FORGIT_GI_TEMPLATES" .gitignore "${args[@]}" _forgit_path_get "$FORGIT_GI_TEMPLATES" .gitignore "${args[@]}"
} }
# git attributes generator
export FORGIT_ATTR_REPO_REMOTE=${FORGIT_ATTR_REPO_REMOTE:-https://github.com/gitattributes/gitattributes}
export FORGIT_ATTR_REPO_LOCAL=${FORGIT_ATTR_REPO_LOCAL:-${XDG_CACHE_HOME:-$HOME/.cache}/forgit/gat/repos/gitattributes/gitattributes}
export FORGIT_ATTR_TEMPLATES=${FORGIT_ATTR_TEMPLATES:-$FORGIT_ATTR_REPO_LOCAL}
_forgit_attributes() {
[ -d "$FORGIT_ATTR_REPO_LOCAL" ] \
|| _forgit_repo_update "$FORGIT_ATTR_REPO_REMOTE" "$FORGIT_ATTR_REPO_LOCAL"
local IFS args opts
opts="
$FORGIT_FZF_DEFAULT_OPTS
-m --preview-window='right:70%'
--preview=\"$FORGIT path_preview $FORGIT_ATTR_TEMPLATES {2} .gitattributes attributes\"
$FORGIT_ATTRIBUTES_FZF_OPTS
"
args=("$@")
if [[ $# -eq 0 ]]; then
args=()
while IFS='' read -r arg; do
args+=("$arg")
done < <(_forgit_paths_list "$FORGIT_ATTR_TEMPLATES" .gitattributes |
nl -w4 -s' ' |
FZF_DEFAULT_OPTS="$opts" fzf | awk '{print $2}')
fi
[ ${#args[@]} -eq 0 ] && return 1
_forgit_path_get "$FORGIT_ATTR_TEMPLATES" .gitattributes "${args[@]}"
}
_forgit_repo_update() { _forgit_repo_update() {
local remote path local remote path
remote=$1 remote=$1
@ -1111,6 +1140,7 @@ _forgit_paths_list() {
public_commands=( public_commands=(
"add" "add"
"attributes"
"blame" "blame"
"branch_delete" "branch_delete"
"checkout_branch" "checkout_branch"

View file

@ -39,6 +39,7 @@ if test -z "$FORGIT_NO_ALIASES"
abbr -a -- (string collect $forgit_diff; or string collect "gd") git-forgit diff abbr -a -- (string collect $forgit_diff; or string collect "gd") git-forgit diff
abbr -a -- (string collect $forgit_show; or string collect "gso") git-forgit show abbr -a -- (string collect $forgit_show; or string collect "gso") git-forgit show
abbr -a -- (string collect $forgit_ignore; or string collect "gi") git-forgit ignore abbr -a -- (string collect $forgit_ignore; or string collect "gi") git-forgit ignore
abbr -a -- (string collect $forgit_attributes; or string collect "gi") git-forgit attributes
abbr -a -- (string collect $forgit_checkout_file; or string collect "gcf") git-forgit checkout_file abbr -a -- (string collect $forgit_checkout_file; or string collect "gcf") git-forgit checkout_file
abbr -a -- (string collect $forgit_checkout_branch; or string collect "gcb") git-forgit checkout_branch abbr -a -- (string collect $forgit_checkout_branch; or string collect "gcb") git-forgit checkout_branch
abbr -a -- (string collect $forgit_branch_delete; or string collect "gbd") git-forgit branch_delete abbr -a -- (string collect $forgit_branch_delete; or string collect "gbd") git-forgit branch_delete

View file

@ -141,6 +141,10 @@ forgit::ignore::clean() {
"$FORGIT" ignore_clean "$@" "$FORGIT" ignore_clean "$@"
} }
forgit::attributes() {
"$FORGIT" attributes "$@"
}
# register aliases # register aliases
# shellcheck disable=SC2139 # shellcheck disable=SC2139
if [[ -z "$FORGIT_NO_ALIASES" ]]; then if [[ -z "$FORGIT_NO_ALIASES" ]]; then
@ -152,6 +156,7 @@ if [[ -z "$FORGIT_NO_ALIASES" ]]; then
export forgit_diff="${forgit_diff:-gd}" export forgit_diff="${forgit_diff:-gd}"
export forgit_show="${forgit_show:-gso}" export forgit_show="${forgit_show:-gso}"
export forgit_ignore="${forgit_ignore:-gi}" export forgit_ignore="${forgit_ignore:-gi}"
export forgit_attributes="${forgit_attributes:-gat}"
export forgit_checkout_file="${forgit_checkout_file:-gcf}" export forgit_checkout_file="${forgit_checkout_file:-gcf}"
export forgit_checkout_branch="${forgit_checkout_branch:-gcb}" export forgit_checkout_branch="${forgit_checkout_branch:-gcb}"
export forgit_checkout_commit="${forgit_checkout_commit:-gco}" export forgit_checkout_commit="${forgit_checkout_commit:-gco}"
@ -173,6 +178,7 @@ if [[ -z "$FORGIT_NO_ALIASES" ]]; then
alias "${forgit_diff}"='forgit::diff' alias "${forgit_diff}"='forgit::diff'
alias "${forgit_show}"='forgit::show' alias "${forgit_show}"='forgit::show'
alias "${forgit_ignore}"='forgit::ignore' alias "${forgit_ignore}"='forgit::ignore'
alias "${forgit_attributes}"='forgit::attributes'
alias "${forgit_checkout_file}"='forgit::checkout::file' alias "${forgit_checkout_file}"='forgit::checkout::file'
alias "${forgit_checkout_branch}"='forgit::checkout::branch' alias "${forgit_checkout_branch}"='forgit::checkout::branch'
alias "${forgit_checkout_commit}"='forgit::checkout::commit' alias "${forgit_checkout_commit}"='forgit::checkout::commit'