git-completion.bash 19.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#
# bash completion support for core Git.
#
# Copyright (C) 2006 Shawn Pearce
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
#
# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#
# To use these routines:
#
#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
#    2) Added the following line to your .bashrc:
#        source ~/.git-completion.sh
#
21 22 23 24 25 26 27
#    3) You may want to make sure the git executable is available
#       in your PATH before this script is sourced, as some caching
#       is performed while the script loads.  If git isn't found
#       at source time then all lookups will be done on demand,
#       which may be slightly slower.
#
#    4) Consider changing your PS1 to also show the current branch:
28 29 30 31 32 33
#        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
#
#       The argument to __git_ps1 will be displayed only if you
#       are currently in a git repository.  The %s token will be
#       the name of the current branch.
#
34

35 36
__gitdir ()
{
37 38 39 40 41 42 43 44 45 46 47 48 49
	if [ -z "$1" ]; then
		if [ -n "$__git_dir" ]; then
			echo "$__git_dir"
		elif [ -d .git ]; then
			echo .git
		else
			git rev-parse --git-dir 2>/dev/null
		fi
	elif [ -d "$1/.git" ]; then
		echo "$1/.git"
	else
		echo "$1"
	fi
50 51
}

52 53 54 55 56 57 58 59 60 61 62 63
__git_ps1 ()
{
	local b="$(git symbolic-ref HEAD 2>/dev/null)"
	if [ -n "$b" ]; then
		if [ -n "$1" ]; then
			printf "$1" "${b##refs/heads/}"
		else
			printf " (%s)" "${b##refs/heads/}"
		fi
	fi
}

64 65
__git_heads ()
{
66
	local cmd i is_hash=y dir="$(__gitdir "$1")"
67 68 69 70 71 72 73 74
	if [ -d "$dir" ]; then
		for i in $(git --git-dir="$dir" \
			for-each-ref --format='%(refname)' \
			refs/heads ); do
			echo "${i#refs/heads/}"
		done
		return
	fi
75
	for i in $(git-ls-remote "$1" 2>/dev/null); do
76 77 78 79 80 81 82 83 84
		case "$is_hash,$i" in
		y,*) is_hash=n ;;
		n,*^{}) is_hash=y ;;
		n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
		n,*) is_hash=y; echo "$i" ;;
		esac
	done
}

85 86
__git_refs ()
{
87
	local cmd i is_hash=y dir="$(__gitdir "$1")"
88
	if [ -d "$dir" ]; then
89 90 91 92 93 94 95 96 97 98 99 100
		if [ -e "$dir/HEAD" ]; then echo HEAD; fi
		for i in $(git --git-dir="$dir" \
			for-each-ref --format='%(refname)' \
			refs/tags refs/heads refs/remotes); do
			case "$i" in
				refs/tags/*)    echo "${i#refs/tags/}" ;;
				refs/heads/*)   echo "${i#refs/heads/}" ;;
				refs/remotes/*) echo "${i#refs/remotes/}" ;;
				*)              echo "$i" ;;
			esac
		done
		return
101
	fi
102
	for i in $(git-ls-remote "$dir" 2>/dev/null); do
103 104 105 106 107
		case "$is_hash,$i" in
		y,*) is_hash=n ;;
		n,*^{}) is_hash=y ;;
		n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
		n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
108
		n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
109 110 111 112 113 114 115
		n,*) is_hash=y; echo "$i" ;;
		esac
	done
}

__git_refs2 ()
{
116 117 118
	local i
	for i in $(__git_refs "$1"); do
		echo "$i:$i"
119 120 121
	done
}

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
__git_refs_remotes ()
{
	local cmd i is_hash=y
	for i in $(git-ls-remote "$1" 2>/dev/null); do
		case "$is_hash,$i" in
		n,refs/heads/*)
			is_hash=y
			echo "$i:refs/remotes/$1/${i#refs/heads/}"
			;;
		y,*) is_hash=n ;;
		n,*^{}) is_hash=y ;;
		n,refs/tags/*) is_hash=y;;
		n,*) is_hash=y; ;;
		esac
	done
}

139 140
__git_remotes ()
{
141
	local i ngoff IFS=$'\n' d="$(__gitdir)"
142
	shopt -q nullglob || ngoff=1
143
	shopt -s nullglob
144 145
	for i in "$d/remotes"/*; do
		echo ${i#$d/remotes/}
146
	done
147
	[ "$ngoff" ] && shopt -u nullglob
148
	for i in $(git --git-dir="$d" config --list); do
149 150 151 152 153 154 155
		case "$i" in
		remote.*.url=*)
			i="${i#remote.}"
			echo "${i/.url=*/}"
			;;
		esac
	done
