2006-04-22 01:27:34 +08:00
|
|
|
#ifndef BUILTIN_H
|
|
|
|
#define BUILTIN_H
|
|
|
|
|
2006-09-16 13:47:21 +08:00
|
|
|
#include "git-compat-util.h"
|
2008-06-28 00:21:59 +08:00
|
|
|
#include "strbuf.h"
|
2008-07-01 10:37:49 +08:00
|
|
|
#include "cache.h"
|
|
|
|
#include "commit.h"
|
2006-04-22 01:27:34 +08:00
|
|
|
|
2017-08-03 03:40:49 +08: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-03 03:40:50 +08: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-03 03:40:49 +08: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.
|
|
|
|
*/
|
|
|
|
|
2010-09-09 01:59:53 +08:00
|
|
|
#define DEFAULT_MERGE_LOG_LEN 20
|
|
|
|
|
2006-07-31 05:42:25 +08:00
|
|
|
extern const char git_usage_string[];
|
2008-06-06 05:15:36 +08:00
|
|
|
extern const char git_more_info_string[];
|
2006-04-22 01:27:34 +08:00
|
|
|
|
2013-05-27 19:18:47 +08:00
|
|
|
#define PRUNE_PACKED_DRY_RUN 01
|
|
|
|
#define PRUNE_PACKED_VERBOSE 02
|
|
|
|
|
2006-10-23 07:01:23 +08:00
|
|
|
extern void prune_packed_objects(int);
|
2011-11-05 08:35:42 +08:00
|
|
|
|
|
|
|
struct fmt_merge_msg_opts {
|
2012-12-29 07:29:31 +08:00
|
|
|
unsigned add_title:1,
|
|
|
|
credit_people:1;
|
2011-11-05 08:35:42 +08:00
|
|
|
int shortlog_len;
|
|
|
|
};
|
|
|
|
|
2010-09-09 01:59:53 +08:00
|
|
|
extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
|
2011-11-05 08:35:42 +08:00
|
|
|
struct fmt_merge_msg_opts *);
|
2010-03-13 01:04:32 +08:00
|
|
|
|
2017-08-03 03:40:51 +08: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.
|
|
|
|
*/
|
|
|
|
extern void setup_auto_pager(const char *cmd, int def);
|
|
|
|
|
2014-01-03 00:17:11 +08:00
|
|
|
extern int is_builtin(const char *s);
|
|
|
|
|
2006-07-29 13:44:25 +08:00
|
|
|
extern int cmd_add(int argc, const char **argv, const char *prefix);
|
2015-08-04 21:51:24 +08:00
|
|
|
extern int cmd_am(int argc, const char **argv, const char *prefix);
|
2006-10-09 18:32:05 +08:00
|
|
|
extern int cmd_annotate(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_apply(int argc, const char **argv, const char *prefix);
|
Add git-archive
git-archive is a command to make TAR and ZIP archives of a git tree.
It helps prevent a proliferation of git-{format}-tree commands.
Instead of directly calling git-{tar,zip}-tree command, it defines
a very simple API, that archiver should implement and register in
"git-archive.c". This API is made up by 2 functions whose prototype
is defined in "archive.h" file.
- The first one is used to parse 'extra' parameters which have
signification only for the specific archiver. That would allow
different archive backends to have different kind of options.
- The second one is used to ask to an archive backend to build
the archive given some already resolved parameters.
The main reason for making this API is to avoid using
git-{tar,zip}-tree commands, hence making them useless. Maybe it's
time for them to die ?
It also implements remote operations by defining a very simple
protocol: it first sends the name of the specific uploader followed
the repository name (git-upload-tar git://example.org/repo.git).
Then it sends options. It's done by sending a sequence of one
argument per packet, with prefix "argument ", followed by a flush.
The remote protocol is implemented in "git-archive.c" for client
side and is triggered by "--remote=<repo>" option. For example,
to fetch a TAR archive in a remote repo, you can issue:
$ git archive --format=tar --remote=git://xxx/yyy/zzz.git HEAD
We choose to not make a new command "git-fetch-archive" for example,
avoind one more GIT command which should be nice for users (less
commands to remember, keeps existing --remote option).
Signed-off-by: Franck Bui-Huu <vagabon.xyz@gmail.com>
Acked-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-09-07 21:12:02 +08:00
|
|
|
extern int cmd_archive(int argc, const char **argv, const char *prefix);
|
2009-03-26 12:55:54 +08:00
|
|
|
extern int cmd_bisect__helper(int argc, const char **argv, const char *prefix);
|
2006-11-09 10:47:54 +08:00
|
|
|
extern int cmd_blame(int argc, const char **argv, const char *prefix);
|
2006-10-24 05:27:45 +08:00
|
|
|
extern int cmd_branch(int argc, const char **argv, const char *prefix);
|
Add git-bundle: move objects and references by archive
Some workflows require use of repositories on machines that cannot be
connected, preventing use of git-fetch / git-push to transport objects and
references between the repositories.
git-bundle provides an alternate transport mechanism, effectively allowing
git-fetch and git-pull to operate using sneakernet transport. `git-bundle
create` allows the user to create a bundle containing one or more branches
or tags, but with specified basis assumed to exist on the target
repository. At the receiving end, git-bundle acts like git-fetch-pack,
allowing the user to invoke git-fetch or git-pull using the bundle file as
the URL. git-fetch and git-ls-remote determine they have a bundle URL by
checking that the URL points to a file, but are otherwise unchanged in
operation with bundles.
The original patch was done by Mark Levedahl <mdl123@verizon.net>.
It was updated to make git-bundle a builtin, and get rid of the tar
format: now, the first line is supposed to say "# v2 git bundle", the next
lines either contain a prerequisite ("-" followed by the hash of the
needed commit), or a ref (the hash of a commit, followed by the name of
the ref), and finally the pack. As a result, the bundle argument can be
"-" now.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-22 08:59:14 +08:00
|
|
|
extern int cmd_bundle(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_cat_file(int argc, const char **argv, const char *prefix);
|
Build in checkout
The only differences in behavior should be:
- git checkout -m with non-trivial merging won't print out
merge-recursive messages (see the change in t7201-co.sh)
- git checkout -- paths... will give a sensible error message if
HEAD is invalid as a commit.
- some intermediate states which were written to disk in the shell
version (in particular, index states) are only kept in memory in
this version, and therefore these can no longer be revealed by
later write operations becoming impossible.
- when we change branches, we discard MERGE_MSG, SQUASH_MSG, and
rr-cache/MERGE_RR, like reset always has.
I'm not 100% sure I got the merge recursive setup exactly right; the
base for a non-trivial merge in the shell code doesn't seem
theoretically justified to me, but I tried to match it anyway, and the
tests all pass this way.
Other than these items, the results should be identical to the shell
version, so far as I can tell.
[jc: squashed lock-file fix from Dscho in]
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-02-08 00:40:23 +08:00
|
|
|
extern int cmd_checkout(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_checkout_index(int argc, const char **argv, const char *prefix);
|
Add basic infrastructure to assign attributes to paths
This adds the basic infrastructure to assign attributes to
paths, in a way similar to what the exclusion mechanism does
based on $GIT_DIR/info/exclude and .gitignore files.
An attribute is just a simple string that does not contain any
whitespace. They can be specified in $GIT_DIR/info/attributes
file, and .gitattributes file in each directory.
Each line in these files defines a pattern matching rule.
Similar to the exclusion mechanism, a later match overrides an
earlier match in the same file, and entries from .gitattributes
file in the same directory takes precedence over the ones from
parent directories. Lines in $GIT_DIR/info/attributes file are
used as the lowest precedence default rules.
A line is either a comment (an empty line, or a line that begins
with a '#'), or a rule, which is a whitespace separated list of
tokens. The first token on the line is a shell glob pattern.
The rest are names of attributes, each of which can optionally
be prefixed with '!'. Such a line means "if a path matches this
glob, this attribute is set (or unset -- if the attribute name
is prefixed with '!'). For glob matching, the same "if the
pattern does not have a slash in it, the basename of the path is
matched with fnmatch(3) against the pattern, otherwise, the path
is matched with the pattern with FNM_PATHNAME" rule as the
exclusion mechanism is used.
This does not define what an attribute means. Tying an
attribute to various effects it has on git operation for paths
that have it will be specified separately.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-04-12 16:07:32 +08:00
|
|
|
extern int cmd_check_attr(int argc, const char **argv, const char *prefix);
|
2013-01-07 00:58:13 +08:00
|
|
|
extern int cmd_check_ignore(int argc, const char **argv, const char *prefix);
|
2013-07-13 08:53:10 +08:00
|
|
|
extern int cmd_check_mailmap(int argc, const char **argv, const char *prefix);
|
2006-07-29 13:44:25 +08:00
|
|
|
extern int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
|
2006-10-24 07:01:57 +08:00
|
|
|
extern int cmd_cherry(int argc, const char **argv, const char *prefix);
|
2007-03-01 12:26:30 +08:00
|
|
|
extern int cmd_cherry_pick(int argc, const char **argv, const char *prefix);
|
2008-04-28 01:39:30 +08:00
|
|
|
extern int cmd_clone(int argc, const char **argv, const char *prefix);
|
2007-11-12 09:48:47 +08:00
|
|
|
extern int cmd_clean(int argc, const char **argv, const char *prefix);
|
2012-04-21 12:44:32 +08:00
|
|
|
extern int cmd_column(int argc, const char **argv, const char *prefix);
|
2007-11-09 00:59:00 +08:00
|
|
|
extern int cmd_commit(int argc, const char **argv, const char *prefix);
|
2018-04-03 04:34:18 +08:00
|
|
|
extern int cmd_commit_graph(int argc, const char **argv, const char *prefix);
|
2006-07-29 13:44:25 +08:00
|
|
|
extern int cmd_commit_tree(int argc, const char **argv, const char *prefix);
|
2011-02-12 21:24:10 +08:00
|
|
|
extern int cmd_config(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_count_objects(int argc, const char **argv, const char *prefix);
|
2012-06-24 19:39:59 +08:00
|
|
|
extern int cmd_credential(int argc, const char **argv, const char *prefix);
|
2007-01-10 19:36:36 +08:00
|
|
|
extern int cmd_describe(int argc, const char **argv, const char *prefix);
|
2006-07-29 13:44:25 +08:00
|
|
|
extern int cmd_diff_files(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_diff(int argc, const char **argv, const char *prefix);
|
2006-07-29 13:44:25 +08:00
|
|
|
extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
|
2017-01-17 23:54:57 +08:00
|
|
|
extern int cmd_difftool(int argc, const char **argv, const char *prefix);
|
2007-12-02 22:14:13 +08:00
|
|
|
extern int cmd_fast_export(int argc, const char **argv, const char *prefix);
|
2007-09-11 11:03:25 +08:00
|
|
|
extern int cmd_fetch(int argc, const char **argv, const char *prefix);
|
2007-09-11 11:03:00 +08:00
|
|
|
extern int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
|
2006-07-29 13:44:25 +08:00
|
|
|
extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
|
2006-09-16 04:30:02 +08:00
|
|
|
extern int cmd_for_each_ref(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_format_patch(int argc, const char **argv, const char *prefix);
|
2007-01-29 23:48:06 +08:00
|
|
|
extern int cmd_fsck(int argc, const char **argv, const char *prefix);
|
2007-03-14 09:58:22 +08:00
|
|
|
extern int cmd_gc(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_grep(int argc, const char **argv, const char *prefix);
|
2010-01-22 11:50:11 +08:00
|
|
|
extern int cmd_hash_object(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_help(int argc, const char **argv, const char *prefix);
|
2010-01-22 23:55:19 +08:00
|
|
|
extern int cmd_index_pack(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_init_db(int argc, const char **argv, const char *prefix);
|
2014-10-14 02:16:29 +08:00
|
|
|
extern int cmd_interpret_trailers(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_log(int argc, const char **argv, const char *prefix);
|
2007-02-09 01:51:56 +08:00
|
|
|
extern int cmd_log_reflog(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_ls_files(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_ls_tree(int argc, const char **argv, const char *prefix);
|
2007-11-05 04:51:17 +08:00
|
|
|
extern int cmd_ls_remote(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_mailinfo(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_mailsplit(int argc, const char **argv, const char *prefix);
|
2008-07-08 01:24:20 +08:00
|
|
|
extern int cmd_merge(int argc, const char **argv, const char *prefix);
|
2007-01-09 16:50:02 +08:00
|
|
|
extern int cmd_merge_base(int argc, const char **argv, const char *prefix);
|
2010-01-22 23:29:21 +08:00
|
|
|
extern int cmd_merge_index(int argc, const char **argv, const char *prefix);
|
2007-11-23 04:19:40 +08:00
|
|
|
extern int cmd_merge_ours(int argc, const char **argv, const char *prefix);
|
2006-12-06 23:26:06 +08:00
|
|
|
extern int cmd_merge_file(int argc, const char **argv, const char *prefix);
|
2008-02-08 00:40:05 +08:00
|
|
|
extern int cmd_merge_recursive(int argc, const char **argv, const char *prefix);
|
2010-01-22 10:25:20 +08:00
|
|
|
extern int cmd_merge_tree(int argc, const char **argv, const char *prefix);
|
2010-01-22 23:34:44 +08:00
|
|
|
extern int cmd_mktag(int argc, const char **argv, const char *prefix);
|
2009-05-11 01:28:18 +08:00
|
|
|
extern int cmd_mktree(int argc, const char **argv, const char *prefix);
|
2018-07-13 03:39:20 +08:00
|
|
|
extern int cmd_multi_pack_index(int argc, const char **argv, const char *prefix);
|
2006-07-29 16:54:54 +08:00
|
|
|
extern int cmd_mv(int argc, const char **argv, const char *prefix);
|
2006-08-03 23:24:35 +08:00
|
|
|
extern int cmd_name_rev(int argc, const char **argv, const char *prefix);
|
2010-02-14 05:28:20 +08:00
|
|
|
extern int cmd_notes(int argc, const char **argv, const char *prefix);
|
2006-08-03 23:24:36 +08:00
|
|
|
extern int cmd_pack_objects(int argc, const char **argv, const char *prefix);
|
2010-01-22 23:42:14 +08:00
|
|
|
extern int cmd_pack_redundant(int argc, const char **argv, const char *prefix);
|
2010-01-22 12:31:25 +08:00
|
|
|
extern int cmd_patch_id(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_prune(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
|
2015-06-14 16:41:51 +08:00
|
|
|
extern int cmd_pull(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_push(int argc, const char **argv, const char *prefix);
|
2018-08-13 19:33:02 +08:00
|
|
|
extern int cmd_range_diff(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
|
rebase--helper: add a builtin helper for interactive rebases
Git's interactive rebase is still implemented as a shell script, despite
its complexity. This implies that it suffers from the portability point
of view, from lack of expressibility, and of course also from
performance. The latter issue is particularly serious on Windows, where
we pay a hefty price for relying so much on POSIX.
Unfortunately, being such a huge shell script also means that we missed
the train when it would have been relatively easy to port it to C, and
instead piled feature upon feature onto that poor script that originally
never intended to be more than a slightly pimped cherry-pick in a loop.
To open the road toward better performance (in addition to all the other
benefits of C over shell scripts), let's just start *somewhere*.
The approach taken here is to add a builtin helper that at first intends
to take care of the parts of the interactive rebase that are most
affected by the performance penalties mentioned above.
In particular, after we spent all those efforts on preparing the sequencer
to process rebase -i's git-rebase-todo scripts, we implement the `git
rebase -i --continue` functionality as a new builtin, git-rebase--helper.
Once that is in place, we can work gradually on tackling the rest of the
technical debt.
Note that the rebase--helper needs to learn about the transient
--ff/--no-ff options of git-rebase, as the corresponding flag is not
persisted to, and re-read from, the state directory.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-10 06:23:06 +08:00
|
|
|
extern int cmd_rebase__helper(int argc, const char **argv, const char *prefix);
|
2008-09-09 16:27:08 +08:00
|
|
|
extern int cmd_receive_pack(int argc, const char **argv, const char *prefix);
|
2006-12-19 16:23:12 +08:00
|
|
|
extern int cmd_reflog(int argc, const char **argv, const char *prefix);
|
2008-02-29 09:45:45 +08:00
|
|
|
extern int cmd_remote(int argc, const char **argv, const char *prefix);
|
2010-10-13 00:39:43 +08:00
|
|
|
extern int cmd_remote_ext(int argc, const char **argv, const char *prefix);
|
2010-10-13 00:39:42 +08:00
|
|
|
extern int cmd_remote_fd(int argc, const char **argv, const char *prefix);
|
2013-09-15 23:33:20 +08:00
|
|
|
extern int cmd_repack(int argc, const char **argv, const char *prefix);
|
2006-12-21 00:39:41 +08:00
|
|
|
extern int cmd_rerere(int argc, const char **argv, const char *prefix);
|
2007-09-11 11:19:34 +08:00
|
|
|
extern int cmd_reset(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);
|
2007-03-01 12:26:30 +08:00
|
|
|
extern int cmd_revert(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_rm(int argc, const char **argv, const char *prefix);
|
2007-10-30 10:03:39 +08:00
|
|
|
extern int cmd_send_pack(int argc, const char **argv, const char *prefix);
|
2018-03-16 01:31:19 +08:00
|
|
|
extern int cmd_serve(int argc, const char **argv, const char *prefix);
|
2006-10-22 19:23:31 +08:00
|
|
|
extern int cmd_shortlog(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_show(int argc, const char **argv, const char *prefix);
|
2006-09-16 04:30:02 +08:00
|
|
|
extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
|
2018-05-28 17:38:53 +08:00
|
|
|
extern int cmd_show_index(int argc, const char **argv, const char *prefix);
|
2007-11-09 00:59:00 +08:00
|
|
|
extern int cmd_status(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
|
2015-09-03 05:42:24 +08:00
|
|
|
extern int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
|
2006-08-03 23:24:38 +08:00
|
|
|
extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
|
2007-07-20 07:42:28 +08:00
|
|
|
extern int cmd_tag(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_tar_tree(int argc, const char **argv, const char *prefix);
|
2010-01-22 23:38:03 +08:00
|
|
|
extern int cmd_unpack_file(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_update_index(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
|
2009-08-29 17:04:52 +08:00
|
|
|
extern int cmd_update_server_info(int argc, const char **argv, const char *prefix);
|
2006-09-07 21:12:05 +08:00
|
|
|
extern int cmd_upload_archive(int argc, const char **argv, const char *prefix);
|
2011-11-19 15:40:04 +08:00
|
|
|
extern int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix);
|
2018-03-15 02:31:41 +08:00
|
|
|
extern int cmd_upload_pack(int argc, const char **argv, const char *prefix);
|
2010-01-22 12:21:55 +08:00
|
|
|
extern int cmd_var(int argc, const char **argv, const char *prefix);
|
2014-06-23 15:05:49 +08:00
|
|
|
extern int cmd_verify_commit(int argc, const char **argv, const char *prefix);
|
2007-07-27 12:07:34 +08:00
|
|
|
extern int cmd_verify_tag(int argc, const char **argv, const char *prefix);
|
2006-08-04 16:51:04 +08:00
|
|
|
extern int cmd_version(int argc, const char **argv, const char *prefix);
|
|
|
|
extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
|
2015-06-29 20:51:18 +08:00
|
|
|
extern int cmd_worktree(int argc, const char **argv, const char *prefix);
|
2006-07-29 13:44:25 +08:00
|
|
|
extern int cmd_write_tree(int argc, const char **argv, const char *prefix);
|
2006-08-10 23:02:38 +08:00
|
|
|
extern int cmd_verify_pack(int argc, const char **argv, const char *prefix);
|
Add "git show-ref" builtin command
It's kind of like "git peek-remote", but works only locally (and thus
avoids the whole overhead of git_connect()) and has some extra
verification features.
For example, it allows you to filter the results, and to choose whether
you want the tag dereferencing or not. You can also use it to just test
whether a particular ref exists.
For example:
git show-ref master
will show all references called "master", whether tags or heads or
anything else, and regardless of how deep in the reference naming
hierarchy they are (so it would show "refs/heads/master" but also
"refs/remote/other-repo/master").
When using the "--verify" flag, the command requires an exact ref path:
git show-ref --verify refs/heads/master
will only match the exact branch called "master".
If nothing matches, show-ref will return an error code of 1, and in the
case of verification, it will show an error message.
For scripting, you can ask it to be quiet with the "--quiet" flag, which
allows you to do things like
git-show-ref --quiet --verify -- "refs/heads/$headname" ||
echo "$headname is not a valid branch"
to check whether a particular branch exists or not (notice how we don't
actually want to show any results, and we want to use the full refname for
it in order to not trigger the problem with ambiguous partial matches).
To show only tags, or only proper branch heads, use "--tags" and/or
"--heads" respectively (using both means that it shows tags _and_ heads,
but not other random references under the refs/ subdirectory).
To do automatic tag object dereferencing, use the "-d" or "--dereference"
flag, so you can do
git show-ref --tags --dereference
to get a listing of all tags together with what they dereference.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-09-16 02:19:32 +08:00
|
|
|
extern int cmd_show_ref(int argc, const char **argv, const char *prefix);
|
Start handling references internally as a sorted in-memory list
This also adds some very rudimentary support for the notion of packed
refs. HOWEVER! At this point it isn't used to actually look up a ref
yet, only for listing them (ie "for_each_ref()" and friends see the
packed refs, but none of the other single-ref lookup routines).
Note how we keep two separate lists: one for the loose refs, and one for
the packed refs we read. That's so that we can easily keep the two apart,
and read only one set or the other (and still always make sure that the
loose refs take precedence).
[ From this, it's not actually obvious why we'd keep the two separate
lists, but it's important to have the packed refs on their own list
later on, when I add support for looking up a single loose one.
For that case, we will want to read _just_ the packed refs in case the
single-ref lookup fails, yet we may end up needing the other list at
some point in the future, so keeping them separated is important ]
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-09-12 07:37:32 +08:00
|
|
|
extern int cmd_pack_refs(int argc, const char **argv, const char *prefix);
|
2009-02-02 13:12:44 +08:00
|
|
|
extern int cmd_replace(int argc, const char **argv, const char *prefix);
|
2006-06-14 04:21:50 +08:00
|
|
|
|
2006-04-22 01:27:34 +08:00
|
|
|
#endif
|