gadd
Easily select the modified or untracked files from a list to stage them for the next commit.
Table of contents
Demo
Internals
git add <filepath>
add file contents to the index.
git add --intent-to-add <filepath>
An entry for the path is placed in the index with no content. This is useful for showing the contents of a new file with git diff
Implementation
#shellcheck disable=SC1091
#shellcheck disable=SC2155
source "$__CUSTOM_GIT_UTIL"/__intend_to_add_untracked_files
source "$__CUSTOM_GIT_UTIL"/__reset_intend_to_add_files
source "$__CUSTOM_GIT_UTIL"/fzf_headers/__gadd_header
source "$__CUSTOM_CONSOLE_UTIL"/__trim_double_quotes
source "$__CUSTOM_CONSOLE_UTIL"/__print_info
source "$__CUSTOM_CONSOLE_UTIL"/__print_err
source "$__CUSTOM_CONSOLE_UTIL"/__split_str
# ensure the command is run in a git repo
source "${__CUSTOM_GIT_UTIL}"/__assertgitrepo
__assertgitrepo
function main() {
local numUnstagedFiles=$(git status --short | grep "^.[A-Z?] " -c)
if [[ $numUnstagedFiles -eq 0 ]]; then
gstatus
echo
__print_info "No unstaged files."
return
fi
__intend_to_add_untracked_files
local GADD_HEADER="$(__gadd_header)"
git status --short | grep "^.[A-Z?] " |\
fzf -m --color 'fg:160'\
--bind 'q:abort'\
--bind '?:toggle-preview'\
--bind 'ctrl-r:refresh-preview'\
--header "${GADD_HEADER}"\
--preview "source $__CUSTOM_GIT_UTIL/fzf_previews/__gdiff_preview; __gdiff_preview {}" |\
read_and_stage_files
__reset_intend_to_add_files
gstatus
}
function read_and_stage_files() {
while read -r str; do
if [[ ${str:0:1} != "R" ]]; then
if [[ ${str:1:1} == " " ]]; then
local file="${str#"${str:0:2}"}"
else
local file="${str#"${str:0:3}"}"
fi
stage_file "${file}"
continue
fi
__split_str "${str}" " -> "
local oldFile="${RESULT_ARR[0]}"
local newFile="${RESULT_ARR[1]}"
if [[ "${oldFile:1:1}" == " " ]]; then
oldFile="${oldFile#"R "}"
stage_file "${oldFile}"
fi
stage_file "${newFile}"
done
}
function stage_file() {
file="$(__trim_double_quotes "${1}")"
git add "${file}"
}
if [[ $# -eq 0 ]]; then
main
exit 0
fi
if [[ $# -eq 1 && ( "$*" == "." || "$*" == "-A" ) ]]; then
git add "$*"
gstatus
exit 0
fi
__print_err "valid inputs to gadd: \".\", \"-A\""