Skip to content

Commit 970084d

Browse files
committed
Merge 'sequencer-i' into HEAD
2 parents d5cb9cb + 02db26b commit 970084d

File tree

11 files changed

+1574
-367
lines changed

11 files changed

+1574
-367
lines changed

builtin/commit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ static void determine_whence(struct wt_status *s)
173173
whence = FROM_MERGE;
174174
else if (file_exists(git_path_cherry_pick_head())) {
175175
whence = FROM_CHERRY_PICK;
176-
if (file_exists(git_path(SEQ_DIR)))
176+
if (file_exists(git_path_seq_dir()))
177177
sequencer_in_use = 1;
178178
}
179179
else

builtin/pull.c

Lines changed: 3 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "revision.h"
1818
#include "tempfile.h"
1919
#include "lockfile.h"
20+
#include "wt-status.h"
2021

2122
enum rebase_type {
2223
REBASE_INVALID = -1,
@@ -325,73 +326,6 @@ static int git_pull_config(const char *var, const char *value, void *cb)
325326
return git_default_config(var, value, cb);
326327
}
327328

328-
/**
329-
* Returns 1 if there are unstaged changes, 0 otherwise.
330-
*/
331-
static int has_unstaged_changes(const char *prefix)
332-
{
333-
struct rev_info rev_info;
334-
int result;
335-
336-
init_revisions(&rev_info, prefix);
337-
DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
338-
DIFF_OPT_SET(&rev_info.diffopt, QUICK);
339-
diff_setup_done(&rev_info.diffopt);
340-
result = run_diff_files(&rev_info, 0);
341-
return diff_result_code(&rev_info.diffopt, result);
342-
}
343-
344-
/**
345-
* Returns 1 if there are uncommitted changes, 0 otherwise.
346-
*/
347-
static int has_uncommitted_changes(const char *prefix)
348-
{
349-
struct rev_info rev_info;
350-
int result;
351-
352-
if (is_cache_unborn())
353-
return 0;
354-
355-
init_revisions(&rev_info, prefix);
356-
DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
357-
DIFF_OPT_SET(&rev_info.diffopt, QUICK);
358-
add_head_to_pending(&rev_info);
359-
diff_setup_done(&rev_info.diffopt);
360-
result = run_diff_index(&rev_info, 1);
361-
return diff_result_code(&rev_info.diffopt, result);
362-
}
363-
364-
/**
365-
* If the work tree has unstaged or uncommitted changes, dies with the
366-
* appropriate message.
367-
*/
368-
static void die_on_unclean_work_tree(const char *prefix)
369-
{
370-
struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
371-
int do_die = 0;
372-
373-
hold_locked_index(lock_file, 0);
374-
refresh_cache(REFRESH_QUIET);
375-
update_index_if_able(&the_index, lock_file);
376-
rollback_lock_file(lock_file);
377-
378-
if (has_unstaged_changes(prefix)) {
379-
error(_("Cannot pull with rebase: You have unstaged changes."));
380-
do_die = 1;
381-
}
382-
383-
if (has_uncommitted_changes(prefix)) {
384-
if (do_die)
385-
error(_("Additionally, your index contains uncommitted changes."));
386-
else
387-
error(_("Cannot pull with rebase: Your index contains uncommitted changes."));
388-
do_die = 1;
389-
}
390-
391-
if (do_die)
392-
exit(1);
393-
}
394-
395329
/**
396330
* Appends merge candidates from FETCH_HEAD that are not marked not-for-merge
397331
* into merge_heads.
@@ -875,7 +809,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
875809
die(_("Updating an unborn branch with changes added to the index."));
876810

877811
if (!autostash)
878-
die_on_unclean_work_tree(prefix);
812+
require_clean_work_tree("pull with rebase",
813+
"Please commit or stash them.", 1, 0);
879814

880815
if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs))
881816
hashclr(rebase_fork_point);

builtin/revert.c

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ static void verify_opt_compatible(const char *me, const char *base_opt, ...)
7171
die(_("%s: %s cannot be used with %s"), me, this_opt, base_opt);
7272
}
7373

74-
static void parse_args(int argc, const char **argv, struct replay_opts *opts)
74+
static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
7575
{
7676
const char * const * usage_str = revert_or_cherry_pick_usage(opts);
7777
const char *me = action_name(opts);
@@ -115,25 +115,15 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
115115
if (opts->keep_redundant_commits)
116116
opts->allow_empty = 1;
117117

118-
/* Set the subcommand */
119-
if (cmd == 'q')
120-
opts->subcommand = REPLAY_REMOVE_STATE;
121-
else if (cmd == 'c')
122-
opts->subcommand = REPLAY_CONTINUE;
123-
else if (cmd == 'a')
124-
opts->subcommand = REPLAY_ROLLBACK;
125-
else
126-
opts->subcommand = REPLAY_NONE;
127-
128118
/* Check for incompatible command line arguments */
129-
if (opts->subcommand != REPLAY_NONE) {
119+
if (cmd) {
130120
char *this_operation;
131-
if (opts->subcommand == REPLAY_REMOVE_STATE)
121+
if (cmd == 'q')
132122
this_operation = "--quit";
133-
else if (opts->subcommand == REPLAY_CONTINUE)
123+
else if (cmd == 'c')
134124
this_operation = "--continue";
135125
else {
136-
assert(opts->subcommand == REPLAY_ROLLBACK);
126+
assert(cmd == 'a');
137127
this_operation = "--abort";
138128
}
139129

@@ -156,7 +146,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
156146
"--edit", opts->edit,
157147
NULL);
158148

159-
if (opts->subcommand != REPLAY_NONE) {
149+
if (cmd) {
160150
opts->revs = NULL;
161151
} else {
162152
struct setup_revision_opt s_r_opt;
@@ -174,35 +164,39 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
174164

175165
if (argc > 1)
176166
usage_with_options(usage_str, options);
167+
168+
if (cmd == 'q')
169+
return sequencer_remove_state(opts);
170+
if (cmd == 'c')
171+
return sequencer_continue(opts);
172+
if (cmd == 'a')
173+
return sequencer_rollback(opts);
174+
return sequencer_pick_revisions(opts);
177175
}
178176

179177
int cmd_revert(int argc, const char **argv, const char *prefix)
180178
{
181-
struct replay_opts opts;
179+
struct replay_opts opts = REPLAY_OPTS_INIT;
182180
int res;
183181

184-
memset(&opts, 0, sizeof(opts));
185182
if (isatty(0))
186183
opts.edit = 1;
187184
opts.action = REPLAY_REVERT;
188185
git_config(git_default_config, NULL);
189-
parse_args(argc, argv, &opts);
190-
res = sequencer_pick_revisions(&opts);
186+
res = run_sequencer(argc, argv, &opts);
191187
if (res < 0)
192188
die(_("revert failed"));
193189
return res;
194190
}
195191

196192
int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
197193
{
198-
struct replay_opts opts;
194+
struct replay_opts opts = REPLAY_OPTS_INIT;
199195
int res;
200196

201-
memset(&opts, 0, sizeof(opts));
202197
opts.action = REPLAY_PICK;
203198
git_config(git_default_config, NULL);
204-
parse_args(argc, argv, &opts);
205-
res = sequencer_pick_revisions(&opts);
199+
res = run_sequencer(argc, argv, &opts);
206200
if (res < 0)
207201
die(_("cherry-pick failed"));
208202
return res;

merge.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ int checkout_fast_forward(const unsigned char *head,
5757

5858
refresh_cache(REFRESH_QUIET);
5959

60-
hold_locked_index(lock_file, 1);
60+
if (hold_locked_index(lock_file, 0) < 0)
61+
return -1;
6162

6263
memset(&trees, 0, sizeof(trees));
6364
memset(&opts, 0, sizeof(opts));
@@ -90,7 +91,9 @@ int checkout_fast_forward(const unsigned char *head,
9091
}
9192
if (unpack_trees(nr_trees, t, &opts))
9293
return -1;
93-
if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
94-
die(_("unable to write new index file"));
94+
if (write_locked_index(&the_index, lock_file, COMMIT_LOCK)) {
95+
rollback_lock_file(lock_file);
96+
return error(_("unable to write new index file"));
97+
}
9598
return 0;
9699
}

run-command.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,29 @@ int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const
575575
cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
576576
cmd.dir = dir;
577577
cmd.env = env;
578+
579+
if (opt & RUN_HIDE_STDERR_ON_SUCCESS) {
580+
struct strbuf buf = STRBUF_INIT;
581+
int res;
582+
583+
cmd.err = -1;
584+
if (start_command(&cmd) < 0)
585+
return -1;
586+
587+
if (strbuf_read(&buf, cmd.err, 0) < 0) {
588+
close(cmd.err);
589+
finish_command(&cmd); /* throw away exit code */
590+
return -1;
591+
}
592+
593+
close(cmd.err);
594+
res = finish_command(&cmd);
595+
if (res)
596+
fputs(buf.buf, stderr);
597+
strbuf_release(&buf);
598+
return res;
599+
}
600+
578601
return run_command(&cmd);
579602
}
580603

run-command.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ extern int run_hook_ve(const char *const *env, const char *name, va_list args);
7070
#define RUN_SILENT_EXEC_FAILURE 8
7171
#define RUN_USING_SHELL 16
7272
#define RUN_CLEAN_ON_EXIT 32
73+
#define RUN_HIDE_STDERR_ON_SUCCESS 64
7374
int run_command_v_opt(const char **argv, int opt);
7475

7576
/*

0 commit comments

Comments
 (0)