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 105externvoidprune_packed_objects(int); 106 107struct fmt_merge_msg_opts { 108unsigned add_title:1, 109 credit_people:1; 110int shortlog_len; 111}; 112 113externintfmt_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 */ 126externvoidsetup_auto_pager(const char*cmd,int def); 127 128externintis_builtin(const char*s); 129 130externintcmd_add(int argc,const char**argv,const char*prefix); 131externintcmd_am(int argc,const char**argv,const char*prefix); 132externintcmd_annotate(int argc,const char**argv,const char*prefix); 133externintcmd_apply(int argc,const char**argv,const char*prefix); 134externintcmd_archive(int argc,const char**argv,const char*prefix); 135externintcmd_bisect__helper(int argc,const char**argv,const char*prefix); 136externintcmd_blame(int argc,const char**argv,const char*prefix); 137externintcmd_branch(int argc,const char**argv,const char*prefix); 138externintcmd_bundle(int argc,const char**argv,const char*prefix); 139externintcmd_cat_file(int argc,const char**argv,const char*prefix); 140externintcmd_checkout(int argc,const char**argv,const char*prefix); 141externintcmd_checkout_index(int argc,const char**argv,const char*prefix); 142externintcmd_check_attr(int argc,const char**argv,const char*prefix); 143externintcmd_check_ignore(int argc,const char**argv,const char*prefix); 144externintcmd_check_mailmap(int argc,const char**argv,const char*prefix); 145externintcmd_check_ref_format(int argc,const char**argv,const char*prefix); 146externintcmd_cherry(int argc,const char**argv,const char*prefix); 147externintcmd_cherry_pick(int argc,const char**argv,const char*prefix); 148externintcmd_clone(int argc,const char**argv,const char*prefix); 149externintcmd_clean(int argc,const char**argv,const char*prefix); 150externintcmd_column(int argc,const char**argv,const char*prefix); 151externintcmd_commit(int argc,const char**argv,const char*prefix); 152externintcmd_commit_tree(int argc,const char**argv,const char*prefix); 153externintcmd_config(int argc,const char**argv,const char*prefix); 154externintcmd_count_objects(int argc,const char**argv,const char*prefix); 155externintcmd_credential(int argc,const char**argv,const char*prefix); 156externintcmd_describe(int argc,const char**argv,const char*prefix); 157externintcmd_diff_files(int argc,const char**argv,const char*prefix); 158externintcmd_diff_index(int argc,const char**argv,const char*prefix); 159externintcmd_diff(int argc,const char**argv,const char*prefix); 160externintcmd_diff_tree(int argc,const char**argv,const char*prefix); 161externintcmd_difftool(int argc,const char**argv,const char*prefix); 162externintcmd_fast_export(int argc,const char**argv,const char*prefix); 163externintcmd_fetch(int argc,const char**argv,const char*prefix); 164externintcmd_fetch_pack(int argc,const char**argv,const char*prefix); 165externintcmd_fmt_merge_msg(int argc,const char**argv,const char*prefix); 166externintcmd_for_each_ref(int argc,const char**argv,const char*prefix); 167externintcmd_format_patch(int argc,const char**argv,const char*prefix); 168externintcmd_fsck(int argc,const char**argv,const char*prefix); 169externintcmd_gc(int argc,const char**argv,const char*prefix); 170externintcmd_get_tar_commit_id(int argc,const char**argv,const char*prefix); 171externintcmd_grep(int argc,const char**argv,const char*prefix); 172externintcmd_hash_object(int argc,const char**argv,const char*prefix); 173externintcmd_help(int argc,const char**argv,const char*prefix); 174externintcmd_index_pack(int argc,const char**argv,const char*prefix); 175externintcmd_init_db(int argc,const char**argv,const char*prefix); 176externintcmd_interpret_trailers(int argc,const char**argv,const char*prefix); 177externintcmd_log(int argc,const char**argv,const char*prefix); 178externintcmd_log_reflog(int argc,const char**argv,const char*prefix); 179externintcmd_ls_files(int argc,const char**argv,const char*prefix); 180externintcmd_ls_tree(int argc,const char**argv,const char*prefix); 181externintcmd_ls_remote(int argc,const char**argv,const char*prefix); 182externintcmd_mailinfo(int argc,const char**argv,const char*prefix); 183externintcmd_mailsplit(int argc,const char**argv,const char*prefix); 184externintcmd_merge(int argc,const char**argv,const char*prefix); 185externintcmd_merge_base(int argc,const char**argv,const char*prefix); 186externintcmd_merge_index(int argc,const char**argv,const char*prefix); 187externintcmd_merge_ours(int argc,const char**argv,const char*prefix); 188externintcmd_merge_file(int argc,const char**argv,const char*prefix); 189externintcmd_merge_recursive(int argc,const char**argv,const char*prefix); 190externintcmd_merge_tree(int argc,const char**argv,const char*prefix); 191externintcmd_mktag(int argc,const char**argv,const char*prefix); 192externintcmd_mktree(int argc,const char**argv,const char*prefix); 193externintcmd_mv(int argc,const char**argv,const char*prefix); 194externintcmd_name_rev(int argc,const char**argv,const char*prefix); 195externintcmd_notes(int argc,const char**argv,const char*prefix); 196externintcmd_pack_objects(int argc,const char**argv,const char*prefix); 197externintcmd_pack_redundant(int argc,const char**argv,const char*prefix); 198externintcmd_patch_id(int argc,const char**argv,const char*prefix); 199externintcmd_prune(int argc,const char**argv,const char*prefix); 200externintcmd_prune_packed(int argc,const char**argv,const char*prefix); 201externintcmd_pull(int argc,const char**argv,const char*prefix); 202externintcmd_push(int argc,const char**argv,const char*prefix); 203externintcmd_read_tree(int argc,const char**argv,const char*prefix); 204externintcmd_rebase__helper(int argc,const char**argv,const char*prefix); 205externintcmd_receive_pack(int argc,const char**argv,const char*prefix); 206externintcmd_reflog(int argc,const char**argv,const char*prefix); 207externintcmd_remote(int argc,const char**argv,const char*prefix); 208externintcmd_remote_ext(int argc,const char**argv,const char*prefix); 209externintcmd_remote_fd(int argc,const char**argv,const char*prefix); 210externintcmd_repack(int argc,const char**argv,const char*prefix); 211externintcmd_rerere(int argc,const char**argv,const char*prefix); 212externintcmd_reset(int argc,const char**argv,const char*prefix); 213externintcmd_rev_list(int argc,const char**argv,const char*prefix); 214externintcmd_rev_parse(int argc,const char**argv,const char*prefix); 215externintcmd_revert(int argc,const char**argv,const char*prefix); 216externintcmd_rm(int argc,const char**argv,const char*prefix); 217externintcmd_send_pack(int argc,const char**argv,const char*prefix); 218externintcmd_shortlog(int argc,const char**argv,const char*prefix); 219externintcmd_show(int argc,const char**argv,const char*prefix); 220externintcmd_show_branch(int argc,const char**argv,const char*prefix); 221externintcmd_status(int argc,const char**argv,const char*prefix); 222externintcmd_stripspace(int argc,const char**argv,const char*prefix); 223externintcmd_submodule__helper(int argc,const char**argv,const char*prefix); 224externintcmd_symbolic_ref(int argc,const char**argv,const char*prefix); 225externintcmd_tag(int argc,const char**argv,const char*prefix); 226externintcmd_tar_tree(int argc,const char**argv,const char*prefix); 227externintcmd_unpack_file(int argc,const char**argv,const char*prefix); 228externintcmd_unpack_objects(int argc,const char**argv,const char*prefix); 229externintcmd_update_index(int argc,const char**argv,const char*prefix); 230externintcmd_update_ref(int argc,const char**argv,const char*prefix); 231externintcmd_update_server_info(int argc,const char**argv,const char*prefix); 232externintcmd_upload_archive(int argc,const char**argv,const char*prefix); 233externintcmd_upload_archive_writer(int argc,const char**argv,const char*prefix); 234externintcmd_var(int argc,const char**argv,const char*prefix); 235externintcmd_verify_commit(int argc,const char**argv,const char*prefix); 236externintcmd_verify_tag(int argc,const char**argv,const char*prefix); 237externintcmd_version(int argc,const char**argv,const char*prefix); 238externintcmd_whatchanged(int argc,const char**argv,const char*prefix); 239externintcmd_worktree(int argc,const char**argv,const char*prefix); 240externintcmd_write_tree(int argc,const char**argv,const char*prefix); 241externintcmd_verify_pack(int argc,const char**argv,const char*prefix); 242externintcmd_show_ref(int argc,const char**argv,const char*prefix); 243externintcmd_pack_refs(int argc,const char**argv,const char*prefix); 244externintcmd_replace(int argc,const char**argv,const char*prefix); 245 246#endif