2006-04-21 21:27:34 +04:00
|
|
|
#ifndef BUILTIN_H
|
|
|
|
#define BUILTIN_H
|
|
|
|
|
2006-09-16 09:47:21 +04:00
|
|
|
#include "git-compat-util.h"
|
2008-06-27 20:21:59 +04:00
|
|
|
#include "strbuf.h"
|
2008-07-01 06:37:49 +04:00
|
|
|
#include "cache.h"
|
|
|
|
#include "commit.h"
|
2006-04-21 21:27:34 +04:00
|
|
|
|
2017-08-02 22:40:49 +03:00
|
|
|
/*
|
|
|
|
* builtin API
|
|
|
|
* ===========
|
|
|
|
*
|
|
|
|
* Adding a new built-in
|
|
|
|
* ---------------------
|
|
|
|
*
|
|
|
|
* There are 4 things to do to add a built-in command implementation to
|
|
|
|
* Git:
|
|
|
|
*
|
|
|
|
* . Define the implementation of the built-in command `foo` with
|
|
|
|
* signature:
|
|
|
|
*
|
|
|
|
* int cmd_foo(int argc, const char **argv, const char *prefix);
|
|
|
|
*
|
|
|
|
* . Add the external declaration for the function to `builtin.h`.
|
|
|
|
*
|
|
|
|
* . Add the command to the `commands[]` table defined in `git.c`.
|
|
|
|
* The entry should look like:
|
|
|
|
*
|
|
|
|
* { "foo", cmd_foo, <options> },
|
|
|
|
*
|
|
|
|
* where options is the bitwise-or of:
|
|
|
|
*
|
|
|
|
* `RUN_SETUP`:
|
|
|
|
* If there is not a Git directory to work on, abort. If there
|
|
|
|
* is a work tree, chdir to the top of it if the command was
|
|
|
|
* invoked in a subdirectory. If there is no work tree, no
|
|
|
|
* chdir() is done.
|
|
|
|
*
|
|
|
|
* `RUN_SETUP_GENTLY`:
|
|
|
|
* If there is a Git directory, chdir as per RUN_SETUP, otherwise,
|
|
|
|
* don't chdir anywhere.
|
|
|
|
*
|
|
|
|
* `USE_PAGER`:
|
|
|
|
*
|
|
|
|
* If the standard output is connected to a tty, spawn a pager and
|
|
|
|
* feed our output to it.
|
|
|
|
*
|
|
|
|
* `NEED_WORK_TREE`:
|
|
|
|
*
|
|
|
|
* Make sure there is a work tree, i.e. the command cannot act
|
|
|
|
* on bare repositories.
|
|
|
|
* This only makes sense when `RUN_SETUP` is also set.
|
|
|
|
*
|
|
|
|
* `SUPPORT_SUPER_PREFIX`:
|
|
|
|
*
|
|
|
|
* The built-in supports `--super-prefix`.
|
|
|
|
*
|
git.c: let builtins opt for handling `pager.foo` themselves
Before launching a builtin git foo and unless mechanisms with precedence
are in use, we check for and handle the `pager.foo` config. This is done
without considering exactly how git foo is being used, and indeed, git.c
cannot (and should not) know what the arguments to git foo are supposed
to achieve.
In practice this means that, e.g., `git -c pager.tag tag -a new-tag`
results in errors such as "Vim: Warning: Output is not to a terminal"
and a garbled terminal. Someone who makes use of both `git tag -a` and
`git tag -l` will probably not set `pager.tag`, so that `git tag -a`
will actually work, at the cost of not paging output of `git tag -l`.
To allow individual builtins to make more informed decisions about when
to respect `pager.foo`, introduce a flag DELAY_PAGER_CONFIG. If the flag
is set, do not check `pager.foo`.
Do not check for DELAY_PAGER_CONFIG in `execv_dashed_external()`. That
call site is arguably wrong, although in a way that is not yet visible,
and will be changed in a slightly different direction in a later patch.
Don't add any users of DELAY_PAGER_CONFIG just yet, one will follow in a
later patch.
Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-08-02 22:40:50 +03:00
|
|
|
* `DELAY_PAGER_CONFIG`:
|
|
|
|
*
|
|
|
|
* If RUN_SETUP or RUN_SETUP_GENTLY is set, git.c normally handles
|
|
|
|
* the `pager.<cmd>`-configuration. If this flag is used, git.c
|
|
|
|
* will skip that step, instead allowing the built-in to make a
|
|
|
|
* more informed decision, e.g., by ignoring `pager.<cmd>` for
|
|
|
|
* certain subcommands.
|
|
|
|
*
|
2017-08-02 22:40:49 +03:00
|
|
|
* . Add `builtin/foo.o` to `BUILTIN_OBJS` in `Makefile`.
|
|
|
|
*
|
|
|
|
* Additionally, if `foo` is a new command, there are 4 more things to do:
|
|
|
|
*
|
|
|
|
* . Add tests to `t/` directory.
|
|
|
|
*
|
|
|
|
* . Write documentation in `Documentation/git-foo.txt`.
|
|
|
|
*
|
|
|
|
* . Add an entry for `git-foo` to `command-list.txt`.
|
|
|
|
*
|
|
|
|
* . Add an entry for `/git-foo` to `.gitignore`.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* How a built-in is called
|
|
|
|
* ------------------------
|
|
|
|
*
|
|
|
|
* The implementation `cmd_foo()` takes three parameters, `argc`, `argv,
|
|
|
|
* and `prefix`. The first two are similar to what `main()` of a
|
|
|
|
* standalone command would be called with.
|
|
|
|
*
|
|
|
|
* When `RUN_SETUP` is specified in the `commands[]` table, and when you
|
|
|
|
* were started from a subdirectory of the work tree, `cmd_foo()` is called
|
|
|
|
* after chdir(2) to the top of the work tree, and `prefix` gets the path
|
|
|
|
* to the subdirectory the command started from. This allows you to
|
|
|
|
* convert a user-supplied pathname (typically relative to that directory)
|
|
|
|
* to a pathname relative to the top of the work tree.
|
|
|
|
*
|
|
|
|
* The return value from `cmd_foo()` becomes the exit status of the
|
|
|
|
* command.
|
|
|
|
*/
|
|
|
|
|
2006-07-31 01:42:25 +04:00
|
|
|
extern const char git_usage_string[];
|
2008-06-06 01:15:36 +04:00
|
|
|
extern const char git_more_info_string[];
|
2006-04-21 21:27:34 +04:00
|
|
|
|
2017-08-02 22:40:51 +03:00
|
|
|
/**
|
|
|
|
* If a built-in has DELAY_PAGER_CONFIG set, the built-in should call this early
|
|
|
|
* when it wishes to respect the `pager.foo`-config. The `cmd` is the name of
|
|
|
|
* the built-in, e.g., "foo". If a paging-choice has already been setup, this
|
|
|
|
* does nothing. The default in `def` should be 0 for "pager off", 1 for "pager
|
|
|
|
* on" or -1 for "punt".
|
|
|
|
*
|
|
|
|
* You should most likely use a default of 0 or 1. "Punt" (-1) could be useful
|
|
|
|
* to be able to fall back to some historical compatibility name.
|
|
|
|
*/
|
2019-04-29 11:28:14 +03:00
|
|
|
void setup_auto_pager(const char *cmd, int def);
|
2017-08-02 22:40:51 +03:00
|
|
|
|
2019-04-29 11:28:14 +03:00
|
|
|
int is_builtin(const char *s);
|
2014-01-02 20:17:11 +04:00
|
|
|
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_add(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_am(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_annotate(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_apply(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_archive(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_bisect__helper(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_blame(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_branch(int argc, const char **argv, const char *prefix);
|
2020-08-13 17:59:36 +03:00
|
|
|
int cmd_bugreport(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_bundle(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_cat_file(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_checkout(int argc, const char **argv, const char *prefix);
|
parallel-checkout: make it truly parallel
Use multiple worker processes to distribute the queued entries and call
write_pc_item() in parallel for them. The items are distributed
uniformly in contiguous chunks. This minimizes the chances of two
workers writing to the same directory simultaneously, which could affect
performance due to lock contention in the kernel. Work stealing (or any
other format of re-distribution) is not implemented yet.
The protocol between the main process and the workers is quite simple.
They exchange binary messages packed in pkt-line format, and use
PKT-FLUSH to mark the end of input (from both sides). The main process
starts the communication by sending N pkt-lines, each corresponding to
an item that needs to be written. These packets contain all the
necessary information to load, smudge, and write the blob associated
with each item. Then it waits for the worker to send back N pkt-lines
containing the results for each item. The resulting packet must contain:
the identification number of the item that it refers to, the status of
the operation, and the lstat() data gathered after writing the file (iff
the operation was successful).
For now, checkout always uses a hardcoded value of 2 workers, only to
demonstrate that the parallel checkout framework correctly divides and
writes the queued entries. The next patch will add user configurations
and define a more reasonable default, based on tests with the said
settings.
Co-authored-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-04-19 03:14:54 +03:00
|
|
|
int cmd_checkout__worker(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_checkout_index(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_check_attr(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_check_ignore(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_check_mailmap(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_cherry(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_cherry_pick(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_clone(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_clean(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_column(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_commit(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_commit_graph(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_commit_tree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_config(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_count_objects(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_credential(int argc, const char **argv, const char *prefix);
|
2020-08-13 17:58:55 +03:00
|
|
|
int cmd_credential_cache(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_credential_cache_daemon(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_credential_store(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_describe(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_diff_files(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_diff_index(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_diff(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_diff_tree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_difftool(int argc, const char **argv, const char *prefix);
|
2019-06-21 13:18:06 +03:00
|
|
|
int cmd_env__helper(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_fast_export(int argc, const char **argv, const char *prefix);
|
2020-08-13 17:59:45 +03:00
|
|
|
int cmd_fast_import(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_fetch(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_for_each_ref(int argc, const char **argv, const char *prefix);
|
2020-09-11 20:49:16 +03:00
|
|
|
int cmd_for_each_repo(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_format_patch(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_fsck(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_gc(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_grep(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_hash_object(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_help(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_index_pack(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_init_db(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_interpret_trailers(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_log(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_log_reflog(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_ls_files(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_ls_tree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_ls_remote(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_mailinfo(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_mailsplit(int argc, const char **argv, const char *prefix);
|
maintenance: create basic maintenance runner
The 'gc' builtin is our current entrypoint for automatically maintaining
a repository. This one tool does many operations, such as repacking the
repository, packing refs, and rewriting the commit-graph file. The name
implies it performs "garbage collection" which means several different
things, and some users may not want to use this operation that rewrites
the entire object database.
Create a new 'maintenance' builtin that will become a more general-
purpose command. To start, it will only support the 'run' subcommand,
but will later expand to add subcommands for scheduling maintenance in
the background.
For now, the 'maintenance' builtin is a thin shim over the 'gc' builtin.
In fact, the only option is the '--auto' toggle, which is handed
directly to the 'gc' builtin. The current change is isolated to this
simple operation to prevent more interesting logic from being lost in
all of the boilerplate of adding a new builtin.
Use existing builtin/gc.c file because we want to share code between the
two builtins. It is possible that we will have 'maintenance' replace the
'gc' builtin entirely at some point, leaving 'git gc' as an alias for
some specific arguments to 'git maintenance run'.
Create a new test_subcommand helper that allows us to test if a certain
subcommand was run. It requires storing the GIT_TRACE2_EVENT logs in a
file. A negation mode is available that will be used in later tests.
Helped-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-09-17 21:11:42 +03:00
|
|
|
int cmd_maintenance(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_merge(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_merge_base(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_merge_index(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_merge_ours(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_merge_file(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_merge_recursive(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_merge_tree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_mktag(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_mktree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_multi_pack_index(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_mv(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_name_rev(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_notes(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_pack_objects(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_pack_redundant(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_patch_id(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_prune(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_prune_packed(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_pull(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_push(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_range_diff(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_read_tree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_rebase(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_rebase__interactive(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_receive_pack(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_reflog(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_remote(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_remote_ext(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_remote_fd(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_repack(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_rerere(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_reset(int argc, const char **argv, const char *prefix);
|
2019-07-10 01:25:44 +03:00
|
|
|
int cmd_restore(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_rev_list(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_rev_parse(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_revert(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_rm(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_send_pack(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_shortlog(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_show(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_show_branch(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_show_index(int argc, const char **argv, const char *prefix);
|
2019-11-22 01:04:33 +03:00
|
|
|
int cmd_sparse_checkout(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_status(int argc, const char **argv, const char *prefix);
|
2019-05-13 17:50:32 +03:00
|
|
|
int cmd_stash(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_stripspace(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
|
2019-07-10 01:25:44 +03:00
|
|
|
int cmd_switch(int argc, const char **argv, const char *prefix);
|
2019-04-29 11:28:14 +03:00
|
|
|
int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_tag(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_tar_tree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_unpack_file(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_update_index(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_update_ref(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_update_server_info(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_upload_archive(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_upload_pack(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_var(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_verify_commit(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_verify_tag(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_version(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_whatchanged(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_worktree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_write_tree(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_verify_pack(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_show_ref(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_pack_refs(int argc, const char **argv, const char *prefix);
|
|
|
|
int cmd_replace(int argc, const char **argv, const char *prefix);
|
2006-06-14 00:21:50 +04:00
|
|
|
|
2006-04-21 21:27:34 +04:00
|
|
|
#endif
|