From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH 2/2] checkout: allow ignoring unmerged paths when checking out of the index
Date: Fri, 29 Aug 2008 14:42:33 -0700 [thread overview]
Message-ID: <7v7i9z4hx2.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <7vbpzb4i1h.fsf@gitster.siamese.dyndns.org> (Junio C. Hamano's message of "Fri, 29 Aug 2008 14:39:54 -0700")
Earlier we made "git checkout $pathspec" to atomically refuse the
operation, if $pathspec matched any path with unmerged stages.
This patch allows:
$ git checkout -f a b c
to ignore, instead of erroring out on, such unmerged paths. The fix to
prevent checkout of an unmerged path from random stages is still there.
Signed-off-by: Junio C Hamano <junio@twinsun.com>
---
builtin-checkout.c | 41 +++++++++++++++++++++++------------------
t/t7201-co.sh | 23 +++++++++++++++++++++++
2 files changed, 46 insertions(+), 18 deletions(-)
diff --git a/builtin-checkout.c b/builtin-checkout.c
index 9b33f3a..49c43d9 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -20,6 +20,17 @@ static const char * const checkout_usage[] = {
NULL,
};
+struct checkout_opts {
+ int quiet;
+ int merge;
+ int force;
+ int writeout_error;
+
+ const char *new_branch;
+ int new_branch_log;
+ enum branch_track track;
+};
+
static int post_checkout_hook(struct commit *old, struct commit *new,
int changed)
{
@@ -85,7 +96,8 @@ static int skip_same_name(struct cache_entry *ce, int pos)
}
-static int checkout_paths(struct tree *source_tree, const char **pathspec)
+static int checkout_paths(struct tree *source_tree, const char **pathspec,
+ struct checkout_opts *opts)
{
int pos;
struct checkout state;
@@ -121,8 +133,12 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec)
struct cache_entry *ce = active_cache[pos];
if (pathspec_match(pathspec, NULL, ce->name, 0) &&
ce_stage(ce)) {
- errs = 1;
- error("path '%s' is unmerged", ce->name);
+ if (!opts->force) {
+ errs = 1;
+ error("path '%s' is unmerged", ce->name);
+ } else {
+ warning("path '%s' is unmerged", ce->name);
+ }
pos = skip_same_name(ce, pos) - 1;
continue;
}
@@ -178,17 +194,6 @@ static void describe_detached_head(char *msg, struct commit *commit)
strbuf_release(&sb);
}
-struct checkout_opts {
- int quiet;
- int merge;
- int force;
- int writeout_error;
-
- const char *new_branch;
- int new_branch_log;
- enum branch_track track;
-};
-
static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
{
struct unpack_trees_options opts;
@@ -569,15 +574,15 @@ no_reference:
die("invalid path specification");
/* Checkout paths */
- if (opts.new_branch || opts.force || opts.merge) {
+ if (opts.new_branch || opts.merge) {
if (argc == 1) {
- die("git checkout: updating paths is incompatible with switching branches/forcing\nDid you intend to checkout '%s' which can not be resolved as commit?", argv[0]);
+ die("git checkout: updating paths is incompatible with switching branches.\nDid you intend to checkout '%s' which can not be resolved as commit?", argv[0]);
} else {
- die("git checkout: updating paths is incompatible with switching branches/forcing");
+ die("git checkout: updating paths is incompatible with switching branches.");
}
}
- return checkout_paths(source_tree, pathspec);
+ return checkout_paths(source_tree, pathspec, &opts);
}
if (new.name && !new.commit) {
diff --git a/t/t7201-co.sh b/t/t7201-co.sh
index 303cf62..bbf86cb 100755
--- a/t/t7201-co.sh
+++ b/t/t7201-co.sh
@@ -391,5 +391,28 @@ test_expect_success 'checkout an unmerged path should fail' '
test_cmp sample file
'
+test_expect_success 'checkout with an unmerged path can ignore' '
+ rm -f .git/index &&
+ O=$(echo original | git hash-object -w --stdin) &&
+ A=$(echo ourside | git hash-object -w --stdin) &&
+ B=$(echo theirside | git hash-object -w --stdin) &&
+ (
+ echo "100644 $A 0 fild" &&
+ echo "100644 $O 1 file" &&
+ echo "100644 $A 2 file" &&
+ echo "100644 $B 3 file" &&
+ echo "100644 $A 0 filf"
+ ) | git update-index --index-info &&
+ echo "none of the above" >sample &&
+ echo ourside >expect &&
+ cat sample >fild &&
+ cat sample >file &&
+ cat sample >filf &&
+ git checkout -f fild file filf &&
+ test_cmp expect fild &&
+ test_cmp expect filf &&
+ test_cmp sample file
+'
+
test_done
--
1.6.0.1.90.g27a6e
next prev parent reply other threads:[~2008-08-29 21:43 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-29 21:39 [PATCH 1/2] checkout: do not check out unmerged higher stages randomly Junio C Hamano
2008-08-29 21:42 ` Junio C Hamano [this message]
2008-08-29 21:53 ` [PATCH 2/2] checkout: allow ignoring unmerged paths when checking out of the index Junio C Hamano
2008-08-30 18:02 ` [PATCH 1/2] checkout: do not check out unmerged higher stages randomly Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7v7i9z4hx2.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).