mirror of
https://github.com/git/git.git
synced 2024-11-24 02:17:02 +08:00
Merge branch 'sg/completion'
Clean-up and updates to command line completion (in contrib/). * sg/completion: (22 commits) completion: restore removed line continuating backslash completion: cache the path to the repository completion: extract repository discovery from __gitdir() completion: don't guard git executions with __gitdir() completion: consolidate silencing errors from git commands completion: don't use __gitdir() for git commands completion: respect 'git -C <path>' rev-parse: add '--absolute-git-dir' option completion: fix completion after 'git -C <path>' completion: don't offer commands when 'git --opt' needs an argument completion: list short refs from a remote given as a URL completion: don't list 'HEAD' when trying refs completion outside of a repo completion: list refs from remote when remote's name matches a directory completion: respect 'git --git-dir=<path>' when listing remote refs completion: fix most spots not respecting 'git --git-dir=<path>' completion: ensure that the repository path given on the command line exists completion tests: add tests for the __git_refs() helper function completion tests: check __gitdir()'s output in the error cases completion tests: consolidate getting path of current working directory completion tests: make the $cur variable local to the test helper functions ...
This commit is contained in:
commit
fdeb89fdeb
@ -217,6 +217,10 @@ If `$GIT_DIR` is not defined and the current directory
|
||||
is not detected to lie in a Git repository or work tree
|
||||
print a message to stderr and exit with nonzero status.
|
||||
|
||||
--absolute-git-dir::
|
||||
Like `--git-dir`, but its output is always the canonicalized
|
||||
absolute path.
|
||||
|
||||
--git-common-dir::
|
||||
Show `$GIT_COMMON_DIR` if defined, else `$GIT_DIR`.
|
||||
|
||||
|
@ -802,17 +802,27 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||
putchar('\n');
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--git-dir")) {
|
||||
if (!strcmp(arg, "--git-dir") ||
|
||||
!strcmp(arg, "--absolute-git-dir")) {
|
||||
const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
|
||||
char *cwd;
|
||||
int len;
|
||||
if (gitdir) {
|
||||
puts(gitdir);
|
||||
continue;
|
||||
}
|
||||
if (!prefix) {
|
||||
puts(".git");
|
||||
continue;
|
||||
if (arg[2] == 'g') { /* --git-dir */
|
||||
if (gitdir) {
|
||||
puts(gitdir);
|
||||
continue;
|
||||
}
|
||||
if (!prefix) {
|
||||
puts(".git");
|
||||
continue;
|
||||
}
|
||||
} else { /* --absolute-git-dir */
|
||||
if (!gitdir && !prefix)
|
||||
gitdir = ".git";
|
||||
if (gitdir) {
|
||||
puts(real_path(gitdir));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
cwd = xgetcwd();
|
||||
len = strlen(cwd);
|
||||
|
@ -34,21 +34,41 @@ case "$COMP_WORDBREAKS" in
|
||||
*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
|
||||
esac
|
||||
|
||||
# Discovers the path to the git repository taking any '--git-dir=<path>' and
|
||||
# '-C <path>' options into account and stores it in the $__git_repo_path
|
||||
# variable.
|
||||
__git_find_repo_path ()
|
||||
{
|
||||
if [ -n "$__git_repo_path" ]; then
|
||||
# we already know where it is
|
||||
return
|
||||
fi
|
||||
|
||||
if [ -n "${__git_C_args-}" ]; then
|
||||
__git_repo_path="$(git "${__git_C_args[@]}" \
|
||||
${__git_dir:+--git-dir="$__git_dir"} \
|
||||
rev-parse --absolute-git-dir 2>/dev/null)"
|
||||
elif [ -n "${__git_dir-}" ]; then
|
||||
test -d "$__git_dir" &&
|
||||
__git_repo_path="$__git_dir"
|
||||
elif [ -n "${GIT_DIR-}" ]; then
|
||||
test -d "${GIT_DIR-}" &&
|
||||
__git_repo_path="$GIT_DIR"
|
||||
elif [ -d .git ]; then
|
||||
__git_repo_path=.git
|
||||
else
|
||||
__git_repo_path="$(git rev-parse --git-dir 2>/dev/null)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Deprecated: use __git_find_repo_path() and $__git_repo_path instead
|
||||
# __gitdir accepts 0 or 1 arguments (i.e., location)
|
||||
# returns location of .git repo
|
||||
__gitdir ()
|
||||
{
|
||||
if [ -z "${1-}" ]; then
|
||||
if [ -n "${__git_dir-}" ]; then
|
||||
echo "$__git_dir"
|
||||
elif [ -n "${GIT_DIR-}" ]; then
|
||||
test -d "${GIT_DIR-}" || return 1
|
||||
echo "$GIT_DIR"
|
||||
elif [ -d .git ]; then
|
||||
echo .git
|
||||
else
|
||||
git rev-parse --git-dir 2>/dev/null
|
||||
fi
|
||||
__git_find_repo_path || return 1
|
||||
echo "$__git_repo_path"
|
||||
elif [ -d "$1/.git" ]; then
|
||||
echo "$1/.git"
|
||||
else
|
||||
@ -56,6 +76,14 @@ __gitdir ()
|
||||
fi
|
||||
}
|
||||
|
||||
# Runs git with all the options given as argument, respecting any
|
||||
# '--git-dir=<path>' and '-C <path>' options present on the command line
|
||||
__git ()
|
||||
{
|
||||
git ${__git_C_args:+"${__git_C_args[@]}"} \
|
||||
${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
|
||||
}
|
||||
|
||||
# The following function is based on code from:
|
||||
#
|
||||
# bash_completion - programmable completion functions for bash 3.2+
|
||||
@ -283,11 +311,11 @@ __gitcomp_file ()
|
||||
__git_ls_files_helper ()
|
||||
{
|
||||
if [ "$2" == "--committable" ]; then
|
||||
git -C "$1" diff-index --name-only --relative HEAD
|
||||
__git -C "$1" diff-index --name-only --relative HEAD
|
||||
else
|
||||
# NOTE: $2 is not quoted in order to support multiple options
|
||||
git -C "$1" ls-files --exclude-standard $2
|
||||
fi 2>/dev/null
|
||||
__git -C "$1" ls-files --exclude-standard $2
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@ -299,47 +327,61 @@ __git_ls_files_helper ()
|
||||
# slash.
|
||||
__git_index_files ()
|
||||
{
|
||||
local dir="$(__gitdir)" root="${2-.}" file
|
||||
local root="${2-.}" file
|
||||
|
||||
if [ -d "$dir" ]; then
|
||||
__git_ls_files_helper "$root" "$1" |
|
||||
while read -r file; do
|
||||
case "$file" in
|
||||
?*/*) echo "${file%%/*}" ;;
|
||||
*) echo "$file" ;;
|
||||
esac
|
||||
done | sort | uniq
|
||||
fi
|
||||
__git_ls_files_helper "$root" "$1" |
|
||||
while read -r file; do
|
||||
case "$file" in
|
||||
?*/*) echo "${file%%/*}" ;;
|
||||
*) echo "$file" ;;
|
||||
esac
|
||||
done | sort | uniq
|
||||
}
|
||||
|
||||
__git_heads ()
|
||||
{
|
||||
local dir="$(__gitdir)"
|
||||
if [ -d "$dir" ]; then
|
||||
git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
|
||||
refs/heads
|
||||
return
|
||||
fi
|
||||
__git for-each-ref --format='%(refname:short)' refs/heads
|
||||
}
|
||||
|
||||
__git_tags ()
|
||||
{
|
||||
local dir="$(__gitdir)"
|
||||
if [ -d "$dir" ]; then
|
||||
git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
|
||||
refs/tags
|
||||
return
|
||||
fi
|
||||
__git for-each-ref --format='%(refname:short)' refs/tags
|
||||
}
|
||||
|
||||
# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
|
||||
# presence of 2nd argument means use the guess heuristic employed
|
||||
# by checkout for tracking branches
|
||||
# Lists refs from the local (by default) or from a remote repository.
|
||||
# It accepts 0, 1 or 2 arguments:
|
||||
# 1: The remote to list refs from (optional; ignored, if set but empty).
|
||||
# Can be the name of a configured remote, a path, or a URL.
|
||||
# 2: In addition to local refs, list unique branches from refs/remotes/ for
|
||||
# 'git checkout's tracking DWIMery (optional; ignored, if set but empty).
|
||||
__git_refs ()
|
||||
{
|
||||
local i hash dir="$(__gitdir "${1-}")" track="${2-}"
|
||||
local i hash dir track="${2-}"
|
||||
local list_refs_from=path remote="${1-}"
|
||||
local format refs pfx
|
||||
if [ -d "$dir" ]; then
|
||||
|
||||
__git_find_repo_path
|
||||
dir="$__git_repo_path"
|
||||
|
||||
if [ -z "$remote" ]; then
|
||||
if [ -z "$dir" ]; then
|
||||
return
|
||||
fi
|
||||
else
|
||||
if __git_is_configured_remote "$remote"; then
|
||||
# configured remote takes precedence over a
|
||||
# local directory with the same name
|
||||
list_refs_from=remote
|
||||
elif [ -d "$remote/.git" ]; then
|
||||
dir="$remote/.git"
|
||||
elif [ -d "$remote" ]; then
|
||||
dir="$remote"
|
||||
else
|
||||
list_refs_from=url
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$list_refs_from" = path ]; then
|
||||
case "$cur" in
|
||||
refs|refs/*)
|
||||
format="refname"
|
||||
@ -355,14 +397,14 @@ __git_refs ()
|
||||
refs="refs/tags refs/heads refs/remotes"
|
||||
;;
|
||||
esac
|
||||
git --git-dir="$dir" for-each-ref --format="$pfx%($format)" \
|
||||
__git_dir="$dir" __git for-each-ref --format="$pfx%($format)" \
|
||||
$refs
|
||||
if [ -n "$track" ]; then
|
||||
# employ the heuristic used by git checkout
|
||||
# Try to find a remote branch that matches the completion word
|
||||
# but only output if the branch name is unique
|
||||
local ref entry
|
||||
git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
|
||||
__git for-each-ref --shell --format="ref=%(refname:short)" \
|
||||
"refs/remotes/" | \
|
||||
while read -r entry; do
|
||||
eval "$entry"
|
||||
@ -376,7 +418,7 @@ __git_refs ()
|
||||
fi
|
||||
case "$cur" in
|
||||
refs|refs/*)
|
||||
git ls-remote "$dir" "$cur*" 2>/dev/null | \
|
||||
__git ls-remote "$remote" "$cur*" | \
|
||||
while read -r hash i; do
|
||||
case "$i" in
|
||||
*^{}) ;;
|
||||
@ -385,9 +427,21 @@ __git_refs ()
|
||||
done
|
||||
;;
|
||||
*)
|
||||
echo "HEAD"
|
||||
git for-each-ref --format="%(refname:short)" -- \
|
||||
"refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
|
||||
if [ "$list_refs_from" = remote ]; then
|
||||
echo "HEAD"
|
||||
__git for-each-ref --format="%(refname:short)" \
|
||||
"refs/remotes/$remote/" | sed -e "s#^$remote/##"
|
||||
else
|
||||
__git ls-remote "$remote" HEAD \
|
||||
"refs/tags/*" "refs/heads/*" "refs/remotes/*" |
|
||||
while read -r hash i; do
|
||||
case "$i" in
|
||||
*^{}) ;;
|
||||
refs/*) echo "${i#refs/*/}" ;;
|
||||
*) echo "$i" ;; # symbolic refs
|
||||
esac
|
||||
done
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@ -405,7 +459,7 @@ __git_refs2 ()
|
||||
__git_refs_remotes ()
|
||||
{
|
||||
local i hash
|
||||
git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
|
||||
__git ls-remote "$1" 'refs/heads/*' | \
|
||||
while read -r hash i; do
|
||||
echo "$i:refs/remotes/$1/${i#refs/heads/}"
|
||||
done
|
||||
@ -413,9 +467,21 @@ __git_refs_remotes ()
|
||||
|
||||
__git_remotes ()
|
||||
{
|
||||
local d="$(__gitdir)"
|
||||
test -d "$d/remotes" && ls -1 "$d/remotes"
|
||||
git --git-dir="$d" remote
|
||||
__git_find_repo_path
|
||||
test -d "$__git_repo_path/remotes" && ls -1 "$__git_repo_path/remotes"
|
||||
__git remote
|
||||
}
|
||||
|
||||
# Returns true if $1 matches the name of a configured remote, false otherwise.
|
||||
__git_is_configured_remote ()
|
||||
{
|
||||
local remote
|
||||
for remote in $(__git_remotes); do
|
||||
if [ "$remote" = "$1" ]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
__git_list_merge_strategies ()
|
||||
@ -469,7 +535,7 @@ __git_complete_revlist_file ()
|
||||
*) pfx="$ref:$pfx" ;;
|
||||
esac
|
||||
|
||||
__gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
|
||||
__gitcomp_nl "$(__git ls-tree "$ls" \
|
||||
| sed '/^100... blob /{
|
||||
s,^.* ,,
|
||||
s,$, ,
|
||||
@ -747,7 +813,7 @@ __git_compute_porcelain_commands ()
|
||||
__git_get_config_variables ()
|
||||
{
|
||||
local section="$1" i IFS=$'\n'
|
||||
for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
|
||||
for i in $(__git config --name-only --get-regexp "^$section\..*"); do
|
||||
echo "${i#$section.}"
|
||||
done
|
||||
}
|
||||
@ -765,8 +831,7 @@ __git_aliases ()
|
||||
# __git_aliased_command requires 1 argument
|
||||
__git_aliased_command ()
|
||||
{
|
||||
local word cmdline=$(git --git-dir="$(__gitdir)" \
|
||||
config --get "alias.$1")
|
||||
local word cmdline=$(__git config --get "alias.$1")
|
||||
for word in $cmdline; do
|
||||
case "$word" in
|
||||
\!gitk|gitk)
|
||||
@ -842,7 +907,7 @@ __git_get_option_value ()
|
||||
done
|
||||
|
||||
if [ -n "$config_key" ] && [ -z "$result" ]; then
|
||||
result="$(git --git-dir="$(__gitdir)" config "$config_key")"
|
||||
result="$(__git config "$config_key")"
|
||||
fi
|
||||
|
||||
echo "$result"
|
||||
@ -901,8 +966,8 @@ __git_whitespacelist="nowarn warn error error-all fix"
|
||||
|
||||
_git_am ()
|
||||
{
|
||||
local dir="$(__gitdir)"
|
||||
if [ -d "$dir"/rebase-apply ]; then
|
||||
__git_find_repo_path
|
||||
if [ -d "$__git_repo_path"/rebase-apply ]; then
|
||||
__gitcomp "--skip --continue --resolved --abort"
|
||||
return
|
||||
fi
|
||||
@ -990,7 +1055,8 @@ _git_bisect ()
|
||||
local subcommands="start bad good skip reset visualize replay log run"
|
||||
local subcommand="$(__git_find_on_cmdline "$subcommands")"
|
||||
if [ -z "$subcommand" ]; then
|
||||
if [ -f "$(__gitdir)"/BISECT_START ]; then
|
||||
__git_find_repo_path
|
||||
if [ -f "$__git_repo_path"/BISECT_START ]; then
|
||||
__gitcomp "$subcommands"
|
||||
else
|
||||
__gitcomp "replay start"
|
||||
@ -1096,8 +1162,8 @@ _git_cherry ()
|
||||
|
||||
_git_cherry_pick ()
|
||||
{
|
||||
local dir="$(__gitdir)"
|
||||
if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
|
||||
__git_find_repo_path
|
||||
if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
|
||||
__gitcomp "--continue --quit --abort"
|
||||
return
|
||||
fi
|
||||
@ -1192,7 +1258,7 @@ _git_commit ()
|
||||
return
|
||||
esac
|
||||
|
||||
if git rev-parse --verify --quiet HEAD >/dev/null; then
|
||||
if __git rev-parse --verify --quiet HEAD >/dev/null; then
|
||||
__git_complete_index_file "--committable"
|
||||
else
|
||||
# This is the first commit
|
||||
@ -1501,10 +1567,10 @@ __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
|
||||
_git_log ()
|
||||
{
|
||||
__git_has_doubledash && return
|
||||
__git_find_repo_path
|
||||
|
||||
local g="$(git rev-parse --git-dir 2>/dev/null)"
|
||||
local merge=""
|
||||
if [ -f "$g/MERGE_HEAD" ]; then
|
||||
if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
|
||||
merge="--merge"
|
||||
fi
|
||||
case "$cur" in
|
||||
@ -1751,11 +1817,12 @@ _git_push ()
|
||||
|
||||
_git_rebase ()
|
||||
{
|
||||
local dir="$(__gitdir)"
|
||||
if [ -f "$dir"/rebase-merge/interactive ]; then
|
||||
__git_find_repo_path
|
||||
if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
|
||||
__gitcomp "--continue --skip --abort --quit --edit-todo"
|
||||
return
|
||||
elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
|
||||
elif [ -d "$__git_repo_path"/rebase-apply ] || \
|
||||
[ -d "$__git_repo_path"/rebase-merge ]; then
|
||||
__gitcomp "--continue --skip --abort --quit"
|
||||
return
|
||||
fi
|
||||
@ -1803,9 +1870,7 @@ _git_send_email ()
|
||||
{
|
||||
case "$prev" in
|
||||
--to|--cc|--bcc|--from)
|
||||
__gitcomp "
|
||||
$(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
|
||||
"
|
||||
__gitcomp "$(__git send-email --dump-aliases)"
|
||||
return
|
||||
;;
|
||||
esac
|
||||
@ -1835,9 +1900,7 @@ _git_send_email ()
|
||||
return
|
||||
;;
|
||||
--to=*|--cc=*|--bcc=*|--from=*)
|
||||
__gitcomp "
|
||||
$(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
|
||||
" "" "${cur#--*=}"
|
||||
__gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
|
||||
return
|
||||
;;
|
||||
--*)
|
||||
@ -1931,7 +1994,7 @@ __git_config_get_set_variables ()
|
||||
c=$((--c))
|
||||
done
|
||||
|
||||
git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
|
||||
__git config $config_file --name-only --list
|
||||
}
|
||||
|
||||
_git_config ()
|
||||
@ -1966,9 +2029,8 @@ _git_config ()
|
||||
remote.*.push)
|
||||
local remote="${prev#remote.}"
|
||||
remote="${remote%.push}"
|
||||
__gitcomp_nl "$(git --git-dir="$(__gitdir)" \
|
||||
for-each-ref --format='%(refname):%(refname)' \
|
||||
refs/heads)"
|
||||
__gitcomp_nl "$(__git for-each-ref \
|
||||
--format='%(refname):%(refname)' refs/heads)"
|
||||
return
|
||||
;;
|
||||
pull.twohead|pull.octopus)
|
||||
@ -2483,8 +2545,8 @@ _git_reset ()
|
||||
|
||||
_git_revert ()
|
||||
{
|
||||
local dir="$(__gitdir)"
|
||||
if [ -f "$dir"/REVERT_HEAD ]; then
|
||||
__git_find_repo_path
|
||||
if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
|
||||
__gitcomp "--continue --quit --abort"
|
||||
return
|
||||
fi
|
||||
@ -2607,12 +2669,12 @@ _git_stash ()
|
||||
if [ $cword -eq 3 ]; then
|
||||
__gitcomp_nl "$(__git_refs)";
|
||||
else
|
||||
__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
|
||||
__gitcomp_nl "$(__git stash list \
|
||||
| sed -n -e 's/:.*//p')"
|
||||
fi
|
||||
;;
|
||||
show,*|apply,*|drop,*|pop,*)
|
||||
__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
|
||||
__gitcomp_nl "$(__git stash list \
|
||||
| sed -n -e 's/:.*//p')"
|
||||
;;
|
||||
*)
|
||||
@ -2839,7 +2901,8 @@ _git_worktree ()
|
||||
|
||||
__git_main ()
|
||||
{
|
||||
local i c=1 command __git_dir
|
||||
local i c=1 command __git_dir __git_repo_path
|
||||
local __git_C_args C_args_count=0
|
||||
|
||||
while [ $c -lt $cword ]; do
|
||||
i="${words[c]}"
|
||||
@ -2849,6 +2912,10 @@ __git_main ()
|
||||
--bare) __git_dir="." ;;
|
||||
--help) command="help"; break ;;
|
||||
-c|--work-tree|--namespace) ((c++)) ;;
|
||||
-C) __git_C_args[C_args_count++]=-C
|
||||
((c++))
|
||||
__git_C_args[C_args_count++]="${words[c]}"
|
||||
;;
|
||||
-*) ;;
|
||||
*) command="$i"; break ;;
|
||||
esac
|
||||
@ -2856,6 +2923,17 @@ __git_main ()
|
||||
done
|
||||
|
||||
if [ -z "$command" ]; then
|
||||
case "$prev" in
|
||||
--git-dir|-C|--work-tree)
|
||||
# these need a path argument, let's fall back to
|
||||
# Bash filename completion
|
||||
return
|
||||
;;
|
||||
-c|--namespace)
|
||||
# we don't support completing these options' arguments
|
||||
return
|
||||
;;
|
||||
esac
|
||||
case "$cur" in
|
||||
--*) __gitcomp "
|
||||
--paginate
|
||||
@ -2881,13 +2959,13 @@ __git_main ()
|
||||
fi
|
||||
|
||||
local completion_func="_git_${command//-/_}"
|
||||
declare -f $completion_func >/dev/null && $completion_func && return
|
||||
declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
|
||||
|
||||
local expansion=$(__git_aliased_command "$command")
|
||||
if [ -n "$expansion" ]; then
|
||||
words[1]=$expansion
|
||||
completion_func="_git_${expansion//-/_}"
|
||||
declare -f $completion_func >/dev/null && $completion_func
|
||||
declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
|
||||
fi
|
||||
}
|
||||
|
||||
@ -2895,9 +2973,11 @@ __gitk_main ()
|
||||
{
|
||||
__git_has_doubledash && return
|
||||
|
||||
local g="$(__gitdir)"
|
||||
local __git_repo_path
|
||||
__git_find_repo_path
|
||||
|
||||
local merge=""
|
||||
if [ -f "$g/MERGE_HEAD" ]; then
|
||||
if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
|
||||
merge="--merge"
|
||||
fi
|
||||
case "$cur" in
|
||||
|
@ -3,7 +3,7 @@
|
||||
test_description='test git rev-parse'
|
||||
. ./test-lib.sh
|
||||
|
||||
# usage: [options] label is-bare is-inside-git is-inside-work prefix git-dir
|
||||
# usage: [options] label is-bare is-inside-git is-inside-work prefix git-dir absolute-git-dir
|
||||
test_rev_parse () {
|
||||
d=
|
||||
bare=
|
||||
@ -29,7 +29,8 @@ test_rev_parse () {
|
||||
--is-inside-git-dir \
|
||||
--is-inside-work-tree \
|
||||
--show-prefix \
|
||||
--git-dir
|
||||
--git-dir \
|
||||
--absolute-git-dir
|
||||
do
|
||||
test $# -eq 0 && break
|
||||
expect="$1"
|
||||
@ -62,26 +63,26 @@ test_expect_success 'setup' '
|
||||
cp -R .git repo.git
|
||||
'
|
||||
|
||||
test_rev_parse toplevel false false true '' .git
|
||||
test_rev_parse toplevel false false true '' .git "$ROOT/.git"
|
||||
|
||||
test_rev_parse -C .git .git/ false true false '' .
|
||||
test_rev_parse -C .git/objects .git/objects/ false true false '' "$ROOT/.git"
|
||||
test_rev_parse -C .git .git/ false true false '' . "$ROOT/.git"
|
||||
test_rev_parse -C .git/objects .git/objects/ false true false '' "$ROOT/.git" "$ROOT/.git"
|
||||
|
||||
test_rev_parse -C sub/dir subdirectory false false true sub/dir/ "$ROOT/.git"
|
||||
test_rev_parse -C sub/dir subdirectory false false true sub/dir/ "$ROOT/.git" "$ROOT/.git"
|
||||
|
||||
test_rev_parse -b t 'core.bare = true' true false false
|
||||
|
||||
test_rev_parse -b u 'core.bare undefined' false false true
|
||||
|
||||
|
||||
test_rev_parse -C work -g ../.git -b f 'GIT_DIR=../.git, core.bare = false' false false true ''
|
||||
test_rev_parse -C work -g ../.git -b f 'GIT_DIR=../.git, core.bare = false' false false true '' "../.git" "$ROOT/.git"
|
||||
|
||||
test_rev_parse -C work -g ../.git -b t 'GIT_DIR=../.git, core.bare = true' true false false ''
|
||||
|
||||
test_rev_parse -C work -g ../.git -b u 'GIT_DIR=../.git, core.bare undefined' false false true ''
|
||||
|
||||
|
||||
test_rev_parse -C work -g ../repo.git -b f 'GIT_DIR=../repo.git, core.bare = false' false false true ''
|
||||
test_rev_parse -C work -g ../repo.git -b f 'GIT_DIR=../repo.git, core.bare = false' false false true '' "../repo.git" "$ROOT/repo.git"
|
||||
|
||||
test_rev_parse -C work -g ../repo.git -b t 'GIT_DIR=../repo.git, core.bare = true' true false false ''
|
||||
|
||||
|
@ -98,7 +98,7 @@ test_gitcomp ()
|
||||
{
|
||||
local -a COMPREPLY &&
|
||||
sed -e 's/Z$//' >expected &&
|
||||
cur="$1" &&
|
||||
local cur="$1" &&
|
||||
shift &&
|
||||
__gitcomp "$@" &&
|
||||
print_comp &&
|
||||
@ -113,7 +113,7 @@ test_gitcomp_nl ()
|
||||
{
|
||||
local -a COMPREPLY &&
|
||||
sed -e 's/Z$//' >expected &&
|
||||
cur="$1" &&
|
||||
local cur="$1" &&
|
||||
shift &&
|
||||
__gitcomp_nl "$@" &&
|
||||
print_comp &&
|
||||
@ -124,140 +124,280 @@ invalid_variable_name='${foo.bar}'
|
||||
|
||||
actual="$TRASH_DIRECTORY/actual"
|
||||
|
||||
test_expect_success 'setup for __gitdir tests' '
|
||||
if test_have_prereq MINGW
|
||||
then
|
||||
ROOT="$(pwd -W)"
|
||||
else
|
||||
ROOT="$(pwd)"
|
||||
fi
|
||||
|
||||
test_expect_success 'setup for __git_find_repo_path/__gitdir tests' '
|
||||
mkdir -p subdir/subsubdir &&
|
||||
mkdir -p non-repo &&
|
||||
git init otherrepo
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - from command line (through $__git_dir)' '
|
||||
echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
|
||||
test_expect_success '__git_find_repo_path - from command line (through $__git_dir)' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
(
|
||||
__git_dir="$TRASH_DIRECTORY/otherrepo/.git" &&
|
||||
__gitdir >"$actual"
|
||||
__git_dir="$ROOT/otherrepo/.git" &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - repo as argument' '
|
||||
echo "otherrepo/.git" >expected &&
|
||||
__gitdir "otherrepo" >"$actual" &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - remote as argument' '
|
||||
echo "remote" >expected &&
|
||||
__gitdir "remote" >"$actual" &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - .git directory in cwd' '
|
||||
test_expect_success '__git_find_repo_path - .git directory in cwd' '
|
||||
echo ".git" >expected &&
|
||||
__gitdir >"$actual" &&
|
||||
(
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - .git directory in parent' '
|
||||
echo "$(pwd -P)/.git" >expected &&
|
||||
test_expect_success '__git_find_repo_path - .git directory in parent' '
|
||||
echo "$ROOT/.git" >expected &&
|
||||
(
|
||||
cd subdir/subsubdir &&
|
||||
__gitdir >"$actual"
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - cwd is a .git directory' '
|
||||
test_expect_success '__git_find_repo_path - cwd is a .git directory' '
|
||||
echo "." >expected &&
|
||||
(
|
||||
cd .git &&
|
||||
__gitdir >"$actual"
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - parent is a .git directory' '
|
||||
echo "$(pwd -P)/.git" >expected &&
|
||||
test_expect_success '__git_find_repo_path - parent is a .git directory' '
|
||||
echo "$ROOT/.git" >expected &&
|
||||
(
|
||||
cd .git/refs/heads &&
|
||||
__gitdir >"$actual"
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - $GIT_DIR set while .git directory in cwd' '
|
||||
echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
|
||||
test_expect_success '__git_find_repo_path - $GIT_DIR set while .git directory in cwd' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
(
|
||||
GIT_DIR="$TRASH_DIRECTORY/otherrepo/.git" &&
|
||||
GIT_DIR="$ROOT/otherrepo/.git" &&
|
||||
export GIT_DIR &&
|
||||
__gitdir >"$actual"
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - $GIT_DIR set while .git directory in parent' '
|
||||
echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
|
||||
test_expect_success '__git_find_repo_path - $GIT_DIR set while .git directory in parent' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
(
|
||||
GIT_DIR="$TRASH_DIRECTORY/otherrepo/.git" &&
|
||||
GIT_DIR="$ROOT/otherrepo/.git" &&
|
||||
export GIT_DIR &&
|
||||
cd subdir &&
|
||||
__gitdir >"$actual"
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - non-existing $GIT_DIR' '
|
||||
test_expect_success '__git_find_repo_path - from command line while "git -C"' '
|
||||
echo "$ROOT/.git" >expected &&
|
||||
(
|
||||
GIT_DIR="$TRASH_DIRECTORY/non-existing" &&
|
||||
export GIT_DIR &&
|
||||
test_must_fail __gitdir
|
||||
)
|
||||
__git_dir="$ROOT/.git" &&
|
||||
__git_C_args=(-C otherrepo) &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
function pwd_P_W () {
|
||||
if test_have_prereq MINGW
|
||||
then
|
||||
pwd -W
|
||||
else
|
||||
pwd -P
|
||||
fi
|
||||
}
|
||||
test_expect_success '__git_find_repo_path - relative dir from command line and "git -C"' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
(
|
||||
cd subdir &&
|
||||
__git_dir="otherrepo/.git" &&
|
||||
__git_C_args=(-C ..) &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - gitfile in cwd' '
|
||||
echo "$(pwd_P_W)/otherrepo/.git" >expected &&
|
||||
echo "gitdir: $(pwd_P_W)/otherrepo/.git" >subdir/.git &&
|
||||
test_expect_success '__git_find_repo_path - $GIT_DIR set while "git -C"' '
|
||||
echo "$ROOT/.git" >expected &&
|
||||
(
|
||||
GIT_DIR="$ROOT/.git" &&
|
||||
export GIT_DIR &&
|
||||
__git_C_args=(-C otherrepo) &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - relative dir in $GIT_DIR and "git -C"' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
(
|
||||
cd subdir &&
|
||||
GIT_DIR="otherrepo/.git" &&
|
||||
export GIT_DIR &&
|
||||
__git_C_args=(-C ..) &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - "git -C" while .git directory in cwd' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
(
|
||||
__git_C_args=(-C otherrepo) &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - "git -C" while cwd is a .git directory' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
(
|
||||
cd .git &&
|
||||
__git_C_args=(-C .. -C otherrepo) &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - "git -C" while .git directory in parent' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
(
|
||||
cd subdir &&
|
||||
__git_C_args=(-C .. -C otherrepo) &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - non-existing path in "git -C"' '
|
||||
(
|
||||
__git_C_args=(-C non-existing) &&
|
||||
test_must_fail __git_find_repo_path &&
|
||||
printf "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - non-existing path in $__git_dir' '
|
||||
(
|
||||
__git_dir="non-existing" &&
|
||||
test_must_fail __git_find_repo_path &&
|
||||
printf "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - non-existing $GIT_DIR' '
|
||||
(
|
||||
GIT_DIR="$ROOT/non-existing" &&
|
||||
export GIT_DIR &&
|
||||
test_must_fail __git_find_repo_path &&
|
||||
printf "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - gitfile in cwd' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
echo "gitdir: $ROOT/otherrepo/.git" >subdir/.git &&
|
||||
test_when_finished "rm -f subdir/.git" &&
|
||||
(
|
||||
cd subdir &&
|
||||
__gitdir >"$actual"
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - gitfile in parent' '
|
||||
echo "$(pwd_P_W)/otherrepo/.git" >expected &&
|
||||
echo "gitdir: $(pwd_P_W)/otherrepo/.git" >subdir/.git &&
|
||||
test_expect_success '__git_find_repo_path - gitfile in parent' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
echo "gitdir: $ROOT/otherrepo/.git" >subdir/.git &&
|
||||
test_when_finished "rm -f subdir/.git" &&
|
||||
(
|
||||
cd subdir/subsubdir &&
|
||||
__gitdir >"$actual"
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success SYMLINKS '__gitdir - resulting path avoids symlinks' '
|
||||
echo "$(pwd -P)/otherrepo/.git" >expected &&
|
||||
test_expect_success SYMLINKS '__git_find_repo_path - resulting path avoids symlinks' '
|
||||
echo "$ROOT/otherrepo/.git" >expected &&
|
||||
mkdir otherrepo/dir &&
|
||||
test_when_finished "rm -rf otherrepo/dir" &&
|
||||
ln -s otherrepo/dir link &&
|
||||
test_when_finished "rm -f link" &&
|
||||
(
|
||||
cd link &&
|
||||
__git_find_repo_path &&
|
||||
echo "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_find_repo_path - not a git repository' '
|
||||
(
|
||||
cd non-repo &&
|
||||
GIT_CEILING_DIRECTORIES="$ROOT" &&
|
||||
export GIT_CEILING_DIRECTORIES &&
|
||||
test_must_fail __git_find_repo_path &&
|
||||
printf "$__git_repo_path" >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - finds repo' '
|
||||
echo "$ROOT/.git" >expected &&
|
||||
(
|
||||
cd subdir/subsubdir &&
|
||||
__gitdir >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - not a git repository' '
|
||||
nongit test_must_fail __gitdir
|
||||
|
||||
test_expect_success '__gitdir - returns error when cant find repo' '
|
||||
(
|
||||
__git_dir="non-existing" &&
|
||||
test_must_fail __gitdir >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - repo as argument' '
|
||||
echo "otherrepo/.git" >expected &&
|
||||
(
|
||||
__gitdir "otherrepo" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitdir - remote as argument' '
|
||||
echo "remote" >expected &&
|
||||
(
|
||||
__gitdir "remote" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__gitcomp - trailing space - options' '
|
||||
@ -361,10 +501,286 @@ test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from
|
||||
git remote add remote_in_config_1 git://remote_1 &&
|
||||
test_when_finished "git remote remove remote_in_config_2" &&
|
||||
git remote add remote_in_config_2 git://remote_2 &&
|
||||
__git_remotes >actual &&
|
||||
(
|
||||
__git_remotes >actual
|
||||
) &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success '__git_is_configured_remote' '
|
||||
test_when_finished "git remote remove remote_1" &&
|
||||
git remote add remote_1 git://remote_1 &&
|
||||
test_when_finished "git remote remove remote_2" &&
|
||||
git remote add remote_2 git://remote_2 &&
|
||||
(
|
||||
verbose __git_is_configured_remote remote_2 &&
|
||||
test_must_fail __git_is_configured_remote non-existent
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'setup for ref completion' '
|
||||
git commit --allow-empty -m initial &&
|
||||
git branch matching-branch &&
|
||||
git tag matching-tag &&
|
||||
(
|
||||
cd otherrepo &&
|
||||
git commit --allow-empty -m initial &&
|
||||
git branch -m master master-in-other &&
|
||||
git branch branch-in-other &&
|
||||
git tag tag-in-other
|
||||
) &&
|
||||
git remote add other "$ROOT/otherrepo/.git" &&
|
||||
git fetch --no-tags other &&
|
||||
rm -f .git/FETCH_HEAD &&
|
||||
git init thirdrepo
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - simple' '
|
||||
cat >expected <<-EOF &&
|
||||
HEAD
|
||||
master
|
||||
matching-branch
|
||||
other/branch-in-other
|
||||
other/master-in-other
|
||||
matching-tag
|
||||
EOF
|
||||
(
|
||||
cur= &&
|
||||
__git_refs >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - full refs' '
|
||||
cat >expected <<-EOF &&
|
||||
refs/heads/master
|
||||
refs/heads/matching-branch
|
||||
EOF
|
||||
(
|
||||
cur=refs/heads/ &&
|
||||
__git_refs >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - repo given on the command line' '
|
||||
cat >expected <<-EOF &&
|
||||
HEAD
|
||||
branch-in-other
|
||||
master-in-other
|
||||
tag-in-other
|
||||
EOF
|
||||
(
|
||||
__git_dir="$ROOT/otherrepo/.git" &&
|
||||
cur= &&
|
||||
__git_refs >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - remote on local file system' '
|
||||
cat >expected <<-EOF &&
|
||||
HEAD
|
||||
branch-in-other
|
||||
master-in-other
|
||||
tag-in-other
|
||||
EOF
|
||||
(
|
||||
cur= &&
|
||||
__git_refs otherrepo >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - remote on local file system - full refs' '
|
||||
cat >expected <<-EOF &&
|
||||
refs/heads/branch-in-other
|
||||
refs/heads/master-in-other
|
||||
refs/tags/tag-in-other
|
||||
EOF
|
||||
(
|
||||
cur=refs/ &&
|
||||
__git_refs otherrepo >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - configured remote' '
|
||||
cat >expected <<-EOF &&
|
||||
HEAD
|
||||
branch-in-other
|
||||
master-in-other
|
||||
EOF
|
||||
(
|
||||
cur= &&
|
||||
__git_refs other >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - configured remote - full refs' '
|
||||
cat >expected <<-EOF &&
|
||||
refs/heads/branch-in-other
|
||||
refs/heads/master-in-other
|
||||
refs/tags/tag-in-other
|
||||
EOF
|
||||
(
|
||||
cur=refs/ &&
|
||||
__git_refs other >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - configured remote - repo given on the command line' '
|
||||
cat >expected <<-EOF &&
|
||||
HEAD
|
||||
branch-in-other
|
||||
master-in-other
|
||||
EOF
|
||||
(
|
||||
cd thirdrepo &&
|
||||
__git_dir="$ROOT/.git" &&
|
||||
cur= &&
|
||||
__git_refs other >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - configured remote - full refs - repo given on the command line' '
|
||||
cat >expected <<-EOF &&
|
||||
refs/heads/branch-in-other
|
||||
refs/heads/master-in-other
|
||||
refs/tags/tag-in-other
|
||||
EOF
|
||||
(
|
||||
cd thirdrepo &&
|
||||
__git_dir="$ROOT/.git" &&
|
||||
cur=refs/ &&
|
||||
__git_refs other >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - configured remote - remote name matches a directory' '
|
||||
cat >expected <<-EOF &&
|
||||
HEAD
|
||||
branch-in-other
|
||||
master-in-other
|
||||
EOF
|
||||
mkdir other &&
|
||||
test_when_finished "rm -rf other" &&
|
||||
(
|
||||
cur= &&
|
||||
__git_refs other >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - URL remote' '
|
||||
cat >expected <<-EOF &&
|
||||
HEAD
|
||||
branch-in-other
|
||||
master-in-other
|
||||
tag-in-other
|
||||
EOF
|
||||
(
|
||||
cur= &&
|
||||
__git_refs "file://$ROOT/otherrepo/.git" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - URL remote - full refs' '
|
||||
cat >expected <<-EOF &&
|
||||
refs/heads/branch-in-other
|
||||
refs/heads/master-in-other
|
||||
refs/tags/tag-in-other
|
||||
EOF
|
||||
(
|
||||
cur=refs/ &&
|
||||
__git_refs "file://$ROOT/otherrepo/.git" >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - non-existing remote' '
|
||||
(
|
||||
cur= &&
|
||||
__git_refs non-existing >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - non-existing remote - full refs' '
|
||||
(
|
||||
cur=refs/ &&
|
||||
__git_refs non-existing >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - non-existing URL remote' '
|
||||
(
|
||||
cur= &&
|
||||
__git_refs "file://$ROOT/non-existing" >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - non-existing URL remote - full refs' '
|
||||
(
|
||||
cur=refs/ &&
|
||||
__git_refs "file://$ROOT/non-existing" >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - not in a git repository' '
|
||||
(
|
||||
GIT_CEILING_DIRECTORIES="$ROOT" &&
|
||||
export GIT_CEILING_DIRECTORIES &&
|
||||
cd subdir &&
|
||||
cur= &&
|
||||
__git_refs >"$actual"
|
||||
) &&
|
||||
test_must_be_empty "$actual"
|
||||
'
|
||||
|
||||
test_expect_success '__git_refs - unique remote branches for git checkout DWIMery' '
|
||||
cat >expected <<-EOF &&
|
||||
HEAD
|
||||
master
|
||||
matching-branch
|
||||
other/ambiguous
|
||||
other/branch-in-other
|
||||
other/master-in-other
|
||||
remote/ambiguous
|
||||
remote/branch-in-remote
|
||||
matching-tag
|
||||
branch-in-other
|
||||
branch-in-remote
|
||||
master-in-other
|
||||
EOF
|
||||
for remote_ref in refs/remotes/other/ambiguous \
|
||||
refs/remotes/remote/ambiguous \
|
||||
refs/remotes/remote/branch-in-remote
|
||||
do
|
||||
git update-ref $remote_ref master &&
|
||||
test_when_finished "git update-ref -d $remote_ref"
|
||||
done &&
|
||||
(
|
||||
cur= &&
|
||||
__git_refs "" 1 >"$actual"
|
||||
) &&
|
||||
test_cmp expected "$actual"
|
||||
'
|
||||
|
||||
test_expect_success 'teardown after ref completion' '
|
||||
git branch -d matching-branch &&
|
||||
git tag -d matching-tag &&
|
||||
git remote remove other
|
||||
'
|
||||
|
||||
test_expect_success '__git_get_config_variables' '
|
||||
cat >expect <<-EOF &&
|
||||
name-1
|
||||
@ -475,7 +891,12 @@ test_expect_success 'general options plus command' '
|
||||
test_completion "git --namespace=foo check" "checkout " &&
|
||||
test_completion "git --paginate check" "checkout " &&
|
||||
test_completion "git --info-path check" "checkout " &&
|
||||
test_completion "git --no-replace-objects check" "checkout "
|
||||
test_completion "git --no-replace-objects check" "checkout " &&
|
||||
test_completion "git --git-dir some/path check" "checkout " &&
|
||||
test_completion "git -c conf.var=value check" "checkout " &&
|
||||
test_completion "git -C some/path check" "checkout " &&
|
||||
test_completion "git --work-tree some/path check" "checkout " &&
|
||||
test_completion "git --namespace name/space check" "checkout "
|
||||
'
|
||||
|
||||
test_expect_success 'git --help completion' '
|
||||
@ -483,10 +904,10 @@ test_expect_success 'git --help completion' '
|
||||
test_completion "git --help core" "core-tutorial "
|
||||
'
|
||||
|
||||
test_expect_success 'setup for ref completion' '
|
||||
test_expect_success 'setup for integration tests' '
|
||||
echo content >file1 &&
|
||||
echo more >file2 &&
|
||||
git add . &&
|
||||
git add file1 file2 &&
|
||||
git commit -m one &&
|
||||
git branch mybranch &&
|
||||
git tag mytag
|
||||
@ -500,6 +921,12 @@ test_expect_success 'checkout completes ref names' '
|
||||
EOF
|
||||
'
|
||||
|
||||
test_expect_success 'git -C <path> checkout uses the right repo' '
|
||||
test_completion "git -C subdir -C subsubdir -C .. -C ../otherrepo checkout b" <<-\EOF
|
||||
branch-in-other Z
|
||||
EOF
|
||||
'
|
||||
|
||||
test_expect_success 'show completes all refs' '
|
||||
test_completion "git show m" <<-\EOF
|
||||
master Z
|
||||
@ -517,7 +944,7 @@ test_expect_success '<ref>: completes paths' '
|
||||
|
||||
test_expect_success 'complete tree filename with spaces' '
|
||||
echo content >"name with spaces" &&
|
||||
git add . &&
|
||||
git add "name with spaces" &&
|
||||
git commit -m spaces &&
|
||||
test_completion "git show HEAD:nam" <<-\EOF
|
||||
name with spaces Z
|
||||
@ -526,7 +953,7 @@ test_expect_success 'complete tree filename with spaces' '
|
||||
|
||||
test_expect_success 'complete tree filename with metacharacters' '
|
||||
echo content >"name with \${meta}" &&
|
||||
git add . &&
|
||||
git add "name with \${meta}" &&
|
||||
git commit -m meta &&
|
||||
test_completion "git show HEAD:nam" <<-\EOF
|
||||
name with ${meta} Z
|
||||
|
Loading…
Reference in New Issue
Block a user