156 157
}

158 159
__git_merge_strategies ()
{
160 161 162 163
	if [ -n "$__git_merge_strategylist" ]; then
		echo "$__git_merge_strategylist"
		return
	fi
164 165 166 167 168 169 170
	sed -n "/^all_strategies='/{
		s/^all_strategies='//
		s/'//
		p
		q
		}" "$(git --exec-path)/git-merge"
}
171 172
__git_merge_strategylist=
__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
173

174 175
__git_complete_file ()
{
176
	local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
177 178
	case "$cur" in
	?*:*)
179 180
		ref="${cur%%:*}"
		cur="${cur#*:}"
181 182
		case "$cur" in
		?*/*)
183 184
			pfx="${cur%/*}"
			cur="${cur##*/}"
185 186 187 188 189 190 191 192
			ls="$ref:$pfx"
			pfx="$pfx/"
			;;
		*)
			ls="$ref"
			;;
	    esac
		COMPREPLY=($(compgen -P "$pfx" \
193
			-W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
194 195 196 197 198 199 200 201 202
				| sed '/^100... blob /s,^.*	,,
				       /^040000 tree /{
				           s,^.*	,,
				           s,$,/,
				       }
				       s/^.*	//')" \
			-- "$cur"))
		;;
	*)
203
		COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
204 205 206 207
		;;
	esac
}

208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
__git_complete_revlist ()
{
	local pfx cur="${COMP_WORDS[COMP_CWORD]}"
	case "$cur" in
	*...*)
		pfx="${cur%...*}..."
		cur="${cur#*...}"
		COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
		;;
	*..*)
		pfx="${cur%..*}.."
		cur="${cur#*..}"
		COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
		;;
	*)
		COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
		;;
	esac
}

228 229
__git_commands ()
{
230 231 232 233
	if [ -n "$__git_commandlist" ]; then
		echo "$__git_commandlist"
		return
	fi
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
	local i IFS=" "$'\n'
	for i in $(git help -a|egrep '^ ')
	do
		case $i in
		check-ref-format) : plumbing;;
		commit-tree)      : plumbing;;
		convert-objects)  : plumbing;;
		cvsserver)        : daemon;;
		daemon)           : daemon;;
		fetch-pack)       : plumbing;;
		hash-object)      : plumbing;;
		http-*)           : transport;;
		index-pack)       : plumbing;;
		local-fetch)      : plumbing;;
		mailinfo)         : plumbing;;
		mailsplit)        : plumbing;;
		merge-*)          : plumbing;;
		mktree)           : plumbing;;
		mktag)            : plumbing;;
		pack-objects)     : plumbing;;
		pack-redundant)   : plumbing;;
		pack-refs)        : plumbing;;
		parse-remote)     : plumbing;;
		patch-id)         : plumbing;;
		peek-remote)      : plumbing;;
		read-tree)        : plumbing;;
		receive-pack)     : plumbing;;
		rerere)           : plumbing;;
		rev-list)         : plumbing;;
		rev-parse)        : plumbing;;
		runstatus)        : plumbing;;
		sh-setup)         : internal;;
		shell)            : daemon;;
		send-pack)        : plumbing;;
		show-index)       : plumbing;;
		ssh-*)            : transport;;
		stripspace)       : plumbing;;
		symbolic-ref)     : plumbing;;
		unpack-file)      : plumbing;;
		unpack-objects)   : plumbing;;
		update-ref)       : plumbing;;
		update-server-info) : daemon;;
		upload-archive)   : plumbing;;
		upload-pack)      : plumbing;;
		write-tree)       : plumbing;;
		*) echo $i;;
		esac
	done
}
283 284
__git_commandlist=
__git_commandlist="$(__git_commands 2>/dev/null)"
285

