Re: [PATCH v2] Completion must sort before using uniq
Hi,
Mostly cosmetic suggestions, but it looks OK to me.
On Fri, Nov 23, 2012 at 12:17 PM, Marc Khouzam <marc.khouzam@gmail.com> wrote:
> The user can be presented with invalid completion results
> when trying to complete a 'git checkout' command. This can happen
> when using a branch name prefix that matches multiple remote branches.
> For example if available branches are:
For example; <- separation
Show 10 quoted lines
> master
> remotes/GitHub/maint
> remotes/GitHub/master
> remotes/origin/maint
> remotes/origin/master
>
> When performing completion on 'git checkout ma' the user will be
> given the choices:
> maint
> master
> However, 'git checkout maint' will fail in this case, although
> completion previously said 'maint' was valid.
Space (or continue paragraph).
Show 7 quoted lines
> Furthermore, when performing completion on 'git checkout mai',
> no choices will be suggested. So, the user is first told that the
> branch name 'maint' is valid, but when trying to complete 'mai'
> into 'maint', that completion is no longer valid.
>
> The completion results should never propose 'maint' as a valid
> branch name, since 'git checkout' will refuse it.
With this explanation the patch looks good to me.
Show 16 quoted lines
> The reason for this bug is that the uniq program only
> works with sorted input. The man page states
> "uniq prints the unique lines in a sorted file".
>
> When __git_refs uses the guess heuristic employed by checkout for
> tracking branches it wants to consider remote branches but only if
> the branch name is unique. To do that, it calls 'uniq -u'. However
> the input given to 'uniq -u' is not sorted.
>
> Therefore, in the above example, when dealing with 'git checkout ma',
> "__git_refs '' 1" will find the following list:
> master
> maint
> master
> maint
> master
> which, when passed to 'uniq -u' will remain the same. Therefore
> 'maint' will be wrongly suggested as a valid option.
> When dealing with 'git checkout mai', the list will be:
> maint
> maint
Show 5 quoted lines
> which happens to be sorted and will be emptied by 'uniq -u',
> properly ignoring 'maint'.
>
> A solution for preventing the completion script from suggesting
> such invalid branch names is to first call 'sort' and then 'uniq -u'.
--
Felipe Contreras