]> git.ipfire.org Git - thirdparty/git.git/commit
add-patch: classify '@' as a synonym for 'HEAD'
authorGhanshyam Thakkar <shyamthakkar001@gmail.com>
Tue, 13 Feb 2024 00:05:29 +0000 (05:35 +0530)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Feb 2024 22:12:51 +0000 (14:12 -0800)
commit5a8ed3fe450caad740b1c236b3f14151f84bed05
tree0a4667632a488c78b4f3c8ac2c6330d3ba1c3386
parent2a540e432fe5dff3cfa9d3bf7ca56db2ad12ebb9
add-patch: classify '@' as a synonym for 'HEAD'

Currently, (restore, checkout, reset) commands correctly take '@' as a
synonym for 'HEAD'. However, in patch mode different prompts/messages
are given on command line due to patch mode machinery not considering
'@' to be a synonym for 'HEAD' due to literal string comparison with
the word 'HEAD', and therefore assigning patch_mode_($command)_nothead
and triggering reverse mode (-R in diff-index). The NEEDSWORK comment
suggested comparing commit objects to get around this. However, doing
so would also take a non-checked out branch pointing to the same commit
as HEAD, as HEAD. This would cause confusion to the user.

Therefore, after parsing '@', replace it with 'HEAD' as reasonably
early as possible. This also solves another problem of disparity
between 'git checkout HEAD' and 'git checkout @' (latter detaches at
the HEAD commit and the former does not).

Trade-offs:
- Some of the errors would show the revision argument as 'HEAD' when
  given '@'. This should be fine, as most users who probably use '@'
  would be aware that it is a shortcut for 'HEAD' and most probably
  used to use 'HEAD'. There is also relevant documentation in
  'gitrevisions' manpage about '@' being the shortcut for 'HEAD'. Also,
  the simplicity of the solution far outweighs this cost.

- Consider '@' as a shortcut for 'HEAD' even if 'refs/heads/@' exists
  at a different commit. Naming a branch '@' is an obvious foot-gun and
  many existing commands already take '@' for 'HEAD' even if
  'refs/heads/@' exists at a different commit or does not exist at all
  (e.g. 'git log @', 'git push origin @' etc.). Therefore this is an
  existing assumption and should not be a problem.

Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Phillip Wood <phillip.wood123@gmail.com>
Signed-off-by: Ghanshyam Thakkar <shyamthakkar001@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
add-patch.c
builtin/checkout.c
builtin/reset.c
t/t2016-checkout-patch.sh
t/t2020-checkout-detach.sh
t/t2071-restore-patch.sh
t/t7105-reset-patch.sh