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 extern const char git_usage_string[]; 98 extern const char git_more_info_string[]; 99 100 /** 101 * If a built-in has DELAY_PAGER_CONFIG set, the built-in should call this early 102 * when it wishes to respect the `pager.foo`-config. The `cmd` is the name of 103 * the built-in, e.g., "foo". If a paging-choice has already been setup, this 104 * does nothing. The default in `def` should be 0 for "pager off", 1 for "pager 105 * on" or -1 for "punt". 106 * 107 * You should most likely use a default of 0 or 1. "Punt" (-1) could be useful 108 * to be able to fall back to some historical compatibility name. 109 */ 110 void setup_auto_pager(const char *cmd, int def); 111 112 int is_builtin(const char *s); 113 114 int cmd_add(int argc, const char **argv, const char *prefix); 115 int cmd_am(int argc, const char **argv, const char *prefix); 116 int cmd_annotate(int argc, const char **argv, const char *prefix); 117 int cmd_apply(int argc, const char **argv, const char *prefix); 118 int cmd_archive(int argc, const char **argv, const char *prefix); 119 int cmd_bisect__helper(int argc, const char **argv, const char *prefix); 120 int cmd_blame(int argc, const char **argv, const char *prefix); 121 int cmd_branch(int argc, const char **argv, const char *prefix); 122 int cmd_bugreport(int argc, const char **argv, const char *prefix); 123 int cmd_bundle(int argc, const char **argv, const char *prefix); 124 int cmd_cat_file(int argc, const char **argv, const char *prefix); 125 int cmd_checkout(int argc, const char **argv, const char *prefix); 126 int cmd_checkout__worker(int argc, const char **argv, const char *prefix); 127 int cmd_checkout_index(int argc, const char **argv, const char *prefix); 128 int cmd_check_attr(int argc, const char **argv, const char *prefix); 129 int cmd_check_ignore(int argc, const char **argv, const char *prefix); 130 int cmd_check_mailmap(int argc, const char **argv, const char *prefix); 131 int cmd_check_ref_format(int argc, const char **argv, const char *prefix); 132 int cmd_cherry(int argc, const char **argv, const char *prefix); 133 int cmd_cherry_pick(int argc, const char **argv, const char *prefix); 134 int cmd_clone(int argc, const char **argv, const char *prefix); 135 int cmd_clean(int argc, const char **argv, const char *prefix); 136 int cmd_column(int argc, const char **argv, const char *prefix); 137 int cmd_commit(int argc, const char **argv, const char *prefix); 138 int cmd_commit_graph(int argc, const char **argv, const char *prefix); 139 int cmd_commit_tree(int argc, const char **argv, const char *prefix); 140 int cmd_config(int argc, const char **argv, const char *prefix); 141 int cmd_count_objects(int argc, const char **argv, const char *prefix); 142 int cmd_credential(int argc, const char **argv, const char *prefix); 143 int cmd_credential_cache(int argc, const char **argv, const char *prefix); 144 int cmd_credential_cache_daemon(int argc, const char **argv, const char *prefix); 145 int cmd_credential_store(int argc, const char **argv, const char *prefix); 146 int cmd_describe(int argc, const char **argv, const char *prefix); 147 int cmd_diff_files(int argc, const char **argv, const char *prefix); 148 int cmd_diff_index(int argc, const char **argv, const char *prefix); 149 int cmd_diff(int argc, const char **argv, const char *prefix); 150 int cmd_diff_tree(int argc, const char **argv, const char *prefix); 151 int cmd_difftool(int argc, const char **argv, const char *prefix); 152 int cmd_env__helper(int argc, const char **argv, const char *prefix); 153 int cmd_fast_export(int argc, const char **argv, const char *prefix); 154 int cmd_fast_import(int argc, const char **argv, const char *prefix); 155 int cmd_fetch(int argc, const char **argv, const char *prefix); 156 int cmd_fetch_pack(int argc, const char **argv, const char *prefix); 157 int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix); 158 int cmd_for_each_ref(int argc, const char **argv, const char *prefix); 159 int cmd_for_each_repo(int argc, const char **argv, const char *prefix); 160 int cmd_format_patch(int argc, const char **argv, const char *prefix); 161 int cmd_fsck(int argc, const char **argv, const char *prefix); 162 int cmd_gc(int argc, const char **argv, const char *prefix); 163 int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix); 164 int cmd_grep(int argc, const char **argv, const char *prefix); 165 int cmd_hash_object(int argc, const char **argv, const char *prefix); 166 int cmd_help(int argc, const char **argv, const char *prefix); 167 int cmd_index_pack(int argc, const char **argv, const char *prefix); 168 int cmd_init_db(int argc, const char **argv, const char *prefix); 169 int cmd_interpret_trailers(int argc, const char **argv, const char *prefix); 170 int cmd_log(int argc, const char **argv, const char *prefix); 171 int cmd_log_reflog(int argc, const char **argv, const char *prefix); 172 int cmd_ls_files(int argc, const char **argv, const char *prefix); 173 int cmd_ls_tree(int argc, const char **argv, const char *prefix); 174 int cmd_ls_remote(int argc, const char **argv, const char *prefix); 175 int cmd_mailinfo(int argc, const char **argv, const char *prefix); 176 int cmd_mailsplit(int argc, const char **argv, const char *prefix); 177 int cmd_maintenance(int argc, const char **argv, const char *prefix); 178 int cmd_merge(int argc, const char **argv, const char *prefix); 179 int cmd_merge_base(int argc, const char **argv, const char *prefix); 180 int cmd_merge_index(int argc, const char **argv, const char *prefix); 181 int cmd_merge_ours(int argc, const char **argv, const char *prefix); 182 int cmd_merge_file(int argc, const char **argv, const char *prefix); 183 int cmd_merge_recursive(int argc, const char **argv, const char *prefix); 184 int cmd_merge_tree(int argc, const char **argv, const char *prefix); 185 int cmd_mktag(int argc, const char **argv, const char *prefix); 186 int cmd_mktree(int argc, const char **argv, const char *prefix); 187 int cmd_multi_pack_index(int argc, const char **argv, const char *prefix); 188 int cmd_mv(int argc, const char **argv, const char *prefix); 189 int cmd_name_rev(int argc, const char **argv, const char *prefix); 190 int cmd_notes(int argc, const char **argv, const char *prefix); 191 int cmd_pack_objects(int argc, const char **argv, const char *prefix); 192 int cmd_pack_redundant(int argc, const char **argv, const char *prefix); 193 int cmd_patch_id(int argc, const char **argv, const char *prefix); 194 int cmd_prune(int argc, const char **argv, const char *prefix); 195 int cmd_prune_packed(int argc, const char **argv, const char *prefix); 196 int cmd_pull(int argc, const char **argv, const char *prefix); 197 int cmd_push(int argc, const char **argv, const char *prefix); 198 int cmd_range_diff(int argc, const char **argv, const char *prefix); 199 int cmd_read_tree(int argc, const char **argv, const char *prefix); 200 int cmd_rebase(int argc, const char **argv, const char *prefix); 201 int cmd_rebase__interactive(int argc, const char **argv, const char *prefix); 202 int cmd_receive_pack(int argc, const char **argv, const char *prefix); 203 int cmd_reflog(int argc, const char **argv, const char *prefix); 204 int cmd_remote(int argc, const char **argv, const char *prefix); 205 int cmd_remote_ext(int argc, const char **argv, const char *prefix); 206 int cmd_remote_fd(int argc, const char **argv, const char *prefix); 207 int cmd_repack(int argc, const char **argv, const char *prefix); 208 int cmd_rerere(int argc, const char **argv, const char *prefix); 209 int cmd_reset(int argc, const char **argv, const char *prefix); 210 int cmd_restore(int argc, const char **argv, const char *prefix); 211 int cmd_rev_list(int argc, const char **argv, const char *prefix); 212 int cmd_rev_parse(int argc, const char **argv, const char *prefix); 213 int cmd_revert(int argc, const char **argv, const char *prefix); 214 int cmd_rm(int argc, const char **argv, const char *prefix); 215 int cmd_send_pack(int argc, const char **argv, const char *prefix); 216 int cmd_shortlog(int argc, const char **argv, const char *prefix); 217 int cmd_show(int argc, const char **argv, const char *prefix); 218 int cmd_show_branch(int argc, const char **argv, const char *prefix); 219 int cmd_show_index(int argc, const char **argv, const char *prefix); 220 int cmd_sparse_checkout(int argc, const char **argv, const char *prefix); 221 int cmd_status(int argc, const char **argv, const char *prefix); 222 int cmd_stash(int argc, const char **argv, const char *prefix); 223 int cmd_stripspace(int argc, const char **argv, const char *prefix); 224 int cmd_submodule__helper(int argc, const char **argv, const char *prefix); 225 int cmd_switch(int argc, const char **argv, const char *prefix); 226 int cmd_symbolic_ref(int argc, const char **argv, const char *prefix); 227 int cmd_tag(int argc, const char **argv, const char *prefix); 228 int cmd_unpack_file(int argc, const char **argv, const char *prefix); 229 int cmd_unpack_objects(int argc, const char **argv, const char *prefix); 230 int cmd_update_index(int argc, const char **argv, const char *prefix); 231 int cmd_update_ref(int argc, const char **argv, const char *prefix); 232 int cmd_update_server_info(int argc, const char **argv, const char *prefix); 233 int cmd_upload_archive(int argc, const char **argv, const char *prefix); 234 int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix); 235 int cmd_upload_pack(int argc, const char **argv, const char *prefix); 236 int cmd_var(int argc, const char **argv, const char *prefix); 237 int cmd_verify_commit(int argc, const char **argv, const char *prefix); 238 int cmd_verify_tag(int argc, const char **argv, const char *prefix); 239 int cmd_version(int argc, const char **argv, const char *prefix); 240 int cmd_whatchanged(int argc, const char **argv, const char *prefix); 241 int cmd_worktree(int argc, const char **argv, const char *prefix); 242 int cmd_write_tree(int argc, const char **argv, const char *prefix); 243 int cmd_verify_pack(int argc, const char **argv, const char *prefix); 244 int cmd_show_ref(int argc, const char **argv, const char *prefix); 245 int cmd_pack_refs(int argc, const char **argv, const char *prefix); 246 int cmd_replace(int argc, const char **argv, const char *prefix); 247 248 #endif 249