mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-28 13:53:10 +00:00
0ea6703661
Git's pathspec system is kind of annoying: > A pathspec that begins with a colon : has special meaning. In the short form, the leading colon : is followed by zero or more "magic signature" letters (which optionally is terminated by another colon :), and the remainder is the pattern to match against the path. The "magic signature" consists of ASCII symbols that are neither alphanumeric, glob, regex special characters nor colon. The optional colon that terminates the "magic signature" can be omitted if the pattern begins with a character that does not belong to "magic signature" symbol set and is not a colon. So if we complete `:/foo`, that "works" because "f" is alphanumeric and so the "/" is the only magic character here. If, however the filename starts with a magic character, that's used as a magic signature. So we do what the docs say and terminate the magic signature after the "/" (which means "from the repo root"). Fixes #9004
136 lines
3.7 KiB
Fish
136 lines
3.7 KiB
Fish
#RUN: %fish -i %s
|
|
# Note: ^ this is interactive so we test interactive behavior,
|
|
# e.g. the fish_git_prompt variable handlers test `status is-interactive`.
|
|
#REQUIRES: command -v git
|
|
|
|
# Tests run from git (e.g. git rebase --exec 'ninja test'...) inherit a weird git environment.
|
|
# Ensure that no git environment variables are inherited.
|
|
for varname in (set -x | string match 'GIT_*' | string replace -r ' .*' '')
|
|
set -e $varname
|
|
end
|
|
|
|
set -gx GIT_CONFIG_GLOBAL /dev/null # No ~/.gitconfig. We could also override $HOME.
|
|
set -gx GIT_CONFIG_NOSYSTEM true # No /etc/gitconfig
|
|
|
|
# Also ensure that git-core is not in $PATH, as this adds weird git commands like `git-add--interactive`.
|
|
set PATH (string match --invert '*git-core*' -- $PATH)
|
|
|
|
# Do some tests with `git` - completions are interesting,
|
|
# but prompts would also be possible.
|
|
|
|
set -l tmp (mktemp -d)
|
|
|
|
cd $tmp
|
|
git init >/dev/null 2>&1
|
|
|
|
# Commands and descriptions
|
|
# Note: We *can't* list all here because in addition to aliases,
|
|
# git also uses all commands in $PATH called `git-something` as custom commands,
|
|
# so this depends on system state!
|
|
|
|
# First set up a test alias - *before loading the completions*
|
|
git config --local alias.re 'restore --staged'
|
|
|
|
complete -C'git ' | grep '^add'\t
|
|
# (note: actual tab character in the check here)
|
|
#CHECK: add Add file contents to the index
|
|
|
|
touch foo
|
|
|
|
complete -C'git add '
|
|
#CHECK: foo Untracked file
|
|
|
|
complete -C'git add :'
|
|
#CHECK: :/:foo Untracked file
|
|
|
|
git config alias.s status
|
|
complete 'git s --s'
|
|
# CHECK --short
|
|
|
|
# Note: We can't rely on the initial branch because that might be
|
|
# "master", or it could be changed to something else in future!
|
|
git checkout -b newbranch >/dev/null 2>&1
|
|
fish_git_prompt
|
|
echo # the git prompt doesn't print a newline
|
|
#CHECK: (newbranch)
|
|
|
|
set -g __fish_git_prompt_show_informative_status 1
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch|✔)
|
|
|
|
# Informative mode only shows untracked files if explicitly told.
|
|
set -g __fish_git_prompt_showuntrackedfiles 1
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch|…1)
|
|
set -e __fish_git_prompt_show_informative_status
|
|
set -e __fish_git_prompt_showuntrackedfiles
|
|
|
|
# Confirm the mode changes back
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch)
|
|
|
|
# (for some reason stagedstate is only shown with showdirtystate?)
|
|
set -g __fish_git_prompt_showdirtystate 1
|
|
git add foo
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch +)
|
|
|
|
set -g __fish_git_prompt_showuntrackedfiles 1
|
|
touch bananan
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch +%)
|
|
|
|
set -g __fish_git_prompt_status_order untrackedfiles stagedstate
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch %+)
|
|
|
|
set -g __fish_git_prompt_status_order untrackedfiles
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch %)
|
|
|
|
set -e __fish_git_prompt_showuntrackedfiles
|
|
set -e __fish_git_prompt_status_order
|
|
|
|
git -c user.email=banana@example.com -c user.name=banana commit -m foo >/dev/null
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch)
|
|
|
|
echo "test" > foo
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch *)
|
|
|
|
git add foo
|
|
fish_git_prompt
|
|
echo
|
|
#CHECK: (newbranch +)
|
|
|
|
|
|
|
|
# Turn on everything and verify we correctly ignore sus config files.
|
|
set -g __fish_git_prompt_status_order stagedstate invalidstate dirtystate untrackedfiles stashstate
|
|
set -g __fish_git_prompt_showdirtystate 1
|
|
set -g __fish_git_prompt_show_informative_status 1
|
|
set -g __fish_git_prompt_showuntrackedfiles 1
|
|
rm -Rf .git *
|
|
git init >/dev/null 2>&1
|
|
echo -n > ran.txt
|
|
git config core.fsmonitor 'echo fsmonitor >> ran.txt; false'
|
|
git config core.sshCommand 'echo sshCommand >> ran.txt; false'
|
|
git config diff.external 'echo diff >> ran.txt; false'
|
|
touch untracked_file
|
|
fish_git_prompt > /dev/null
|
|
cat ran.txt # should output nothing
|
|
|
|
test "$(complete -C'git re ')" = "$(complete -C'git restore --staged ')"
|
|
or begin
|
|
echo -- Oops re completes unlike restore --staged
|
|
end
|