mirror of
https://github.com/git/git.git
synced 2026-04-14 02:40:08 +02:00
Merge 'rebase--helper' into HEAD
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -114,6 +114,7 @@
|
||||
/git-read-tree
|
||||
/git-rebase
|
||||
/git-rebase--am
|
||||
/git-rebase--helper
|
||||
/git-rebase--interactive
|
||||
/git-rebase--merge
|
||||
/git-receive-pack
|
||||
|
||||
1
Makefile
1
Makefile
@@ -919,6 +919,7 @@ BUILTIN_OBJS += builtin/prune.o
|
||||
BUILTIN_OBJS += builtin/pull.o
|
||||
BUILTIN_OBJS += builtin/push.o
|
||||
BUILTIN_OBJS += builtin/read-tree.o
|
||||
BUILTIN_OBJS += builtin/rebase--helper.o
|
||||
BUILTIN_OBJS += builtin/receive-pack.o
|
||||
BUILTIN_OBJS += builtin/reflog.o
|
||||
BUILTIN_OBJS += builtin/remote.o
|
||||
|
||||
@@ -102,6 +102,7 @@ extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_pull(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_push(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rebase__helper(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_receive_pack(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_reflog(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_remote(int argc, const char **argv, const char *prefix);
|
||||
|
||||
@@ -173,7 +173,7 @@ static void determine_whence(struct wt_status *s)
|
||||
whence = FROM_MERGE;
|
||||
else if (file_exists(git_path_cherry_pick_head())) {
|
||||
whence = FROM_CHERRY_PICK;
|
||||
if (file_exists(git_path(SEQ_DIR)))
|
||||
if (file_exists(git_path_seq_dir()))
|
||||
sequencer_in_use = 1;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "revision.h"
|
||||
#include "tempfile.h"
|
||||
#include "lockfile.h"
|
||||
#include "wt-status.h"
|
||||
|
||||
enum rebase_type {
|
||||
REBASE_INVALID = -1,
|
||||
@@ -325,73 +326,6 @@ static int git_pull_config(const char *var, const char *value, void *cb)
|
||||
return git_default_config(var, value, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns 1 if there are unstaged changes, 0 otherwise.
|
||||
*/
|
||||
static int has_unstaged_changes(const char *prefix)
|
||||
{
|
||||
struct rev_info rev_info;
|
||||
int result;
|
||||
|
||||
init_revisions(&rev_info, prefix);
|
||||
DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
|
||||
DIFF_OPT_SET(&rev_info.diffopt, QUICK);
|
||||
diff_setup_done(&rev_info.diffopt);
|
||||
result = run_diff_files(&rev_info, 0);
|
||||
return diff_result_code(&rev_info.diffopt, result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns 1 if there are uncommitted changes, 0 otherwise.
|
||||
*/
|
||||
static int has_uncommitted_changes(const char *prefix)
|
||||
{
|
||||
struct rev_info rev_info;
|
||||
int result;
|
||||
|
||||
if (is_cache_unborn())
|
||||
return 0;
|
||||
|
||||
init_revisions(&rev_info, prefix);
|
||||
DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
|
||||
DIFF_OPT_SET(&rev_info.diffopt, QUICK);
|
||||
add_head_to_pending(&rev_info);
|
||||
diff_setup_done(&rev_info.diffopt);
|
||||
result = run_diff_index(&rev_info, 1);
|
||||
return diff_result_code(&rev_info.diffopt, result);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the work tree has unstaged or uncommitted changes, dies with the
|
||||
* appropriate message.
|
||||
*/
|
||||
static void die_on_unclean_work_tree(const char *prefix)
|
||||
{
|
||||
struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
|
||||
int do_die = 0;
|
||||
|
||||
hold_locked_index(lock_file, 0);
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
update_index_if_able(&the_index, lock_file);
|
||||
rollback_lock_file(lock_file);
|
||||
|
||||
if (has_unstaged_changes(prefix)) {
|
||||
error(_("Cannot pull with rebase: You have unstaged changes."));
|
||||
do_die = 1;
|
||||
}
|
||||
|
||||
if (has_uncommitted_changes(prefix)) {
|
||||
if (do_die)
|
||||
error(_("Additionally, your index contains uncommitted changes."));
|
||||
else
|
||||
error(_("Cannot pull with rebase: Your index contains uncommitted changes."));
|
||||
do_die = 1;
|
||||
}
|
||||
|
||||
if (do_die)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends merge candidates from FETCH_HEAD that are not marked not-for-merge
|
||||
* into merge_heads.
|
||||
@@ -875,7 +809,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
|
||||
die(_("Updating an unborn branch with changes added to the index."));
|
||||
|
||||
if (!autostash)
|
||||
die_on_unclean_work_tree(prefix);
|
||||
require_clean_work_tree("pull with rebase",
|
||||
"Please commit or stash them.", 1, 0);
|
||||
|
||||
if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs))
|
||||
hashclr(rebase_fork_point);
|
||||
|
||||
40
builtin/rebase--helper.c
Normal file
40
builtin/rebase--helper.c
Normal file
@@ -0,0 +1,40 @@
|
||||
#include "builtin.h"
|
||||
#include "cache.h"
|
||||
#include "parse-options.h"
|
||||
#include "sequencer.h"
|
||||
|
||||
static const char * const builtin_rebase_helper_usage[] = {
|
||||
N_("git rebase--helper [<options>]"),
|
||||
NULL
|
||||
};
|
||||
|
||||
int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct replay_opts opts = REPLAY_OPTS_INIT;
|
||||
enum {
|
||||
CONTINUE = 1, ABORT
|
||||
} command = 0;
|
||||
struct option options[] = {
|
||||
OPT_BOOL(0, "ff", &opts.allow_ff, N_("allow fast-forward")),
|
||||
OPT_CMDMODE(0, "continue", &command, N_("continue rebase"),
|
||||
CONTINUE),
|
||||
OPT_CMDMODE(0, "abort", &command, N_("abort rebase"),
|
||||
ABORT),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
git_config(git_default_config, NULL);
|
||||
|
||||
opts.action = REPLAY_INTERACTIVE_REBASE;
|
||||
opts.allow_ff = 1;
|
||||
opts.allow_empty = 1;
|
||||
|
||||
argc = parse_options(argc, argv, NULL, options,
|
||||
builtin_rebase_helper_usage, PARSE_OPT_KEEP_ARGV0);
|
||||
|
||||
if (command == CONTINUE && argc == 1)
|
||||
return !!sequencer_continue(&opts);
|
||||
if (command == ABORT && argc == 1)
|
||||
return !!sequencer_remove_state(&opts);
|
||||
usage_with_options(builtin_rebase_helper_usage, options);
|
||||
}
|
||||
@@ -71,7 +71,7 @@ static void verify_opt_compatible(const char *me, const char *base_opt, ...)
|
||||
die(_("%s: %s cannot be used with %s"), me, this_opt, base_opt);
|
||||
}
|
||||
|
||||
static void parse_args(int argc, const char **argv, struct replay_opts *opts)
|
||||
static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
|
||||
{
|
||||
const char * const * usage_str = revert_or_cherry_pick_usage(opts);
|
||||
const char *me = action_name(opts);
|
||||
@@ -115,25 +115,15 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
|
||||
if (opts->keep_redundant_commits)
|
||||
opts->allow_empty = 1;
|
||||
|
||||
/* Set the subcommand */
|
||||
if (cmd == 'q')
|
||||
opts->subcommand = REPLAY_REMOVE_STATE;
|
||||
else if (cmd == 'c')
|
||||
opts->subcommand = REPLAY_CONTINUE;
|
||||
else if (cmd == 'a')
|
||||
opts->subcommand = REPLAY_ROLLBACK;
|
||||
else
|
||||
opts->subcommand = REPLAY_NONE;
|
||||
|
||||
/* Check for incompatible command line arguments */
|
||||
if (opts->subcommand != REPLAY_NONE) {
|
||||
if (cmd) {
|
||||
char *this_operation;
|
||||
if (opts->subcommand == REPLAY_REMOVE_STATE)
|
||||
if (cmd == 'q')
|
||||
this_operation = "--quit";
|
||||
else if (opts->subcommand == REPLAY_CONTINUE)
|
||||
else if (cmd == 'c')
|
||||
this_operation = "--continue";
|
||||
else {
|
||||
assert(opts->subcommand == REPLAY_ROLLBACK);
|
||||
assert(cmd == 'a');
|
||||
this_operation = "--abort";
|
||||
}
|
||||
|
||||
@@ -156,7 +146,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
|
||||
"--edit", opts->edit,
|
||||
NULL);
|
||||
|
||||
if (opts->subcommand != REPLAY_NONE) {
|
||||
if (cmd) {
|
||||
opts->revs = NULL;
|
||||
} else {
|
||||
struct setup_revision_opt s_r_opt;
|
||||
@@ -174,20 +164,26 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
|
||||
|
||||
if (argc > 1)
|
||||
usage_with_options(usage_str, options);
|
||||
|
||||
if (cmd == 'q')
|
||||
return sequencer_remove_state(opts);
|
||||
if (cmd == 'c')
|
||||
return sequencer_continue(opts);
|
||||
if (cmd == 'a')
|
||||
return sequencer_rollback(opts);
|
||||
return sequencer_pick_revisions(opts);
|
||||
}
|
||||
|
||||
int cmd_revert(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct replay_opts opts;
|
||||
struct replay_opts opts = REPLAY_OPTS_INIT;
|
||||
int res;
|
||||
|
||||
memset(&opts, 0, sizeof(opts));
|
||||
if (isatty(0))
|
||||
opts.edit = 1;
|
||||
opts.action = REPLAY_REVERT;
|
||||
git_config(git_default_config, NULL);
|
||||
parse_args(argc, argv, &opts);
|
||||
res = sequencer_pick_revisions(&opts);
|
||||
res = run_sequencer(argc, argv, &opts);
|
||||
if (res < 0)
|
||||
die(_("revert failed"));
|
||||
return res;
|
||||
@@ -195,14 +191,12 @@ int cmd_revert(int argc, const char **argv, const char *prefix)
|
||||
|
||||
int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct replay_opts opts;
|
||||
struct replay_opts opts = REPLAY_OPTS_INIT;
|
||||
int res;
|
||||
|
||||
memset(&opts, 0, sizeof(opts));
|
||||
opts.action = REPLAY_PICK;
|
||||
git_config(git_default_config, NULL);
|
||||
parse_args(argc, argv, &opts);
|
||||
res = sequencer_pick_revisions(&opts);
|
||||
res = run_sequencer(argc, argv, &opts);
|
||||
if (res < 0)
|
||||
die(_("cherry-pick failed"));
|
||||
return res;
|
||||
|
||||
@@ -1059,6 +1059,10 @@ git_rebase__interactive () {
|
||||
|
||||
case "$action" in
|
||||
continue)
|
||||
if test ! -d "$rewritten"
|
||||
then
|
||||
exec git rebase--helper ${force_rebase:+--no-ff} --continue
|
||||
fi
|
||||
# do we have anything to commit?
|
||||
if git diff-index --cached --quiet HEAD --
|
||||
then
|
||||
@@ -1118,6 +1122,10 @@ first and then run 'git rebase --continue' again.")"
|
||||
skip)
|
||||
git rerere clear
|
||||
|
||||
if test ! -d "$rewritten"
|
||||
then
|
||||
exec git rebase--helper ${force_rebase:+--no-ff} --continue
|
||||
fi
|
||||
do_rest
|
||||
return 0
|
||||
;;
|
||||
@@ -1307,6 +1315,11 @@ expand_todo_ids
|
||||
test -d "$rewritten" || test -n "$force_rebase" || skip_unnecessary_picks
|
||||
|
||||
checkout_onto
|
||||
if test -z "$rebase_root" && test ! -d "$rewritten"
|
||||
then
|
||||
require_clean_work_tree "rebase"
|
||||
exec git rebase--helper ${force_rebase:+--no-ff} --continue
|
||||
fi
|
||||
do_rest
|
||||
|
||||
}
|
||||
|
||||
1
git.c
1
git.c
@@ -451,6 +451,7 @@ static struct cmd_struct commands[] = {
|
||||
{ "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "push", cmd_push, RUN_SETUP },
|
||||
{ "read-tree", cmd_read_tree, RUN_SETUP },
|
||||
{ "rebase--helper", cmd_rebase__helper, RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "receive-pack", cmd_receive_pack },
|
||||
{ "reflog", cmd_reflog, RUN_SETUP },
|
||||
{ "remote", cmd_remote, RUN_SETUP },
|
||||
|
||||
9
merge.c
9
merge.c
@@ -57,7 +57,8 @@ int checkout_fast_forward(const unsigned char *head,
|
||||
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
|
||||
hold_locked_index(lock_file, 1);
|
||||
if (hold_locked_index(lock_file, 0) < 0)
|
||||
return -1;
|
||||
|
||||
memset(&trees, 0, sizeof(trees));
|
||||
memset(&opts, 0, sizeof(opts));
|
||||
@@ -90,7 +91,9 @@ int checkout_fast_forward(const unsigned char *head,
|
||||
}
|
||||
if (unpack_trees(nr_trees, t, &opts))
|
||||
return -1;
|
||||
if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
|
||||
die(_("unable to write new index file"));
|
||||
if (write_locked_index(&the_index, lock_file, COMMIT_LOCK)) {
|
||||
rollback_lock_file(lock_file);
|
||||
return error(_("unable to write new index file"));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -575,6 +575,29 @@ int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const
|
||||
cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
|
||||
cmd.dir = dir;
|
||||
cmd.env = env;
|
||||
|
||||
if (opt & RUN_HIDE_STDERR_ON_SUCCESS) {
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
int res;
|
||||
|
||||
cmd.err = -1;
|
||||
if (start_command(&cmd) < 0)
|
||||
return -1;
|
||||
|
||||
if (strbuf_read(&buf, cmd.err, 0) < 0) {
|
||||
close(cmd.err);
|
||||
finish_command(&cmd); /* throw away exit code */
|
||||
return -1;
|
||||
}
|
||||
|
||||
close(cmd.err);
|
||||
res = finish_command(&cmd);
|
||||
if (res)
|
||||
fputs(buf.buf, stderr);
|
||||
strbuf_release(&buf);
|
||||
return res;
|
||||
}
|
||||
|
||||
return run_command(&cmd);
|
||||
}
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@ extern int run_hook_ve(const char *const *env, const char *name, va_list args);
|
||||
#define RUN_SILENT_EXEC_FAILURE 8
|
||||
#define RUN_USING_SHELL 16
|
||||
#define RUN_CLEAN_ON_EXIT 32
|
||||
#define RUN_HIDE_STDERR_ON_SUCCESS 64
|
||||
int run_command_v_opt(const char **argv, int opt);
|
||||
|
||||
/*
|
||||
|
||||
1689
sequencer.c
1689
sequencer.c
File diff suppressed because it is too large
Load Diff
35
sequencer.h
35
sequencer.h
@@ -1,28 +1,18 @@
|
||||
#ifndef SEQUENCER_H
|
||||
#define SEQUENCER_H
|
||||
|
||||
#define SEQ_DIR "sequencer"
|
||||
#define SEQ_HEAD_FILE "sequencer/head"
|
||||
#define SEQ_TODO_FILE "sequencer/todo"
|
||||
#define SEQ_OPTS_FILE "sequencer/opts"
|
||||
const char *git_path_seq_dir(void);
|
||||
|
||||
#define APPEND_SIGNOFF_DEDUP (1u << 0)
|
||||
|
||||
enum replay_action {
|
||||
REPLAY_REVERT,
|
||||
REPLAY_PICK
|
||||
};
|
||||
|
||||
enum replay_subcommand {
|
||||
REPLAY_NONE,
|
||||
REPLAY_REMOVE_STATE,
|
||||
REPLAY_CONTINUE,
|
||||
REPLAY_ROLLBACK
|
||||
REPLAY_PICK,
|
||||
REPLAY_INTERACTIVE_REBASE
|
||||
};
|
||||
|
||||
struct replay_opts {
|
||||
enum replay_action action;
|
||||
enum replay_subcommand subcommand;
|
||||
|
||||
/* Boolean options */
|
||||
int edit;
|
||||
@@ -34,6 +24,7 @@ struct replay_opts {
|
||||
int allow_empty;
|
||||
int allow_empty_message;
|
||||
int keep_redundant_commits;
|
||||
int verbose;
|
||||
|
||||
int mainline;
|
||||
|
||||
@@ -46,9 +37,27 @@ struct replay_opts {
|
||||
|
||||
/* Only used by REPLAY_NONE */
|
||||
struct rev_info *revs;
|
||||
|
||||
/* malloc()ed data entrusted to the sequencer */
|
||||
void **owned;
|
||||
int owned_nr, owned_alloc;
|
||||
};
|
||||
#define REPLAY_OPTS_INIT { -1 }
|
||||
|
||||
/*
|
||||
* Make it the duty of sequencer_remove_state() to release the memory;
|
||||
* For ease of use, return the same pointer.
|
||||
*/
|
||||
void *sequencer_entrust(struct replay_opts *opts, void *to_free);
|
||||
|
||||
int sequencer_pick_revisions(struct replay_opts *opts);
|
||||
int sequencer_continue(struct replay_opts *opts);
|
||||
int sequencer_rollback(struct replay_opts *opts);
|
||||
int sequencer_remove_state(struct replay_opts *opts);
|
||||
|
||||
int sequencer_commit(const char *defmsg, struct replay_opts *opts,
|
||||
int allow_empty, int edit, int amend,
|
||||
int cleanup_commit_message);
|
||||
|
||||
extern const char sign_off_header[];
|
||||
|
||||
|
||||
@@ -459,17 +459,6 @@ test_expect_success 'malformed instruction sheet 1' '
|
||||
test_expect_code 128 git cherry-pick --continue
|
||||
'
|
||||
|
||||
test_expect_success 'malformed instruction sheet 2' '
|
||||
pristine_detach initial &&
|
||||
test_expect_code 1 git cherry-pick base..anotherpick &&
|
||||
echo "resolved" >foo &&
|
||||
git add foo &&
|
||||
git commit &&
|
||||
sed "s/pick/revert/" .git/sequencer/todo >new_sheet &&
|
||||
cp new_sheet .git/sequencer/todo &&
|
||||
test_expect_code 128 git cherry-pick --continue
|
||||
'
|
||||
|
||||
test_expect_success 'empty commit set' '
|
||||
pristine_detach initial &&
|
||||
test_expect_code 128 git cherry-pick base..base
|
||||
|
||||
76
wt-status.c
76
wt-status.c
@@ -16,6 +16,7 @@
|
||||
#include "strbuf.h"
|
||||
#include "utf8.h"
|
||||
#include "worktree.h"
|
||||
#include "lockfile.h"
|
||||
|
||||
static const char cut_line[] =
|
||||
"------------------------ >8 ------------------------\n";
|
||||
@@ -1757,3 +1758,78 @@ void wt_porcelain_print(struct wt_status *s)
|
||||
s->no_gettext = 1;
|
||||
wt_shortstatus_print(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns 1 if there are unstaged changes, 0 otherwise.
|
||||
*/
|
||||
int has_unstaged_changes(int ignore_submodules)
|
||||
{
|
||||
struct rev_info rev_info;
|
||||
int result;
|
||||
|
||||
init_revisions(&rev_info, NULL);
|
||||
if (ignore_submodules)
|
||||
DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
|
||||
DIFF_OPT_SET(&rev_info.diffopt, QUICK);
|
||||
diff_setup_done(&rev_info.diffopt);
|
||||
result = run_diff_files(&rev_info, 0);
|
||||
return diff_result_code(&rev_info.diffopt, result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns 1 if there are uncommitted changes, 0 otherwise.
|
||||
*/
|
||||
int has_uncommitted_changes(int ignore_submodules)
|
||||
{
|
||||
struct rev_info rev_info;
|
||||
int result;
|
||||
|
||||
if (is_cache_unborn())
|
||||
return 0;
|
||||
|
||||
init_revisions(&rev_info, NULL);
|
||||
if (ignore_submodules)
|
||||
DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
|
||||
DIFF_OPT_SET(&rev_info.diffopt, QUICK);
|
||||
add_head_to_pending(&rev_info);
|
||||
diff_setup_done(&rev_info.diffopt);
|
||||
result = run_diff_index(&rev_info, 1);
|
||||
return diff_result_code(&rev_info.diffopt, result);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the work tree has unstaged or uncommitted changes, dies with the
|
||||
* appropriate message.
|
||||
*/
|
||||
int require_clean_work_tree(const char *action, const char *hint, int ignore_submodules, int gently)
|
||||
{
|
||||
struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
|
||||
int err = 0;
|
||||
|
||||
hold_locked_index(lock_file, 0);
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
update_index_if_able(&the_index, lock_file);
|
||||
rollback_lock_file(lock_file);
|
||||
|
||||
if (has_unstaged_changes(ignore_submodules)) {
|
||||
error(_("Cannot %s: You have unstaged changes."), action);
|
||||
err = 1;
|
||||
}
|
||||
|
||||
if (has_uncommitted_changes(ignore_submodules)) {
|
||||
if (err)
|
||||
error(_("Additionally, your index contains uncommitted changes."));
|
||||
else
|
||||
error(_("Cannot %s: Your index contains uncommitted changes."), action);
|
||||
err = 1;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
if (hint)
|
||||
error("%s", hint);
|
||||
if (!gently)
|
||||
exit(err);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -115,4 +115,10 @@ void status_printf_ln(struct wt_status *s, const char *color, const char *fmt, .
|
||||
__attribute__((format (printf, 3, 4)))
|
||||
void status_printf(struct wt_status *s, const char *color, const char *fmt, ...);
|
||||
|
||||
/* The following functions expect that the caller took care of reading the index. */
|
||||
int has_unstaged_changes(int ignore_submodules);
|
||||
int has_uncommitted_changes(int ignore_submodules);
|
||||
int require_clean_work_tree(const char *action, const char *hint,
|
||||
int ignore_submodules, int gently);
|
||||
|
||||
#endif /* STATUS_H */
|
||||
|
||||
Reference in New Issue
Block a user