Subject: Re: [PATCH v3 3/5] completion: move to maintain define-before-use

From: Patrick Steinhardt <[email-masked]>
Date: Fri, 19 Jan 2024 08:04:55 +0100

On Thu, Jan 18, 2024 at 11:43:21AM -0900, Britton Leo Kerin wrote:

Same here: please explain what the problem is that this patch is trying
to solve in the commit message.

Also, as far as I can see, this patch is actually a prerequisite for the
preceding patch where we already call `__git_complete_log_opts ()`. So a
better way to structure this would be to introduce and move
`__git_complete_log_opts ()` in a preparatory patch, and only then start
calling the function for "visualize" in a subsequent patch.

Patrick

> Signed-off-by: Britton Leo Kerin <[email-masked]>
> ---
>  contrib/completion/git-completion.bash | 269 ++++++++++++-------------
>  1 file changed, 134 insertions(+), 135 deletions(-)
> 
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index c16aded36c..63ca8082a4 100644
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -1445,6 +1445,140 @@ _git_archive ()
>  	__git_complete_file
>  }
>  
> +# Options that go well for log, shortlog and gitk
> +__git_log_common_options="
> +	--not --all
> +	--branches --tags --remotes
> +	--first-parent --merges --no-merges
> +	--max-count=
> +	--max-age= --since= --after=
> +	--min-age= --until= --before=
> +	--min-parents= --max-parents=
> +	--no-min-parents --no-max-parents
> +"
> +# Options that go well for log and gitk (not shortlog)
> +__git_log_gitk_options="
> +	--dense --sparse --full-history
> +	--simplify-merges --simplify-by-decoration
> +	--left-right --notes --no-notes
> +"
> +# Options that go well for log and shortlog (not gitk)
> +__git_log_shortlog_options="
> +	--author= --committer= --grep=
> +	--all-match --invert-grep
> +"
> +# Options accepted by log and show
> +__git_log_show_options="
> +	--diff-merges --diff-merges= --no-diff-merges --dd --remerge-diff
> +"
> +
> +__git_diff_merges_opts="off none on first-parent 1 separate m combined c dense-combined cc remerge r"
> +
> +__git_log_pretty_formats="oneline short medium full fuller reference email raw format: tformat: mboxrd"
> +__git_log_date_formats="relative iso8601 iso8601-strict rfc2822 short local default human raw unix auto: format:"
> +
> +# Check for only porcelain (i.e. not git-rev-list) option (not argument)
> +# and selected option argument completions for git-log options and if any
> +# are found put them in COMPREPLY.  COMPREPLY must be empty at the start,
> +# and will be empty on return if no candidates are found.
> +__git_complete_log_opts ()
> +{
> +	[ -z "$COMPREPLY" ] || return 1   # Precondition
> +
> +	local merge=""
> +	if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
> +		merge="--merge"
> +	fi
> +	case "$prev,$cur" in
> +	-L,:*:*)
> +		return	# fall back to Bash filename completion
> +		;;
> +	-L,:*)
> +		__git_complete_symbol --cur="${cur#:}" --sfx=":"
> +		return
> +		;;
> +	-G,*|-S,*)
> +		__git_complete_symbol
> +		return
> +		;;
> +	esac
> +	case "$cur" in
> +	--pretty=*|--format=*)
> +		__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
> +			" "" "${cur#*=}"
> +		return
> +		;;
> +	--date=*)
> +		__gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
> +		return
> +		;;
> +	--decorate=*)
> +		__gitcomp "full short no" "" "${cur##--decorate=}"
> +		return
> +		;;
> +	--diff-algorithm=*)
> +		__gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
> +		return
> +		;;
> +	--submodule=*)
> +		__gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
> +		return
> +		;;
> +	--ws-error-highlight=*)
> +		__gitcomp "$__git_ws_error_highlight_opts" "" "${cur##--ws-error-highlight=}"
> +		return
> +		;;
> +	--no-walk=*)
> +		__gitcomp "sorted unsorted" "" "${cur##--no-walk=}"
> +		return
> +		;;
> +	--diff-merges=*)
> +                __gitcomp "$__git_diff_merges_opts" "" "${cur##--diff-merges=}"
> +                return
> +                ;;
> +	--*)
> +		__gitcomp "
> +			$__git_log_common_options
> +			$__git_log_shortlog_options
> +			$__git_log_gitk_options
> +			$__git_log_show_options
> +			--root --topo-order --date-order --reverse
> +			--follow --full-diff
> +			--abbrev-commit --no-abbrev-commit --abbrev=
> +			--relative-date --date=
> +			--pretty= --format= --oneline
> +			--show-signature
> +			--cherry-mark
> +			--cherry-pick
> +			--graph
> +			--decorate --decorate= --no-decorate
> +			--walk-reflogs
> +			--no-walk --no-walk= --do-walk
> +			--parents --children
> +			--expand-tabs --expand-tabs= --no-expand-tabs
> +			$merge
> +			$__git_diff_common_options
> +			"
> +		return
> +		;;
> +	-L:*:*)
> +		return	# fall back to Bash filename completion
> +		;;
> +	-L:*)
> +		__git_complete_symbol --cur="${cur#-L:}" --sfx=":"
> +		return
> +		;;
> +	-G*)
> +		__git_complete_symbol --pfx="-G" --cur="${cur#-G}"
> +		return
> +		;;
> +	-S*)
> +		__git_complete_symbol --pfx="-S" --cur="${cur#-S}"
> +		return
> +		;;
> +	esac
> +}
> +
>  _git_bisect ()
>  {
>  	__git_has_doubledash && return
> @@ -2052,141 +2186,6 @@ _git_ls_tree ()
>  	__git_complete_file
>  }
>  
> -# Options that go well for log, shortlog and gitk
> -__git_log_common_options="
> -	--not --all
> -	--branches --tags --remotes
> -	--first-parent --merges --no-merges
> -	--max-count=
> -	--max-age= --since= --after=
> -	--min-age= --until= --before=
> -	--min-parents= --max-parents=
> -	--no-min-parents --no-max-parents
> -"
> -# Options that go well for log and gitk (not shortlog)
> -__git_log_gitk_options="
> -	--dense --sparse --full-history
> -	--simplify-merges --simplify-by-decoration
> -	--left-right --notes --no-notes
> -"
> -# Options that go well for log and shortlog (not gitk)
> -__git_log_shortlog_options="
> -	--author= --committer= --grep=
> -	--all-match --invert-grep
> -"
> -# Options accepted by log and show
> -__git_log_show_options="
> -	--diff-merges --diff-merges= --no-diff-merges --dd --remerge-diff
> -"
> -
> -__git_diff_merges_opts="off none on first-parent 1 separate m combined c dense-combined cc remerge r"
> -
> -__git_log_pretty_formats="oneline short medium full fuller reference email raw format: tformat: mboxrd"
> -__git_log_date_formats="relative iso8601 iso8601-strict rfc2822 short local default human raw unix auto: format:"
> -
> -
> -# Check for only porcelain (i.e. not git-rev-list) option (not argument)
> -# and selected option argument completions for git-log options and if any
> -# are found put them in COMPREPLY.  COMPREPLY must be empty at the start,
> -# and will be empty on return if no candidates are found.
> -__git_complete_log_opts ()
> -{
> -	[ -z "$COMPREPLY" ] || return 1   # Precondition
> -
> -	local merge=""
> -	if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
> -		merge="--merge"
> -	fi
> -	case "$prev,$cur" in
> -	-L,:*:*)
> -		return	# fall back to Bash filename completion
> -		;;
> -	-L,:*)
> -		__git_complete_symbol --cur="${cur#:}" --sfx=":"
> -		return
> -		;;
> -	-G,*|-S,*)
> -		__git_complete_symbol
> -		return
> -		;;
> -	esac
> -	case "$cur" in
> -	--pretty=*|--format=*)
> -		__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
> -			" "" "${cur#*=}"
> -		return
> -		;;
> -	--date=*)
> -		__gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
> -		return
> -		;;
> -	--decorate=*)
> -		__gitcomp "full short no" "" "${cur##--decorate=}"
> -		return
> -		;;
> -	--diff-algorithm=*)
> -		__gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
> -		return
> -		;;
> -	--submodule=*)
> -		__gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
> -		return
> -		;;
> -	--ws-error-highlight=*)
> -		__gitcomp "$__git_ws_error_highlight_opts" "" "${cur##--ws-error-highlight=}"
> -		return
> -		;;
> -	--no-walk=*)
> -		__gitcomp "sorted unsorted" "" "${cur##--no-walk=}"
> -		return
> -		;;
> -	--diff-merges=*)
> -                __gitcomp "$__git_diff_merges_opts" "" "${cur##--diff-merges=}"
> -                return
> -                ;;
> -	--*)
> -		__gitcomp "
> -			$__git_log_common_options
> -			$__git_log_shortlog_options
> -			$__git_log_gitk_options
> -			$__git_log_show_options
> -			--root --topo-order --date-order --reverse
> -			--follow --full-diff
> -			--abbrev-commit --no-abbrev-commit --abbrev=
> -			--relative-date --date=
> -			--pretty= --format= --oneline
> -			--show-signature
> -			--cherry-mark
> -			--cherry-pick
> -			--graph
> -			--decorate --decorate= --no-decorate
> -			--walk-reflogs
> -			--no-walk --no-walk= --do-walk
> -			--parents --children
> -			--expand-tabs --expand-tabs= --no-expand-tabs
> -			$merge
> -			$__git_diff_common_options
> -			"
> -		return
> -		;;
> -	-L:*:*)
> -		return	# fall back to Bash filename completion
> -		;;
> -	-L:*)
> -		__git_complete_symbol --cur="${cur#-L:}" --sfx=":"
> -		return
> -		;;
> -	-G*)
> -		__git_complete_symbol --pfx="-G" --cur="${cur#-G}"
> -		return
> -		;;
> -	-S*)
> -		__git_complete_symbol --pfx="-S" --cur="${cur#-S}"
> -		return
> -		;;
> -	esac
> -}
> -
>  _git_log ()
>  {
>  	__git_has_doubledash && return
> -- 
> 2.43.0
>