286 287
__git_aliases ()
{
288
	local i IFS=$'\n'
289
	for i in $(git --git-dir="$(__gitdir)" config --list); do
290 291 292 293 294 295 296
		case "$i" in
		alias.*)
			i="${i#alias.}"
			echo "${i/=*/}"
			;;
		esac
	done
297 298 299 300
}

__git_aliased_command ()
{
301
	local word cmdline=$(git --git-dir="$(__gitdir)" \
302
		config --get "alias.$1")
303 304 305 306 307 308 309 310
	for word in $cmdline; do
		if [ "${word##-*}" ]; then
			echo $word
			return
		fi
	done
}

311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
__git_whitespacelist="nowarn warn error error-all strip"

_git_am ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	if [ -d .dotest ]; then
		COMPREPLY=($(compgen -W "
			--skip --resolved
			" -- "$cur"))
		return
	fi
	case "$cur" in
	--whitespace=*)
		COMPREPLY=($(compgen -W "$__git_whitespacelist" \
			-- "${cur##--whitespace=}"))
		return
		;;
	--*)
		COMPREPLY=($(compgen -W "
			--signoff --utf8 --binary --3way --interactive
			--whitespace=
			" -- "$cur"))
		return
	esac
	COMPREPLY=()
}

_git_apply ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	case "$cur" in
	--whitespace=*)
		COMPREPLY=($(compgen -W "$__git_whitespacelist" \
			-- "${cur##--whitespace=}"))
		return
		;;
	--*)
		COMPREPLY=($(compgen -W "
			--stat --numstat --summary --check --index
			--cached --index-info --reverse --reject --unidiff-zero
			--apply --no-add --exclude=
			--whitespace= --inaccurate-eof --verbose
			" -- "$cur"))
		return
	esac
	COMPREPLY=()
}

359 360 361
_git_branch ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
362
	COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
}

_git_cat_file ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	case "${COMP_WORDS[0]},$COMP_CWORD" in
	git-cat-file*,1)
		COMPREPLY=($(compgen -W "-p -t blob tree commit tag" -- "$cur"))
		;;
	git,2)
		COMPREPLY=($(compgen -W "-p -t blob tree commit tag" -- "$cur"))
		;;
	*)
		__git_complete_file
		;;
	esac
}

_git_checkout ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
384
	COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
385 386
}

387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
_git_cherry_pick ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	case "$cur" in
	--*)
		COMPREPLY=($(compgen -W "
			--edit --no-commit
			" -- "$cur"))
		;;
	*)
		COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
		;;
	esac
}

402 403 404 405 406 407 408 409 410 411 412 413 414 415
_git_commit ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	case "$cur" in
	--*)
		COMPREPLY=($(compgen -W "
			--all --author= --signoff --verify --no-verify
			--edit --amend --include --only
			" -- "$cur"))
		return
	esac
	COMPREPLY=()
}

416 417 418 419 420 421 422 423
_git_diff ()
{
	__git_complete_file
}

_git_diff_tree ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
424
	COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
}

_git_fetch ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"

	case "${COMP_WORDS[0]},$COMP_CWORD" in
	git-fetch*,1)
		COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
		;;
	git,2)
		COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
		;;
	*)
		case "$cur" in
		*:*)
441
			cur="${cur#*:}"
442
			COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
443 444 445 446 447 448 449 450 451 452 453 454 455 456
			;;
		*)
			local remote
			case "${COMP_WORDS[0]}" in
			git-fetch) remote="${COMP_WORDS[1]}" ;;
			git)       remote="${COMP_WORDS[2]}" ;;
			esac
			COMPREPLY=($(compgen -W "$(__git_refs2 "$remote")" -- "$cur"))
			;;
		esac
		;;
	esac
}

