From db393215ce08638902f6359421e5fd58154d6aeb Mon Sep 17 00:00:00 2001 From: Louis Seubert Date: Thu, 3 Feb 2022 19:33:04 +0100 Subject: [PATCH] 2022-02-03 --- .editorconfig | 20 ++ .gitignore | 0 .shellcheckrc | 10 + README.md | 3 + bin/dotfiles.sh | 54 ++++++ home/dot-bash_logout | 3 + home/dot-bash_profile | 6 + home/dot-bashrc | 13 ++ home/dot-config/git/config | 53 ++++++ home/dot-config/git/config.localhost | 1 + home/dot-config/git/prefere-ssh | 14 ++ home/dot-config/nvim/init.vim | 121 ++++++++++++ home/dot-config/user-dirs.dirs | 15 ++ home/dot-config/user-dirs.locale | 1 + home/dot-gnupg/gpg-agent.conf | 32 ++++ home/dot-gnupg/gpg.conf | 134 ++++++++++++++ home/dot-local/bin/extract | 21 +++ home/dot-local/bin/man | 11 ++ home/dot-local/bin/mkcache | 16 ++ home/dot-local/bin/run-bash | 5 + home/dot-local/bin/update-code | 26 +++ home/dot-local/lib/bash/common.sh | 31 ++++ home/dot-local/lib/bash/github-api.sh | 20 ++ home/dot-local/lib/bash/init.sh | 30 +++ home/dot-local/lib/bash/interaction.sh | 41 +++++ home/dot-local/share/bash/common.sh | 54 ++++++ home/dot-local/share/bash/history.sh | 33 ++++ home/dot-local/share/bash/prompt.sh | 61 ++++++ .../dot-local/share/bash/prompt/prompt-pip.sh | 1 + .../dot-local/share/bash/prompt/prompt-scm.sh | 40 ++++ home/dot-local/share/bash/shopt.sh | 31 ++++ home/dot-local/share/bash/shortcuts.sh | 105 +++++++++++ home/dot-local/share/git/ignore | 7 + home/dot-local/share/git/message | 14 ++ .../git/templates/hooks/applypatch-msg.sample | 15 ++ .../git/templates/hooks/commit-msg.sample | 24 +++ .../templates/hooks/fsmonitor-watchman.sample | 173 ++++++++++++++++++ .../git/templates/hooks/post-update.sample | 8 + .../git/templates/hooks/pre-applypatch.sample | 14 ++ .../git/templates/hooks/pre-commit.sample | 49 +++++ .../templates/hooks/pre-merge-commit.sample | 13 ++ .../share/git/templates/hooks/pre-push.sample | 53 ++++++ .../git/templates/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../git/templates/hooks/pre-receive.sample | 24 +++ .../templates/hooks/prepare-commit-msg.sample | 42 +++++ .../templates/hooks/push-to-checkout.sample | 78 ++++++++ .../share/git/templates/hooks/update.sample | 128 +++++++++++++ .../share/git/templates/info/exclude | 6 + .../systemd/user/gpg-agent-browser.socket | 13 ++ .../share/systemd/user/gpg-agent-extra.socket | 13 ++ .../share/systemd/user/gpg-agent-ssh.socket | 14 ++ .../share/systemd/user/gpg-agent.service | 8 + .../share/systemd/user/gpg-agent.socket | 12 ++ home/dot-ssh/config | 24 +++ home/dot-ssh/config.d/config.localhost | 0 55 files changed, 1907 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .shellcheckrc create mode 100755 bin/dotfiles.sh create mode 100644 home/dot-bash_logout create mode 100644 home/dot-bash_profile create mode 100644 home/dot-bashrc create mode 100644 home/dot-config/git/config create mode 100644 home/dot-config/git/config.localhost create mode 100644 home/dot-config/git/prefere-ssh create mode 100644 home/dot-config/nvim/init.vim create mode 100644 home/dot-config/user-dirs.dirs create mode 100644 home/dot-config/user-dirs.locale create mode 100644 home/dot-gnupg/gpg-agent.conf create mode 100644 home/dot-gnupg/gpg.conf create mode 100644 home/dot-local/bin/extract create mode 100755 home/dot-local/bin/man create mode 100755 home/dot-local/bin/mkcache create mode 100755 home/dot-local/bin/run-bash create mode 100755 home/dot-local/bin/update-code create mode 100644 home/dot-local/lib/bash/common.sh create mode 100644 home/dot-local/lib/bash/github-api.sh create mode 100644 home/dot-local/lib/bash/init.sh create mode 100644 home/dot-local/lib/bash/interaction.sh create mode 100644 home/dot-local/share/bash/common.sh create mode 100644 home/dot-local/share/bash/history.sh create mode 100644 home/dot-local/share/bash/prompt.sh create mode 100755 home/dot-local/share/bash/prompt/prompt-pip.sh create mode 100755 home/dot-local/share/bash/prompt/prompt-scm.sh create mode 100644 home/dot-local/share/bash/shopt.sh create mode 100644 home/dot-local/share/bash/shortcuts.sh create mode 100644 home/dot-local/share/git/ignore create mode 100644 home/dot-local/share/git/message create mode 100755 home/dot-local/share/git/templates/hooks/applypatch-msg.sample create mode 100755 home/dot-local/share/git/templates/hooks/commit-msg.sample create mode 100755 home/dot-local/share/git/templates/hooks/fsmonitor-watchman.sample create mode 100755 home/dot-local/share/git/templates/hooks/post-update.sample create mode 100755 home/dot-local/share/git/templates/hooks/pre-applypatch.sample create mode 100755 home/dot-local/share/git/templates/hooks/pre-commit.sample create mode 100755 home/dot-local/share/git/templates/hooks/pre-merge-commit.sample create mode 100755 home/dot-local/share/git/templates/hooks/pre-push.sample create mode 100755 home/dot-local/share/git/templates/hooks/pre-rebase.sample create mode 100755 home/dot-local/share/git/templates/hooks/pre-receive.sample create mode 100755 home/dot-local/share/git/templates/hooks/prepare-commit-msg.sample create mode 100755 home/dot-local/share/git/templates/hooks/push-to-checkout.sample create mode 100755 home/dot-local/share/git/templates/hooks/update.sample create mode 100644 home/dot-local/share/git/templates/info/exclude create mode 100644 home/dot-local/share/systemd/user/gpg-agent-browser.socket create mode 100644 home/dot-local/share/systemd/user/gpg-agent-extra.socket create mode 100644 home/dot-local/share/systemd/user/gpg-agent-ssh.socket create mode 100644 home/dot-local/share/systemd/user/gpg-agent.service create mode 100644 home/dot-local/share/systemd/user/gpg-agent.socket create mode 100644 home/dot-ssh/config create mode 100644 home/dot-ssh/config.d/config.localhost diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ca587b6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +trim_trailing_whitespace = true +insert_final_newline = false + +[*.sh] +indent_style = tab +indent_size = 2 +end_of_line = lf + +[*.md] +max_line_length = 80 +trim_trailing_whitespace = false + +[.git*] +indent_style = tab diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 0000000..0bee95a --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,10 @@ +# Look for 'source'd files relative to the checked script +source-path=SCRIPTDIR +shell=bash +enable=deprecate-which +enable=require-double-brackets +enable=require-variable-braces +disable=SC1090 # not really fixable usually (ever?) +disable=SC2034 # for localizing variables set in called functions +# disable=SC2206 # suggested alternatives fail in posix mode or use temp files +# disable=SC2207 # suggested alternatives fail in posix mode or use temp files \ No newline at end of file diff --git a/README.md b/README.md index e69de29..4c8a5cf 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,3 @@ +# DOT-FILES + +## Installation diff --git a/bin/dotfiles.sh b/bin/dotfiles.sh new file mode 100755 index 0000000..2f7f4cf --- /dev/null +++ b/bin/dotfiles.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +SWD="$(dirname "$(realpath "$0")")" + +function rebase-fs() { + # disable null glob because empty dirs will break + # globbing and return the glob char '*' + shopt -s nullglob + local src_path=$1 dst_path=$2 file stat + [[ -d "${src_path}" ]] && stat="d" + [[ -f "${src_path}" ]] && stat="f" + echo "${src_path}" "${dst_path}" "${stat}" + case ${stat} in + d) + for file in "${src_path}"/*; do + local path="${file/#${src_path}/${dst_path}}" + rebase-fs "${file}" "${path}" + done + ;; + esac +} + +function mirror-fs() { + local func_f="${1:?""}" func_d="${2:-"$1"}" + local src dst typ + while read -r src dst typ; do + dst="${dst//\/dot-/\/.}" + case ${typ} in + d) "${func_d}" "${src}" "${dst}" "${typ}" ;; + f) "${func_f}" "${src}" "${dst}" "${typ}" ;; + esac + done +} + +function clone-d() { + local src="${1:?""}" dst="${2:?""}" typ="${3:?""}" + case ${typ} in + d) command -p mkdir --parent "${dst}" ;; + f) command -p cp --update "${src}" "${dst}" ;; + esac + command -p mkdir --parent "${dst}" + command -p chmod --reference="${src}" "${dst}" +} + +function clone-f() { + local src="${1:?""}" dst="${2:?""}" typ="${3:?""}" + if [[ ${src} = *.localhost && -e ${dst} ]]; then + printf "skipping local file %s\n" "${dst}" + return + fi + command -p cp --update "${src}" "${dst}" +} + +SRC="$(realpath "${SWD}/../home")" +rebase-fs "${SRC}" "${HOME}" | mirror-fs 'clone-f' 'clone-d' \ No newline at end of file diff --git a/home/dot-bash_logout b/home/dot-bash_logout new file mode 100644 index 0000000..970cfb2 --- /dev/null +++ b/home/dot-bash_logout @@ -0,0 +1,3 @@ +# -*- mode: bash -*- + +true diff --git a/home/dot-bash_profile b/home/dot-bash_profile new file mode 100644 index 0000000..fdcba03 --- /dev/null +++ b/home/dot-bash_profile @@ -0,0 +1,6 @@ +# -*- mode: bash -*- + +# a login shell does everything an interactive shell does +[[ -f ~/.bashrc ]] && source ~/.bashrc + +true \ No newline at end of file diff --git a/home/dot-bashrc b/home/dot-bashrc new file mode 100644 index 0000000..69d214f --- /dev/null +++ b/home/dot-bashrc @@ -0,0 +1,13 @@ +# -*- mode: bash -*- + +source "${HOME}/.local/share/bash/common.sh" + +if [[ ${PS1} ]]; then + source "${HOME}/.local/share/bash/shopt.sh" + source "${HOME}/.local/share/bash/history.sh" + + source "${HOME}/.local/share/bash/shortcuts.sh" + source "${HOME}/.local/share/bash/prompt.sh" +fi + +true diff --git a/home/dot-config/git/config b/home/dot-config/git/config new file mode 100644 index 0000000..8a55c91 --- /dev/null +++ b/home/dot-config/git/config @@ -0,0 +1,53 @@ +[init] + defaultBranch = main + templatedir = ~/.local/share/git/preset + +[core] + excludesfile = ~/.local/share/git/ignore + autocrlf = input + # Treat spaces before tabs and all kinds of trailing whitespace as an error. + # [default] trailing-space: looks for spaces at the end of a line + # [default] space-before-tab: looks for spaces before tabs at the beginning of a line + whitespace = space-before-tab,-indent-with-non-tab,trailing-space + +[alias] + st = status + pf = push --force-with-lease + ls = log --pretty=oneline -n 20 --graph --abbrev-commit + graph = log --graph --oneline --decorate + contributors = shortlog --summary --numbered + whoami = config user.email + +[commit] + template = ~/.local/share/git/message + gpgsign = true + +[color] + ui = auto +[apply] + # Detect whitespace errors when applying a patch. + whitespace = fix + +[push] + default = current + followTags = true +[pull] + ff = true +[merge] + ff = only + log = true +[fetch] + prune = true + +[diff] + renames = copies +[diff "bin"] + textconv = hexdump -v -C + +[gpg] + program = gpg2 + +[include] + path = ~/.config/git/config.localhost +[include] + path = ~/.config/git/prefere-ssh \ No newline at end of file diff --git a/home/dot-config/git/config.localhost b/home/dot-config/git/config.localhost new file mode 100644 index 0000000..cf739ca --- /dev/null +++ b/home/dot-config/git/config.localhost @@ -0,0 +1 @@ +[user] \ No newline at end of file diff --git a/home/dot-config/git/prefere-ssh b/home/dot-config/git/prefere-ssh new file mode 100644 index 0000000..36c1388 --- /dev/null +++ b/home/dot-config/git/prefere-ssh @@ -0,0 +1,14 @@ + +[url "git@github.com:"] + pushInsteadOf = "github:" + pushInsteadOf = "git://github.com/" + pushInsteadOf = "https://github.com/" + +[url "git@gist.github.com:"] + pushInsteadOf = "gist:" + pushInsteadOf = "git://gist.github.com/" + +[url "git@gitlab.com:"] + pushInsteadOf = "gitlab:" + pushInsteadOf = "git://gitlab.com/" + pushInsteadOf = "https://gitlab.com/" \ No newline at end of file diff --git a/home/dot-config/nvim/init.vim b/home/dot-config/nvim/init.vim new file mode 100644 index 0000000..745666a --- /dev/null +++ b/home/dot-config/nvim/init.vim @@ -0,0 +1,121 @@ +"{ Builtin options and settings +" Changing fillchars for folding, so there is no garbage charactes +set fillchars=fold:\ ,vert:\| + +" Split window below/right when creating horizontal/vertical windows +set splitbelow splitright + +" General tab settings +set tabstop=4 " number of visual spaces per TAB +set softtabstop=4 " number of spaces in tab when editing +set shiftwidth=4 " number of spaces to use for autoindent +set noexpandtab " do not expand tab to spaces + +" Set matching pairs of characters and highlight matching brackets +set matchpairs+=<:>,「:」 + +" Show line number and relative line number +set number relativenumber + +" Ignore case in general, but become case-sensitive when uppercase is present +set ignorecase smartcase + +" File and script encoding settings for vim +set fileencoding=utf-8 +set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 +scriptencoding utf-8 + +" Break line at predefined characters +set linebreak +" Character to show before the lines that have been soft-wrapped +set showbreak=↪ + +" List all items and start selecting matches in cmd completion +set wildmode=list:full + +" Show current line where the cursor is +set cursorline +" Set a ruler at column 80, see https://goo.gl/vEkF5i +set colorcolumn=80 + +" Minimum lines to keep above and below cursor when scrolling +set scrolloff=3 + +" Use mouse to select and resize windows, etc. +if has('mouse') + set mouse=nv " Enable mouse in several mode + set mousemodel=popup " Set the behaviour of mouse +endif + +" Do not show mode on command line since vim-airline can show it +set noshowmode + +" Fileformats to use for new files +set fileformats=unix,dos + +" The mode in which cursorline text can be concealed +set concealcursor=nc + +" The way to show the result of substitution in real time for preview +set inccommand=nosplit + +" Ignore certain files and folders when globbing +set wildignore+=*.o,*.obj,*.bin,*.dll,*.exe +set wildignore+=*/.git/*,*/.svn/*,*/__pycache__/*,*/build/** +set wildignore+=*.pyc +set wildignore+=*.DS_Store +set wildignore+=*.aux,*.bbl,*.blg,*.brf,*.fls,*.fdb_latexmk,*.synctex.gz,*.pdf + +" Ask for confirmation when handling unsaved or read-only files +set confirm + +" Do not use visual and errorbells +set visualbell noerrorbells + +" The level we start to fold +set foldlevel=0 + +" The number of command and search history to keep +set history=500 + +" Use list mode and customized listchars +set list listchars=tab:▸\ ,extends:❯,precedes:❮,nbsp:+ + +" Auto-write the file based on some condition +set autowrite + +" Show hostname, full path of file and last-mod time on the window title. +" The meaning of the format str for strftime can be found in +" http://tinyurl.com/l9nuj4a. The function to get lastmod time is drawn from +" http://tinyurl.com/yxd23vo8 +set title +set titlestring= +set titlestring+=%(%{hostname()}\ \ %) +set titlestring+=%(%{expand('%:p')}\ \ %) +set titlestring+=%{strftime('%Y-%m-%d\ %H:%M',getftime(expand('%')))} + +" Persistent undo even after you close a file and re-open it +set undofile + +" Do not show "match xx of xx" and other messages during auto-completion +set shortmess+=c + +" Completion behaviour +set completeopt+=noinsert " Auto select the first completion entry +set completeopt+=menuone " Show menu even if there is only one item +set completeopt-=preview " Disable the preview window + +" Settings for popup menu +set pumheight=15 " Maximum number of items to show in popup menu +set pumblend=5 " Pesudo blend effect for popup menu + +" Align indent to next multiple value of shiftwidth. For its meaning, +" see http://tinyurl.com/y5n87a6m +set shiftround + +" Virtual edit is useful for visual block edit +set virtualedit=block + +" Do not add two space after a period when joining lines or formatting texts, +" see https://tinyurl.com/y3yy9kov +set nojoinspaces diff --git a/home/dot-config/user-dirs.dirs b/home/dot-config/user-dirs.dirs new file mode 100644 index 0000000..7f9a959 --- /dev/null +++ b/home/dot-config/user-dirs.dirs @@ -0,0 +1,15 @@ +# This file is written by xdg-user-dirs-update +# If you want to change or add directories, just edit the line you're +# interested in. All local changes will be retained on the next run. +# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped +# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an +# absolute path. No other format is supported. +# +XDG_DESKTOP_DIR="$HOME/Desktop" +XDG_DOWNLOAD_DIR="$HOME/Downloads" +XDG_TEMPLATES_DIR="$HOME/Templates" +XDG_PUBLICSHARE_DIR="$HOME/Public" +XDG_DOCUMENTS_DIR="$HOME/Documents" +XDG_MUSIC_DIR="$HOME/Music" +XDG_PICTURES_DIR="$HOME/Pictures" +XDG_VIDEOS_DIR="$HOME/Videos" diff --git a/home/dot-config/user-dirs.locale b/home/dot-config/user-dirs.locale new file mode 100644 index 0000000..3e0b419 --- /dev/null +++ b/home/dot-config/user-dirs.locale @@ -0,0 +1 @@ +en_US \ No newline at end of file diff --git a/home/dot-gnupg/gpg-agent.conf b/home/dot-gnupg/gpg-agent.conf new file mode 100644 index 0000000..9608170 --- /dev/null +++ b/home/dot-gnupg/gpg-agent.conf @@ -0,0 +1,32 @@ +# Configuration file for gpg-agent (~/.gnupg/gpg-agent.conf) +# +# Note: +# After changing the configuration, reload the agent: +# $ gpg-connect-agent reloadagent /bye + +# Time a cache entry is valid (in seconds) default: 600 +# Each time a cache entry is accessed, the entry's timer is reset +# The cache entry is invalidate after a max time, default: 7200 +default-cache-ttl 3600 +max-cache-ttl 21600 +default-cache-ttl-ssh 3600 +max-cache-ttl-ssh 21600 + +# Select PIN entry program (qt, curses, gtk-2,...) +# On Gentoo Linux: see also 'eselect pinentry list' +# pinentry-program /usr/bin/pinentry-tty +# pinentry-program /usr/bin/pinentry-curses +# pinentry-program /usr/bin/pinentry-gtk-2 +# pinentry-program /usr/bin/pinentry-gnome3 +# pinentry-program /usr/bin/pinentry-emacs +# pinentry-program /usr/bin/pinentry-qt +pinentry-program /usr/bin/pinentry + +# Use GnuPG agent for SSH keys (instead of ssh-agent) +# Note: Make sure that gpg-agent is always started with login. +# +# This can be done by enabling one of the following sockets +# systemctl --user enable --now gpg-agent.service +# systemctl --user enable --now gpg-agent-ssh.service +# +enable-ssh-support diff --git a/home/dot-gnupg/gpg.conf b/home/dot-gnupg/gpg.conf new file mode 100644 index 0000000..db9d99c --- /dev/null +++ b/home/dot-gnupg/gpg.conf @@ -0,0 +1,134 @@ +# Configuration file for gpg (~/.gnupg/gpg.conf) +# +# This options file can contain any long options which are available in +# GnuPG. See gpg(1) for a full list of options. +# +# Also useful: https://riseup.net/en/gpg-best-practices + +# +# Default key and recipient +# + +# If you have more than one secret key in your keyring, you may want to +# uncomment the following option and set your preferred keyid. +# default-key C4380B57 + +# If you do not pass a recipient to gpg, it will ask for one. Using this option +# you can encrypt to a default key. Key validation will not be done in this +# case. The second form uses the default key as default recipient. +# default-recipient +default-recipient-self + +# +# Behavior +# + +# Get rid of the copyright notice +no-greeting + +# Disable inclusion of the version string in ASCII armored output +no-emit-version + +# Disable comment string in clear text signatures and ASCII armored messages. +no-comments + +# Select how to display key IDs: none|short|long|0xshort|0xlong +keyid-format 0xlong + +# List keys with their fingerprints +with-fingerprint + +# List keys with their keygrip +with-keygrip + +# Display the calculated validity of the user IDs during key listings +list-options show-uid-validity +verify-options show-uid-validity + +# Try to use the GnuPG-Agent. With this option, GnuPG first tries to connect to +# the agent before it asks for a passphrase. +use-agent + +# Because some mailers change lines starting with "From " to ">From " it is good +# to handle such lines in a special way when creating cleartext signatures; all +# other PGP versions do it this way too. To enable full OpenPGP compliance you +# may want to use this option. +# no-escape-from-lines + +# +# Algorithms and ciphers +# + +# When verifying a signature made from a subkey, ensure that the cross +# certification "back signature" on the subkey is present and valid. This +# protects against a subtle attack against subkeys that can sign. +require-cross-certification + +# List of personal digest preferences. When multiple digest are supported by +# all recipients, choose the strongest one +personal-digest-preferences SHA512 SHA384 SHA256 SHA224 + +# Message digest algorithm used when signing a key +cert-digest-algo SHA512 + +# List of personal cipher preferences. When multiple ciphers are supported by +# all recipients, choose the strongest one +personal-cipher-preferences AES256 AES192 AES TWOFISH CAMELLIA256 3DES + +# Preference list used for new keys. It becomes the default for "setpref" in the +# edit menu +default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed + +# +# Key servers +# + +# The following two options are moved to dirmngr.conf since GnuPG 2.1, check +# 'man dirmngr' for more details +# keyserver hkps://hkps.pool.sks-keyservers.net +# keyserver-options ca-cert-file=~/.gnupg/hkps.pool.sks-keyservers.net.pem +keyserver hkps://keys.openpgp.org + +# Set the proxy to use for HTTP and HKP keyservers - default to the standard +# local Tor socks proxy +# It is encouraged to use Tor for improved anonymity. Preferrably use either a +# dedicated SOCKSPort for GnuPG and/or enable IsolateDestPort and +# IsolateDestAddr +# keyserver-options http-proxy=socks5-hostname://127.0.0.1:9050 + +# Don't leak DNS, see https://trac.torproject.org/projects/tor/ticket/2846 +# keyserver-options no-try-dns-srv + +# When using --refresh-keys, if the key in question has a preferred keyserver +# URL, then disable use of that preferred keyserver to refresh the key from +keyserver-options no-honor-keyserver-url + +# When searching for a key with --search-keys, include keys that are marked on +# the keyserver as revoked +keyserver-options include-revoked + +# Automatically fetch keys from key server when not on the local keyring +keyserver-options auto-key-retrieve + +# +# Miscellaneous options +# + +# Group names may be defined like this: +# group mynames = paige 0x12345678 joe patti +# +# Any time "mynames" is a recipient (-r or --recipient), it will be expanded to +# the names "paige", "joe", and "patti", and the key ID "0x12345678". Note +# there is only one level of expansion - you cannot make an group that points to +# another group. Note also that if there are spaces in the recipient name, this +# will appear as two recipients. In these cases it is better to use the key ID. +# group mynames = paige 0x12345678 joe patti + +# GnuPG can automatically locate and retrieve keys as needed using this option. +# This happens when encrypting to an email address (in the "user@@example.com" +# form) and there are no keys matching "user@example.com" in the local keyring. +# This option takes any number mechanisms which are tried in the given order. +# The default is "--auto-key-locate local" to search for keys only in the local +# key database. Uncomment the next line to locate a missing key using two DNS +# based mechanisms. +# auto-key-locate local,pka,dane diff --git a/home/dot-local/bin/extract b/home/dot-local/bin/extract new file mode 100644 index 0000000..a343927 --- /dev/null +++ b/home/dot-local/bin/extract @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +if [[ -f $1 ]]; then + case $1 in + *.tar) tar xf "$1" ;; + *.tgz) tar xzf "$1" ;; + *.tar.gz) tar xzf "$1" ;; + *.tbz2) tar xjf "$1" ;; + *.tar.bz2) tar xjf "$1" ;; + *.bz2) bunzip2 "$1" ;; + *.rar) rar x "$1" ;; + *.gz) gunzip "$1" ;; + *.zip) unzip "$1" ;; + *.Z) uncompress "$1" ;; + *.7z) 7z x "$1" ;; + *.xz) xz -d "$1" ;; + *) echo "'$1' cannot be extracted via extract" ;; + esac +else + echo "'$1' is not a valid file" +fi \ No newline at end of file diff --git a/home/dot-local/bin/man b/home/dot-local/bin/man new file mode 100755 index 0000000..85cdee1 --- /dev/null +++ b/home/dot-local/bin/man @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +exec env \ + LESS_TERMCAP_mb="$(printf "\e[01;31m")" \ + LESS_TERMCAP_md="$(printf "\e[01;32m")" \ + LESS_TERMCAP_me="$(printf "\e[0m")" \ + LESS_TERMCAP_se="$(printf "\e[0m")" \ + LESS_TERMCAP_so="$(printf "\e[01;44;33m")" \ + LESS_TERMCAP_ue="$(printf "\e[0m")" \ + LESS_TERMCAP_us="$(printf "\e[01;36m")" \ + man "$@" \ No newline at end of file diff --git a/home/dot-local/bin/mkcache b/home/dot-local/bin/mkcache new file mode 100755 index 0000000..e069220 --- /dev/null +++ b/home/dot-local/bin/mkcache @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +for file in "${@:-"${PWD}"}"; do + if [[ ! -d "${file}" ]]; then + printf $"%s: cannot create cache directory tag '%s': %s\n" \ + "${0##*/}" "${file}" $"File is not a directory" >&2 + continue + fi + + cat >"${file}/CACHEDIR.TAG" </dev/null 2>&1 +} || { echo "error: cannot load common shell lib" >&2; exit 1; } + +import "github-api.sh" + +function @report() { + printf "➜ %s of vscodium is avaiable\n" "${@}" +} + +while read -r version link; do + if ! rpm -qa | grep "codium-${version}" >/dev/null; then + @report "version ${version}" + sudo dnf install -y "${link}" + else + @report "no new version" + fi +done < <(SUFFIX="$(uname -i).rpm" github_latest_release_assets 'vscodium') diff --git a/home/dot-local/lib/bash/common.sh b/home/dot-local/lib/bash/common.sh new file mode 100644 index 0000000..e9b8d7c --- /dev/null +++ b/home/dot-local/lib/bash/common.sh @@ -0,0 +1,31 @@ +# -*- mode: bash -*- + +function abort() { + local status="${1:?"abort requires status"}" + local reason="${2:?"abort requires reason"}" + shift 2 + # here we want the string as template + # shellcheck disable=SC2059 + printf "error: ${reason}\n" "$@" >&2 + exit "${status}" +} + +function has_software() { + for software in "$@"; do + type "${software}" >/dev/null 2>&1 || + abort 1 $"%s not found in path\n" "${software}" + done +} + +function import() { + local name path file + for name in "$@"; do + local IFS=:; set -o noglob + for path in ${IMPORTPATH}; do + file="${path}/${name}" + [[ -e "${file}" && -r "${file}" ]] && { + source "${file}" && continue 2 || return 1 + } + done + done +} diff --git a/home/dot-local/lib/bash/github-api.sh b/home/dot-local/lib/bash/github-api.sh new file mode 100644 index 0000000..306f935 --- /dev/null +++ b/home/dot-local/lib/bash/github-api.sh @@ -0,0 +1,20 @@ +# -*- mode: bash -*- +[[ ! "${LIB_SHELL_GITHUB}" ]] && LIB_SHELL_GITHUB="Y" || return + +has_software 'jq' 'curl' + +function github_api() { + curl -L --silent -H "Accept: application/vnd.github.v3.raw+json" \ + ${TOKEN:+ -H "Authorization: Token ${TOKEN}"} "$@" +} + +github_get_latest_release() { + local user="${1:?'require name'}" repo="${2:-"$1"}" + github_api "https://api.github.com/repos/${user}/${repo}/releases/latest" +} + +github_latest_release_assets() { + local name="\$doc.tag_name" + local link="(\$doc.assets[] | select(.name ${SUFFIX:+"| endswith(\"${SUFFIX}\")"}).browser_download_url)" + github_get_latest_release "$@" | jq -r ". as \$doc | ${name} + \" \" + ${link}" +} \ No newline at end of file diff --git a/home/dot-local/lib/bash/init.sh b/home/dot-local/lib/bash/init.sh new file mode 100644 index 0000000..f33736b --- /dev/null +++ b/home/dot-local/lib/bash/init.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +# Shell options which will be like a strict mode +set -${DEBUG:+x}euo pipefail + +# This script should be sourced before any of +# the other scripts in this repo. Other scripts +# make use of ${BASH_LIB_DIR} to find each other. + +# Get the relative path to the repo root +# shellcheck disable=SC2086 +BASH_LIB_DIR_RELATIVE="$(dirname ${BASH_SOURCE[0]})" + +# Must be set in order to load the filehandling +# module. Will be updated when abs_path is available. +BASH_LIB_DIR="${BASH_LIB_DIR_RELATIVE}" + +for name in common; do + source "${BASH_LIB_DIR_RELATIVE}/${name}/${name}.sh" +done + +# Filter functions and re export only bash-lib functions to subshells +eval "$(declare -F | sed -e 's/-f /-fx /' | grep 'x bl_')" + +# Export the absolute path +# shellcheck disable=SC2086 +BASH_LIB_DIR="$(realpath ${BASH_LIB_DIR_RELATIVE})" +export BASH_LIB_DIR + +MODULEPATH="${MODULEPATH:+"${MODULEPATH}:"}" \ No newline at end of file diff --git a/home/dot-local/lib/bash/interaction.sh b/home/dot-local/lib/bash/interaction.sh new file mode 100644 index 0000000..2baced7 --- /dev/null +++ b/home/dot-local/lib/bash/interaction.sh @@ -0,0 +1,41 @@ +# -*- mode: bash -*- +# shellcheck disable=SC2059 + +[[ ! "${LIB_SHELL_INTERACTION}" ]] && LIB_SHELL_INTERACTION="Y" || return + +SYMBOL_SUCCESS="✔" +SYMBOL_FAILURE="✘" +SYMBOL_ARROW="➜" + +COLOR_NORMAL="\\e[00m" + +# check if stdout is a tty so we can use color code +if [[ -t 1 ]]; then + SH_LIB_PREFIX_WARN="[ \\[\\e[01;33m\\]WARN\\[\\e[00;00m\\] ] " + SH_LIB_PREFIX_INFO="[ \\[\\e[01;34m\\]INFO\\[\\e[00;00m\\] ] " + SH_LIB_PREFIX_SUCCESS="[ \\[\\e[01;31m\\]FAILURE\\[\\e[00;00m\\] ] " + SH_LIB_PREFIX_FAILURE="[ \\[\\e[01;32m\\]SUCCESS\\[\\e[00;00m\\] ] " +fi + +function @warn() { + local format="${1:?"require format"}" && shift + printf "${SH_LIB_PREFIX_WARN@P}${format}\n" "${@}" +} + +function @info() { + local format="${1:?"require format"}" && shift + printf "${SH_LIB_PREFIX_INFO@P}${format}\n" "${@}" +} + +function @success() { + local format="${1:?"require format"}" && shift + printf "${SH_LIB_PREFIX_SUCCESS@P}${format}\n" "${@}" +} + +function @failure() { + local format="${1:?"require format"}" && shift + printf "${SH_LIB_PREFIX_FAILURE@P}${format}\n" "${@}" +} + + ➜ +# ➜ \ No newline at end of file diff --git a/home/dot-local/share/bash/common.sh b/home/dot-local/share/bash/common.sh new file mode 100644 index 0000000..085d17d --- /dev/null +++ b/home/dot-local/share/bash/common.sh @@ -0,0 +1,54 @@ + +for edit in nvim vim nano vi; do + EDITOR="$(command -v ${edit})" && break +done +VISUAL="${EDITOR}" + + +# path-munge [OPTIONS] path +# -b add path as prefix to existing path +# -a add path as suffix to existing path (default) +function path-munge() { + local mode='suffix' + + local OPTIND=1 OPTFLG='' + while getopts "ba" OPTFLG "$@"; do + case "${OPTFLG}" in + b) mode='prefix' ;; + a) mode='suffix' ;; + :) ;; + *) ;; + esac + done + shift "$((OPTIND - 1))" + + if [[ :${PATH}: != *:$1:* ]]; then + case "${mode}" in + prefix) PATH="$1${PATH:+":"}${PATH}" ;; + suffix) PATH="${PATH}${PATH:+":"}$1" ;; + esac + fi +} + +# shellcheck disable=SC2120 +function has-superuser-priviliges() { + [[ "$(/usr/bin/groups)" == *"${1:-"wheel"}"* || "$(/usr/bin/id -u)" == "0" ]] +} + +# reset bin lookup path +PATH='' + +if has-superuser-priviliges; then + path-munge /usr/local/sbin + path-munge /usr/sbin +fi + +path-munge /usr/local/bin +path-munge /usr/bin + +# user binaries will always be first +path-munge -b ~/.local/bin + +export EDITOR VISUAL PATH + +unset -f has-superuser-priviliges diff --git a/home/dot-local/share/bash/history.sh b/home/dot-local/share/bash/history.sh new file mode 100644 index 0000000..d1b6186 --- /dev/null +++ b/home/dot-local/share/bash/history.sh @@ -0,0 +1,33 @@ +# -*- mode: bash -*- + +# append to the history file, don't overwrite it +shopt -s histappend + +# save multi-line commands as one command +shopt -s cmdhist + +# use readline on history +shopt -s histreedit + +# load history line onto readline buffer for editing +shopt -s histverify + +# use standard ISO 8601 timestamp +# %F equivalent to %Y-%m-%d +# %T equivalent to %H:%M:%S (24-hours format) +TIME_LONG='%F %T' +TIME_DEFAULT="${TIME_LONG}" + +HISTCONTROL="erasedups:ignoredups:ignorespace" +HISTSIZE=500000 +HISTFILESIZE="${HISTSIZE}" +HISTFILE="${HOME}/.local/state/bash/history" +HISTTIMEFORMAT="${TIME_DEFAULT} " + +export HISTFILE HISTSIZE HISTFILESIZE HISTCONTROL HISTTIMEFORMAT + +# enable incremental history search with up/down arrows +bind '"\e[A": history-search-backward' +bind '"\e[B": history-search-forward' +bind '"\e[C": forward-char' +bind '"\e[D": backward-char' diff --git a/home/dot-local/share/bash/prompt.sh b/home/dot-local/share/bash/prompt.sh new file mode 100644 index 0000000..0c67687 --- /dev/null +++ b/home/dot-local/share/bash/prompt.sh @@ -0,0 +1,61 @@ +# shellcheck shell=bash + +PSBIN="${HOME}/.local/share/bash" + +prompt() { + local status="$?" file + PS1="${PSFIX}" + PSSCM="$(source "${PSBIN}/prompt/prompt-scm.sh" 2>/dev/null )" + PSPIP="$(source "${PSBIN}/prompt/prompt-pip.sh" 2>/dev/null )" + + # done refreshing, starting to assemble it. + PS1="${PS1}\\[\\e[0m\\]${PSSCM%% }${PSSCM:+" "}" + PS1="${PS1}\\[\\e[0m\\]${PSPIP%% }${PSPIP:+" "}" + # change prompt if last execution was not successful + if [[ "${status}" -gt 0 ]]; then + PS1="${PS1}\\[\\e[0;31m\\]\\$" + else + PS1="${PS1}\\[\\e[0;32m\\]\\$" + fi + # back to default + PS1="${PS1}\\[\\e[0m\\] " +} + +# Use window titles only in known X terminals. +case ${TERM} in + xterm*|rxvt*|Eterm|aterm|kterm|gnome|screen) + PSTITLE='\[\e]0;\u@\h:\w\a\]' + ;; + *) + PSTITLE='' + ;; +esac + +: "${PSUSERCOLOR:="1;33"}" # yellow by default +: "${PSHOSTCOLOR:="1;33"}" # yellow by default + +typeset -A PSHOSTCOLORS +PSHOSTCOLORS[louis@desktop-louis]="38;5;164@1;30" + +if [[ -n ${PSHOSTCOLORS[${USER}@${HOSTNAME}]} ]]; then + PSUSERCOLOR="${PSHOSTCOLORS["${USER}@${HOSTNAME}"]%@*}" + PSHOSTCOLOR="${PSHOSTCOLORS["${USER}@${HOSTNAME}"]##*@}" +fi + +if [[ ${EUID} -eq 0 ]]; then + PSUSERCOLOR="38;5;160" +fi + +# window title if the terminal can interpret this +PSFIX="${PSTITLE}" +# user, with color according to preference +PSFIX="${PSFIX}\\[\\e[${PSUSERCOLOR}m\\]\\u\\[\\e[0m\\]" +# @ +PSFIX="${PSFIX}\\[\\e[0m\\]@" +# host, with color according to preference +PSFIX="${PSFIX}\\[\\e[${PSHOSTCOLOR}m\\]\\h\\[\\e[0m\\]" +# current working directory. +PSFIX="${PSFIX}\\[\\e[38;5;111m\\] \\W " + +PROMPT_DIRTRIM=1 +PROMPT_COMMAND+=('prompt') \ No newline at end of file diff --git a/home/dot-local/share/bash/prompt/prompt-pip.sh b/home/dot-local/share/bash/prompt/prompt-pip.sh new file mode 100755 index 0000000..005171d --- /dev/null +++ b/home/dot-local/share/bash/prompt/prompt-pip.sh @@ -0,0 +1 @@ +basename "${VIRTUAL_ENV:-}" 2>/dev/null \ No newline at end of file diff --git a/home/dot-local/share/bash/prompt/prompt-scm.sh b/home/dot-local/share/bash/prompt/prompt-scm.sh new file mode 100755 index 0000000..e2ed727 --- /dev/null +++ b/home/dot-local/share/bash/prompt/prompt-scm.sh @@ -0,0 +1,40 @@ +#!/bin/bash +{ type -p git && git rev-parse --git-dir; } >/dev/null 2>&1 || exit $? +# see https://git-scm.com/docs/git-status for more information +# these are status information from the local git index + +CAH=0 CBH=0 +D=0 A=0 M=0 R=0 U=0 I=0 +while read -r format state values; do + case ${format} in + \#) + case ${state} in + branch.oid) COMMIT="${values}" ;; + branch.head) BRANCH="${values}" ;; + branch.upstream) UPSTREAM="${values}" ;; + branch.ab) read -r CAH CBD <<<"${values}" ;; + esac + ;; + 1) (( ${state:0:1}++ )) ;; + 2) (( ${state:0:1}++ )) ;; + \?) (( U++ )) ;; + \!) (( I++ )) ;; + esac +done < <(git status --porcelain=2 --branch) + +[[ ${CAH} -gt 0 ]] && echo -n "\\[\\e[0;32m\\]<\\[\\e[0m\\]${CAH} "; +[[ ${CBH} -gt 0 ]] && echo -n "\\[\\e[0;31m\\]>\\[\\e[0m\\]${CBH} "; + + +[[ ${M} -gt 0 ]] && _BRANCH="\\[\\e[0;31m\\]" || _BRANCH="\\[\\e[0;32m\\]" +if [[ "${BRANCH}" == "(detached)" ]]; then + BRANCH="{${COMMIT:0:8}}" +else + BRANCH="(${BRANCH})" +fi +echo -n "${_BRANCH}${BRANCH}\\[\\e[0m\\] " + +[[ ${A} -gt 0 ]] && echo -n "\\[\\e[0;32m\\]+\\[\\e[0m\\]${A} "; +[[ ${D} -gt 0 ]] && echo -n "\\[\\e[0;31m\\]-\\[\\e[0m\\]${D} "; +[[ ${M} -gt 0 ]] && echo -n "\\[\\e[0;35m\\]~\\[\\e[0m\\]${M} "; +[[ ${U} -gt 0 ]] && echo -n "\\[\\e[0;33m\\]?\\[\\e[0m\\]${U} "; diff --git a/home/dot-local/share/bash/shopt.sh b/home/dot-local/share/bash/shopt.sh new file mode 100644 index 0000000..5eb893f --- /dev/null +++ b/home/dot-local/share/bash/shopt.sh @@ -0,0 +1,31 @@ +# -*- mode: bash -*- + +# update window size after every command +shopt -s checkwinsize + +# prepend cd to directory names automatically +shopt -s autocd + +shopt -s dirspell +shopt -s cdspell + +# READLINE + +# perform file completion in a case +# insensitive fashion +bind "set completion-ignore-case on" +# treat hyphens and underscores as equivalent +bind "set completion-map-case on" +# display matches for ambiguous patterns +# at first tab press +bind "set show-all-if-ambiguous on" +# immediately add a trailing slash when +# autocompleting symlinks to directories +bind "set mark-symlinked-directories on" + +# vi mode configurations +bind "set vi-ins-mode-string \1\e[6 q\2\1ins\2" +bind "set vi-cmd-mode-string \1\e[2 q\2\1cmd\2" +bind "set show-mode-in-prompt on" + +# ➜ diff --git a/home/dot-local/share/bash/shortcuts.sh b/home/dot-local/share/bash/shortcuts.sh new file mode 100644 index 0000000..63a75f3 --- /dev/null +++ b/home/dot-local/share/bash/shortcuts.sh @@ -0,0 +1,105 @@ +# shellcheck shell=bash + +#region common functions for working with directories +# --------------------------------------------- +# shortcuts for moving around +# --------------------------------------------- +alias ..='cd ..' +alias ...='cd ../..' +alias ....='cd ../../..' + +# --------------------------------------------- +# shortcuts for creating and removing folders +# --------------------------------------------- +alias md='mkdir -p' +alias rd='rmdir' + +# --------------------------------------------- +# more shortcuts for listing files +# --------------------------------------------- +alias ls='ls --color=auto' +alias la='ls --color=auto -Alh' # show hidden files +alias ll='ls --color=auto -lh' # sort by size human readable +alias lr='ls --color=auto -lR' # recursive ls +alias lt='ls --color=auto -ltr' # sort by date + +# --------------------------------------------- +# shortcuts for showing human-readable fs info +# --------------------------------------------- + +# short and human-readable file listing +alias dud='du -d 1 -h' +# short and human-readable directory listing +alias duf='du -sh *' + +#endregion + +#region common functions for working with file permissions + +# --------------------------------------------- +# --------------------------------------------- +alias perm='stat --printf "%a %n \n "' # perm: show permission of target in number + +# --------------------------------------------- +# --------------------------------------------- +alias 000='chmod 000' # ---------- (user: -, group: -, other: -) +alias 640='chmod 640' # -rw-r----- (user: rw, group: r, other: -) +alias 644='chmod 644' # -rw-r--r-- (user: rw, group: r, other: -) +alias 755='chmod 755' # -rwxr-xr-x (user: rwx, group: rx, other: x) +alias 775='chmod 775' # -rwxrwxr-x (user: rwx, group: rwx, other: rx) + +# --------------------------------------------- +# --------------------------------------------- +alias ux='chmod u+x' # ---x------ (user: --x, group: -, other: -) +alias mx='chmod a+x' # ---x--x--x (user: --x, group: --x, other: --x) + +#endregion + +#region common preferred default implementation + +# 'wget' with resume download +alias wget='wget -c --no-hsts' + +# just use color, please +alias grep='grep --color=auto' +alias egrep='egrep --color=auto' +alias fgrep='fgrep --color=auto' +alias xzegrep='xzegrep --color=auto' +alias xzfgrep='xzfgrep --color=auto' +alias xzgrep='xzgrep --color=auto' +alias zegrep='zegrep --color=auto' +alias zfgrep='zfgrep --color=auto' +alias zgrep='zgrep --color=auto' + +#endregion + +# path: echo all executable paths +alias path='echo -e ${PATH//:/\\n}' + +# cs: clear terminal display +alias cs='clear' + +# ed: editd file in default editor +alias ed='${EDITOR}' +# se: editd file in default editor with sudo rigths +alias se='sudoedit' + +# src: reload .bashrc file +alias src='source ~/.bashrc' + +# qfind: quickly search for file +alias qfind='find . -name ' + +# ip just color my ip command +alias ip='ip -c' + +# Mirror stdout to stderr, useful for seeing data going through a pipe +alias peek='tee >(cat 1>&2)' + +function open() { command xdg-open "${@:-"${PWD}"}" >/dev/null 2>&1; } +function code() { command codium "${@:-"${PWD}"}" >/dev/null 2>&1; } + +function mcd() { mkdir -p "$1" && cd "$1" || return; } + +# Execute a command in a specific directory +function xin() ( cd "${1}" && shift && "${@}"; ) diff --git a/home/dot-local/share/git/ignore b/home/dot-local/share/git/ignore new file mode 100644 index 0000000..7d14a15 --- /dev/null +++ b/home/dot-local/share/git/ignore @@ -0,0 +1,7 @@ +*~ +\#* +.#* +.classpath +.project +.idea +*.iml \ No newline at end of file diff --git a/home/dot-local/share/git/message b/home/dot-local/share/git/message new file mode 100644 index 0000000..d8566ec --- /dev/null +++ b/home/dot-local/share/git/message @@ -0,0 +1,14 @@ +# 50-character subject line +# +# 72-character wrapped longer description. This should answer: +# +# * Why was this change necessary? +# * How does it address the problem? +# * Are there any side effects? +# +# Include a link to the ticket, if any. +# +# Add co-authors if you worked on this code with others: +# +# Co-authored-by: Full Name +# Co-authored-by: Full Name \ No newline at end of file diff --git a/home/dot-local/share/git/templates/hooks/applypatch-msg.sample b/home/dot-local/share/git/templates/hooks/applypatch-msg.sample new file mode 100755 index 0000000..09b38a8 --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/usr/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/home/dot-local/share/git/templates/hooks/commit-msg.sample b/home/dot-local/share/git/templates/hooks/commit-msg.sample new file mode 100755 index 0000000..3ced146 --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/usr/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/home/dot-local/share/git/templates/hooks/fsmonitor-watchman.sample b/home/dot-local/share/git/templates/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..14ed0aa --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/fsmonitor-watchman.sample @@ -0,0 +1,173 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + } + my $query = <<" END"; + ["query", "$git_work_tree", { + "since": $last_update_token, + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/home/dot-local/share/git/templates/hooks/post-update.sample b/home/dot-local/share/git/templates/hooks/post-update.sample new file mode 100755 index 0000000..ee496e3 --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/usr/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/home/dot-local/share/git/templates/hooks/pre-applypatch.sample b/home/dot-local/share/git/templates/hooks/pre-applypatch.sample new file mode 100755 index 0000000..845130a --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/usr/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/home/dot-local/share/git/templates/hooks/pre-commit.sample b/home/dot-local/share/git/templates/hooks/pre-commit.sample new file mode 100755 index 0000000..be32e5f --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/usr/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/home/dot-local/share/git/templates/hooks/pre-merge-commit.sample b/home/dot-local/share/git/templates/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..09b65a5 --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/usr/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/home/dot-local/share/git/templates/hooks/pre-push.sample b/home/dot-local/share/git/templates/hooks/pre-push.sample new file mode 100755 index 0000000..d5e513d --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/usr/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/home/dot-local/share/git/templates/hooks/pre-rebase.sample b/home/dot-local/share/git/templates/hooks/pre-rebase.sample new file mode 100755 index 0000000..36efc64 --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/usr/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/home/dot-local/share/git/templates/hooks/pre-receive.sample b/home/dot-local/share/git/templates/hooks/pre-receive.sample new file mode 100755 index 0000000..6f473c3 --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/usr/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/home/dot-local/share/git/templates/hooks/prepare-commit-msg.sample b/home/dot-local/share/git/templates/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..cd8e794 --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/usr/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/home/dot-local/share/git/templates/hooks/push-to-checkout.sample b/home/dot-local/share/git/templates/hooks/push-to-checkout.sample new file mode 100755 index 0000000..badb4b4 --- /dev/null +++ b/home/dot-local/share/git/templates/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/usr/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/home/dot-local/share/git/templates/info/exclude b/home/dot-local/share/git/templates/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/home/dot-local/share/git/templates/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/home/dot-local/share/systemd/user/gpg-agent-browser.socket b/home/dot-local/share/systemd/user/gpg-agent-browser.socket new file mode 100644 index 0000000..bc8d344 --- /dev/null +++ b/home/dot-local/share/systemd/user/gpg-agent-browser.socket @@ -0,0 +1,13 @@ +[Unit] +Description=GnuPG cryptographic agent and passphrase cache (access for web browsers) +Documentation=man:gpg-agent(1) + +[Socket] +ListenStream=%t/gnupg/S.gpg-agent.browser +FileDescriptorName=browser +Service=gpg-agent.service +SocketMode=0600 +DirectoryMode=0700 + +[Install] +WantedBy=sockets.target diff --git a/home/dot-local/share/systemd/user/gpg-agent-extra.socket b/home/dot-local/share/systemd/user/gpg-agent-extra.socket new file mode 100644 index 0000000..5b87d09 --- /dev/null +++ b/home/dot-local/share/systemd/user/gpg-agent-extra.socket @@ -0,0 +1,13 @@ +[Unit] +Description=GnuPG cryptographic agent and passphrase cache (restricted) +Documentation=man:gpg-agent(1) + +[Socket] +ListenStream=%t/gnupg/S.gpg-agent.extra +FileDescriptorName=extra +Service=gpg-agent.service +SocketMode=0600 +DirectoryMode=0700 + +[Install] +WantedBy=sockets.target diff --git a/home/dot-local/share/systemd/user/gpg-agent-ssh.socket b/home/dot-local/share/systemd/user/gpg-agent-ssh.socket new file mode 100644 index 0000000..838dce1 --- /dev/null +++ b/home/dot-local/share/systemd/user/gpg-agent-ssh.socket @@ -0,0 +1,14 @@ +[Unit] +Description=GnuPG cryptographic agent (ssh-agent emulation) +Documentation=man:gpg-agent(1) man:ssh-add(1) man:ssh-agent(1) man:ssh(1) + +[Socket] +ListenStream=%t/gnupg/S.gpg-agent.ssh +ExecStartPost=/usr/bin/systemctl --user set-environment SSH_AUTH_SOCK=%t/gnupg/S.gpg-agent.ssh +FileDescriptorName=ssh +Service=gpg-agent.service +SocketMode=0600 +DirectoryMode=0700 + +[Install] +WantedBy=sockets.target diff --git a/home/dot-local/share/systemd/user/gpg-agent.service b/home/dot-local/share/systemd/user/gpg-agent.service new file mode 100644 index 0000000..a050fcc --- /dev/null +++ b/home/dot-local/share/systemd/user/gpg-agent.service @@ -0,0 +1,8 @@ +[Unit] +Description=GnuPG cryptographic agent and passphrase cache +Documentation=man:gpg-agent(1) +Requires=gpg-agent.socket + +[Service] +ExecStart=/usr/bin/gpg-agent --supervised +ExecReload=/usr/bin/gpgconf --reload gpg-agent diff --git a/home/dot-local/share/systemd/user/gpg-agent.socket b/home/dot-local/share/systemd/user/gpg-agent.socket new file mode 100644 index 0000000..4257c2c --- /dev/null +++ b/home/dot-local/share/systemd/user/gpg-agent.socket @@ -0,0 +1,12 @@ +[Unit] +Description=GnuPG cryptographic agent and passphrase cache +Documentation=man:gpg-agent(1) + +[Socket] +ListenStream=%t/gnupg/S.gpg-agent +FileDescriptorName=std +SocketMode=0600 +DirectoryMode=0700 + +[Install] +WantedBy=sockets.target diff --git a/home/dot-ssh/config b/home/dot-ssh/config new file mode 100644 index 0000000..6af51f5 --- /dev/null +++ b/home/dot-ssh/config @@ -0,0 +1,24 @@ + +Host github.com + User git + ControlMaster auto + ControlPersist 120 + +Host * + # Always use SSH2. + Protocol 2 + + # Use a shared channel for all sessions to the same host, + # instead of always opening a new one. This leads to much + # quicker connection times. + ControlMaster auto + ControlPath ~/.cache/ssh/mux_%r@%h:%p + ControlPersist 1h + + # Miscellaneous + Compression yes + TCPKeepAlive yes + ServerAliveInterval 20 + ServerAliveCountMax 10 + +Include ~/.ssh/config.d/* \ No newline at end of file diff --git a/home/dot-ssh/config.d/config.localhost b/home/dot-ssh/config.d/config.localhost new file mode 100644 index 0000000..e69de29