From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH 0/8] More sensible checkout/switch/restore code refactoring
Date: Fri, 28 Aug 2026 15:51:58 -0700 [thread overview]
Message-ID: <20260828225206.310500-1-gitster@pobox.com> (raw)
In-Reply-To: <xmqqh5kd3lm3.fsf@gitster.g>
In the beginning, there was only 'git checkout'. We then introduced
'git switch' and 'git restore', borrowing as much original code as
possible from the implementation of 'git checkout'.
Unfortunately, this has left the code in a strange shape. Had we
started from separate implementations for 'switch' and 'restore'
then later merged them into 'checkout', we would not have arrived at
a design where three front-end routines, cmd_checkout(),
cmd_switch(), and cmd_restore(), funnel into a single monolithic
choke point in checkout_main(), which then determines whether we are
checking out a branch or paths, and dispatches to checkout_branch()
or checkout_paths().
This series is an attempt to repartition the code into a better
shape. Because checkout_branch() and checkout_paths() already exist
as two reusable helper functions, with sufficient refactoring of
checkout_main(), the two newer entry points, cmd_switch() and
cmd_restore(), can parse command-line arguments and configuration
settings and jump straight into checkout_branch() or
checkout_paths() respectively, without worrying about the other path.
Of course, cmd_checkout() still needs to decide whether to check out
a branch or a set of paths and dispatch between these two backends.
The series begins with three fairly isolated cleanups that are worth
making on their own, even if we do not follow through with the rest
of the series. Patches 4 and 5 then refactor various utility
functions out of existing code paths, and patch 6 uses them to
rewrite the three top-level command entry points to call these
functions without going through checkout_main(). Patch 7 is a
style-only fix done after the dust settles, which was deliberately
kept separate to simplify review.
The final step moves one helper utility out of builtin/checkout.c to
top-level checkout.c as an illustration of the libification discussed
in our recent threads.
Note that I consider this a fairly early and rough draft for
illustration only. There may be a few topics that touch 'git
checkout', and a refactoring of this scale might adversely impact
them, so I will not even merge these patches to 'seen'.
1/8: checkout: pass cb_option explicitly to branch name parsers
2/8: checkout: validate new branch name in checkout_branch()
3/8: checkout: validate stage and merge option compatibility in
checkout_paths()
4/8: checkout: extract option validation and pathspec helpers
5/8: checkout: extract branch setup and tracking helpers
6/8: checkout: restructure switch, restore, and checkout
entrypoints
7/8: checkout: wrap overly long lines
8/8: checkout: move post_checkout_hook() to checkout.c
builtin/checkout.c | 545 +++++++++++++++++++++++----------------------
checkout.c | 22 ++
checkout.h | 8 +
3 files changed, 311 insertions(+), 264 deletions(-)
--
2.55.0-884-g76cf8659c2
next prev parent reply other threads:[~2026-08-28 22:52 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-27 18:29 [PATCH] builtin: replace the_repository parameter in is_bare_repository() Hardik Kumar
2026-08-27 19:09 ` Junio C Hamano
2026-08-27 19:51 ` Junio C Hamano
2026-08-27 20:09 ` Hardik Kumar
2026-08-27 20:28 ` Junio C Hamano
2026-08-27 21:12 ` Ben Knoble
2026-08-27 21:39 ` Junio C Hamano
2026-08-28 11:41 ` D. Ben Knoble
2026-08-28 22:51 ` Junio C Hamano
2026-08-28 22:51 ` Junio C Hamano [this message]
2026-08-28 22:51 ` [PATCH 1/8] checkout: pass cb_option explicitly to branch name parsers Junio C Hamano
2026-08-28 22:52 ` [PATCH 2/8] checkout: validate new branch name in checkout_branch() Junio C Hamano
2026-08-28 22:52 ` [PATCH 3/8] checkout: validate stage and merge option compatibility in checkout_paths() Junio C Hamano
2026-08-28 22:52 ` [PATCH 4/8] checkout: extract option validation and pathspec helpers Junio C Hamano
2026-08-28 22:52 ` [PATCH 5/8] checkout: extract branch setup and tracking helpers Junio C Hamano
2026-08-28 22:52 ` [PATCH 6/8] checkout: restructure switch, restore, and checkout entrypoints Junio C Hamano
2026-08-28 22:52 ` [PATCH 7/8] checkout: wrap overly long lines Junio C Hamano
2026-08-28 22:55 ` Junio C Hamano
2026-08-29 2:06 ` Junio C Hamano
2026-08-28 22:52 ` [PATCH 8/8] checkout: move post_checkout_hook() to checkout.c Junio C Hamano
2026-08-28 22:57 ` Junio C Hamano
2026-08-29 2:05 ` Junio C Hamano
2026-08-29 13:24 ` [PATCH] builtin: replace the_repository parameter in is_bare_repository() D. Ben Knoble
2026-08-27 21:35 ` [PATCH] do not pass "repo" to builtin commmand implementations Junio C Hamano
2026-08-28 9:05 ` Hardik Kumar
2026-08-28 20:59 ` Junio C Hamano
2026-08-28 4:01 ` [PATCH] builtin: replace the_repository parameter in is_bare_repository() Hardik Kumar
2026-08-27 19:56 ` Hardik Kumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260828225206.310500-1-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.