Git fork
at reftables-rust 63 lines 1.6 kB view raw
1#define USE_THE_REPOSITORY_VARIABLE 2 3#include "git-compat-util.h" 4#include "common-init.h" 5#include "exec-cmd.h" 6#include "gettext.h" 7#include "attr.h" 8#include "repository.h" 9#include "setup.h" 10#include "strbuf.h" 11#include "trace2.h" 12 13/* 14 * Many parts of Git have subprograms communicate via pipe, expect the 15 * upstream of a pipe to die with SIGPIPE when the downstream of a 16 * pipe does not need to read all that is written. Some third-party 17 * programs that ignore or block SIGPIPE for their own reason forget 18 * to restore SIGPIPE handling to the default before spawning Git and 19 * break this carefully orchestrated machinery. 20 * 21 * Restore the way SIGPIPE is handled to default, which is what we 22 * expect. 23 */ 24static void restore_sigpipe_to_default(void) 25{ 26 sigset_t unblock; 27 28 sigemptyset(&unblock); 29 sigaddset(&unblock, SIGPIPE); 30 sigprocmask(SIG_UNBLOCK, &unblock, NULL); 31 signal(SIGPIPE, SIG_DFL); 32} 33 34void init_git(const char **argv) 35{ 36 struct strbuf tmp = STRBUF_INIT; 37 38 trace2_initialize_clock(); 39 40 /* 41 * Always open file descriptors 0/1/2 to avoid clobbering files 42 * in die(). It also avoids messing up when the pipes are dup'ed 43 * onto stdin/stdout/stderr in the child processes we spawn. 44 */ 45 sanitize_stdfds(); 46 restore_sigpipe_to_default(); 47 48 git_resolve_executable_dir(argv[0]); 49 50 setlocale(LC_CTYPE, ""); 51 git_setup_gettext(); 52 53 initialize_repository(the_repository); 54 55 attr_start(); 56 57 trace2_initialize(); 58 trace2_cmd_start(argv); 59 trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP); 60 61 if (!strbuf_getcwd(&tmp)) 62 tmp_original_cwd = strbuf_detach(&tmp, NULL); 63}