git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
blob cdad4f74ec45a614facb69a3b3bf2af1b3800054 1994 bytes (raw)
name: editor.c 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
#include "cache.h"
#include "strbuf.h"
#include "run-command.h"
#include "sigchain.h"

#ifndef DEFAULT_EDITOR
#define DEFAULT_EDITOR "vi"
#endif

int is_terminal_dumb(void)
{
	const char *terminal = getenv("TERM");
	return !terminal || !strcmp(terminal, "dumb");
}

const char *git_editor(void)
{
	const char *editor = getenv("GIT_EDITOR");
	int terminal_is_dumb = is_terminal_dumb();

	if (!editor && editor_program)
		editor = editor_program;
	if (!editor && !terminal_is_dumb)
		editor = getenv("VISUAL");
	if (!editor)
		editor = getenv("EDITOR");

	if (!editor && terminal_is_dumb)
		return NULL;

	if (!editor)
		editor = DEFAULT_EDITOR;

	return editor;
}

int launch_editor(const char *path, struct strbuf *buffer, const char *const *env)
{
	const char *editor = git_editor();

	if (!editor)
		return error("Terminal is dumb, but EDITOR unset");

	if (strcmp(editor, ":")) {
		const char *args[] = { editor, real_path(path), NULL };
		struct child_process p = CHILD_PROCESS_INIT;
		int ret, sig;
		int print_waiting_for_editor = advice_waiting_for_editor &&
			isatty(2) && !is_terminal_dumb();

		if (print_waiting_for_editor) {
			fprintf(stderr, _("hint: Waiting for your editor input..."));
			fflush(stderr);
		}

		p.argv = args;
		p.env = env;
		p.use_shell = 1;
		if (start_command(&p) < 0)
			return error("unable to start editor '%s'", editor);

		sigchain_push(SIGINT, SIG_IGN);
		sigchain_push(SIGQUIT, SIG_IGN);
		ret = finish_command(&p);
		sig = ret - 128;
		sigchain_pop(SIGINT);
		sigchain_pop(SIGQUIT);
		if (sig == SIGINT || sig == SIGQUIT)
			raise(sig);
		if (ret)
			return error("There was a problem with the editor '%s'.",
					editor);

		if (print_waiting_for_editor)
			/*
			 * go back to the beginning and erase the
			 * entire line to avoid wasting the vertical
			 * space.
			 */
			fputs("\r\033[K", stderr);
	}

	if (!buffer)
		return 0;
	if (strbuf_read_file(buffer, path, 0) < 0)
		return error_errno("could not read file '%s'", path);
	return 0;
}

debug log:

solving cdad4f74ec ...
found cdad4f74ec in https://public-inbox.org/git/20171129143752.60553-3-lars.schneider@autodesk.com/ ||
	https://public-inbox.org/git/20171129143752.60553-1-lars.schneider@autodesk.com/
found c65ea698eb in https://80x24.org/mirrors/git.git
preparing index
index prepared:
100644 c65ea698eb70ec828b3b3265a5630fca664f5810	editor.c

applying [1/1] https://public-inbox.org/git/20171129143752.60553-3-lars.schneider@autodesk.com/
diff --git a/editor.c b/editor.c
index c65ea698eb..cdad4f74ec 100644

Checking patch editor.c...
Applied patch editor.c cleanly.

skipping https://public-inbox.org/git/20171129143752.60553-1-lars.schneider@autodesk.com/ for cdad4f74ec
index at:
100644 cdad4f74ec45a614facb69a3b3bf2af1b3800054	editor.c

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).