#!/bin/bash # # Stage the selected file to git bare repo # # @params # Globals # ${new_file}: new file path to stage # ${new_folder}: new folder to stage # ${stage_file}: changed file to stage mydir="${0%/*}" source "${mydir}"/../helper/search_file [[ -z "${DOTBARE_DIR}" ]] && DOTBARE_DIR="$HOME/.cfg/" [[ -z "${DOTBARE_TREE}" ]] && DOTBARE_TREE="$HOME" function usage() { echo -e "Usage: dotbare fadd [-h] [-f] [-d] ...\n" echo -e "Stage the selected file to the dotfile gitbare repo" echo -e "Press escape to stop staging file\n" echo -e "optional arguments:" echo -e " -h\t\tshow this help message and exit" echo -e " -f\t\tselect a file in current directory and stage it" echo -e " -d\t\tselect a entire folder to stage" } function stage_file() { local file=$1 if [[ -z "${file}" ]] then exit 0 else /usr/bin/git --git-dir="${DOTBARE_DIR}" --work-tree="${DOTBARE_TREE}" add "${file}" echo "${file} staged successfully" fi } new_file='' new_folder='' while getopts ":fhd" opt do case "$opt" in f) new_file=$(search_file 'f') [[ -z "${new_file}" ]] && exit 1 break ;; h) usage exit 0 ;; d) new_folder=$(search_file 'd') [[ -z "${new_folder}" ]] && exit 1 break ;; *) echo "Invalid option: ${OPTARG}" >&2 usage exit 1 ;; esac done if [[ -n "${new_file}" ]]; then while IFS= read -r line; do stage_file "${line}" done <<< "${new_file}" elif [[ -n "${new_folder}" ]]; then while IFS= read -r line; do stage_file "${line}" done <<< "${new_folder}" else selected_files=$(/usr/bin/git --git-dir="${DOTBARE_DIR}" --work-tree="${DOTBARE_TREE}" diff --name-status | \ awk '{if ($1 == "D") {print "\033[31m" $1 " " $2} else {print "\033[33m" $1 " " $2}}' | \ fzf --ansi --multi --exit-0 --preview "echo {} | awk '{print \$2}' | \ xargs -I __ /usr/bin/git --git-dir="${DOTBARE_DIR}" --work-tree="${DOTBARE_TREE}" diff --color=always $HOME/__" | \ awk -v home=$HOME '{print home "/" $2}') while IFS= read -r line; do stage_file "${line}" done <<< "${selected_files}" fi