Автоматическое документирование псевдонимов gitconfig с использованием sed или awk - PullRequest
0 голосов
/ 19 декабря 2018

В настоящее время я использую приведенный ниже код (взломанный вместе) для генерации документации для моих псевдонимов git с использованием 'git alias'.Предполагается, что над каждым псевдонимом есть комментарий, начинающийся с ###, и псевдонимы форматируются как «псевдоним_имя = команда».Это работает как есть, но есть ли у кого-нибудь более хороший метод?:)

Текущий код (содержимое $HOME/.bin/bin/gdoc):

grep --no-group-separator -A1 '###' "$HOME"/.gitconfig | awk 'END{if((NR%2))print p}!(NR%2){print$0p}{p=$0}' | sed -re 's/( =)(.*)(###)/:*/g' | awk -F* '{printf "\033[1;31m%-30s\033[0m %s\n", $1, $2}' | sort

Пример псевдонимов:

### use difftool to view differences in file
dt = difftool

# /2677623/git-psevdonim-s-pozitsionnymi-parametrami#2677735
### add and commit a file, arg1=file, arg2=commit_message
ac = "!cd -- \"${GIT_PREFIX:-.}\" && git add \"$1\" && git commit -m \"$2\" #"

### remove any files that are in gitignore from tracking
ig = "!git rm --cached `git ls-files -i --exclude-from=.gitignore` #"

### print out available aliases
alias = "!$HOME/.bin/bin/gdoc #"

### add a file to gitignore
ignore = "!([ ! -e .gitignore ] && touch .gitignore) | echo $1 >> .gitignore #"

### git rm files that have been deleted without using git
r = "!git ls-files -z --deleted | xargs -0 git rm #"

# https://stackoverflow.com/questions/38057261/git-config-alias-escaping/39616600#39616600
### Quote a sh command, converting it to a git alias string
quote-string = "!read -r l; printf \\\"!; printf %s \"$l\" | sed 's/\\([\\\"]\\)/\\\\\\1/g'; printf \" #\\\"\\n\" #"
### Unquote a git alias command command, converting it to a sh command
quote-string-undo = "!read -r l; printf %s \"$l\" | sed 's/\\\\\\([\\\"]\\)/\\1/g'; printf \"\\n\" #"

### debug git aliases - 'git debug <alias>'
debug = "!set -x; GIT_TRACE=2 GIT_CURL_VERBOSE=2 GIT_TRACE_PERFORMANCE=2 GIT_TRACE_PACK_ACCESS=2 GIT_TRACE_PACKET=2 GIT_TRACE_PACKFILE=2 GIT_TRACE_SETUP=2 GIT_TRACE_SHALLOW=2 git"

Токовый выход:

ac:                         add and commit a file, arg1=file, arg2=commit_message
alias:                      print out available aliases
debug:                      debug git aliases - 'git debug <alias>'
dt:                         use difftool to view differences in file
ig:                         remove any files that are in gitignore from tracking
ignore:                     add a file to gitignore
quote-string-undo:          Unquote a git alias command command, converting it to a sh command
quote-string:               Quote a sh command, converting it to a git alias string
r:                          git rm files that have been deleted without using git

1 Ответ

0 голосов
/ 19 декабря 2018

Примерно так:

awk 'a{print $1""c;a=0}/###/{$1="";c=$0;a=1}' "$HOME"/.gitconfig | sort

Использование awk, grep и sed в одной и той же трубе - это в основном знак того, что они не используются эффективно.Обычно их можно заменить одной командой awk.

Для вывода с хорошим отступом вы можете использовать column:

awk 'a{print $1"%"c;a=0}/###/{$1="";c=$0;a=1}' "$HOME"/.gitconfig | sort | column -ts%

Примечание. Я вводю разделитель %с awk, который используется для отступа вывода с column

Вывод:

ac                  add and commit a file, arg1=file, arg2=commit_message
alias               print out available aliases
debug               debug git aliases - 'git debug <alias>'
dt                  use difftool to view differences in file
ignore              add a file to gitignore
ig                  remove any files that are in gitignore from tracking
quote-string        Quote a sh command, converting it to a git alias string
quote-string-undo   Unquote a git alias command command, converting it to a sh command
r                   git rm files that have been deleted without using git

Если у вас есть gawk (GNU awk), вы также можете использоватьпросто awk, вот так:

#!/usr/bin/gawk -f
in_alias{
    aliases[$1]=comment
    in_alias=0
    len=length($1)
    if(len > maxlen){
        maxlen = len
    }
}
/###/{
    $1=""
    comment=$0
    in_alias=1
}
END{
    n = asorti(aliases, sorted) # <-- Requires gawk
    for(i = 1; i <= n; i ++){
        pad = maxlen - length(sorted[i]) + 1
        printf "%s%"pad"s%s\n",sorted[i]," ",aliases[sorted[i]]
    }
}

Сохраните это в файл, скажем, / usr / local / bin / git-aliases и сделайте его исполняемым:

chmod +x /usr/local/bin/git-aliases
git-aliases "$HOME"/.gitconfig
...