Merge branch 'jc/maint-merge-autoedit' into maint

* jc/maint-merge-autoedit:
  merge: backport GIT_MERGE_AUTOEDIT support
diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
index 2bd92c4..5afc99f 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.txt
@@ -8,9 +8,19 @@
 inspect and further tweak the merge result before committing.
 
 --edit::
--e::
+--no-edit::
 	Invoke editor before committing successful merge to further
-	edit the default merge message.
+	edit the default merge message. The `--no-edit` option can be
+	used to accept the auto-generated message (this is generally
+	discouraged) when merging an annotated tag, in which case
+	`git merge` automatically spawns the editor so that the result
+	of the GPG verification of the tag can be seen.
++
+Older scripts may depend on the historical behaviour of not allowing the
+user to edit the merge log message. They will see an editor opened when
+they run `git merge` to merge an annotated tag. To make it easier to adjust
+such scripts to the updated behaviour, the environment variable
+`GIT_MERGE_AUTOEDIT` can be set to `no` at the beginning of them.
 
 --ff::
 	When the merge resolves as a fast-forward, only update the branch
diff --git a/builtin/merge.c b/builtin/merge.c
index 8018a14..5126443 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -1109,6 +1109,33 @@
 	close(fd);
 }
 
+static int default_edit_option(void)
+{
+	static const char name[] = "GIT_MERGE_AUTOEDIT";
+	const char *e = getenv(name);
+	struct stat st_stdin, st_stdout;
+
+	if (have_message)
+		/* an explicit -m msg without --[no-]edit */
+		return 0;
+
+	if (e) {
+		int v = git_config_maybe_bool(name, e);
+		if (v < 0)
+			die("Bad value '%s' in environment '%s'", e, name);
+		return v;
+	}
+
+	/* Use editor if stdin and stdout are the same and is a tty */
+	return (!fstat(0, &st_stdin) &&
+		!fstat(1, &st_stdout) &&
+		isatty(0) && isatty(1) &&
+		st_stdin.st_dev == st_stdout.st_dev &&
+		st_stdin.st_ino == st_stdout.st_ino &&
+		st_stdin.st_mode == st_stdout.st_mode);
+}
+
+
 int cmd_merge(int argc, const char **argv, const char *prefix)
 {
 	unsigned char result_tree[20];
@@ -1298,7 +1325,7 @@
 		    merge_remote_util(commit)->obj &&
 		    merge_remote_util(commit)->obj->type == OBJ_TAG) {
 			if (option_edit < 0)
-				option_edit = 1;
+				option_edit = default_edit_option();
 			allow_fast_forward = 0;
 		}
 	}