457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
_git_format_patch ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	case "$cur" in
	--*)
		COMPREPLY=($(compgen -W "
			--stdout --attach --thread
			--output-directory
			--numbered --start-number
			--keep-subject
			--signoff
			--in-reply-to=
			--full-index --binary
			" -- "$cur"))
		return
		;;
	esac
	__git_complete_revlist
}

477 478 479 480 481 482 483 484 485 486 487 488 489
_git_ls_remote ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
}

_git_ls_tree ()
{
	__git_complete_file
}

_git_log ()
{
490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512
	local cur="${COMP_WORDS[COMP_CWORD]}"
	case "$cur" in
	--pretty=*)
		COMPREPLY=($(compgen -W "
			oneline short medium full fuller email raw
			" -- "${cur##--pretty=}"))
		return
		;;
	--*)
		COMPREPLY=($(compgen -W "
			--max-count= --max-age= --since= --after=
			--min-age= --before= --until=
			--root --not --topo-order --date-order
			--no-merges
			--abbrev-commit --abbrev=
			--relative-date
			--author= --committer= --grep=
			--all-match
			--pretty= --name-status --name-only
			" -- "$cur"))
		return
		;;
	esac
513
	__git_complete_revlist
514 515
}

516 517 518
_git_merge ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
519 520 521 522 523
	case "${COMP_WORDS[COMP_CWORD-1]}" in
	-s|--strategy)
		COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
		return
	esac
524
	case "$cur" in
525 526 527 528 529
	--strategy=*)
		COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
			-- "${cur##--strategy=}"))
		return
		;;
530 531
	--*)
		COMPREPLY=($(compgen -W "
532
			--no-commit --no-summary --squash --strategy
533 534 535
			" -- "$cur"))
		return
	esac
536
	COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
537 538
}

539 540 541
_git_merge_base ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
542
	COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
543 544
}

545 546 547 548 549 550
_git_name_rev ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	COMPREPLY=($(compgen -W "--tags --all --stdin" -- "$cur"))
}

551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
_git_pull ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"

	case "${COMP_WORDS[0]},$COMP_CWORD" in
	git-pull*,1)
		COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
		;;
	git,2)
		COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
		;;
	*)
		local remote
		case "${COMP_WORDS[0]}" in
		git-pull)  remote="${COMP_WORDS[1]}" ;;
		git)       remote="${COMP_WORDS[2]}" ;;
		esac
		COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
		;;
	esac
}

_git_push ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"

	case "${COMP_WORDS[0]},$COMP_CWORD" in
	git-push*,1)
		COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
		;;
	git,2)
		COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
		;;
	*)
		case "$cur" in
		*:*)
			local remote
			case "${COMP_WORDS[0]}" in
			git-push)  remote="${COMP_WORDS[1]}" ;;
			git)       remote="${COMP_WORDS[2]}" ;;
			esac
592
			cur="${cur#*:}"
593 594 595
			COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
			;;
		*)
596
			COMPREPLY=($(compgen -W "$(__git_refs2)" -- "$cur"))
597 598 599 600 601 602
			;;
		esac
		;;
	esac
}

603 604 605 606 607 608 609 610 611
_git_rebase ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	if [ -d .dotest ]; then
		COMPREPLY=($(compgen -W "
			--continue --skip --abort
			" -- "$cur"))
		return
	fi
612 613 614 615 616
	case "${COMP_WORDS[COMP_CWORD-1]}" in
	-s|--strategy)
		COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
		return
	esac
617
	case "$cur" in
618 619 620 621 622
	--strategy=*)
		COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
			-- "${cur##--strategy=}"))
		return
		;;
