2023-12-21 22:49:17 +01:00
#!/bin/sh
2023-12-22 01:54:52 +01:00
identities = " $HOME /.local/share/git/identities " ;
2023-12-22 16:34:35 +01:00
mkdir -p " $identities " ;
2023-12-22 01:54:52 +01:00
2023-12-22 12:37:34 +01:00
function yes_or_no { # courtesy of: https://stackoverflow.com/a/29436423
while true; do
2023-12-22 17:27:23 +01:00
read -p " $* [y/n]: " yn;
2023-12-22 12:37:34 +01:00
case $yn in
2023-12-22 17:27:23 +01:00
[ Yy] *) return 0 ; ;
2023-12-22 12:37:34 +01:00
[ Nn] *) return 1 ; ;
esac
done
}
2023-12-22 12:08:01 +01:00
function get_identity( ) {
2023-12-22 12:37:34 +01:00
filepath = " $identities / $1 " ;
identity = " $1 " ; # TODO: match from partial names and set this to the correct one
2023-12-22 12:22:30 +01:00
sigkey = $( git config -f " $filepath " user.signingKey) ;
2023-12-22 17:27:23 +01:00
name = $( git config -f " $filepath " user.name) ;
2023-12-22 12:22:30 +01:00
email = $( git config -f " $filepath " user.email) ;
}
function display_parts( ) {
local identity = " $1 " ;
local name = " $2 " ;
local email = " $3 " ;
local sigkey = " $4 " ;
printf " [ $identity ] $name < $email > " ;
if [ ! -z $sigkey ] ; then
printf " (signing key: $sigkey ) " ;
fi
printf "\n" ;
}
function display_identity( ) {
2023-12-22 12:37:34 +01:00
local name email sigkey;
2023-12-22 12:22:30 +01:00
get_identity $1 ;
2023-12-22 12:37:34 +01:00
display_parts " $identity " " $name " " $email " " $sigkey " ;
2023-12-22 12:08:01 +01:00
}
2023-12-22 02:23:39 +01:00
function import_identity( ) {
local gpg_key_id = " $1 "
filepath = " $identities / $2 " ;
2023-12-22 01:54:52 +01:00
2023-12-22 02:23:39 +01:00
local uid_regex = "([^\(]* )\s*(\((.*)\))?\s*<(.*)>" ;
local uid = $( gpg --with-colons -K $gpg_key_id | awk -F: '$1=="uid" {print $10; exit}' ) ;
2023-12-22 01:54:52 +01:00
if [ -z " $uid " ] ; then
echo "ERROR: found no gpg key matching this" ;
exit 1;
fi
2023-12-22 02:23:39 +01:00
local name = $( printf " $uid " | sed -Ee " s/ $uid_regex /\1/ " | xargs) ;
local email = $( printf " $uid " | sed -Ee " s/ $uid_regex /\4/ " ) ;
2023-12-22 01:54:52 +01:00
2023-12-22 17:27:23 +01:00
git config -f " $filepath " user.name " $name " ;
git config -f " $filepath " user.email " $email " ;
2023-12-22 01:54:52 +01:00
2023-12-22 02:23:39 +01:00
local keyid = $( gpg -K --with-colon $1 | awk -F: '$12~/.*s.*/ {print $5; exit}' ) ;
2023-12-22 01:54:52 +01:00
# TODO: if multiple found, bring up a dialog to select the right key
if [ -z " $keyid " ] ; then
echo "WARNING: found no subkey with signing capabilities. No signing key will be set" ;
2023-12-22 02:23:39 +01:00
git config -f " $filepath " --unset user.signingKey;
2023-12-22 01:54:52 +01:00
else
2023-12-22 02:23:39 +01:00
git config -f " $filepath " user.signingKey " $keyid " ;
2023-12-22 01:54:52 +01:00
fi
}
2023-12-22 12:08:01 +01:00
function list_identities( ) {
2023-12-22 12:22:30 +01:00
if [ -z " $( ls -A " $identities " ) " ] ; then
echo "no identities to display" ;
exit 0;
fi
2023-12-22 12:08:01 +01:00
local sigkey name email;
for id_file in $identities /*; do
2023-12-22 12:22:30 +01:00
identity = " $( basename " $id_file " ) " ;
get_identity " $identity " ;
display_parts " $identity " " $name " " $email " " $sigkey " ;
2023-12-22 12:08:01 +01:00
done
}
2023-12-22 01:54:52 +01:00
case $1 in
2023-12-22 02:23:39 +01:00
import)
if [ -z " $2 " ] ; then
echo "USAGE:" ;
2023-12-22 18:06:37 +01:00
echo " git identity import <gpg_key_id> [identity]" ;
2023-12-22 02:23:39 +01:00
echo;
2023-12-22 18:06:37 +01:00
echo "Imports an identity from a gpg key. If no name is provided for this identity, it will by default to the identifier you provided for your gpg key" ;
2023-12-22 02:23:39 +01:00
exit 1;
fi
if [ -z " $3 " ] ; then
2023-12-22 12:22:30 +01:00
identity = " $2 " ;
2023-12-22 02:23:39 +01:00
else
2023-12-22 12:22:30 +01:00
identity = " $3 " ;
2023-12-22 02:23:39 +01:00
fi
2023-12-22 12:22:30 +01:00
import_identity " $2 " " $identity " ;
2023-12-22 02:23:39 +01:00
2023-12-22 12:22:30 +01:00
echo " imported into $filepath : "
display_identity " $identity " ;
2023-12-22 01:54:52 +01:00
; ;
2023-12-22 12:37:34 +01:00
remove)
if [ -z " $2 " ] ; then
echo "USAGE:" ;
echo " git identity remove <identity>" ;
echo;
echo "Removes a saved identity. This is unrecoverable; You'll need to re-import / add it yourself again." ;
exit 1;
fi
get_identity " $2 " ;
display_identity " $identity " ;
yes_or_no "Are you sure ou want to remove this identity ?" && rm " $filepath " ;
; ;
2023-12-22 12:08:01 +01:00
list)
list_identities;
; ;
2023-12-22 17:48:57 +01:00
set )
if [ -z " $2 " ] ; then
echo "USAGE:" ;
echo " git identity set <identity>" ;
echo;
2023-12-22 18:06:37 +01:00
echo "Copies the config from an identity to the local git config." ;
echo "Using set instead of link essentially means that future changes made to the identity will not be synced with the local git config." ;
2023-12-22 17:48:57 +01:00
echo "If you wish for that be the case, consider using the link subcommand." ;
exit 0;
fi
get_identity " $2 " ;
echo "Using this identity:" ;
display_identity " $identity " ;
git config user.name " $name " ;
[ ! -z " $email " ] && git config user.email " $email " ;
[ ! -z " $sigkey " ] && git config user.signingKey " $sigkey " ;
; ;
2023-12-22 18:06:37 +01:00
include)
if [ -z " $2 " ] ; then
echo "USAGE:" ;
echo " git identity include <identity>" ;
echo;
echo "Modifies the local git config to \"[include]\" an identity." ;
echo "Further changes made to the identity will thus be kept in sync with the local git config." ;
echo "Use this if you don't care about staying consistent in your commits identity." ;
echo "If you wish for your commits to stay consistent and always refer to you in the same way, consider using the set subcommand instead." ;
fi
; ;
2023-12-22 17:52:36 +01:00
show)
if [ -z " $2 " ] ; then
display_parts "current" " $( git config user.name) " " $( git config user.email) " " $( git config user.signingKey) " ;
else
display_identity " $2 " ;
fi
; ;
2023-12-22 01:54:52 +01:00
*)
echo "USAGE:" ;
echo " git identity <command>" ;
2023-12-22 02:23:39 +01:00
echo;
2023-12-22 12:08:01 +01:00
echo " Saved identities can be found here: $identities " ;
echo;
2023-12-22 17:27:23 +01:00
echo "COMMANDS:" ;
echo " import: import an identity from a gpg key" ;
2023-12-22 12:37:34 +01:00
echo " remove: removes a saved identity" ;
2023-12-22 17:27:23 +01:00
echo " set: sets the identity of the current git repo" ;
2023-12-22 18:06:37 +01:00
echo " include: links the global identity file to your current git repo." ;
2023-12-22 17:27:23 +01:00
echo " show: show a saved identity or the identity of the current repo" ;
echo " list: list all saved identities" ;
2023-12-22 01:54:52 +01:00
exit 1;
; ;
esac