builtin/help.c: speed up is_git_command() by checking for builtin commands first

Since 2dce956 is_git_command() is a bit slow as it does file I/O in the call to list_commands_in_dir(). Avoid the file I/O by adding an early check for the builtin commands. Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Sebastian Schuberth committed Jan 2, 2014 at 17:17 UTC c6127fa3e25551e969d775b0332d37dc84db1969
4 files changed +134 -117
Documentation/technical/api-builtin.txt
+2 -2
@@ -14,8 +14,8 @@ Git:
14
15 . Add the external declaration for the function to `builtin.h`.
16
17 -. Add the command to `commands[]` table in `handle_builtin()`,
18 - defined in `git.c`. The entry should look like:
17 +. Add the command to the `commands[]` table defined in `git.c`.
18 + The entry should look like:
19
20 { "foo", cmd_foo, <options> },
21 +
builtin.h
+2
@@ -27,6 +27,8 @@ extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
27
28 extern int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, int sha1_valid, char **buf, unsigned long *buf_size);
29
30 +extern int is_builtin(const char *s);
31 +
32 extern int cmd_add(int argc, const char **argv, const char *prefix);
33 extern int cmd_annotate(int argc, const char **argv, const char *prefix);
34 extern int cmd_apply(int argc, const char **argv, const char *prefix);
builtin/help.c
+3
@@ -288,6 +288,9 @@ static struct cmdnames main_cmds, other_cmds;
288
289 static int is_git_command(const char *s)
290 {
291 + if (is_builtin(s))
292 + return 1;
293 +
294 load_command_list("git-", &main_cmds, &other_cmds);
295 return is_in_cmdlist(&main_cmds, s) ||
296 is_in_cmdlist(&other_cmds, s);
git.c
+127 -115
@@ -332,124 +332,136 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
332 return 0;
333 }
334
335 +static struct cmd_struct commands[] = {
336 + { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE },
337 + { "annotate", cmd_annotate, RUN_SETUP },
338 + { "apply", cmd_apply, RUN_SETUP_GENTLY },
339 + { "archive", cmd_archive },
340 + { "bisect--helper", cmd_bisect__helper, RUN_SETUP },
341 + { "blame", cmd_blame, RUN_SETUP },
342 + { "branch", cmd_branch, RUN_SETUP },
343 + { "bundle", cmd_bundle, RUN_SETUP_GENTLY },
344 + { "cat-file", cmd_cat_file, RUN_SETUP },
345 + { "check-attr", cmd_check_attr, RUN_SETUP },
346 + { "check-ignore", cmd_check_ignore, RUN_SETUP | NEED_WORK_TREE },
347 + { "check-mailmap", cmd_check_mailmap, RUN_SETUP },
348 + { "check-ref-format", cmd_check_ref_format },
349 + { "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE },
350 + { "checkout-index", cmd_checkout_index,
351 + RUN_SETUP | NEED_WORK_TREE},
352 + { "cherry", cmd_cherry, RUN_SETUP },
353 + { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },
354 + { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE },
355 + { "clone", cmd_clone },
356 + { "column", cmd_column, RUN_SETUP_GENTLY },
357 + { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
358 + { "commit-tree", cmd_commit_tree, RUN_SETUP },
359 + { "config", cmd_config, RUN_SETUP_GENTLY },
360 + { "count-objects", cmd_count_objects, RUN_SETUP },
361 + { "credential", cmd_credential, RUN_SETUP_GENTLY },
362 + { "describe", cmd_describe, RUN_SETUP },
363 + { "diff", cmd_diff },
364 + { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },
365 + { "diff-index", cmd_diff_index, RUN_SETUP },
366 + { "diff-tree", cmd_diff_tree, RUN_SETUP },
367 + { "fast-export", cmd_fast_export, RUN_SETUP },
368 + { "fetch", cmd_fetch, RUN_SETUP },
369 + { "fetch-pack", cmd_fetch_pack, RUN_SETUP },
370 + { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
371 + { "for-each-ref", cmd_for_each_ref, RUN_SETUP },
372 + { "format-patch", cmd_format_patch, RUN_SETUP },
373 + { "fsck", cmd_fsck, RUN_SETUP },
374 + { "fsck-objects", cmd_fsck, RUN_SETUP },
375 + { "gc", cmd_gc, RUN_SETUP },
376 + { "get-tar-commit-id", cmd_get_tar_commit_id },
377 + { "grep", cmd_grep, RUN_SETUP_GENTLY },
378 + { "hash-object", cmd_hash_object },
379 + { "help", cmd_help },
380 + { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
381 + { "init", cmd_init_db },
382 + { "init-db", cmd_init_db },
383 + { "log", cmd_log, RUN_SETUP },
384 + { "ls-files", cmd_ls_files, RUN_SETUP },
385 + { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY },
386 + { "ls-tree", cmd_ls_tree, RUN_SETUP },
387 + { "mailinfo", cmd_mailinfo },
388 + { "mailsplit", cmd_mailsplit },
389 + { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },
390 + { "merge-base", cmd_merge_base, RUN_SETUP },
391 + { "merge-file", cmd_merge_file, RUN_SETUP_GENTLY },
392 + { "merge-index", cmd_merge_index, RUN_SETUP },
393 + { "merge-ours", cmd_merge_ours, RUN_SETUP },
394 + { "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
395 + { "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
396 + { "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
397 + { "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
398 + { "merge-tree", cmd_merge_tree, RUN_SETUP },
399 + { "mktag", cmd_mktag, RUN_SETUP },
400 + { "mktree", cmd_mktree, RUN_SETUP },
401 + { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
402 + { "name-rev", cmd_name_rev, RUN_SETUP },
403 + { "notes", cmd_notes, RUN_SETUP },
404 + { "pack-objects", cmd_pack_objects, RUN_SETUP },
405 + { "pack-redundant", cmd_pack_redundant, RUN_SETUP },
406 + { "pack-refs", cmd_pack_refs, RUN_SETUP },
407 + { "patch-id", cmd_patch_id },
408 + { "pickaxe", cmd_blame, RUN_SETUP },
409 + { "prune", cmd_prune, RUN_SETUP },
410 + { "prune-packed", cmd_prune_packed, RUN_SETUP },
411 + { "push", cmd_push, RUN_SETUP },
412 + { "read-tree", cmd_read_tree, RUN_SETUP },
413 + { "receive-pack", cmd_receive_pack },
414 + { "reflog", cmd_reflog, RUN_SETUP },
415 + { "remote", cmd_remote, RUN_SETUP },
416 + { "remote-ext", cmd_remote_ext },
417 + { "remote-fd", cmd_remote_fd },
418 + { "repack", cmd_repack, RUN_SETUP },
419 + { "replace", cmd_replace, RUN_SETUP },
420 + { "rerere", cmd_rerere, RUN_SETUP },
421 + { "reset", cmd_reset, RUN_SETUP },
422 + { "rev-list", cmd_rev_list, RUN_SETUP },
423 + { "rev-parse", cmd_rev_parse },
424 + { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
425 + { "rm", cmd_rm, RUN_SETUP },
426 + { "send-pack", cmd_send_pack, RUN_SETUP },
427 + { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
428 + { "show", cmd_show, RUN_SETUP },
429 + { "show-branch", cmd_show_branch, RUN_SETUP },
430 + { "show-ref", cmd_show_ref, RUN_SETUP },
431 + { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
432 + { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
433 + { "stripspace", cmd_stripspace },
434 + { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
435 + { "tag", cmd_tag, RUN_SETUP },
436 + { "unpack-file", cmd_unpack_file, RUN_SETUP },
437 + { "unpack-objects", cmd_unpack_objects, RUN_SETUP },
438 + { "update-index", cmd_update_index, RUN_SETUP },
439 + { "update-ref", cmd_update_ref, RUN_SETUP },
440 + { "update-server-info", cmd_update_server_info, RUN_SETUP },
441 + { "upload-archive", cmd_upload_archive },
442 + { "upload-archive--writer", cmd_upload_archive_writer },
443 + { "var", cmd_var, RUN_SETUP_GENTLY },
444 + { "verify-pack", cmd_verify_pack },
445 + { "verify-tag", cmd_verify_tag, RUN_SETUP },
446 + { "version", cmd_version },
447 + { "whatchanged", cmd_whatchanged, RUN_SETUP },
448 + { "write-tree", cmd_write_tree, RUN_SETUP },
449 +};
450 +
451 +int is_builtin(const char *s)
452 +{
453 + int i;
454 + for (i = 0; i < ARRAY_SIZE(commands); i++) {
455 + struct cmd_struct *p = commands+i;
456 + if (!strcmp(s, p->cmd))
457 + return 1;
458 + }
459 + return 0;
460 +}
461 +
462 static void handle_builtin(int argc, const char **argv)
463 {
464 const char *cmd = argv[0];
338 - static struct cmd_struct commands[] = {
339 - { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE },
340 - { "annotate", cmd_annotate, RUN_SETUP },
341 - { "apply", cmd_apply, RUN_SETUP_GENTLY },
342 - { "archive", cmd_archive },
343 - { "bisect--helper", cmd_bisect__helper, RUN_SETUP },
344 - { "blame", cmd_blame, RUN_SETUP },
345 - { "branch", cmd_branch, RUN_SETUP },
346 - { "bundle", cmd_bundle, RUN_SETUP_GENTLY },
347 - { "cat-file", cmd_cat_file, RUN_SETUP },
348 - { "check-attr", cmd_check_attr, RUN_SETUP },
349 - { "check-ignore", cmd_check_ignore, RUN_SETUP | NEED_WORK_TREE },
350 - { "check-mailmap", cmd_check_mailmap, RUN_SETUP },
351 - { "check-ref-format", cmd_check_ref_format },
352 - { "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE },
353 - { "checkout-index", cmd_checkout_index,
354 - RUN_SETUP | NEED_WORK_TREE},
355 - { "cherry", cmd_cherry, RUN_SETUP },
356 - { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },
357 - { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE },
358 - { "clone", cmd_clone },
359 - { "column", cmd_column, RUN_SETUP_GENTLY },
360 - { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
361 - { "commit-tree", cmd_commit_tree, RUN_SETUP },
362 - { "config", cmd_config, RUN_SETUP_GENTLY },
363 - { "count-objects", cmd_count_objects, RUN_SETUP },
364 - { "credential", cmd_credential, RUN_SETUP_GENTLY },
365 - { "describe", cmd_describe, RUN_SETUP },
366 - { "diff", cmd_diff },
367 - { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },
368 - { "diff-index", cmd_diff_index, RUN_SETUP },
369 - { "diff-tree", cmd_diff_tree, RUN_SETUP },
370 - { "fast-export", cmd_fast_export, RUN_SETUP },
371 - { "fetch", cmd_fetch, RUN_SETUP },
372 - { "fetch-pack", cmd_fetch_pack, RUN_SETUP },
373 - { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
374 - { "for-each-ref", cmd_for_each_ref, RUN_SETUP },
375 - { "format-patch", cmd_format_patch, RUN_SETUP },
376 - { "fsck", cmd_fsck, RUN_SETUP },
377 - { "fsck-objects", cmd_fsck, RUN_SETUP },
378 - { "gc", cmd_gc, RUN_SETUP },
379 - { "get-tar-commit-id", cmd_get_tar_commit_id },
380 - { "grep", cmd_grep, RUN_SETUP_GENTLY },
381 - { "hash-object", cmd_hash_object },
382 - { "help", cmd_help },
383 - { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
384 - { "init", cmd_init_db },
385 - { "init-db", cmd_init_db },
386 - { "log", cmd_log, RUN_SETUP },
387 - { "ls-files", cmd_ls_files, RUN_SETUP },
388 - { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY },
389 - { "ls-tree", cmd_ls_tree, RUN_SETUP },
390 - { "mailinfo", cmd_mailinfo },
391 - { "mailsplit", cmd_mailsplit },
392 - { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },
393 - { "merge-base", cmd_merge_base, RUN_SETUP },
394 - { "merge-file", cmd_merge_file, RUN_SETUP_GENTLY },
395 - { "merge-index", cmd_merge_index, RUN_SETUP },
396 - { "merge-ours", cmd_merge_ours, RUN_SETUP },
397 - { "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
398 - { "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
399 - { "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
400 - { "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
401 - { "merge-tree", cmd_merge_tree, RUN_SETUP },
402 - { "mktag", cmd_mktag, RUN_SETUP },
403 - { "mktree", cmd_mktree, RUN_SETUP },
404 - { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
405 - { "name-rev", cmd_name_rev, RUN_SETUP },
406 - { "notes", cmd_notes, RUN_SETUP },
407 - { "pack-objects", cmd_pack_objects, RUN_SETUP },
408 - { "pack-redundant", cmd_pack_redundant, RUN_SETUP },
409 - { "pack-refs", cmd_pack_refs, RUN_SETUP },
410 - { "patch-id", cmd_patch_id },
411 - { "pickaxe", cmd_blame, RUN_SETUP },
412 - { "prune", cmd_prune, RUN_SETUP },
413 - { "prune-packed", cmd_prune_packed, RUN_SETUP },
414 - { "push", cmd_push, RUN_SETUP },
415 - { "read-tree", cmd_read_tree, RUN_SETUP },
416 - { "receive-pack", cmd_receive_pack },
417 - { "reflog", cmd_reflog, RUN_SETUP },
418 - { "remote", cmd_remote, RUN_SETUP },
419 - { "remote-ext", cmd_remote_ext },
420 - { "remote-fd", cmd_remote_fd },
421 - { "repack", cmd_repack, RUN_SETUP },
422 - { "replace", cmd_replace, RUN_SETUP },
423 - { "rerere", cmd_rerere, RUN_SETUP },
424 - { "reset", cmd_reset, RUN_SETUP },
425 - { "rev-list", cmd_rev_list, RUN_SETUP },
426 - { "rev-parse", cmd_rev_parse },
427 - { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
428 - { "rm", cmd_rm, RUN_SETUP },
429 - { "send-pack", cmd_send_pack, RUN_SETUP },
430 - { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
431 - { "show", cmd_show, RUN_SETUP },
432 - { "show-branch", cmd_show_branch, RUN_SETUP },
433 - { "show-ref", cmd_show_ref, RUN_SETUP },
434 - { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
435 - { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
436 - { "stripspace", cmd_stripspace },
437 - { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
438 - { "tag", cmd_tag, RUN_SETUP },
439 - { "unpack-file", cmd_unpack_file, RUN_SETUP },
440 - { "unpack-objects", cmd_unpack_objects, RUN_SETUP },
441 - { "update-index", cmd_update_index, RUN_SETUP },
442 - { "update-ref", cmd_update_ref, RUN_SETUP },
443 - { "update-server-info", cmd_update_server_info, RUN_SETUP },
444 - { "upload-archive", cmd_upload_archive },
445 - { "upload-archive--writer", cmd_upload_archive_writer },
446 - { "var", cmd_var, RUN_SETUP_GENTLY },
447 - { "verify-pack", cmd_verify_pack },
448 - { "verify-tag", cmd_verify_tag, RUN_SETUP },
449 - { "version", cmd_version },
450 - { "whatchanged", cmd_whatchanged, RUN_SETUP },
451 - { "write-tree", cmd_write_tree, RUN_SETUP },
452 - };
465 int i;
466 static const char ext[] = STRIP_EXTENSION;
467