From: kristofferhaugsbakk@fastmail.com
To: git@vger.kernel.org
Cc: Kristoffer Haugsbakk <code@khaugsbakk.name>,
Eric Sunshine <sunshine@sunshineco.com>,
peff@peff.net, Patrick Steinhardt <ps@pks.im>
Subject: [PATCH v4 0/7] you-still-use-that??: improve breaking changes troubleshooting
Date: Tue, 9 Sep 2025 21:45:50 +0200 [thread overview]
Message-ID: <cover.1757446619.git.code@khaugsbakk.name> (raw)
In-Reply-To: <cover.1757345711.git.code@khaugsbakk.name>
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
Based on the recent i-still-use-that reports about whatchanged, improve
the error reporting with this command in mind:
1. Give more possible actions instead of just (only) asking them to send
an email
2. Hint how to replace their git-whatchanged(1) use with git-log(1) or
an alias `whatchanged` (you can alias deprecated commands now)
3. Minor documentation changes
4. Add `deprecated` to `git --list-cmds`
§ What the errors now look like
$ /git whatchanged
'git whatchanged' is nominated for removal.
hint: You can replace 'git whatchanged <opts>' with:
hint: git log <opts> --raw --no-merges
hint: Or make an alias:
hint: git config set --global alias.whatchanged 'log --raw --no-merges'
If you still use this command, here's what you can do:
- read https://git-scm.com/docs/BreakingChanges.html
- check if anyone has discussed this on the mailing
list and if they came up with something that can
help you: https://lore.kernel.org/git/?q=git%20whatchanged
- send an email to <git@vger.kernel.org> to let us
know that you still use this command and were unable
to determine a suitable replacement
fatal: refusing to run without --i-still-use-this
$ git pack-redundant
'git pack-redundant' is nominated for removal.
If you still use this command, here's what you can do:
- read https://git-scm.com/docs/BreakingChanges.html
- check if anyone has discussed this on the mailing
list and if they came up with something that can
help you: https://lore.kernel.org/git/?q=git%20pack-redundant
- send an email to <git@vger.kernel.org> to let us
know that you still use this command and were unable
to determine a suitable replacement
fatal: refusing to run without --i-still-use-this
§ Changes in v4
• Patch 1: updated with suggestion from Patrick
• Patch 2: better `is_deprecated_command` implementation suggested by
Junio and Peff
• Minor adjustments based on the previous
Kristoffer Haugsbakk (7):
git: add `deprecated` category to --list-cmds
git: allow alias-shadowing deprecated builtins
t0014: test shadowing of aliases for a sample of builtins
you-still-use-that??: help the user help themselves
whatchanged: tell users the git-log(1) equivalent
whatchanged: remove not-even-shorter clause
BreakingChanges: remove claim about whatchanged reports
Documentation/BreakingChanges.adoc | 2 +-
Documentation/config/alias.adoc | 3 ++-
Documentation/git-whatchanged.adoc | 8 ++++--
Documentation/git.adoc | 3 ++-
builtin/log.c | 8 +++++-
builtin/pack-redundant.c | 2 +-
git-compat-util.h | 2 +-
git.c | 43 ++++++++++++++++++++++++------
t/t0014-alias.sh | 34 +++++++++++++++++++++++
usage.c | 33 ++++++++++++++++++-----
10 files changed, 115 insertions(+), 23 deletions(-)
Interdiff against v3:
diff --git a/git.c b/git.c
index a452ce3f9e9..b3aafebfe4c 100644
--- a/git.c
+++ b/git.c
@@ -52,13 +52,9 @@ const char git_more_info_string[] =
static int use_pager = -1;
-/*
- * 'include_option' and 'exclude_option' are mutually exclusive.
- *
- * The default ('!include_option') is to include everything
- * except those filtered out by 'exclude_option'.
- */
-static void list_builtins(struct string_list *list, unsigned int include_option, unsigned int exclude_option);
+static void list_builtins(struct string_list *list,
+ unsigned int include_option,
+ unsigned int exclude_option);
static void exclude_helpers_from_list(struct string_list *list)
{
@@ -677,18 +673,16 @@ int is_builtin(const char *s)
return !!get_builtin(s);
}
-static void list_builtins(struct string_list *out, unsigned int include_option, unsigned int exclude_option)
+static void list_builtins(struct string_list *out,
+ unsigned int include_option,
+ unsigned int exclude_option)
{
- if (include_option && exclude_option)
- BUG("'include_option' and 'exclude_option' are mutually exclusive");
- if (include_option) {
- for (size_t i = 0; i < ARRAY_SIZE(commands); i++)
- if (commands[i].option & include_option)
- string_list_append(out, commands[i].cmd);
- } else {
- for (size_t i = 0; i < ARRAY_SIZE(commands); i++)
- if (!(commands[i].option & exclude_option))
- string_list_append(out, commands[i].cmd);
+ for (size_t i = 0; i < ARRAY_SIZE(commands); i++) {
+ if (include_option && !(commands[i].option & include_option))
+ continue;
+ if (exclude_option && (commands[i].option & exclude_option))
+ continue;
+ string_list_append(out, commands[i].cmd);
}
}
@@ -809,8 +803,8 @@ static void execv_dashed_external(const char **argv)
static int is_deprecated_command(const char *cmd)
{
- return !strcmp(cmd, "whatchanged") ||
- !strcmp(cmd, "pack-redundant");
+ struct cmd_struct *builtin = get_builtin(cmd);
+ return builtin && (builtin->option & DEPRECATED);
}
static int run_argv(struct strvec *args)
Range-diff against v3:
1: bdc683a92b3 ! 1: 66e6a9554b1 git: add `deprecated` category to --list-cmds
@@ Commit message
Let’s expand the experimental `--list-cmds`[1] to allow users and
programs to query for this information. We will also use this in an
- upcoming commit to assert that all deprecated commands will have been
- covered in some manner.
+ upcoming commit to implement `is_deprecated_command`.
[1]: Using something which is experimental to query for deprecations is
perhaps not the most ideal approach, but it is simple to implement
and better than having to scan the documentation
+ Acked-by: Patrick Steinhardt <ps@pks.im>
+ Helped-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
## Notes (series) ##
+ v4:
+
+ Incorporate Patrick’s suggestions about the for-loop refactor and
+ formatting the overlong lines. Now drop the function doc since it
+ doesn’t apply anymore.
+
+ Also adjust the commit message now that we use it in the C source in an
+ upcoming commit, not just/only as an assert-helper (in an upcoming
+ commit).
+
v3 (new):
This is something I wanted to submit independently until the point about
@@ git.c: const char git_more_info_string[] =
static int use_pager = -1;
-static void list_builtins(struct string_list *list, unsigned int exclude_option);
-+/*
-+ * 'include_option' and 'exclude_option' are mutually exclusive.
-+ *
-+ * The default ('!include_option') is to include everything
-+ * except those filtered out by 'exclude_option'.
-+ */
-+static void list_builtins(struct string_list *list, unsigned int include_option, unsigned int exclude_option);
++static void list_builtins(struct string_list *list,
++ unsigned int include_option,
++ unsigned int exclude_option);
static void exclude_helpers_from_list(struct string_list *list)
{
@@ git.c: int is_builtin(const char *s)
}
-static void list_builtins(struct string_list *out, unsigned int exclude_option)
-+static void list_builtins(struct string_list *out, unsigned int include_option, unsigned int exclude_option)
++static void list_builtins(struct string_list *out,
++ unsigned int include_option,
++ unsigned int exclude_option)
{
-- for (size_t i = 0; i < ARRAY_SIZE(commands); i++) {
+ for (size_t i = 0; i < ARRAY_SIZE(commands); i++) {
- if (exclude_option &&
- (commands[i].option & exclude_option))
-- continue;
-- string_list_append(out, commands[i].cmd);
-+ if (include_option && exclude_option)
-+ BUG("'include_option' and 'exclude_option' are mutually exclusive");
-+ if (include_option) {
-+ for (size_t i = 0; i < ARRAY_SIZE(commands); i++)
-+ if (commands[i].option & include_option)
-+ string_list_append(out, commands[i].cmd);
-+ } else {
-+ for (size_t i = 0; i < ARRAY_SIZE(commands); i++) {
-+ if (commands[i].option & exclude_option)
-+ continue;
-+ string_list_append(out, commands[i].cmd);
-+ }
++ if (include_option && !(commands[i].option & include_option))
++ continue;
++ if (exclude_option && (commands[i].option & exclude_option))
+ continue;
+ string_list_append(out, commands[i].cmd);
}
- }
-
2: 183dd68d09d < -: ----------- git: make the two loops look more symmetric
3: eec01cbac16 ! 2: 672253e0e71 git: allow alias-shadowing deprecated builtins
@@ Commit message
## Notes (series) ##
+ v4:
+
+ Better `is_deprecated_command` implementation.
+
v3 (new):
Prerequisite for telling the user that they can alias `whatchanged` to
@@ git.c: static void execv_dashed_external(const char **argv)
+static int is_deprecated_command(const char *cmd)
+{
-+ return !strcmp(cmd, "whatchanged") ||
-+ !strcmp(cmd, "pack-redundant");
++ struct cmd_struct *builtin = get_builtin(cmd);
++ return builtin && (builtin->option & DEPRECATED);
+}
+
static int run_argv(struct strvec *args)
4: 80fb02caeeb = 3: 00108f28f82 t0014: test shadowing of aliases for a sample of builtins
5: d25ee26f989 = 4: 6bdcaf7f80f you-still-use-that??: help the user help themselves
6: 50621a0748f = 5: 58de9767b22 whatchanged: tell users the git-log(1) equivalent
7: 812c9870f1b = 6: 407b430d02c whatchanged: remove not-even-shorter clause
8: 0d23a4badf0 = 7: fee752d2fb0 BreakingChanges: remove claim about whatchanged reports
base-commit: c44beea485f0f2feaf460e2ac87fdd5608d63cf0
--
2.51.0.16.gcd94ab5bf81
next prev parent reply other threads:[~2025-09-09 19:46 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-27 16:29 [PATCH 0/4] you-still-use-that??: improve breaking changes troubleshooting kristofferhaugsbakk
2025-08-27 16:29 ` [PATCH 1/4] usage: help the user help themselves kristofferhaugsbakk
2025-08-27 20:36 ` Kristoffer Haugsbakk
2025-08-27 21:02 ` Eric Sunshine
2025-08-27 21:20 ` Junio C Hamano
2025-08-27 21:27 ` Eric Sunshine
2025-08-27 22:26 ` Junio C Hamano
2025-08-28 6:39 ` Kristoffer Haugsbakk
2025-08-28 15:09 ` Junio C Hamano
2025-09-03 16:50 ` Eric Sunshine
2025-09-03 17:53 ` Kristoffer Haugsbakk
2025-09-03 21:21 ` Eric Sunshine
2025-09-03 21:41 ` Kristoffer Haugsbakk
2025-09-03 21:44 ` Jeff King
2025-09-03 22:11 ` Eric Sunshine
2025-09-04 6:57 ` Kristoffer Haugsbakk
2025-09-05 13:11 ` Jeff King
2025-09-09 20:01 ` Kristoffer Haugsbakk
2025-08-27 21:14 ` Junio C Hamano
2025-08-27 16:29 ` [PATCH 2/4] whatchanged: tell users the git-log(1) equivalent kristofferhaugsbakk
2025-08-27 16:45 ` Junio C Hamano
2025-08-27 16:48 ` Junio C Hamano
2025-08-27 17:08 ` Kristoffer Haugsbakk
2025-08-28 12:07 ` Kristoffer Haugsbakk
2025-08-27 16:29 ` [PATCH 3/4] whatchanged: remove not-even-shorter clause kristofferhaugsbakk
2025-08-27 16:29 ` [PATCH 4/4] BreakingChanges: remove claim about whatchanged reports kristofferhaugsbakk
2025-08-27 16:43 ` [PATCH 0/4] you-still-use-that??: improve breaking changes troubleshooting Junio C Hamano
2025-08-29 15:21 ` [PATCH v2 " kristofferhaugsbakk
2025-08-29 15:21 ` [PATCH v2 1/4] you-still-use-that??: help the user help themselves kristofferhaugsbakk
2025-08-29 15:21 ` [PATCH v2 2/4] whatchanged: tell users the git-log(1) equivalent kristofferhaugsbakk
2025-08-29 15:21 ` [PATCH v2 3/4] whatchanged: remove not-even-shorter clause kristofferhaugsbakk
2025-08-29 15:21 ` [PATCH v2 4/4] BreakingChanges: remove claim about whatchanged reports kristofferhaugsbakk
2025-09-08 15:36 ` [PATCH v3 0/8] you-still-use-that??: improve breaking changes troubleshooting kristofferhaugsbakk
2025-09-08 15:36 ` [PATCH v3 1/8] git: add `deprecated` category to --list-cmds kristofferhaugsbakk
2025-09-09 6:43 ` Patrick Steinhardt
2025-09-09 8:02 ` Kristoffer Haugsbakk
2025-09-08 15:36 ` [PATCH v3 2/8] git: make the two loops look more symmetric kristofferhaugsbakk
2025-09-08 15:36 ` [PATCH v3 3/8] git: allow alias-shadowing deprecated builtins kristofferhaugsbakk
2025-09-08 20:47 ` Junio C Hamano
2025-09-08 21:11 ` Jeff King
2025-09-08 21:55 ` Junio C Hamano
2025-09-09 6:25 ` Kristoffer Haugsbakk
2025-09-08 15:36 ` [PATCH v3 4/8] t0014: test shadowing of aliases for a sample of builtins kristofferhaugsbakk
2025-09-08 15:36 ` [PATCH v3 5/8] you-still-use-that??: help the user help themselves kristofferhaugsbakk
2025-09-08 15:36 ` [PATCH v3 6/8] whatchanged: tell users the git-log(1) equivalent kristofferhaugsbakk
2025-09-08 15:36 ` [PATCH v3 7/8] whatchanged: remove not-even-shorter clause kristofferhaugsbakk
2025-09-08 15:36 ` [PATCH v3 8/8] BreakingChanges: remove claim about whatchanged reports kristofferhaugsbakk
2025-09-09 19:45 ` kristofferhaugsbakk [this message]
2025-09-09 19:45 ` [PATCH v4 1/7] git: add `deprecated` category to --list-cmds kristofferhaugsbakk
2025-09-09 21:44 ` Junio C Hamano
2025-09-10 11:41 ` Patrick Steinhardt
2025-09-10 15:50 ` Jeff King
2025-09-10 21:40 ` Junio C Hamano
2025-09-10 20:23 ` Kristoffer Haugsbakk
2025-09-09 19:45 ` [PATCH v4 2/7] git: allow alias-shadowing deprecated builtins kristofferhaugsbakk
2025-09-10 5:13 ` Jeff King
2025-09-10 15:48 ` Jeff King
2025-09-10 17:58 ` Kristoffer Haugsbakk
2025-09-10 18:34 ` Jeff King
2025-09-11 17:31 ` Kristoffer Haugsbakk
2025-09-11 20:32 ` Jeff King
2025-09-11 20:43 ` Jeff King
2025-09-13 14:10 ` Kristoffer Haugsbakk
2025-09-13 22:06 ` Jeff King
2025-09-14 17:24 ` Kristoffer Haugsbakk
2025-09-15 1:44 ` Jeff King
2025-09-15 6:27 ` Kristoffer Haugsbakk
2025-09-11 20:44 ` Jeff King
2025-09-11 21:19 ` Junio C Hamano
2025-09-13 21:50 ` Kristoffer Haugsbakk
2025-09-09 19:45 ` [PATCH v4 3/7] t0014: test shadowing of aliases for a sample of builtins kristofferhaugsbakk
2025-09-09 19:45 ` [PATCH v4 4/7] you-still-use-that??: help the user help themselves kristofferhaugsbakk
2025-09-09 19:45 ` [PATCH v4 5/7] whatchanged: tell users the git-log(1) equivalent kristofferhaugsbakk
2025-09-09 19:45 ` [PATCH v4 6/7] whatchanged: remove not-even-shorter clause kristofferhaugsbakk
2025-09-09 19:45 ` [PATCH v4 7/7] BreakingChanges: remove claim about whatchanged reports kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 0/8] you-still-use-that??: improve breaking changes troubleshooting kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 1/8] git: add `deprecated` category to --list-cmds kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 2/8] git: move seen-alias bookkeeping into handle_alias(...) kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 3/8] git: allow alias-shadowing deprecated builtins kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 4/8] t0014: test shadowing of aliases for a sample of builtins kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 5/8] you-still-use-that??: help the user help themselves kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 6/8] whatchanged: hint about git-log(1) and aliasing kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 7/8] whatchanged: remove not-even-shorter clause kristofferhaugsbakk
2025-09-14 19:49 ` [PATCH v5 8/8] BreakingChanges: remove claim about whatchanged reports kristofferhaugsbakk
2025-09-15 19:19 ` [PATCH v5 0/8] you-still-use-that??: improve breaking changes troubleshooting Junio C Hamano
2025-09-16 20:47 ` Kristoffer Haugsbakk
2025-09-16 23:24 ` Jeff King
2025-09-17 15:41 ` Kristoffer Haugsbakk
2025-09-17 16:25 ` Junio C Hamano
2025-09-17 20:24 ` [PATCH v6 0/9] " kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 1/9] Makefile: don’t add whatchanged after it has been removed kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 2/9] git: add `deprecated` category to --list-cmds kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 3/9] git: move seen-alias bookkeeping into handle_alias(...) kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 4/9] git: allow alias-shadowing deprecated builtins kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 5/9] t0014: test shadowing of aliases for a sample of builtins kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 6/9] you-still-use-that??: help the user help themselves kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 7/9] whatchanged: hint about git-log(1) and aliasing kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 8/9] whatchanged: remove not-even-shorter clause kristofferhaugsbakk
2025-09-17 20:24 ` [PATCH v6 9/9] BreakingChanges: remove claim about whatchanged reports kristofferhaugsbakk
2025-09-18 18:31 ` [PATCH v6 0/9] you-still-use-that??: improve breaking changes troubleshooting Jeff King
2025-09-18 20:21 ` Junio C Hamano
2025-09-18 20:28 ` Kristoffer Haugsbakk
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=cover.1757446619.git.code@khaugsbakk.name \
--to=kristofferhaugsbakk@fastmail.com \
--cc=code@khaugsbakk.name \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
--cc=ps@pks.im \
--cc=sunshine@sunshineco.com \
/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.