read-cache.c: move tempfile creation/cleanup out of write_shared_index
For one thing, we have more consistent cleanup procedure now and always keep errno intact. The real purpose is the ability to break out of write_locked_index() early when mks_tempfile() fails in the next patch. It's more awkward to do it if this mks_tempfile() is still inside write_shared_index(). Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Nguyễn Thái Ngọc Duy committed
Jan 14, 2018 at 17:18 UTC
59f9d2dd60f97c55c92c3273903f64048a27e513
1 file changed
+17
-16
read-cache.c
+17
-16
@@ -2472,31 +2472,18 @@ static int clean_shared_index_files(const char *current_hex)
2472
}
2473
2474
static int write_shared_index(struct index_state *istate,
2475
- struct lock_file *lock, unsigned flags)
2475
+ struct tempfile **temp)
2476
{
2477
- struct tempfile *real_temp;
2478
- struct tempfile **temp = &real_temp;
2477
struct split_index *si = istate->split_index;
2478
int ret;
2479
2482
- real_temp = mks_tempfile(git_path("sharedindex_XXXXXX"));
2483
- if (!real_temp) {
2484
- hashclr(si->base_sha1);
2485
- return do_write_locked_index(istate, lock, flags);
2486
- }
2487
- temp = &real_temp;
2480
move_cache_to_base_index(istate);
2481
ret = do_write_index(si->base, *temp, 1);
2490
- if (ret) {
2491
- delete_tempfile(temp);
2482
+ if (ret)
2483
return ret;
2493
- }
2484
ret = adjust_shared_perm(get_tempfile_path(*temp));
2485
if (ret) {
2496
- int save_errno = errno;
2486
error("cannot fix permission bits on %s", get_tempfile_path(*temp));
2498
- delete_tempfile(temp);
2499
- errno = save_errno;
2487
return ret;
2488
}
2489
ret = rename_tempfile(temp,
@@ -2567,7 +2554,21 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock,
2554
new_shared_index = istate->cache_changed & SPLIT_INDEX_ORDERED;
2555
2556
if (new_shared_index) {
2570
- ret = write_shared_index(istate, lock, flags);
2557
+ struct tempfile *temp;
2558
+ int saved_errno;
2559
+
2560
+ temp = mks_tempfile(git_path("sharedindex_XXXXXX"));
2561
+ if (!temp) {
2562
+ hashclr(si->base_sha1);
2563
+ ret = do_write_locked_index(istate, lock, flags);
2564
+ } else
2565
+ ret = write_shared_index(istate, &temp);
2566
+
2567
+ saved_errno = errno;
2568
+ if (is_tempfile_active(temp))
2569
+ delete_tempfile(&temp);
2570
+ errno = saved_errno;
2571
+
2572
if (ret)
2573
goto out;
2574
}