623 624 625 626 627 628 629 630 631
	--*)
		COMPREPLY=($(compgen -W "
			--onto --merge --strategy
			" -- "$cur"))
		return
	esac
	COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
}

632
_git_config ()
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	local prv="${COMP_WORDS[COMP_CWORD-1]}"
	case "$prv" in
	branch.*.remote)
		COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
		return
		;;
	branch.*.merge)
		COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
		return
		;;
	remote.*.fetch)
		local remote="${prv#remote.}"
		remote="${remote%.fetch}"
		COMPREPLY=($(compgen -W "$(__git_refs_remotes "$remote")" \
			-- "$cur"))
		return
		;;
	remote.*.push)
		local remote="${prv#remote.}"
		remote="${remote%.push}"
		COMPREPLY=($(compgen -W "$(git --git-dir="$(__gitdir)" \
			for-each-ref --format='%(refname):%(refname)' \
			refs/heads)" -- "$cur"))
		return
		;;
	*.*)
		COMPREPLY=()
		return
		;;
	esac
	case "$cur" in
	--*)
		COMPREPLY=($(compgen -W "
			--global --list --replace-all
			--get --get-all --get-regexp
			--unset --unset-all
			" -- "$cur"))
		return
		;;
	branch.*.*)
		local pfx="${cur%.*}."
		cur="${cur##*.}"
		COMPREPLY=($(compgen -P "$pfx" -W "remote merge" -- "$cur"))
		return
		;;
	branch.*)
		local pfx="${cur%.*}."
		cur="${cur#*.}"
		COMPREPLY=($(compgen -P "$pfx" -S . \
			-W "$(__git_heads)" -- "$cur"))
		return
		;;
	remote.*.*)
		local pfx="${cur%.*}."
		cur="${cur##*.}"
		COMPREPLY=($(compgen -P "$pfx" -W "url fetch push" -- "$cur"))
		return
		;;
	remote.*)
		local pfx="${cur%.*}."
		cur="${cur#*.}"
		COMPREPLY=($(compgen -P "$pfx" -S . \
			-W "$(__git_remotes)" -- "$cur"))
		return
		;;
	esac
	COMPREPLY=($(compgen -W "
		apply.whitespace
		core.fileMode
		core.gitProxy
		core.ignoreStat
		core.preferSymlinkRefs
		core.logAllRefUpdates
		core.repositoryFormatVersion
		core.sharedRepository
		core.warnAmbiguousRefs
		core.compression
		core.legacyHeaders
		i18n.commitEncoding
714
		i18n.logOutputEncoding
715
		diff.color
716
		color.diff
717 718 719
		diff.renameLimit
		diff.renames
		pager.color
720
		color.pager
721
		status.color
722
		color.status
723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748
		log.showroot
		show.difftree
		showbranch.default
		whatchanged.difftree
		http.sslVerify
		http.sslCert
		http.sslKey
		http.sslCAInfo
		http.sslCAPath
		http.maxRequests
		http.lowSpeedLimit http.lowSpeedTime
		http.noEPSV
		pack.window
		repack.useDeltaBaseOffset
		pull.octopus pull.twohead
		merge.summary
		receive.unpackLimit
		receive.denyNonFastForwards
		user.name user.email
		tar.umask
		gitcvs.enabled
		gitcvs.logfile
		branch. remote.
	" -- "$cur"))
}

749 750 751 752
_git_reset ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	local opt="--mixed --hard --soft"
753
	COMPREPLY=($(compgen -W "$opt $(__git_refs)" -- "$cur"))
754 755
}

756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773
_git_show ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
	case "$cur" in
	--pretty=*)
		COMPREPLY=($(compgen -W "
			oneline short medium full fuller email raw
			" -- "${cur##--pretty=}"))
		return
		;;
	--*)
		COMPREPLY=($(compgen -W "--pretty=" -- "$cur"))
		return
		;;
	esac
	__git_complete_file
}

774 775
_git ()
{
776 777 778 779 780 781 782 783 784 785 786 787 788 789
	local i c=1 command __git_dir

	while [ $c -lt $COMP_CWORD ]; do
		i="${COMP_WORDS[c]}"
		case "$i" in
		--git-dir=*) __git_dir="${i#--git-dir=}" ;;
		--bare)      __git_dir="." ;;
		--version|--help|-p|--paginate) ;;
		*) command="$i"; break ;;
		esac
		c=$((++c))
	done

	if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
790 791 792 793 794
		COMPREPLY=($(compgen -W "
			--git-dir= --version --exec-path
			$(__git_commands)
			$(__git_aliases)
			" -- "${COMP_WORDS[COMP_CWORD]}"))
795 796
		return;
	fi
797

798 799
	local expansion=$(__git_aliased_command "$command")
	[ "$expansion" ] && command="$expansion"
800

801
	case "$command" in
802 803
	am)          _git_am ;;
	apply)       _git_apply ;;
