1#ifndef BUILTIN_H 2#define BUILTIN_H 3 4#include"git-compat-util.h" 5#include"strbuf.h" 6#include"cache.h" 7#include"commit.h" 8 9/* 10 * builtin API 11 * =========== 12 * 13 * Adding a new built-in 14 * --------------------- 15 * 16 * There are 4 things to do to add a built-in command implementation to 17 * Git: 18 * 19 * . Define the implementation of the built-in command `foo` with 20 * signature: 21 * 22 * int cmd_foo(int argc, const char **argv, const char *prefix); 23 * 24 * . Add the external declaration for the function to `builtin.h`. 25 * 26 * . Add the command to the `commands[]` table defined in `git.c`. 27 * The entry should look like: 28 * 29 * { "foo", cmd_foo, <options> }, 30 * 31 * where options is the bitwise-or of: 32 * 33 * `RUN_SETUP`: 34 * If there is not a Git directory to work on, abort. If there 35 * is a work tree, chdir to the top of it if the command was 36 * invoked in a subdirectory. If there is no work tree, no 37 * chdir() is done. 38 * 39 * `RUN_SETUP_GENTLY`: 40 * If there is a Git directory, chdir as per RUN_SETUP, otherwise, 41 * don't chdir anywhere. 42 * 43 * `USE_PAGER`: 44 * 45 * If the standard output is connected to a tty, spawn a pager and 46 * feed our output to it. 47 * 48 * `NEED_WORK_TREE`: 49 * 50 * Make sure there is a work tree, i.e. the command cannot act 51 * on bare repositories. 52 * This only makes sense when `RUN_SETUP` is also set. 53 * 54 * `SUPPORT_SUPER_PREFIX`: 55 * 56 * The built-in supports `--super-prefix`. 57 * 58 * `DELAY_PAGER_CONFIG`: 59 * 60 * If RUN_SETUP or RUN_SETUP_GENTLY is set, git.c normally handles 61 * the `pager.<cmd>`-configuration. If this flag is used, git.c 62 * will skip that step, instead allowing the built-in to make a 63 * more informed decision, e.g., by ignoring `pager.<cmd>` for 64 * certain subcommands. 65 * 66 * . Add `builtin/foo.o` to `BUILTIN_OBJS` in `Makefile`. 67 * 68 * Additionally, if `foo` is a new command, there are 4 more things to do: 69 * 70 * . Add tests to `t/` directory. 71 * 72 * . Write documentation in `Documentation/git-foo.txt`. 73 * 74 * . Add an entry for `git-foo` to `command-list.txt`. 75 * 76 * . Add an entry for `/git-foo` to `.gitignore`. 77 * 78 * 79 * How a built-in is called 80 * ------------------------ 81 * 82 * The implementation `cmd_foo()` takes three parameters, `argc`, `argv, 83 * and `prefix`. The first two are similar to what `main()` of a 84 * standalone command would be called with. 85 * 86 * When `RUN_SETUP` is specified in the `commands[]` table, and when you 87 * were started from a subdirectory of the work tree, `cmd_foo()` is called 88 * after chdir(2) to the top of the work tree, and `prefix` gets the path 89 * to the subdirectory the command started from. This allows you to 90 * convert a user-supplied pathname (typically relative to that directory) 91 * to a pathname relative to the top of the work tree. 92 * 93 * The return value from `cmd_foo()` becomes the exit status of the 94 * command. 95 */ 96 97#define DEFAULT_MERGE_LOG_LEN 20 98 99externconst char git_usage_string[]; 100externconst char git_more_info_string[]; 101 102#define PRUNE_PACKED_DRY_RUN 01 103#define PRUNE_PACKED_VERBOSE 02 104 105voidprune_packed_objects(int); 106 107struct fmt_merge_msg_opts { 108unsigned add_title:1, 109 credit_people:1; 110int shortlog_len; 111}; 112 113intfmt_merge_msg(struct strbuf *in,struct strbuf *out, 114struct fmt_merge_msg_opts *); 115 116/** 117 * If a built-in has DELAY_PAGER_CONFIG set, the built-in should call this early 118 * when it wishes to respect the `pager.foo`-config. The `cmd` is the name of 119 * the built-in, e.g., "foo". If a paging-choice has already been setup, this 120 * does nothing. The default in `def` should be 0 for "pager off", 1 for "pager 121 * on" or -1 for "punt". 122 * 123 * You should most likely use a default of 0 or 1. "Punt" (-1) could be useful 124 * to be able to fall back to some historical compatibility name. 125 */ 126voidsetup_auto_pager(const char*cmd,int def); 127 128intis_builtin(const char*s); 129 130intcmd_add(int argc,const char**argv,const char*prefix); 131intcmd_am(int argc,const char**argv,const char*prefix); 132intcmd_annotate(int argc,const char**argv,const char*prefix); 133intcmd_apply(int argc,const char**argv,const char*prefix); 134intcmd_archive(int argc,const char**argv,const char*prefix); 135intcmd_bisect__helper(int argc,const char**argv,const char*prefix); 136intcmd_blame(int argc,const char**argv,const char*prefix); 137intcmd_branch(int argc,const char**argv,const char*prefix); 138intcmd_bundle(int argc,const char**argv,const char*prefix); 139intcmd_cat_file(int argc,const char**argv,const char*prefix); 140intcmd_checkout(int argc,const char**argv,const char*prefix); 141intcmd_checkout_index(int argc,const char**argv,const char*prefix); 142intcmd_check_attr(int argc,const char**argv,const char*prefix); 143intcmd_check_ignore(int argc,const char**argv,const char*prefix); 144intcmd_check_mailmap(int argc,const char**argv,const char*prefix); 145intcmd_check_ref_format(int argc,const char**argv,const char*prefix); 146intcmd_cherry(int argc,const char**argv,const char*prefix); 147intcmd_cherry_pick(int argc,const char**argv,const char*prefix); 148intcmd_clone(int argc,const char**argv,const char*prefix); 149intcmd_clean(int argc,const char**argv,const char*prefix); 150intcmd_column(int argc,const char**argv,const char*prefix); 151intcmd_commit(int argc,const char**argv,const char*prefix); 152intcmd_commit_graph(int argc,const char**argv,const char*prefix); 153intcmd_commit_tree(int argc,const char**argv,const char*prefix); 154intcmd_config(int argc,const char**argv,const char*prefix); 155intcmd_count_objects(int argc,const char**argv,const char*prefix); 156intcmd_credential(int argc,const char**argv,const char*prefix); 157intcmd_describe(int argc,const char**argv,const char*prefix); 158intcmd_diff_files(int argc,const char**argv,const char*prefix); 159intcmd_diff_index(int argc,const char**argv,const char*prefix); 160intcmd_diff(int argc,const char**argv,const char*prefix); 161intcmd_diff_tree(int argc,const char**argv,const char*prefix); 162intcmd_difftool(int argc,const char**argv,const char*prefix); 163intcmd_env__helper(int argc,const char**argv,const char*prefix); 164intcmd_fast_export(int argc,const char**argv,const char*prefix); 165intcmd_fetch(int argc,const char**argv,const char*prefix); 166intcmd_fetch_pack(int argc,const char**argv,const char*prefix); 167intcmd_fmt_merge_msg(int argc,const char**argv,const char*prefix); 168intcmd_for_each_ref(int argc,const char**argv,const char*prefix); 169intcmd_format_patch(int argc,const char**argv,const char*prefix); 170intcmd_fsck(int argc,const char**argv,const char*prefix); 171intcmd_gc(int argc,const char**argv,const char*prefix); 172intcmd_get_tar_commit_id(int argc,const char**argv,const char*prefix); 173intcmd_grep(int argc,const char**argv,const char*prefix); 174intcmd_hash_object(int argc,const char**argv,const char*prefix); 175intcmd_help(int argc,const char**argv,const char*prefix); 176intcmd_index_pack(int argc,const char**argv,const char*prefix); 177intcmd_init_db(int argc,const char**argv,const char*prefix); 178intcmd_interpret_trailers(int argc,const char**argv,const char*prefix); 179intcmd_log(int argc,const char**argv,const char*prefix); 180intcmd_log_reflog(int argc,const char**argv,const char*prefix); 181intcmd_ls_files(int argc,const char**argv,const char*prefix); 182intcmd_ls_tree(int argc,const char**argv,const char*prefix); 183intcmd_ls_remote(int argc,const char**argv,const char*prefix); 184intcmd_mailinfo(int argc,const char**argv,const char*prefix); 185intcmd_mailsplit(int argc,const char**argv,const char*prefix); 186intcmd_merge(int argc,const char**argv,const char*prefix); 187intcmd_merge_base(int argc,const char**argv,const char*prefix); 188intcmd_merge_index(int argc,const char**argv,const char*prefix); 189intcmd_merge_ours(int argc,const char**argv,const char*prefix); 190intcmd_merge_file(int argc,const char**argv,const char*prefix); 191intcmd_merge_recursive(int argc,const char**argv,const char*prefix); 192intcmd_merge_tree(int argc,const char**argv,const char*prefix); 193intcmd_mktag(int argc,const char**argv,const char*prefix); 194intcmd_mktree(int argc,const char**argv,const char*prefix); 195intcmd_multi_pack_index(int argc,const char**argv,const char*prefix); 196intcmd_mv(int argc,const char**argv,const char*prefix); 197intcmd_name_rev(int argc,const char**argv,const char*prefix); 198intcmd_notes(int argc,const char**argv,const char*prefix); 199intcmd_pack_objects(int argc,const char**argv,const char*prefix); 200intcmd_pack_redundant(int argc,const char**argv,const char*prefix); 201intcmd_patch_id(int argc,const char**argv,const char*prefix); 202intcmd_prune(int argc,const char**argv,const char*prefix); 203intcmd_prune_packed(int argc,const char**argv,const char*prefix); 204intcmd_pull(int argc,const char**argv,const char*prefix); 205intcmd_push(int argc,const char**argv,const char*prefix); 206intcmd_range_diff(int argc,const char**argv,const char*prefix); 207intcmd_read_tree(int argc,const char**argv,const char*prefix); 208intcmd_rebase(int argc,const char**argv,const char*prefix); 209intcmd_rebase__interactive(int argc,const char**argv,const char*prefix); 210intcmd_receive_pack(int argc,const char**argv,const char*prefix); 211intcmd_reflog(int argc,const char**argv,const char*prefix); 212intcmd_remote(int argc,const char**argv,const char*prefix); 213intcmd_remote_ext(int argc,const char**argv,const char*prefix); 214intcmd_remote_fd(int argc,const char**argv,const char*prefix); 215intcmd_repack(int argc,const char**argv,const char*prefix); 216intcmd_rerere(int argc,const char**argv,const char*prefix); 217intcmd_reset(int argc,const char**argv,const char*prefix); 218intcmd_restore(int argc,const char**argv,const char*prefix); 219intcmd_rev_list(int argc,const char**argv,const char*prefix); 220intcmd_rev_parse(int argc,const char**argv,const char*prefix); 221intcmd_revert(int argc,const char**argv,const char*prefix); 222intcmd_rm(int argc,const char**argv,const char*prefix); 223intcmd_send_pack(int argc,const char**argv,const char*prefix); 224intcmd_shortlog(int argc,const char**argv,const char*prefix); 225intcmd_show(int argc,const char**argv,const char*prefix); 226intcmd_show_branch(int argc,const char**argv,const char*prefix); 227intcmd_show_index(int argc,const char**argv,const char*prefix); 228intcmd_status(int argc,const char**argv,const char*prefix); 229intcmd_stash(int argc,const char**argv,const char*prefix); 230intcmd_stripspace(int argc,const char**argv,const char*prefix); 231intcmd_submodule__helper(int argc,const char**argv,const char*prefix); 232intcmd_switch(int argc,const char**argv,const char*prefix); 233intcmd_symbolic_ref(int argc,const char**argv,const char*prefix); 234intcmd_tag(int argc,const char**argv,const char*prefix); 235intcmd_tar_tree(int argc,const char**argv,const char*prefix); 236intcmd_unpack_file(int argc,const char**argv,const char*prefix); 237intcmd_unpack_objects(int argc,const char**argv,const char*prefix); 238intcmd_update_index(int argc,const char**argv,const char*prefix); 239intcmd_update_ref(int argc,const char**argv,const char*prefix); 240intcmd_update_server_info(int argc,const char**argv,const char*prefix); 241intcmd_upload_archive(int argc,const char**argv,const char*prefix); 242intcmd_upload_archive_writer(int argc,const char**argv,const char*prefix); 243intcmd_upload_pack(int argc,const char**argv,const char*prefix); 244intcmd_var(int argc,const char**argv,const char*prefix); 245intcmd_verify_commit(int argc,const char**argv,const char*prefix); 246intcmd_verify_tag(int argc,const char**argv,const char*prefix); 247intcmd_version(int argc,const char**argv,const char*prefix); 248intcmd_whatchanged(int argc,const char**argv,const char*prefix); 249intcmd_worktree(int argc,const char**argv,const char*prefix); 250intcmd_write_tree(int argc,const char**argv,const char*prefix); 251intcmd_verify_pack(int argc,const char**argv,const char*prefix); 252intcmd_show_ref(int argc,const char**argv,const char*prefix); 253intcmd_pack_refs(int argc,const char**argv,const char*prefix); 254intcmd_replace(int argc,const char**argv,const char*prefix); 255 256#endif