From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Junio C Hamano <gitster@pobox.com>
Cc: Eyvind Bernhardsen <eyvind-git-list@orakel.ntnu.no>,
Nicolas Pitre <nico@cam.org>,
Nguyen Thai Ngoc Duy <pclouds@gmail.com>, Jan Hudec <bulb@ucw.cz>,
git@vger.kernel.org
Subject: [PATCH 3/3] Introduce execv_git_builtin() and use it
Date: Sun, 2 Dec 2007 02:55:08 +0000 (GMT) [thread overview]
Message-ID: <Pine.LNX.4.64.0712020254540.27959@racer.site> (raw)
In-Reply-To: <Pine.LNX.4.64.0712020146240.27959@racer.site>
You can call execv_git_builtin() to execute a builtin command. This
function is a reborn handle_internal_command() from git.c, and has the
semantics of execv_git_cmd(), i.e. it exits with the exit code of the
builtin if there is a matching builtin, but it avoids the real
execvp() call.
This function calls release_all_objects() and discard_cache() to start
from a clean slate (this, along with the calculation of argc, is the
only difference from a straight code move).
The test suite passes, which at least does not contradict the
hypothesis that this is good enough. However, it might be
necessary to de-initialize more global variables.
The function execv_git_cmd() and git.c's main() function were changed
to take advantage of execv_git_builtin().
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
exec_cmd.c | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
exec_cmd.h | 1 +
git.c | 172 +---------------------------------------------------------
3 files changed, 180 insertions(+), 171 deletions(-)
diff --git a/exec_cmd.c b/exec_cmd.c
index 2d0a758..ac21181 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -1,6 +1,8 @@
#include "cache.h"
#include "exec_cmd.h"
#include "quote.h"
+#include "builtin.h"
+#include "object.h"
#define MAX_ARGS 32
extern char **environ;
@@ -63,11 +65,187 @@ void setup_path(const char *cmd_path)
strbuf_release(&new_path);
}
+const char git_usage_string[] =
+ "git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]";
+
+const char git_version_string[] = GIT_VERSION;
+
+#define RUN_SETUP (1<<0)
+#define USE_PAGER (1<<1)
+/*
+ * require working tree to be present -- anything uses this needs
+ * RUN_SETUP for reading from the configuration file.
+ */
+#define NEED_WORK_TREE (1<<2)
+
+struct cmd_struct {
+ const char *cmd;
+ int (*fn)(int, const char **, const char *);
+ int option;
+};
+
+static int run_command(struct cmd_struct *p, int argc, const char **argv)
+{
+ int status;
+ struct stat st;
+ const char *prefix;
+
+ prefix = NULL;
+ if (p->option & RUN_SETUP)
+ prefix = setup_git_directory();
+ if (p->option & USE_PAGER)
+ setup_pager();
+ if (p->option & NEED_WORK_TREE)
+ setup_work_tree();
+
+ trace_argv_printf(argv, argc, "trace: built-in: git");
+
+ status = p->fn(argc, argv, prefix);
+ if (status)
+ return status & 0xff;
+
+ /* Somebody closed stdout? */
+ if (fstat(fileno(stdout), &st))
+ return 0;
+ /* Ignore write errors for pipes and sockets.. */
+ if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode))
+ return 0;
+
+ /* Check for ENOSPC and EIO errors.. */
+ if (fflush(stdout))
+ die("write failure on standard output: %s", strerror(errno));
+ if (ferror(stdout))
+ die("unknown write failure on standard output");
+ if (fclose(stdout))
+ die("close failed on standard output: %s", strerror(errno));
+ return 0;
+}
+
+int execv_git_builtin(const char **argv)
+{
+ const char *cmd = argv[0];
+ static struct cmd_struct commands[] = {
+ { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE },
+ { "annotate", cmd_annotate, RUN_SETUP },
+ { "apply", cmd_apply },
+ { "archive", cmd_archive },
+ { "blame", cmd_blame, RUN_SETUP },
+ { "branch", cmd_branch, RUN_SETUP },
+ { "bundle", cmd_bundle },
+ { "cat-file", cmd_cat_file, RUN_SETUP },
+ { "checkout-index", cmd_checkout_index,
+ RUN_SETUP | NEED_WORK_TREE},
+ { "check-ref-format", cmd_check_ref_format },
+ { "check-attr", cmd_check_attr, RUN_SETUP | NEED_WORK_TREE },
+ { "cherry", cmd_cherry, RUN_SETUP },
+ { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },
+ { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE },
+ { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
+ { "commit-tree", cmd_commit_tree, RUN_SETUP },
+ { "config", cmd_config },
+ { "count-objects", cmd_count_objects, RUN_SETUP },
+ { "describe", cmd_describe, RUN_SETUP },
+ { "diff", cmd_diff },
+ { "diff-files", cmd_diff_files },
+ { "diff-index", cmd_diff_index, RUN_SETUP },
+ { "diff-tree", cmd_diff_tree, RUN_SETUP },
+ { "fast-export", cmd_fast_export, RUN_SETUP },
+ { "fetch", cmd_fetch, RUN_SETUP },
+ { "fetch-pack", cmd_fetch_pack, RUN_SETUP },
+ { "fetch--tool", cmd_fetch__tool, RUN_SETUP },
+ { "fmt", cmd_fmt },
+ { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
+ { "for-each-ref", cmd_for_each_ref, RUN_SETUP },
+ { "format-patch", cmd_format_patch, RUN_SETUP },
+ { "fsck", cmd_fsck, RUN_SETUP },
+ { "fsck-objects", cmd_fsck, RUN_SETUP },
+ { "gc", cmd_gc, RUN_SETUP },
+ { "get-tar-commit-id", cmd_get_tar_commit_id },
+ { "grep", cmd_grep, RUN_SETUP | USE_PAGER },
+ { "help", cmd_help },
+#ifndef NO_CURL
+ { "http-fetch", cmd_http_fetch, RUN_SETUP },
+#endif
+ { "init", cmd_init_db },
+ { "init-db", cmd_init_db },
+ { "log", cmd_log, RUN_SETUP | USE_PAGER },
+ { "ls-files", cmd_ls_files, RUN_SETUP },
+ { "ls-tree", cmd_ls_tree, RUN_SETUP },
+ { "ls-remote", cmd_ls_remote },
+ { "mailinfo", cmd_mailinfo },
+ { "mailsplit", cmd_mailsplit },
+ { "merge-base", cmd_merge_base, RUN_SETUP },
+ { "merge-file", cmd_merge_file },
+ { "merge-ours", cmd_merge_ours, RUN_SETUP },
+ { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
+ { "name-rev", cmd_name_rev, RUN_SETUP },
+ { "pack-objects", cmd_pack_objects, RUN_SETUP },
+ { "peek-remote", cmd_ls_remote },
+ { "pickaxe", cmd_blame, RUN_SETUP },
+ { "prune", cmd_prune, RUN_SETUP },
+ { "prune-packed", cmd_prune_packed, RUN_SETUP },
+ { "push", cmd_push, RUN_SETUP },
+ { "read-tree", cmd_read_tree, RUN_SETUP },
+ { "reflog", cmd_reflog, RUN_SETUP },
+ { "repo-config", cmd_config },
+ { "rerere", cmd_rerere, RUN_SETUP },
+ { "reset", cmd_reset, RUN_SETUP },
+ { "rev-list", cmd_rev_list, RUN_SETUP },
+ { "rev-parse", cmd_rev_parse },
+ { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
+ { "rm", cmd_rm, RUN_SETUP },
+ { "send-pack", cmd_send_pack, RUN_SETUP },
+ { "shortlog", cmd_shortlog, RUN_SETUP | USE_PAGER },
+ { "show-branch", cmd_show_branch, RUN_SETUP },
+ { "show", cmd_show, RUN_SETUP | USE_PAGER },
+ { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
+ { "stripspace", cmd_stripspace },
+ { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
+ { "tag", cmd_tag, RUN_SETUP },
+ { "tar-tree", cmd_tar_tree },
+ { "unpack-objects", cmd_unpack_objects, RUN_SETUP },
+ { "update-index", cmd_update_index, RUN_SETUP },
+ { "update-ref", cmd_update_ref, RUN_SETUP },
+ { "upload-archive", cmd_upload_archive },
+ { "verify-tag", cmd_verify_tag, RUN_SETUP },
+ { "version", cmd_version },
+ { "whatchanged", cmd_whatchanged, RUN_SETUP | USE_PAGER },
+ { "write-tree", cmd_write_tree, RUN_SETUP },
+ { "verify-pack", cmd_verify_pack },
+ { "show-ref", cmd_show_ref, RUN_SETUP },
+ { "pack-refs", cmd_pack_refs, RUN_SETUP },
+ };
+ int i;
+
+ /* Turn "git cmd --help" into "git help cmd" */
+ if (argv[0] && argv[1] && !strcmp(argv[1], "--help")) {
+ argv[1] = argv[0];
+ argv[0] = cmd = "help";
+ }
+
+ for (i = 0; i < ARRAY_SIZE(commands); i++) {
+ int argc;
+ struct cmd_struct *p = commands+i;
+ if (strcmp(p->cmd, cmd))
+ continue;
+ release_all_objects();
+ discard_cache();
+ for (argc = 0; argv[argc]; argc++)
+ ; /* do nothing */
+ exit(run_command(p, argc, argv));
+ }
+ return -1;
+}
+
int execv_git_cmd(const char **argv)
{
struct strbuf cmd;
const char *tmp;
+ /* Try builtin first... */
+ execv_git_builtin(argv);
+
+ /* ... and then external commands */
strbuf_init(&cmd, 0);
strbuf_addf(&cmd, "git-%s", argv[0]);
diff --git a/exec_cmd.h b/exec_cmd.h
index a892355..bb15425 100644
--- a/exec_cmd.h
+++ b/exec_cmd.h
@@ -4,6 +4,7 @@
extern void git_set_argv_exec_path(const char *exec_path);
extern const char* git_exec_path(void);
extern void setup_path(const char *);
+extern int execv_git_builtin(const char **argv); /* NULL terminated */
extern int execv_git_cmd(const char **argv); /* NULL terminated */
extern int execl_git_cmd(const char *cmd, ...);
diff --git a/git.c b/git.c
index 38b01ca..1523c4a 100644
--- a/git.c
+++ b/git.c
@@ -3,9 +3,6 @@
#include "cache.h"
#include "quote.h"
-const char git_usage_string[] =
- "git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]";
-
static int handle_options(const char*** argv, int* argc, int* envchanged)
{
int handled = 0;
@@ -231,169 +228,6 @@ static int handle_alias(int *argcp, const char ***argv)
return ret;
}
-const char git_version_string[] = GIT_VERSION;
-
-#define RUN_SETUP (1<<0)
-#define USE_PAGER (1<<1)
-/*
- * require working tree to be present -- anything uses this needs
- * RUN_SETUP for reading from the configuration file.
- */
-#define NEED_WORK_TREE (1<<2)
-
-struct cmd_struct {
- const char *cmd;
- int (*fn)(int, const char **, const char *);
- int option;
-};
-
-static int run_command(struct cmd_struct *p, int argc, const char **argv)
-{
- int status;
- struct stat st;
- const char *prefix;
-
- prefix = NULL;
- if (p->option & RUN_SETUP)
- prefix = setup_git_directory();
- if (p->option & USE_PAGER)
- setup_pager();
- if (p->option & NEED_WORK_TREE)
- setup_work_tree();
-
- trace_argv_printf(argv, argc, "trace: built-in: git");
-
- status = p->fn(argc, argv, prefix);
- if (status)
- return status & 0xff;
-
- /* Somebody closed stdout? */
- if (fstat(fileno(stdout), &st))
- return 0;
- /* Ignore write errors for pipes and sockets.. */
- if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode))
- return 0;
-
- /* Check for ENOSPC and EIO errors.. */
- if (fflush(stdout))
- die("write failure on standard output: %s", strerror(errno));
- if (ferror(stdout))
- die("unknown write failure on standard output");
- if (fclose(stdout))
- die("close failed on standard output: %s", strerror(errno));
- return 0;
-}
-
-static void handle_internal_command(int argc, const char **argv)
-{
- const char *cmd = argv[0];
- static struct cmd_struct commands[] = {
- { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE },
- { "annotate", cmd_annotate, RUN_SETUP },
- { "apply", cmd_apply },
- { "archive", cmd_archive },
- { "blame", cmd_blame, RUN_SETUP },
- { "branch", cmd_branch, RUN_SETUP },
- { "bundle", cmd_bundle },
- { "cat-file", cmd_cat_file, RUN_SETUP },
- { "checkout-index", cmd_checkout_index,
- RUN_SETUP | NEED_WORK_TREE},
- { "check-ref-format", cmd_check_ref_format },
- { "check-attr", cmd_check_attr, RUN_SETUP | NEED_WORK_TREE },
- { "cherry", cmd_cherry, RUN_SETUP },
- { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },
- { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE },
- { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
- { "commit-tree", cmd_commit_tree, RUN_SETUP },
- { "config", cmd_config },
- { "count-objects", cmd_count_objects, RUN_SETUP },
- { "describe", cmd_describe, RUN_SETUP },
- { "diff", cmd_diff },
- { "diff-files", cmd_diff_files },
- { "diff-index", cmd_diff_index, RUN_SETUP },
- { "diff-tree", cmd_diff_tree, RUN_SETUP },
- { "fast-export", cmd_fast_export, RUN_SETUP },
- { "fetch", cmd_fetch, RUN_SETUP },
- { "fetch-pack", cmd_fetch_pack, RUN_SETUP },
- { "fetch--tool", cmd_fetch__tool, RUN_SETUP },
- { "fmt", cmd_fmt },
- { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
- { "for-each-ref", cmd_for_each_ref, RUN_SETUP },
- { "format-patch", cmd_format_patch, RUN_SETUP },
- { "fsck", cmd_fsck, RUN_SETUP },
- { "fsck-objects", cmd_fsck, RUN_SETUP },
- { "gc", cmd_gc, RUN_SETUP },
- { "get-tar-commit-id", cmd_get_tar_commit_id },
- { "grep", cmd_grep, RUN_SETUP | USE_PAGER },
- { "help", cmd_help },
-#ifndef NO_CURL
- { "http-fetch", cmd_http_fetch, RUN_SETUP },
-#endif
- { "init", cmd_init_db },
- { "init-db", cmd_init_db },
- { "log", cmd_log, RUN_SETUP | USE_PAGER },
- { "ls-files", cmd_ls_files, RUN_SETUP },
- { "ls-tree", cmd_ls_tree, RUN_SETUP },
- { "ls-remote", cmd_ls_remote },
- { "mailinfo", cmd_mailinfo },
- { "mailsplit", cmd_mailsplit },
- { "merge-base", cmd_merge_base, RUN_SETUP },
- { "merge-file", cmd_merge_file },
- { "merge-ours", cmd_merge_ours, RUN_SETUP },
- { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
- { "name-rev", cmd_name_rev, RUN_SETUP },
- { "pack-objects", cmd_pack_objects, RUN_SETUP },
- { "peek-remote", cmd_ls_remote },
- { "pickaxe", cmd_blame, RUN_SETUP },
- { "prune", cmd_prune, RUN_SETUP },
- { "prune-packed", cmd_prune_packed, RUN_SETUP },
- { "push", cmd_push, RUN_SETUP },
- { "read-tree", cmd_read_tree, RUN_SETUP },
- { "reflog", cmd_reflog, RUN_SETUP },
- { "repo-config", cmd_config },
- { "rerere", cmd_rerere, RUN_SETUP },
- { "reset", cmd_reset, RUN_SETUP },
- { "rev-list", cmd_rev_list, RUN_SETUP },
- { "rev-parse", cmd_rev_parse },
- { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
- { "rm", cmd_rm, RUN_SETUP },
- { "send-pack", cmd_send_pack, RUN_SETUP },
- { "shortlog", cmd_shortlog, RUN_SETUP | USE_PAGER },
- { "show-branch", cmd_show_branch, RUN_SETUP },
- { "show", cmd_show, RUN_SETUP | USE_PAGER },
- { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
- { "stripspace", cmd_stripspace },
- { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
- { "tag", cmd_tag, RUN_SETUP },
- { "tar-tree", cmd_tar_tree },
- { "unpack-objects", cmd_unpack_objects, RUN_SETUP },
- { "update-index", cmd_update_index, RUN_SETUP },
- { "update-ref", cmd_update_ref, RUN_SETUP },
- { "upload-archive", cmd_upload_archive },
- { "verify-tag", cmd_verify_tag, RUN_SETUP },
- { "version", cmd_version },
- { "whatchanged", cmd_whatchanged, RUN_SETUP | USE_PAGER },
- { "write-tree", cmd_write_tree, RUN_SETUP },
- { "verify-pack", cmd_verify_pack },
- { "show-ref", cmd_show_ref, RUN_SETUP },
- { "pack-refs", cmd_pack_refs, RUN_SETUP },
- };
- int i;
-
- /* Turn "git cmd --help" into "git help cmd" */
- if (argc > 1 && !strcmp(argv[1], "--help")) {
- argv[1] = argv[0];
- argv[0] = cmd = "help";
- }
-
- for (i = 0; i < ARRAY_SIZE(commands); i++) {
- struct cmd_struct *p = commands+i;
- if (strcmp(p->cmd, cmd))
- continue;
- exit(run_command(p, argc, argv));
- }
-}
-
int main(int argc, const char **argv)
{
const char *cmd = argv[0] ? argv[0] : "git-help";
@@ -425,7 +259,7 @@ int main(int argc, const char **argv)
if (!prefixcmp(cmd, "git-")) {
cmd += 4;
argv[0] = cmd;
- handle_internal_command(argc, argv);
+ execv_git_builtin(argv);
die("cannot handle %s internally", cmd);
}
@@ -453,10 +287,6 @@ int main(int argc, const char **argv)
setup_path(cmd_path);
while (1) {
- /* See if it's an internal command */
- handle_internal_command(argc, argv);
-
- /* .. then try the external ones */
execv_git_cmd(argv);
/* It could be an alias -- this works around the insanity
--
1.5.3.6.2112.ge2263
next prev parent reply other threads:[~2007-12-02 2:55 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-27 15:02 [PATCH RFC] Move all dashed form git commands to libexecdir Nguyễn Thái Ngọc Duy
2007-11-27 15:12 ` Johannes Schindelin
2007-11-27 15:25 ` Nicolas Pitre
2007-11-27 16:04 ` [PATCH] " Nguyễn Thái Ngoc Duy
2007-11-27 16:18 ` Johannes Schindelin
2007-11-28 0:07 ` Jan Hudec
2007-11-28 1:13 ` Junio C Hamano
2007-11-28 8:18 ` Jan Hudec
2007-11-28 8:36 ` Nguyen Thai Ngoc Duy
2007-11-28 23:14 ` Junio C Hamano
2007-11-28 23:40 ` Johannes Schindelin
2007-11-28 23:48 ` Junio C Hamano
2007-11-29 0:01 ` Johannes Schindelin
2007-11-29 0:59 ` A Large Angry SCM
2007-11-29 1:02 ` Junio C Hamano
2007-11-29 3:17 ` Nguyen Thai Ngoc Duy
2007-11-29 14:09 ` Nicolas Pitre
2007-11-29 22:36 ` Junio C Hamano
2007-11-30 7:32 ` Wincent Colaiuta
2007-11-30 11:28 ` Eyvind Bernhardsen
2007-11-30 12:08 ` [PATCH] transport.c: call dash-less form of receive-pack and upload-pack on remote Johannes Schindelin
2007-12-01 2:36 ` Junio C Hamano
2007-12-01 10:17 ` Johannes Schindelin
2007-12-01 19:30 ` Junio C Hamano
2007-12-01 23:03 ` Johannes Schindelin
2007-12-01 23:15 ` Johannes Schindelin
2007-12-02 1:57 ` Junio C Hamano
2007-12-02 2:52 ` [PATCH 0/3] Call builtin functions directly, was " Johannes Schindelin
2007-12-02 2:54 ` [PATCH 1/3] Introduce release_all_objects() Johannes Schindelin
2007-12-02 2:54 ` [PATCH 2/3] Include the objects needed for the builtin functions into libgit.a Johannes Schindelin
2007-12-02 2:55 ` Johannes Schindelin [this message]
2007-12-02 3:04 ` [PATCH 3/3] Introduce execv_git_builtin() and use it Johannes Schindelin
2007-12-02 3:16 ` [REPLACEMENT PATCH " Johannes Schindelin
2007-12-02 5:19 ` [PATCH 0/3] Call builtin functions directly, was Re: [PATCH] transport.c: call dash-less form of receive-pack and upload-pack on remote Junio C Hamano
2007-12-02 11:35 ` Johannes Schindelin
2007-11-30 12:19 ` [PATCH] Move all dashed form git commands to libexecdir Nguyen Thai Ngoc Duy
2007-11-30 13:35 ` Johannes Schindelin
2007-11-29 15:08 ` Jeff King
2007-11-29 20:05 ` Nguyen Thai Ngoc Duy
2007-11-29 21:14 ` Jeff King
2007-11-29 22:19 ` Johannes Schindelin
2007-11-29 23:14 ` Jeff King
2007-11-29 23:30 ` Linus Torvalds
2007-11-30 0:13 ` Junio C Hamano
2007-11-30 0:35 ` Jeff King
2007-11-30 0:49 ` Junio C Hamano
2007-11-30 0:58 ` Jeff King
2007-11-30 1:13 ` Nicolas Pitre
2007-11-30 1:17 ` Jeff King
2007-11-30 5:42 ` Steffen Prohaska
2007-11-30 7:18 ` Andreas Ericsson
2007-11-30 15:09 ` Jeff King
2007-11-30 20:01 ` Junio C Hamano
2007-11-30 21:25 ` Jeff King
2007-11-30 23:10 ` Johannes Schindelin
2007-12-02 15:02 ` Wincent Colaiuta
2007-12-02 16:39 ` Johannes Schindelin
2007-12-02 16:56 ` Pascal Obry
2007-12-02 17:23 ` Johannes Schindelin
2007-12-01 2:37 ` Junio C Hamano
2007-12-01 4:17 ` Jeff King
2007-11-30 2:29 ` Linus Torvalds
2007-11-30 2:55 ` Nicolas Pitre
2007-11-30 5:51 ` Steffen Prohaska
2007-11-30 15:12 ` Jeff King
2007-11-30 15:28 ` Santi Béjar
2007-11-30 15:29 ` Jeff King
2007-11-30 15:50 ` Linus Torvalds
2007-11-30 16:22 ` Jeff King
2007-11-30 18:28 ` Johannes Schindelin
2007-11-30 18:37 ` Jeff King
2007-11-30 23:05 ` Johannes Schindelin
2007-11-30 23:21 ` Jeff King
2007-11-30 23:38 ` Johannes Schindelin
[not found] ` <fcaeb9bf0711302234l32460a1fqbf9825fc8055f99d@mail.gmail.com>
2007-12-01 19:32 ` Junio C Hamano
2007-12-01 21:26 ` Jeff King
2007-12-02 5:50 ` Nguyen Thai Ngoc Duy
2007-11-30 0:52 ` Nicolas Pitre
2007-11-30 1:00 ` Jeff King
2007-11-30 1:19 ` Nicolas Pitre
2007-11-30 1:25 ` Jeff King
2007-11-30 1:33 ` Nicolas Pitre
2007-11-30 1:53 ` Jeff King
2007-11-30 2:23 ` A Large Angry SCM
2007-11-30 0:40 ` Nguyen Thai Ngoc Duy
2007-11-30 0:51 ` A Large Angry SCM
2007-11-30 0:54 ` Johannes Schindelin
2007-11-30 2:03 ` A Large Angry SCM
2007-11-30 1:01 ` Nicolas Pitre
2007-11-30 2:17 ` A Large Angry SCM
2007-11-30 2:27 ` Nicolas Pitre
2007-11-29 0:14 ` Jakub Narebski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.64.0712020254540.27959@racer.site \
--to=johannes.schindelin@gmx.de \
--cc=bulb@ucw.cz \
--cc=eyvind-git-list@orakel.ntnu.no \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=nico@cam.org \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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 NNTP newsgroup(s).