From b5169704ef6aefdc62f2ad7717ffa00b75dba71d Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Wed, 25 Jan 2023 16:23:57 -0500 Subject: [PATCH 01/64] work in progress --- bgps | 49 +++++++++++++++---------------------------------- 1 file changed, 15 insertions(+), 34 deletions(-) mode change 100644 => 100755 bgps diff --git a/bgps b/bgps old mode 100644 new mode 100755 index f1101cd..6a24213 --- a/bgps +++ b/bgps @@ -46,7 +46,7 @@ _eread () # Arguments: $error_message ####################################### _err() { - echo "bgps: ${1}" >&2 + printf -- "bgps: ${1}" >&2 } ####################################### @@ -73,7 +73,7 @@ _file_exists() { ####################################### _remove_quotes() { local no_quote="${1%\"}" - echo "${no_quote#\"}" + printf -- "%s" "${no_quote#\"}" } ####################################### @@ -108,7 +108,7 @@ _get_config_value() { local key="${1^^}" local default_value="${2}" local value="${BGPS_CONFIG[${key}]}" - [[ -z "${value}" ]] && echo "${default_value}" || echo "${value}" + [[ -z "${value}" ]] && printf -- "%s" "${default_value}" || printf -- "%s" "${value}" } ####################################### @@ -198,7 +198,7 @@ _bgps_globals() { "BGPS_USER_CONFIG" "BGPS_CHECKSUM" ) - echo "${valid_globals[@]}" + printf -- "%s " "${valid_globals[@]}" } ####################################### @@ -220,13 +220,13 @@ _bgps_config_keys() { "PS1_FORMAT" "TEXT_COLOR" ) - echo "${valid_config_keys[@]}" + printf -- "%s " "${valid_config_keys[@]}" } _print_config_value() { local key="${1}" local value="${2}" - printf " %-*s = %s\n" 22 "${key}" "${value}" + printf -- " %-*s = %s\n" 22 "${key}" "${value}" } ####################################### @@ -240,14 +240,14 @@ _print_config_value() { _print_config() { local bgps_globals=($(_bgps_globals)) local bgps_config_keys=($(_bgps_config_keys)) - echo "BGPS Environment Variables:" + printf -- "BGPS Environment Variables:" for key in "${bgps_globals[@]}" ; do # exclude BGPS_CONFIG because it is an associative array if [[ "${key}" != "BGPS_CONFIG" ]] ; then _print_config_value "${key}" "${!key}" fi done - echo "BGPS Configuration:" + printf -- "BGPS Configuration:" for key in "${bgps_config_keys[@]}" ; do _print_config_value "${key}" "${BGPS_CONFIG[${key}]}" done @@ -358,7 +358,7 @@ _branch_info() { branch="${branch##refs/heads/}" - echo "${prefix}${branch}${merge_status}" + printf -- "%s%s%s" "${prefix}" "${branch}" "${merge_status}" return 0 } @@ -452,19 +452,19 @@ _bgps_git_status() { fi if [[ ${color_enabled} == "true" ]] ; then - printf "%s" "${git_color}" + printf -- "%s" "${git_color}" fi - echo "${prefix:+${prefix}}${git_branch}${git_symbol:+ ${git_symbol}}${postfix:+${postfix}}" + printf -- "%s%s%s%s" "${prefix:+${prefix}}" "${git_branch}" "${git_symbol:+ ${git_symbol}}" "${postfix:+${postfix}}" else if [[ ${color_enabled} == "true" ]] ; then - printf "%s" "${color_dirty}" + printf -- "%s" "${color_dirty}" fi local state_dir="${HOME}/.local/state/bgps" local log_file="${state_dir}/log" mkdir -p "${state_dir}" - echo "$(date +%FT%T):" "${diff_error}" >> "${log_file}" - printf "[bgps: error see %s for information]" "${log_file}" + printf -- "%s: %s" "$(date +%FT%T)" "${diff_error}" >> "${log_file}" + printf -- "[bgps: error see %s for information]" "${log_file}" fi return 0 @@ -503,35 +503,16 @@ _bgps_prompt() { RESET_COLOR="\[\033[0m\]" declare -A BGPS_CONFIG -list_config="false" BGPS_GLOBAL_CONFIG="${BGPS_GLOBAL_CONFIG-/etc/bgps_config}" BGPS_USER_CONFIG="${BGPS_USER_CONFIG-${HOME}/.bgps_config}" -while [[ $# > 0 ]]; do - case "${1:2}" in - "ls-config") - list_config="true" - ;; - "config-file") - shift - bgps_config_file="${1}" - ;; - esac - shift -done - if _set_config "${bgps_config_file}" ; then - if [[ "true" == "${list_config}" ]] ; then - _print_config - else - _bgps_prompt - fi + _bgps_prompt fi # unset variables and functions unset RESET_COLOR unset bgps_config_file -unset list_config unset -f _err unset -f _file_exists unset -f _remove_quotes From 9b29f54384e34a5a2e8e713caaf966219efb2514 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Fri, 10 Feb 2023 11:22:57 -0500 Subject: [PATCH 02/64] fix: bare repo logic and run shellcheck --- bgps | 172 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 85 insertions(+), 87 deletions(-) diff --git a/bgps b/bgps index 6a24213..c44ce97 100755 --- a/bgps +++ b/bgps @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # Copyright (C) 2017 Michael Smith # Copyright (C) 2006,2007 Shawn O. Pearce @@ -38,7 +38,7 @@ _eread () { local filepath="${1}" shift - [[ -r "${filepath}" ]] && read "$@" <"${filepath}" + [[ -r "${filepath}" ]] && read -r "$@" <"${filepath}" } ####################################### @@ -46,7 +46,7 @@ _eread () # Arguments: $error_message ####################################### _err() { - printf -- "bgps: ${1}" >&2 + printf -- "bgps: %s" "${1}" >&2 } ####################################### @@ -84,7 +84,7 @@ _remove_quotes() { # $value the config map value ####################################### _set_config_value() { - local valid_config_keys=($(_bgps_config_keys)) + IFS=" " read -r -a valid_config_keys <<< "$(_bgps_config_keys)" local key="${1^^}" local value="${2}" for valid_key in "${valid_config_keys[@]}" ; do @@ -171,9 +171,9 @@ _set_config() { if (( "${#configs[@]}" )) ; then if [[ $OSTYPE == darwin* ]]; then # OSX does not have md5sum binary by default - hash_code="$(md5 -r "${configs[@]}" | awk {'print $1'} ORS="")" + hash_code="$(md5 -r "${configs[@]}" | awk '{print $1}' ORS="")" else - hash_code="$(md5sum "${configs[@]}" | awk {'print $1'} ORS="")" + hash_code="$(md5sum "${configs[@]}" | awk '{print $1}' ORS="")" fi fi @@ -229,30 +229,6 @@ _print_config_value() { printf -- " %-*s = %s\n" 22 "${key}" "${value}" } -####################################### -# Pretty print bgps enfironment variables and bgps configuration map -# Globals: -# $BGPS_CONFIG -# $BGPS_GLOBAL_CONFIG -# $BGPS_USER_CONFIG -# $BGPS_CHECKSUM -####################################### -_print_config() { - local bgps_globals=($(_bgps_globals)) - local bgps_config_keys=($(_bgps_config_keys)) - printf -- "BGPS Environment Variables:" - for key in "${bgps_globals[@]}" ; do - # exclude BGPS_CONFIG because it is an associative array - if [[ "${key}" != "BGPS_CONFIG" ]] ; then - _print_config_value "${key}" "${!key}" - fi - done - printf -- "BGPS Configuration:" - for key in "${bgps_config_keys[@]}" ; do - _print_config_value "${key}" "${BGPS_CONFIG[${key}]}" - done -} - ####################################### # Get current git branch and additional repository information # Returns: 0 on success @@ -269,12 +245,11 @@ _branch_info() { fi local short_sha - if (( ! ${rev_parse_exit_code} )) ; then + if (( !rev_parse_exit_code )) ; then short_sha="${repo_info##*$'\n'}" repo_info="${repo_info%$'\n'*}" fi - local inside_worktree="${repo_info##*$'\n'}" repo_info="${repo_info%$'\n'*}" local bare_repo="${repo_info##*$'\n'}" repo_info="${repo_info%$'\n'*}" @@ -365,28 +340,38 @@ _branch_info() { ####################################### # Get git status format # Globals: -# $RESET_COLOR +# $stop_color # $BGPS_CONFIG # Returns: 0 on success ####################################### _bgps_git_status() { - local color_enabled="$(_get_config_value 'GIT_COLOR_ENABLED' 'false')" - local color_clean="$(_get_config_value 'GIT_COLOR_CLEAN' '\[\033[2;92m\]')" - local color_no_upstream="$(_get_config_value 'GIT_COLOR_NO_UPSTREAM' '\[\033[2;40m\]')" - local color_untracked="$(_get_config_value 'GIT_COLOR_UNTRACKED' '\[\033[2;95m\]')" - local color_dirty="$(_get_config_value 'GIT_COLOR_DIRTY' '\[\033[2;91m\]')" - local color_conflict="$(_get_config_value 'GIT_COLOR_CONFLICT' '\[\033[0;33m\]')" - local prefix="$(_get_config_value 'GIT_PREFIX' '')" - local postfix="$(_get_config_value 'GIT_POSTFIX' '')" - local git_ahead="$(_get_config_value 'GIT_AHEAD' '[ahead %s]')" - local git_behind="$(_get_config_value 'GIT_BEHIND' '[behind %s]')" - local git_diverged="$(_get_config_value 'GIT_DIVERGED' '[ahead %a] [behind %b]')" - local git_color="${RESET_COLOR}" + local color_enabled + color_enabled="$(_get_config_value 'GIT_COLOR_ENABLED' 'false')" + local color_clean + color_clean="$(_get_config_value 'GIT_COLOR_CLEAN' '\[\033[2;92m\]')" + local color_no_upstream + color_no_upstream="$(_get_config_value 'GIT_COLOR_NO_UPSTREAM' '\[\033[2;40m\]')" + local color_untracked + color_untracked="$(_get_config_value 'GIT_COLOR_UNTRACKED' '\[\033[2;95m\]')" + local color_dirty + color_dirty="$(_get_config_value 'GIT_COLOR_DIRTY' '\[\033[2;91m\]')" + local color_conflict + color_conflict="$(_get_config_value 'GIT_COLOR_CONFLICT' '\[\033[0;33m\]')" + local prefix + prefix="$(_get_config_value 'GIT_PREFIX' '')" + local postfix + postfix="$(_get_config_value 'GIT_POSTFIX' '')" + local git_ahead + git_ahead="$(_get_config_value 'GIT_AHEAD' '[ahead %s]')" + local git_behind + git_behind="$(_get_config_value 'GIT_BEHIND' '[behind %s]')" + local git_diverged + git_diverged="$(_get_config_value 'GIT_DIVERGED' '[ahead %a] [behind %b]')" + local git_color="${stop_color}" local git_symbol="" local git_branch - git_branch="$(_branch_info)" - if (( ${?} )) ; then + if ! git_branch="$(_branch_info)"; then return 1 fi @@ -396,57 +381,67 @@ _bgps_git_status() { # TODO: move logic to function local empty_git_error="ambiguous argument 'HEAD'" + local no_upstream_git_error="no upstream configured" + local no_such_branch_git_error="no such branch" local no_upstream=0 - if [[ "${diff_error}" == *"${empty_git_error}"* ]]; then + if [[ "${diff_error}" == *"${empty_git_error}"* ]] || [[ "${diff_error}" == *"${no_upstream_git_error}"* ]] || [[ "${diff_error}" == *"${no_such_branch_git_error}"* ]]; then no_upstream=1 + # there is no upstream so compare against staging area + diff_error=$(git diff --cached --no-ext-diff --quiet 2>&1) + dirty_exit_code="${?}" # code == 0 clean working tree, code == 1 dirty working tree fi + local untracked_exit_code="1" # code == 0 untracked files exist, code > 0 no untracked files # allow no upstream error to passthrough to apply coloring and formatting if (( "${dirty_exit_code}" == 0 )) || (( "${dirty_exit_code}" == 1 )) || (( "${no_upstream}" )); then - - if ((! ${no_upstream})); then - git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null - local untracked_exit_code="${?}" # code == 0 untracked files exist, code > 0 no untracked files - - local commit_counts - commit_counts=($(git rev-list --left-right --count ...@{u} 2>/dev/null)) - local commit_counts_exit_code="${?}" + + git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null + untracked_exit_code="${?}" # code == 0 untracked files exist, code > 0 no untracked files + + local commit_counts + local commit_counts_exit_code + if ((no_upstream)); then + ahead_count="$(git rev-list --count HEAD 2>/dev/null)" + commit_counts=("$ahead_count" 0) + commit_counts_exit_code="${?}" + else + IFS=$'\t' read -r -a commit_counts <<< "$(git rev-list --left-right --count ...'@{u}' 2>/dev/null)" + commit_counts_exit_code="${?}" # TODO: double check refactor on line above doesn't break this fi - if ((${no_upstream})) || (( ${commit_counts_exit_code} )) ; then - # no upstream configured for branch - git_color="${color_no_upstream}" - else - if (( ! ${dirty_exit_code} )) ; then + if ((!dirty_exit_code)) ; then git_color="${color_clean}" - fi - - if (( ${commit_counts[0]} )) ; then - git_color="${color_conflict}" - git_symbol="${git_ahead/\%s/${commit_counts[0]}}" - fi + fi - if (( ${commit_counts[1]} )) ; then - git_color="${color_conflict}" - git_symbol="${git_behind/\%s/${commit_counts[1]}}" - fi + if ((commit_counts[0])) ; then + git_color="${color_conflict}" + git_symbol="${git_ahead/\%s/${commit_counts[0]}}" + fi - if (( ${commit_counts[0]} && ${commit_counts[1]} )) ; then - git_symbol="${git_diverged/\%a/${commit_counts[0]}}" - git_symbol="${git_symbol/\%b/${commit_counts[1]}}" - fi + if ((commit_counts[1])) ; then + git_color="${color_conflict}" + git_symbol="${git_behind/\%s/${commit_counts[1]}}" + fi + if ((commit_counts[0] && commit_counts[1])) ; then + git_symbol="${git_diverged/\%a/${commit_counts[0]}}" + git_symbol="${git_symbol/\%b/${commit_counts[1]}}" fi # continue to check for untracked and dirty because # it is still possible even without an upstream - if (( ! ${untracked_exit_code} )) ; then - git_color="${color_untracked}" - git_symbol="*${git_symbol}" + if ((no_upstream)) || ((commit_counts_exit_code)) ; then + # no upstream configured for branch + git_color="${color_no_upstream}" + fi + + if ((!untracked_exit_code)) ; then + git_color="${color_untracked}" + git_symbol="*${git_symbol#\*}" fi - if (( ${dirty_exit_code} == 1 )) ; then + if (( dirty_exit_code == 1 )) && ((untracked_exit_code)) ; then git_color="${color_dirty}" git_symbol="*${git_symbol#\*}" fi @@ -473,13 +468,16 @@ _bgps_git_status() { ####################################### # Set formatted git prompt # Globals: -# $RESET_COLOR +# $stop_color # $BGPS_CONFIG ####################################### _bgps_prompt() { - local format="$(_get_config_value 'PS1_FORMAT' "%(%s %)${RESET_COLOR}\$ ")" - local text_color="$(_get_config_value 'TEXT_COLOR' "${RESET_COLOR}")" - local status="$(_bgps_git_status)" + local format + format="$(_get_config_value 'PS1_FORMAT' "%(%s %)${stop_color}\$ ")" + local text_color= + text_color="$(_get_config_value 'TEXT_COLOR' "${stop_color}")" + local status + status="$(_bgps_git_status)" if [[ -z "${status}" ]] ; then format="${format/\%(*\%s*\%)/}" format="${format/\%BGPS_GIT_STATUS/}" @@ -497,21 +495,21 @@ _bgps_prompt() { # Script Definition ########################################################### # Globals: -# $RESET_COLOR escape sequence to reset prompt color +# $stop_color escape sequence to reset prompt color # $BGPS_CONFIG map of config values # $BGPS_CHECKSUM md5sum of config file -RESET_COLOR="\[\033[0m\]" +stop_color="\[\033[0m\]" declare -A BGPS_CONFIG BGPS_GLOBAL_CONFIG="${BGPS_GLOBAL_CONFIG-/etc/bgps_config}" BGPS_USER_CONFIG="${BGPS_USER_CONFIG-${HOME}/.bgps_config}" -if _set_config "${bgps_config_file}" ; then +if _set_config "$@" ; then _bgps_prompt fi # unset variables and functions -unset RESET_COLOR +unset stop_color unset bgps_config_file unset -f _err unset -f _file_exists From 8d50d77d331b4318ed95b4f0d0f68d74cbea3706 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Tue, 13 Jun 2023 20:27:57 -0400 Subject: [PATCH 03/64] chore: bare repo --- bgps | 16 +++++++++++++++- examples/mine | 17 ++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/bgps b/bgps index c44ce97..1c91b89 100755 --- a/bgps +++ b/bgps @@ -217,6 +217,7 @@ _bgps_config_keys() { "GIT_DIVERGED" "GIT_POSTFIX" "GIT_PREFIX" + "GIT_BARE" "PS1_FORMAT" "TEXT_COLOR" ) @@ -367,6 +368,8 @@ _bgps_git_status() { git_behind="$(_get_config_value 'GIT_BEHIND' '[behind %s]')" local git_diverged git_diverged="$(_get_config_value 'GIT_DIVERGED' '[ahead %a] [behind %b]')" + local git_bare + git_bare="$(_get_config_value 'GIT_BARE' '')" local git_color="${stop_color}" local git_symbol="" @@ -375,11 +378,22 @@ _bgps_git_status() { return 1 fi + if [[ "$(git rev-parse --is-bare-repository)" == "true" ]]; then + git_color="${color_no_upstream}" + git_symbol="${git_bare}" + if [[ ${color_enabled} == "true" ]] ; then + printf -- "%s" "${git_color}" + fi + printf -- "%s%s%s%s" "${prefix:+${prefix}}" "${git_branch}" "${git_symbol:+ ${git_symbol}}" "${postfix:+${postfix}}" + return 0 + fi + local diff_error diff_error=$(git diff --no-ext-diff --quiet HEAD 2>&1) local dirty_exit_code="${?}" # code == 0 clean working tree, code == 1 dirty working tree # TODO: move logic to function + # TODO: look in HEAD vs @{u} for bare repo vs normal repo. showing green after commit on bare repo should not local empty_git_error="ambiguous argument 'HEAD'" local no_upstream_git_error="no upstream configured" local no_such_branch_git_error="no such branch" @@ -458,7 +472,7 @@ _bgps_git_status() { local state_dir="${HOME}/.local/state/bgps" local log_file="${state_dir}/log" mkdir -p "${state_dir}" - printf -- "%s: %s" "$(date +%FT%T)" "${diff_error}" >> "${log_file}" + printf -- "%s: %s\n" "$(date +%FT%T)" "${diff_error}" >> "${log_file}" printf -- "[bgps: error see %s for information]" "${log_file}" fi diff --git a/examples/mine b/examples/mine index a6077c2..db0cb29 100644 --- a/examples/mine +++ b/examples/mine @@ -1,12 +1,23 @@ -PS1_FORMAT="$(_bgps_ps1 -u \u -h \h -D \D{%Y-%m-%dT%T} -s \s -V \V -w \w)\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$([[ $(type -t iterm2_prompt_mark) == 'function' ]] && echo \[$(iterm2_prompt_mark)\])$(((${EUID})) && echo '\[\033[0;92m\]' || echo '\[\033[0;91m\]')$(printf "\x1b[%s;2;%sm" '38' '167;192;128')\u@\h $(printf "\x1b[%s;2;%sm" '38' '131;165;152')\$ " -# PS1_FORMAT="$ " +# main version +PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@\h $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " + +# short version safe for screenshare +# PS1_FORMAT="$(printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128')\w $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$ " + +# super short +# PS1_FORMAT="\$ " + GIT_COLOR_ENABLED="true" GIT_PREFIX="  " +GIT_BARE="󱣻" GIT_AHEAD="↑[%s]" GIT_BEHIND="↓[%s]" GIT_DIVERGED="↕ ↑[%a] ↓[%b]" +# GIT_COLOR_CLEAN="\[\033[2;92m\]" GIT_COLOR_CLEAN=$(printf "\x1b[%s;2;%sm" '38' '167;192;128') -GIT_COLOR_NO_UPSTREAM=$(printf "\x1b[%s;2;%sm" '38' '146;131;116')" +GIT_COLOR_NO_UPSTREAM=$(printf "\x1b[%s;2;%sm" '38' '146;131;116') GIT_COLOR_UNTRACKED=$(printf "\x1b[%s;2;%sm" '38' '211;134;155') GIT_COLOR_DIRTY=$(printf "\x1b[%s;2;%sm" '38' '255;105;97') GIT_COLOR_CONFLICT=$(printf "\x1b[%s;2;%sm" '38' '219;188;95') +# idea add fg/bg jobs to prompt + From 8bc27fca8761f1edfe9f95140e8b81ca42ae4aee Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Fri, 1 Mar 2024 22:58:21 -0500 Subject: [PATCH 04/64] chore: start converting to starship prompt --- bgps | 39 ++++++++++++++++++++------------------- examples/mine | 18 ++++++++++++------ 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/bgps b/bgps index 1c91b89..1262a9e 100755 --- a/bgps +++ b/bgps @@ -349,15 +349,15 @@ _bgps_git_status() { local color_enabled color_enabled="$(_get_config_value 'GIT_COLOR_ENABLED' 'false')" local color_clean - color_clean="$(_get_config_value 'GIT_COLOR_CLEAN' '\[\033[2;92m\]')" + color_clean="$(_get_config_value 'GIT_COLOR_CLEAN' '\033[2;92m')" local color_no_upstream - color_no_upstream="$(_get_config_value 'GIT_COLOR_NO_UPSTREAM' '\[\033[2;40m\]')" + color_no_upstream="$(_get_config_value 'GIT_COLOR_NO_UPSTREAM' '\033[2;40m')" local color_untracked - color_untracked="$(_get_config_value 'GIT_COLOR_UNTRACKED' '\[\033[2;95m\]')" + color_untracked="$(_get_config_value 'GIT_COLOR_UNTRACKED' '\033[2;95m')" local color_dirty - color_dirty="$(_get_config_value 'GIT_COLOR_DIRTY' '\[\033[2;91m\]')" + color_dirty="$(_get_config_value 'GIT_COLOR_DIRTY' '\033[2;91m')" local color_conflict - color_conflict="$(_get_config_value 'GIT_COLOR_CONFLICT' '\[\033[0;33m\]')" + color_conflict="$(_get_config_value 'GIT_COLOR_CONFLICT' '\033[0;33m')" local prefix prefix="$(_get_config_value 'GIT_PREFIX' '')" local postfix @@ -475,6 +475,7 @@ _bgps_git_status() { printf -- "%s: %s\n" "$(date +%FT%T)" "${diff_error}" >> "${log_file}" printf -- "[bgps: error see %s for information]" "${log_file}" fi + printf -- '' return 0 } @@ -491,20 +492,20 @@ _bgps_prompt() { local text_color= text_color="$(_get_config_value 'TEXT_COLOR' "${stop_color}")" local status - status="$(_bgps_git_status)" - if [[ -z "${status}" ]] ; then - format="${format/\%(*\%s*\%)/}" - format="${format/\%BGPS_GIT_STATUS/}" - PS1="${format}${text_color}" - else - local placeholder - if [[ "${format}" =~ \%\(.*\%s.*\%\) ]] ; then - placeholder="${BASH_REMATCH[0]#\%\(}" - placeholder="${placeholder%\%\)}" - format="${format/\%(*\%s*\%)/${placeholder}}" - fi - PS1="${format/\%BGPS_GIT_STATUS/${status}}${text_color}" - fi + echo -e "$(_bgps_git_status)$stop_color" + # if [[ -z "${status}" ]] ; then + # format="${format/\%(*\%s*\%)/}" + # format="${format/\%BGPS_GIT_STATUS/}" + # PS1="${format}${text_color}" + # else + # local placeholder + # if [[ "${format}" =~ \%\(.*\%s.*\%\) ]] ; then + # placeholder="${BASH_REMATCH[0]#\%\(}" + # placeholder="${placeholder%\%\)}" + # format="${format/\%(*\%s*\%)/${placeholder}}" + # fi + # PS1="${format/\%BGPS_GIT_STATUS/${status}}${text_color}" + # fi } # Script Definition ########################################################### diff --git a/examples/mine b/examples/mine index db0cb29..24a50e8 100644 --- a/examples/mine +++ b/examples/mine @@ -1,5 +1,11 @@ # main version -PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@\h $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " +# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@local $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " +# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@\h $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " +# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1) $(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@local $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " +# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@local $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " + +# kitty-scrollback.nvim demo +# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@rightmeow $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " # short version safe for screenshare # PS1_FORMAT="$(printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128')\w $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$ " @@ -14,10 +20,10 @@ GIT_AHEAD="↑[%s]" GIT_BEHIND="↓[%s]" GIT_DIVERGED="↕ ↑[%a] ↓[%b]" # GIT_COLOR_CLEAN="\[\033[2;92m\]" -GIT_COLOR_CLEAN=$(printf "\x1b[%s;2;%sm" '38' '167;192;128') -GIT_COLOR_NO_UPSTREAM=$(printf "\x1b[%s;2;%sm" '38' '146;131;116') -GIT_COLOR_UNTRACKED=$(printf "\x1b[%s;2;%sm" '38' '211;134;155') -GIT_COLOR_DIRTY=$(printf "\x1b[%s;2;%sm" '38' '255;105;97') -GIT_COLOR_CONFLICT=$(printf "\x1b[%s;2;%sm" '38' '219;188;95') +GIT_COLOR_CLEAN=\x1b[38;2;167;192;128m +GIT_COLOR_NO_UPSTREAM=\x1b[38;2;146;131;116m +GIT_COLOR_UNTRACKED=\x1b[38;2;211;134;155m +GIT_COLOR_DIRTY=\x1b[38;2;255;105;97m +GIT_COLOR_CONFLICT=\x1b[38;2;219;188;95m # idea add fg/bg jobs to prompt From 830b385d4125add8d9cfa5495e5686fffc0f5397 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sat, 2 Mar 2024 21:01:17 -0500 Subject: [PATCH 05/64] chore: remove config logic --- bgps | 321 +++++++---------------------------------------------------- 1 file changed, 37 insertions(+), 284 deletions(-) diff --git a/bgps b/bgps index 1262a9e..dc2956f 100755 --- a/bgps +++ b/bgps @@ -41,221 +41,17 @@ _eread () [[ -r "${filepath}" ]] && read -r "$@" <"${filepath}" } -####################################### -# Print error message to stderr -# Arguments: $error_message -####################################### -_err() { - printf -- "bgps: %s" "${1}" >&2 -} - -####################################### -# Check if file exists and if file is a regular file -# Arguments: $filepath the path of the file to check -# Returns: 0 on success -####################################### -_file_exists() { - local return_code=0 - local filepath="${1}" - if [[ ! -e "${filepath}" ]]; then - _err "cannot access '${filepath}': No such file" - return_code=1 - elif [[ ! -f "${filepath}" ]]; then - _err "cannot access '${filepath}': Not a regular file" - return_code=1 - fi - return ${return_code} -} - -####################################### -# Remove first and last double quotes from string, if they exist -# Arguments: $no_quote the string to remove quotes from -####################################### -_remove_quotes() { - local no_quote="${1%\"}" - printf -- "%s" "${no_quote#\"}" -} - -####################################### -# Add configuration to config map -# Globals: $BGPS_CONFIG -# Arguments: -# $key the config map key -# $value the config map value -####################################### -_set_config_value() { - IFS=" " read -r -a valid_config_keys <<< "$(_bgps_config_keys)" - local key="${1^^}" - local value="${2}" - for valid_key in "${valid_config_keys[@]}" ; do - if [[ "${key}" == "${valid_key}" ]] ; then - # add to config map - BGPS_CONFIG["${key}"]=$(_remove_quotes "${value}") - fi - done -} - -####################################### -# Get configuration from config map. -# If a default value is provided and there is no value in the config, then -# return the default value -# Globals: $BGPS_CONFIG -# Arguments: -# $key the config map key -# $default_value the default value if there is no value in the config -####################################### -_get_config_value() { - local key="${1^^}" - local default_value="${2}" - local value="${BGPS_CONFIG[${key}]}" - [[ -z "${value}" ]] && printf -- "%s" "${default_value}" || printf -- "%s" "${value}" -} - -####################################### -# Clear all configuration in the config map -# Globals: $BGPS_CONFIG -####################################### -_clear_config_values() { - local keys=("${!BGPS_CONFIG[@]}") - for key in "${keys[@]}"; do - unset "BGPS_CONFIG[$key]" - done -} - -####################################### -# Read file and store in global config map -# Globals: $BGPS_CONFIG -# Arguments: $config_file the configuration filepath -####################################### -_read_config() { - local config_file="${1}" - if _file_exists "${config_file}" ; then - while IFS=$'=\r\n' read -r key value; do - _set_config_value "${key}" "${value}" - done < "${config_file}" - fi -} - -####################################### -# Set the config map by reading the values from the provided file. -# Only read from file if md5sum is different, otherwise hit the cache. -# Globals: -# $BGPS_CONFIG -# $BGPS_GLOBAL_CONFIG -# $BGPS_USER_CONFIG -# $BGPS_CHECKSUM -# Arguments: $config_file the configuration filepath -# Returns: 0 on success -####################################### -_set_config() { - local return_code=0 - local hash_code="" - local configs=() - if [[ -n "${1}" ]] ; then - local param_config="${1}" - if _file_exists "${param_config}" ; then - configs+=("${param_config}") - else - return_code=1 - fi - else - _file_exists "${BGPS_GLOBAL_CONFIG}" 2>/dev/null && configs+=("${BGPS_GLOBAL_CONFIG}") - _file_exists "${BGPS_USER_CONFIG}" 2>/dev/null && configs+=("${BGPS_USER_CONFIG}") - if (( ! "${#configs[@]}" )) ; then - # default config file does not exist so lets print a shrug face - BGPS_CHECKSUM="¯\_(ツ)_/¯" - _clear_config_values - _set_config_value "PS1_FORMAT" "${BGPS_CHECKSUM}%( %s%) \$ " - fi - fi - - if (( "${#configs[@]}" )) ; then - if [[ $OSTYPE == darwin* ]]; then # OSX does not have md5sum binary by default - hash_code="$(md5 -r "${configs[@]}" | awk '{print $1}' ORS="")" - else - hash_code="$(md5sum "${configs[@]}" | awk '{print $1}' ORS="")" - fi - fi - - if [[ -n "${hash_code}" ]] && [[ "${hash_code}" != "${BGPS_CHECKSUM}" ]] ; then - BGPS_CHECKSUM="${hash_code}" - _clear_config_values - for config in "${configs[@]}" ; do - _read_config "${config}" - done - fi - - return ${return_code} -} - -####################################### -# Retrieve the list of valid bgps environment variables -####################################### -_bgps_globals() { - local valid_globals=( - "BGPS_CONFIG" - "BGPS_GLOBAL_CONFIG" - "BGPS_USER_CONFIG" - "BGPS_CHECKSUM" - ) - printf -- "%s " "${valid_globals[@]}" -} - -####################################### -# Retrieve the list of valid keys for the environment variable $BGPS_CONFIG -####################################### -_bgps_config_keys() { - local valid_config_keys=( - "GIT_AHEAD" - "GIT_BEHIND" - "GIT_COLOR_CLEAN" - "GIT_COLOR_CONFLICT" - "GIT_COLOR_DIRTY" - "GIT_COLOR_ENABLED" - "GIT_COLOR_NO_UPSTREAM" - "GIT_COLOR_UNTRACKED" - "GIT_DIVERGED" - "GIT_POSTFIX" - "GIT_PREFIX" - "GIT_BARE" - "PS1_FORMAT" - "TEXT_COLOR" - ) - printf -- "%s " "${valid_config_keys[@]}" -} - -_print_config_value() { - local key="${1}" - local value="${2}" - printf -- " %-*s = %s\n" 22 "${key}" "${value}" -} - ####################################### # Get current git branch and additional repository information # Returns: 0 on success ####################################### _branch_info() { - local repo_info - local rev_parse_exit_code - - repo_info="$(git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short HEAD 2>/dev/null)" - rev_parse_exit_code="${?}" - - if [[ -z "${repo_info}" ]] ; then - return 1 - fi - - local short_sha - if (( !rev_parse_exit_code )) ; then - short_sha="${repo_info##*$'\n'}" - repo_info="${repo_info%$'\n'*}" - fi - repo_info="${repo_info%$'\n'*}" - local bare_repo="${repo_info##*$'\n'}" - repo_info="${repo_info%$'\n'*}" - local inside_gitdir="${repo_info##*$'\n'}" - local git_dir="${repo_info%$'\n'*}" + local git_dir="$1" + local inside_gitdir="$2" + local bare_repo="$3" + local inside_worktree="$4" + local short_sha="$5" local merge_status="" local branch="" @@ -346,41 +142,44 @@ _branch_info() { # Returns: 0 on success ####################################### _bgps_git_status() { - local color_enabled - color_enabled="$(_get_config_value 'GIT_COLOR_ENABLED' 'false')" - local color_clean - color_clean="$(_get_config_value 'GIT_COLOR_CLEAN' '\033[2;92m')" - local color_no_upstream - color_no_upstream="$(_get_config_value 'GIT_COLOR_NO_UPSTREAM' '\033[2;40m')" - local color_untracked - color_untracked="$(_get_config_value 'GIT_COLOR_UNTRACKED' '\033[2;95m')" - local color_dirty - color_dirty="$(_get_config_value 'GIT_COLOR_DIRTY' '\033[2;91m')" - local color_conflict - color_conflict="$(_get_config_value 'GIT_COLOR_CONFLICT' '\033[0;33m')" - local prefix - prefix="$(_get_config_value 'GIT_PREFIX' '')" - local postfix - postfix="$(_get_config_value 'GIT_POSTFIX' '')" - local git_ahead - git_ahead="$(_get_config_value 'GIT_AHEAD' '[ahead %s]')" - local git_behind - git_behind="$(_get_config_value 'GIT_BEHIND' '[behind %s]')" - local git_diverged - git_diverged="$(_get_config_value 'GIT_DIVERGED' '[ahead %a] [behind %b]')" - local git_bare - git_bare="$(_get_config_value 'GIT_BARE' '')" + local color_enabled='true' + local color_clean='\x1b[38;2;167;192;128m' + + local color_no_upstream='\x1b[38;2;146;131;116m' + local color_untracked='\x1b[38;2;211;134;155m' + local color_dirty='\x1b[38;2;255;105;97m' + local color_conflict='\x1b[38;2;219;188;95m' + local prefix='  ' + local postfix='' + local git_ahead='↑[%s]' + local git_behind='↓[%s]' + local git_diverged='↕ ↑[%a] ↓[%b]' + local git_bare='󱣻' local git_color="${stop_color}" + local git_symbol="" + local repo_info + repo_info="$(git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short HEAD 2>/dev/null)" + + local repo_info_arr + readarray -t repo_info_arr <<<"$repo_info" + local git_dir="${repo_info_arr[0]}" + local inside_gitdir="${repo_info_arr[1]}" + local bare_repo="${repo_info_arr[2]}" + local inside_worktree="${repo_info_arr[3]}" + local short_sha="${repo_info_arr[4]}" + local git_branch - if ! git_branch="$(_branch_info)"; then + if ! git_branch=$(_branch_info "$git_dir" "$inside_gitdir" "$bare_repo" "$inside_worktree" "$short_sha"); then return 1 fi - if [[ "$(git rev-parse --is-bare-repository)" == "true" ]]; then - git_color="${color_no_upstream}" + if [[ "$bare_repo" == "true" ]]; then git_symbol="${git_bare}" + fi + if [[ "$bare_repo" == "true" ]] || [[ "$inside_gitdir" == "true" ]] ; then + git_color="${color_no_upstream}" if [[ ${color_enabled} == "true" ]] ; then printf -- "%s" "${git_color}" fi @@ -480,60 +279,14 @@ _bgps_git_status() { return 0 } -####################################### -# Set formatted git prompt -# Globals: -# $stop_color -# $BGPS_CONFIG -####################################### -_bgps_prompt() { - local format - format="$(_get_config_value 'PS1_FORMAT' "%(%s %)${stop_color}\$ ")" - local text_color= - text_color="$(_get_config_value 'TEXT_COLOR' "${stop_color}")" - local status - echo -e "$(_bgps_git_status)$stop_color" - # if [[ -z "${status}" ]] ; then - # format="${format/\%(*\%s*\%)/}" - # format="${format/\%BGPS_GIT_STATUS/}" - # PS1="${format}${text_color}" - # else - # local placeholder - # if [[ "${format}" =~ \%\(.*\%s.*\%\) ]] ; then - # placeholder="${BASH_REMATCH[0]#\%\(}" - # placeholder="${placeholder%\%\)}" - # format="${format/\%(*\%s*\%)/${placeholder}}" - # fi - # PS1="${format/\%BGPS_GIT_STATUS/${status}}${text_color}" - # fi -} - # Script Definition ########################################################### # Globals: # $stop_color escape sequence to reset prompt color -# $BGPS_CONFIG map of config values -# $BGPS_CHECKSUM md5sum of config file stop_color="\[\033[0m\]" -declare -A BGPS_CONFIG -BGPS_GLOBAL_CONFIG="${BGPS_GLOBAL_CONFIG-/etc/bgps_config}" -BGPS_USER_CONFIG="${BGPS_USER_CONFIG-${HOME}/.bgps_config}" - -if _set_config "$@" ; then - _bgps_prompt -fi +echo -e "$(_bgps_git_status)$stop_color" # unset variables and functions unset stop_color -unset bgps_config_file -unset -f _err -unset -f _file_exists -unset -f _remove_quotes -unset -f _set_config_value -unset -f _get_config_value -unset -f _clear_config_values -unset -f _read_config -unset -f _set_config -unset -f _print_config unset -f _bgps_git_status -unset -f _bgps_prompt +unset -f _branch_info From 59acc50f2fba593fb297a0ff52c13b1e9f5070b7 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sat, 2 Mar 2024 22:18:02 -0500 Subject: [PATCH 06/64] chore: fix logic for detached head --- bgps | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/bgps b/bgps index dc2956f..58581a1 100755 --- a/bgps +++ b/bgps @@ -53,6 +53,7 @@ _branch_info() { local inside_worktree="$4" local short_sha="$5" + local is_detached="false" local merge_status="" local branch="" local step="" @@ -105,10 +106,10 @@ _branch_info() { if ! _eread "${git_dir}/HEAD" head ; then return 1 fi - # is it a symbolic ref? branch="${head#ref: }" if [[ "${head}" == "${branch}" ]] ; then - branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${short_sha}..." + is_detached="true" + branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${head:0:9}..." branch="(${branch})" fi fi @@ -131,6 +132,11 @@ _branch_info() { branch="${branch##refs/heads/}" printf -- "%s%s%s" "${prefix}" "${branch}" "${merge_status}" + + if [[ "$is_detached" == "true" ]]; then + return 2 + fi + return 0 } @@ -160,7 +166,7 @@ _bgps_git_status() { local git_symbol="" local repo_info - repo_info="$(git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short HEAD 2>/dev/null)" + repo_info="$(git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short '@{upstream}' 2>/dev/null)" local repo_info_arr readarray -t repo_info_arr <<<"$repo_info" @@ -170,8 +176,15 @@ _bgps_git_status() { local inside_worktree="${repo_info_arr[3]}" local short_sha="${repo_info_arr[4]}" + local is_detached="false" + local git_branch_exit local git_branch - if ! git_branch=$(_branch_info "$git_dir" "$inside_gitdir" "$bare_repo" "$inside_worktree" "$short_sha"); then + git_branch=$(_branch_info "$git_dir" "$inside_gitdir" "$bare_repo" "$inside_worktree" "$short_sha") + git_branch_exit="$?" + + if (("$git_branch_exit" == 2)); then + is_detached="true" + elif (("$git_branch_exit")); then return 1 fi @@ -191,12 +204,13 @@ _bgps_git_status() { diff_error=$(git diff --no-ext-diff --quiet HEAD 2>&1) local dirty_exit_code="${?}" # code == 0 clean working tree, code == 1 dirty working tree - # TODO: move logic to function - # TODO: look in HEAD vs @{u} for bare repo vs normal repo. showing green after commit on bare repo should not local empty_git_error="ambiguous argument 'HEAD'" local no_upstream_git_error="no upstream configured" local no_such_branch_git_error="no such branch" local no_upstream=0 + if [[ "$short_sha" == "" ]]; then + no_upstream=1 + fi if [[ "${diff_error}" == *"${empty_git_error}"* ]] || [[ "${diff_error}" == *"${no_upstream_git_error}"* ]] || [[ "${diff_error}" == *"${no_such_branch_git_error}"* ]]; then no_upstream=1 # there is no upstream so compare against staging area @@ -212,14 +226,15 @@ _bgps_git_status() { untracked_exit_code="${?}" # code == 0 untracked files exist, code > 0 no untracked files local commit_counts - local commit_counts_exit_code - if ((no_upstream)); then + local commit_counts_exit_code=1 + if [[ "$is_detached" == "true" ]]; then + commit_counts=(0 0) + elif ((no_upstream)); then ahead_count="$(git rev-list --count HEAD 2>/dev/null)" commit_counts=("$ahead_count" 0) - commit_counts_exit_code="${?}" else IFS=$'\t' read -r -a commit_counts <<< "$(git rev-list --left-right --count ...'@{u}' 2>/dev/null)" - commit_counts_exit_code="${?}" # TODO: double check refactor on line above doesn't break this + commit_counts_exit_code="$?" fi if ((!dirty_exit_code)) ; then From c44ec4a8ebef246ccff29522dda07b1ca8b14176 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sat, 2 Mar 2024 22:38:04 -0500 Subject: [PATCH 07/64] chore: remove color options --- bgps | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/bgps b/bgps index 58581a1..43e017b 100755 --- a/bgps +++ b/bgps @@ -148,7 +148,6 @@ _branch_info() { # Returns: 0 on success ####################################### _bgps_git_status() { - local color_enabled='true' local color_clean='\x1b[38;2;167;192;128m' local color_no_upstream='\x1b[38;2;146;131;116m' @@ -193,9 +192,7 @@ _bgps_git_status() { fi if [[ "$bare_repo" == "true" ]] || [[ "$inside_gitdir" == "true" ]] ; then git_color="${color_no_upstream}" - if [[ ${color_enabled} == "true" ]] ; then - printf -- "%s" "${git_color}" - fi + printf -- "%s" "${git_color}" printf -- "%s%s%s%s" "${prefix:+${prefix}}" "${git_branch}" "${git_symbol:+ ${git_symbol}}" "${postfix:+${postfix}}" return 0 fi @@ -274,34 +271,23 @@ _bgps_git_status() { git_symbol="*${git_symbol#\*}" fi - if [[ ${color_enabled} == "true" ]] ; then - printf -- "%s" "${git_color}" - fi - + printf -- "%s" "${git_color}" printf -- "%s%s%s%s" "${prefix:+${prefix}}" "${git_branch}" "${git_symbol:+ ${git_symbol}}" "${postfix:+${postfix}}" else - if [[ ${color_enabled} == "true" ]] ; then - printf -- "%s" "${color_dirty}" - fi - local state_dir="${HOME}/.local/state/bgps" - local log_file="${state_dir}/log" - mkdir -p "${state_dir}" - printf -- "%s: %s\n" "$(date +%FT%T)" "${diff_error}" >> "${log_file}" - printf -- "[bgps: error see %s for information]" "${log_file}" + printf -- "%s" "${color_dirty}" + printf -- "ERROR(bgps): %s" "${diff_error}" fi printf -- '' return 0 } -# Script Definition ########################################################### -# Globals: -# $stop_color escape sequence to reset prompt color - -stop_color="\[\033[0m\]" -echo -e "$(_bgps_git_status)$stop_color" +stop_color="\033[0m" +# shellcheck disable=SC2059 +printf -- "$(_bgps_git_status)$stop_color" # unset variables and functions unset stop_color unset -f _bgps_git_status unset -f _branch_info +unset -f _eread From ad87b4f48c7db4302ea1eec14593125c139abaca Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sat, 2 Mar 2024 22:46:18 -0500 Subject: [PATCH 08/64] chore: delete a lot more things! --- Dockerfile | 23 ------- README.md | 153 +------------------------------------------ bgps | 6 +- examples/blue_time | 4 -- examples/colorful | 11 ---- examples/mine | 29 -------- examples/simple | 1 - screenshots/demo.gif | Bin 838208 -> 0 bytes 8 files changed, 4 insertions(+), 223 deletions(-) delete mode 100644 Dockerfile delete mode 100644 examples/blue_time delete mode 100644 examples/colorful delete mode 100644 examples/mine delete mode 100644 examples/simple delete mode 100644 screenshots/demo.gif diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 02fe808..0000000 --- a/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu - -RUN useradd -ms /bin/bash jdoe -RUN printf "root:root\njdoe:jdoe" | chpasswd - -RUN apt-get update -RUN apt-get install -y vim git - -USER jdoe -RUN git clone https://github.com/mjsmith1028/bgps.git /home/jdoe/bgps -RUN git config --global user.name "John Doe" -RUN git config --global user.email "jdoe@docker.com" -RUN ln -s /home/jdoe/bgps/examples/mine /home/jdoe/.bgps_config - -USER root -RUN echo "source /etc/bash_completion.d/git-prompt" | tee -a /root/.bashrc /home/jdoe/.bashrc -RUN ln -s /home/jdoe/bgps/examples/mine /root/.bgps_config -RUN ln -s /home/jdoe/bgps/bgps /usr/local/bin/bgps - -ENV PROMPT_COMMAND "source bgps" - -USER jdoe -WORKDIR /home/jdoe/bgps diff --git a/README.md b/README.md index eb78c16..06ba558 100644 --- a/README.md +++ b/README.md @@ -1,154 +1,5 @@ # Better Git Prompt String -A better bash prompt for git. bgps provides a convenient way to customize -the PS1 prompt and to determine information about the current git branch. -bgps can indicate if the branch has a clean or dirty working tree, whether -or not it is tracking a remote branch, and the number of commits the local -branch is ahead or behind the remote branch. -![demo](screenshots/demo.gif) -Note: Demo is currently outdated and will be updated. +> [!WARNING]\ +> Under construction -## Installation -### 1. Download bgps -You can choose to install bgps only for yourself or share it with other users -on the system. -#### 1a. Only for yourself, add bgps to your local bin directory. -1. Check if local bin directory exists. If it does not exist, then create the -directory. -```bash -! [[ -d "~/bin" ]] && mkdir ~/bin -``` -2. Download bgps to your local bin directory. -```bash -wget -O ~/bin/bgps https://raw.githubusercontent.com/mjsmith1028/bgps/master/bgps -``` -#### 1b. All users, add bgps to the shared bin directory. -1. Download bgps to the shared bin directory. -```bash -sudo wget -O /usr/local/bin/bgps https://raw.githubusercontent.com/mjsmith1028/bgps/master/bgps -``` -### 2. Configure bgps -#### 2a. Only for yourself, add user configuration to your home directory. -Create `~/.bgps_config`, if it does not exist. Modify it according to your -preferences. See the [configuration](#configuration) section for more -information. - -If you like what you see in the demo, copy [my configuration](examples/mine): -```bash -wget -O ~/.bgps_config https://raw.githubusercontent.com/mjsmith1028/bgps/master/examples/mine -``` -#### 2b. All users, add global configuration to the etc directory. -Create `/etc/bgps_config`, if it does not exist. Modify it according to your -preferences. See the [configuration](#configuration) section for more -information. - -Note: configurations in the user configuration file, `~/.bgps_config`, will take -precedence over the configurations in the global configuration file, -`/etc/bgps_config`. - -### 3. Update `${PROMPT_COMMAND}` -Modify `PROMPT_COMMAND` environment variable in startup file. I prefer to -source my `~/.bashrc` file from my `~/.bash_profile` file. Then, modify the -`PROMPT_COMMAND` in the `~/.bashrc` file. - -For example: - -Add the following to `~/.bash_profile`. -```bash -if [ -f "${HOME}/.bashrc" ] ; then - source "${HOME}/.bashrc" -fi -``` -Add the following to `~/.bashrc`. -```bash -PROMPT_COMMAND="source bgps" -``` -### 4. Reopen terminal -Source the file containing the updates to the `PROMPT_COMMAND` environment -variable. If you followed my suggestion, then you will be sourcing `~/.bashrc`. -Alternativly, just open a new terminal window. You should now see the bgps -prompt. -```bash -source ~/.bashrc -``` -### 5. (Optional) Add git icon -1. Install the powerline symbols font. This package provides the git icon -referenced in [my configuration](examples/mine). -```bash -sudo apt update && sudo apt install fonts-powerline -``` -2. Open a new terminal window. If you are using [my configuration](examples/mine), -then you should now see the git icon. - -## Configuration -- `PS1_FORMAT` - - Format of PS1. `%s` is replaced with the contents of the git section. `%(` and `%)` provide additional formatting when `%s` is within the parentheses. Formatting within the parentheses is only applied to the PS1 when the current working directory is in a git repository. - - **Default Value:** `%(%s %)\[\033[0m\]\$ ` -- `GIT_AHEAD` - - Format of section that indicates the local branch is ahead of the remote branch. `%s` is replaced with the number of commits that the local branch has not yet merged into the remote branch. - - **Default Value:** `[ahead %s]` -- `GIT_BEHIND` - - Format of section that indicates the local branch is behind the remote branch. `%s` is replaced with the number of commits that the remote branch has not yet merged into the local branch. - - **Default Value:** `[behind %s]` -- `GIT_DIVERGED` - - Format of section that indicates the local branch has diverged from the remote branch. `%a` is replaced with the number of commits that the local branch has not yet merged into the remote branch. `%b` is replaced with the number of commits that the remote branch has not yet merged into the local branch. - - **Default Value:** `[ahead %a] [behind %b]` -- `GIT_POSTFIX` - - Optional section that is displayed before git section. -- `GIT_PREFIX` - - Optional section that is displayed after git section. -- `GIT_COLOR_ENABLED` - - If `true`, then enable color for git section. - - **Default Value:** `false` -- `GIT_COLOR_CLEAN` - - Color of git section when the branch has a clean working tree. - - **Default Value:** `\[\033[2;92m\]` (green) -- `GIT_COLOR_CONFLICT` - - Color of git section when the local branch is ahead or behind the remote branch. - - **Default Value:** `\[\033[0;33m\]` (yellow) -- `GIT_COLOR_DIRTY` - - Color of git section when the branch has a dirty working tree. - - **Default Value:** `\[\033[2;91m\]` (red) -- `GIT_COLOR_UNTRACKED` - - Color of git section when the branch has untracked files. - - **Default Value:** `\[\033[2;95m\]` (purple) -- `GIT_COLOR_NO_UPSTREAM` - - Color of git section when the local branch is not tracking a remote branch. - - **Default Value:** `\[\033[2;40m\]` (gray) -- `TEXT_COLOR` - - Color of text after PS1. - - **Default Value:** `\[\033[0m\]` (reset) - -## Environment Variables -- `BGPS_GLOBAL_CONFIG` - - Global configuration file that is shared between all users. - - **Default Value:** `/etc/bgps_config` -- `BGPS_USER_CONFIG` - - User-specific configuration file. - - **Default Value:** `~/.bgps_config` - -## Command-line Options -- `--config-file` - - Path of the desired configuration file. Specifying the configuration file will override and ignore all configurations referenced in `BGPS_GLOBAL_CONFIG` and `BGPS_USER_CONFIG`. - - **Example:** `source bgps --config-file "/path/to/config/file"` -- `--ls-config` - - List the current configuration and environment variables. - - **Example:** `source bgps --ls-config` - -## FAQ -### My prompt is a shrug face `¯\_(ツ)_/¯`. What is going on? -You are missing the bgps configuration file `~/.bgps_config`. Make sure -`~/.bgps_config` exists and that it is properly configured. See the -[configuration](#configuration) section for more information. - -### Why do I have a weird symbol `` for my git icon? -Powerline fonts is used to display the git icon. If you are using -[my configuration](examples/mine) and the icon is incorrect, then you need to -install the `fonts-powerline` package. See the -[add git icon](#5-optional-add-git-icon) section for instructions. - -## Compatibilty -bgps has been tested with the following: -- Operating System: 20.6.0 Darwin Kernel Version 20.6.0 -- Bash: 5.1.16(1)-release (x86_64-apple-darwin20.6.0) -- Git: 2.37.0 diff --git a/bgps b/bgps index 43e017b..b7ca037 100755 --- a/bgps +++ b/bgps @@ -26,8 +26,6 @@ # # -# Function Definitions ######################################################## - ####################################### # Read contents of file to variables # Arguments: @@ -44,6 +42,7 @@ _eread () ####################################### # Get current git branch and additional repository information # Returns: 0 on success +# Returns: 2 on success and in a detached head state ####################################### _branch_info() { @@ -141,10 +140,9 @@ _branch_info() { } ####################################### -# Get git status format +# Get formatted git status # Globals: # $stop_color -# $BGPS_CONFIG # Returns: 0 on success ####################################### _bgps_git_status() { diff --git a/examples/blue_time b/examples/blue_time deleted file mode 100644 index f2b95f9..0000000 --- a/examples/blue_time +++ /dev/null @@ -1,4 +0,0 @@ -PS1_FORMAT="\[\033[0;34m\][\@]\[\033[0m\] \u@\h%( %s%)\[\033[0m\] \$ " -TEXT_COLOR="\[\033[0;36m\]" -GIT_COLOR_ENABLED="true" -GIT_COLOR_CLEAN="\[\033[5;94m\]" diff --git a/examples/colorful b/examples/colorful deleted file mode 100644 index a60f7d0..0000000 --- a/examples/colorful +++ /dev/null @@ -1,11 +0,0 @@ -PS1_FORMAT="\[\033[3;35m\]\t\[\033[0m\]-\[\033[3;97m\]\h:\[\033[33;1m\]\w%( %s%)\[\033[m\] -> " -TEXT_COLOR="\[\033[0;32m\]" -GIT_COLOR_ENABLED="true" -GIT_COLOR_CLEAN="\[\033[1;92m\]" -GIT_COLOR_CONFLICT="\[\033[1;43m\]" -GIT_COLOR_DIRTY="\[\033[1;91m\]" -GIT_COLOR_UNTRACKED="\[\033[1;90m\]" -GIT_PREFIX=":) " -GIT_AHEAD="+%s" -GIT_BEHIND="-%s" -GIT_DIVERGED="+%a -%b" diff --git a/examples/mine b/examples/mine deleted file mode 100644 index 24a50e8..0000000 --- a/examples/mine +++ /dev/null @@ -1,29 +0,0 @@ -# main version -# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@local $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " -# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@\h $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " -# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1) $(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@local $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " -# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@local $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " - -# kitty-scrollback.nvim demo -# PS1_FORMAT="$(_bgps_ps1 -u '\u' -h '\h' -D '\D{%Y-%m-%dT%T}' -s '\s' -V '\V' -w '\w')\[\033[0m\]%BGPS_GIT_STATUS $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u@rightmeow $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$$(printf '%b' \[\033[0m)\] " - -# short version safe for screenshare -# PS1_FORMAT="$(printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128')\w $(_code_ps1)\n$(((${EUID})) && printf "\[\x1b[%s;2;%sm\]" '38' '167;192;128' || printf "\[\x1b[%s;2;%sm\]" '38' '255;105;97')\u $(printf "\[\x1b[%s;2;%sm\]" '38' '131;165;152')\$ " - -# super short -# PS1_FORMAT="\$ " - -GIT_COLOR_ENABLED="true" -GIT_PREFIX="  " -GIT_BARE="󱣻" -GIT_AHEAD="↑[%s]" -GIT_BEHIND="↓[%s]" -GIT_DIVERGED="↕ ↑[%a] ↓[%b]" -# GIT_COLOR_CLEAN="\[\033[2;92m\]" -GIT_COLOR_CLEAN=\x1b[38;2;167;192;128m -GIT_COLOR_NO_UPSTREAM=\x1b[38;2;146;131;116m -GIT_COLOR_UNTRACKED=\x1b[38;2;211;134;155m -GIT_COLOR_DIRTY=\x1b[38;2;255;105;97m -GIT_COLOR_CONFLICT=\x1b[38;2;219;188;95m -# idea add fg/bg jobs to prompt - diff --git a/examples/simple b/examples/simple deleted file mode 100644 index 92fe2c3..0000000 --- a/examples/simple +++ /dev/null @@ -1 +0,0 @@ -PS1_FORMAT="%(%s %)\$ " diff --git a/screenshots/demo.gif b/screenshots/demo.gif deleted file mode 100644 index b3d120beb7fa82b14ed647db42b4e071f84d41dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838208 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%0D9I3` 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%0Do+r4_kU!4J=-Kq!TQc6Eh9y}+t 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

VS%1L(gvDQ#%KX9 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 dM53beDK%mYyNKas~2>M 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

+;Z8*1e?>%ES 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

#k~~gJ5#z_3_XYYShe3bLD_HiX&bCvM$aqz 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%0DV${a58lb>#i!ouY*QK0)N$ zKfR7yrhk4IiJEh@R$SUH&FI-+X-hWrV7Jgq$b9e!qOhd-lmH`-s&g5kR`Q%LEu*rl zqpvUzP%pjHm%BusTnQWYJnE@vPS&fQJd=tWKK7yBzu=t?ZZvCE^mtYRV Date: Sat, 2 Mar 2024 23:04:00 -0500 Subject: [PATCH 09/64] chore: add logic for showing merge conflict --- bgps | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bgps b/bgps index b7ca037..93e91e0 100755 --- a/bgps +++ b/bgps @@ -118,6 +118,10 @@ _branch_info() { merge_status="${merge_status} ${step}/${total}" fi + if [[ "$merge_status" ]] && [[ $(git ls-files --unmerged 2>/dev/null) ]]; then + merge_status="$merge_status|CONFLICT" + fi + local prefix="" if [[ "${inside_gitdir}" == "true" ]] ; then From f1c7e12068d38c158719a6a715dd8548186720e5 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sat, 2 Mar 2024 23:19:49 -0500 Subject: [PATCH 10/64] chore: add logic for showing sparse checkouts --- bgps | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bgps b/bgps index 93e91e0..7173736 100755 --- a/bgps +++ b/bgps @@ -54,6 +54,7 @@ _branch_info() { local is_detached="false" local merge_status="" + local sparse="" local branch="" local step="" local total="" @@ -134,7 +135,10 @@ _branch_info() { branch="${branch##refs/heads/}" - printf -- "%s%s%s" "${prefix}" "${branch}" "${merge_status}" + if [[ "$(git config --bool core.sparseCheckout)" == "true" ]]; then + sparse="|SPARSE" + fi + printf -- "%s%s%s%s" "${prefix}" "${branch}" "${sparse}" "${merge_status}" if [[ "$is_detached" == "true" ]]; then return 2 From e0e0b7a81f2ec962e3f9cde3b519cb93e9b88324 Mon Sep 17 00:00:00 2001 From: Mike <10135646+mikesmithgh@users.noreply.github.com> Date: Sat, 2 Mar 2024 23:21:36 -0500 Subject: [PATCH 11/64] chore: fix README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06ba558..eb15d6a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Better Git Prompt String -> [!WARNING]\ +> [!WARNING]\ > Under construction From 2f4d2698801518b08c426c647ba0c69408a728dd Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sat, 2 Mar 2024 23:24:38 -0500 Subject: [PATCH 12/64] chore: update copyright email --- bgps | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bgps b/bgps index 7173736..eaed92b 100755 --- a/bgps +++ b/bgps @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Copyright (C) 2017 Michael Smith +# Copyright (C) 2017 Michael Smith # Copyright (C) 2006,2007 Shawn O. Pearce # # This program is free software; you can redistribute it and/or modify From 54c7173d9a239cf9f033cf0836ef3385a699f990 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sun, 3 Mar 2024 00:13:59 -0500 Subject: [PATCH 13/64] chore: check if remote exists --- bgps | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bgps b/bgps index eaed92b..2855d49 100755 --- a/bgps +++ b/bgps @@ -111,6 +111,8 @@ _branch_info() { is_detached="true" branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${head:0:9}..." branch="(${branch})" + elif ! git show-branch refs/remotes/origin/"${branch##refs/heads/}" >/dev/null 2>/dev/null; then + is_detached="true" fi fi fi @@ -236,7 +238,7 @@ _bgps_git_status() { ahead_count="$(git rev-list --count HEAD 2>/dev/null)" commit_counts=("$ahead_count" 0) else - IFS=$'\t' read -r -a commit_counts <<< "$(git rev-list --left-right --count ...'@{u}' 2>/dev/null)" + IFS=$'\t' read -r -a commit_counts <<< "$(git rev-list --left-right --count ...'@{upstream}' 2>/dev/null)" commit_counts_exit_code="$?" fi From dda4958583f7be37950a5baa1b4907ec80e3f57b Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sun, 3 Mar 2024 08:09:15 -0500 Subject: [PATCH 14/64] chore: use rev-parse --- bgps | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bgps b/bgps index 2855d49..72511c9 100755 --- a/bgps +++ b/bgps @@ -107,11 +107,13 @@ _branch_info() { return 1 fi branch="${head#ref: }" + local upstream_info + upstream_info="$(git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null)" if [[ "${head}" == "${branch}" ]] ; then is_detached="true" branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${head:0:9}..." branch="(${branch})" - elif ! git show-branch refs/remotes/origin/"${branch##refs/heads/}" >/dev/null 2>/dev/null; then + elif [[ "$upstream_info" == '' ]]; then is_detached="true" fi fi From 9788c2be08f8e71bbfd7579ff80fab82436394aa Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Sun, 3 Mar 2024 08:12:49 -0500 Subject: [PATCH 15/64] chore: fix upstream check --- bgps | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bgps b/bgps index 72511c9..768c5c2 100755 --- a/bgps +++ b/bgps @@ -113,7 +113,7 @@ _branch_info() { is_detached="true" branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${head:0:9}..." branch="(${branch})" - elif [[ "$upstream_info" == '' ]]; then + elif [[ "$upstream_info" == '@{upstream}' ]] || [[ "$upstream_info" == '' ]]; then is_detached="true" fi fi From 57ab493cb100a8c8cd162f481b739a2a8bf78796 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Mon, 4 Mar 2024 23:44:07 -0500 Subject: [PATCH 16/64] chore: migrate to go --- bgps => bashbgps | 4 +- go.mod | 11 + go.sum | 11 + main.go | 580 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 605 insertions(+), 1 deletion(-) rename bgps => bashbgps (99%) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/bgps b/bashbgps similarity index 99% rename from bgps rename to bashbgps index 768c5c2..97fb30c 100755 --- a/bgps +++ b/bashbgps @@ -95,6 +95,8 @@ _branch_info() { elif [[ -f "${git_dir}/BISECT_LOG" ]] ; then merge_status="|BISECTING" fi + + # TODO stopped here if [[ "${branch}" ]]; then : @@ -111,7 +113,7 @@ _branch_info() { upstream_info="$(git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null)" if [[ "${head}" == "${branch}" ]] ; then is_detached="true" - branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${head:0:9}..." + branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${head:0:7}..." # was short branch="(${branch})" elif [[ "$upstream_info" == '@{upstream}' ]] || [[ "$upstream_info" == '' ]]; then is_detached="true" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..74cdd14 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module github.com/mikesmithgh/bgps + +go 1.22.0 + +require github.com/fatih/color v1.16.0 + +require ( + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + golang.org/x/sys v0.14.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7f13de9 --- /dev/null +++ b/go.sum @@ -0,0 +1,11 @@ +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/main.go b/main.go new file mode 100644 index 0000000..c34fd8c --- /dev/null +++ b/main.go @@ -0,0 +1,580 @@ +package main + +import ( + "errors" + "fmt" + "io" + "io/fs" + "log" + "os" + "os/exec" + "strconv" + "strings" + + "github.com/fatih/color" +) + +type GitRepo struct { + GitDir string + IsInGitDir bool + IsInWorkTree bool + IsInBareRepo bool + IsInShallowRepo bool + IsDetached bool + IsSparseCheckout bool + AbbrevRef string + ShortSha string + PromptMergeStatus string + PromptSparseCheckoutStatus string + PromptBranch string + PromptBareRepoStatus string +} + +func (g *GitRepo) GitDirFileExists(name string) (bool, error) { + _, err := os.Stat(g.GitDirPath(name)) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return false, nil + } + return false, err + } + return true, nil +} + +func (g *GitRepo) IsGitDir(name string) bool { + return IsDir(g.GitDirPath(name)) +} + +func (g *GitRepo) IsGitDirSymlink(name string) bool { + return IsSymlink(g.GitDirPath(name)) +} + +func (g *GitRepo) GitDirPath(path string) string { + return fmt.Sprintf("%s/%s", g.GitDir, path) +} + +func (g *GitRepo) ReadGirDirFile(name string) (string, error) { + return ReadFileTrimNewline(g.GitDirPath(name)) +} + +func (g *GitRepo) RevParseShort() ([]byte, error) { + + cmd := exec.Command( + "git", + "rev-parse", + "--short", + "@{upstream}", + ) + + stderrPipe, err := cmd.StderrPipe() + if err != nil { + return nil, err + } + stdoutPipe, err := cmd.StdoutPipe() + if err != nil { + return nil, err + } + if err := cmd.Start(); err != nil { + return nil, err + } + + stderr, err := io.ReadAll(stderrPipe) + if err != nil { + return stderr, err + } + + stdout, err := io.ReadAll(stdoutPipe) + if err != nil { + return stderr, err + } + + err = cmd.Wait() + + if len(stdout) > 0 { + g.ShortSha = strings.TrimSuffix(string(stdout), "\n") + } + + return stderr, err +} + +func (g *GitRepo) RevParse() ([]byte, error) { + cmd := exec.Command( + "git", + "rev-parse", + "--verify", + "--absolute-git-dir", + "--is-inside-git-dir", + "--is-inside-work-tree", + "--is-bare-repository", + "--is-shallow-repository", + "--abbrev-ref", + "@{upstream}", + ) + + stderrPipe, err := cmd.StderrPipe() + if err != nil { + return nil, err + } + stdoutPipe, err := cmd.StdoutPipe() + if err != nil { + return nil, err + } + if err := cmd.Start(); err != nil { + return nil, err + } + + stderr, err := io.ReadAll(stderrPipe) + if err != nil { + return stderr, err + } + + stdout, err := io.ReadAll(stdoutPipe) + if err != nil { + return stderr, err + } + + err = cmd.Wait() + + if len(stdout) > 0 { + result := strings.Split(strings.TrimSuffix(string(stdout), "\n"), "\n") + resultLen := len(result) + if resultLen == 5 || resultLen == 6 { + g.GitDir = result[0] + g.IsInGitDir, _ = strconv.ParseBool(result[1]) + g.IsInWorkTree, _ = strconv.ParseBool(result[2]) + g.IsInBareRepo, _ = strconv.ParseBool(result[3]) + g.IsInShallowRepo, _ = strconv.ParseBool(result[4]) + if resultLen == 6 { + g.AbbrevRef = result[5] + shortStderr, shortErr := g.RevParseShort() + err = errors.Join(err, shortErr) + stderr = append(stderr, shortStderr...) + } + } else { + return []byte{}, fmt.Errorf("expected result length of 5 or 6, got %d", resultLen) + } + } + + return stderr, err +} + +type Result struct { + stderr []byte + err error +} + +func (g *GitRepo) BranchInfo() (string, error) { + var err error + ref := "" + step := "" + total := "" + + if g.IsGitDir("rebase-merge") { + if ref, err = g.ReadGirDirFile("rebase-merge/head-name"); err != nil { + return ref, err + } + if step, err = g.ReadGirDirFile("rebase-merge/msgnum"); err != nil { + return ref, err + } + if total, err = g.ReadGirDirFile("rebase-merge/end"); err != nil { + return ref, err + } + g.PromptMergeStatus = "|REBASE-m" + if exists, exists_err := g.GitDirFileExists("rebase-merge/interactive"); exists { + g.PromptMergeStatus = "|REBASE-i" + } else if exists_err != nil { + return strconv.FormatBool(exists), exists_err + } + + } else { + if g.IsGitDir("rebase-apply") { + + step, err = g.ReadGirDirFile("rebase-apply/next") + if err != nil { + return step, err + } + total, err = g.ReadGirDirFile("rebase-apply/last") + if err != nil { + return total, err + } + rebasing, err := g.GitDirFileExists("rebase-apply/rebasing") + if err != nil { + return strconv.FormatBool(rebasing), err + } + if rebasing { + ref, err = g.ReadGirDirFile("rebase-apply/head-name") + if err != nil { + return ref, err + } + g.PromptMergeStatus = "|REBASE" + } else { + // TODO: check if we need to get branch name here, bgps was not doing it + applying, err := g.GitDirFileExists("rebase-apply/applying") + if err != nil { + return strconv.FormatBool(applying), err + } + if applying { + g.PromptMergeStatus = "|AM" + } else { + g.PromptMergeStatus = "|AM/REBASE" + } + } + } else if g.IsGitDir("MERGE_HEAD") { + g.PromptMergeStatus = "|MERGING" + } else if g.IsGitDir("CHERRY_PICK_HEAD") { + g.PromptMergeStatus = "|CHERRY-PICKING" + } else if g.IsGitDir("REVERT_HEAD") { + g.PromptMergeStatus = "|REVERTING" + } else if g.IsGitDir("BISECT_LOG") { + g.PromptMergeStatus = "|BISECTING" + } + + if ref == "" { + if g.IsGitDirSymlink("HEAD") { + if ref, err = GitSymbolicRef("HEAD"); err != nil { + return ref, err + } + } else { + head := "" + if head, err = g.ReadGirDirFile("HEAD"); err != nil { + return head, err + } + ref = strings.TrimPrefix(head, "ref: ") + + if head == ref { + g.IsDetached = true + tag, err := GitDescribeTag("HEAD") + if err == nil { + ref = tag + } else if g.ShortSha == "" && len(head) > 7 { + ref = head[:7] + } else { + ref = g.ShortSha + } + ref = fmt.Sprintf("(%s)", ref) + } else if g.AbbrevRef == "" { + g.IsDetached = true + } + } + } + } + + if step != "" && total != "" { + g.PromptMergeStatus += fmt.Sprintf(" %s/%s", step, total) + } + + if g.PromptMergeStatus != "" { + if _, err = GitLsFilesUnmerged(); err != nil { + g.PromptMergeStatus += "|CONFLICT" + } + } + + if g.IsInGitDir { + if g.IsInBareRepo { + g.PromptBareRepoStatus = "BARE:" + } else { + ref = "GIT_DIR!" + } + } + + g.PromptBranch = strings.TrimPrefix(ref, "refs/heads/") + + // TODO: put behind a variable, default to false for perf + checkSparse := false + if checkSparse { + g.IsSparseCheckout, err = GitSparseCheckout() + if err != nil { + log.Fatal(err) + } + + if g.IsSparseCheckout { + g.PromptSparseCheckoutStatus = "|SPARSE" + } + } + + prompt := fmt.Sprintf("%s%s%s%s", g.PromptBareRepoStatus, g.PromptBranch, g.PromptSparseCheckoutStatus, g.PromptMergeStatus) + + return prompt, nil +} + +func IsDir(name string) bool { + fileInfo, err := os.Stat(name) + if err != nil { + return false + } + return fileInfo.IsDir() +} + +func IsSymlink(name string) bool { + fileInfo, err := os.Lstat(name) + if err != nil { + return false + } + return fileInfo.Mode()&fs.ModeSymlink != 0 // bitwise check if mode has symlink +} + +func ReadFileTrimNewline(name string) (string, error) { + result, err := os.ReadFile(name) + if err != nil { + return "", err + } + return strings.TrimSuffix(string(result), "\n"), err +} + +func GitSymbolicRef(ref string) (string, error) { + cmd := exec.Command( + "git", + "symbolic-ref", + ref, + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return string(stdCombined), err + } + return strings.TrimSuffix(string(stdCombined), "\n"), err +} + +func GitDescribeTag(ref string) (string, error) { + cmd := exec.Command( + "git", + "describe", + "--tags", + "--exact-match", + ref, + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return string(stdCombined), err + } + return strings.TrimSuffix(string(stdCombined), "\n"), err +} + +func GitLsFilesUnmerged() (string, error) { + cmd := exec.Command( + "git", + "ls-files", + "--unmerged", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return string(stdCombined), err + } + return strings.TrimSuffix(string(stdCombined), "\n"), err +} + +func GitSparseCheckout() (bool, error) { + cmd := exec.Command( + "git", + "config", + "--bool", + "core.sparseCheckout", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil && len(stdCombined) != 0 { + return false, err + } + isSparseCheckout, _ := strconv.ParseBool(strings.TrimSuffix(string(stdCombined), "\n")) + return isSparseCheckout, nil +} + +func (g *GitRepo) GitHasUpstreamAndCleanWorkingTree() (bool, bool, error) { + exitCode := 0 + hasUpstream := g.ShortSha != "" + cmd := exec.Command( + "git", + "diff", + "--no-ext-diff", + "--quiet", + "HEAD", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + exitCode = exitError.ExitCode() + } + stderr := string(stdCombined) + amiguiousHead := "ambiguous argument 'HEAD'" + noUpstream := "no upstream configured" + noBranch := "no such branch" + if strings.Contains(stderr, amiguiousHead) || strings.Contains(stderr, noUpstream) || strings.Contains(stderr, noBranch) { + exitCode = 0 + hasUpstream = false + // there is no upstream so compare against staging area + cachedCmd := exec.Command( + "git", + "diff", + "--cached", + "--no-ext-diff", + "--quiet", + ) + err = cachedCmd.Run() + if err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + exitCode = exitError.ExitCode() + } + } + } + } + if exitCode != 0 && exitCode != 1 { + return false, false, err + } + + return hasUpstream, exitCode == 0, nil +} + +func GitHasUntracked() (bool, error) { + exitCode := 0 + cmd := exec.Command( + "git", + "ls-files", + "--others", + "--exclude-standard", + "--directory", + "--no-empty-directory", + "--error-unmatch", + "--", + ":/*", + ) + err := cmd.Run() + if err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + exitCode = exitError.ExitCode() + } + } + if exitCode != 0 && exitCode != 1 { + return false, err + } + return exitCode == 0, nil +} + +func GitCommitCountsNoUpstream() (int, int, error) { + cmd := exec.Command( + "git", + "rev-list", + "--count", + "HEAD", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return 0, 0, err + } + ahead, _ := strconv.Atoi(strings.TrimSuffix(string(stdCombined), "\n")) + return ahead, 0, nil +} + +func GitCommitCounts() (int, int, error) { + cmd := exec.Command( + "git", + "rev-list", + "--left-right", + "--count", + "...@{upstream}", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return 0, 0, err + } + fields := strings.Fields(string(stdCombined)) + if len(fields) != 2 { + return 0, 0, fmt.Errorf("expected field length of 2 got %d", len(fields)) + } + ahead, _ := strconv.Atoi(fields[0]) + behind, _ := strconv.Atoi(fields[1]) + return ahead, behind, nil +} + +func main() { + color.NoColor = false + + gitRepo := GitRepo{} + + stderr, err := gitRepo.RevParse() + if err != nil && gitRepo.GitDir == "" { + log.Fatalf("%s%s", stderr, err) + } + + branchInfo, err := gitRepo.BranchInfo() + if err != nil { + log.Fatal(err) + } + + prefix := "  " + suffix := "" + + gitSymbol := "" + + if gitRepo.IsInBareRepo { + gitSymbol = "󱣻" + } + + if gitRepo.IsInBareRepo || gitRepo.IsInGitDir { + c := color.New(color.FgHiBlack) + if gitSymbol != "" { + gitSymbol = " " + gitSymbol + } + c.Printf("%s%s%s%s", prefix, branchInfo, " "+gitSymbol, suffix) + return + } + + upstreamExists, cleanWorkingTree, err := gitRepo.GitHasUpstreamAndCleanWorkingTree() + if err != nil { + log.Fatal(err) + } + + if err == nil || !upstreamExists { + hasUntracked, err := GitHasUntracked() + if err != nil { + log.Fatal(err) + } + + ahead, behind := 0, 0 + + if !gitRepo.IsDetached { + if !upstreamExists { + ahead, behind, err = GitCommitCountsNoUpstream() + } else { + ahead, behind, err = GitCommitCounts() + } + if err != nil { + log.Fatal(err) + } + } + + c := color.New() + if cleanWorkingTree { + c = color.New(color.FgGreen) + } + + if ahead > 0 { + c = color.New(color.FgYellow) + gitSymbol = fmt.Sprintf("↑[%d]", ahead) + } + if behind > 0 { + c = color.New(color.FgYellow) + gitSymbol = fmt.Sprintf("↓[%d]", behind) + } + + if ahead > 0 && behind > 0 { + gitSymbol = fmt.Sprintf("↕ ↑[%d] ↓[%d]", ahead, behind) + } + + if !upstreamExists { + c = color.New(color.FgHiBlack) + } + + if hasUntracked { + c = color.New(color.FgMagenta) + gitSymbol = fmt.Sprintf("*%s", gitSymbol) + } + + if !cleanWorkingTree && !hasUntracked { + c = color.New(color.FgRed) + gitSymbol = fmt.Sprintf("*%s", gitSymbol) + } + if gitSymbol != "" { + gitSymbol = " " + gitSymbol + } + c.Printf("%s%s%s%s", prefix, branchInfo, gitSymbol, suffix) + + } +} From c3883be2c96b71c66c369f65f7592325d303f80f Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Mon, 4 Mar 2024 23:54:00 -0500 Subject: [PATCH 17/64] chore: add bgps to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1377554..a15bb1b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.swp +bgps From 64680cdecd9beb627038013c04d13ef15042ffab Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Mon, 4 Mar 2024 23:55:47 -0500 Subject: [PATCH 18/64] chore: fix space --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index c34fd8c..20f8d41 100644 --- a/main.go +++ b/main.go @@ -512,7 +512,7 @@ func main() { if gitSymbol != "" { gitSymbol = " " + gitSymbol } - c.Printf("%s%s%s%s", prefix, branchInfo, " "+gitSymbol, suffix) + c.Printf("%s%s%s%s", prefix, branchInfo, gitSymbol, suffix) return } From 152fa7a6ce3103ec714702a790e06c708267a9df Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:14:18 -0500 Subject: [PATCH 19/64] chore: fixes and coloring --- main.go | 141 ++++++++++++++++++++++++-------------------------------- 1 file changed, 61 insertions(+), 80 deletions(-) diff --git a/main.go b/main.go index 20f8d41..1cb878a 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "io/fs" - "log" "os" "os/exec" "strconv" @@ -20,8 +19,8 @@ type GitRepo struct { IsInWorkTree bool IsInBareRepo bool IsInShallowRepo bool - IsDetached bool IsSparseCheckout bool + Tag string AbbrevRef string ShortSha string PromptMergeStatus string @@ -242,18 +241,16 @@ func (g *GitRepo) BranchInfo() (string, error) { ref = strings.TrimPrefix(head, "ref: ") if head == ref { - g.IsDetached = true tag, err := GitDescribeTag("HEAD") if err == nil { ref = tag + g.Tag = ref } else if g.ShortSha == "" && len(head) > 7 { ref = head[:7] } else { ref = g.ShortSha } ref = fmt.Sprintf("(%s)", ref) - } else if g.AbbrevRef == "" { - g.IsDetached = true } } } @@ -284,7 +281,7 @@ func (g *GitRepo) BranchInfo() (string, error) { if checkSparse { g.IsSparseCheckout, err = GitSparseCheckout() if err != nil { - log.Fatal(err) + errMsg("sparse checkout", err, 0) } if g.IsSparseCheckout { @@ -377,9 +374,8 @@ func GitSparseCheckout() (bool, error) { return isSparseCheckout, nil } -func (g *GitRepo) GitHasUpstreamAndCleanWorkingTree() (bool, bool, error) { +func (g *GitRepo) GitHasCleanWorkingTree() (bool, error) { exitCode := 0 - hasUpstream := g.ShortSha != "" cmd := exec.Command( "git", "diff", @@ -398,7 +394,6 @@ func (g *GitRepo) GitHasUpstreamAndCleanWorkingTree() (bool, bool, error) { noBranch := "no such branch" if strings.Contains(stderr, amiguiousHead) || strings.Contains(stderr, noUpstream) || strings.Contains(stderr, noBranch) { exitCode = 0 - hasUpstream = false // there is no upstream so compare against staging area cachedCmd := exec.Command( "git", @@ -416,10 +411,10 @@ func (g *GitRepo) GitHasUpstreamAndCleanWorkingTree() (bool, bool, error) { } } if exitCode != 0 && exitCode != 1 { - return false, false, err + return false, err } - return hasUpstream, exitCode == 0, nil + return exitCode == 0, nil } func GitHasUntracked() (bool, error) { @@ -447,21 +442,6 @@ func GitHasUntracked() (bool, error) { return exitCode == 0, nil } -func GitCommitCountsNoUpstream() (int, int, error) { - cmd := exec.Command( - "git", - "rev-list", - "--count", - "HEAD", - ) - stdCombined, err := cmd.CombinedOutput() - if err != nil { - return 0, 0, err - } - ahead, _ := strconv.Atoi(strings.TrimSuffix(string(stdCombined), "\n")) - return ahead, 0, nil -} - func GitCommitCounts() (int, int, error) { cmd := exec.Command( "git", @@ -483,19 +463,27 @@ func GitCommitCounts() (int, int, error) { return ahead, behind, nil } +func errMsg(hint string, e error, exitCode int) { + color.New(color.FgHiRed).Printf(" bgps error(%s): %s", hint, strings.ReplaceAll(e.Error(), "\n", "")) + os.Exit(exitCode) +} + func main() { color.NoColor = false gitRepo := GitRepo{} stderr, err := gitRepo.RevParse() - if err != nil && gitRepo.GitDir == "" { - log.Fatalf("%s%s", stderr, err) + if err != nil { + if strings.Contains(string(stderr), "not a git repository") { + os.Exit(0) + } + errMsg("rev parse", errors.Join(err, errors.New(string(stderr))), 1) } branchInfo, err := gitRepo.BranchInfo() if err != nil { - log.Fatal(err) + errMsg("branch info", err, 0) } prefix := "  " @@ -516,65 +504,58 @@ func main() { return } - upstreamExists, cleanWorkingTree, err := gitRepo.GitHasUpstreamAndCleanWorkingTree() + cleanWorkingTree, err := gitRepo.GitHasCleanWorkingTree() if err != nil { - log.Fatal(err) + errMsg("clean working tree", err, 0) + } + hasUntracked, err := GitHasUntracked() + if err != nil { + color.Red("%s", err) + os.Exit(0) } - if err == nil || !upstreamExists { - hasUntracked, err := GitHasUntracked() - if err != nil { - log.Fatal(err) - } - - ahead, behind := 0, 0 - - if !gitRepo.IsDetached { - if !upstreamExists { - ahead, behind, err = GitCommitCountsNoUpstream() - } else { - ahead, behind, err = GitCommitCounts() - } - if err != nil { - log.Fatal(err) - } - } - - c := color.New() - if cleanWorkingTree { - c = color.New(color.FgGreen) - } + ahead, behind := 0, 0 + if gitRepo.Tag == "" && gitRepo.ShortSha != "" { + ahead, behind, err = GitCommitCounts() + } + if err != nil { + color.New(color.FgRed).Printf("%s", err) + os.Exit(0) + } - if ahead > 0 { - c = color.New(color.FgYellow) - gitSymbol = fmt.Sprintf("↑[%d]", ahead) - } - if behind > 0 { - c = color.New(color.FgYellow) - gitSymbol = fmt.Sprintf("↓[%d]", behind) - } + c := color.New() + if cleanWorkingTree { + c = color.New(color.FgGreen) + } - if ahead > 0 && behind > 0 { - gitSymbol = fmt.Sprintf("↕ ↑[%d] ↓[%d]", ahead, behind) - } + if ahead > 0 { + c = color.New(color.FgYellow) + gitSymbol = fmt.Sprintf("↑[%d]", ahead) + } + if behind > 0 { + c = color.New(color.FgYellow) + gitSymbol = fmt.Sprintf("↓[%d]", behind) + } - if !upstreamExists { - c = color.New(color.FgHiBlack) - } + if ahead > 0 && behind > 0 { + gitSymbol = fmt.Sprintf("↕ ↑[%d] ↓[%d]", ahead, behind) + } - if hasUntracked { - c = color.New(color.FgMagenta) - gitSymbol = fmt.Sprintf("*%s", gitSymbol) - } + if gitRepo.ShortSha == "" { + c = color.New(color.FgHiBlack) + } - if !cleanWorkingTree && !hasUntracked { - c = color.New(color.FgRed) - gitSymbol = fmt.Sprintf("*%s", gitSymbol) - } - if gitSymbol != "" { - gitSymbol = " " + gitSymbol - } - c.Printf("%s%s%s%s", prefix, branchInfo, gitSymbol, suffix) + if hasUntracked { + c = color.New(color.FgMagenta) + gitSymbol = fmt.Sprintf("*%s", gitSymbol) + } + if !cleanWorkingTree && !hasUntracked { + c = color.New(color.FgRed) + gitSymbol = fmt.Sprintf("*%s", gitSymbol) + } + if gitSymbol != "" { + gitSymbol = " " + gitSymbol } + c.Printf("%s%s%s%s", prefix, branchInfo, gitSymbol, suffix) } From 37ae2d18947e6e65124b422c148a94fe2388005e Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:28:21 -0500 Subject: [PATCH 20/64] chore: allow err passthrough --- main.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 1cb878a..665314e 100644 --- a/main.go +++ b/main.go @@ -374,6 +374,13 @@ func GitSparseCheckout() (bool, error) { return isSparseCheckout, nil } +func IsNoUpstreamErr(msg string) bool { + amiguiousHead := "ambiguous argument 'HEAD'" + noUpstream := "no upstream configured" + noBranch := "no such branch" + return strings.Contains(msg, amiguiousHead) || strings.Contains(msg, noUpstream) || strings.Contains(msg, noBranch) +} + func (g *GitRepo) GitHasCleanWorkingTree() (bool, error) { exitCode := 0 cmd := exec.Command( @@ -389,10 +396,7 @@ func (g *GitRepo) GitHasCleanWorkingTree() (bool, error) { exitCode = exitError.ExitCode() } stderr := string(stdCombined) - amiguiousHead := "ambiguous argument 'HEAD'" - noUpstream := "no upstream configured" - noBranch := "no such branch" - if strings.Contains(stderr, amiguiousHead) || strings.Contains(stderr, noUpstream) || strings.Contains(stderr, noBranch) { + if IsNoUpstreamErr(stderr) { exitCode = 0 // there is no upstream so compare against staging area cachedCmd := exec.Command( @@ -478,7 +482,7 @@ func main() { if strings.Contains(string(stderr), "not a git repository") { os.Exit(0) } - errMsg("rev parse", errors.Join(err, errors.New(string(stderr))), 1) + // allow other errors to pass through, the git repo may not have upstream } branchInfo, err := gitRepo.BranchInfo() From 3a9316e047044692859914ec75948756b92eaedf Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Thu, 7 Mar 2024 08:06:07 -0500 Subject: [PATCH 21/64] chore: cleanup, truecolor, and toml --- bash/bgps.sh | 304 +++++++++++++++++++++++ bashbgps | 305 ----------------------- go.mod | 8 +- go.sum | 29 ++- main.go | 563 +++---------------------------------------- pkg/color/color.go | 128 ++++++++++ pkg/config/config.go | 9 + pkg/git/git.go | 258 ++++++++++++++++++++ pkg/git/repo.go | 251 +++++++++++++++++++ pkg/util/util.go | 40 +++ 10 files changed, 1042 insertions(+), 853 deletions(-) create mode 100755 bash/bgps.sh delete mode 100755 bashbgps create mode 100644 pkg/color/color.go create mode 100644 pkg/config/config.go create mode 100644 pkg/git/git.go create mode 100644 pkg/git/repo.go create mode 100644 pkg/util/util.go diff --git a/bash/bgps.sh b/bash/bgps.sh new file mode 100755 index 0000000..c9285ae --- /dev/null +++ b/bash/bgps.sh @@ -0,0 +1,304 @@ +#!/usr/bin/env bash +# +# Copyright (C) 2017 Michael Smith +# Copyright (C) 2006,2007 Shawn O. Pearce +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# A better bash prompt for git. bgps provides a convenient way to customize +# the PS1 prompt and to determine information about the current git branch. +# bgps can indicate if the branch has a clean or dirty working tree, whether +# or not it is tracking a remote branch, and the number of commits the local +# branch is ahead or behind the remote branch. +# +# Parts of this program were copied and modified from +# +# + +####################################### +# Read contents of file to variables +# Arguments: +# $filepath the path of the file to read +# $variable_names... the name of the variables to store the contents +####################################### +_eread() { + local filepath="${1}" + shift + [[ -r "${filepath}" ]] && read -r "$@" <"${filepath}" +} + +####################################### +# Get current git branch and additional repository information +# Returns: 0 on success +# Returns: 2 on success and in a detached head state +####################################### +_branch_info() { + + local git_dir="$1" + local inside_gitdir="$2" + local bare_repo="$3" + local inside_worktree="$4" + local short_sha="$5" + + local is_detached="false" + local merge_status="" + local sparse="" + local branch="" + local step="" + local total="" + if [[ -d "${git_dir}/rebase-merge" ]]; then + + _eread "${git_dir}/rebase-merge/head-name" branch + _eread "${git_dir}/rebase-merge/msgnum" step + _eread "${git_dir}/rebase-merge/end" total + + if [[ -f "${git_dir}/rebase-merge/interactive" ]]; then + merge_status="|REBASE-i" + else + merge_status="|REBASE-m" + fi + + else + + if [[ -d "${git_dir}/rebase-apply" ]]; then + + _eread "${git_dir}/rebase-apply/next" step + _eread "${git_dir}/rebase-apply/last" total + + if [[ -f "${git_dir}/rebase-apply/rebasing" ]]; then + _eread "${git_dir}/rebase-apply/head-name" branch + merge_status="|REBASE" + elif [[ -f "${git_dir}/rebase-apply/applying" ]]; then + merge_status="|AM" + else + merge_status="|AM/REBASE" + fi + + elif [[ -f "${git_dir}/MERGE_HEAD" ]]; then + merge_status="|MERGING" + elif [[ -f "${git_dir}/CHERRY_PICK_HEAD" ]]; then + merge_status="|CHERRY-PICKING" + elif [[ -f "${git_dir}/REVERT_HEAD" ]]; then + merge_status="|REVERTING" + elif [[ -f "${git_dir}/BISECT_LOG" ]]; then + merge_status="|BISECTING" + fi + + # TODO stopped here + + if [[ "${branch}" ]]; then + : + elif [[ -L "${git_dir}/HEAD" ]]; then + # symlink symbolic ref + branch="$(git symbolic-ref HEAD 2>/dev/null)" + else + local head="" + if ! _eread "${git_dir}/HEAD" head; then + return 1 + fi + branch="${head#ref: }" + local upstream_info + upstream_info="$(git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null)" + if [[ "${head}" == "${branch}" ]]; then + is_detached="true" + branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${head:0:7}..." # was short + branch="(${branch})" + elif [[ "$upstream_info" == '@{upstream}' ]] || [[ "$upstream_info" == '' ]]; then + is_detached="true" + fi + fi + fi + + if [[ -n "${step}" ]] && [[ -n "${total}" ]]; then + merge_status="${merge_status} ${step}/${total}" + fi + + if [[ "$merge_status" ]] && [[ $(git ls-files --unmerged 2>/dev/null) ]]; then + merge_status="$merge_status|CONFLICT" + fi + + local prefix="" + + if [[ "${inside_gitdir}" == "true" ]]; then + if [[ "${bare_repo}" == "true" ]]; then + prefix="BARE:" + else + branch="GIT_DIR!" + fi + fi + + branch="${branch##refs/heads/}" + + if [[ "$(git config --bool core.sparseCheckout)" == "true" ]]; then + sparse="|SPARSE" + fi + printf -- "%s%s%s%s" "${prefix}" "${branch}" "${sparse}" "${merge_status}" + + if [[ "$is_detached" == "true" ]]; then + return 2 + fi + + return 0 +} + +####################################### +# Get formatted git status +# Globals: +# $stop_color +# Returns: 0 on success +####################################### +_bgps_git_status() { + local color_clean='\x1b[38;2;167;192;128m' + + local color_no_upstream='\x1b[38;2;146;131;116m' + local color_untracked='\x1b[38;2;211;134;155m' + local color_dirty='\x1b[38;2;255;105;97m' + local color_conflict='\x1b[38;2;219;188;95m' + local prefix='  ' + local postfix='' + local git_ahead='↑[%s]' + local git_behind='↓[%s]' + local git_diverged='↕ ↑[%a] ↓[%b]' + local git_bare='󱣻' + local git_color="${stop_color}" + + local git_symbol="" + + local repo_info + repo_info="$(git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short '@{upstream}' 2>/dev/null)" + + local repo_info_arr + readarray -t repo_info_arr <<<"$repo_info" + local git_dir="${repo_info_arr[0]}" + local inside_gitdir="${repo_info_arr[1]}" + local bare_repo="${repo_info_arr[2]}" + local inside_worktree="${repo_info_arr[3]}" + local short_sha="${repo_info_arr[4]}" + + local is_detached="false" + local git_branch_exit + local git_branch + git_branch=$(_branch_info "$git_dir" "$inside_gitdir" "$bare_repo" "$inside_worktree" "$short_sha") + git_branch_exit="$?" + + if (("$git_branch_exit" == 2)); then + is_detached="true" + elif (("$git_branch_exit")); then + return 1 + fi + + if [[ "$bare_repo" == "true" ]]; then + git_symbol="${git_bare}" + fi + if [[ "$bare_repo" == "true" ]] || [[ "$inside_gitdir" == "true" ]]; then + git_color="${color_no_upstream}" + printf -- "%s" "${git_color}" + printf -- "%s%s%s%s" "${prefix:+${prefix}}" "${git_branch}" "${git_symbol:+ ${git_symbol}}" "${postfix:+${postfix}}" + return 0 + fi + + local diff_error + diff_error=$(git diff --no-ext-diff --quiet HEAD 2>&1) + local dirty_exit_code="${?}" # code == 0 clean working tree, code == 1 dirty working tree + + local empty_git_error="ambiguous argument 'HEAD'" + local no_upstream_git_error="no upstream configured" + local no_such_branch_git_error="no such branch" + local no_upstream=0 + if [[ "$short_sha" == "" ]]; then + no_upstream=1 + fi + if [[ "${diff_error}" == *"${empty_git_error}"* ]] || [[ "${diff_error}" == *"${no_upstream_git_error}"* ]] || [[ "${diff_error}" == *"${no_such_branch_git_error}"* ]]; then + no_upstream=1 + # there is no upstream so compare against staging area + diff_error=$(git diff --cached --no-ext-diff --quiet 2>&1) + dirty_exit_code="${?}" # code == 0 clean working tree, code == 1 dirty working tree + fi + + local untracked_exit_code="1" # code == 0 untracked files exist, code > 0 no untracked files + # allow no upstream error to passthrough to apply coloring and formatting + if (("${dirty_exit_code}" == 0)) || (("${dirty_exit_code}" == 1)) || (("${no_upstream}")); then + + git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null + untracked_exit_code="${?}" # code == 0 untracked files exist, code > 0 no untracked files + + local commit_counts + local commit_counts_exit_code=1 + if [[ "$is_detached" == "true" ]]; then + commit_counts=(0 0) + elif ((no_upstream)); then + ahead_count="$(git rev-list --count HEAD 2>/dev/null)" + commit_counts=("$ahead_count" 0) + else + IFS=$'\t' read -r -a commit_counts <<<"$(git rev-list --left-right --count ...'@{upstream}' 2>/dev/null)" + commit_counts_exit_code="$?" + fi + + if ((!dirty_exit_code)); then + git_color="${color_clean}" + fi + + if ((commit_counts[0])); then + git_color="${color_conflict}" + git_symbol="${git_ahead/\%s/${commit_counts[0]}}" + fi + + if ((commit_counts[1])); then + git_color="${color_conflict}" + git_symbol="${git_behind/\%s/${commit_counts[1]}}" + fi + + if ((commit_counts[0] && commit_counts[1])); then + git_symbol="${git_diverged/\%a/${commit_counts[0]}}" + git_symbol="${git_symbol/\%b/${commit_counts[1]}}" + fi + + # continue to check for untracked and dirty because + # it is still possible even without an upstream + + if ((no_upstream)) || ((commit_counts_exit_code)); then + # no upstream configured for branch + git_color="${color_no_upstream}" + fi + + if ((!untracked_exit_code)); then + git_color="${color_untracked}" + git_symbol="*${git_symbol#\*}" + fi + + if ((dirty_exit_code == 1)) && ((untracked_exit_code)); then + git_color="${color_dirty}" + git_symbol="*${git_symbol#\*}" + fi + + printf -- "%s" "${git_color}" + printf -- "%s%s%s%s" "${prefix:+${prefix}}" "${git_branch}" "${git_symbol:+ ${git_symbol}}" "${postfix:+${postfix}}" + else + printf -- "%s" "${color_dirty}" + printf -- "ERROR(bgps): %s" "${diff_error}" + fi + printf -- '' + + return 0 +} + +stop_color="\033[0m" +# shellcheck disable=SC2059 +printf -- "$(_bgps_git_status)$stop_color" + +# unset variables and functions +unset stop_color +unset -f _bgps_git_status +unset -f _branch_info +unset -f _eread diff --git a/bashbgps b/bashbgps deleted file mode 100755 index 97fb30c..0000000 --- a/bashbgps +++ /dev/null @@ -1,305 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (C) 2017 Michael Smith -# Copyright (C) 2006,2007 Shawn O. Pearce -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# A better bash prompt for git. bgps provides a convenient way to customize -# the PS1 prompt and to determine information about the current git branch. -# bgps can indicate if the branch has a clean or dirty working tree, whether -# or not it is tracking a remote branch, and the number of commits the local -# branch is ahead or behind the remote branch. -# -# Parts of this program were copied and modified from -# -# - -####################################### -# Read contents of file to variables -# Arguments: -# $filepath the path of the file to read -# $variable_names... the name of the variables to store the contents -####################################### -_eread () -{ - local filepath="${1}" - shift - [[ -r "${filepath}" ]] && read -r "$@" <"${filepath}" -} - -####################################### -# Get current git branch and additional repository information -# Returns: 0 on success -# Returns: 2 on success and in a detached head state -####################################### -_branch_info() { - - local git_dir="$1" - local inside_gitdir="$2" - local bare_repo="$3" - local inside_worktree="$4" - local short_sha="$5" - - local is_detached="false" - local merge_status="" - local sparse="" - local branch="" - local step="" - local total="" - if [[ -d "${git_dir}/rebase-merge" ]] ; then - - _eread "${git_dir}/rebase-merge/head-name" branch - _eread "${git_dir}/rebase-merge/msgnum" step - _eread "${git_dir}/rebase-merge/end" total - - if [[ -f "${git_dir}/rebase-merge/interactive" ]]; then - merge_status="|REBASE-i" - else - merge_status="|REBASE-m" - fi - - else - - if [[ -d "${git_dir}/rebase-apply" ]] ; then - - _eread "${git_dir}/rebase-apply/next" step - _eread "${git_dir}/rebase-apply/last" total - - if [[ -f "${git_dir}/rebase-apply/rebasing" ]] ; then - _eread "${git_dir}/rebase-apply/head-name" branch - merge_status="|REBASE" - elif [[ -f "${git_dir}/rebase-apply/applying" ]] ; then - merge_status="|AM" - else - merge_status="|AM/REBASE" - fi - - elif [[ -f "${git_dir}/MERGE_HEAD" ]] ; then - merge_status="|MERGING" - elif [[ -f "${git_dir}/CHERRY_PICK_HEAD" ]] ; then - merge_status="|CHERRY-PICKING" - elif [[ -f "${git_dir}/REVERT_HEAD" ]] ; then - merge_status="|REVERTING" - elif [[ -f "${git_dir}/BISECT_LOG" ]] ; then - merge_status="|BISECTING" - fi - - # TODO stopped here - - if [[ "${branch}" ]]; then - : - elif [[ -h "${git_dir}/HEAD" ]] ; then - # symlink symbolic ref - branch="$(git symbolic-ref HEAD 2>/dev/null)" - else - local head="" - if ! _eread "${git_dir}/HEAD" head ; then - return 1 - fi - branch="${head#ref: }" - local upstream_info - upstream_info="$(git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null)" - if [[ "${head}" == "${branch}" ]] ; then - is_detached="true" - branch="$(git describe --tags --exact-match HEAD 2>/dev/null)" || branch="${head:0:7}..." # was short - branch="(${branch})" - elif [[ "$upstream_info" == '@{upstream}' ]] || [[ "$upstream_info" == '' ]]; then - is_detached="true" - fi - fi - fi - - if [[ -n "${step}" ]] && [[ -n "${total}" ]] ; then - merge_status="${merge_status} ${step}/${total}" - fi - - if [[ "$merge_status" ]] && [[ $(git ls-files --unmerged 2>/dev/null) ]]; then - merge_status="$merge_status|CONFLICT" - fi - - local prefix="" - - if [[ "${inside_gitdir}" == "true" ]] ; then - if [[ "${bare_repo}" == "true" ]] ; then - prefix="BARE:" - else - branch="GIT_DIR!" - fi - fi - - branch="${branch##refs/heads/}" - - if [[ "$(git config --bool core.sparseCheckout)" == "true" ]]; then - sparse="|SPARSE" - fi - printf -- "%s%s%s%s" "${prefix}" "${branch}" "${sparse}" "${merge_status}" - - if [[ "$is_detached" == "true" ]]; then - return 2 - fi - - return 0 -} - -####################################### -# Get formatted git status -# Globals: -# $stop_color -# Returns: 0 on success -####################################### -_bgps_git_status() { - local color_clean='\x1b[38;2;167;192;128m' - - local color_no_upstream='\x1b[38;2;146;131;116m' - local color_untracked='\x1b[38;2;211;134;155m' - local color_dirty='\x1b[38;2;255;105;97m' - local color_conflict='\x1b[38;2;219;188;95m' - local prefix='  ' - local postfix='' - local git_ahead='↑[%s]' - local git_behind='↓[%s]' - local git_diverged='↕ ↑[%a] ↓[%b]' - local git_bare='󱣻' - local git_color="${stop_color}" - - local git_symbol="" - - local repo_info - repo_info="$(git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short '@{upstream}' 2>/dev/null)" - - local repo_info_arr - readarray -t repo_info_arr <<<"$repo_info" - local git_dir="${repo_info_arr[0]}" - local inside_gitdir="${repo_info_arr[1]}" - local bare_repo="${repo_info_arr[2]}" - local inside_worktree="${repo_info_arr[3]}" - local short_sha="${repo_info_arr[4]}" - - local is_detached="false" - local git_branch_exit - local git_branch - git_branch=$(_branch_info "$git_dir" "$inside_gitdir" "$bare_repo" "$inside_worktree" "$short_sha") - git_branch_exit="$?" - - if (("$git_branch_exit" == 2)); then - is_detached="true" - elif (("$git_branch_exit")); then - return 1 - fi - - if [[ "$bare_repo" == "true" ]]; then - git_symbol="${git_bare}" - fi - if [[ "$bare_repo" == "true" ]] || [[ "$inside_gitdir" == "true" ]] ; then - git_color="${color_no_upstream}" - printf -- "%s" "${git_color}" - printf -- "%s%s%s%s" "${prefix:+${prefix}}" "${git_branch}" "${git_symbol:+ ${git_symbol}}" "${postfix:+${postfix}}" - return 0 - fi - - local diff_error - diff_error=$(git diff --no-ext-diff --quiet HEAD 2>&1) - local dirty_exit_code="${?}" # code == 0 clean working tree, code == 1 dirty working tree - - local empty_git_error="ambiguous argument 'HEAD'" - local no_upstream_git_error="no upstream configured" - local no_such_branch_git_error="no such branch" - local no_upstream=0 - if [[ "$short_sha" == "" ]]; then - no_upstream=1 - fi - if [[ "${diff_error}" == *"${empty_git_error}"* ]] || [[ "${diff_error}" == *"${no_upstream_git_error}"* ]] || [[ "${diff_error}" == *"${no_such_branch_git_error}"* ]]; then - no_upstream=1 - # there is no upstream so compare against staging area - diff_error=$(git diff --cached --no-ext-diff --quiet 2>&1) - dirty_exit_code="${?}" # code == 0 clean working tree, code == 1 dirty working tree - fi - - local untracked_exit_code="1" # code == 0 untracked files exist, code > 0 no untracked files - # allow no upstream error to passthrough to apply coloring and formatting - if (( "${dirty_exit_code}" == 0 )) || (( "${dirty_exit_code}" == 1 )) || (( "${no_upstream}" )); then - - git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null - untracked_exit_code="${?}" # code == 0 untracked files exist, code > 0 no untracked files - - local commit_counts - local commit_counts_exit_code=1 - if [[ "$is_detached" == "true" ]]; then - commit_counts=(0 0) - elif ((no_upstream)); then - ahead_count="$(git rev-list --count HEAD 2>/dev/null)" - commit_counts=("$ahead_count" 0) - else - IFS=$'\t' read -r -a commit_counts <<< "$(git rev-list --left-right --count ...'@{upstream}' 2>/dev/null)" - commit_counts_exit_code="$?" - fi - - if ((!dirty_exit_code)) ; then - git_color="${color_clean}" - fi - - if ((commit_counts[0])) ; then - git_color="${color_conflict}" - git_symbol="${git_ahead/\%s/${commit_counts[0]}}" - fi - - if ((commit_counts[1])) ; then - git_color="${color_conflict}" - git_symbol="${git_behind/\%s/${commit_counts[1]}}" - fi - - if ((commit_counts[0] && commit_counts[1])) ; then - git_symbol="${git_diverged/\%a/${commit_counts[0]}}" - git_symbol="${git_symbol/\%b/${commit_counts[1]}}" - fi - - # continue to check for untracked and dirty because - # it is still possible even without an upstream - - if ((no_upstream)) || ((commit_counts_exit_code)) ; then - # no upstream configured for branch - git_color="${color_no_upstream}" - fi - - if ((!untracked_exit_code)) ; then - git_color="${color_untracked}" - git_symbol="*${git_symbol#\*}" - fi - - if (( dirty_exit_code == 1 )) && ((untracked_exit_code)) ; then - git_color="${color_dirty}" - git_symbol="*${git_symbol#\*}" - fi - - printf -- "%s" "${git_color}" - printf -- "%s%s%s%s" "${prefix:+${prefix}}" "${git_branch}" "${git_symbol:+ ${git_symbol}}" "${postfix:+${postfix}}" - else - printf -- "%s" "${color_dirty}" - printf -- "ERROR(bgps): %s" "${diff_error}" - fi - printf -- '' - - return 0 -} - -stop_color="\033[0m" -# shellcheck disable=SC2059 -printf -- "$(_bgps_git_status)$stop_color" - -# unset variables and functions -unset stop_color -unset -f _bgps_git_status -unset -f _branch_info -unset -f _eread diff --git a/go.mod b/go.mod index 74cdd14..7415c18 100644 --- a/go.mod +++ b/go.mod @@ -2,10 +2,4 @@ module github.com/mikesmithgh/bgps go 1.22.0 -require github.com/fatih/color v1.16.0 - -require ( - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - golang.org/x/sys v0.14.0 // indirect -) +require github.com/pelletier/go-toml/v2 v2.1.1 diff --git a/go.sum b/go.sum index 7f13de9..532513b 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,18 @@ -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index 665314e..0c2421a 100644 --- a/main.go +++ b/main.go @@ -1,483 +1,53 @@ package main import ( - "errors" "fmt" - "io" - "io/fs" "os" - "os/exec" - "strconv" + "path" + "runtime" "strings" - "github.com/fatih/color" + "github.com/mikesmithgh/bgps/pkg/config" + "github.com/mikesmithgh/bgps/pkg/git" + "github.com/mikesmithgh/bgps/pkg/util" + "github.com/pelletier/go-toml/v2" ) -type GitRepo struct { - GitDir string - IsInGitDir bool - IsInWorkTree bool - IsInBareRepo bool - IsInShallowRepo bool - IsSparseCheckout bool - Tag string - AbbrevRef string - ShortSha string - PromptMergeStatus string - PromptSparseCheckoutStatus string - PromptBranch string - PromptBareRepoStatus string -} - -func (g *GitRepo) GitDirFileExists(name string) (bool, error) { - _, err := os.Stat(g.GitDirPath(name)) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - return false, nil - } - return false, err - } - return true, nil -} - -func (g *GitRepo) IsGitDir(name string) bool { - return IsDir(g.GitDirPath(name)) -} - -func (g *GitRepo) IsGitDirSymlink(name string) bool { - return IsSymlink(g.GitDirPath(name)) -} - -func (g *GitRepo) GitDirPath(path string) string { - return fmt.Sprintf("%s/%s", g.GitDir, path) -} - -func (g *GitRepo) ReadGirDirFile(name string) (string, error) { - return ReadFileTrimNewline(g.GitDirPath(name)) -} - -func (g *GitRepo) RevParseShort() ([]byte, error) { - - cmd := exec.Command( - "git", - "rev-parse", - "--short", - "@{upstream}", - ) - - stderrPipe, err := cmd.StderrPipe() - if err != nil { - return nil, err - } - stdoutPipe, err := cmd.StdoutPipe() - if err != nil { - return nil, err - } - if err := cmd.Start(); err != nil { - return nil, err - } - - stderr, err := io.ReadAll(stderrPipe) - if err != nil { - return stderr, err - } - - stdout, err := io.ReadAll(stdoutPipe) - if err != nil { - return stderr, err - } - - err = cmd.Wait() - - if len(stdout) > 0 { - g.ShortSha = strings.TrimSuffix(string(stdout), "\n") - } - - return stderr, err -} - -func (g *GitRepo) RevParse() ([]byte, error) { - cmd := exec.Command( - "git", - "rev-parse", - "--verify", - "--absolute-git-dir", - "--is-inside-git-dir", - "--is-inside-work-tree", - "--is-bare-repository", - "--is-shallow-repository", - "--abbrev-ref", - "@{upstream}", - ) - - stderrPipe, err := cmd.StderrPipe() - if err != nil { - return nil, err - } - stdoutPipe, err := cmd.StdoutPipe() - if err != nil { - return nil, err - } - if err := cmd.Start(); err != nil { - return nil, err - } - - stderr, err := io.ReadAll(stderrPipe) - if err != nil { - return stderr, err - } - - stdout, err := io.ReadAll(stdoutPipe) - if err != nil { - return stderr, err - } - - err = cmd.Wait() - - if len(stdout) > 0 { - result := strings.Split(strings.TrimSuffix(string(stdout), "\n"), "\n") - resultLen := len(result) - if resultLen == 5 || resultLen == 6 { - g.GitDir = result[0] - g.IsInGitDir, _ = strconv.ParseBool(result[1]) - g.IsInWorkTree, _ = strconv.ParseBool(result[2]) - g.IsInBareRepo, _ = strconv.ParseBool(result[3]) - g.IsInShallowRepo, _ = strconv.ParseBool(result[4]) - if resultLen == 6 { - g.AbbrevRef = result[5] - shortStderr, shortErr := g.RevParseShort() - err = errors.Join(err, shortErr) - stderr = append(stderr, shortStderr...) - } - } else { - return []byte{}, fmt.Errorf("expected result length of 5 or 6, got %d", resultLen) - } - } - - return stderr, err -} - -type Result struct { - stderr []byte - err error -} - -func (g *GitRepo) BranchInfo() (string, error) { - var err error - ref := "" - step := "" - total := "" - - if g.IsGitDir("rebase-merge") { - if ref, err = g.ReadGirDirFile("rebase-merge/head-name"); err != nil { - return ref, err - } - if step, err = g.ReadGirDirFile("rebase-merge/msgnum"); err != nil { - return ref, err - } - if total, err = g.ReadGirDirFile("rebase-merge/end"); err != nil { - return ref, err - } - g.PromptMergeStatus = "|REBASE-m" - if exists, exists_err := g.GitDirFileExists("rebase-merge/interactive"); exists { - g.PromptMergeStatus = "|REBASE-i" - } else if exists_err != nil { - return strconv.FormatBool(exists), exists_err - } - - } else { - if g.IsGitDir("rebase-apply") { - - step, err = g.ReadGirDirFile("rebase-apply/next") - if err != nil { - return step, err - } - total, err = g.ReadGirDirFile("rebase-apply/last") - if err != nil { - return total, err - } - rebasing, err := g.GitDirFileExists("rebase-apply/rebasing") - if err != nil { - return strconv.FormatBool(rebasing), err - } - if rebasing { - ref, err = g.ReadGirDirFile("rebase-apply/head-name") - if err != nil { - return ref, err - } - g.PromptMergeStatus = "|REBASE" - } else { - // TODO: check if we need to get branch name here, bgps was not doing it - applying, err := g.GitDirFileExists("rebase-apply/applying") - if err != nil { - return strconv.FormatBool(applying), err - } - if applying { - g.PromptMergeStatus = "|AM" - } else { - g.PromptMergeStatus = "|AM/REBASE" - } - } - } else if g.IsGitDir("MERGE_HEAD") { - g.PromptMergeStatus = "|MERGING" - } else if g.IsGitDir("CHERRY_PICK_HEAD") { - g.PromptMergeStatus = "|CHERRY-PICKING" - } else if g.IsGitDir("REVERT_HEAD") { - g.PromptMergeStatus = "|REVERTING" - } else if g.IsGitDir("BISECT_LOG") { - g.PromptMergeStatus = "|BISECTING" - } - - if ref == "" { - if g.IsGitDirSymlink("HEAD") { - if ref, err = GitSymbolicRef("HEAD"); err != nil { - return ref, err - } - } else { - head := "" - if head, err = g.ReadGirDirFile("HEAD"); err != nil { - return head, err - } - ref = strings.TrimPrefix(head, "ref: ") - - if head == ref { - tag, err := GitDescribeTag("HEAD") - if err == nil { - ref = tag - g.Tag = ref - } else if g.ShortSha == "" && len(head) > 7 { - ref = head[:7] - } else { - ref = g.ShortSha - } - ref = fmt.Sprintf("(%s)", ref) - } - } - } - } - - if step != "" && total != "" { - g.PromptMergeStatus += fmt.Sprintf(" %s/%s", step, total) - } +func main() { - if g.PromptMergeStatus != "" { - if _, err = GitLsFilesUnmerged(); err != nil { - g.PromptMergeStatus += "|CONFLICT" - } + cfg := config.BgpsConfig{ + PromptPrefix: "  ", + PromptSuffix: "", + AheadFormat: "↑[%d]", + BehindFormat: "↓[%d]", + DivergedFormat: "↕ ↑[%d] ↓[%d]", } - if g.IsInGitDir { - if g.IsInBareRepo { - g.PromptBareRepoStatus = "BARE:" - } else { - ref = "GIT_DIR!" - } - } - - g.PromptBranch = strings.TrimPrefix(ref, "refs/heads/") - - // TODO: put behind a variable, default to false for perf - checkSparse := false - if checkSparse { - g.IsSparseCheckout, err = GitSparseCheckout() + xdgConfigHome := os.Getenv("XDG_CONFIG_HOME") + if xdgConfigHome == "" { + home, err := os.UserHomeDir() if err != nil { - errMsg("sparse checkout", err, 0) - } - - if g.IsSparseCheckout { - g.PromptSparseCheckoutStatus = "|SPARSE" + util.ErrMsg("user home", err, 0) } - } - - prompt := fmt.Sprintf("%s%s%s%s", g.PromptBareRepoStatus, g.PromptBranch, g.PromptSparseCheckoutStatus, g.PromptMergeStatus) - - return prompt, nil -} - -func IsDir(name string) bool { - fileInfo, err := os.Stat(name) - if err != nil { - return false - } - return fileInfo.IsDir() -} - -func IsSymlink(name string) bool { - fileInfo, err := os.Lstat(name) - if err != nil { - return false - } - return fileInfo.Mode()&fs.ModeSymlink != 0 // bitwise check if mode has symlink -} - -func ReadFileTrimNewline(name string) (string, error) { - result, err := os.ReadFile(name) - if err != nil { - return "", err - } - return strings.TrimSuffix(string(result), "\n"), err -} - -func GitSymbolicRef(ref string) (string, error) { - cmd := exec.Command( - "git", - "symbolic-ref", - ref, - ) - stdCombined, err := cmd.CombinedOutput() - if err != nil { - return string(stdCombined), err - } - return strings.TrimSuffix(string(stdCombined), "\n"), err -} - -func GitDescribeTag(ref string) (string, error) { - cmd := exec.Command( - "git", - "describe", - "--tags", - "--exact-match", - ref, - ) - stdCombined, err := cmd.CombinedOutput() - if err != nil { - return string(stdCombined), err - } - return strings.TrimSuffix(string(stdCombined), "\n"), err -} - -func GitLsFilesUnmerged() (string, error) { - cmd := exec.Command( - "git", - "ls-files", - "--unmerged", - ) - stdCombined, err := cmd.CombinedOutput() - if err != nil { - return string(stdCombined), err - } - return strings.TrimSuffix(string(stdCombined), "\n"), err -} - -func GitSparseCheckout() (bool, error) { - cmd := exec.Command( - "git", - "config", - "--bool", - "core.sparseCheckout", - ) - stdCombined, err := cmd.CombinedOutput() - if err != nil && len(stdCombined) != 0 { - return false, err - } - isSparseCheckout, _ := strconv.ParseBool(strings.TrimSuffix(string(stdCombined), "\n")) - return isSparseCheckout, nil -} - -func IsNoUpstreamErr(msg string) bool { - amiguiousHead := "ambiguous argument 'HEAD'" - noUpstream := "no upstream configured" - noBranch := "no such branch" - return strings.Contains(msg, amiguiousHead) || strings.Contains(msg, noUpstream) || strings.Contains(msg, noBranch) -} - -func (g *GitRepo) GitHasCleanWorkingTree() (bool, error) { - exitCode := 0 - cmd := exec.Command( - "git", - "diff", - "--no-ext-diff", - "--quiet", - "HEAD", - ) - stdCombined, err := cmd.CombinedOutput() - if err != nil { - if exitError, ok := err.(*exec.ExitError); ok { - exitCode = exitError.ExitCode() - } - stderr := string(stdCombined) - if IsNoUpstreamErr(stderr) { - exitCode = 0 - // there is no upstream so compare against staging area - cachedCmd := exec.Command( - "git", - "diff", - "--cached", - "--no-ext-diff", - "--quiet", - ) - err = cachedCmd.Run() - if err != nil { - if exitError, ok := err.(*exec.ExitError); ok { - exitCode = exitError.ExitCode() - } - } + if runtime.GOOS == "windows" { + xdgConfigHome = path.Join(home, "AppData", "Local") + } else { + xdgConfigHome = path.Join(home, ".config") } } - if exitCode != 0 && exitCode != 1 { - return false, err - } - - return exitCode == 0, nil -} + bgpsConfigPath := path.Join(xdgConfigHome, "bgps.toml") -func GitHasUntracked() (bool, error) { - exitCode := 0 - cmd := exec.Command( - "git", - "ls-files", - "--others", - "--exclude-standard", - "--directory", - "--no-empty-directory", - "--error-unmatch", - "--", - ":/*", - ) - err := cmd.Run() - if err != nil { - if exitError, ok := err.(*exec.ExitError); ok { - exitCode = exitError.ExitCode() - } + bgpsConfigRaw, err := os.ReadFile(bgpsConfigPath) + if err != nil && !os.IsNotExist(err) { + util.ErrMsg("read config", err, 0) } - if exitCode != 0 && exitCode != 1 { - return false, err - } - return exitCode == 0, nil -} -func GitCommitCounts() (int, int, error) { - cmd := exec.Command( - "git", - "rev-list", - "--left-right", - "--count", - "...@{upstream}", - ) - stdCombined, err := cmd.CombinedOutput() + err = toml.Unmarshal(bgpsConfigRaw, &cfg) if err != nil { - return 0, 0, err + util.ErrMsg("unmarshal config", err, 0) } - fields := strings.Fields(string(stdCombined)) - if len(fields) != 2 { - return 0, 0, fmt.Errorf("expected field length of 2 got %d", len(fields)) - } - ahead, _ := strconv.Atoi(fields[0]) - behind, _ := strconv.Atoi(fields[1]) - return ahead, behind, nil -} - -func errMsg(hint string, e error, exitCode int) { - color.New(color.FgHiRed).Printf(" bgps error(%s): %s", hint, strings.ReplaceAll(e.Error(), "\n", "")) - os.Exit(exitCode) -} - -func main() { - color.NoColor = false - - gitRepo := GitRepo{} - stderr, err := gitRepo.RevParse() + gitRepo, stderr, err := git.RevParse() if err != nil { if strings.Contains(string(stderr), "not a git repository") { os.Exit(0) @@ -485,81 +55,14 @@ func main() { // allow other errors to pass through, the git repo may not have upstream } - branchInfo, err := gitRepo.BranchInfo() + branchInfo, err := gitRepo.BranchInfo(cfg) if err != nil { - errMsg("branch info", err, 0) - } - - prefix := "  " - suffix := "" - - gitSymbol := "" - - if gitRepo.IsInBareRepo { - gitSymbol = "󱣻" + util.ErrMsg("branch info", err, 0) } - - if gitRepo.IsInBareRepo || gitRepo.IsInGitDir { - c := color.New(color.FgHiBlack) - if gitSymbol != "" { - gitSymbol = " " + gitSymbol - } - c.Printf("%s%s%s%s", prefix, branchInfo, gitSymbol, suffix) - return - } - - cleanWorkingTree, err := gitRepo.GitHasCleanWorkingTree() + branchStatus, color, err := gitRepo.BranchStatus(cfg) if err != nil { - errMsg("clean working tree", err, 0) - } - hasUntracked, err := GitHasUntracked() - if err != nil { - color.Red("%s", err) - os.Exit(0) - } - - ahead, behind := 0, 0 - if gitRepo.Tag == "" && gitRepo.ShortSha != "" { - ahead, behind, err = GitCommitCounts() - } - if err != nil { - color.New(color.FgRed).Printf("%s", err) - os.Exit(0) - } - - c := color.New() - if cleanWorkingTree { - c = color.New(color.FgGreen) + util.ErrMsg("branch status", err, 0) } - if ahead > 0 { - c = color.New(color.FgYellow) - gitSymbol = fmt.Sprintf("↑[%d]", ahead) - } - if behind > 0 { - c = color.New(color.FgYellow) - gitSymbol = fmt.Sprintf("↓[%d]", behind) - } - - if ahead > 0 && behind > 0 { - gitSymbol = fmt.Sprintf("↕ ↑[%d] ↓[%d]", ahead, behind) - } - - if gitRepo.ShortSha == "" { - c = color.New(color.FgHiBlack) - } - - if hasUntracked { - c = color.New(color.FgMagenta) - gitSymbol = fmt.Sprintf("*%s", gitSymbol) - } - - if !cleanWorkingTree && !hasUntracked { - c = color.New(color.FgRed) - gitSymbol = fmt.Sprintf("*%s", gitSymbol) - } - if gitSymbol != "" { - gitSymbol = " " + gitSymbol - } - c.Printf("%s%s%s%s", prefix, branchInfo, gitSymbol, suffix) + fmt.Printf("%s%s%s%s%s", color, cfg.PromptPrefix, branchInfo, branchStatus, cfg.PromptSuffix) } diff --git a/pkg/color/color.go b/pkg/color/color.go new file mode 100644 index 0000000..6600a75 --- /dev/null +++ b/pkg/color/color.go @@ -0,0 +1,128 @@ +package color + +import ( + "fmt" + "strconv" + "strings" +) + +const ( + esc = "\x1b" +) + +func codeToEscapeSequence(n int) string { + return fmt.Sprintf("%s[%dm", esc, n) +} + +var standardColors = map[string]string{ + "black": codeToEscapeSequence(30), + "red": codeToEscapeSequence(31), + "green": codeToEscapeSequence(32), + "yellow": codeToEscapeSequence(33), + "blue": codeToEscapeSequence(34), + "magenta": codeToEscapeSequence(35), + "cyan": codeToEscapeSequence(36), + "white": codeToEscapeSequence(37), + + "fg:black": codeToEscapeSequence(30), + "fg:red": codeToEscapeSequence(31), + "fg:green": codeToEscapeSequence(32), + "fg:yellow": codeToEscapeSequence(33), + "fg:blue": codeToEscapeSequence(34), + "fg:magenta": codeToEscapeSequence(35), + "fg:cyan": codeToEscapeSequence(36), + "fg:white": codeToEscapeSequence(37), + + "bright-black": codeToEscapeSequence(90), + "bright-red": codeToEscapeSequence(91), + "bright-green": codeToEscapeSequence(92), + "bright-yellow": codeToEscapeSequence(93), + "bright-blue": codeToEscapeSequence(94), + "bright-magenta": codeToEscapeSequence(95), + "bright-cyan": codeToEscapeSequence(96), + "bright-white": codeToEscapeSequence(97), + + "fg:bright-black": codeToEscapeSequence(90), + "fg:bright-red": codeToEscapeSequence(91), + "fg:bright-green": codeToEscapeSequence(92), + "fg:bright-yellow": codeToEscapeSequence(93), + "fg:bright-blue": codeToEscapeSequence(94), + "fg:bright-magenta": codeToEscapeSequence(95), + "fg:bright-cyan": codeToEscapeSequence(96), + "fg:bright-white": codeToEscapeSequence(97), + + "bg:black": codeToEscapeSequence(40), + "bg:red": codeToEscapeSequence(41), + "bg:green": codeToEscapeSequence(42), + "bg:yellow": codeToEscapeSequence(43), + "bg:blue": codeToEscapeSequence(44), + "bg:magenta": codeToEscapeSequence(45), + "bg:cyan": codeToEscapeSequence(46), + "bg:white": codeToEscapeSequence(47), + + "bg:bright-black": codeToEscapeSequence(100), + "bg:bright-red": codeToEscapeSequence(101), + "bg:bright-green": codeToEscapeSequence(102), + "bg:bright-yellow": codeToEscapeSequence(103), + "bg:bright-blue": codeToEscapeSequence(104), + "bg:bright-magenta": codeToEscapeSequence(105), + "bg:bright-cyan": codeToEscapeSequence(106), + "bg:bright-white": codeToEscapeSequence(107), + + "none": codeToEscapeSequence(0), +} + +func hexToRGB(hex string) (int, int, int, error) { + + if !strings.HasPrefix(hex, "#") { + return 0, 0, 0, fmt.Errorf("hex must start with #, got %s", hex) + } + + hex = strings.TrimPrefix(hex, "#") + + // Parse the hex string into RGB components + r, err := strconv.ParseInt(hex[0:2], 16, 32) + if err != nil { + return 0, 0, 0, err + } + g, err := strconv.ParseInt(hex[2:4], 16, 32) + if err != nil { + return 0, 0, 0, err + } + b, err := strconv.ParseInt(hex[4:6], 16, 32) + if err != nil { + return 0, 0, 0, err + } + + return int(r), int(g), int(b), nil +} + +func rgbToEscapeSequence(r, g, b int, isBg bool) string { + var colorType string + if isBg { + colorType = "48" + } else { + colorType = "38" + } + return fmt.Sprintf("\x1b[%s;2;%d;%d;%dm", colorType, r, g, b) +} + +func Color(colors ...string) (string, error) { + seq := "" + for _, color := range colors { + if strings.HasPrefix(color, "#") || strings.HasPrefix(color, "bg:#") { + r, g, b, err := hexToRGB(strings.TrimPrefix(color, "bg:")) + if err != nil { + return "", err + } + seq = rgbToEscapeSequence(r, g, b, strings.HasPrefix(color, "bg:#")) + } else { + s, exists := standardColors[color] + if !exists { + return "", fmt.Errorf("color %s not found", color) + } + seq += s + } + } + return seq, nil +} diff --git a/pkg/config/config.go b/pkg/config/config.go new file mode 100644 index 0000000..3285a89 --- /dev/null +++ b/pkg/config/config.go @@ -0,0 +1,9 @@ +package config + +type BgpsConfig struct { + PromptPrefix string `toml:"prompt_prefix"` + PromptSuffix string `toml:"prompt_suffix"` + AheadFormat string `toml:"ahead_format"` + BehindFormat string `toml:"behind_format"` + DivergedFormat string `toml:"diverged_format"` +} diff --git a/pkg/git/git.go b/pkg/git/git.go new file mode 100644 index 0000000..b5ba39f --- /dev/null +++ b/pkg/git/git.go @@ -0,0 +1,258 @@ +package git + +import ( + "errors" + "fmt" + "io" + "os/exec" + "strconv" + "strings" +) + +func CommitCounts() (int, int, error) { + cmd := exec.Command( + "git", + "rev-list", + "--left-right", + "--count", + "...@{upstream}", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return 0, 0, err + } + fields := strings.Fields(string(stdCombined)) + if len(fields) != 2 { + return 0, 0, fmt.Errorf("expected field length of 2 got %d", len(fields)) + } + ahead, _ := strconv.Atoi(fields[0]) + behind, _ := strconv.Atoi(fields[1]) + return ahead, behind, nil +} + +func LsFilesUnmerged() (string, error) { + cmd := exec.Command( + "git", + "ls-files", + "--unmerged", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return string(stdCombined), err + } + return strings.TrimSuffix(string(stdCombined), "\n"), err +} + +func SparseCheckout() (bool, error) { + cmd := exec.Command( + "git", + "config", + "--bool", + "core.sparseCheckout", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil && len(stdCombined) != 0 { + return false, err + } + isSparseCheckout, _ := strconv.ParseBool(strings.TrimSuffix(string(stdCombined), "\n")) + return isSparseCheckout, nil +} + +func SymbolicRef(ref string) (string, error) { + cmd := exec.Command( + "git", + "symbolic-ref", + ref, + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return string(stdCombined), err + } + return strings.TrimSuffix(string(stdCombined), "\n"), err +} + +func DescribeTag(ref string) (string, error) { + cmd := exec.Command( + "git", + "describe", + "--tags", + "--exact-match", + ref, + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return string(stdCombined), err + } + return strings.TrimSuffix(string(stdCombined), "\n"), err +} + +func IsNoUpstreamErr(msg string) bool { + amiguiousHead := "ambiguous argument 'HEAD'" + noUpstream := "no upstream configured" + noBranch := "no such branch" + return strings.Contains(msg, amiguiousHead) || strings.Contains(msg, noUpstream) || strings.Contains(msg, noBranch) +} + +func HasUntracked() (bool, error) { + exitCode := 0 + cmd := exec.Command( + "git", + "ls-files", + "--others", + "--exclude-standard", + "--directory", + "--no-empty-directory", + "--error-unmatch", + "--", + ":/*", + ) + err := cmd.Run() + if err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + exitCode = exitError.ExitCode() + } + } + if exitCode != 0 && exitCode != 1 { + return false, err + } + return exitCode == 0, nil +} + +func RevParseShort() (string, []byte, error) { + + cmd := exec.Command( + "git", + "rev-parse", + "--short", + "@{upstream}", + ) + + stderrPipe, err := cmd.StderrPipe() + if err != nil { + return "", nil, err + } + stdoutPipe, err := cmd.StdoutPipe() + if err != nil { + return "", nil, err + } + if err := cmd.Start(); err != nil { + return "", nil, err + } + + stderr, err := io.ReadAll(stderrPipe) + if err != nil { + return "", stderr, err + } + + stdout, err := io.ReadAll(stdoutPipe) + if err != nil { + return "", stderr, err + } + + err = cmd.Wait() + + return strings.TrimSuffix(string(stdout), "\n"), stderr, err +} + +func RevParse() (*GitRepo, []byte, error) { + g := GitRepo{} + cmd := exec.Command( + "git", + "rev-parse", + "--verify", + "--absolute-git-dir", + "--is-inside-git-dir", + "--is-inside-work-tree", + "--is-bare-repository", + "--is-shallow-repository", + "--abbrev-ref", + "@{upstream}", + ) + + stderrPipe, err := cmd.StderrPipe() + if err != nil { + return nil, nil, err + } + stdoutPipe, err := cmd.StdoutPipe() + if err != nil { + return nil, nil, err + } + if err := cmd.Start(); err != nil { + return nil, nil, err + } + + stderr, err := io.ReadAll(stderrPipe) + if err != nil { + return nil, stderr, err + } + + stdout, err := io.ReadAll(stdoutPipe) + if err != nil { + return nil, stderr, err + } + + err = cmd.Wait() + + if len(stdout) > 0 { + result := strings.Split(strings.TrimSuffix(string(stdout), "\n"), "\n") + resultLen := len(result) + if resultLen == 5 || resultLen == 6 { + g.GitDir = result[0] + g.IsInGitDir, _ = strconv.ParseBool(result[1]) + g.IsInWorkTree, _ = strconv.ParseBool(result[2]) + g.IsInBareRepo, _ = strconv.ParseBool(result[3]) + g.IsInShallowRepo, _ = strconv.ParseBool(result[4]) + if resultLen == 6 { + g.AbbrevRef = result[5] + shortSha, shortStderr, shortErr := RevParseShort() + g.ShortSha = shortSha + err = errors.Join(err, shortErr) + stderr = append(stderr, shortStderr...) + } + } else { + return nil, []byte{}, fmt.Errorf("expected result length of 5 or 6, got %d", resultLen) + } + } + + return &g, stderr, err +} + +func HasCleanWorkingTree() (bool, error) { + exitCode := 0 + cmd := exec.Command( + "git", + "diff", + "--no-ext-diff", + "--quiet", + "HEAD", + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + exitCode = exitError.ExitCode() + } + stderr := string(stdCombined) + if IsNoUpstreamErr(stderr) { + exitCode = 0 + // there is no upstream so compare against staging area + cachedCmd := exec.Command( + "git", + "diff", + "--cached", + "--no-ext-diff", + "--quiet", + ) + err = cachedCmd.Run() + if err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + exitCode = exitError.ExitCode() + } + } + } + } + if exitCode != 0 && exitCode != 1 { + return false, err + } + + return exitCode == 0, nil +} diff --git a/pkg/git/repo.go b/pkg/git/repo.go new file mode 100644 index 0000000..e7e6298 --- /dev/null +++ b/pkg/git/repo.go @@ -0,0 +1,251 @@ +package git + +import ( + "errors" + "fmt" + "os" + "strings" + + "github.com/mikesmithgh/bgps/pkg/color" + "github.com/mikesmithgh/bgps/pkg/config" + "github.com/mikesmithgh/bgps/pkg/util" +) + +type GitRepo struct { + GitDir string + IsInGitDir bool + IsInWorkTree bool + IsInBareRepo bool + IsInShallowRepo bool + IsSparseCheckout bool + Tag string + AbbrevRef string + ShortSha string + PromptMergeStatus string + PromptSparseCheckoutStatus string + PromptBranch string + PromptBareRepoStatus string +} + +func (g *GitRepo) GitDirFileExists(name string) (bool, error) { + _, err := os.Stat(g.GitDirPath(name)) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return false, nil + } + return false, err + } + return true, nil +} + +func (g *GitRepo) IsGitDir(name string) bool { + return util.IsDir(g.GitDirPath(name)) +} + +func (g *GitRepo) IsGitDirSymlink(name string) bool { + return util.IsSymlink(g.GitDirPath(name)) +} + +func (g *GitRepo) GitDirPath(path string) string { + return fmt.Sprintf("%s/%s", g.GitDir, path) +} + +func (g *GitRepo) ReadGirDirFile(name string) (string, error) { + return util.ReadFileTrimNewline(g.GitDirPath(name)) +} + +func (g *GitRepo) BranchInfo(cfg config.BgpsConfig) (string, error) { + var err error + ref := "" + step := "" + total := "" + + if g.IsGitDir("rebase-merge") { + if ref, err = g.ReadGirDirFile("rebase-merge/head-name"); err != nil { + return "", err + } + if step, err = g.ReadGirDirFile("rebase-merge/msgnum"); err != nil { + return "", err + } + if total, err = g.ReadGirDirFile("rebase-merge/end"); err != nil { + return "", err + } + g.PromptMergeStatus = "|REBASE-m" + if exists, exists_err := g.GitDirFileExists("rebase-merge/interactive"); exists { + g.PromptMergeStatus = "|REBASE-i" + } else if exists_err != nil { + return "", exists_err + } + + } else { + if g.IsGitDir("rebase-apply") { + + step, err = g.ReadGirDirFile("rebase-apply/next") + if err != nil { + return "", err + } + total, err = g.ReadGirDirFile("rebase-apply/last") + if err != nil { + return "", err + } + rebasing, err := g.GitDirFileExists("rebase-apply/rebasing") + if err != nil { + return "", err + } + if rebasing { + ref, err = g.ReadGirDirFile("rebase-apply/head-name") + if err != nil { + return "", err + } + g.PromptMergeStatus = "|REBASE" + } else { + // TODO: check if we need to get branch name here, bgps was not doing it + applying, err := g.GitDirFileExists("rebase-apply/applying") + if err != nil { + return "", err + } + if applying { + g.PromptMergeStatus = "|AM" + } else { + g.PromptMergeStatus = "|AM/REBASE" + } + } + } else if g.IsGitDir("MERGE_HEAD") { + g.PromptMergeStatus = "|MERGING" + } else if g.IsGitDir("CHERRY_PICK_HEAD") { + g.PromptMergeStatus = "|CHERRY-PICKING" + } else if g.IsGitDir("REVERT_HEAD") { + g.PromptMergeStatus = "|REVERTING" + } else if g.IsGitDir("BISECT_LOG") { + g.PromptMergeStatus = "|BISECTING" + } + + if ref == "" { + if g.IsGitDirSymlink("HEAD") { + if ref, err = SymbolicRef("HEAD"); err != nil { + return "", err + } + } else { + head := "" + if head, err = g.ReadGirDirFile("HEAD"); err != nil { + return "", err + } + ref = strings.TrimPrefix(head, "ref: ") + + if head == ref { + tag, err := DescribeTag("HEAD") + if err == nil { + ref = tag + g.Tag = ref + } else if g.ShortSha == "" && len(head) > 7 { + ref = head[:7] + } else { + ref = g.ShortSha + } + ref = fmt.Sprintf("(%s)", ref) + } + } + } + } + + if step != "" && total != "" { + g.PromptMergeStatus += fmt.Sprintf(" %s/%s", step, total) + } + + if g.PromptMergeStatus != "" { + if _, err = LsFilesUnmerged(); err != nil { + g.PromptMergeStatus += "|CONFLICT" + } + } + + if g.IsInGitDir { + if g.IsInBareRepo { + g.PromptBareRepoStatus = "BARE:" + } else { + ref = "GIT_DIR!" + } + } + + g.PromptBranch = strings.TrimPrefix(ref, "refs/heads/") + + // TODO: put behind a variable, default to false for perf + checkSparse := true + if checkSparse { + g.IsSparseCheckout, err = SparseCheckout() + if err != nil { + return "", err + } + + if g.IsSparseCheckout { + g.PromptSparseCheckoutStatus = "|SPARSE" + } + } + + prompt := fmt.Sprintf("%s%s%s%s", g.PromptBareRepoStatus, g.PromptBranch, g.PromptSparseCheckoutStatus, g.PromptMergeStatus) + + return prompt, nil +} + +func (g *GitRepo) BranchStatus(cfg config.BgpsConfig) (string, string, error) { + + status := "" + statusColor := "" + + if g.IsInBareRepo || g.IsInGitDir { + c, _ := color.Color("bright-white") + return status, c, nil + } + + cleanWorkingTree, err := HasCleanWorkingTree() + if err != nil { + return "", "", err + } + hasUntracked, err := HasUntracked() + if err != nil { + return "", "", err + } + + ahead, behind := 0, 0 + if g.Tag == "" && g.ShortSha != "" { + ahead, behind, err = CommitCounts() + } + if err != nil { + return "", "", err + } + + if cleanWorkingTree { + statusColor, _ = color.Color("green") + } + + if ahead > 0 { + statusColor, _ = color.Color("yellow") + status = fmt.Sprintf(cfg.AheadFormat, ahead) + } + if behind > 0 { + statusColor, _ = color.Color("yellow") + status = fmt.Sprintf(cfg.BehindFormat, behind) + } + + if ahead > 0 && behind > 0 { + status = fmt.Sprintf(cfg.DivergedFormat, ahead, behind) + } + + if g.ShortSha == "" { + statusColor, _ = color.Color("bright-black") + } + + if hasUntracked { + statusColor, _ = color.Color("magenta") + status = fmt.Sprintf("*%s", status) + } + + if !cleanWorkingTree && !hasUntracked { + statusColor, _ = color.Color("red") + status = fmt.Sprintf("*%s", status) + } + if status != "" { + status = " " + status + } + + return status, statusColor, nil +} diff --git a/pkg/util/util.go b/pkg/util/util.go new file mode 100644 index 0000000..98ecb56 --- /dev/null +++ b/pkg/util/util.go @@ -0,0 +1,40 @@ +package util + +import ( + "fmt" + "io/fs" + "os" + "strings" + + "github.com/mikesmithgh/bgps/pkg/color" +) + +func IsDir(name string) bool { + fileInfo, err := os.Stat(name) + if err != nil { + return false + } + return fileInfo.IsDir() +} + +func IsSymlink(name string) bool { + fileInfo, err := os.Lstat(name) + if err != nil { + return false + } + return fileInfo.Mode()&fs.ModeSymlink != 0 // bitwise check if mode has symlink +} + +func ReadFileTrimNewline(name string) (string, error) { + result, err := os.ReadFile(name) + if err != nil { + return "", err + } + return strings.TrimSuffix(string(result), "\n"), err +} + +func ErrMsg(hint string, e error, exitCode int) { + color, _ := color.Color("red") + fmt.Printf("%s bgps error(%s): %s", color, hint, strings.ReplaceAll(e.Error(), "\n", "")) + os.Exit(exitCode) +} From 83edf67c78b515d0e13a7407bdc0f66b0fea8f05 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Thu, 7 Mar 2024 08:33:47 -0500 Subject: [PATCH 22/64] chore: add colors from cfg --- main.go | 15 ++++++++++----- pkg/config/config.go | 15 ++++++++++----- pkg/git/repo.go | 14 +++++++------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index 0c2421a..9e160ae 100644 --- a/main.go +++ b/main.go @@ -16,11 +16,16 @@ import ( func main() { cfg := config.BgpsConfig{ - PromptPrefix: "  ", - PromptSuffix: "", - AheadFormat: "↑[%d]", - BehindFormat: "↓[%d]", - DivergedFormat: "↕ ↑[%d] ↓[%d]", + PromptPrefix: "  ", + PromptSuffix: "", + AheadFormat: "↑[%d]", + BehindFormat: "↓[%d]", + DivergedFormat: "↕ ↑[%d] ↓[%d]", + ColorClean: "green", + ColorConflict: "yellow", + ColorDirty: "red", + ColorUntracked: "magenta", + ColorNoUpstream: "bright-black", } xdgConfigHome := os.Getenv("XDG_CONFIG_HOME") diff --git a/pkg/config/config.go b/pkg/config/config.go index 3285a89..7a7cb96 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -1,9 +1,14 @@ package config type BgpsConfig struct { - PromptPrefix string `toml:"prompt_prefix"` - PromptSuffix string `toml:"prompt_suffix"` - AheadFormat string `toml:"ahead_format"` - BehindFormat string `toml:"behind_format"` - DivergedFormat string `toml:"diverged_format"` + PromptPrefix string `toml:"prompt_prefix"` + PromptSuffix string `toml:"prompt_suffix"` + AheadFormat string `toml:"ahead_format"` + BehindFormat string `toml:"behind_format"` + DivergedFormat string `toml:"diverged_format"` + ColorClean string `toml:"color_clean"` + ColorConflict string `toml:"color_conflict"` + ColorDirty string `toml:"color_dirty"` + ColorUntracked string `toml:"color_untracked"` + ColorNoUpstream string `toml:"color_no_upstream"` } diff --git a/pkg/git/repo.go b/pkg/git/repo.go index e7e6298..7f3a1c7 100644 --- a/pkg/git/repo.go +++ b/pkg/git/repo.go @@ -192,7 +192,7 @@ func (g *GitRepo) BranchStatus(cfg config.BgpsConfig) (string, string, error) { statusColor := "" if g.IsInBareRepo || g.IsInGitDir { - c, _ := color.Color("bright-white") + c, _ := color.Color(strings.Split(cfg.ColorNoUpstream, " ")...) return status, c, nil } @@ -214,15 +214,15 @@ func (g *GitRepo) BranchStatus(cfg config.BgpsConfig) (string, string, error) { } if cleanWorkingTree { - statusColor, _ = color.Color("green") + statusColor, _ = color.Color(strings.Split(cfg.ColorClean, " ")...) } if ahead > 0 { - statusColor, _ = color.Color("yellow") + statusColor, _ = color.Color(strings.Split(cfg.ColorConflict, " ")...) status = fmt.Sprintf(cfg.AheadFormat, ahead) } if behind > 0 { - statusColor, _ = color.Color("yellow") + statusColor, _ = color.Color(strings.Split(cfg.ColorConflict, " ")...) status = fmt.Sprintf(cfg.BehindFormat, behind) } @@ -231,16 +231,16 @@ func (g *GitRepo) BranchStatus(cfg config.BgpsConfig) (string, string, error) { } if g.ShortSha == "" { - statusColor, _ = color.Color("bright-black") + statusColor, _ = color.Color(strings.Split(cfg.ColorNoUpstream, " ")...) } if hasUntracked { - statusColor, _ = color.Color("magenta") + statusColor, _ = color.Color(strings.Split(cfg.ColorUntracked, " ")...) status = fmt.Sprintf("*%s", status) } if !cleanWorkingTree && !hasUntracked { - statusColor, _ = color.Color("red") + statusColor, _ = color.Color(strings.Split(cfg.ColorDirty, " ")...) status = fmt.Sprintf("*%s", status) } if status != "" { From 76dc06d28f253da13a81799a47b4aa6c32ef0d0a Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:22:17 -0500 Subject: [PATCH 23/64] chore: add option to disable color --- main.go | 45 +++++++++++++++++++++++++++----------------- pkg/color/color.go | 9 +++++++++ pkg/config/config.go | 1 + 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index 9e160ae..07ce2f6 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "runtime" "strings" + "github.com/mikesmithgh/bgps/pkg/color" "github.com/mikesmithgh/bgps/pkg/config" "github.com/mikesmithgh/bgps/pkg/git" "github.com/mikesmithgh/bgps/pkg/util" @@ -21,6 +22,7 @@ func main() { AheadFormat: "↑[%d]", BehindFormat: "↓[%d]", DivergedFormat: "↕ ↑[%d] ↓[%d]", + ColorEnabled: true, ColorClean: "green", ColorConflict: "yellow", ColorDirty: "red", @@ -28,28 +30,37 @@ func main() { ColorNoUpstream: "bright-black", } - xdgConfigHome := os.Getenv("XDG_CONFIG_HOME") - if xdgConfigHome == "" { - home, err := os.UserHomeDir() - if err != nil { - util.ErrMsg("user home", err, 0) - } - if runtime.GOOS == "windows" { - xdgConfigHome = path.Join(home, "AppData", "Local") - } else { - xdgConfigHome = path.Join(home, ".config") + bgpsConfigPath := os.Getenv("BGPS_CONFIG") + if bgpsConfigPath == "" { + xdgConfigHome := os.Getenv("XDG_CONFIG_HOME") + if xdgConfigHome == "" { + home, err := os.UserHomeDir() + if err != nil { + util.ErrMsg("user home", err, 0) + } + if runtime.GOOS == "windows" { + xdgConfigHome = path.Join(home, "AppData", "Local") + } else { + xdgConfigHome = path.Join(home, ".config") + } } + bgpsConfigPath = path.Join(xdgConfigHome, "bgps", "config.toml") } - bgpsConfigPath := path.Join(xdgConfigHome, "bgps.toml") - bgpsConfigRaw, err := os.ReadFile(bgpsConfigPath) - if err != nil && !os.IsNotExist(err) { - util.ErrMsg("read config", err, 0) + if bgpsConfigPath != "NONE" { + bgpsConfigRaw, err := os.ReadFile(bgpsConfigPath) + if err != nil && !os.IsNotExist(err) { + util.ErrMsg("read config", err, 0) + } + + err = toml.Unmarshal(bgpsConfigRaw, &cfg) + if err != nil { + util.ErrMsg("unmarshal config", err, 0) + } } - err = toml.Unmarshal(bgpsConfigRaw, &cfg) - if err != nil { - util.ErrMsg("unmarshal config", err, 0) + if !cfg.ColorEnabled { + color.Disable() } gitRepo, stderr, err := git.RevParse() diff --git a/pkg/color/color.go b/pkg/color/color.go index 6600a75..7f1396b 100644 --- a/pkg/color/color.go +++ b/pkg/color/color.go @@ -10,6 +10,8 @@ const ( esc = "\x1b" ) +var enabled bool = true + func codeToEscapeSequence(n int) string { return fmt.Sprintf("%s[%dm", esc, n) } @@ -107,8 +109,15 @@ func rgbToEscapeSequence(r, g, b int, isBg bool) string { return fmt.Sprintf("\x1b[%s;2;%d;%d;%dm", colorType, r, g, b) } +func Disable() { + enabled = false +} + func Color(colors ...string) (string, error) { seq := "" + if !enabled { + return seq, nil + } for _, color := range colors { if strings.HasPrefix(color, "#") || strings.HasPrefix(color, "bg:#") { r, g, b, err := hexToRGB(strings.TrimPrefix(color, "bg:")) diff --git a/pkg/config/config.go b/pkg/config/config.go index 7a7cb96..f3645ca 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -6,6 +6,7 @@ type BgpsConfig struct { AheadFormat string `toml:"ahead_format"` BehindFormat string `toml:"behind_format"` DivergedFormat string `toml:"diverged_format"` + ColorEnabled bool `toml:"color_enabled"` ColorClean string `toml:"color_clean"` ColorConflict string `toml:"color_conflict"` ColorDirty string `toml:"color_dirty"` From 87763fbeeeae56957e7af51eb88ed986ef4e5206 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Fri, 8 Mar 2024 13:18:57 -0500 Subject: [PATCH 24/64] chore: add spare checkout --- pkg/git/repo.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/pkg/git/repo.go b/pkg/git/repo.go index 7f3a1c7..9d092f0 100644 --- a/pkg/git/repo.go +++ b/pkg/git/repo.go @@ -168,17 +168,13 @@ func (g *GitRepo) BranchInfo(cfg config.BgpsConfig) (string, error) { g.PromptBranch = strings.TrimPrefix(ref, "refs/heads/") - // TODO: put behind a variable, default to false for perf - checkSparse := true - if checkSparse { - g.IsSparseCheckout, err = SparseCheckout() - if err != nil { - return "", err - } + g.IsSparseCheckout, err = SparseCheckout() + if err != nil { + return "", err + } - if g.IsSparseCheckout { - g.PromptSparseCheckoutStatus = "|SPARSE" - } + if g.IsSparseCheckout { + g.PromptSparseCheckoutStatus = "|SPARSE" } prompt := fmt.Sprintf("%s%s%s%s", g.PromptBareRepoStatus, g.PromptBranch, g.PromptSparseCheckoutStatus, g.PromptMergeStatus) From 1959b6625bf10f78434df52e79319514b7754c23 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Fri, 8 Mar 2024 14:26:26 -0500 Subject: [PATCH 25/64] chore: add cli flags --- main.go | 74 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 12 deletions(-) diff --git a/main.go b/main.go index 07ce2f6..e2627df 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "flag" "fmt" "os" "path" @@ -14,23 +15,45 @@ import ( "github.com/pelletier/go-toml/v2" ) +var ( + configPath = flag.String("config", "", "") + promptPrefix = flag.String("prompt-prefix", "  ", "") + promptSuffix = flag.String("prompt-suffix", "", "") + aheadFormat = flag.String("ahead-format", "", "") + behindFormat = flag.String("behind-format", "", "") + divergedFormat = flag.String("diverged-format", "", "") + colorEnabled = flag.Bool("color-enabled", true, "") + colorClean = flag.String("color-clean", "green", "") + colorConflict = flag.String("color-conflict", "yellow", "") + colorDirty = flag.String("color-dirty", "red", "") + colorUntracked = flag.String("color-untracked", "magenta", "") + colorNoUpstream = flag.String("color-no-upstream", "bright-black", "") +) + func main() { cfg := config.BgpsConfig{ - PromptPrefix: "  ", - PromptSuffix: "", - AheadFormat: "↑[%d]", - BehindFormat: "↓[%d]", - DivergedFormat: "↕ ↑[%d] ↓[%d]", - ColorEnabled: true, - ColorClean: "green", - ColorConflict: "yellow", - ColorDirty: "red", - ColorUntracked: "magenta", - ColorNoUpstream: "bright-black", + PromptPrefix: *promptPrefix, + PromptSuffix: *promptSuffix, + AheadFormat: *aheadFormat, + BehindFormat: *behindFormat, + DivergedFormat: *divergedFormat, + ColorEnabled: *colorEnabled, + ColorClean: *colorClean, + ColorConflict: *colorConflict, + ColorDirty: *colorDirty, + ColorUntracked: *colorUntracked, + ColorNoUpstream: *colorNoUpstream, } - bgpsConfigPath := os.Getenv("BGPS_CONFIG") + flag.Parse() + + var bgpsConfigPath string + if *configPath == "" { + bgpsConfigPath = os.Getenv("BGPS_CONFIG") + } else { + bgpsConfigPath = *configPath + } if bgpsConfigPath == "" { xdgConfigHome := os.Getenv("XDG_CONFIG_HOME") if xdgConfigHome == "" { @@ -59,6 +82,33 @@ func main() { } } + flag.Visit(func(f *flag.Flag) { + switch f.Name { + case "prompt-prefix": + cfg.PromptPrefix = f.Value.String() + case "prompt-suffix": + cfg.PromptSuffix = f.Value.String() + case "ahead-format": + cfg.AheadFormat = f.Value.String() + case "behind-format": + cfg.BehindFormat = f.Value.String() + case "diverged-format": + cfg.DivergedFormat = f.Value.String() + case "color-enabled": + cfg.ColorEnabled = f.Value.String() == f.DefValue + case "color-clean": + cfg.ColorClean = f.Value.String() + case "color-conflict": + cfg.ColorConflict = f.Value.String() + case "color-dirty": + cfg.ColorDirty = f.Value.String() + case "color-untracked": + cfg.ColorUntracked = f.Value.String() + case "color-no-upstream": + cfg.ColorUntracked = f.Value.String() + } + }) + if !cfg.ColorEnabled { color.Disable() } From 2b80394f40d8c7fe5f2714bad42e21b362151799 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Fri, 8 Mar 2024 14:28:49 -0500 Subject: [PATCH 26/64] chore: add missing defaults --- main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index e2627df..d028e62 100644 --- a/main.go +++ b/main.go @@ -19,9 +19,9 @@ var ( configPath = flag.String("config", "", "") promptPrefix = flag.String("prompt-prefix", "  ", "") promptSuffix = flag.String("prompt-suffix", "", "") - aheadFormat = flag.String("ahead-format", "", "") - behindFormat = flag.String("behind-format", "", "") - divergedFormat = flag.String("diverged-format", "", "") + aheadFormat = flag.String("ahead-format", "↑[%d]", "") + behindFormat = flag.String("behind-format", "↓[%d]", "") + divergedFormat = flag.String("diverged-format", "↕ ↑[%d] ↓[%d]", "") colorEnabled = flag.Bool("color-enabled", true, "") colorClean = flag.String("color-clean", "green", "") colorConflict = flag.String("color-conflict", "yellow", "") From c2b79b1deb2a82c132ddc606f81e00bfad313740 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:12:52 -0500 Subject: [PATCH 27/64] chore: use unicode notation for git icon --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index d028e62..8286b11 100644 --- a/main.go +++ b/main.go @@ -17,7 +17,7 @@ import ( var ( configPath = flag.String("config", "", "") - promptPrefix = flag.String("prompt-prefix", "  ", "") + promptPrefix = flag.String("prompt-prefix", " \ue0a0 ", "") promptSuffix = flag.String("prompt-suffix", "", "") aheadFormat = flag.String("ahead-format", "↑[%d]", "") behindFormat = flag.String("behind-format", "↓[%d]", "") From b5452dbd6cba5c32cc9c21054714b97c6c42ea24 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:18:53 -0400 Subject: [PATCH 28/64] chore: add no upstream remote --- main.go | 50 ++++++++++++++++++++++++-------------------- pkg/config/config.go | 23 ++++++++++---------- pkg/git/git.go | 28 +++++++++++++++++++++++++ pkg/git/repo.go | 18 ++++++++++++++++ 4 files changed, 85 insertions(+), 34 deletions(-) diff --git a/main.go b/main.go index 8286b11..99519ea 100644 --- a/main.go +++ b/main.go @@ -16,34 +16,36 @@ import ( ) var ( - configPath = flag.String("config", "", "") - promptPrefix = flag.String("prompt-prefix", " \ue0a0 ", "") - promptSuffix = flag.String("prompt-suffix", "", "") - aheadFormat = flag.String("ahead-format", "↑[%d]", "") - behindFormat = flag.String("behind-format", "↓[%d]", "") - divergedFormat = flag.String("diverged-format", "↕ ↑[%d] ↓[%d]", "") - colorEnabled = flag.Bool("color-enabled", true, "") - colorClean = flag.String("color-clean", "green", "") - colorConflict = flag.String("color-conflict", "yellow", "") - colorDirty = flag.String("color-dirty", "red", "") - colorUntracked = flag.String("color-untracked", "magenta", "") - colorNoUpstream = flag.String("color-no-upstream", "bright-black", "") + configPath = flag.String("config", "", "") + promptPrefix = flag.String("prompt-prefix", " \ue0a0 ", "") + promptSuffix = flag.String("prompt-suffix", "", "") + aheadFormat = flag.String("ahead-format", "↑[%d]", "") + behindFormat = flag.String("behind-format", "↓[%d]", "") + divergedFormat = flag.String("diverged-format", "↕ ↑[%d] ↓[%d]", "") + noUpstreamRemoteFormat = flag.String("no-upstream-remote-format", " → %s/%s", "") + colorEnabled = flag.Bool("color-enabled", true, "") + colorClean = flag.String("color-clean", "green", "") + colorConflict = flag.String("color-conflict", "yellow", "") + colorDirty = flag.String("color-dirty", "red", "") + colorUntracked = flag.String("color-untracked", "magenta", "") + colorNoUpstream = flag.String("color-no-upstream", "bright-black", "") ) func main() { cfg := config.BgpsConfig{ - PromptPrefix: *promptPrefix, - PromptSuffix: *promptSuffix, - AheadFormat: *aheadFormat, - BehindFormat: *behindFormat, - DivergedFormat: *divergedFormat, - ColorEnabled: *colorEnabled, - ColorClean: *colorClean, - ColorConflict: *colorConflict, - ColorDirty: *colorDirty, - ColorUntracked: *colorUntracked, - ColorNoUpstream: *colorNoUpstream, + PromptPrefix: *promptPrefix, + PromptSuffix: *promptSuffix, + AheadFormat: *aheadFormat, + BehindFormat: *behindFormat, + DivergedFormat: *divergedFormat, + NoUpstreamRemoteFormat: *noUpstreamRemoteFormat, + ColorEnabled: *colorEnabled, + ColorClean: *colorClean, + ColorConflict: *colorConflict, + ColorDirty: *colorDirty, + ColorUntracked: *colorUntracked, + ColorNoUpstream: *colorNoUpstream, } flag.Parse() @@ -94,6 +96,8 @@ func main() { cfg.BehindFormat = f.Value.String() case "diverged-format": cfg.DivergedFormat = f.Value.String() + case "no-upstream-remote-format": + cfg.NoUpstreamRemoteFormat = f.Value.String() case "color-enabled": cfg.ColorEnabled = f.Value.String() == f.DefValue case "color-clean": diff --git a/pkg/config/config.go b/pkg/config/config.go index f3645ca..7a07c51 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -1,15 +1,16 @@ package config type BgpsConfig struct { - PromptPrefix string `toml:"prompt_prefix"` - PromptSuffix string `toml:"prompt_suffix"` - AheadFormat string `toml:"ahead_format"` - BehindFormat string `toml:"behind_format"` - DivergedFormat string `toml:"diverged_format"` - ColorEnabled bool `toml:"color_enabled"` - ColorClean string `toml:"color_clean"` - ColorConflict string `toml:"color_conflict"` - ColorDirty string `toml:"color_dirty"` - ColorUntracked string `toml:"color_untracked"` - ColorNoUpstream string `toml:"color_no_upstream"` + PromptPrefix string `toml:"prompt_prefix"` + PromptSuffix string `toml:"prompt_suffix"` + AheadFormat string `toml:"ahead_format"` + BehindFormat string `toml:"behind_format"` + DivergedFormat string `toml:"diverged_format"` + NoUpstreamRemoteFormat string `toml:"no_upstream_remote_format"` + ColorEnabled bool `toml:"color_enabled"` + ColorClean string `toml:"color_clean"` + ColorConflict string `toml:"color_conflict"` + ColorDirty string `toml:"color_dirty"` + ColorUntracked string `toml:"color_untracked"` + ColorNoUpstream string `toml:"color_no_upstream"` } diff --git a/pkg/git/git.go b/pkg/git/git.go index b5ba39f..96f6929 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -256,3 +256,31 @@ func HasCleanWorkingTree() (bool, error) { return exitCode == 0, nil } + +func BranchRemote(branch string) (string, error) { + cmd := exec.Command( + "git", + "config", + fmt.Sprintf("branch.%s.remote", branch), + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return "", err + } + + return strings.TrimSuffix(string(stdCombined), "\n"), nil +} + +func BranchMerge(branch string) (string, error) { + cmd := exec.Command( + "git", + "config", + fmt.Sprintf("branch.%s.merge", branch), + ) + stdCombined, err := cmd.CombinedOutput() + if err != nil { + return "", err + } + + return strings.TrimSuffix(string(stdCombined), "\n"), nil +} diff --git a/pkg/git/repo.go b/pkg/git/repo.go index 9d092f0..4ecdee7 100644 --- a/pkg/git/repo.go +++ b/pkg/git/repo.go @@ -177,6 +177,24 @@ func (g *GitRepo) BranchInfo(cfg config.BgpsConfig) (string, error) { g.PromptSparseCheckoutStatus = "|SPARSE" } + if g.Tag == "" && g.ShortSha == "" { + branch_remote, err := BranchRemote(g.PromptBranch) + var branch_merge string + if err == nil { + branch_merge, err = BranchMerge(g.PromptBranch) + } + if err == nil { + remoteParts := strings.SplitN(branch_remote, ":", 2) + if len(remoteParts) == 2 { + branch_remote = strings.TrimSuffix(remoteParts[1], ".git") + } + + if branch_merge != "" { + g.PromptBranch += fmt.Sprintf(cfg.NoUpstreamRemoteFormat, branch_remote, strings.TrimPrefix(branch_merge, "refs/heads/")) + } + } + } + prompt := fmt.Sprintf("%s%s%s%s", g.PromptBareRepoStatus, g.PromptBranch, g.PromptSparseCheckoutStatus, g.PromptMergeStatus) return prompt, nil From f1aa7b84556f715d17ff6727affdb48d95ab8f65 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:55:36 -0400 Subject: [PATCH 29/64] chore: add tests --- .gitignore | 1 + integration/bgps_test.go | 58 ++++++ integration/init_test.go | 64 +++++++ main.go | 13 +- pkg/git/repo.go | 7 +- pkg/util/util.go | 5 +- testdata/bare/HEAD | 1 + testdata/bare/config | 6 + testdata/bare/description | 1 + testdata/bare/hooks/applypatch-msg.sample | 15 ++ testdata/bare/hooks/commit-msg.sample | 24 +++ testdata/bare/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ testdata/bare/hooks/post-update.sample | 8 + testdata/bare/hooks/pre-applypatch.sample | 14 ++ testdata/bare/hooks/pre-commit.sample | 49 +++++ testdata/bare/hooks/pre-merge-commit.sample | 13 ++ testdata/bare/hooks/pre-push.sample | 53 ++++++ testdata/bare/hooks/pre-rebase.sample | 169 +++++++++++++++++ testdata/bare/hooks/pre-receive.sample | 24 +++ testdata/bare/hooks/prepare-commit-msg.sample | 42 +++++ testdata/bare/hooks/push-to-checkout.sample | 78 ++++++++ testdata/bare/hooks/sendemail-validate.sample | 77 ++++++++ testdata/bare/hooks/update.sample | 128 +++++++++++++ testdata/bare/info/exclude | 6 + testdata/clean/README.md | 1 + testdata/clean/git/COMMIT_EDITMSG | 21 +++ testdata/clean/git/FETCH_HEAD | 0 testdata/clean/git/HEAD | 1 + testdata/clean/git/config | 13 ++ testdata/clean/git/description | 1 + .../clean/git/hooks/applypatch-msg.sample | 15 ++ testdata/clean/git/hooks/commit-msg.sample | 24 +++ .../clean/git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ testdata/clean/git/hooks/post-update.sample | 8 + .../clean/git/hooks/pre-applypatch.sample | 14 ++ testdata/clean/git/hooks/pre-commit.sample | 49 +++++ .../clean/git/hooks/pre-merge-commit.sample | 13 ++ testdata/clean/git/hooks/pre-push.sample | 53 ++++++ testdata/clean/git/hooks/pre-rebase.sample | 169 +++++++++++++++++ testdata/clean/git/hooks/pre-receive.sample | 24 +++ .../clean/git/hooks/prepare-commit-msg.sample | 42 +++++ .../clean/git/hooks/push-to-checkout.sample | 78 ++++++++ .../clean/git/hooks/sendemail-validate.sample | 77 ++++++++ testdata/clean/git/hooks/update.sample | 128 +++++++++++++ testdata/clean/git/index | Bin 0 -> 137 bytes testdata/clean/git/info/exclude | 6 + testdata/clean/git/logs/HEAD | 1 + testdata/clean/git/logs/refs/heads/main | 1 + .../clean/git/logs/refs/remotes/origin/main | 1 + .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes testdata/clean/git/refs/heads/main | 1 + testdata/clean/git/refs/remotes/origin/main | 1 + testdata/commit/README.md | 1 + testdata/commit/git/COMMIT_EDITMSG | 25 +++ testdata/commit/git/FETCH_HEAD | 0 testdata/commit/git/HEAD | 1 + testdata/commit/git/ORIG_HEAD | 1 + testdata/commit/git/config | 13 ++ testdata/commit/git/description | 1 + .../commit/git/hooks/applypatch-msg.sample | 15 ++ testdata/commit/git/hooks/commit-msg.sample | 24 +++ .../git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ testdata/commit/git/hooks/post-update.sample | 8 + .../commit/git/hooks/pre-applypatch.sample | 14 ++ testdata/commit/git/hooks/pre-commit.sample | 49 +++++ .../commit/git/hooks/pre-merge-commit.sample | 13 ++ testdata/commit/git/hooks/pre-push.sample | 53 ++++++ testdata/commit/git/hooks/pre-rebase.sample | 169 +++++++++++++++++ testdata/commit/git/hooks/pre-receive.sample | 24 +++ .../git/hooks/prepare-commit-msg.sample | 42 +++++ .../commit/git/hooks/push-to-checkout.sample | 78 ++++++++ .../git/hooks/sendemail-validate.sample | 77 ++++++++ testdata/commit/git/hooks/update.sample | 128 +++++++++++++ testdata/commit/git/index | Bin 0 -> 137 bytes testdata/commit/git/info/exclude | 6 + testdata/commit/git/logs/HEAD | 7 + testdata/commit/git/logs/refs/heads/main | 5 + .../commit/git/logs/refs/remotes/origin/main | 2 + .../0c/1e5510ac379303b948e7d58c9f665062bc9114 | 2 + .../0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 | Bin 0 -> 46 bytes .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 | 1 + .../92/92d0f6c53027cf9ea31c44b6df4478b769bf8a | Bin 0 -> 54 bytes .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes testdata/commit/git/refs/heads/main | 1 + testdata/commit/git/refs/remotes/origin/main | 1 + testdata/conflict_ahead/README.md | 3 + testdata/conflict_ahead/git/COMMIT_EDITMSG | 21 +++ testdata/conflict_ahead/git/FETCH_HEAD | 0 testdata/conflict_ahead/git/HEAD | 1 + testdata/conflict_ahead/git/config | 13 ++ testdata/conflict_ahead/git/description | 1 + .../git/hooks/applypatch-msg.sample | 15 ++ .../git/hooks/commit-msg.sample | 24 +++ .../git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ .../git/hooks/post-update.sample | 8 + .../git/hooks/pre-applypatch.sample | 14 ++ .../git/hooks/pre-commit.sample | 49 +++++ .../git/hooks/pre-merge-commit.sample | 13 ++ .../conflict_ahead/git/hooks/pre-push.sample | 53 ++++++ .../git/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../git/hooks/pre-receive.sample | 24 +++ .../git/hooks/prepare-commit-msg.sample | 42 +++++ .../git/hooks/push-to-checkout.sample | 78 ++++++++ .../git/hooks/sendemail-validate.sample | 77 ++++++++ .../conflict_ahead/git/hooks/update.sample | 128 +++++++++++++ testdata/conflict_ahead/git/index | Bin 0 -> 137 bytes testdata/conflict_ahead/git/info/exclude | 6 + testdata/conflict_ahead/git/logs/HEAD | 2 + .../conflict_ahead/git/logs/refs/heads/main | 2 + .../git/logs/refs/remotes/origin/main | 1 + .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 | Bin 0 -> 43 bytes .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 | 2 + .../c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f | Bin 0 -> 54 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes testdata/conflict_ahead/git/refs/heads/main | 1 + .../git/refs/remotes/origin/main | 1 + testdata/conflict_behind/README.md | 1 + testdata/conflict_behind/git/COMMIT_EDITMSG | 25 +++ testdata/conflict_behind/git/FETCH_HEAD | 0 testdata/conflict_behind/git/HEAD | 1 + testdata/conflict_behind/git/ORIG_HEAD | 1 + testdata/conflict_behind/git/config | 13 ++ testdata/conflict_behind/git/description | 1 + .../git/hooks/applypatch-msg.sample | 15 ++ .../git/hooks/commit-msg.sample | 24 +++ .../git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ .../git/hooks/post-update.sample | 8 + .../git/hooks/pre-applypatch.sample | 14 ++ .../git/hooks/pre-commit.sample | 49 +++++ .../git/hooks/pre-merge-commit.sample | 13 ++ .../conflict_behind/git/hooks/pre-push.sample | 53 ++++++ .../git/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../git/hooks/pre-receive.sample | 24 +++ .../git/hooks/prepare-commit-msg.sample | 42 +++++ .../git/hooks/push-to-checkout.sample | 78 ++++++++ .../git/hooks/sendemail-validate.sample | 77 ++++++++ .../conflict_behind/git/hooks/update.sample | 128 +++++++++++++ testdata/conflict_behind/git/index | Bin 0 -> 137 bytes testdata/conflict_behind/git/info/exclude | 6 + testdata/conflict_behind/git/logs/HEAD | 5 + .../conflict_behind/git/logs/refs/heads/main | 4 + .../git/logs/refs/remotes/origin/main | 2 + .../0c/1e5510ac379303b948e7d58c9f665062bc9114 | 2 + .../0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 | Bin 0 -> 46 bytes .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 | 1 + .../92/92d0f6c53027cf9ea31c44b6df4478b769bf8a | Bin 0 -> 54 bytes .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes testdata/conflict_behind/git/refs/heads/main | 1 + .../git/refs/remotes/origin/main | 1 + testdata/conflict_diverged/README.md | 3 + testdata/conflict_diverged/git/COMMIT_EDITMSG | 22 +++ testdata/conflict_diverged/git/FETCH_HEAD | 0 testdata/conflict_diverged/git/HEAD | 1 + testdata/conflict_diverged/git/ORIG_HEAD | 1 + testdata/conflict_diverged/git/config | 13 ++ testdata/conflict_diverged/git/description | 1 + .../git/hooks/applypatch-msg.sample | 15 ++ .../git/hooks/commit-msg.sample | 24 +++ .../git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ .../git/hooks/post-update.sample | 8 + .../git/hooks/pre-applypatch.sample | 14 ++ .../git/hooks/pre-commit.sample | 49 +++++ .../git/hooks/pre-merge-commit.sample | 13 ++ .../git/hooks/pre-push.sample | 53 ++++++ .../git/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../git/hooks/pre-receive.sample | 24 +++ .../git/hooks/prepare-commit-msg.sample | 42 +++++ .../git/hooks/push-to-checkout.sample | 78 ++++++++ .../git/hooks/sendemail-validate.sample | 77 ++++++++ .../conflict_diverged/git/hooks/update.sample | 128 +++++++++++++ testdata/conflict_diverged/git/index | Bin 0 -> 137 bytes testdata/conflict_diverged/git/info/exclude | 6 + testdata/conflict_diverged/git/logs/HEAD | 6 + .../git/logs/refs/heads/main | 5 + .../git/logs/refs/remotes/origin/main | 2 + .../0c/1e5510ac379303b948e7d58c9f665062bc9114 | 2 + .../0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 | Bin 0 -> 46 bytes .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../5c/13a5b8d07eb0227fb82a598f56d956a452442d | 1 + .../8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 | 1 + .../92/92d0f6c53027cf9ea31c44b6df4478b769bf8a | Bin 0 -> 54 bytes .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../ac/2180ee7624501134ba79245f7359d52c966277 | Bin 0 -> 188 bytes .../ba/d1c77fc7b325ce66b3b5fa8b4ac393d50c98c5 | Bin 0 -> 37 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes .../conflict_diverged/git/refs/heads/main | 1 + .../git/refs/remotes/origin/main | 1 + testdata/dirty/README.md | 3 + testdata/dirty/git/COMMIT_EDITMSG | 21 +++ testdata/dirty/git/FETCH_HEAD | 0 testdata/dirty/git/HEAD | 1 + testdata/dirty/git/config | 13 ++ testdata/dirty/git/description | 1 + .../dirty/git/hooks/applypatch-msg.sample | 15 ++ testdata/dirty/git/hooks/commit-msg.sample | 24 +++ .../dirty/git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ testdata/dirty/git/hooks/post-update.sample | 8 + .../dirty/git/hooks/pre-applypatch.sample | 14 ++ testdata/dirty/git/hooks/pre-commit.sample | 49 +++++ .../dirty/git/hooks/pre-merge-commit.sample | 13 ++ testdata/dirty/git/hooks/pre-push.sample | 53 ++++++ testdata/dirty/git/hooks/pre-rebase.sample | 169 +++++++++++++++++ testdata/dirty/git/hooks/pre-receive.sample | 24 +++ .../dirty/git/hooks/prepare-commit-msg.sample | 42 +++++ .../dirty/git/hooks/push-to-checkout.sample | 78 ++++++++ .../dirty/git/hooks/sendemail-validate.sample | 77 ++++++++ testdata/dirty/git/hooks/update.sample | 128 +++++++++++++ testdata/dirty/git/index | Bin 0 -> 137 bytes testdata/dirty/git/info/exclude | 6 + testdata/dirty/git/logs/HEAD | 1 + testdata/dirty/git/logs/refs/heads/main | 1 + .../dirty/git/logs/refs/remotes/origin/main | 1 + .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes testdata/dirty/git/refs/heads/main | 1 + testdata/dirty/git/refs/remotes/origin/main | 1 + testdata/git_dir/HEAD | 1 + testdata/git_dir/config | 7 + testdata/git_dir/description | 1 + testdata/git_dir/hooks/applypatch-msg.sample | 15 ++ testdata/git_dir/hooks/commit-msg.sample | 24 +++ .../git_dir/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ testdata/git_dir/hooks/post-update.sample | 8 + testdata/git_dir/hooks/pre-applypatch.sample | 14 ++ testdata/git_dir/hooks/pre-commit.sample | 49 +++++ .../git_dir/hooks/pre-merge-commit.sample | 13 ++ testdata/git_dir/hooks/pre-push.sample | 53 ++++++ testdata/git_dir/hooks/pre-rebase.sample | 169 +++++++++++++++++ testdata/git_dir/hooks/pre-receive.sample | 24 +++ .../git_dir/hooks/prepare-commit-msg.sample | 42 +++++ .../git_dir/hooks/push-to-checkout.sample | 78 ++++++++ .../git_dir/hooks/sendemail-validate.sample | 77 ++++++++ testdata/git_dir/hooks/update.sample | 128 +++++++++++++ testdata/git_dir/info/exclude | 6 + testdata/no_upstream/git/HEAD | 1 + testdata/no_upstream/git/config | 7 + testdata/no_upstream/git/description | 1 + .../git/hooks/applypatch-msg.sample | 15 ++ .../no_upstream/git/hooks/commit-msg.sample | 24 +++ .../git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ .../no_upstream/git/hooks/post-update.sample | 8 + .../git/hooks/pre-applypatch.sample | 14 ++ .../no_upstream/git/hooks/pre-commit.sample | 49 +++++ .../git/hooks/pre-merge-commit.sample | 13 ++ .../no_upstream/git/hooks/pre-push.sample | 53 ++++++ .../no_upstream/git/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../no_upstream/git/hooks/pre-receive.sample | 24 +++ .../git/hooks/prepare-commit-msg.sample | 42 +++++ .../git/hooks/push-to-checkout.sample | 78 ++++++++ .../git/hooks/sendemail-validate.sample | 77 ++++++++ testdata/no_upstream/git/hooks/update.sample | 128 +++++++++++++ testdata/no_upstream/git/info/exclude | 6 + testdata/no_upstream_remote/README.md | 1 + .../no_upstream_remote/git/COMMIT_EDITMSG | 21 +++ testdata/no_upstream_remote/git/FETCH_HEAD | 0 testdata/no_upstream_remote/git/HEAD | 1 + testdata/no_upstream_remote/git/config | 13 ++ testdata/no_upstream_remote/git/description | 1 + .../git/hooks/applypatch-msg.sample | 15 ++ .../git/hooks/commit-msg.sample | 24 +++ .../git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ .../git/hooks/post-update.sample | 8 + .../git/hooks/pre-applypatch.sample | 14 ++ .../git/hooks/pre-commit.sample | 49 +++++ .../git/hooks/pre-merge-commit.sample | 13 ++ .../git/hooks/pre-push.sample | 53 ++++++ .../git/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../git/hooks/pre-receive.sample | 24 +++ .../git/hooks/prepare-commit-msg.sample | 42 +++++ .../git/hooks/push-to-checkout.sample | 78 ++++++++ .../git/hooks/sendemail-validate.sample | 77 ++++++++ .../git/hooks/update.sample | 128 +++++++++++++ testdata/no_upstream_remote/git/index | Bin 0 -> 137 bytes testdata/no_upstream_remote/git/info/exclude | 6 + testdata/no_upstream_remote/git/logs/HEAD | 1 + .../git/logs/refs/heads/main | 1 + .../git/logs/refs/remotes/origin/main | 1 + .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes .../no_upstream_remote/git/refs/heads/main | 1 + .../git/refs/remotes/origin/main | 1 + testdata/tag/README.md | 1 + testdata/tag/git/COMMIT_EDITMSG | 21 +++ testdata/tag/git/FETCH_HEAD | 0 testdata/tag/git/HEAD | 1 + testdata/tag/git/config | 13 ++ testdata/tag/git/description | 1 + testdata/tag/git/hooks/applypatch-msg.sample | 15 ++ testdata/tag/git/hooks/commit-msg.sample | 24 +++ .../tag/git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ testdata/tag/git/hooks/post-update.sample | 8 + testdata/tag/git/hooks/pre-applypatch.sample | 14 ++ testdata/tag/git/hooks/pre-commit.sample | 49 +++++ .../tag/git/hooks/pre-merge-commit.sample | 13 ++ testdata/tag/git/hooks/pre-push.sample | 53 ++++++ testdata/tag/git/hooks/pre-rebase.sample | 169 +++++++++++++++++ testdata/tag/git/hooks/pre-receive.sample | 24 +++ .../tag/git/hooks/prepare-commit-msg.sample | 42 +++++ .../tag/git/hooks/push-to-checkout.sample | 78 ++++++++ .../tag/git/hooks/sendemail-validate.sample | 77 ++++++++ testdata/tag/git/hooks/update.sample | 128 +++++++++++++ testdata/tag/git/index | Bin 0 -> 137 bytes testdata/tag/git/info/exclude | 6 + testdata/tag/git/logs/HEAD | 4 + testdata/tag/git/logs/refs/heads/main | 1 + .../tag/git/logs/refs/remotes/origin/main | 1 + .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes testdata/tag/git/refs/heads/main | 1 + testdata/tag/git/refs/remotes/origin/main | 1 + testdata/untracked/README.md | 1 + testdata/untracked/git/COMMIT_EDITMSG | 21 +++ testdata/untracked/git/FETCH_HEAD | 0 testdata/untracked/git/HEAD | 1 + testdata/untracked/git/config | 13 ++ testdata/untracked/git/description | 1 + .../untracked/git/hooks/applypatch-msg.sample | 15 ++ .../untracked/git/hooks/commit-msg.sample | 24 +++ .../git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ .../untracked/git/hooks/post-update.sample | 8 + .../untracked/git/hooks/pre-applypatch.sample | 14 ++ .../untracked/git/hooks/pre-commit.sample | 49 +++++ .../git/hooks/pre-merge-commit.sample | 13 ++ testdata/untracked/git/hooks/pre-push.sample | 53 ++++++ .../untracked/git/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../untracked/git/hooks/pre-receive.sample | 24 +++ .../git/hooks/prepare-commit-msg.sample | 42 +++++ .../git/hooks/push-to-checkout.sample | 78 ++++++++ .../git/hooks/sendemail-validate.sample | 77 ++++++++ testdata/untracked/git/hooks/update.sample | 128 +++++++++++++ testdata/untracked/git/index | Bin 0 -> 137 bytes testdata/untracked/git/info/exclude | 6 + testdata/untracked/git/logs/HEAD | 1 + testdata/untracked/git/logs/refs/heads/main | 1 + .../git/logs/refs/remotes/origin/main | 1 + .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes testdata/untracked/git/refs/heads/main | 1 + .../untracked/git/refs/remotes/origin/main | 1 + testdata/untracked/untracked.txt | 0 352 files changed, 11106 insertions(+), 7 deletions(-) create mode 100644 integration/bgps_test.go create mode 100644 integration/init_test.go create mode 100644 testdata/bare/HEAD create mode 100644 testdata/bare/config create mode 100644 testdata/bare/description create mode 100755 testdata/bare/hooks/applypatch-msg.sample create mode 100755 testdata/bare/hooks/commit-msg.sample create mode 100755 testdata/bare/hooks/fsmonitor-watchman.sample create mode 100755 testdata/bare/hooks/post-update.sample create mode 100755 testdata/bare/hooks/pre-applypatch.sample create mode 100755 testdata/bare/hooks/pre-commit.sample create mode 100755 testdata/bare/hooks/pre-merge-commit.sample create mode 100755 testdata/bare/hooks/pre-push.sample create mode 100755 testdata/bare/hooks/pre-rebase.sample create mode 100755 testdata/bare/hooks/pre-receive.sample create mode 100755 testdata/bare/hooks/prepare-commit-msg.sample create mode 100755 testdata/bare/hooks/push-to-checkout.sample create mode 100755 testdata/bare/hooks/sendemail-validate.sample create mode 100755 testdata/bare/hooks/update.sample create mode 100644 testdata/bare/info/exclude create mode 100644 testdata/clean/README.md create mode 100644 testdata/clean/git/COMMIT_EDITMSG create mode 100644 testdata/clean/git/FETCH_HEAD create mode 100644 testdata/clean/git/HEAD create mode 100644 testdata/clean/git/config create mode 100644 testdata/clean/git/description create mode 100755 testdata/clean/git/hooks/applypatch-msg.sample create mode 100755 testdata/clean/git/hooks/commit-msg.sample create mode 100755 testdata/clean/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/clean/git/hooks/post-update.sample create mode 100755 testdata/clean/git/hooks/pre-applypatch.sample create mode 100755 testdata/clean/git/hooks/pre-commit.sample create mode 100755 testdata/clean/git/hooks/pre-merge-commit.sample create mode 100755 testdata/clean/git/hooks/pre-push.sample create mode 100755 testdata/clean/git/hooks/pre-rebase.sample create mode 100755 testdata/clean/git/hooks/pre-receive.sample create mode 100755 testdata/clean/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/clean/git/hooks/push-to-checkout.sample create mode 100755 testdata/clean/git/hooks/sendemail-validate.sample create mode 100755 testdata/clean/git/hooks/update.sample create mode 100644 testdata/clean/git/index create mode 100644 testdata/clean/git/info/exclude create mode 100644 testdata/clean/git/logs/HEAD create mode 100644 testdata/clean/git/logs/refs/heads/main create mode 100644 testdata/clean/git/logs/refs/remotes/origin/main create mode 100644 testdata/clean/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/clean/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/clean/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/clean/git/refs/heads/main create mode 100644 testdata/clean/git/refs/remotes/origin/main create mode 100644 testdata/commit/README.md create mode 100644 testdata/commit/git/COMMIT_EDITMSG create mode 100644 testdata/commit/git/FETCH_HEAD create mode 100644 testdata/commit/git/HEAD create mode 100644 testdata/commit/git/ORIG_HEAD create mode 100644 testdata/commit/git/config create mode 100644 testdata/commit/git/description create mode 100755 testdata/commit/git/hooks/applypatch-msg.sample create mode 100755 testdata/commit/git/hooks/commit-msg.sample create mode 100755 testdata/commit/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/commit/git/hooks/post-update.sample create mode 100755 testdata/commit/git/hooks/pre-applypatch.sample create mode 100755 testdata/commit/git/hooks/pre-commit.sample create mode 100755 testdata/commit/git/hooks/pre-merge-commit.sample create mode 100755 testdata/commit/git/hooks/pre-push.sample create mode 100755 testdata/commit/git/hooks/pre-rebase.sample create mode 100755 testdata/commit/git/hooks/pre-receive.sample create mode 100755 testdata/commit/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/commit/git/hooks/push-to-checkout.sample create mode 100755 testdata/commit/git/hooks/sendemail-validate.sample create mode 100755 testdata/commit/git/hooks/update.sample create mode 100644 testdata/commit/git/index create mode 100644 testdata/commit/git/info/exclude create mode 100644 testdata/commit/git/logs/HEAD create mode 100644 testdata/commit/git/logs/refs/heads/main create mode 100644 testdata/commit/git/logs/refs/remotes/origin/main create mode 100644 testdata/commit/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 create mode 100644 testdata/commit/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 create mode 100644 testdata/commit/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/commit/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 create mode 100644 testdata/commit/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a create mode 100644 testdata/commit/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/commit/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/commit/git/refs/heads/main create mode 100644 testdata/commit/git/refs/remotes/origin/main create mode 100644 testdata/conflict_ahead/README.md create mode 100644 testdata/conflict_ahead/git/COMMIT_EDITMSG create mode 100644 testdata/conflict_ahead/git/FETCH_HEAD create mode 100644 testdata/conflict_ahead/git/HEAD create mode 100644 testdata/conflict_ahead/git/config create mode 100644 testdata/conflict_ahead/git/description create mode 100755 testdata/conflict_ahead/git/hooks/applypatch-msg.sample create mode 100755 testdata/conflict_ahead/git/hooks/commit-msg.sample create mode 100755 testdata/conflict_ahead/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/conflict_ahead/git/hooks/post-update.sample create mode 100755 testdata/conflict_ahead/git/hooks/pre-applypatch.sample create mode 100755 testdata/conflict_ahead/git/hooks/pre-commit.sample create mode 100755 testdata/conflict_ahead/git/hooks/pre-merge-commit.sample create mode 100755 testdata/conflict_ahead/git/hooks/pre-push.sample create mode 100755 testdata/conflict_ahead/git/hooks/pre-rebase.sample create mode 100755 testdata/conflict_ahead/git/hooks/pre-receive.sample create mode 100755 testdata/conflict_ahead/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/conflict_ahead/git/hooks/push-to-checkout.sample create mode 100755 testdata/conflict_ahead/git/hooks/sendemail-validate.sample create mode 100755 testdata/conflict_ahead/git/hooks/update.sample create mode 100644 testdata/conflict_ahead/git/index create mode 100644 testdata/conflict_ahead/git/info/exclude create mode 100644 testdata/conflict_ahead/git/logs/HEAD create mode 100644 testdata/conflict_ahead/git/logs/refs/heads/main create mode 100644 testdata/conflict_ahead/git/logs/refs/remotes/origin/main create mode 100644 testdata/conflict_ahead/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/conflict_ahead/git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 create mode 100644 testdata/conflict_ahead/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/conflict_ahead/git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 create mode 100644 testdata/conflict_ahead/git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f create mode 100644 testdata/conflict_ahead/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/conflict_ahead/git/refs/heads/main create mode 100644 testdata/conflict_ahead/git/refs/remotes/origin/main create mode 100644 testdata/conflict_behind/README.md create mode 100644 testdata/conflict_behind/git/COMMIT_EDITMSG create mode 100644 testdata/conflict_behind/git/FETCH_HEAD create mode 100644 testdata/conflict_behind/git/HEAD create mode 100644 testdata/conflict_behind/git/ORIG_HEAD create mode 100644 testdata/conflict_behind/git/config create mode 100644 testdata/conflict_behind/git/description create mode 100755 testdata/conflict_behind/git/hooks/applypatch-msg.sample create mode 100755 testdata/conflict_behind/git/hooks/commit-msg.sample create mode 100755 testdata/conflict_behind/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/conflict_behind/git/hooks/post-update.sample create mode 100755 testdata/conflict_behind/git/hooks/pre-applypatch.sample create mode 100755 testdata/conflict_behind/git/hooks/pre-commit.sample create mode 100755 testdata/conflict_behind/git/hooks/pre-merge-commit.sample create mode 100755 testdata/conflict_behind/git/hooks/pre-push.sample create mode 100755 testdata/conflict_behind/git/hooks/pre-rebase.sample create mode 100755 testdata/conflict_behind/git/hooks/pre-receive.sample create mode 100755 testdata/conflict_behind/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/conflict_behind/git/hooks/push-to-checkout.sample create mode 100755 testdata/conflict_behind/git/hooks/sendemail-validate.sample create mode 100755 testdata/conflict_behind/git/hooks/update.sample create mode 100644 testdata/conflict_behind/git/index create mode 100644 testdata/conflict_behind/git/info/exclude create mode 100644 testdata/conflict_behind/git/logs/HEAD create mode 100644 testdata/conflict_behind/git/logs/refs/heads/main create mode 100644 testdata/conflict_behind/git/logs/refs/remotes/origin/main create mode 100644 testdata/conflict_behind/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 create mode 100644 testdata/conflict_behind/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 create mode 100644 testdata/conflict_behind/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/conflict_behind/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 create mode 100644 testdata/conflict_behind/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a create mode 100644 testdata/conflict_behind/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/conflict_behind/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/conflict_behind/git/refs/heads/main create mode 100644 testdata/conflict_behind/git/refs/remotes/origin/main create mode 100644 testdata/conflict_diverged/README.md create mode 100644 testdata/conflict_diverged/git/COMMIT_EDITMSG create mode 100644 testdata/conflict_diverged/git/FETCH_HEAD create mode 100644 testdata/conflict_diverged/git/HEAD create mode 100644 testdata/conflict_diverged/git/ORIG_HEAD create mode 100644 testdata/conflict_diverged/git/config create mode 100644 testdata/conflict_diverged/git/description create mode 100755 testdata/conflict_diverged/git/hooks/applypatch-msg.sample create mode 100755 testdata/conflict_diverged/git/hooks/commit-msg.sample create mode 100755 testdata/conflict_diverged/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/conflict_diverged/git/hooks/post-update.sample create mode 100755 testdata/conflict_diverged/git/hooks/pre-applypatch.sample create mode 100755 testdata/conflict_diverged/git/hooks/pre-commit.sample create mode 100755 testdata/conflict_diverged/git/hooks/pre-merge-commit.sample create mode 100755 testdata/conflict_diverged/git/hooks/pre-push.sample create mode 100755 testdata/conflict_diverged/git/hooks/pre-rebase.sample create mode 100755 testdata/conflict_diverged/git/hooks/pre-receive.sample create mode 100755 testdata/conflict_diverged/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/conflict_diverged/git/hooks/push-to-checkout.sample create mode 100755 testdata/conflict_diverged/git/hooks/sendemail-validate.sample create mode 100755 testdata/conflict_diverged/git/hooks/update.sample create mode 100644 testdata/conflict_diverged/git/index create mode 100644 testdata/conflict_diverged/git/info/exclude create mode 100644 testdata/conflict_diverged/git/logs/HEAD create mode 100644 testdata/conflict_diverged/git/logs/refs/heads/main create mode 100644 testdata/conflict_diverged/git/logs/refs/remotes/origin/main create mode 100644 testdata/conflict_diverged/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 create mode 100644 testdata/conflict_diverged/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 create mode 100644 testdata/conflict_diverged/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/conflict_diverged/git/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d create mode 100644 testdata/conflict_diverged/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 create mode 100644 testdata/conflict_diverged/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a create mode 100644 testdata/conflict_diverged/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/conflict_diverged/git/objects/ac/2180ee7624501134ba79245f7359d52c966277 create mode 100644 testdata/conflict_diverged/git/objects/ba/d1c77fc7b325ce66b3b5fa8b4ac393d50c98c5 create mode 100644 testdata/conflict_diverged/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/conflict_diverged/git/refs/heads/main create mode 100644 testdata/conflict_diverged/git/refs/remotes/origin/main create mode 100644 testdata/dirty/README.md create mode 100644 testdata/dirty/git/COMMIT_EDITMSG create mode 100644 testdata/dirty/git/FETCH_HEAD create mode 100644 testdata/dirty/git/HEAD create mode 100644 testdata/dirty/git/config create mode 100644 testdata/dirty/git/description create mode 100755 testdata/dirty/git/hooks/applypatch-msg.sample create mode 100755 testdata/dirty/git/hooks/commit-msg.sample create mode 100755 testdata/dirty/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/dirty/git/hooks/post-update.sample create mode 100755 testdata/dirty/git/hooks/pre-applypatch.sample create mode 100755 testdata/dirty/git/hooks/pre-commit.sample create mode 100755 testdata/dirty/git/hooks/pre-merge-commit.sample create mode 100755 testdata/dirty/git/hooks/pre-push.sample create mode 100755 testdata/dirty/git/hooks/pre-rebase.sample create mode 100755 testdata/dirty/git/hooks/pre-receive.sample create mode 100755 testdata/dirty/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/dirty/git/hooks/push-to-checkout.sample create mode 100755 testdata/dirty/git/hooks/sendemail-validate.sample create mode 100755 testdata/dirty/git/hooks/update.sample create mode 100644 testdata/dirty/git/index create mode 100644 testdata/dirty/git/info/exclude create mode 100644 testdata/dirty/git/logs/HEAD create mode 100644 testdata/dirty/git/logs/refs/heads/main create mode 100644 testdata/dirty/git/logs/refs/remotes/origin/main create mode 100644 testdata/dirty/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/dirty/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/dirty/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/dirty/git/refs/heads/main create mode 100644 testdata/dirty/git/refs/remotes/origin/main create mode 100644 testdata/git_dir/HEAD create mode 100644 testdata/git_dir/config create mode 100644 testdata/git_dir/description create mode 100755 testdata/git_dir/hooks/applypatch-msg.sample create mode 100755 testdata/git_dir/hooks/commit-msg.sample create mode 100755 testdata/git_dir/hooks/fsmonitor-watchman.sample create mode 100755 testdata/git_dir/hooks/post-update.sample create mode 100755 testdata/git_dir/hooks/pre-applypatch.sample create mode 100755 testdata/git_dir/hooks/pre-commit.sample create mode 100755 testdata/git_dir/hooks/pre-merge-commit.sample create mode 100755 testdata/git_dir/hooks/pre-push.sample create mode 100755 testdata/git_dir/hooks/pre-rebase.sample create mode 100755 testdata/git_dir/hooks/pre-receive.sample create mode 100755 testdata/git_dir/hooks/prepare-commit-msg.sample create mode 100755 testdata/git_dir/hooks/push-to-checkout.sample create mode 100755 testdata/git_dir/hooks/sendemail-validate.sample create mode 100755 testdata/git_dir/hooks/update.sample create mode 100644 testdata/git_dir/info/exclude create mode 100644 testdata/no_upstream/git/HEAD create mode 100644 testdata/no_upstream/git/config create mode 100644 testdata/no_upstream/git/description create mode 100755 testdata/no_upstream/git/hooks/applypatch-msg.sample create mode 100755 testdata/no_upstream/git/hooks/commit-msg.sample create mode 100755 testdata/no_upstream/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/no_upstream/git/hooks/post-update.sample create mode 100755 testdata/no_upstream/git/hooks/pre-applypatch.sample create mode 100755 testdata/no_upstream/git/hooks/pre-commit.sample create mode 100755 testdata/no_upstream/git/hooks/pre-merge-commit.sample create mode 100755 testdata/no_upstream/git/hooks/pre-push.sample create mode 100755 testdata/no_upstream/git/hooks/pre-rebase.sample create mode 100755 testdata/no_upstream/git/hooks/pre-receive.sample create mode 100755 testdata/no_upstream/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/no_upstream/git/hooks/push-to-checkout.sample create mode 100755 testdata/no_upstream/git/hooks/sendemail-validate.sample create mode 100755 testdata/no_upstream/git/hooks/update.sample create mode 100644 testdata/no_upstream/git/info/exclude create mode 100644 testdata/no_upstream_remote/README.md create mode 100644 testdata/no_upstream_remote/git/COMMIT_EDITMSG create mode 100644 testdata/no_upstream_remote/git/FETCH_HEAD create mode 100644 testdata/no_upstream_remote/git/HEAD create mode 100644 testdata/no_upstream_remote/git/config create mode 100644 testdata/no_upstream_remote/git/description create mode 100755 testdata/no_upstream_remote/git/hooks/applypatch-msg.sample create mode 100755 testdata/no_upstream_remote/git/hooks/commit-msg.sample create mode 100755 testdata/no_upstream_remote/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/no_upstream_remote/git/hooks/post-update.sample create mode 100755 testdata/no_upstream_remote/git/hooks/pre-applypatch.sample create mode 100755 testdata/no_upstream_remote/git/hooks/pre-commit.sample create mode 100755 testdata/no_upstream_remote/git/hooks/pre-merge-commit.sample create mode 100755 testdata/no_upstream_remote/git/hooks/pre-push.sample create mode 100755 testdata/no_upstream_remote/git/hooks/pre-rebase.sample create mode 100755 testdata/no_upstream_remote/git/hooks/pre-receive.sample create mode 100755 testdata/no_upstream_remote/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/no_upstream_remote/git/hooks/push-to-checkout.sample create mode 100755 testdata/no_upstream_remote/git/hooks/sendemail-validate.sample create mode 100755 testdata/no_upstream_remote/git/hooks/update.sample create mode 100644 testdata/no_upstream_remote/git/index create mode 100644 testdata/no_upstream_remote/git/info/exclude create mode 100644 testdata/no_upstream_remote/git/logs/HEAD create mode 100644 testdata/no_upstream_remote/git/logs/refs/heads/main create mode 100644 testdata/no_upstream_remote/git/logs/refs/remotes/origin/main create mode 100644 testdata/no_upstream_remote/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/no_upstream_remote/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/no_upstream_remote/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/no_upstream_remote/git/refs/heads/main create mode 100644 testdata/no_upstream_remote/git/refs/remotes/origin/main create mode 100644 testdata/tag/README.md create mode 100644 testdata/tag/git/COMMIT_EDITMSG create mode 100644 testdata/tag/git/FETCH_HEAD create mode 100644 testdata/tag/git/HEAD create mode 100644 testdata/tag/git/config create mode 100644 testdata/tag/git/description create mode 100755 testdata/tag/git/hooks/applypatch-msg.sample create mode 100755 testdata/tag/git/hooks/commit-msg.sample create mode 100755 testdata/tag/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/tag/git/hooks/post-update.sample create mode 100755 testdata/tag/git/hooks/pre-applypatch.sample create mode 100755 testdata/tag/git/hooks/pre-commit.sample create mode 100755 testdata/tag/git/hooks/pre-merge-commit.sample create mode 100755 testdata/tag/git/hooks/pre-push.sample create mode 100755 testdata/tag/git/hooks/pre-rebase.sample create mode 100755 testdata/tag/git/hooks/pre-receive.sample create mode 100755 testdata/tag/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/tag/git/hooks/push-to-checkout.sample create mode 100755 testdata/tag/git/hooks/sendemail-validate.sample create mode 100755 testdata/tag/git/hooks/update.sample create mode 100644 testdata/tag/git/index create mode 100644 testdata/tag/git/info/exclude create mode 100644 testdata/tag/git/logs/HEAD create mode 100644 testdata/tag/git/logs/refs/heads/main create mode 100644 testdata/tag/git/logs/refs/remotes/origin/main create mode 100644 testdata/tag/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/tag/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/tag/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/tag/git/refs/heads/main create mode 100644 testdata/tag/git/refs/remotes/origin/main create mode 100644 testdata/untracked/README.md create mode 100644 testdata/untracked/git/COMMIT_EDITMSG create mode 100644 testdata/untracked/git/FETCH_HEAD create mode 100644 testdata/untracked/git/HEAD create mode 100644 testdata/untracked/git/config create mode 100644 testdata/untracked/git/description create mode 100755 testdata/untracked/git/hooks/applypatch-msg.sample create mode 100755 testdata/untracked/git/hooks/commit-msg.sample create mode 100755 testdata/untracked/git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/untracked/git/hooks/post-update.sample create mode 100755 testdata/untracked/git/hooks/pre-applypatch.sample create mode 100755 testdata/untracked/git/hooks/pre-commit.sample create mode 100755 testdata/untracked/git/hooks/pre-merge-commit.sample create mode 100755 testdata/untracked/git/hooks/pre-push.sample create mode 100755 testdata/untracked/git/hooks/pre-rebase.sample create mode 100755 testdata/untracked/git/hooks/pre-receive.sample create mode 100755 testdata/untracked/git/hooks/prepare-commit-msg.sample create mode 100755 testdata/untracked/git/hooks/push-to-checkout.sample create mode 100755 testdata/untracked/git/hooks/sendemail-validate.sample create mode 100755 testdata/untracked/git/hooks/update.sample create mode 100644 testdata/untracked/git/index create mode 100644 testdata/untracked/git/info/exclude create mode 100644 testdata/untracked/git/logs/HEAD create mode 100644 testdata/untracked/git/logs/refs/heads/main create mode 100644 testdata/untracked/git/logs/refs/remotes/origin/main create mode 100644 testdata/untracked/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/untracked/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/untracked/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/untracked/git/refs/heads/main create mode 100644 testdata/untracked/git/refs/remotes/origin/main create mode 100644 testdata/untracked/untracked.txt diff --git a/.gitignore b/.gitignore index a15bb1b..892edd3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.swp bgps +tmp diff --git a/integration/bgps_test.go b/integration/bgps_test.go new file mode 100644 index 0000000..2f7aac3 --- /dev/null +++ b/integration/bgps_test.go @@ -0,0 +1,58 @@ +package integration + +import ( + "os/exec" + "path/filepath" + "testing" +) + +func TestBGPS(t *testing.T) { + tests := []struct { + dir string + input []string + expected string + err error + }{ + {"bare", []string{"--config=NONE"}, "\x1b[90m \ue0a0 BARE:main\x1b[0m", nil}, + {"no_upstream", []string{"--config=NONE"}, "\x1b[90m \ue0a0 main\x1b[0m", nil}, + {"no_upstream_remote", []string{"--config=NONE"}, "\x1b[90m \ue0a0 main → mikesmithgh/test/main\x1b[0m", nil}, + {"git_dir", []string{"--config=NONE"}, "\x1b[90m \ue0a0 GIT_DIR!\x1b[0m", nil}, + {"clean", []string{"--config=NONE"}, "\x1b[32m \ue0a0 main\x1b[0m", nil}, + {"tag", []string{"--config=NONE"}, "\x1b[90m \ue0a0 (v1.0.0)\x1b[0m", nil}, + {"commit", []string{"--config=NONE"}, "\x1b[90m \ue0a0 (24afc95)\x1b[0m", nil}, + {"dirty", []string{"--config=NONE"}, "\x1b[31m \ue0a0 main *\x1b[0m", nil}, + {"conflict_ahead", []string{"--config=NONE"}, "\x1b[33m \ue0a0 main ↑[1]\x1b[0m", nil}, + {"conflict_behind", []string{"--config=NONE"}, "\x1b[33m \ue0a0 main ↓[1]\x1b[0m", nil}, + {"conflict_diverged", []string{"--config=NONE"}, "\x1b[33m \ue0a0 main ↕ ↑[1] ↓[1]\x1b[0m", nil}, + {"untracked", []string{"--config=NONE"}, "\x1b[35m \ue0a0 main *\x1b[0m", nil}, + + // TODO: add tests for different merge statuses (rebase, merge, merge|conflict, am, etc) + + {"clean", []string{"--config=NONE", "--color-enabled=false"}, " \ue0a0 main", nil}, + {"clean", []string{"--config=NONE", "--color-enabled=false", "--prompt-prefix= start "}, " start main", nil}, + {"clean", []string{"--config=NONE", "--color-enabled=false", "--prompt-suffix= stop"}, " \ue0a0 main stop", nil}, + {"conflict_ahead", []string{"--config=NONE", "--color-enabled=false", "--ahead-format=ahead by %d"}, " \ue0a0 main ahead by 1", nil}, + {"conflict_behind", []string{"--config=NONE", "--color-enabled=false", "--behind-format=behind by %d"}, " \ue0a0 main behind by 1", nil}, + {"conflict_diverged", []string{"--config=NONE", "--color-enabled=false", "--diverged-format=ahead by %d behind by %d"}, " \ue0a0 main ahead by 1 behind by 1", nil}, + {"no_upstream_remote", []string{"--config=NONE", "--color-enabled=false", "--no-upstream-remote-format= upstream=[repo: %s branch: %s]"}, " \ue0a0 main upstream=[repo: mikesmithgh/test branch: main]", nil}, + + // TODO: add tests for color overrides + + // TODO: add test env var config doesn't exist + // TODO: add test bad toml + {"clean", []string{"--config=/does/not/exist"}, "\x1b[31m bgps error(read config): open /does/not/exist: no such file or directory\x1b[0m", nil}, + } + + for _, test := range tests { + cmd := exec.Command(builtBinaryPath, test.input...) + cmd.Dir = filepath.Join(tmpDir, "testdata", test.dir) + result, err := cmd.CombinedOutput() + if (err != nil && test.err == nil) || (err != nil && test.err != nil && err.Error() != test.err.Error()) { + t.Errorf("Expected error: %v, got: %v", test.err, err) + } + actual := string(result) + if actual != test.expected { + t.Errorf("in directory %s, %s != %s\nexpected:\n%q, \ngot:\n%q", test.dir, test.expected, actual, test.expected, actual) + } + } +} diff --git a/integration/init_test.go b/integration/init_test.go new file mode 100644 index 0000000..b5fb720 --- /dev/null +++ b/integration/init_test.go @@ -0,0 +1,64 @@ +package integration + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "testing" +) + +var ( + builtBinaryPath string + tmpDir string +) + +func TestMain(m *testing.M) { + var err error + tmpDir, err = os.MkdirTemp("", "integration") + if err != nil { + panic("failed to create temp dir") + } + defer os.RemoveAll(tmpDir) + + builtBinaryPath = filepath.Join(tmpDir, "bgps") + + cmd := exec.Command("go", "build", "-o", builtBinaryPath, "..") + output, err := cmd.CombinedOutput() + if err != nil { + panic(fmt.Sprintf("failed to build bgps: %s, %s", output, err)) + } + + cmd = exec.Command("cp", "-r", "../testdata", tmpDir) + err = cmd.Run() + if err != nil { + panic(fmt.Sprintf("failed to copy test data: %s", err)) + } + + test_dirs, err := os.ReadDir(filepath.Join(tmpDir, "testdata")) + if err != nil { + panic(fmt.Sprintf("failed to read test data dir: %s", err)) + } + + for _, test_dir := range test_dirs { + test_dir_path := filepath.Join(tmpDir, "testdata", test_dir.Name()) + test_dir_files, err := os.ReadDir(test_dir_path) + if err != nil { + panic(fmt.Sprintf("failed to read test data file: %s", err)) + } + for _, test_dir_file := range test_dir_files { + if test_dir_file.Name() == "git" { + err = os.Rename(filepath.Join(test_dir_path, "git"), filepath.Join(test_dir_path, ".git")) + if err != nil { + panic(fmt.Sprintf("failed to rename test data git dir: %s", err)) + } + } + } + } + fmt.Println("=== INIT") + fmt.Println("tmpDir:", tmpDir) + fmt.Println("builtBinaryPath:", builtBinaryPath) + + code := m.Run() + os.Exit(code) +} diff --git a/main.go b/main.go index 99519ea..aeff695 100644 --- a/main.go +++ b/main.go @@ -51,8 +51,9 @@ func main() { flag.Parse() var bgpsConfigPath string + bgpsConfigEnv := os.Getenv("BGPS_CONFIG") if *configPath == "" { - bgpsConfigPath = os.Getenv("BGPS_CONFIG") + bgpsConfigPath = bgpsConfigEnv } else { bgpsConfigPath = *configPath } @@ -75,6 +76,10 @@ func main() { if bgpsConfigPath != "NONE" { bgpsConfigRaw, err := os.ReadFile(bgpsConfigPath) if err != nil && !os.IsNotExist(err) { + util.ErrMsg("read config exists", err, 0) + } + + if err != nil && (*configPath != "" || bgpsConfigEnv != "") { util.ErrMsg("read config", err, 0) } @@ -112,10 +117,10 @@ func main() { cfg.ColorUntracked = f.Value.String() } }) - if !cfg.ColorEnabled { color.Disable() } + clearColor, _ := color.Color("none") gitRepo, stderr, err := git.RevParse() if err != nil { @@ -129,10 +134,10 @@ func main() { if err != nil { util.ErrMsg("branch info", err, 0) } - branchStatus, color, err := gitRepo.BranchStatus(cfg) + branchStatus, promptColor, err := gitRepo.BranchStatus(cfg) if err != nil { util.ErrMsg("branch status", err, 0) } - fmt.Printf("%s%s%s%s%s", color, cfg.PromptPrefix, branchInfo, branchStatus, cfg.PromptSuffix) + fmt.Printf("%s%s%s%s%s%s", promptColor, cfg.PromptPrefix, branchInfo, branchStatus, cfg.PromptSuffix, clearColor) } diff --git a/pkg/git/repo.go b/pkg/git/repo.go index 4ecdee7..6c6bce4 100644 --- a/pkg/git/repo.go +++ b/pkg/git/repo.go @@ -177,7 +177,7 @@ func (g *GitRepo) BranchInfo(cfg config.BgpsConfig) (string, error) { g.PromptSparseCheckoutStatus = "|SPARSE" } - if g.Tag == "" && g.ShortSha == "" { + if g.Tag == "" && g.ShortSha == "" && g.PromptMergeStatus == "" { branch_remote, err := BranchRemote(g.PromptBranch) var branch_merge string if err == nil { @@ -248,6 +248,11 @@ func (g *GitRepo) BranchStatus(cfg config.BgpsConfig) (string, string, error) { statusColor, _ = color.Color(strings.Split(cfg.ColorNoUpstream, " ")...) } + if g.PromptMergeStatus != "" { + // TODO: do not hardcode, add a config option + statusColor, _ = color.Color(strings.Split("blue", " ")...) + } + if hasUntracked { statusColor, _ = color.Color(strings.Split(cfg.ColorUntracked, " ")...) status = fmt.Sprintf("*%s", status) diff --git a/pkg/util/util.go b/pkg/util/util.go index 98ecb56..c30abe2 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -34,7 +34,8 @@ func ReadFileTrimNewline(name string) (string, error) { } func ErrMsg(hint string, e error, exitCode int) { - color, _ := color.Color("red") - fmt.Printf("%s bgps error(%s): %s", color, hint, strings.ReplaceAll(e.Error(), "\n", "")) + errorColor, _ := color.Color("red") + clearColor, _ := color.Color("none") + fmt.Printf("%s bgps error(%s): %s%s", errorColor, hint, strings.ReplaceAll(e.Error(), "\n", ""), clearColor) os.Exit(exitCode) } diff --git a/testdata/bare/HEAD b/testdata/bare/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/bare/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/bare/config b/testdata/bare/config new file mode 100644 index 0000000..e6da231 --- /dev/null +++ b/testdata/bare/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true diff --git a/testdata/bare/description b/testdata/bare/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/bare/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/bare/hooks/applypatch-msg.sample b/testdata/bare/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/bare/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/bare/hooks/commit-msg.sample b/testdata/bare/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/bare/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/bare/hooks/fsmonitor-watchman.sample b/testdata/bare/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/bare/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/bare/hooks/post-update.sample b/testdata/bare/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/bare/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/bare/hooks/pre-applypatch.sample b/testdata/bare/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/bare/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/bare/hooks/pre-commit.sample b/testdata/bare/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/bare/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/bare/hooks/pre-merge-commit.sample b/testdata/bare/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/bare/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/bare/hooks/pre-push.sample b/testdata/bare/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/bare/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/bare/hooks/pre-rebase.sample b/testdata/bare/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/bare/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/bare/hooks/pre-receive.sample b/testdata/bare/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/bare/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/bare/hooks/prepare-commit-msg.sample b/testdata/bare/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/bare/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/bare/hooks/push-to-checkout.sample b/testdata/bare/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/bare/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/bare/hooks/update.sample b/testdata/bare/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/bare/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/bare/info/exclude b/testdata/bare/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/bare/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/testdata/clean/README.md b/testdata/clean/README.md new file mode 100644 index 0000000..a8cdb91 --- /dev/null +++ b/testdata/clean/README.md @@ -0,0 +1 @@ +# Test Repo diff --git a/testdata/clean/git/COMMIT_EDITMSG b/testdata/clean/git/COMMIT_EDITMSG new file mode 100644 index 0000000..8b77790 --- /dev/null +++ b/testdata/clean/git/COMMIT_EDITMSG @@ -0,0 +1,21 @@ +chore: test repo +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# On branch main +# +# Initial commit +# +# Changes to be committed: +# new file: README.md +# +# ------------------------ >8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +new file mode 100644 +index 0000000..a8cdb91 +--- /dev/null ++++ b/README.md +@@ -0,0 +1 @@ ++# Test Repo diff --git a/testdata/clean/git/FETCH_HEAD b/testdata/clean/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/clean/git/HEAD b/testdata/clean/git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/clean/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/clean/git/config b/testdata/clean/git/config new file mode 100644 index 0000000..0b453be --- /dev/null +++ b/testdata/clean/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/testdata/clean/git/description b/testdata/clean/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/clean/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/clean/git/hooks/applypatch-msg.sample b/testdata/clean/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/clean/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/clean/git/hooks/commit-msg.sample b/testdata/clean/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/clean/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/clean/git/hooks/fsmonitor-watchman.sample b/testdata/clean/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/clean/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/clean/git/hooks/post-update.sample b/testdata/clean/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/clean/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/clean/git/hooks/pre-applypatch.sample b/testdata/clean/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/clean/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/clean/git/hooks/pre-commit.sample b/testdata/clean/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/clean/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/clean/git/hooks/pre-merge-commit.sample b/testdata/clean/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/clean/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/clean/git/hooks/pre-push.sample b/testdata/clean/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/clean/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/clean/git/hooks/pre-rebase.sample b/testdata/clean/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/clean/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/clean/git/hooks/pre-receive.sample b/testdata/clean/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/clean/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/clean/git/hooks/prepare-commit-msg.sample b/testdata/clean/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/clean/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/clean/git/hooks/push-to-checkout.sample b/testdata/clean/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/clean/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/clean/git/hooks/update.sample b/testdata/clean/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/clean/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/clean/git/index b/testdata/clean/git/index new file mode 100644 index 0000000000000000000000000000000000000000..830d16820b6d774f04e41a2d3e9060f45a062d2c GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%iXj^?v??!ah91_nVUE|JF!42?^G(qDmUM1YuQ#o3(#ERI|1 zy#9Fb8|^*RULGhc#=sfm>geL@s+XI>5EA6-3REY_V5nfgb#2c4Pxdo5?hWd)u6QWB fe3m|QuY7uu*YTL3{P(*YyQSqfy!{f}&Zq_eUCAs5 literal 0 HcmV?d00001 diff --git a/testdata/clean/git/info/exclude b/testdata/clean/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/clean/git/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/testdata/clean/git/logs/HEAD b/testdata/clean/git/logs/HEAD new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/clean/git/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/clean/git/logs/refs/heads/main b/testdata/clean/git/logs/refs/heads/main new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/clean/git/logs/refs/heads/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/clean/git/logs/refs/remotes/origin/main b/testdata/clean/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..93909bf --- /dev/null +++ b/testdata/clean/git/logs/refs/remotes/origin/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push diff --git a/testdata/clean/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/clean/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/clean/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/clean/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/clean/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmbAY*>Z;N$J4CV+splNtLEQ2ot>+j Kk-8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +index a8cdb91..0ef5caa 100644 +--- a/README.md ++++ b/README.md +@@ -1 +1,3 @@ + # Test Repo ++ ++Repo is for testing. diff --git a/testdata/commit/git/FETCH_HEAD b/testdata/commit/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/commit/git/HEAD b/testdata/commit/git/HEAD new file mode 100644 index 0000000..365d4b3 --- /dev/null +++ b/testdata/commit/git/HEAD @@ -0,0 +1 @@ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/commit/git/ORIG_HEAD b/testdata/commit/git/ORIG_HEAD new file mode 100644 index 0000000..365d4b3 --- /dev/null +++ b/testdata/commit/git/ORIG_HEAD @@ -0,0 +1 @@ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/commit/git/config b/testdata/commit/git/config new file mode 100644 index 0000000..0b453be --- /dev/null +++ b/testdata/commit/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/testdata/commit/git/description b/testdata/commit/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/commit/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/commit/git/hooks/applypatch-msg.sample b/testdata/commit/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/commit/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/commit/git/hooks/commit-msg.sample b/testdata/commit/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/commit/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/commit/git/hooks/fsmonitor-watchman.sample b/testdata/commit/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/commit/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/commit/git/hooks/post-update.sample b/testdata/commit/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/commit/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/commit/git/hooks/pre-applypatch.sample b/testdata/commit/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/commit/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/commit/git/hooks/pre-commit.sample b/testdata/commit/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/commit/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/commit/git/hooks/pre-merge-commit.sample b/testdata/commit/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/commit/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/commit/git/hooks/pre-push.sample b/testdata/commit/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/commit/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/commit/git/hooks/pre-rebase.sample b/testdata/commit/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/commit/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/commit/git/hooks/pre-receive.sample b/testdata/commit/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/commit/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/commit/git/hooks/prepare-commit-msg.sample b/testdata/commit/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/commit/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/commit/git/hooks/push-to-checkout.sample b/testdata/commit/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/commit/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/commit/git/hooks/update.sample b/testdata/commit/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/commit/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/commit/git/index b/testdata/commit/git/index new file mode 100644 index 0000000000000000000000000000000000000000..59d9505229a0fab6b175a4b9013db2be410e58b7 GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%jy2aI0qt$@*t3=D!yTn63@42?^G(qDmUM1YuQ#o3(#ERI|1 zy#9Fb8|^*RULGhc#=sfm>geL@s+XI>5EA6-3REY_V5nfgb#2c4Pxdo5?hWd)u6QWB fe3m|Que{vLh2Iayy65;EG+wp;Q_TKq5#L7uJ>V}@ literal 0 HcmV?d00001 diff --git a/testdata/commit/git/info/exclude b/testdata/commit/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/commit/git/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/testdata/commit/git/logs/HEAD b/testdata/commit/git/logs/HEAD new file mode 100644 index 0000000..26318e5 --- /dev/null +++ b/testdata/commit/git/logs/HEAD @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249528 -0400 commit: chore: add test commit +8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249538 -0400 commit (amend): chore: add test commit 1 +0c1e5510ac379303b948e7d58c9f665062bc9114 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249560 -0400 reset: moving to HEAD~ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249564 -0400 reset: moving to HEAD +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710250425 -0400 reset: moving to @{u} +0c1e5510ac379303b948e7d58c9f665062bc9114 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710250432 -0400 checkout: moving from main to 24afc95 diff --git a/testdata/commit/git/logs/refs/heads/main b/testdata/commit/git/logs/refs/heads/main new file mode 100644 index 0000000..4df627a --- /dev/null +++ b/testdata/commit/git/logs/refs/heads/main @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249528 -0400 commit: chore: add test commit +8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249538 -0400 commit (amend): chore: add test commit 1 +0c1e5510ac379303b948e7d58c9f665062bc9114 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249560 -0400 reset: moving to HEAD~ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710250425 -0400 reset: moving to @{u} diff --git a/testdata/commit/git/logs/refs/remotes/origin/main b/testdata/commit/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..8315c09 --- /dev/null +++ b/testdata/commit/git/logs/refs/remotes/origin/main @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249557 -0400 update by push diff --git a/testdata/commit/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 b/testdata/commit/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 new file mode 100644 index 0000000..3729286 --- /dev/null +++ b/testdata/commit/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 @@ -0,0 +1,2 @@ +xKn0}٣F]U1A49΂ +~uY.To1CTQFFNZ1ٕjٻkHFФJv)d3Ub[Ԓ8E6\NcrOR[gay>m?^a%KYidrRwnT%$^ckJqG@pyvhKI C?-1?) literal 0 HcmV?d00001 diff --git a/testdata/commit/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/commit/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/commit/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/commit/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 b/testdata/commit/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 new file mode 100644 index 0000000..5a6e347 --- /dev/null +++ b/testdata/commit/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 @@ -0,0 +1 @@ +xKN!`לN\y^Wp%v`bx]IbY4$lu!ʾ6s)]n3HJrq3˥qM0j%E9ֽScNQ[?n_o!Xn{rx+Pr&:CCUSk!ǀH^\ \ No newline at end of file diff --git a/testdata/commit/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a b/testdata/commit/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a new file mode 100644 index 0000000000000000000000000000000000000000..1b44a6d72dad03f26a50c30849d107b8c70a4e8f GIT binary patch literal 54 zcmV-60LlM&0V^p=O;s>9XD~D{Ff%bx2y%6F@paY9O<~~sdTQC(Mfx(V{x)6f=B>SI M9k1L305?Dni$_Hlm;e9( literal 0 HcmV?d00001 diff --git a/testdata/commit/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/commit/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmbAY*>Z;N$J4CV+splNtLEQ2ot>+j Kk-8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +index a8cdb91..a60a2fa 100644 +--- a/README.md ++++ b/README.md +@@ -1 +1,3 @@ + # Test Repo ++ ++Modified line diff --git a/testdata/conflict_ahead/git/FETCH_HEAD b/testdata/conflict_ahead/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/conflict_ahead/git/HEAD b/testdata/conflict_ahead/git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/conflict_ahead/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/conflict_ahead/git/config b/testdata/conflict_ahead/git/config new file mode 100644 index 0000000..0b453be --- /dev/null +++ b/testdata/conflict_ahead/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/testdata/conflict_ahead/git/description b/testdata/conflict_ahead/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/conflict_ahead/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/conflict_ahead/git/hooks/applypatch-msg.sample b/testdata/conflict_ahead/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/conflict_ahead/git/hooks/commit-msg.sample b/testdata/conflict_ahead/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/conflict_ahead/git/hooks/fsmonitor-watchman.sample b/testdata/conflict_ahead/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/conflict_ahead/git/hooks/post-update.sample b/testdata/conflict_ahead/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/conflict_ahead/git/hooks/pre-applypatch.sample b/testdata/conflict_ahead/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/conflict_ahead/git/hooks/pre-commit.sample b/testdata/conflict_ahead/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/conflict_ahead/git/hooks/pre-merge-commit.sample b/testdata/conflict_ahead/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/conflict_ahead/git/hooks/pre-push.sample b/testdata/conflict_ahead/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/conflict_ahead/git/hooks/pre-rebase.sample b/testdata/conflict_ahead/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/conflict_ahead/git/hooks/pre-receive.sample b/testdata/conflict_ahead/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/conflict_ahead/git/hooks/prepare-commit-msg.sample b/testdata/conflict_ahead/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/conflict_ahead/git/hooks/push-to-checkout.sample b/testdata/conflict_ahead/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/conflict_ahead/git/hooks/update.sample b/testdata/conflict_ahead/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/conflict_ahead/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/conflict_ahead/git/index b/testdata/conflict_ahead/git/index new file mode 100644 index 0000000000000000000000000000000000000000..3abc35dffce89865ae3d5db45b0340216e31baa1 GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%j?^*r}=KY{6+tG+TaFbFbnN$z1_Xj}r6{t8qh0>skGxb)ZM zPGfPNR}fLV{dff$Ag~3>6HxPN*t;W|TX 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e b69e688b26a7ca0498b0cbd8b3e6e189d987b661 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249375 -0400 commit: chore: ahead diff --git a/testdata/conflict_ahead/git/logs/refs/heads/main b/testdata/conflict_ahead/git/logs/refs/heads/main new file mode 100644 index 0000000..48f3491 --- /dev/null +++ b/testdata/conflict_ahead/git/logs/refs/heads/main @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e b69e688b26a7ca0498b0cbd8b3e6e189d987b661 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249375 -0400 commit: chore: ahead diff --git a/testdata/conflict_ahead/git/logs/refs/remotes/origin/main b/testdata/conflict_ahead/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..93909bf --- /dev/null +++ b/testdata/conflict_ahead/git/logs/refs/remotes/origin/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push diff --git a/testdata/conflict_ahead/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/conflict_ahead/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/conflict_ahead/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/conflict_ahead/git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 b/testdata/conflict_ahead/git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 new file mode 100644 index 0000000000000000000000000000000000000000..c40a00cfa52fc872a26a6ce7416dc4ce823752e1 GIT binary patch literal 43 zcmV+`0M!3@0ZYosPf{>4XHZrMNi8l>2udx;=i>6sPsvQnOifY9$;?aT0sy;+3dw$? B67m25 literal 0 HcmV?d00001 diff --git a/testdata/conflict_ahead/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/conflict_ahead/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmb]o>9/&~tq{e96m ߿HC^óɸ?=㵭*2C.Y \ No newline at end of file diff --git a/testdata/conflict_ahead/git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f b/testdata/conflict_ahead/git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f new file mode 100644 index 0000000000000000000000000000000000000000..17f454c9ea11162e11b99a85adb345417fc54504 GIT binary patch literal 54 zcmV-60LlM&0V^p=O;s>9XD~D{Ff%bx2y%6F@paY9O<`EZrN1tB8jJHRmzwy*?p
AY*>Z;N$J4CV+splNtLEQ2ot>+j Kk-8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +index a8cdb91..0ef5caa 100644 +--- a/README.md ++++ b/README.md +@@ -1 +1,3 @@ + # Test Repo ++ ++Repo is for testing. diff --git a/testdata/conflict_behind/git/FETCH_HEAD b/testdata/conflict_behind/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/conflict_behind/git/HEAD b/testdata/conflict_behind/git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/conflict_behind/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/conflict_behind/git/ORIG_HEAD b/testdata/conflict_behind/git/ORIG_HEAD new file mode 100644 index 0000000..365d4b3 --- /dev/null +++ b/testdata/conflict_behind/git/ORIG_HEAD @@ -0,0 +1 @@ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/conflict_behind/git/config b/testdata/conflict_behind/git/config new file mode 100644 index 0000000..0b453be --- /dev/null +++ b/testdata/conflict_behind/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/testdata/conflict_behind/git/description b/testdata/conflict_behind/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/conflict_behind/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/conflict_behind/git/hooks/applypatch-msg.sample b/testdata/conflict_behind/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/conflict_behind/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/conflict_behind/git/hooks/commit-msg.sample b/testdata/conflict_behind/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/conflict_behind/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/conflict_behind/git/hooks/fsmonitor-watchman.sample b/testdata/conflict_behind/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/conflict_behind/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/conflict_behind/git/hooks/post-update.sample b/testdata/conflict_behind/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/conflict_behind/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/conflict_behind/git/hooks/pre-applypatch.sample b/testdata/conflict_behind/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/conflict_behind/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/conflict_behind/git/hooks/pre-commit.sample b/testdata/conflict_behind/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/conflict_behind/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/conflict_behind/git/hooks/pre-merge-commit.sample b/testdata/conflict_behind/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/conflict_behind/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/conflict_behind/git/hooks/pre-push.sample b/testdata/conflict_behind/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/conflict_behind/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/conflict_behind/git/hooks/pre-rebase.sample b/testdata/conflict_behind/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/conflict_behind/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/conflict_behind/git/hooks/pre-receive.sample b/testdata/conflict_behind/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/conflict_behind/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/conflict_behind/git/hooks/prepare-commit-msg.sample b/testdata/conflict_behind/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/conflict_behind/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/conflict_behind/git/hooks/push-to-checkout.sample b/testdata/conflict_behind/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/conflict_behind/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/conflict_behind/git/hooks/update.sample b/testdata/conflict_behind/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/conflict_behind/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/conflict_behind/git/index b/testdata/conflict_behind/git/index new file mode 100644 index 0000000000000000000000000000000000000000..61a384705e9cddd06ed84322039ede693a0af5c7 GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%jCF$|2`f52!)1_nVUF6lQ642?^G(qDmUM1YuQ#o3(#ERI|1 zy#9Fb8|^*RULGhc#=sfm>geL@s+XI>5EA6-3REY_V5nfgb#2c4Pxdo5?hWd)u6QWB fe3m|QuY7mJO8bBdm0X*iZZdhBAY*ai_3}Odcor>b literal 0 HcmV?d00001 diff --git a/testdata/conflict_behind/git/info/exclude b/testdata/conflict_behind/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/conflict_behind/git/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/testdata/conflict_behind/git/logs/HEAD b/testdata/conflict_behind/git/logs/HEAD new file mode 100644 index 0000000..8b55e81 --- /dev/null +++ b/testdata/conflict_behind/git/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249528 -0400 commit: chore: add test commit +8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249538 -0400 commit (amend): chore: add test commit 1 +0c1e5510ac379303b948e7d58c9f665062bc9114 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249560 -0400 reset: moving to HEAD~ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249564 -0400 reset: moving to HEAD diff --git a/testdata/conflict_behind/git/logs/refs/heads/main b/testdata/conflict_behind/git/logs/refs/heads/main new file mode 100644 index 0000000..64c3091 --- /dev/null +++ b/testdata/conflict_behind/git/logs/refs/heads/main @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249528 -0400 commit: chore: add test commit +8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249538 -0400 commit (amend): chore: add test commit 1 +0c1e5510ac379303b948e7d58c9f665062bc9114 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249560 -0400 reset: moving to HEAD~ diff --git a/testdata/conflict_behind/git/logs/refs/remotes/origin/main b/testdata/conflict_behind/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..8315c09 --- /dev/null +++ b/testdata/conflict_behind/git/logs/refs/remotes/origin/main @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249557 -0400 update by push diff --git a/testdata/conflict_behind/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 b/testdata/conflict_behind/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 new file mode 100644 index 0000000..3729286 --- /dev/null +++ b/testdata/conflict_behind/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 @@ -0,0 +1,2 @@ +xKn0}٣F]U1A49΂ +~uY.To1CTQFFNZ1ٕjٻkHFФJv)d3Ub[Ԓ8E6\NcrOR[gay>m?^a%KYidrRwnT%$^ckJqG@pyvhKI C?-1?) literal 0 HcmV?d00001 diff --git a/testdata/conflict_behind/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/conflict_behind/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/conflict_behind/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/conflict_behind/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 b/testdata/conflict_behind/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 new file mode 100644 index 0000000..5a6e347 --- /dev/null +++ b/testdata/conflict_behind/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 @@ -0,0 +1 @@ +xKN!`לN\y^Wp%v`bx]IbY4$lu!ʾ6s)]n3HJrq3˥qM0j%E9ֽScNQ[?n_o!Xn{rx+Pr&:CCUSk!ǀH^\ \ No newline at end of file diff --git a/testdata/conflict_behind/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a b/testdata/conflict_behind/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a new file mode 100644 index 0000000000000000000000000000000000000000..1b44a6d72dad03f26a50c30849d107b8c70a4e8f GIT binary patch literal 54 zcmV-60LlM&0V^p=O;s>9XD~D{Ff%bx2y%6F@paY9O<~~sdTQC(Mfx(V{x)6f=B>SI M9k1L305?Dni$_Hlm;e9( literal 0 HcmV?d00001 diff --git a/testdata/conflict_behind/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/conflict_behind/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmbAY*>Z;N$J4CV+splNtLEQ2ot>+j Kk-8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +index a8cdb91..bad1c77 100644 +--- a/README.md ++++ b/README.md +@@ -1 +1,3 @@ + # Test Repo ++ ++Diverge diff --git a/testdata/conflict_diverged/git/FETCH_HEAD b/testdata/conflict_diverged/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/conflict_diverged/git/HEAD b/testdata/conflict_diverged/git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/conflict_diverged/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/conflict_diverged/git/ORIG_HEAD b/testdata/conflict_diverged/git/ORIG_HEAD new file mode 100644 index 0000000..365d4b3 --- /dev/null +++ b/testdata/conflict_diverged/git/ORIG_HEAD @@ -0,0 +1 @@ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/conflict_diverged/git/config b/testdata/conflict_diverged/git/config new file mode 100644 index 0000000..0b453be --- /dev/null +++ b/testdata/conflict_diverged/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/testdata/conflict_diverged/git/description b/testdata/conflict_diverged/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/conflict_diverged/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/conflict_diverged/git/hooks/applypatch-msg.sample b/testdata/conflict_diverged/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/conflict_diverged/git/hooks/commit-msg.sample b/testdata/conflict_diverged/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/conflict_diverged/git/hooks/fsmonitor-watchman.sample b/testdata/conflict_diverged/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/conflict_diverged/git/hooks/post-update.sample b/testdata/conflict_diverged/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/conflict_diverged/git/hooks/pre-applypatch.sample b/testdata/conflict_diverged/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/conflict_diverged/git/hooks/pre-commit.sample b/testdata/conflict_diverged/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/conflict_diverged/git/hooks/pre-merge-commit.sample b/testdata/conflict_diverged/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/conflict_diverged/git/hooks/pre-push.sample b/testdata/conflict_diverged/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/conflict_diverged/git/hooks/pre-rebase.sample b/testdata/conflict_diverged/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/conflict_diverged/git/hooks/pre-receive.sample b/testdata/conflict_diverged/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/conflict_diverged/git/hooks/prepare-commit-msg.sample b/testdata/conflict_diverged/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/conflict_diverged/git/hooks/push-to-checkout.sample b/testdata/conflict_diverged/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/conflict_diverged/git/hooks/update.sample b/testdata/conflict_diverged/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/conflict_diverged/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/conflict_diverged/git/index b/testdata/conflict_diverged/git/index new file mode 100644 index 0000000000000000000000000000000000000000..419e8d2a1694fec91a6ba07572368bbda49a43ed GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%jCbJ?8dv4d#V8@d9F3=D!yTr#H^7#f!VrN08zhybzZu8YU( zk8f5zm$rH9uWqlyldtm3ILg2o#CQV!VnVV>IzgR$zZ5pz!f9BbjO9d4NCPp kv?BY%ZiX!ha?!2Nn0&02ImPpo>zBBUYNNYTCKoOT01=%pCjbBd literal 0 HcmV?d00001 diff --git a/testdata/conflict_diverged/git/info/exclude b/testdata/conflict_diverged/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/conflict_diverged/git/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/testdata/conflict_diverged/git/logs/HEAD b/testdata/conflict_diverged/git/logs/HEAD new file mode 100644 index 0000000..86545bc --- /dev/null +++ b/testdata/conflict_diverged/git/logs/HEAD @@ -0,0 +1,6 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249528 -0400 commit: chore: add test commit +8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249538 -0400 commit (amend): chore: add test commit 1 +0c1e5510ac379303b948e7d58c9f665062bc9114 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249560 -0400 reset: moving to HEAD~ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249564 -0400 reset: moving to HEAD +24afc9585ad36ab4a5bcfce5fe08131e72904a5e ac2180ee7624501134ba79245f7359d52c966277 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249632 -0400 commit: chore: add diverge commit diff --git a/testdata/conflict_diverged/git/logs/refs/heads/main b/testdata/conflict_diverged/git/logs/refs/heads/main new file mode 100644 index 0000000..e5f18e8 --- /dev/null +++ b/testdata/conflict_diverged/git/logs/refs/heads/main @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249528 -0400 commit: chore: add test commit +8bd10196bff523aa457e79f5fc2ad0bce66c6fd9 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249538 -0400 commit (amend): chore: add test commit 1 +0c1e5510ac379303b948e7d58c9f665062bc9114 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249560 -0400 reset: moving to HEAD~ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e ac2180ee7624501134ba79245f7359d52c966277 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249632 -0400 commit: chore: add diverge commit diff --git a/testdata/conflict_diverged/git/logs/refs/remotes/origin/main b/testdata/conflict_diverged/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..8315c09 --- /dev/null +++ b/testdata/conflict_diverged/git/logs/refs/remotes/origin/main @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 0c1e5510ac379303b948e7d58c9f665062bc9114 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249557 -0400 update by push diff --git a/testdata/conflict_diverged/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 b/testdata/conflict_diverged/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 new file mode 100644 index 0000000..3729286 --- /dev/null +++ b/testdata/conflict_diverged/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 @@ -0,0 +1,2 @@ +xKn0}٣F]U1A49΂ +~uY.To1CTQFFNZ1ٕjٻkHFФJv)d3Ub[Ԓ8E6\NcrOR[gay>m?^a%KYidrRwnT%$^ckJqG@pyvhKI C?-1?) literal 0 HcmV?d00001 diff --git a/testdata/conflict_diverged/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/conflict_diverged/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/conflict_diverged/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/conflict_diverged/git/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d b/testdata/conflict_diverged/git/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d new file mode 100644 index 0000000..837fa76 --- /dev/null +++ b/testdata/conflict_diverged/git/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d @@ -0,0 +1 @@ +x+)JMU06g040031QrutuMauxͪ6ouxUGXH \ No newline at end of file diff --git a/testdata/conflict_diverged/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 b/testdata/conflict_diverged/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 new file mode 100644 index 0000000..5a6e347 --- /dev/null +++ b/testdata/conflict_diverged/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 @@ -0,0 +1 @@ +xKN!`לN\y^Wp%v`bx]IbY4$lu!ʾ6s)]n3HJrq3˥qM0j%E9ֽScNQ[?n_o!Xn{rx+Pr&:CCUSk!ǀH^\ \ No newline at end of file diff --git a/testdata/conflict_diverged/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a b/testdata/conflict_diverged/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a new file mode 100644 index 0000000000000000000000000000000000000000..1b44a6d72dad03f26a50c30849d107b8c70a4e8f GIT binary patch literal 54 zcmV-60LlM&0V^p=O;s>9XD~D{Ff%bx2y%6F@paY9O<~~sdTQC(Mfx(V{x)6f=B>SI M9k1L305?Dni$_Hlm;e9( literal 0 HcmV?d00001 diff --git a/testdata/conflict_diverged/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/conflict_diverged/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmb*m5w5Vrb-RB%d4^=S)?P)cG!=ORYo-l&bY9J8?@Z zOpP&Ut9g`VfvnPb%v*=|<;L(K$r)ZXYD?bv%PMgHWz&2;ckcUe-#R}&zlTZSnTN8i qZ=gqw#zk)pJflNYLPa|Ge^*tJpZo%;R;bGt_le=Jq<#SLXF4MP9` literal 0 HcmV?d00001 diff --git a/testdata/conflict_diverged/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f b/testdata/conflict_diverged/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f new file mode 100644 index 0000000000000000000000000000000000000000..2edd24a035267b697ee2a630237ba2520215027a GIT binary patch literal 54 zcmbAY*>Z;N$J4CV+splNtLEQ2ot>+j Kk-8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +new file mode 100644 +index 0000000..a8cdb91 +--- /dev/null ++++ b/README.md +@@ -0,0 +1 @@ ++# Test Repo diff --git a/testdata/dirty/git/FETCH_HEAD b/testdata/dirty/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/dirty/git/HEAD b/testdata/dirty/git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/dirty/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/dirty/git/config b/testdata/dirty/git/config new file mode 100644 index 0000000..0b453be --- /dev/null +++ b/testdata/dirty/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/testdata/dirty/git/description b/testdata/dirty/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/dirty/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/dirty/git/hooks/applypatch-msg.sample b/testdata/dirty/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/dirty/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/dirty/git/hooks/commit-msg.sample b/testdata/dirty/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/dirty/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/dirty/git/hooks/fsmonitor-watchman.sample b/testdata/dirty/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/dirty/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/dirty/git/hooks/post-update.sample b/testdata/dirty/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/dirty/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/dirty/git/hooks/pre-applypatch.sample b/testdata/dirty/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/dirty/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/dirty/git/hooks/pre-commit.sample b/testdata/dirty/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/dirty/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/dirty/git/hooks/pre-merge-commit.sample b/testdata/dirty/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/dirty/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/dirty/git/hooks/pre-push.sample b/testdata/dirty/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/dirty/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/dirty/git/hooks/pre-rebase.sample b/testdata/dirty/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/dirty/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/dirty/git/hooks/pre-receive.sample b/testdata/dirty/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/dirty/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/dirty/git/hooks/prepare-commit-msg.sample b/testdata/dirty/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/dirty/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/dirty/git/hooks/push-to-checkout.sample b/testdata/dirty/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/dirty/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/dirty/git/hooks/update.sample b/testdata/dirty/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/dirty/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/dirty/git/index b/testdata/dirty/git/index new file mode 100644 index 0000000000000000000000000000000000000000..82e3adee516f2b74e54ae9a5edf8b540455ad5df GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%iXi`nhgp90es?*5Dn41!EtVz~?qjZ1*iUx8{wfS6~+*_{F` zj$7)y{&?^k?LE|99w;ovz!~J~=;G_Dmz%;666ER%R42(`s9?Z#ZO;5p_A@r_4eGM4 jcqqGkmOgW@{12lk>!<9zDV(eSYtl)#E$hWUsQdu{JNYe* literal 0 HcmV?d00001 diff --git a/testdata/dirty/git/info/exclude b/testdata/dirty/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/dirty/git/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/testdata/dirty/git/logs/HEAD b/testdata/dirty/git/logs/HEAD new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/dirty/git/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/dirty/git/logs/refs/heads/main b/testdata/dirty/git/logs/refs/heads/main new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/dirty/git/logs/refs/heads/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/dirty/git/logs/refs/remotes/origin/main b/testdata/dirty/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..93909bf --- /dev/null +++ b/testdata/dirty/git/logs/refs/remotes/origin/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push diff --git a/testdata/dirty/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/dirty/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/dirty/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/dirty/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/dirty/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmbAY*>Z;N$J4CV+splNtLEQ2ot>+j Kk-\).*$/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/testdata/git_dir/hooks/fsmonitor-watchman.sample b/testdata/git_dir/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/git_dir/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/git_dir/hooks/post-update.sample b/testdata/git_dir/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/git_dir/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/git_dir/hooks/pre-applypatch.sample b/testdata/git_dir/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/git_dir/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/git_dir/hooks/pre-commit.sample b/testdata/git_dir/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/git_dir/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/git_dir/hooks/pre-merge-commit.sample b/testdata/git_dir/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/git_dir/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/git_dir/hooks/pre-push.sample b/testdata/git_dir/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/git_dir/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/git_dir/hooks/pre-rebase.sample b/testdata/git_dir/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/git_dir/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/git_dir/hooks/pre-receive.sample b/testdata/git_dir/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/git_dir/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/git_dir/hooks/prepare-commit-msg.sample b/testdata/git_dir/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/git_dir/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/git_dir/hooks/push-to-checkout.sample b/testdata/git_dir/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/git_dir/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/git_dir/hooks/update.sample b/testdata/git_dir/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/git_dir/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/git_dir/info/exclude b/testdata/git_dir/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/git_dir/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/testdata/no_upstream/git/HEAD b/testdata/no_upstream/git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/no_upstream/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/no_upstream/git/config b/testdata/no_upstream/git/config new file mode 100644 index 0000000..6c9406b --- /dev/null +++ b/testdata/no_upstream/git/config @@ -0,0 +1,7 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true diff --git a/testdata/no_upstream/git/description b/testdata/no_upstream/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/no_upstream/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/no_upstream/git/hooks/applypatch-msg.sample b/testdata/no_upstream/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/no_upstream/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/no_upstream/git/hooks/commit-msg.sample b/testdata/no_upstream/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/no_upstream/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/no_upstream/git/hooks/fsmonitor-watchman.sample b/testdata/no_upstream/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/no_upstream/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/no_upstream/git/hooks/post-update.sample b/testdata/no_upstream/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/no_upstream/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/no_upstream/git/hooks/pre-applypatch.sample b/testdata/no_upstream/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/no_upstream/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/no_upstream/git/hooks/pre-commit.sample b/testdata/no_upstream/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/no_upstream/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/no_upstream/git/hooks/pre-merge-commit.sample b/testdata/no_upstream/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/no_upstream/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/no_upstream/git/hooks/pre-push.sample b/testdata/no_upstream/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/no_upstream/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/no_upstream/git/hooks/pre-rebase.sample b/testdata/no_upstream/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/no_upstream/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/no_upstream/git/hooks/pre-receive.sample b/testdata/no_upstream/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/no_upstream/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/no_upstream/git/hooks/prepare-commit-msg.sample b/testdata/no_upstream/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/no_upstream/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/no_upstream/git/hooks/push-to-checkout.sample b/testdata/no_upstream/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/no_upstream/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/no_upstream/git/hooks/update.sample b/testdata/no_upstream/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/no_upstream/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/no_upstream/git/info/exclude b/testdata/no_upstream/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/no_upstream/git/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/testdata/no_upstream_remote/README.md b/testdata/no_upstream_remote/README.md new file mode 100644 index 0000000..a8cdb91 --- /dev/null +++ b/testdata/no_upstream_remote/README.md @@ -0,0 +1 @@ +# Test Repo diff --git a/testdata/no_upstream_remote/git/COMMIT_EDITMSG b/testdata/no_upstream_remote/git/COMMIT_EDITMSG new file mode 100644 index 0000000..8b77790 --- /dev/null +++ b/testdata/no_upstream_remote/git/COMMIT_EDITMSG @@ -0,0 +1,21 @@ +chore: test repo +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# On branch main +# +# Initial commit +# +# Changes to be committed: +# new file: README.md +# +# ------------------------ >8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +new file mode 100644 +index 0000000..a8cdb91 +--- /dev/null ++++ b/README.md +@@ -0,0 +1 @@ ++# Test Repo diff --git a/testdata/no_upstream_remote/git/FETCH_HEAD b/testdata/no_upstream_remote/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/no_upstream_remote/git/HEAD b/testdata/no_upstream_remote/git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/no_upstream_remote/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/no_upstream_remote/git/config b/testdata/no_upstream_remote/git/config new file mode 100644 index 0000000..12faeae --- /dev/null +++ b/testdata/no_upstream_remote/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = git@github.com:mikesmithgh/test.git + merge = refs/heads/main diff --git a/testdata/no_upstream_remote/git/description b/testdata/no_upstream_remote/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/no_upstream_remote/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/no_upstream_remote/git/hooks/applypatch-msg.sample b/testdata/no_upstream_remote/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/no_upstream_remote/git/hooks/commit-msg.sample b/testdata/no_upstream_remote/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/no_upstream_remote/git/hooks/fsmonitor-watchman.sample b/testdata/no_upstream_remote/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/no_upstream_remote/git/hooks/post-update.sample b/testdata/no_upstream_remote/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/no_upstream_remote/git/hooks/pre-applypatch.sample b/testdata/no_upstream_remote/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/no_upstream_remote/git/hooks/pre-commit.sample b/testdata/no_upstream_remote/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/no_upstream_remote/git/hooks/pre-merge-commit.sample b/testdata/no_upstream_remote/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/no_upstream_remote/git/hooks/pre-push.sample b/testdata/no_upstream_remote/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/no_upstream_remote/git/hooks/pre-rebase.sample b/testdata/no_upstream_remote/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/no_upstream_remote/git/hooks/pre-receive.sample b/testdata/no_upstream_remote/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/no_upstream_remote/git/hooks/prepare-commit-msg.sample b/testdata/no_upstream_remote/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/no_upstream_remote/git/hooks/push-to-checkout.sample b/testdata/no_upstream_remote/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/no_upstream_remote/git/hooks/update.sample b/testdata/no_upstream_remote/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/no_upstream_remote/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/no_upstream_remote/git/index b/testdata/no_upstream_remote/git/index new file mode 100644 index 0000000000000000000000000000000000000000..f09a2050d9a6100add8e065e3b3ede95afc11a7f GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%kd{AMYSBEfXLiWegTgCG-^$wmf-#w9@MuRt{-K+Ln^>`nm| z$1QbUe?0h&_8w|44-^(-;0$tgbn$i7%S~Yj337D>s*_|eR50MWHfR1P`xzVe26b6i iJd|BNOP{${{yFEed3=K9&)>Y6zWzl??2eUE-(>*&Uo6Q0 literal 0 HcmV?d00001 diff --git a/testdata/no_upstream_remote/git/info/exclude b/testdata/no_upstream_remote/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/no_upstream_remote/git/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/testdata/no_upstream_remote/git/logs/HEAD b/testdata/no_upstream_remote/git/logs/HEAD new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/no_upstream_remote/git/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/no_upstream_remote/git/logs/refs/heads/main b/testdata/no_upstream_remote/git/logs/refs/heads/main new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/no_upstream_remote/git/logs/refs/heads/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/no_upstream_remote/git/logs/refs/remotes/origin/main b/testdata/no_upstream_remote/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..93909bf --- /dev/null +++ b/testdata/no_upstream_remote/git/logs/refs/remotes/origin/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push diff --git a/testdata/no_upstream_remote/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/no_upstream_remote/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/no_upstream_remote/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/no_upstream_remote/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/no_upstream_remote/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmbAY*>Z;N$J4CV+splNtLEQ2ot>+j Kk-8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +new file mode 100644 +index 0000000..a8cdb91 +--- /dev/null ++++ b/README.md +@@ -0,0 +1 @@ ++# Test Repo diff --git a/testdata/tag/git/FETCH_HEAD b/testdata/tag/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/tag/git/HEAD b/testdata/tag/git/HEAD new file mode 100644 index 0000000..365d4b3 --- /dev/null +++ b/testdata/tag/git/HEAD @@ -0,0 +1 @@ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/tag/git/config b/testdata/tag/git/config new file mode 100644 index 0000000..0b453be --- /dev/null +++ b/testdata/tag/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/testdata/tag/git/description b/testdata/tag/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/tag/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/tag/git/hooks/applypatch-msg.sample b/testdata/tag/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/tag/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/tag/git/hooks/commit-msg.sample b/testdata/tag/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/tag/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/tag/git/hooks/fsmonitor-watchman.sample b/testdata/tag/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/tag/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/tag/git/hooks/post-update.sample b/testdata/tag/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/tag/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/tag/git/hooks/pre-applypatch.sample b/testdata/tag/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/tag/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/tag/git/hooks/pre-commit.sample b/testdata/tag/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/tag/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/tag/git/hooks/pre-merge-commit.sample b/testdata/tag/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/tag/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/tag/git/hooks/pre-push.sample b/testdata/tag/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/tag/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/tag/git/hooks/pre-rebase.sample b/testdata/tag/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/tag/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/tag/git/hooks/pre-receive.sample b/testdata/tag/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/tag/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/tag/git/hooks/prepare-commit-msg.sample b/testdata/tag/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/tag/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/tag/git/hooks/push-to-checkout.sample b/testdata/tag/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/tag/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/tag/git/hooks/update.sample b/testdata/tag/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/tag/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/tag/git/index b/testdata/tag/git/index new file mode 100644 index 0000000000000000000000000000000000000000..3d834609243835b185f05b130de9d5ed4893eead GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%jyZrqPQECJJZ4n1dNU=U>D(ko|RXj}r6{t8qh0>nHk&h8Xo zaokep^~ZzXXz!u+@<3rR2F@T?M;BjLz1$RrkRVrApgKtgLj?n_Yjfs*vY)YWZ%~(Y i#Y5TUv-FvJ<*Og{-4FO|=dn@Q#zAlU<;q+;-$DQhZ7q}l literal 0 HcmV?d00001 diff --git a/testdata/tag/git/info/exclude b/testdata/tag/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/tag/git/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/testdata/tag/git/logs/HEAD b/testdata/tag/git/logs/HEAD new file mode 100644 index 0000000..099c16d --- /dev/null +++ b/testdata/tag/git/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710250331 -0400 checkout: moving from main to v1.0.0 +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710250383 -0400 checkout: moving from 24afc9585ad36ab4a5bcfce5fe08131e72904a5e to main +24afc9585ad36ab4a5bcfce5fe08131e72904a5e 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710250717 -0400 checkout: moving from main to 24afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/tag/git/logs/refs/heads/main b/testdata/tag/git/logs/refs/heads/main new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/tag/git/logs/refs/heads/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/tag/git/logs/refs/remotes/origin/main b/testdata/tag/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..93909bf --- /dev/null +++ b/testdata/tag/git/logs/refs/remotes/origin/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push diff --git a/testdata/tag/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/tag/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/tag/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/tag/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/tag/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmbAY*>Z;N$J4CV+splNtLEQ2ot>+j Kk-8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +new file mode 100644 +index 0000000..a8cdb91 +--- /dev/null ++++ b/README.md +@@ -0,0 +1 @@ ++# Test Repo diff --git a/testdata/untracked/git/FETCH_HEAD b/testdata/untracked/git/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/testdata/untracked/git/HEAD b/testdata/untracked/git/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/testdata/untracked/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/testdata/untracked/git/config b/testdata/untracked/git/config new file mode 100644 index 0000000..0b453be --- /dev/null +++ b/testdata/untracked/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@github.com:mikesmithgh/test.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/testdata/untracked/git/description b/testdata/untracked/git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/testdata/untracked/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/testdata/untracked/git/hooks/applypatch-msg.sample b/testdata/untracked/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/testdata/untracked/git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/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/testdata/untracked/git/hooks/commit-msg.sample b/testdata/untracked/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/testdata/untracked/git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/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/testdata/untracked/git/hooks/fsmonitor-watchman.sample b/testdata/untracked/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/testdata/untracked/git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/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. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "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/testdata/untracked/git/hooks/post-update.sample b/testdata/untracked/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/testdata/untracked/git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/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/testdata/untracked/git/hooks/pre-applypatch.sample b/testdata/untracked/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/testdata/untracked/git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/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/testdata/untracked/git/hooks/pre-commit.sample b/testdata/untracked/git/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/testdata/untracked/git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/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-index --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/testdata/untracked/git/hooks/pre-merge-commit.sample b/testdata/untracked/git/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/testdata/untracked/git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/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/testdata/untracked/git/hooks/pre-push.sample b/testdata/untracked/git/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/testdata/untracked/git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/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/testdata/untracked/git/hooks/pre-rebase.sample b/testdata/untracked/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/testdata/untracked/git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/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/testdata/untracked/git/hooks/pre-receive.sample b/testdata/untracked/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/testdata/untracked/git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/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/testdata/untracked/git/hooks/prepare-commit-msg.sample b/testdata/untracked/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/testdata/untracked/git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/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/testdata/untracked/git/hooks/push-to-checkout.sample b/testdata/untracked/git/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/testdata/untracked/git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/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 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/testdata/untracked/git/hooks/update.sample b/testdata/untracked/git/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/testdata/untracked/git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&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/testdata/untracked/git/index b/testdata/untracked/git/index new file mode 100644 index 0000000000000000000000000000000000000000..a4f27fde1014e65354bd44d948e30834a4e7a8c8 GIT binary patch literal 137 zcmZ?q402{*U|<4b#?%jC-=sN(euHVI^plJX41!Eta$6V}8kYd2zXH{W05Q*svpWS? z9JkbY{qf*8+Iy(IJWyDSfiuX}(Z$zQFE@oDB*@hjs7{i>P{Dxf+MM~H>}PD;8`Nc8 i@lba8EPdu)`5@&!MaJ+2XH45q_1>^LUfN_9r2_zXr7MvD literal 0 HcmV?d00001 diff --git a/testdata/untracked/git/info/exclude b/testdata/untracked/git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/testdata/untracked/git/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/testdata/untracked/git/logs/HEAD b/testdata/untracked/git/logs/HEAD new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/untracked/git/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/untracked/git/logs/refs/heads/main b/testdata/untracked/git/logs/refs/heads/main new file mode 100644 index 0000000..7b811e5 --- /dev/null +++ b/testdata/untracked/git/logs/refs/heads/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo diff --git a/testdata/untracked/git/logs/refs/remotes/origin/main b/testdata/untracked/git/logs/refs/remotes/origin/main new file mode 100644 index 0000000..93909bf --- /dev/null +++ b/testdata/untracked/git/logs/refs/remotes/origin/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249042 -0400 update by push diff --git a/testdata/untracked/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/untracked/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e new file mode 100644 index 0000000..f0bb9bb --- /dev/null +++ b/testdata/untracked/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e @@ -0,0 +1 @@ +xK!EQǬE1n+StELCܽ'y/ѮFM]&͈Nƪ(Inu+\[Xiqe+W~??ps 8TDpiU𭓏PThY|L \ No newline at end of file diff --git a/testdata/untracked/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/untracked/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 new file mode 100644 index 0000000000000000000000000000000000000000..7cbd8527c3500cc541097aafad98a3b5d30aa5f9 GIT binary patch literal 28 jcmbAY*>Z;N$J4CV+splNtLEQ2ot>+j Kk- Date: Thu, 14 Mar 2024 10:23:22 -0400 Subject: [PATCH 30/64] chore: add error handling and blue merging color --- main.go | 9 ++++++++- pkg/color/color.go | 4 ++++ pkg/config/config.go | 1 + pkg/git/repo.go | 41 ++++++++++++++++++++++++++++++++--------- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index aeff695..7c59f44 100644 --- a/main.go +++ b/main.go @@ -29,6 +29,7 @@ var ( colorDirty = flag.String("color-dirty", "red", "") colorUntracked = flag.String("color-untracked", "magenta", "") colorNoUpstream = flag.String("color-no-upstream", "bright-black", "") + colorMerging = flag.String("color-merging", "blue", "") ) func main() { @@ -46,6 +47,7 @@ func main() { ColorDirty: *colorDirty, ColorUntracked: *colorUntracked, ColorNoUpstream: *colorNoUpstream, + ColorMerging: *colorMerging, } flag.Parse() @@ -115,12 +117,17 @@ func main() { cfg.ColorUntracked = f.Value.String() case "color-no-upstream": cfg.ColorUntracked = f.Value.String() + case "color-merging": + cfg.ColorMerging = f.Value.String() } }) if !cfg.ColorEnabled { color.Disable() } - clearColor, _ := color.Color("none") + clearColor, err := color.Color("none") + if err != nil { + util.ErrMsg("color none", err, 0) + } gitRepo, stderr, err := git.RevParse() if err != nil { diff --git a/pkg/color/color.go b/pkg/color/color.go index 7f1396b..c3d860e 100644 --- a/pkg/color/color.go +++ b/pkg/color/color.go @@ -82,6 +82,10 @@ func hexToRGB(hex string) (int, int, int, error) { hex = strings.TrimPrefix(hex, "#") + if len(hex) != 6 { + return 0, 0, 0, fmt.Errorf("hex must be 6 digits, got %s", hex) + } + // Parse the hex string into RGB components r, err := strconv.ParseInt(hex[0:2], 16, 32) if err != nil { diff --git a/pkg/config/config.go b/pkg/config/config.go index 7a07c51..881809a 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -13,4 +13,5 @@ type BgpsConfig struct { ColorDirty string `toml:"color_dirty"` ColorUntracked string `toml:"color_untracked"` ColorNoUpstream string `toml:"color_no_upstream"` + ColorMerging string `toml:"color_merging"` } diff --git a/pkg/git/repo.go b/pkg/git/repo.go index 6c6bce4..fba71de 100644 --- a/pkg/git/repo.go +++ b/pkg/git/repo.go @@ -206,7 +206,10 @@ func (g *GitRepo) BranchStatus(cfg config.BgpsConfig) (string, string, error) { statusColor := "" if g.IsInBareRepo || g.IsInGitDir { - c, _ := color.Color(strings.Split(cfg.ColorNoUpstream, " ")...) + c, err := color.Color(strings.Split(cfg.ColorNoUpstream, " ")...) + if err != nil { + util.ErrMsg("color no upstream", err, 0) + } return status, c, nil } @@ -228,15 +231,24 @@ func (g *GitRepo) BranchStatus(cfg config.BgpsConfig) (string, string, error) { } if cleanWorkingTree { - statusColor, _ = color.Color(strings.Split(cfg.ColorClean, " ")...) + statusColor, err = color.Color(strings.Split(cfg.ColorClean, " ")...) + if err != nil { + util.ErrMsg("color clean", err, 0) + } } if ahead > 0 { - statusColor, _ = color.Color(strings.Split(cfg.ColorConflict, " ")...) + statusColor, err = color.Color(strings.Split(cfg.ColorConflict, " ")...) + if err != nil { + util.ErrMsg("color conflict", err, 0) + } status = fmt.Sprintf(cfg.AheadFormat, ahead) } if behind > 0 { - statusColor, _ = color.Color(strings.Split(cfg.ColorConflict, " ")...) + statusColor, err = color.Color(strings.Split(cfg.ColorConflict, " ")...) + if err != nil { + util.ErrMsg("color conflict", err, 0) + } status = fmt.Sprintf(cfg.BehindFormat, behind) } @@ -245,21 +257,32 @@ func (g *GitRepo) BranchStatus(cfg config.BgpsConfig) (string, string, error) { } if g.ShortSha == "" { - statusColor, _ = color.Color(strings.Split(cfg.ColorNoUpstream, " ")...) + statusColor, err = color.Color(strings.Split(cfg.ColorNoUpstream, " ")...) + if err != nil { + util.ErrMsg("color no upstream", err, 0) + } } if g.PromptMergeStatus != "" { - // TODO: do not hardcode, add a config option - statusColor, _ = color.Color(strings.Split("blue", " ")...) + statusColor, err = color.Color(strings.Split(cfg.ColorMerging, " ")...) + if err != nil { + util.ErrMsg("color merging", err, 0) + } } if hasUntracked { - statusColor, _ = color.Color(strings.Split(cfg.ColorUntracked, " ")...) + statusColor, err = color.Color(strings.Split(cfg.ColorUntracked, " ")...) + if err != nil { + util.ErrMsg("color untracked", err, 0) + } status = fmt.Sprintf("*%s", status) } if !cleanWorkingTree && !hasUntracked { - statusColor, _ = color.Color(strings.Split(cfg.ColorDirty, " ")...) + statusColor, err = color.Color(strings.Split(cfg.ColorDirty, " ")...) + if err != nil { + util.ErrMsg("color dirty", err, 0) + } status = fmt.Sprintf("*%s", status) } if status != "" { From 6b13d4170ea44a552c3f909813c6b73926b1ebc0 Mon Sep 17 00:00:00 2001 From: Mike Smith <10135646+mikesmithgh@users.noreply.github.com> Date: Thu, 14 Mar 2024 15:25:00 -0400 Subject: [PATCH 31/64] chore: rename git to dot_git --- .fdignore | 1 + .rgignore | 1 + integration/bgps_test.go | 1 + integration/init_test.go | 4 +- .../clean/{git => dot_git}/COMMIT_EDITMSG | 0 testdata/clean/{git => dot_git}/FETCH_HEAD | 0 testdata/clean/{git => dot_git}/HEAD | 0 testdata/clean/{git => dot_git}/config | 0 testdata/clean/{git => dot_git}/description | 0 .../hooks/applypatch-msg.sample | 0 .../{git => dot_git}/hooks/commit-msg.sample | 0 .../hooks/fsmonitor-watchman.sample | 0 .../{git => dot_git}/hooks/post-update.sample | 0 .../hooks/pre-applypatch.sample | 0 .../{git => dot_git}/hooks/pre-commit.sample | 0 .../hooks/pre-merge-commit.sample | 0 .../{git => dot_git}/hooks/pre-push.sample | 0 .../{git => dot_git}/hooks/pre-rebase.sample | 0 .../{git => dot_git}/hooks/pre-receive.sample | 0 .../hooks/prepare-commit-msg.sample | 0 .../hooks/push-to-checkout.sample | 0 .../hooks/sendemail-validate.sample | 0 .../{git => dot_git}/hooks/update.sample | 0 testdata/clean/{git => dot_git}/index | Bin testdata/clean/{git => dot_git}/info/exclude | 0 testdata/clean/{git => dot_git}/logs/HEAD | 0 .../{git => dot_git}/logs/refs/heads/main | 0 .../logs/refs/remotes/origin/main | 0 .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin .../clean/{git => dot_git}/refs/heads/main | 0 .../{git => dot_git}/refs/remotes/origin/main | 0 .../commit/{git => dot_git}/COMMIT_EDITMSG | 0 testdata/commit/{git => dot_git}/FETCH_HEAD | 0 testdata/commit/{git => dot_git}/HEAD | 0 testdata/commit/{git => dot_git}/ORIG_HEAD | 0 testdata/commit/{git => dot_git}/config | 0 testdata/commit/{git => dot_git}/description | 0 .../hooks/applypatch-msg.sample | 0 .../{git => dot_git}/hooks/commit-msg.sample | 0 .../hooks/fsmonitor-watchman.sample | 0 .../{git => dot_git}/hooks/post-update.sample | 0 .../hooks/pre-applypatch.sample | 0 .../{git => dot_git}/hooks/pre-commit.sample | 0 .../hooks/pre-merge-commit.sample | 0 .../{git => dot_git}/hooks/pre-push.sample | 0 .../{git => dot_git}/hooks/pre-rebase.sample | 0 .../{git => dot_git}/hooks/pre-receive.sample | 0 .../hooks/prepare-commit-msg.sample | 0 .../hooks/push-to-checkout.sample | 0 .../hooks/sendemail-validate.sample | 0 .../{git => dot_git}/hooks/update.sample | 0 testdata/commit/{git => dot_git}/index | Bin testdata/commit/{git => dot_git}/info/exclude | 0 testdata/commit/{git => dot_git}/logs/HEAD | 0 .../{git => dot_git}/logs/refs/heads/main | 0 .../logs/refs/remotes/origin/main | 0 .../0c/1e5510ac379303b948e7d58c9f665062bc9114 | 0 .../0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 | Bin .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 | 0 .../92/92d0f6c53027cf9ea31c44b6df4478b769bf8a | Bin .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin .../commit/{git => dot_git}/refs/heads/main | 0 .../{git => dot_git}/refs/remotes/origin/main | 0 .../{git => dot_git}/COMMIT_EDITMSG | 0 .../{git => dot_git}/FETCH_HEAD | 0 testdata/conflict_ahead/{git => dot_git}/HEAD | 0 .../conflict_ahead/{git => dot_git}/config | 0 .../{git => dot_git}/description | 0 .../hooks/applypatch-msg.sample | 0 .../{git => dot_git}/hooks/commit-msg.sample | 0 .../hooks/fsmonitor-watchman.sample | 0 .../{git => dot_git}/hooks/post-update.sample | 0 .../hooks/pre-applypatch.sample | 0 .../{git => dot_git}/hooks/pre-commit.sample | 0 .../hooks/pre-merge-commit.sample | 0 .../{git => dot_git}/hooks/pre-push.sample | 0 .../{git => dot_git}/hooks/pre-rebase.sample | 0 .../{git => dot_git}/hooks/pre-receive.sample | 0 .../hooks/prepare-commit-msg.sample | 0 .../hooks/push-to-checkout.sample | 0 .../hooks/sendemail-validate.sample | 0 .../{git => dot_git}/hooks/update.sample | 0 .../conflict_ahead/{git => dot_git}/index | Bin .../{git => dot_git}/info/exclude | 0 .../conflict_ahead/{git => dot_git}/logs/HEAD | 0 .../{git => dot_git}/logs/refs/heads/main | 0 .../logs/refs/remotes/origin/main | 0 .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 | Bin .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 | 0 .../c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f | Bin .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin .../{git => dot_git}/refs/heads/main | 0 .../{git => dot_git}/refs/remotes/origin/main | 0 .../{git => dot_git}/COMMIT_EDITMSG | 0 .../{git => dot_git}/FETCH_HEAD | 0 .../conflict_behind/{git => dot_git}/HEAD | 0 .../{git => dot_git}/ORIG_HEAD | 0 .../conflict_behind/{git => dot_git}/config | 0 .../{git => dot_git}/description | 0 .../hooks/applypatch-msg.sample | 0 .../{git => dot_git}/hooks/commit-msg.sample | 0 .../hooks/fsmonitor-watchman.sample | 0 .../{git => dot_git}/hooks/post-update.sample | 0 .../hooks/pre-applypatch.sample | 0 .../{git => dot_git}/hooks/pre-commit.sample | 0 .../hooks/pre-merge-commit.sample | 0 .../{git => dot_git}/hooks/pre-push.sample | 0 .../{git => dot_git}/hooks/pre-rebase.sample | 0 .../{git => dot_git}/hooks/pre-receive.sample | 0 .../hooks/prepare-commit-msg.sample | 0 .../hooks/push-to-checkout.sample | 0 .../hooks/sendemail-validate.sample | 0 .../{git => dot_git}/hooks/update.sample | 0 .../conflict_behind/{git => dot_git}/index | Bin .../{git => dot_git}/info/exclude | 0 .../{git => dot_git}/logs/HEAD | 0 .../{git => dot_git}/logs/refs/heads/main | 0 .../logs/refs/remotes/origin/main | 0 .../0c/1e5510ac379303b948e7d58c9f665062bc9114 | 0 .../0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 | Bin .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 | 0 .../92/92d0f6c53027cf9ea31c44b6df4478b769bf8a | Bin .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin .../{git => dot_git}/refs/heads/main | 0 .../{git => dot_git}/refs/remotes/origin/main | 0 .../{git => dot_git}/COMMIT_EDITMSG | 0 .../{git => dot_git}/FETCH_HEAD | 0 .../conflict_diverged/{git => dot_git}/HEAD | 0 .../{git => dot_git}/ORIG_HEAD | 0 .../conflict_diverged/{git => dot_git}/config | 0 .../{git => dot_git}/description | 0 .../hooks/applypatch-msg.sample | 0 .../{git => dot_git}/hooks/commit-msg.sample | 0 .../hooks/fsmonitor-watchman.sample | 0 .../{git => dot_git}/hooks/post-update.sample | 0 .../hooks/pre-applypatch.sample | 0 .../{git => dot_git}/hooks/pre-commit.sample | 0 .../hooks/pre-merge-commit.sample | 0 .../{git => dot_git}/hooks/pre-push.sample | 0 .../{git => dot_git}/hooks/pre-rebase.sample | 0 .../{git => dot_git}/hooks/pre-receive.sample | 0 .../hooks/prepare-commit-msg.sample | 0 .../hooks/push-to-checkout.sample | 0 .../hooks/sendemail-validate.sample | 0 .../{git => dot_git}/hooks/update.sample | 0 .../conflict_diverged/{git => dot_git}/index | Bin .../{git => dot_git}/info/exclude | 0 .../{git => dot_git}/logs/HEAD | 0 .../{git => dot_git}/logs/refs/heads/main | 0 .../logs/refs/remotes/origin/main | 0 .../0c/1e5510ac379303b948e7d58c9f665062bc9114 | 0 .../0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 | Bin .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../5c/13a5b8d07eb0227fb82a598f56d956a452442d | 0 .../8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 | 0 .../92/92d0f6c53027cf9ea31c44b6df4478b769bf8a | Bin .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../ac/2180ee7624501134ba79245f7359d52c966277 | Bin .../ba/d1c77fc7b325ce66b3b5fa8b4ac393d50c98c5 | Bin .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin .../{git => dot_git}/refs/heads/main | 0 .../{git => dot_git}/refs/remotes/origin/main | 0 .../dirty/{git => dot_git}/COMMIT_EDITMSG | 0 testdata/dirty/{git => dot_git}/FETCH_HEAD | 0 testdata/dirty/{git => dot_git}/HEAD | 0 testdata/dirty/{git => dot_git}/config | 0 testdata/dirty/{git => dot_git}/description | 0 .../hooks/applypatch-msg.sample | 0 .../{git => dot_git}/hooks/commit-msg.sample | 0 .../hooks/fsmonitor-watchman.sample | 0 .../{git => dot_git}/hooks/post-update.sample | 0 .../hooks/pre-applypatch.sample | 0 .../{git => dot_git}/hooks/pre-commit.sample | 0 .../hooks/pre-merge-commit.sample | 0 .../{git => dot_git}/hooks/pre-push.sample | 0 .../{git => dot_git}/hooks/pre-rebase.sample | 0 .../{git => dot_git}/hooks/pre-receive.sample | 0 .../hooks/prepare-commit-msg.sample | 0 .../hooks/push-to-checkout.sample | 0 .../hooks/sendemail-validate.sample | 0 .../{git => dot_git}/hooks/update.sample | 0 testdata/dirty/{git => dot_git}/index | Bin testdata/dirty/{git => dot_git}/info/exclude | 0 testdata/dirty/{git => dot_git}/logs/HEAD | 0 .../{git => dot_git}/logs/refs/heads/main | 0 .../logs/refs/remotes/origin/main | 0 .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin .../dirty/{git => dot_git}/refs/heads/main | 0 .../{git => dot_git}/refs/remotes/origin/main | 0 testdata/no_upstream/{git => dot_git}/HEAD | 0 testdata/no_upstream/{git => dot_git}/config | 0 .../no_upstream/{git => dot_git}/description | 0 .../hooks/applypatch-msg.sample | 0 .../{git => dot_git}/hooks/commit-msg.sample | 0 .../hooks/fsmonitor-watchman.sample | 0 .../{git => dot_git}/hooks/post-update.sample | 0 .../hooks/pre-applypatch.sample | 0 .../{git => dot_git}/hooks/pre-commit.sample | 0 .../hooks/pre-merge-commit.sample | 0 .../{git => dot_git}/hooks/pre-push.sample | 0 .../{git => dot_git}/hooks/pre-rebase.sample | 0 .../{git => dot_git}/hooks/pre-receive.sample | 0 .../hooks/prepare-commit-msg.sample | 0 .../hooks/push-to-checkout.sample | 0 .../hooks/sendemail-validate.sample | 0 .../{git => dot_git}/hooks/update.sample | 0 .../no_upstream/{git => dot_git}/info/exclude | 0 .../{git => dot_git}/COMMIT_EDITMSG | 0 .../{git => dot_git}/FETCH_HEAD | 0 .../no_upstream_remote/{git => dot_git}/HEAD | 0 .../{git => dot_git}/config | 0 .../{git => dot_git}/description | 0 .../hooks/applypatch-msg.sample | 0 .../{git => dot_git}/hooks/commit-msg.sample | 0 .../hooks/fsmonitor-watchman.sample | 0 .../{git => dot_git}/hooks/post-update.sample | 0 .../hooks/pre-applypatch.sample | 0 .../{git => dot_git}/hooks/pre-commit.sample | 0 .../hooks/pre-merge-commit.sample | 0 .../{git => dot_git}/hooks/pre-push.sample | 0 .../{git => dot_git}/hooks/pre-rebase.sample | 0 .../{git => dot_git}/hooks/pre-receive.sample | 0 .../hooks/prepare-commit-msg.sample | 0 .../hooks/push-to-checkout.sample | 0 .../hooks/sendemail-validate.sample | 0 .../{git => dot_git}/hooks/update.sample | 0 .../no_upstream_remote/{git => dot_git}/index | Bin .../{git => dot_git}/info/exclude | 0 .../{git => dot_git}/logs/HEAD | 0 .../{git => dot_git}/logs/refs/heads/main | 0 .../logs/refs/remotes/origin/main | 0 .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin .../{git => dot_git}/refs/heads/main | 0 .../{git => dot_git}/refs/remotes/origin/main | 0 testdata/rebase_i/README.md | 3 + testdata/rebase_i/dot_git/COMMIT_EDITMSG | 21 +++ .../{tag/git => rebase_i/dot_git}/FETCH_HEAD | 0 testdata/rebase_i/dot_git/HEAD | 1 + testdata/rebase_i/dot_git/ORIG_HEAD | 1 + testdata/rebase_i/dot_git/REBASE_HEAD | 1 + testdata/{tag/git => rebase_i/dot_git}/config | 0 .../{tag/git => rebase_i/dot_git}/description | 0 .../dot_git}/hooks/applypatch-msg.sample | 0 .../dot_git}/hooks/commit-msg.sample | 0 .../dot_git}/hooks/fsmonitor-watchman.sample | 0 .../dot_git}/hooks/post-update.sample | 0 .../dot_git}/hooks/pre-applypatch.sample | 0 .../dot_git}/hooks/pre-commit.sample | 0 .../dot_git}/hooks/pre-merge-commit.sample | 0 .../dot_git}/hooks/pre-push.sample | 0 .../dot_git}/hooks/pre-rebase.sample | 0 .../dot_git}/hooks/pre-receive.sample | 0 .../dot_git}/hooks/prepare-commit-msg.sample | 0 .../dot_git}/hooks/push-to-checkout.sample | 0 .../dot_git}/hooks/sendemail-validate.sample | 0 .../dot_git}/hooks/update.sample | 0 testdata/rebase_i/dot_git/index | Bin 0 -> 137 bytes .../git => rebase_i/dot_git}/info/exclude | 0 testdata/rebase_i/dot_git/logs/HEAD | 4 + .../rebase_i/dot_git/logs/refs/heads/main | 2 + .../dot_git}/logs/refs/remotes/origin/main | 0 .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 | Bin 0 -> 43 bytes .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 | 2 + .../c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f | Bin 0 -> 54 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin testdata/rebase_i/dot_git/rebase-merge/amend | 1 + .../dot_git/rebase-merge/author-script | 3 + testdata/rebase_i/dot_git/rebase-merge/done | 1 + testdata/rebase_i/dot_git/rebase-merge/end | 1 + .../dot_git/rebase-merge/git-rebase-todo} | 0 .../rebase-merge/git-rebase-todo.backup | 32 ++++ .../rebase_i/dot_git/rebase-merge/head-name | 1 + .../rebase_i/dot_git/rebase-merge/interactive | 0 .../rebase_i/dot_git/rebase-merge/message | 2 + testdata/rebase_i/dot_git/rebase-merge/msgnum | 1 + .../rebase-merge/no-reschedule-failed-exec | 0 .../dot_git/rebase-merge/onto} | 0 .../rebase_i/dot_git/rebase-merge/orig-head | 1 + testdata/rebase_i/dot_git/rebase-merge/patch | 8 + .../rebase_i/dot_git/rebase-merge/stopped-sha | 1 + testdata/rebase_i/dot_git/refs/heads/main | 1 + .../dot_git/refs/remotes/origin}/main | 0 testdata/tag/{git => dot_git}/COMMIT_EDITMSG | 0 testdata/tag/dot_git/FETCH_HEAD | 0 .../refs/remotes/origin/main => dot_git/HEAD} | 0 .../{untracked/git => tag/dot_git}/config | 0 .../git => tag/dot_git}/description | 0 .../dot_git}/hooks/applypatch-msg.sample | 0 .../dot_git}/hooks/commit-msg.sample | 0 .../dot_git}/hooks/fsmonitor-watchman.sample | 0 .../dot_git}/hooks/post-update.sample | 0 .../dot_git}/hooks/pre-applypatch.sample | 0 .../dot_git}/hooks/pre-commit.sample | 0 .../dot_git}/hooks/pre-merge-commit.sample | 0 .../git => tag/dot_git}/hooks/pre-push.sample | 0 .../dot_git}/hooks/pre-rebase.sample | 0 .../dot_git}/hooks/pre-receive.sample | 0 .../dot_git}/hooks/prepare-commit-msg.sample | 0 .../dot_git}/hooks/push-to-checkout.sample | 0 .../dot_git}/hooks/sendemail-validate.sample | 0 .../git => tag/dot_git}/hooks/update.sample | 0 testdata/tag/{git => dot_git}/index | Bin .../git => tag/dot_git}/info/exclude | 0 testdata/tag/{git => dot_git}/logs/HEAD | 0 .../tag/{git => dot_git}/logs/refs/heads/main | 0 .../dot_git}/logs/refs/remotes/origin/main | 0 .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 0 .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin .../git => tag/dot_git}/refs/heads/main | 0 .../dot_git}/refs/remotes/origin/main | 0 .../untracked/{git => dot_git}/COMMIT_EDITMSG | 0 testdata/untracked/dot_git/FETCH_HEAD | 0 testdata/untracked/{git => dot_git}/HEAD | 0 testdata/untracked/dot_git/config | 13 ++ testdata/untracked/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 ++ .../untracked/dot_git/hooks/commit-msg.sample | 24 +++ .../dot_git/hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 ++ .../untracked/dot_git/hooks/pre-commit.sample | 49 +++++ .../dot_git/hooks/pre-merge-commit.sample | 13 ++ .../untracked/dot_git/hooks/pre-push.sample | 53 ++++++ .../untracked/dot_git/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../dot_git/hooks/pre-receive.sample | 24 +++ .../dot_git/hooks/prepare-commit-msg.sample | 42 +++++ .../dot_git/hooks/push-to-checkout.sample | 78 ++++++++ .../dot_git/hooks/sendemail-validate.sample | 77 ++++++++ .../untracked/dot_git/hooks/update.sample | 128 +++++++++++++ testdata/untracked/{git => dot_git}/index | Bin testdata/untracked/dot_git/info/exclude | 6 + testdata/untracked/{git => dot_git}/logs/HEAD | 0 .../{git => dot_git}/logs/refs/heads/main | 0 .../dot_git/logs/refs/remotes/origin/main | 1 + .../24/afc9585ad36ab4a5bcfce5fe08131e72904a5e | 1 + .../a8/cdb9100441b47e4afc480f32bdc28777511316 | Bin 0 -> 28 bytes .../d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f | Bin 0 -> 54 bytes testdata/untracked/dot_git/refs/heads/main | 1 + .../dot_git/refs/remotes/origin/main | 1 + 354 files changed, 985 insertions(+), 2 deletions(-) create mode 100644 .fdignore create mode 100644 .rgignore rename testdata/clean/{git => dot_git}/COMMIT_EDITMSG (100%) rename testdata/clean/{git => dot_git}/FETCH_HEAD (100%) rename testdata/clean/{git => dot_git}/HEAD (100%) rename testdata/clean/{git => dot_git}/config (100%) rename testdata/clean/{git => dot_git}/description (100%) rename testdata/clean/{git => dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/clean/{git => dot_git}/hooks/commit-msg.sample (100%) rename testdata/clean/{git => dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/clean/{git => dot_git}/hooks/post-update.sample (100%) rename testdata/clean/{git => dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/clean/{git => dot_git}/hooks/pre-commit.sample (100%) rename testdata/clean/{git => dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/clean/{git => dot_git}/hooks/pre-push.sample (100%) rename testdata/clean/{git => dot_git}/hooks/pre-rebase.sample (100%) rename testdata/clean/{git => dot_git}/hooks/pre-receive.sample (100%) rename testdata/clean/{git => dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/clean/{git => dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/clean/{git => dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/clean/{git => dot_git}/hooks/update.sample (100%) rename testdata/clean/{git => dot_git}/index (100%) rename testdata/clean/{git => dot_git}/info/exclude (100%) rename testdata/clean/{git => dot_git}/logs/HEAD (100%) rename testdata/clean/{git => dot_git}/logs/refs/heads/main (100%) rename testdata/clean/{git => dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/clean/{git => dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) rename testdata/clean/{git => dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) rename testdata/clean/{git => dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) rename testdata/clean/{git => dot_git}/refs/heads/main (100%) rename testdata/clean/{git => dot_git}/refs/remotes/origin/main (100%) rename testdata/commit/{git => dot_git}/COMMIT_EDITMSG (100%) rename testdata/commit/{git => dot_git}/FETCH_HEAD (100%) rename testdata/commit/{git => dot_git}/HEAD (100%) rename testdata/commit/{git => dot_git}/ORIG_HEAD (100%) rename testdata/commit/{git => dot_git}/config (100%) rename testdata/commit/{git => dot_git}/description (100%) rename testdata/commit/{git => dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/commit/{git => dot_git}/hooks/commit-msg.sample (100%) rename testdata/commit/{git => dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/commit/{git => dot_git}/hooks/post-update.sample (100%) rename testdata/commit/{git => dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/commit/{git => dot_git}/hooks/pre-commit.sample (100%) rename testdata/commit/{git => dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/commit/{git => dot_git}/hooks/pre-push.sample (100%) rename testdata/commit/{git => dot_git}/hooks/pre-rebase.sample (100%) rename testdata/commit/{git => dot_git}/hooks/pre-receive.sample (100%) rename testdata/commit/{git => dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/commit/{git => dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/commit/{git => dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/commit/{git => dot_git}/hooks/update.sample (100%) rename testdata/commit/{git => dot_git}/index (100%) rename testdata/commit/{git => dot_git}/info/exclude (100%) rename testdata/commit/{git => dot_git}/logs/HEAD (100%) rename testdata/commit/{git => dot_git}/logs/refs/heads/main (100%) rename testdata/commit/{git => dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/commit/{git => dot_git}/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 (100%) rename testdata/commit/{git => dot_git}/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 (100%) rename testdata/commit/{git => dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) rename testdata/commit/{git => dot_git}/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 (100%) rename testdata/commit/{git => dot_git}/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a (100%) rename testdata/commit/{git => dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) rename testdata/commit/{git => dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) rename testdata/commit/{git => dot_git}/refs/heads/main (100%) rename testdata/commit/{git => dot_git}/refs/remotes/origin/main (100%) rename testdata/conflict_ahead/{git => dot_git}/COMMIT_EDITMSG (100%) rename testdata/conflict_ahead/{git => dot_git}/FETCH_HEAD (100%) rename testdata/conflict_ahead/{git => dot_git}/HEAD (100%) rename testdata/conflict_ahead/{git => dot_git}/config (100%) rename testdata/conflict_ahead/{git => dot_git}/description (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/commit-msg.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/post-update.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/pre-commit.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/pre-push.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/pre-rebase.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/pre-receive.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/hooks/update.sample (100%) rename testdata/conflict_ahead/{git => dot_git}/index (100%) rename testdata/conflict_ahead/{git => dot_git}/info/exclude (100%) rename testdata/conflict_ahead/{git => dot_git}/logs/HEAD (100%) rename testdata/conflict_ahead/{git => dot_git}/logs/refs/heads/main (100%) rename testdata/conflict_ahead/{git => dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/conflict_ahead/{git => dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) rename testdata/conflict_ahead/{git => dot_git}/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 (100%) rename testdata/conflict_ahead/{git => dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) rename testdata/conflict_ahead/{git => dot_git}/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 (100%) rename testdata/conflict_ahead/{git => dot_git}/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f (100%) rename testdata/conflict_ahead/{git => dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) rename testdata/conflict_ahead/{git => dot_git}/refs/heads/main (100%) rename testdata/conflict_ahead/{git => dot_git}/refs/remotes/origin/main (100%) rename testdata/conflict_behind/{git => dot_git}/COMMIT_EDITMSG (100%) rename testdata/conflict_behind/{git => dot_git}/FETCH_HEAD (100%) rename testdata/conflict_behind/{git => dot_git}/HEAD (100%) rename testdata/conflict_behind/{git => dot_git}/ORIG_HEAD (100%) rename testdata/conflict_behind/{git => dot_git}/config (100%) rename testdata/conflict_behind/{git => dot_git}/description (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/commit-msg.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/post-update.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/pre-commit.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/pre-push.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/pre-rebase.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/pre-receive.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/conflict_behind/{git => dot_git}/hooks/update.sample (100%) rename testdata/conflict_behind/{git => dot_git}/index (100%) rename testdata/conflict_behind/{git => dot_git}/info/exclude (100%) rename testdata/conflict_behind/{git => dot_git}/logs/HEAD (100%) rename testdata/conflict_behind/{git => dot_git}/logs/refs/heads/main (100%) rename testdata/conflict_behind/{git => dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/conflict_behind/{git => dot_git}/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 (100%) rename testdata/conflict_behind/{git => dot_git}/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 (100%) rename testdata/conflict_behind/{git => dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) rename testdata/conflict_behind/{git => dot_git}/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 (100%) rename testdata/conflict_behind/{git => dot_git}/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a (100%) rename testdata/conflict_behind/{git => dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) rename testdata/conflict_behind/{git => dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) rename testdata/conflict_behind/{git => dot_git}/refs/heads/main (100%) rename testdata/conflict_behind/{git => dot_git}/refs/remotes/origin/main (100%) rename testdata/conflict_diverged/{git => dot_git}/COMMIT_EDITMSG (100%) rename testdata/conflict_diverged/{git => dot_git}/FETCH_HEAD (100%) rename testdata/conflict_diverged/{git => dot_git}/HEAD (100%) rename testdata/conflict_diverged/{git => dot_git}/ORIG_HEAD (100%) rename testdata/conflict_diverged/{git => dot_git}/config (100%) rename testdata/conflict_diverged/{git => dot_git}/description (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/commit-msg.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/post-update.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/pre-commit.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/pre-push.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/pre-rebase.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/pre-receive.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/hooks/update.sample (100%) rename testdata/conflict_diverged/{git => dot_git}/index (100%) rename testdata/conflict_diverged/{git => dot_git}/info/exclude (100%) rename testdata/conflict_diverged/{git => dot_git}/logs/HEAD (100%) rename testdata/conflict_diverged/{git => dot_git}/logs/refs/heads/main (100%) rename testdata/conflict_diverged/{git => dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/ac/2180ee7624501134ba79245f7359d52c966277 (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/ba/d1c77fc7b325ce66b3b5fa8b4ac393d50c98c5 (100%) rename testdata/conflict_diverged/{git => dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) rename testdata/conflict_diverged/{git => dot_git}/refs/heads/main (100%) rename testdata/conflict_diverged/{git => dot_git}/refs/remotes/origin/main (100%) rename testdata/dirty/{git => dot_git}/COMMIT_EDITMSG (100%) rename testdata/dirty/{git => dot_git}/FETCH_HEAD (100%) rename testdata/dirty/{git => dot_git}/HEAD (100%) rename testdata/dirty/{git => dot_git}/config (100%) rename testdata/dirty/{git => dot_git}/description (100%) rename testdata/dirty/{git => dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/commit-msg.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/post-update.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/pre-commit.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/pre-push.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/pre-rebase.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/pre-receive.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/dirty/{git => dot_git}/hooks/update.sample (100%) rename testdata/dirty/{git => dot_git}/index (100%) rename testdata/dirty/{git => dot_git}/info/exclude (100%) rename testdata/dirty/{git => dot_git}/logs/HEAD (100%) rename testdata/dirty/{git => dot_git}/logs/refs/heads/main (100%) rename testdata/dirty/{git => dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/dirty/{git => dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) rename testdata/dirty/{git => dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) rename testdata/dirty/{git => dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) rename testdata/dirty/{git => dot_git}/refs/heads/main (100%) rename testdata/dirty/{git => dot_git}/refs/remotes/origin/main (100%) rename testdata/no_upstream/{git => dot_git}/HEAD (100%) rename testdata/no_upstream/{git => dot_git}/config (100%) rename testdata/no_upstream/{git => dot_git}/description (100%) rename testdata/no_upstream/{git => dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/commit-msg.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/post-update.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/pre-commit.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/pre-push.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/pre-rebase.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/pre-receive.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/no_upstream/{git => dot_git}/hooks/update.sample (100%) rename testdata/no_upstream/{git => dot_git}/info/exclude (100%) rename testdata/no_upstream_remote/{git => dot_git}/COMMIT_EDITMSG (100%) rename testdata/no_upstream_remote/{git => dot_git}/FETCH_HEAD (100%) rename testdata/no_upstream_remote/{git => dot_git}/HEAD (100%) rename testdata/no_upstream_remote/{git => dot_git}/config (100%) rename testdata/no_upstream_remote/{git => dot_git}/description (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/commit-msg.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/post-update.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/pre-commit.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/pre-push.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/pre-rebase.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/pre-receive.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/hooks/update.sample (100%) rename testdata/no_upstream_remote/{git => dot_git}/index (100%) rename testdata/no_upstream_remote/{git => dot_git}/info/exclude (100%) rename testdata/no_upstream_remote/{git => dot_git}/logs/HEAD (100%) rename testdata/no_upstream_remote/{git => dot_git}/logs/refs/heads/main (100%) rename testdata/no_upstream_remote/{git => dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/no_upstream_remote/{git => dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) rename testdata/no_upstream_remote/{git => dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) rename testdata/no_upstream_remote/{git => dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) rename testdata/no_upstream_remote/{git => dot_git}/refs/heads/main (100%) rename testdata/no_upstream_remote/{git => dot_git}/refs/remotes/origin/main (100%) create mode 100644 testdata/rebase_i/README.md create mode 100644 testdata/rebase_i/dot_git/COMMIT_EDITMSG rename testdata/{tag/git => rebase_i/dot_git}/FETCH_HEAD (100%) create mode 100644 testdata/rebase_i/dot_git/HEAD create mode 100644 testdata/rebase_i/dot_git/ORIG_HEAD create mode 100644 testdata/rebase_i/dot_git/REBASE_HEAD rename testdata/{tag/git => rebase_i/dot_git}/config (100%) rename testdata/{tag/git => rebase_i/dot_git}/description (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/commit-msg.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/post-update.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/pre-commit.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/pre-push.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/pre-rebase.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/pre-receive.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/{tag/git => rebase_i/dot_git}/hooks/update.sample (100%) create mode 100644 testdata/rebase_i/dot_git/index rename testdata/{tag/git => rebase_i/dot_git}/info/exclude (100%) create mode 100644 testdata/rebase_i/dot_git/logs/HEAD create mode 100644 testdata/rebase_i/dot_git/logs/refs/heads/main rename testdata/{tag/git => rebase_i/dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/{tag/git => rebase_i/dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) create mode 100644 testdata/rebase_i/dot_git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 rename testdata/{tag/git => rebase_i/dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) create mode 100644 testdata/rebase_i/dot_git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 create mode 100644 testdata/rebase_i/dot_git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f rename testdata/{tag/git => rebase_i/dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) create mode 100644 testdata/rebase_i/dot_git/rebase-merge/amend create mode 100644 testdata/rebase_i/dot_git/rebase-merge/author-script create mode 100644 testdata/rebase_i/dot_git/rebase-merge/done create mode 100644 testdata/rebase_i/dot_git/rebase-merge/end rename testdata/{untracked/git/FETCH_HEAD => rebase_i/dot_git/rebase-merge/git-rebase-todo} (100%) create mode 100644 testdata/rebase_i/dot_git/rebase-merge/git-rebase-todo.backup create mode 100644 testdata/rebase_i/dot_git/rebase-merge/head-name create mode 100644 testdata/rebase_i/dot_git/rebase-merge/interactive create mode 100644 testdata/rebase_i/dot_git/rebase-merge/message create mode 100644 testdata/rebase_i/dot_git/rebase-merge/msgnum create mode 100644 testdata/rebase_i/dot_git/rebase-merge/no-reschedule-failed-exec rename testdata/{tag/git/HEAD => rebase_i/dot_git/rebase-merge/onto} (100%) create mode 100644 testdata/rebase_i/dot_git/rebase-merge/orig-head create mode 100644 testdata/rebase_i/dot_git/rebase-merge/patch create mode 100644 testdata/rebase_i/dot_git/rebase-merge/stopped-sha create mode 100644 testdata/rebase_i/dot_git/refs/heads/main rename testdata/{tag/git/refs/heads => rebase_i/dot_git/refs/remotes/origin}/main (100%) rename testdata/tag/{git => dot_git}/COMMIT_EDITMSG (100%) create mode 100644 testdata/tag/dot_git/FETCH_HEAD rename testdata/tag/{git/refs/remotes/origin/main => dot_git/HEAD} (100%) rename testdata/{untracked/git => tag/dot_git}/config (100%) rename testdata/{untracked/git => tag/dot_git}/description (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/applypatch-msg.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/commit-msg.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/fsmonitor-watchman.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/post-update.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/pre-applypatch.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/pre-commit.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/pre-merge-commit.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/pre-push.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/pre-rebase.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/pre-receive.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/prepare-commit-msg.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/push-to-checkout.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/sendemail-validate.sample (100%) rename testdata/{untracked/git => tag/dot_git}/hooks/update.sample (100%) rename testdata/tag/{git => dot_git}/index (100%) rename testdata/{untracked/git => tag/dot_git}/info/exclude (100%) rename testdata/tag/{git => dot_git}/logs/HEAD (100%) rename testdata/tag/{git => dot_git}/logs/refs/heads/main (100%) rename testdata/{untracked/git => tag/dot_git}/logs/refs/remotes/origin/main (100%) rename testdata/{untracked/git => tag/dot_git}/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e (100%) rename testdata/{untracked/git => tag/dot_git}/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 (100%) rename testdata/{untracked/git => tag/dot_git}/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f (100%) rename testdata/{untracked/git => tag/dot_git}/refs/heads/main (100%) rename testdata/{untracked/git => tag/dot_git}/refs/remotes/origin/main (100%) rename testdata/untracked/{git => dot_git}/COMMIT_EDITMSG (100%) create mode 100644 testdata/untracked/dot_git/FETCH_HEAD rename testdata/untracked/{git => dot_git}/HEAD (100%) create mode 100644 testdata/untracked/dot_git/config create mode 100644 testdata/untracked/dot_git/description create mode 100755 testdata/untracked/dot_git/hooks/applypatch-msg.sample create mode 100755 testdata/untracked/dot_git/hooks/commit-msg.sample create mode 100755 testdata/untracked/dot_git/hooks/fsmonitor-watchman.sample create mode 100755 testdata/untracked/dot_git/hooks/post-update.sample create mode 100755 testdata/untracked/dot_git/hooks/pre-applypatch.sample create mode 100755 testdata/untracked/dot_git/hooks/pre-commit.sample create mode 100755 testdata/untracked/dot_git/hooks/pre-merge-commit.sample create mode 100755 testdata/untracked/dot_git/hooks/pre-push.sample create mode 100755 testdata/untracked/dot_git/hooks/pre-rebase.sample create mode 100755 testdata/untracked/dot_git/hooks/pre-receive.sample create mode 100755 testdata/untracked/dot_git/hooks/prepare-commit-msg.sample create mode 100755 testdata/untracked/dot_git/hooks/push-to-checkout.sample create mode 100755 testdata/untracked/dot_git/hooks/sendemail-validate.sample create mode 100755 testdata/untracked/dot_git/hooks/update.sample rename testdata/untracked/{git => dot_git}/index (100%) create mode 100644 testdata/untracked/dot_git/info/exclude rename testdata/untracked/{git => dot_git}/logs/HEAD (100%) rename testdata/untracked/{git => dot_git}/logs/refs/heads/main (100%) create mode 100644 testdata/untracked/dot_git/logs/refs/remotes/origin/main create mode 100644 testdata/untracked/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e create mode 100644 testdata/untracked/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 create mode 100644 testdata/untracked/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f create mode 100644 testdata/untracked/dot_git/refs/heads/main create mode 100644 testdata/untracked/dot_git/refs/remotes/origin/main diff --git a/.fdignore b/.fdignore new file mode 100644 index 0000000..d383c56 --- /dev/null +++ b/.fdignore @@ -0,0 +1 @@ +testdata diff --git a/.rgignore b/.rgignore new file mode 100644 index 0000000..d383c56 --- /dev/null +++ b/.rgignore @@ -0,0 +1 @@ +testdata diff --git a/integration/bgps_test.go b/integration/bgps_test.go index 2f7aac3..028c51f 100644 --- a/integration/bgps_test.go +++ b/integration/bgps_test.go @@ -27,6 +27,7 @@ func TestBGPS(t *testing.T) { {"untracked", []string{"--config=NONE"}, "\x1b[35m \ue0a0 main *\x1b[0m", nil}, // TODO: add tests for different merge statuses (rebase, merge, merge|conflict, am, etc) + {"rebase_i", []string{"--config=NONE"}, "\x1b[34m \ue0a0 main|REBASE-i 1/1\x1b[0m", nil}, {"clean", []string{"--config=NONE", "--color-enabled=false"}, " \ue0a0 main", nil}, {"clean", []string{"--config=NONE", "--color-enabled=false", "--prompt-prefix= start "}, " start main", nil}, diff --git a/integration/init_test.go b/integration/init_test.go index b5fb720..8fc2ca5 100644 --- a/integration/init_test.go +++ b/integration/init_test.go @@ -47,8 +47,8 @@ func TestMain(m *testing.M) { panic(fmt.Sprintf("failed to read test data file: %s", err)) } for _, test_dir_file := range test_dir_files { - if test_dir_file.Name() == "git" { - err = os.Rename(filepath.Join(test_dir_path, "git"), filepath.Join(test_dir_path, ".git")) + if test_dir_file.Name() == "dot_git" { + err = os.Rename(filepath.Join(test_dir_path, "dot_git"), filepath.Join(test_dir_path, ".git")) if err != nil { panic(fmt.Sprintf("failed to rename test data git dir: %s", err)) } diff --git a/testdata/clean/git/COMMIT_EDITMSG b/testdata/clean/dot_git/COMMIT_EDITMSG similarity index 100% rename from testdata/clean/git/COMMIT_EDITMSG rename to testdata/clean/dot_git/COMMIT_EDITMSG diff --git a/testdata/clean/git/FETCH_HEAD b/testdata/clean/dot_git/FETCH_HEAD similarity index 100% rename from testdata/clean/git/FETCH_HEAD rename to testdata/clean/dot_git/FETCH_HEAD diff --git a/testdata/clean/git/HEAD b/testdata/clean/dot_git/HEAD similarity index 100% rename from testdata/clean/git/HEAD rename to testdata/clean/dot_git/HEAD diff --git a/testdata/clean/git/config b/testdata/clean/dot_git/config similarity index 100% rename from testdata/clean/git/config rename to testdata/clean/dot_git/config diff --git a/testdata/clean/git/description b/testdata/clean/dot_git/description similarity index 100% rename from testdata/clean/git/description rename to testdata/clean/dot_git/description diff --git a/testdata/clean/git/hooks/applypatch-msg.sample b/testdata/clean/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/clean/git/hooks/applypatch-msg.sample rename to testdata/clean/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/clean/git/hooks/commit-msg.sample b/testdata/clean/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/clean/git/hooks/commit-msg.sample rename to testdata/clean/dot_git/hooks/commit-msg.sample diff --git a/testdata/clean/git/hooks/fsmonitor-watchman.sample b/testdata/clean/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/clean/git/hooks/fsmonitor-watchman.sample rename to testdata/clean/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/clean/git/hooks/post-update.sample b/testdata/clean/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/clean/git/hooks/post-update.sample rename to testdata/clean/dot_git/hooks/post-update.sample diff --git a/testdata/clean/git/hooks/pre-applypatch.sample b/testdata/clean/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/clean/git/hooks/pre-applypatch.sample rename to testdata/clean/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/clean/git/hooks/pre-commit.sample b/testdata/clean/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/clean/git/hooks/pre-commit.sample rename to testdata/clean/dot_git/hooks/pre-commit.sample diff --git a/testdata/clean/git/hooks/pre-merge-commit.sample b/testdata/clean/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/clean/git/hooks/pre-merge-commit.sample rename to testdata/clean/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/clean/git/hooks/pre-push.sample b/testdata/clean/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/clean/git/hooks/pre-push.sample rename to testdata/clean/dot_git/hooks/pre-push.sample diff --git a/testdata/clean/git/hooks/pre-rebase.sample b/testdata/clean/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/clean/git/hooks/pre-rebase.sample rename to testdata/clean/dot_git/hooks/pre-rebase.sample diff --git a/testdata/clean/git/hooks/pre-receive.sample b/testdata/clean/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/clean/git/hooks/pre-receive.sample rename to testdata/clean/dot_git/hooks/pre-receive.sample diff --git a/testdata/clean/git/hooks/prepare-commit-msg.sample b/testdata/clean/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/clean/git/hooks/prepare-commit-msg.sample rename to testdata/clean/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/clean/git/hooks/push-to-checkout.sample b/testdata/clean/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/clean/git/hooks/push-to-checkout.sample rename to testdata/clean/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/clean/git/hooks/sendemail-validate.sample b/testdata/clean/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/clean/git/hooks/sendemail-validate.sample rename to testdata/clean/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/clean/git/hooks/update.sample b/testdata/clean/dot_git/hooks/update.sample similarity index 100% rename from testdata/clean/git/hooks/update.sample rename to testdata/clean/dot_git/hooks/update.sample diff --git a/testdata/clean/git/index b/testdata/clean/dot_git/index similarity index 100% rename from testdata/clean/git/index rename to testdata/clean/dot_git/index diff --git a/testdata/clean/git/info/exclude b/testdata/clean/dot_git/info/exclude similarity index 100% rename from testdata/clean/git/info/exclude rename to testdata/clean/dot_git/info/exclude diff --git a/testdata/clean/git/logs/HEAD b/testdata/clean/dot_git/logs/HEAD similarity index 100% rename from testdata/clean/git/logs/HEAD rename to testdata/clean/dot_git/logs/HEAD diff --git a/testdata/clean/git/logs/refs/heads/main b/testdata/clean/dot_git/logs/refs/heads/main similarity index 100% rename from testdata/clean/git/logs/refs/heads/main rename to testdata/clean/dot_git/logs/refs/heads/main diff --git a/testdata/clean/git/logs/refs/remotes/origin/main b/testdata/clean/dot_git/logs/refs/remotes/origin/main similarity index 100% rename from testdata/clean/git/logs/refs/remotes/origin/main rename to testdata/clean/dot_git/logs/refs/remotes/origin/main diff --git a/testdata/clean/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/clean/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e similarity index 100% rename from testdata/clean/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e rename to testdata/clean/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/clean/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/clean/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 similarity index 100% rename from testdata/clean/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 rename to testdata/clean/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 diff --git a/testdata/clean/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f b/testdata/clean/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f similarity index 100% rename from testdata/clean/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f rename to testdata/clean/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f diff --git a/testdata/clean/git/refs/heads/main b/testdata/clean/dot_git/refs/heads/main similarity index 100% rename from testdata/clean/git/refs/heads/main rename to testdata/clean/dot_git/refs/heads/main diff --git a/testdata/clean/git/refs/remotes/origin/main b/testdata/clean/dot_git/refs/remotes/origin/main similarity index 100% rename from testdata/clean/git/refs/remotes/origin/main rename to testdata/clean/dot_git/refs/remotes/origin/main diff --git a/testdata/commit/git/COMMIT_EDITMSG b/testdata/commit/dot_git/COMMIT_EDITMSG similarity index 100% rename from testdata/commit/git/COMMIT_EDITMSG rename to testdata/commit/dot_git/COMMIT_EDITMSG diff --git a/testdata/commit/git/FETCH_HEAD b/testdata/commit/dot_git/FETCH_HEAD similarity index 100% rename from testdata/commit/git/FETCH_HEAD rename to testdata/commit/dot_git/FETCH_HEAD diff --git a/testdata/commit/git/HEAD b/testdata/commit/dot_git/HEAD similarity index 100% rename from testdata/commit/git/HEAD rename to testdata/commit/dot_git/HEAD diff --git a/testdata/commit/git/ORIG_HEAD b/testdata/commit/dot_git/ORIG_HEAD similarity index 100% rename from testdata/commit/git/ORIG_HEAD rename to testdata/commit/dot_git/ORIG_HEAD diff --git a/testdata/commit/git/config b/testdata/commit/dot_git/config similarity index 100% rename from testdata/commit/git/config rename to testdata/commit/dot_git/config diff --git a/testdata/commit/git/description b/testdata/commit/dot_git/description similarity index 100% rename from testdata/commit/git/description rename to testdata/commit/dot_git/description diff --git a/testdata/commit/git/hooks/applypatch-msg.sample b/testdata/commit/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/commit/git/hooks/applypatch-msg.sample rename to testdata/commit/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/commit/git/hooks/commit-msg.sample b/testdata/commit/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/commit/git/hooks/commit-msg.sample rename to testdata/commit/dot_git/hooks/commit-msg.sample diff --git a/testdata/commit/git/hooks/fsmonitor-watchman.sample b/testdata/commit/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/commit/git/hooks/fsmonitor-watchman.sample rename to testdata/commit/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/commit/git/hooks/post-update.sample b/testdata/commit/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/commit/git/hooks/post-update.sample rename to testdata/commit/dot_git/hooks/post-update.sample diff --git a/testdata/commit/git/hooks/pre-applypatch.sample b/testdata/commit/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/commit/git/hooks/pre-applypatch.sample rename to testdata/commit/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/commit/git/hooks/pre-commit.sample b/testdata/commit/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/commit/git/hooks/pre-commit.sample rename to testdata/commit/dot_git/hooks/pre-commit.sample diff --git a/testdata/commit/git/hooks/pre-merge-commit.sample b/testdata/commit/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/commit/git/hooks/pre-merge-commit.sample rename to testdata/commit/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/commit/git/hooks/pre-push.sample b/testdata/commit/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/commit/git/hooks/pre-push.sample rename to testdata/commit/dot_git/hooks/pre-push.sample diff --git a/testdata/commit/git/hooks/pre-rebase.sample b/testdata/commit/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/commit/git/hooks/pre-rebase.sample rename to testdata/commit/dot_git/hooks/pre-rebase.sample diff --git a/testdata/commit/git/hooks/pre-receive.sample b/testdata/commit/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/commit/git/hooks/pre-receive.sample rename to testdata/commit/dot_git/hooks/pre-receive.sample diff --git a/testdata/commit/git/hooks/prepare-commit-msg.sample b/testdata/commit/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/commit/git/hooks/prepare-commit-msg.sample rename to testdata/commit/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/commit/git/hooks/push-to-checkout.sample b/testdata/commit/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/commit/git/hooks/push-to-checkout.sample rename to testdata/commit/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/commit/git/hooks/sendemail-validate.sample b/testdata/commit/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/commit/git/hooks/sendemail-validate.sample rename to testdata/commit/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/commit/git/hooks/update.sample b/testdata/commit/dot_git/hooks/update.sample similarity index 100% rename from testdata/commit/git/hooks/update.sample rename to testdata/commit/dot_git/hooks/update.sample diff --git a/testdata/commit/git/index b/testdata/commit/dot_git/index similarity index 100% rename from testdata/commit/git/index rename to testdata/commit/dot_git/index diff --git a/testdata/commit/git/info/exclude b/testdata/commit/dot_git/info/exclude similarity index 100% rename from testdata/commit/git/info/exclude rename to testdata/commit/dot_git/info/exclude diff --git a/testdata/commit/git/logs/HEAD b/testdata/commit/dot_git/logs/HEAD similarity index 100% rename from testdata/commit/git/logs/HEAD rename to testdata/commit/dot_git/logs/HEAD diff --git a/testdata/commit/git/logs/refs/heads/main b/testdata/commit/dot_git/logs/refs/heads/main similarity index 100% rename from testdata/commit/git/logs/refs/heads/main rename to testdata/commit/dot_git/logs/refs/heads/main diff --git a/testdata/commit/git/logs/refs/remotes/origin/main b/testdata/commit/dot_git/logs/refs/remotes/origin/main similarity index 100% rename from testdata/commit/git/logs/refs/remotes/origin/main rename to testdata/commit/dot_git/logs/refs/remotes/origin/main diff --git a/testdata/commit/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 b/testdata/commit/dot_git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 similarity index 100% rename from testdata/commit/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 rename to testdata/commit/dot_git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 diff --git a/testdata/commit/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 b/testdata/commit/dot_git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 similarity index 100% rename from testdata/commit/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 rename to testdata/commit/dot_git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 diff --git a/testdata/commit/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/commit/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e similarity index 100% rename from testdata/commit/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e rename to testdata/commit/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/commit/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 b/testdata/commit/dot_git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 similarity index 100% rename from testdata/commit/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 rename to testdata/commit/dot_git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 diff --git a/testdata/commit/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a b/testdata/commit/dot_git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a similarity index 100% rename from testdata/commit/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a rename to testdata/commit/dot_git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a diff --git a/testdata/commit/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/commit/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 similarity index 100% rename from testdata/commit/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 rename to testdata/commit/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 diff --git a/testdata/commit/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f b/testdata/commit/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f similarity index 100% rename from testdata/commit/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f rename to testdata/commit/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f diff --git a/testdata/commit/git/refs/heads/main b/testdata/commit/dot_git/refs/heads/main similarity index 100% rename from testdata/commit/git/refs/heads/main rename to testdata/commit/dot_git/refs/heads/main diff --git a/testdata/commit/git/refs/remotes/origin/main b/testdata/commit/dot_git/refs/remotes/origin/main similarity index 100% rename from testdata/commit/git/refs/remotes/origin/main rename to testdata/commit/dot_git/refs/remotes/origin/main diff --git a/testdata/conflict_ahead/git/COMMIT_EDITMSG b/testdata/conflict_ahead/dot_git/COMMIT_EDITMSG similarity index 100% rename from testdata/conflict_ahead/git/COMMIT_EDITMSG rename to testdata/conflict_ahead/dot_git/COMMIT_EDITMSG diff --git a/testdata/conflict_ahead/git/FETCH_HEAD b/testdata/conflict_ahead/dot_git/FETCH_HEAD similarity index 100% rename from testdata/conflict_ahead/git/FETCH_HEAD rename to testdata/conflict_ahead/dot_git/FETCH_HEAD diff --git a/testdata/conflict_ahead/git/HEAD b/testdata/conflict_ahead/dot_git/HEAD similarity index 100% rename from testdata/conflict_ahead/git/HEAD rename to testdata/conflict_ahead/dot_git/HEAD diff --git a/testdata/conflict_ahead/git/config b/testdata/conflict_ahead/dot_git/config similarity index 100% rename from testdata/conflict_ahead/git/config rename to testdata/conflict_ahead/dot_git/config diff --git a/testdata/conflict_ahead/git/description b/testdata/conflict_ahead/dot_git/description similarity index 100% rename from testdata/conflict_ahead/git/description rename to testdata/conflict_ahead/dot_git/description diff --git a/testdata/conflict_ahead/git/hooks/applypatch-msg.sample b/testdata/conflict_ahead/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/applypatch-msg.sample rename to testdata/conflict_ahead/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/conflict_ahead/git/hooks/commit-msg.sample b/testdata/conflict_ahead/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/commit-msg.sample rename to testdata/conflict_ahead/dot_git/hooks/commit-msg.sample diff --git a/testdata/conflict_ahead/git/hooks/fsmonitor-watchman.sample b/testdata/conflict_ahead/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/fsmonitor-watchman.sample rename to testdata/conflict_ahead/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/conflict_ahead/git/hooks/post-update.sample b/testdata/conflict_ahead/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/post-update.sample rename to testdata/conflict_ahead/dot_git/hooks/post-update.sample diff --git a/testdata/conflict_ahead/git/hooks/pre-applypatch.sample b/testdata/conflict_ahead/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/pre-applypatch.sample rename to testdata/conflict_ahead/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/conflict_ahead/git/hooks/pre-commit.sample b/testdata/conflict_ahead/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/pre-commit.sample rename to testdata/conflict_ahead/dot_git/hooks/pre-commit.sample diff --git a/testdata/conflict_ahead/git/hooks/pre-merge-commit.sample b/testdata/conflict_ahead/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/pre-merge-commit.sample rename to testdata/conflict_ahead/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/conflict_ahead/git/hooks/pre-push.sample b/testdata/conflict_ahead/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/pre-push.sample rename to testdata/conflict_ahead/dot_git/hooks/pre-push.sample diff --git a/testdata/conflict_ahead/git/hooks/pre-rebase.sample b/testdata/conflict_ahead/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/pre-rebase.sample rename to testdata/conflict_ahead/dot_git/hooks/pre-rebase.sample diff --git a/testdata/conflict_ahead/git/hooks/pre-receive.sample b/testdata/conflict_ahead/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/pre-receive.sample rename to testdata/conflict_ahead/dot_git/hooks/pre-receive.sample diff --git a/testdata/conflict_ahead/git/hooks/prepare-commit-msg.sample b/testdata/conflict_ahead/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/prepare-commit-msg.sample rename to testdata/conflict_ahead/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/conflict_ahead/git/hooks/push-to-checkout.sample b/testdata/conflict_ahead/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/push-to-checkout.sample rename to testdata/conflict_ahead/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/conflict_ahead/git/hooks/sendemail-validate.sample b/testdata/conflict_ahead/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/sendemail-validate.sample rename to testdata/conflict_ahead/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/conflict_ahead/git/hooks/update.sample b/testdata/conflict_ahead/dot_git/hooks/update.sample similarity index 100% rename from testdata/conflict_ahead/git/hooks/update.sample rename to testdata/conflict_ahead/dot_git/hooks/update.sample diff --git a/testdata/conflict_ahead/git/index b/testdata/conflict_ahead/dot_git/index similarity index 100% rename from testdata/conflict_ahead/git/index rename to testdata/conflict_ahead/dot_git/index diff --git a/testdata/conflict_ahead/git/info/exclude b/testdata/conflict_ahead/dot_git/info/exclude similarity index 100% rename from testdata/conflict_ahead/git/info/exclude rename to testdata/conflict_ahead/dot_git/info/exclude diff --git a/testdata/conflict_ahead/git/logs/HEAD b/testdata/conflict_ahead/dot_git/logs/HEAD similarity index 100% rename from testdata/conflict_ahead/git/logs/HEAD rename to testdata/conflict_ahead/dot_git/logs/HEAD diff --git a/testdata/conflict_ahead/git/logs/refs/heads/main b/testdata/conflict_ahead/dot_git/logs/refs/heads/main similarity index 100% rename from testdata/conflict_ahead/git/logs/refs/heads/main rename to testdata/conflict_ahead/dot_git/logs/refs/heads/main diff --git a/testdata/conflict_ahead/git/logs/refs/remotes/origin/main b/testdata/conflict_ahead/dot_git/logs/refs/remotes/origin/main similarity index 100% rename from testdata/conflict_ahead/git/logs/refs/remotes/origin/main rename to testdata/conflict_ahead/dot_git/logs/refs/remotes/origin/main diff --git a/testdata/conflict_ahead/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/conflict_ahead/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e similarity index 100% rename from testdata/conflict_ahead/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e rename to testdata/conflict_ahead/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/conflict_ahead/git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 b/testdata/conflict_ahead/dot_git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 similarity index 100% rename from testdata/conflict_ahead/git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 rename to testdata/conflict_ahead/dot_git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 diff --git a/testdata/conflict_ahead/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/conflict_ahead/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 similarity index 100% rename from testdata/conflict_ahead/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 rename to testdata/conflict_ahead/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 diff --git a/testdata/conflict_ahead/git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 b/testdata/conflict_ahead/dot_git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 similarity index 100% rename from testdata/conflict_ahead/git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 rename to testdata/conflict_ahead/dot_git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 diff --git a/testdata/conflict_ahead/git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f b/testdata/conflict_ahead/dot_git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f similarity index 100% rename from testdata/conflict_ahead/git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f rename to testdata/conflict_ahead/dot_git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f diff --git a/testdata/conflict_ahead/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f b/testdata/conflict_ahead/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f similarity index 100% rename from testdata/conflict_ahead/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f rename to testdata/conflict_ahead/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f diff --git a/testdata/conflict_ahead/git/refs/heads/main b/testdata/conflict_ahead/dot_git/refs/heads/main similarity index 100% rename from testdata/conflict_ahead/git/refs/heads/main rename to testdata/conflict_ahead/dot_git/refs/heads/main diff --git a/testdata/conflict_ahead/git/refs/remotes/origin/main b/testdata/conflict_ahead/dot_git/refs/remotes/origin/main similarity index 100% rename from testdata/conflict_ahead/git/refs/remotes/origin/main rename to testdata/conflict_ahead/dot_git/refs/remotes/origin/main diff --git a/testdata/conflict_behind/git/COMMIT_EDITMSG b/testdata/conflict_behind/dot_git/COMMIT_EDITMSG similarity index 100% rename from testdata/conflict_behind/git/COMMIT_EDITMSG rename to testdata/conflict_behind/dot_git/COMMIT_EDITMSG diff --git a/testdata/conflict_behind/git/FETCH_HEAD b/testdata/conflict_behind/dot_git/FETCH_HEAD similarity index 100% rename from testdata/conflict_behind/git/FETCH_HEAD rename to testdata/conflict_behind/dot_git/FETCH_HEAD diff --git a/testdata/conflict_behind/git/HEAD b/testdata/conflict_behind/dot_git/HEAD similarity index 100% rename from testdata/conflict_behind/git/HEAD rename to testdata/conflict_behind/dot_git/HEAD diff --git a/testdata/conflict_behind/git/ORIG_HEAD b/testdata/conflict_behind/dot_git/ORIG_HEAD similarity index 100% rename from testdata/conflict_behind/git/ORIG_HEAD rename to testdata/conflict_behind/dot_git/ORIG_HEAD diff --git a/testdata/conflict_behind/git/config b/testdata/conflict_behind/dot_git/config similarity index 100% rename from testdata/conflict_behind/git/config rename to testdata/conflict_behind/dot_git/config diff --git a/testdata/conflict_behind/git/description b/testdata/conflict_behind/dot_git/description similarity index 100% rename from testdata/conflict_behind/git/description rename to testdata/conflict_behind/dot_git/description diff --git a/testdata/conflict_behind/git/hooks/applypatch-msg.sample b/testdata/conflict_behind/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/applypatch-msg.sample rename to testdata/conflict_behind/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/conflict_behind/git/hooks/commit-msg.sample b/testdata/conflict_behind/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/commit-msg.sample rename to testdata/conflict_behind/dot_git/hooks/commit-msg.sample diff --git a/testdata/conflict_behind/git/hooks/fsmonitor-watchman.sample b/testdata/conflict_behind/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/fsmonitor-watchman.sample rename to testdata/conflict_behind/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/conflict_behind/git/hooks/post-update.sample b/testdata/conflict_behind/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/post-update.sample rename to testdata/conflict_behind/dot_git/hooks/post-update.sample diff --git a/testdata/conflict_behind/git/hooks/pre-applypatch.sample b/testdata/conflict_behind/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/pre-applypatch.sample rename to testdata/conflict_behind/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/conflict_behind/git/hooks/pre-commit.sample b/testdata/conflict_behind/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/pre-commit.sample rename to testdata/conflict_behind/dot_git/hooks/pre-commit.sample diff --git a/testdata/conflict_behind/git/hooks/pre-merge-commit.sample b/testdata/conflict_behind/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/pre-merge-commit.sample rename to testdata/conflict_behind/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/conflict_behind/git/hooks/pre-push.sample b/testdata/conflict_behind/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/pre-push.sample rename to testdata/conflict_behind/dot_git/hooks/pre-push.sample diff --git a/testdata/conflict_behind/git/hooks/pre-rebase.sample b/testdata/conflict_behind/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/pre-rebase.sample rename to testdata/conflict_behind/dot_git/hooks/pre-rebase.sample diff --git a/testdata/conflict_behind/git/hooks/pre-receive.sample b/testdata/conflict_behind/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/pre-receive.sample rename to testdata/conflict_behind/dot_git/hooks/pre-receive.sample diff --git a/testdata/conflict_behind/git/hooks/prepare-commit-msg.sample b/testdata/conflict_behind/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/prepare-commit-msg.sample rename to testdata/conflict_behind/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/conflict_behind/git/hooks/push-to-checkout.sample b/testdata/conflict_behind/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/push-to-checkout.sample rename to testdata/conflict_behind/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/conflict_behind/git/hooks/sendemail-validate.sample b/testdata/conflict_behind/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/sendemail-validate.sample rename to testdata/conflict_behind/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/conflict_behind/git/hooks/update.sample b/testdata/conflict_behind/dot_git/hooks/update.sample similarity index 100% rename from testdata/conflict_behind/git/hooks/update.sample rename to testdata/conflict_behind/dot_git/hooks/update.sample diff --git a/testdata/conflict_behind/git/index b/testdata/conflict_behind/dot_git/index similarity index 100% rename from testdata/conflict_behind/git/index rename to testdata/conflict_behind/dot_git/index diff --git a/testdata/conflict_behind/git/info/exclude b/testdata/conflict_behind/dot_git/info/exclude similarity index 100% rename from testdata/conflict_behind/git/info/exclude rename to testdata/conflict_behind/dot_git/info/exclude diff --git a/testdata/conflict_behind/git/logs/HEAD b/testdata/conflict_behind/dot_git/logs/HEAD similarity index 100% rename from testdata/conflict_behind/git/logs/HEAD rename to testdata/conflict_behind/dot_git/logs/HEAD diff --git a/testdata/conflict_behind/git/logs/refs/heads/main b/testdata/conflict_behind/dot_git/logs/refs/heads/main similarity index 100% rename from testdata/conflict_behind/git/logs/refs/heads/main rename to testdata/conflict_behind/dot_git/logs/refs/heads/main diff --git a/testdata/conflict_behind/git/logs/refs/remotes/origin/main b/testdata/conflict_behind/dot_git/logs/refs/remotes/origin/main similarity index 100% rename from testdata/conflict_behind/git/logs/refs/remotes/origin/main rename to testdata/conflict_behind/dot_git/logs/refs/remotes/origin/main diff --git a/testdata/conflict_behind/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 b/testdata/conflict_behind/dot_git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 similarity index 100% rename from testdata/conflict_behind/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 rename to testdata/conflict_behind/dot_git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 diff --git a/testdata/conflict_behind/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 b/testdata/conflict_behind/dot_git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 similarity index 100% rename from testdata/conflict_behind/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 rename to testdata/conflict_behind/dot_git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 diff --git a/testdata/conflict_behind/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/conflict_behind/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e similarity index 100% rename from testdata/conflict_behind/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e rename to testdata/conflict_behind/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/conflict_behind/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 b/testdata/conflict_behind/dot_git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 similarity index 100% rename from testdata/conflict_behind/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 rename to testdata/conflict_behind/dot_git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 diff --git a/testdata/conflict_behind/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a b/testdata/conflict_behind/dot_git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a similarity index 100% rename from testdata/conflict_behind/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a rename to testdata/conflict_behind/dot_git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a diff --git a/testdata/conflict_behind/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/conflict_behind/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 similarity index 100% rename from testdata/conflict_behind/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 rename to testdata/conflict_behind/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 diff --git a/testdata/conflict_behind/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f b/testdata/conflict_behind/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f similarity index 100% rename from testdata/conflict_behind/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f rename to testdata/conflict_behind/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f diff --git a/testdata/conflict_behind/git/refs/heads/main b/testdata/conflict_behind/dot_git/refs/heads/main similarity index 100% rename from testdata/conflict_behind/git/refs/heads/main rename to testdata/conflict_behind/dot_git/refs/heads/main diff --git a/testdata/conflict_behind/git/refs/remotes/origin/main b/testdata/conflict_behind/dot_git/refs/remotes/origin/main similarity index 100% rename from testdata/conflict_behind/git/refs/remotes/origin/main rename to testdata/conflict_behind/dot_git/refs/remotes/origin/main diff --git a/testdata/conflict_diverged/git/COMMIT_EDITMSG b/testdata/conflict_diverged/dot_git/COMMIT_EDITMSG similarity index 100% rename from testdata/conflict_diverged/git/COMMIT_EDITMSG rename to testdata/conflict_diverged/dot_git/COMMIT_EDITMSG diff --git a/testdata/conflict_diverged/git/FETCH_HEAD b/testdata/conflict_diverged/dot_git/FETCH_HEAD similarity index 100% rename from testdata/conflict_diverged/git/FETCH_HEAD rename to testdata/conflict_diverged/dot_git/FETCH_HEAD diff --git a/testdata/conflict_diverged/git/HEAD b/testdata/conflict_diverged/dot_git/HEAD similarity index 100% rename from testdata/conflict_diverged/git/HEAD rename to testdata/conflict_diverged/dot_git/HEAD diff --git a/testdata/conflict_diverged/git/ORIG_HEAD b/testdata/conflict_diverged/dot_git/ORIG_HEAD similarity index 100% rename from testdata/conflict_diverged/git/ORIG_HEAD rename to testdata/conflict_diverged/dot_git/ORIG_HEAD diff --git a/testdata/conflict_diverged/git/config b/testdata/conflict_diverged/dot_git/config similarity index 100% rename from testdata/conflict_diverged/git/config rename to testdata/conflict_diverged/dot_git/config diff --git a/testdata/conflict_diverged/git/description b/testdata/conflict_diverged/dot_git/description similarity index 100% rename from testdata/conflict_diverged/git/description rename to testdata/conflict_diverged/dot_git/description diff --git a/testdata/conflict_diverged/git/hooks/applypatch-msg.sample b/testdata/conflict_diverged/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/applypatch-msg.sample rename to testdata/conflict_diverged/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/conflict_diverged/git/hooks/commit-msg.sample b/testdata/conflict_diverged/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/commit-msg.sample rename to testdata/conflict_diverged/dot_git/hooks/commit-msg.sample diff --git a/testdata/conflict_diverged/git/hooks/fsmonitor-watchman.sample b/testdata/conflict_diverged/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/fsmonitor-watchman.sample rename to testdata/conflict_diverged/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/conflict_diverged/git/hooks/post-update.sample b/testdata/conflict_diverged/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/post-update.sample rename to testdata/conflict_diverged/dot_git/hooks/post-update.sample diff --git a/testdata/conflict_diverged/git/hooks/pre-applypatch.sample b/testdata/conflict_diverged/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/pre-applypatch.sample rename to testdata/conflict_diverged/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/conflict_diverged/git/hooks/pre-commit.sample b/testdata/conflict_diverged/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/pre-commit.sample rename to testdata/conflict_diverged/dot_git/hooks/pre-commit.sample diff --git a/testdata/conflict_diverged/git/hooks/pre-merge-commit.sample b/testdata/conflict_diverged/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/pre-merge-commit.sample rename to testdata/conflict_diverged/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/conflict_diverged/git/hooks/pre-push.sample b/testdata/conflict_diverged/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/pre-push.sample rename to testdata/conflict_diverged/dot_git/hooks/pre-push.sample diff --git a/testdata/conflict_diverged/git/hooks/pre-rebase.sample b/testdata/conflict_diverged/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/pre-rebase.sample rename to testdata/conflict_diverged/dot_git/hooks/pre-rebase.sample diff --git a/testdata/conflict_diverged/git/hooks/pre-receive.sample b/testdata/conflict_diverged/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/pre-receive.sample rename to testdata/conflict_diverged/dot_git/hooks/pre-receive.sample diff --git a/testdata/conflict_diverged/git/hooks/prepare-commit-msg.sample b/testdata/conflict_diverged/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/prepare-commit-msg.sample rename to testdata/conflict_diverged/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/conflict_diverged/git/hooks/push-to-checkout.sample b/testdata/conflict_diverged/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/push-to-checkout.sample rename to testdata/conflict_diverged/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/conflict_diverged/git/hooks/sendemail-validate.sample b/testdata/conflict_diverged/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/sendemail-validate.sample rename to testdata/conflict_diverged/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/conflict_diverged/git/hooks/update.sample b/testdata/conflict_diverged/dot_git/hooks/update.sample similarity index 100% rename from testdata/conflict_diverged/git/hooks/update.sample rename to testdata/conflict_diverged/dot_git/hooks/update.sample diff --git a/testdata/conflict_diverged/git/index b/testdata/conflict_diverged/dot_git/index similarity index 100% rename from testdata/conflict_diverged/git/index rename to testdata/conflict_diverged/dot_git/index diff --git a/testdata/conflict_diverged/git/info/exclude b/testdata/conflict_diverged/dot_git/info/exclude similarity index 100% rename from testdata/conflict_diverged/git/info/exclude rename to testdata/conflict_diverged/dot_git/info/exclude diff --git a/testdata/conflict_diverged/git/logs/HEAD b/testdata/conflict_diverged/dot_git/logs/HEAD similarity index 100% rename from testdata/conflict_diverged/git/logs/HEAD rename to testdata/conflict_diverged/dot_git/logs/HEAD diff --git a/testdata/conflict_diverged/git/logs/refs/heads/main b/testdata/conflict_diverged/dot_git/logs/refs/heads/main similarity index 100% rename from testdata/conflict_diverged/git/logs/refs/heads/main rename to testdata/conflict_diverged/dot_git/logs/refs/heads/main diff --git a/testdata/conflict_diverged/git/logs/refs/remotes/origin/main b/testdata/conflict_diverged/dot_git/logs/refs/remotes/origin/main similarity index 100% rename from testdata/conflict_diverged/git/logs/refs/remotes/origin/main rename to testdata/conflict_diverged/dot_git/logs/refs/remotes/origin/main diff --git a/testdata/conflict_diverged/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 b/testdata/conflict_diverged/dot_git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 similarity index 100% rename from testdata/conflict_diverged/git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 rename to testdata/conflict_diverged/dot_git/objects/0c/1e5510ac379303b948e7d58c9f665062bc9114 diff --git a/testdata/conflict_diverged/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 b/testdata/conflict_diverged/dot_git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 similarity index 100% rename from testdata/conflict_diverged/git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 rename to testdata/conflict_diverged/dot_git/objects/0e/f5caa6cda22f1c054f3c8aae9eadd53b5f2382 diff --git a/testdata/conflict_diverged/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/conflict_diverged/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e similarity index 100% rename from testdata/conflict_diverged/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e rename to testdata/conflict_diverged/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/conflict_diverged/git/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d b/testdata/conflict_diverged/dot_git/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d similarity index 100% rename from testdata/conflict_diverged/git/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d rename to testdata/conflict_diverged/dot_git/objects/5c/13a5b8d07eb0227fb82a598f56d956a452442d diff --git a/testdata/conflict_diverged/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 b/testdata/conflict_diverged/dot_git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 similarity index 100% rename from testdata/conflict_diverged/git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 rename to testdata/conflict_diverged/dot_git/objects/8b/d10196bff523aa457e79f5fc2ad0bce66c6fd9 diff --git a/testdata/conflict_diverged/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a b/testdata/conflict_diverged/dot_git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a similarity index 100% rename from testdata/conflict_diverged/git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a rename to testdata/conflict_diverged/dot_git/objects/92/92d0f6c53027cf9ea31c44b6df4478b769bf8a diff --git a/testdata/conflict_diverged/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/conflict_diverged/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 similarity index 100% rename from testdata/conflict_diverged/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 rename to testdata/conflict_diverged/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 diff --git a/testdata/conflict_diverged/git/objects/ac/2180ee7624501134ba79245f7359d52c966277 b/testdata/conflict_diverged/dot_git/objects/ac/2180ee7624501134ba79245f7359d52c966277 similarity index 100% rename from testdata/conflict_diverged/git/objects/ac/2180ee7624501134ba79245f7359d52c966277 rename to testdata/conflict_diverged/dot_git/objects/ac/2180ee7624501134ba79245f7359d52c966277 diff --git a/testdata/conflict_diverged/git/objects/ba/d1c77fc7b325ce66b3b5fa8b4ac393d50c98c5 b/testdata/conflict_diverged/dot_git/objects/ba/d1c77fc7b325ce66b3b5fa8b4ac393d50c98c5 similarity index 100% rename from testdata/conflict_diverged/git/objects/ba/d1c77fc7b325ce66b3b5fa8b4ac393d50c98c5 rename to testdata/conflict_diverged/dot_git/objects/ba/d1c77fc7b325ce66b3b5fa8b4ac393d50c98c5 diff --git a/testdata/conflict_diverged/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f b/testdata/conflict_diverged/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f similarity index 100% rename from testdata/conflict_diverged/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f rename to testdata/conflict_diverged/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f diff --git a/testdata/conflict_diverged/git/refs/heads/main b/testdata/conflict_diverged/dot_git/refs/heads/main similarity index 100% rename from testdata/conflict_diverged/git/refs/heads/main rename to testdata/conflict_diverged/dot_git/refs/heads/main diff --git a/testdata/conflict_diverged/git/refs/remotes/origin/main b/testdata/conflict_diverged/dot_git/refs/remotes/origin/main similarity index 100% rename from testdata/conflict_diverged/git/refs/remotes/origin/main rename to testdata/conflict_diverged/dot_git/refs/remotes/origin/main diff --git a/testdata/dirty/git/COMMIT_EDITMSG b/testdata/dirty/dot_git/COMMIT_EDITMSG similarity index 100% rename from testdata/dirty/git/COMMIT_EDITMSG rename to testdata/dirty/dot_git/COMMIT_EDITMSG diff --git a/testdata/dirty/git/FETCH_HEAD b/testdata/dirty/dot_git/FETCH_HEAD similarity index 100% rename from testdata/dirty/git/FETCH_HEAD rename to testdata/dirty/dot_git/FETCH_HEAD diff --git a/testdata/dirty/git/HEAD b/testdata/dirty/dot_git/HEAD similarity index 100% rename from testdata/dirty/git/HEAD rename to testdata/dirty/dot_git/HEAD diff --git a/testdata/dirty/git/config b/testdata/dirty/dot_git/config similarity index 100% rename from testdata/dirty/git/config rename to testdata/dirty/dot_git/config diff --git a/testdata/dirty/git/description b/testdata/dirty/dot_git/description similarity index 100% rename from testdata/dirty/git/description rename to testdata/dirty/dot_git/description diff --git a/testdata/dirty/git/hooks/applypatch-msg.sample b/testdata/dirty/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/dirty/git/hooks/applypatch-msg.sample rename to testdata/dirty/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/dirty/git/hooks/commit-msg.sample b/testdata/dirty/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/dirty/git/hooks/commit-msg.sample rename to testdata/dirty/dot_git/hooks/commit-msg.sample diff --git a/testdata/dirty/git/hooks/fsmonitor-watchman.sample b/testdata/dirty/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/dirty/git/hooks/fsmonitor-watchman.sample rename to testdata/dirty/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/dirty/git/hooks/post-update.sample b/testdata/dirty/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/dirty/git/hooks/post-update.sample rename to testdata/dirty/dot_git/hooks/post-update.sample diff --git a/testdata/dirty/git/hooks/pre-applypatch.sample b/testdata/dirty/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/dirty/git/hooks/pre-applypatch.sample rename to testdata/dirty/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/dirty/git/hooks/pre-commit.sample b/testdata/dirty/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/dirty/git/hooks/pre-commit.sample rename to testdata/dirty/dot_git/hooks/pre-commit.sample diff --git a/testdata/dirty/git/hooks/pre-merge-commit.sample b/testdata/dirty/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/dirty/git/hooks/pre-merge-commit.sample rename to testdata/dirty/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/dirty/git/hooks/pre-push.sample b/testdata/dirty/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/dirty/git/hooks/pre-push.sample rename to testdata/dirty/dot_git/hooks/pre-push.sample diff --git a/testdata/dirty/git/hooks/pre-rebase.sample b/testdata/dirty/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/dirty/git/hooks/pre-rebase.sample rename to testdata/dirty/dot_git/hooks/pre-rebase.sample diff --git a/testdata/dirty/git/hooks/pre-receive.sample b/testdata/dirty/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/dirty/git/hooks/pre-receive.sample rename to testdata/dirty/dot_git/hooks/pre-receive.sample diff --git a/testdata/dirty/git/hooks/prepare-commit-msg.sample b/testdata/dirty/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/dirty/git/hooks/prepare-commit-msg.sample rename to testdata/dirty/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/dirty/git/hooks/push-to-checkout.sample b/testdata/dirty/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/dirty/git/hooks/push-to-checkout.sample rename to testdata/dirty/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/dirty/git/hooks/sendemail-validate.sample b/testdata/dirty/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/dirty/git/hooks/sendemail-validate.sample rename to testdata/dirty/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/dirty/git/hooks/update.sample b/testdata/dirty/dot_git/hooks/update.sample similarity index 100% rename from testdata/dirty/git/hooks/update.sample rename to testdata/dirty/dot_git/hooks/update.sample diff --git a/testdata/dirty/git/index b/testdata/dirty/dot_git/index similarity index 100% rename from testdata/dirty/git/index rename to testdata/dirty/dot_git/index diff --git a/testdata/dirty/git/info/exclude b/testdata/dirty/dot_git/info/exclude similarity index 100% rename from testdata/dirty/git/info/exclude rename to testdata/dirty/dot_git/info/exclude diff --git a/testdata/dirty/git/logs/HEAD b/testdata/dirty/dot_git/logs/HEAD similarity index 100% rename from testdata/dirty/git/logs/HEAD rename to testdata/dirty/dot_git/logs/HEAD diff --git a/testdata/dirty/git/logs/refs/heads/main b/testdata/dirty/dot_git/logs/refs/heads/main similarity index 100% rename from testdata/dirty/git/logs/refs/heads/main rename to testdata/dirty/dot_git/logs/refs/heads/main diff --git a/testdata/dirty/git/logs/refs/remotes/origin/main b/testdata/dirty/dot_git/logs/refs/remotes/origin/main similarity index 100% rename from testdata/dirty/git/logs/refs/remotes/origin/main rename to testdata/dirty/dot_git/logs/refs/remotes/origin/main diff --git a/testdata/dirty/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/dirty/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e similarity index 100% rename from testdata/dirty/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e rename to testdata/dirty/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/dirty/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/dirty/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 similarity index 100% rename from testdata/dirty/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 rename to testdata/dirty/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 diff --git a/testdata/dirty/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f b/testdata/dirty/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f similarity index 100% rename from testdata/dirty/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f rename to testdata/dirty/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f diff --git a/testdata/dirty/git/refs/heads/main b/testdata/dirty/dot_git/refs/heads/main similarity index 100% rename from testdata/dirty/git/refs/heads/main rename to testdata/dirty/dot_git/refs/heads/main diff --git a/testdata/dirty/git/refs/remotes/origin/main b/testdata/dirty/dot_git/refs/remotes/origin/main similarity index 100% rename from testdata/dirty/git/refs/remotes/origin/main rename to testdata/dirty/dot_git/refs/remotes/origin/main diff --git a/testdata/no_upstream/git/HEAD b/testdata/no_upstream/dot_git/HEAD similarity index 100% rename from testdata/no_upstream/git/HEAD rename to testdata/no_upstream/dot_git/HEAD diff --git a/testdata/no_upstream/git/config b/testdata/no_upstream/dot_git/config similarity index 100% rename from testdata/no_upstream/git/config rename to testdata/no_upstream/dot_git/config diff --git a/testdata/no_upstream/git/description b/testdata/no_upstream/dot_git/description similarity index 100% rename from testdata/no_upstream/git/description rename to testdata/no_upstream/dot_git/description diff --git a/testdata/no_upstream/git/hooks/applypatch-msg.sample b/testdata/no_upstream/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/no_upstream/git/hooks/applypatch-msg.sample rename to testdata/no_upstream/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/no_upstream/git/hooks/commit-msg.sample b/testdata/no_upstream/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/no_upstream/git/hooks/commit-msg.sample rename to testdata/no_upstream/dot_git/hooks/commit-msg.sample diff --git a/testdata/no_upstream/git/hooks/fsmonitor-watchman.sample b/testdata/no_upstream/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/no_upstream/git/hooks/fsmonitor-watchman.sample rename to testdata/no_upstream/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/no_upstream/git/hooks/post-update.sample b/testdata/no_upstream/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/no_upstream/git/hooks/post-update.sample rename to testdata/no_upstream/dot_git/hooks/post-update.sample diff --git a/testdata/no_upstream/git/hooks/pre-applypatch.sample b/testdata/no_upstream/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/no_upstream/git/hooks/pre-applypatch.sample rename to testdata/no_upstream/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/no_upstream/git/hooks/pre-commit.sample b/testdata/no_upstream/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/no_upstream/git/hooks/pre-commit.sample rename to testdata/no_upstream/dot_git/hooks/pre-commit.sample diff --git a/testdata/no_upstream/git/hooks/pre-merge-commit.sample b/testdata/no_upstream/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/no_upstream/git/hooks/pre-merge-commit.sample rename to testdata/no_upstream/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/no_upstream/git/hooks/pre-push.sample b/testdata/no_upstream/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/no_upstream/git/hooks/pre-push.sample rename to testdata/no_upstream/dot_git/hooks/pre-push.sample diff --git a/testdata/no_upstream/git/hooks/pre-rebase.sample b/testdata/no_upstream/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/no_upstream/git/hooks/pre-rebase.sample rename to testdata/no_upstream/dot_git/hooks/pre-rebase.sample diff --git a/testdata/no_upstream/git/hooks/pre-receive.sample b/testdata/no_upstream/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/no_upstream/git/hooks/pre-receive.sample rename to testdata/no_upstream/dot_git/hooks/pre-receive.sample diff --git a/testdata/no_upstream/git/hooks/prepare-commit-msg.sample b/testdata/no_upstream/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/no_upstream/git/hooks/prepare-commit-msg.sample rename to testdata/no_upstream/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/no_upstream/git/hooks/push-to-checkout.sample b/testdata/no_upstream/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/no_upstream/git/hooks/push-to-checkout.sample rename to testdata/no_upstream/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/no_upstream/git/hooks/sendemail-validate.sample b/testdata/no_upstream/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/no_upstream/git/hooks/sendemail-validate.sample rename to testdata/no_upstream/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/no_upstream/git/hooks/update.sample b/testdata/no_upstream/dot_git/hooks/update.sample similarity index 100% rename from testdata/no_upstream/git/hooks/update.sample rename to testdata/no_upstream/dot_git/hooks/update.sample diff --git a/testdata/no_upstream/git/info/exclude b/testdata/no_upstream/dot_git/info/exclude similarity index 100% rename from testdata/no_upstream/git/info/exclude rename to testdata/no_upstream/dot_git/info/exclude diff --git a/testdata/no_upstream_remote/git/COMMIT_EDITMSG b/testdata/no_upstream_remote/dot_git/COMMIT_EDITMSG similarity index 100% rename from testdata/no_upstream_remote/git/COMMIT_EDITMSG rename to testdata/no_upstream_remote/dot_git/COMMIT_EDITMSG diff --git a/testdata/no_upstream_remote/git/FETCH_HEAD b/testdata/no_upstream_remote/dot_git/FETCH_HEAD similarity index 100% rename from testdata/no_upstream_remote/git/FETCH_HEAD rename to testdata/no_upstream_remote/dot_git/FETCH_HEAD diff --git a/testdata/no_upstream_remote/git/HEAD b/testdata/no_upstream_remote/dot_git/HEAD similarity index 100% rename from testdata/no_upstream_remote/git/HEAD rename to testdata/no_upstream_remote/dot_git/HEAD diff --git a/testdata/no_upstream_remote/git/config b/testdata/no_upstream_remote/dot_git/config similarity index 100% rename from testdata/no_upstream_remote/git/config rename to testdata/no_upstream_remote/dot_git/config diff --git a/testdata/no_upstream_remote/git/description b/testdata/no_upstream_remote/dot_git/description similarity index 100% rename from testdata/no_upstream_remote/git/description rename to testdata/no_upstream_remote/dot_git/description diff --git a/testdata/no_upstream_remote/git/hooks/applypatch-msg.sample b/testdata/no_upstream_remote/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/applypatch-msg.sample rename to testdata/no_upstream_remote/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/no_upstream_remote/git/hooks/commit-msg.sample b/testdata/no_upstream_remote/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/commit-msg.sample rename to testdata/no_upstream_remote/dot_git/hooks/commit-msg.sample diff --git a/testdata/no_upstream_remote/git/hooks/fsmonitor-watchman.sample b/testdata/no_upstream_remote/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/fsmonitor-watchman.sample rename to testdata/no_upstream_remote/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/no_upstream_remote/git/hooks/post-update.sample b/testdata/no_upstream_remote/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/post-update.sample rename to testdata/no_upstream_remote/dot_git/hooks/post-update.sample diff --git a/testdata/no_upstream_remote/git/hooks/pre-applypatch.sample b/testdata/no_upstream_remote/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/pre-applypatch.sample rename to testdata/no_upstream_remote/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/no_upstream_remote/git/hooks/pre-commit.sample b/testdata/no_upstream_remote/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/pre-commit.sample rename to testdata/no_upstream_remote/dot_git/hooks/pre-commit.sample diff --git a/testdata/no_upstream_remote/git/hooks/pre-merge-commit.sample b/testdata/no_upstream_remote/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/pre-merge-commit.sample rename to testdata/no_upstream_remote/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/no_upstream_remote/git/hooks/pre-push.sample b/testdata/no_upstream_remote/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/pre-push.sample rename to testdata/no_upstream_remote/dot_git/hooks/pre-push.sample diff --git a/testdata/no_upstream_remote/git/hooks/pre-rebase.sample b/testdata/no_upstream_remote/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/pre-rebase.sample rename to testdata/no_upstream_remote/dot_git/hooks/pre-rebase.sample diff --git a/testdata/no_upstream_remote/git/hooks/pre-receive.sample b/testdata/no_upstream_remote/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/pre-receive.sample rename to testdata/no_upstream_remote/dot_git/hooks/pre-receive.sample diff --git a/testdata/no_upstream_remote/git/hooks/prepare-commit-msg.sample b/testdata/no_upstream_remote/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/prepare-commit-msg.sample rename to testdata/no_upstream_remote/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/no_upstream_remote/git/hooks/push-to-checkout.sample b/testdata/no_upstream_remote/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/push-to-checkout.sample rename to testdata/no_upstream_remote/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/no_upstream_remote/git/hooks/sendemail-validate.sample b/testdata/no_upstream_remote/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/sendemail-validate.sample rename to testdata/no_upstream_remote/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/no_upstream_remote/git/hooks/update.sample b/testdata/no_upstream_remote/dot_git/hooks/update.sample similarity index 100% rename from testdata/no_upstream_remote/git/hooks/update.sample rename to testdata/no_upstream_remote/dot_git/hooks/update.sample diff --git a/testdata/no_upstream_remote/git/index b/testdata/no_upstream_remote/dot_git/index similarity index 100% rename from testdata/no_upstream_remote/git/index rename to testdata/no_upstream_remote/dot_git/index diff --git a/testdata/no_upstream_remote/git/info/exclude b/testdata/no_upstream_remote/dot_git/info/exclude similarity index 100% rename from testdata/no_upstream_remote/git/info/exclude rename to testdata/no_upstream_remote/dot_git/info/exclude diff --git a/testdata/no_upstream_remote/git/logs/HEAD b/testdata/no_upstream_remote/dot_git/logs/HEAD similarity index 100% rename from testdata/no_upstream_remote/git/logs/HEAD rename to testdata/no_upstream_remote/dot_git/logs/HEAD diff --git a/testdata/no_upstream_remote/git/logs/refs/heads/main b/testdata/no_upstream_remote/dot_git/logs/refs/heads/main similarity index 100% rename from testdata/no_upstream_remote/git/logs/refs/heads/main rename to testdata/no_upstream_remote/dot_git/logs/refs/heads/main diff --git a/testdata/no_upstream_remote/git/logs/refs/remotes/origin/main b/testdata/no_upstream_remote/dot_git/logs/refs/remotes/origin/main similarity index 100% rename from testdata/no_upstream_remote/git/logs/refs/remotes/origin/main rename to testdata/no_upstream_remote/dot_git/logs/refs/remotes/origin/main diff --git a/testdata/no_upstream_remote/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/no_upstream_remote/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e similarity index 100% rename from testdata/no_upstream_remote/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e rename to testdata/no_upstream_remote/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/no_upstream_remote/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/no_upstream_remote/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 similarity index 100% rename from testdata/no_upstream_remote/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 rename to testdata/no_upstream_remote/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 diff --git a/testdata/no_upstream_remote/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f b/testdata/no_upstream_remote/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f similarity index 100% rename from testdata/no_upstream_remote/git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f rename to testdata/no_upstream_remote/dot_git/objects/d6/9c9ff23f98b1bd528a3b78e11da79a2f038d1f diff --git a/testdata/no_upstream_remote/git/refs/heads/main b/testdata/no_upstream_remote/dot_git/refs/heads/main similarity index 100% rename from testdata/no_upstream_remote/git/refs/heads/main rename to testdata/no_upstream_remote/dot_git/refs/heads/main diff --git a/testdata/no_upstream_remote/git/refs/remotes/origin/main b/testdata/no_upstream_remote/dot_git/refs/remotes/origin/main similarity index 100% rename from testdata/no_upstream_remote/git/refs/remotes/origin/main rename to testdata/no_upstream_remote/dot_git/refs/remotes/origin/main diff --git a/testdata/rebase_i/README.md b/testdata/rebase_i/README.md new file mode 100644 index 0000000..a60a2fa --- /dev/null +++ b/testdata/rebase_i/README.md @@ -0,0 +1,3 @@ +# Test Repo + +Modified line diff --git a/testdata/rebase_i/dot_git/COMMIT_EDITMSG b/testdata/rebase_i/dot_git/COMMIT_EDITMSG new file mode 100644 index 0000000..87fc1c3 --- /dev/null +++ b/testdata/rebase_i/dot_git/COMMIT_EDITMSG @@ -0,0 +1,21 @@ +chore: ahead +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# On branch main +# Your branch is up to date with 'origin/main'. +# +# Changes to be committed: +# modified: README.md +# +# ------------------------ >8 ------------------------ +# Do not modify or remove the line above. +# Everything below it will be ignored. +diff --git a/README.md b/README.md +index a8cdb91..a60a2fa 100644 +--- a/README.md ++++ b/README.md +@@ -1 +1,3 @@ + # Test Repo ++ ++Modified line diff --git a/testdata/tag/git/FETCH_HEAD b/testdata/rebase_i/dot_git/FETCH_HEAD similarity index 100% rename from testdata/tag/git/FETCH_HEAD rename to testdata/rebase_i/dot_git/FETCH_HEAD diff --git a/testdata/rebase_i/dot_git/HEAD b/testdata/rebase_i/dot_git/HEAD new file mode 100644 index 0000000..78633bd --- /dev/null +++ b/testdata/rebase_i/dot_git/HEAD @@ -0,0 +1 @@ +b69e688b26a7ca0498b0cbd8b3e6e189d987b661 diff --git a/testdata/rebase_i/dot_git/ORIG_HEAD b/testdata/rebase_i/dot_git/ORIG_HEAD new file mode 100644 index 0000000..78633bd --- /dev/null +++ b/testdata/rebase_i/dot_git/ORIG_HEAD @@ -0,0 +1 @@ +b69e688b26a7ca0498b0cbd8b3e6e189d987b661 diff --git a/testdata/rebase_i/dot_git/REBASE_HEAD b/testdata/rebase_i/dot_git/REBASE_HEAD new file mode 100644 index 0000000..78633bd --- /dev/null +++ b/testdata/rebase_i/dot_git/REBASE_HEAD @@ -0,0 +1 @@ +b69e688b26a7ca0498b0cbd8b3e6e189d987b661 diff --git a/testdata/tag/git/config b/testdata/rebase_i/dot_git/config similarity index 100% rename from testdata/tag/git/config rename to testdata/rebase_i/dot_git/config diff --git a/testdata/tag/git/description b/testdata/rebase_i/dot_git/description similarity index 100% rename from testdata/tag/git/description rename to testdata/rebase_i/dot_git/description diff --git a/testdata/tag/git/hooks/applypatch-msg.sample b/testdata/rebase_i/dot_git/hooks/applypatch-msg.sample similarity index 100% rename from testdata/tag/git/hooks/applypatch-msg.sample rename to testdata/rebase_i/dot_git/hooks/applypatch-msg.sample diff --git a/testdata/tag/git/hooks/commit-msg.sample b/testdata/rebase_i/dot_git/hooks/commit-msg.sample similarity index 100% rename from testdata/tag/git/hooks/commit-msg.sample rename to testdata/rebase_i/dot_git/hooks/commit-msg.sample diff --git a/testdata/tag/git/hooks/fsmonitor-watchman.sample b/testdata/rebase_i/dot_git/hooks/fsmonitor-watchman.sample similarity index 100% rename from testdata/tag/git/hooks/fsmonitor-watchman.sample rename to testdata/rebase_i/dot_git/hooks/fsmonitor-watchman.sample diff --git a/testdata/tag/git/hooks/post-update.sample b/testdata/rebase_i/dot_git/hooks/post-update.sample similarity index 100% rename from testdata/tag/git/hooks/post-update.sample rename to testdata/rebase_i/dot_git/hooks/post-update.sample diff --git a/testdata/tag/git/hooks/pre-applypatch.sample b/testdata/rebase_i/dot_git/hooks/pre-applypatch.sample similarity index 100% rename from testdata/tag/git/hooks/pre-applypatch.sample rename to testdata/rebase_i/dot_git/hooks/pre-applypatch.sample diff --git a/testdata/tag/git/hooks/pre-commit.sample b/testdata/rebase_i/dot_git/hooks/pre-commit.sample similarity index 100% rename from testdata/tag/git/hooks/pre-commit.sample rename to testdata/rebase_i/dot_git/hooks/pre-commit.sample diff --git a/testdata/tag/git/hooks/pre-merge-commit.sample b/testdata/rebase_i/dot_git/hooks/pre-merge-commit.sample similarity index 100% rename from testdata/tag/git/hooks/pre-merge-commit.sample rename to testdata/rebase_i/dot_git/hooks/pre-merge-commit.sample diff --git a/testdata/tag/git/hooks/pre-push.sample b/testdata/rebase_i/dot_git/hooks/pre-push.sample similarity index 100% rename from testdata/tag/git/hooks/pre-push.sample rename to testdata/rebase_i/dot_git/hooks/pre-push.sample diff --git a/testdata/tag/git/hooks/pre-rebase.sample b/testdata/rebase_i/dot_git/hooks/pre-rebase.sample similarity index 100% rename from testdata/tag/git/hooks/pre-rebase.sample rename to testdata/rebase_i/dot_git/hooks/pre-rebase.sample diff --git a/testdata/tag/git/hooks/pre-receive.sample b/testdata/rebase_i/dot_git/hooks/pre-receive.sample similarity index 100% rename from testdata/tag/git/hooks/pre-receive.sample rename to testdata/rebase_i/dot_git/hooks/pre-receive.sample diff --git a/testdata/tag/git/hooks/prepare-commit-msg.sample b/testdata/rebase_i/dot_git/hooks/prepare-commit-msg.sample similarity index 100% rename from testdata/tag/git/hooks/prepare-commit-msg.sample rename to testdata/rebase_i/dot_git/hooks/prepare-commit-msg.sample diff --git a/testdata/tag/git/hooks/push-to-checkout.sample b/testdata/rebase_i/dot_git/hooks/push-to-checkout.sample similarity index 100% rename from testdata/tag/git/hooks/push-to-checkout.sample rename to testdata/rebase_i/dot_git/hooks/push-to-checkout.sample diff --git a/testdata/tag/git/hooks/sendemail-validate.sample b/testdata/rebase_i/dot_git/hooks/sendemail-validate.sample similarity index 100% rename from testdata/tag/git/hooks/sendemail-validate.sample rename to testdata/rebase_i/dot_git/hooks/sendemail-validate.sample diff --git a/testdata/tag/git/hooks/update.sample b/testdata/rebase_i/dot_git/hooks/update.sample similarity index 100% rename from testdata/tag/git/hooks/update.sample rename to testdata/rebase_i/dot_git/hooks/update.sample diff --git a/testdata/rebase_i/dot_git/index b/testdata/rebase_i/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..d6704320fb5fc00769f75e9956adb1424d69c666 GIT binary patch literal 137 zcmZ?q402{*U|<4b#?;T^?7IKIzk<<>3=D!yVly`|Ff=X!N`D2a5dmW9WnB8}a;LF4 z&vL1WPwd|H<;w3l%?zADu8uCgu6nsC3?V_Tu0VB?42B8@Tqjf&J~PUlUib8!+}#sR gd#k=}x#%DM@tS 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e b69e688b26a7ca0498b0cbd8b3e6e189d987b661 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249375 -0400 commit: chore: ahead +b69e688b26a7ca0498b0cbd8b3e6e189d987b661 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710429959 -0400 rebase (start): checkout HEAD~ +24afc9585ad36ab4a5bcfce5fe08131e72904a5e b69e688b26a7ca0498b0cbd8b3e6e189d987b661 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710429959 -0400 rebase: fast-forward diff --git a/testdata/rebase_i/dot_git/logs/refs/heads/main b/testdata/rebase_i/dot_git/logs/refs/heads/main new file mode 100644 index 0000000..48f3491 --- /dev/null +++ b/testdata/rebase_i/dot_git/logs/refs/heads/main @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 24afc9585ad36ab4a5bcfce5fe08131e72904a5e Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249033 -0400 commit (initial): chore: test repo +24afc9585ad36ab4a5bcfce5fe08131e72904a5e b69e688b26a7ca0498b0cbd8b3e6e189d987b661 Mike Smith <10135646+mikesmithgh@users.noreply.github.com> 1710249375 -0400 commit: chore: ahead diff --git a/testdata/tag/git/logs/refs/remotes/origin/main b/testdata/rebase_i/dot_git/logs/refs/remotes/origin/main similarity index 100% rename from testdata/tag/git/logs/refs/remotes/origin/main rename to testdata/rebase_i/dot_git/logs/refs/remotes/origin/main diff --git a/testdata/tag/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e b/testdata/rebase_i/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e similarity index 100% rename from testdata/tag/git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e rename to testdata/rebase_i/dot_git/objects/24/afc9585ad36ab4a5bcfce5fe08131e72904a5e diff --git a/testdata/rebase_i/dot_git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 b/testdata/rebase_i/dot_git/objects/a6/0a2fae6d9604439a447c5f618bbaf4d4fb9c83 new file mode 100644 index 0000000000000000000000000000000000000000..c40a00cfa52fc872a26a6ce7416dc4ce823752e1 GIT binary patch literal 43 zcmV+`0M!3@0ZYosPf{>4XHZrMNi8l>2udx;=i>6sPsvQnOifY9$;?aT0sy;+3dw$? B67m25 literal 0 HcmV?d00001 diff --git a/testdata/tag/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 b/testdata/rebase_i/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 similarity index 100% rename from testdata/tag/git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 rename to testdata/rebase_i/dot_git/objects/a8/cdb9100441b47e4afc480f32bdc28777511316 diff --git a/testdata/rebase_i/dot_git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 b/testdata/rebase_i/dot_git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 new file mode 100644 index 0000000..a280bb4 --- /dev/null +++ b/testdata/rebase_i/dot_git/objects/b6/9e688b26a7ca0498b0cbd8b3e6e189d987b661 @@ -0,0 +1,2 @@ +xKn ЎY{| (+x%R}2=uY6! 9oZbFNxQJѤvU=ރNj|R(ɉOf +lLJ}^>]o>9/&~tq{e96m ߿HC^óɸ?=㵭*2C.Y \ No newline at end of file diff --git a/testdata/rebase_i/dot_git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f b/testdata/rebase_i/dot_git/objects/c8/2520f3011ecbaee5ee1eddc882bd7af6b4d14f new file mode 100644 index 0000000000000000000000000000000000000000..17f454c9ea11162e11b99a85adb345417fc54504 GIT binary patch literal 54 zcmV-60LlM&0V^p=O;s>9XD~D{Ff%bx2y%6F@paY9O<`EZrN1tB8jJHRmzwy*?p
= use commit +# r, reword = use commit, but edit the commit message +# e, edit = use commit, but stop for amending +# s, squash = use commit, but meld into previous commit +# f, fixup [-C | -c] = like "squash" but keep only the previous +# commit's log message, unless -C is used, in which case +# keep only this commit's message; -c is same as -C but +# opens the editor +# x, exec = run command (the rest of the line) using shell +# b, break = stop here (continue rebase later with 'git rebase --continue') +# d, drop = remove commit +# l, label