[core]
	autocrlf = input
	editor = nvim
	hooksPath = .dev/githooks
[submodule]
	recurse = true
[rerere]
	enabled = true

# Parallelize
[pack]
	threads = 0
[checkout]
	workers = 0
[fetch]
	parallel = 0
[submodule]
	fetchJobs = 0

# Create & Sync
[pull]
	ff = only
[checkout]
	defaultRemote = origin
[init]
	defaultBranch = main
[push]
	default = current # Automatically push to branch with matching name

# Editor
[diff]
	tool = nvim
	submodule = log
	context = 2
	renames = copy
	colorMoved = dimmed-zebra
	colorMovedWS = allow-indentation-change
[merge]
	tool = nvim
[mergetool "nvim"]
	cmd = nvim -f -c \"Gdiffsplit!\" \"$MERGED\"
	prompt = false
[difftool "nvim"]
	cmd = "nvim -d \"$LOCAL\" \"$REMOTE\""

[pager]
	branch = false # Disable pagination for branch list
[status]
	showStash
[grep]
	lineNumber
[log]
	date=local
	follow
[commit]
	verbose

[color "status"]
	added = green
	changed = yellow
	untracked = magenta

[user]
	email = 27jf@pm.me
	name = xeruf

[mailmap]
	file = /home/janek/.config/yadm/.mailmap

[http]
	lowSpeedLimit = 100
	lowSpeedTime = 10

[url "ssh://github.com/"]
	pushInsteadOf = https://github.com/

[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true

[alias]
	# GET INFO
	# status
	s = !git stl && git stb
	st = stb .
	stb = status --short --branch --find-renames=.2
	sv = --paginate status -v
	svv = --paginate status -vv

	tl = !git ls-tree --full-tree --name-only -r HEAD | tree -C --fromfile . | ${PAGER:-less}
	tree = !git ls-tree --name-only -r HEAD | tree -C --fromfile . | ${PAGER:-less}

	# repo
	r = remote -v
	b = branch -vv
	ba = b -a

	main = !cat "$(git rev-parse --git-path refs/remotes/origin/HEAD)" | cut -d'/' -f4
	curbranch = symbolic-ref --short HEAD
	upstream = !git rev-parse --abbrev-ref --symbolic-full-name @{upstream} || git rev-parse --abbrev-ref --symbolic-full-name @{push} || echo origin/$(git curbranch)

	rev = rev-parse --short
	head = rev-parse --short HEAD
	root = rev-parse --show-toplevel
	dir = rev-parse --git-dir

	# history
	lgr = log --pretty=tformat:'%C(auto)%h%d %s %Cgreen(%cd) %Cblue<%an>%Creset' --date=human --graph
	lg = lgr HEAD @{push}
	lo = log --pretty=tformat:'%C(auto)%h%d %s %Cgreen(%cd) %Cblue<%an>%Creset' --date=human --no-merges
	lp = log -p --date=local # Like --full-diff
	my = lo --author "xeru\\|anek"

	standup = my --since yesterday --all
	co-authors = !git log | grep -i Co-Authored | awk '!a[$0]++'
	when = !git for-each-ref --sort=committerdate --format='%(refname:short) * %(authorname) * %(committerdate:relative)' refs/remotes/ # List all branches with their last updates

	find = log --patch --all --full-history # Find a filename in all git knows
	ref = reflog show --pretty=tformat:'%C(auto)%h%d %s %Cgreen(%cd) %Cblue<%an>%Creset'
	history = log --patch --follow --find-renames=1 -- # Show the history of the given file

	# diffs
	d = diff
	dm = !git diff $(git merge-base $(git main) HEAD) # [d]iff to [m]ain
	dw = diff --color-words # [d]iff [w]ords
	dc = diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+" # [d]iff [c]haracters
	du = diff @{push} # [d]iff [u]pstream

	# MODIFY

	sw = switch
	sc = switch -c
	sd = switch -d
	sm = !git switch $(git main)

	# Local Changes
	a = add -u
	aa = add -u .
	ap = add -p

	c = commit -v
	cad = !git diff-tree --no-commit-id --name-only -r HEAD | git commit -v --amend --pathspec-from-file=- # Amend commit with all already changed files
	cme = commit -v --edit --message # Commit with message but edit it

	cp = cherry-pick
	cpc = cherry-pick --continue
	rb = rebase
	rbi = rebase --interactive
	rbc = rebase --continue
	rbu = rebase @{upstream} --autostash
	rbm = !git rebase $(git main)

	sta = stash
	stl = !git --no-pager stash list --pretty=tformat:'%gd%h - %s (%cr)'
	sts = stash show -v
	stp = stash pop
	std = !git stash drop && git stl

	rh = reset HEAD~
	rs = reset --keep
	rsu = reset --keep @{upstream}
	unstage = restore --staged --
	recover = restore --worktree --staged --

	format-head = !git stash && git-clang-format HEAD~ && git commit -a --amend --no-edit && git stash pop

	sun = submodule update --no-fetch
	# Fetch
	su = submodule update --init --recursive

	f = fetch
	fa = fetch --all
	fs = !git fetch && git st
	lr = pull --rebase
	lu = !git pull --rebase upstream ${1:-$(git curbranch)}

	# Push
	ruu = !git fetch upstream && git reset --keep upstream/${1:-$(git curbranch)} && git push --no-verify --force-with-lease
	luu = !git pull upstream ${1:-$(git curbranch)} && git push --no-verify
	pf = push --force-with-lease
	cap = !git commit --amend --no-edit && git push --force-with-lease

	# CLEANUP
	gcr = !git gc && git repack -a -d
	# see git-prunerefs

[include]
	path= "diffr"
[includeIf "gitdir:yadm/repo.git"]
	path = "~/.config/yadm/gitconfig"
