Subject: [PATCH] var: add GIT_SEQUENCE_EDITOR variable

From: "Sean Allred via GitGitGadget" <[email-masked]>
Date: Sun, 20 Nov 2022 19:20:16 +0000

From: Sean Allred <[email-masked]>

Provides the same benefits to scripts as exposing GIT_EDITOR, but
allows distinguishing the 'sequence' editor from the 'core' editor.

See also 44fcb4977cbae67f4698306ccfe982420ceebcbf.

Signed-off-by: Sean Allred <[email-masked]>
---
    var: add GIT_SEQUENCE_EDITOR variable
    
    In my case, I'm overriding the sequence editor in git rebase -i to do
    some pre-processing on the todo file, but I'd still like to open up the
    editor for further manipulation/verification of the todo steps. Just
    using GIT_EDITOR here will clobber folks' expectations that their
    custom-built sequence editor pops up (e.g. VSCode or Git Cola).

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1424%2Fvermiculus%2Fsa%2Fgit-var-sequence-editor-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1424/vermiculus/sa/git-var-sequence-editor-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1424

 Documentation/git-var.txt |  7 +++++++
 builtin/var.c             | 11 +++++++++++
 t/t0007-git-var.sh        | 38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 56 insertions(+)

diff --git a/Documentation/git-var.txt b/Documentation/git-var.txt
index 6aa521fab23..764a94b2a1f 100644
--- a/Documentation/git-var.txt
+++ b/Documentation/git-var.txt
@@ -49,6 +49,13 @@ ifdef::git-default-editor[]
     The build you are using chose '{git-default-editor}' as the default.
 endif::git-default-editor[]
 
+GIT_SEQUENCE_EDITOR::
+    Text editor for use by Git sequencer commands. Like `GIT_EDITOR`,
+    the value is meant to be interpreted by the shell when it is used.
+    The order of preference is the `$GIT_SEQUENCE_EDITOR` environment
+    variable, then `sequence.editor` configuration, and then the value
+    of `git var GIT_EDITOR`.
+
 GIT_PAGER::
     Text viewer for use by Git commands (e.g., 'less').  The value
     is meant to be interpreted by the shell.  The order of preference
diff --git a/builtin/var.c b/builtin/var.c
index 491db274292..9a2d31dc4aa 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -19,6 +19,16 @@ static const char *editor(int flag)
 	return pgm;
 }
 
+static const char *sequence_editor(int flag)
+{
+	const char *pgm = git_sequence_editor();
+
+	if (!pgm && flag & IDENT_STRICT)
+		die("Terminal is dumb, but EDITOR unset");
+
+	return pgm;
+}
+
 static const char *pager(int flag)
 {
 	const char *pgm = git_pager(1);
@@ -41,6 +51,7 @@ static struct git_var git_vars[] = {
 	{ "GIT_COMMITTER_IDENT", git_committer_info },
 	{ "GIT_AUTHOR_IDENT",   git_author_info },
 	{ "GIT_EDITOR", editor },
+	{ "GIT_SEQUENCE_EDITOR", sequence_editor },
 	{ "GIT_PAGER", pager },
 	{ "GIT_DEFAULT_BRANCH", default_branch },
 	{ "", NULL },
diff --git a/t/t0007-git-var.sh b/t/t0007-git-var.sh
index e56f4b9ac59..3199285fa7b 100755
--- a/t/t0007-git-var.sh
+++ b/t/t0007-git-var.sh
@@ -47,6 +47,44 @@ test_expect_success 'get GIT_DEFAULT_BRANCH with configuration' '
 	)
 '
 
+test_expect_success 'get GIT_SEQUENCE_EDITOR without configuration' '
+	(
+		sane_unset GIT_SEQUENCE_EDITOR &&
+		git var GIT_EDITOR >expect &&
+		git var GIT_SEQUENCE_EDITOR >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'get GIT_SEQUENCE_EDITOR with configuration' '
+	test_config sequence.editor foo &&
+	(
+		sane_unset GIT_SEQUENCE_EDITOR &&
+		echo foo >expect &&
+		git var GIT_SEQUENCE_EDITOR >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'get GIT_SEQUENCE_EDITOR with environment variable' '
+	(
+		sane_unset GIT_SEQUENCE_EDITOR &&
+		echo bar >expect &&
+		GIT_SEQUENCE_EDITOR=bar git var GIT_SEQUENCE_EDITOR >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'get GIT_SEQUENCE_EDITOR with configuration and environment variable' '
+	test_config sequence.editor foo &&
+	(
+		sane_unset GIT_SEQUENCE_EDITOR &&
+		echo bar >expect &&
+		GIT_SEQUENCE_EDITOR=bar git var GIT_SEQUENCE_EDITOR >actual &&
+		test_cmp expect actual
+	)
+'
+
 # For git var -l, we check only a representative variable;
 # testing the whole output would make our test too brittle with
 # respect to unrelated changes in the test suite's environment.

base-commit: a0789512c5a4ae7da935cd2e419f253cb3cb4ce7
-- 
gitgitgadget