diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-10-21 21:49:24 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-10-21 21:49:24 +0400 |
commit | df6840855d24c2f54c0b8a66cbac33d8af43333a (patch) | |
tree | 355715d1b644e9fd88307485c424dfadcdae7e81 /builtin | |
parent | 634b29d2705af2e05d593b75ade2be64033468a5 (diff) | |
parent | 0a1283bc3955a97557019d077b96669c5c93c551 (diff) |
Merge branch 'jc/checkout-from-tree-keep-local-changes' into maint
* jc/checkout-from-tree-keep-local-changes:
checkout $tree $path: do not clobber local changes in $path not in $tree
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/checkout.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/builtin/checkout.c b/builtin/checkout.c index 5e356a6c61..75dbe76136 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -71,7 +71,7 @@ static int update_some(const unsigned char *sha1, const char *base, int baselen, hashcpy(ce->sha1, sha1); memcpy(ce->name, base, baselen); memcpy(ce->name + baselen, pathname, len - baselen); - ce->ce_flags = create_ce_flags(len, 0); + ce->ce_flags = create_ce_flags(len, 0) | CE_UPDATE; ce->ce_mode = create_ce_mode(mode); add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); return 0; @@ -228,6 +228,8 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec, for (pos = 0; pos < active_nr; pos++) { struct cache_entry *ce = active_cache[pos]; + if (source_tree && !(ce->ce_flags & CE_UPDATE)) + continue; match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched); } @@ -266,6 +268,8 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec, state.refresh_cache = 1; for (pos = 0; pos < active_nr; pos++) { struct cache_entry *ce = active_cache[pos]; + if (source_tree && !(ce->ce_flags & CE_UPDATE)) + continue; if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) { if (!ce_stage(ce)) { errs |= checkout_entry(ce, &state, NULL); |