@matheusbsbs / matheus-bagliano / commits / fa7b3c2f75
Fork 0

checkout: Fix "initial checkout" detection

Earlier commit 5521883 (checkout: do not lose staged removal, 2008-09-07) tightened the rule to prevent switching branches from losing local changes, so that staged removal of paths can be protected, while attempting to keep a loophole to still allow a special case of switching out of an un-checked-out state. However, the loophole was made a bit too tight, and did not allow switching from one branch (in an un-checked-out state) to check out another branch. The change to builtin-checkout.c in this commit loosens it to allow this, by not insisting the original commit and the new commit to be the same. It also introduces a new function, is_index_unborn (and an associated macro, is_cache_unborn), to check if the repository is truly in an un-checked-out state more reliably, by making sure that $GIT_INDEX_FILE did not exist when populating the in-core index structure. A few places the earlier commit 5521883 added the check for the initial checkout condition are updated to use this function. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Nov 12, 2008 at 11:52 UTC fa7b3c2f752a10a5dca9989d4a1c4b93ffa7f943
4 files changed +9 -3
builtin-checkout.c
+1 -2
@@ -269,8 +269,7 @@ static int merge_working_tree(struct checkout_opts *opts,
269 }
270
271 /* 2-way merge to the new branch */
272 - topts.initial_checkout = (!active_nr &&
273 - (old->commit == new->commit));
272 + topts.initial_checkout = is_cache_unborn();
273 topts.update = 1;
274 topts.merge = 1;
275 topts.gently = opts->merge;
builtin-read-tree.c
+1 -1
@@ -206,7 +206,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
206 break;
207 case 2:
208 opts.fn = twoway_merge;
209 - opts.initial_checkout = !active_nr;
209 + opts.initial_checkout = is_cache_unborn();
210 break;
211 case 3:
212 default:
cache.h
+2
@@ -255,6 +255,7 @@ static inline void remove_name_hash(struct cache_entry *ce)
255
256 #define read_cache() read_index(&the_index)
257 #define read_cache_from(path) read_index_from(&the_index, (path))
258 +#define is_cache_unborn() is_index_unborn(&the_index)
259 #define read_cache_unmerged() read_index_unmerged(&the_index)
260 #define write_cache(newfd, cache, entries) write_index(&the_index, (newfd))
261 #define discard_cache() discard_index(&the_index)
@@ -360,6 +361,7 @@ extern int init_db(const char *template_dir, unsigned int flags);
361 /* Initialize and use the cache information */
362 extern int read_index(struct index_state *);
363 extern int read_index_from(struct index_state *, const char *path);
364 +extern int is_index_unborn(struct index_state *);
365 extern int read_index_unmerged(struct index_state *);
366 extern int write_index(const struct index_state *, int newfd);
367 extern int discard_index(struct index_state *);
read-cache.c
+5
@@ -1239,6 +1239,11 @@ unmap:
1239 die("index file corrupt");
1240 }
1241
1242 +int is_index_unborn(struct index_state *istate)
1243 +{
1244 + return (!istate->cache_nr && !istate->alloc && !istate->timestamp);
1245 +}
1246 +
1247 int discard_index(struct index_state *istate)
1248 {
1249 istate->cache_nr = 0;