summaryrefslogtreecommitdiff
path: root/common-main.c
diff options
context:
space:
mode:
Diffstat (limited to 'common-main.c')
-rw-r--r--common-main.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/common-main.c b/common-main.c
index 71e21dd..033778b 100644
--- a/common-main.c
+++ b/common-main.c
@@ -1,6 +1,11 @@
-#include "cache.h"
+#include "git-compat-util.h"
#include "exec-cmd.h"
+#include "gettext.h"
#include "attr.h"
+#include "repository.h"
+#include "setup.h"
+#include "strbuf.h"
+#include "trace2.h"
/*
* Many parts of Git have subprograms communicate via pipe, expect the
@@ -26,6 +31,7 @@ static void restore_sigpipe_to_default(void)
int main(int argc, const char **argv)
{
int result;
+ struct strbuf tmp = STRBUF_INIT;
trace2_initialize_clock();
@@ -39,6 +45,7 @@ int main(int argc, const char **argv)
git_resolve_executable_dir(argv[0]);
+ setlocale(LC_CTYPE, "");
git_setup_gettext();
initialize_the_repository();
@@ -49,9 +56,35 @@ int main(int argc, const char **argv)
trace2_cmd_start(argv);
trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP);
+ if (!strbuf_getcwd(&tmp))
+ tmp_original_cwd = strbuf_detach(&tmp, NULL);
+
result = cmd_main(argc, argv);
- trace2_cmd_exit(result);
+ /* Not exit(3), but a wrapper calling our common_exit() */
+ exit(result);
+}
+
+static void check_bug_if_BUG(void)
+{
+ if (!bug_called_must_BUG)
+ return;
+ BUG("on exit(): had bug() call(s) in this process without explicit BUG_if_bug()");
+}
+
+/* We wrap exit() to call common_exit() in git-compat-util.h */
+int common_exit(const char *file, int line, int code)
+{
+ /*
+ * For non-POSIX systems: Take the lowest 8 bits of the "code"
+ * to e.g. turn -1 into 255. On a POSIX system this is
+ * redundant, see exit(3) and wait(2), but as it doesn't harm
+ * anything there we don't need to guard this with an "ifdef".
+ */
+ code &= 0xff;
+
+ check_bug_if_BUG();
+ trace2_cmd_exit_fl(file, line, code);
- return result;
+ return code;
}