804 805 806
	branch)      _git_branch ;;
	cat-file)    _git_cat_file ;;
	checkout)    _git_checkout ;;
807
	cherry-pick) _git_cherry_pick ;;
808
	commit)      _git_commit ;;
809
	config)      _git_config ;;
810 811 812
	diff)        _git_diff ;;
	diff-tree)   _git_diff_tree ;;
	fetch)       _git_fetch ;;
813
	format-patch) _git_format_patch ;;
814 815 816
	log)         _git_log ;;
	ls-remote)   _git_ls_remote ;;
	ls-tree)     _git_ls_tree ;;
817
	merge)       _git_merge;;
818
	merge-base)  _git_merge_base ;;
819
	name-rev)    _git_name_rev ;;
820 821
	pull)        _git_pull ;;
	push)        _git_push ;;
822
	rebase)      _git_rebase ;;
823
	repo-config) _git_config ;;
824
	reset)       _git_reset ;;
825
	show)        _git_show ;;
826 827 828 829
	show-branch) _git_log ;;
	whatchanged) _git_log ;;
	*)           COMPREPLY=() ;;
	esac
830 831 832 833 834
}

_gitk ()
{
	local cur="${COMP_WORDS[COMP_CWORD]}"
835
	COMPREPLY=($(compgen -W "--all $(__git_refs)" -- "$cur"))
836 837 838 839
}

complete -o default -o nospace -F _git git
complete -o default            -F _gitk gitk
840 841
complete -o default            -F _git_am git-am
complete -o default            -F _git_apply git-apply
842 843 844
complete -o default            -F _git_branch git-branch
complete -o default -o nospace -F _git_cat_file git-cat-file
complete -o default            -F _git_checkout git-checkout
845
complete -o default            -F _git_cherry_pick git-cherry-pick
846
complete -o default            -F _git_commit git-commit
847 848 849
complete -o default -o nospace -F _git_diff git-diff
complete -o default            -F _git_diff_tree git-diff-tree
complete -o default -o nospace -F _git_fetch git-fetch
850
complete -o default -o nospace -F _git_format_patch git-format-patch
851 852 853
complete -o default -o nospace -F _git_log git-log
complete -o default            -F _git_ls_remote git-ls-remote
complete -o default -o nospace -F _git_ls_tree git-ls-tree
854
complete -o default            -F _git_merge git-merge
855
complete -o default            -F _git_merge_base git-merge-base
856
complete -o default            -F _git_name_rev git-name-rev
857 858
complete -o default -o nospace -F _git_pull git-pull
complete -o default -o nospace -F _git_push git-push
859
complete -o default            -F _git_rebase git-rebase
860
complete -o default            -F _git_config git-config
861
complete -o default            -F _git_reset git-reset
862
complete -o default -o nospace -F _git_show git-show
863
complete -o default -o nospace -F _git_log git-show-branch
864 865 866 867 868 869
complete -o default -o nospace -F _git_log git-whatchanged

# The following are necessary only for Cygwin, and only are needed
# when the user has tab-completed the executable name and consequently
# included the '.exe' suffix.
#
870
if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
871
complete -o default            -F _git_apply git-apply.exe
872
complete -o default -o nospace -F _git git.exe
873
complete -o default            -F _git_branch git-branch.exe
874 875 876
complete -o default -o nospace -F _git_cat_file git-cat-file.exe
complete -o default -o nospace -F _git_diff git-diff.exe
complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
877
complete -o default -o nospace -F _git_format_patch git-format-patch.exe
878 879 880
complete -o default -o nospace -F _git_log git-log.exe
complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
complete -o default            -F _git_merge_base git-merge-base.exe
881
complete -o default            -F _git_name_rev git-name-rev.exe
882
complete -o default -o nospace -F _git_push git-push.exe
883
complete -o default            -F _git_config git-config
884
complete -o default -o nospace -F _git_show git-show.exe
885
complete -o default -o nospace -F _git_log git-show-branch.exe
886
complete -o default -o nospace -F _git_log git-whatchanged.exe
887
fi