void collect_new_blocks_from_index (struct index_state *index, BlockList *bl) { int i; struct cache_entry *ce; for (i = 0; i < index->cache_nr; ++i) { ce = index->cache[i]; if (ce->ce_flags & CE_UPDATE) fill_seafile_blocks (ce->sha1, bl); } }
static int update_file_flags(struct merge_options *o, const unsigned char *sha, unsigned mode, const char *path, int update_cache, int update_wd) { char *real_path; char file_id[41]; int clean = 1; if (update_wd && o->collect_blocks_only) { fill_seafile_blocks (sha, o->bl); return clean; } real_path = g_build_path(PATH_SEPERATOR, o->worktree, path, NULL); if (update_wd) { char *new_path; SeafStat st; char *conflict_suffix; /* When creating a conflict directory, we use o->branch2 as conflict * suffix instead of the last changer name of path. * This is because there may be more than one conflicting file * under this directory, each has different changer. */ if (make_room_for_path(o->index, path, real_path, &new_path, o->branch2, &clean) < 0) { g_free (real_path); return clean; } g_free (real_path); /* Checkout an empty dir. */ if (S_ISDIR (mode)) { if (g_mkdir (path, 0777) < 0) g_warning ("Failed to create empty dir %s.\n", path); return 0; } /* We're checking out a clean file in recover merge. * Note that file is clean only when it's added by others. */ if (update_cache && o->recover_merge && seaf_stat(new_path, &st) == 0 && S_ISREG(st.st_mode)) { if (compare_file_content (new_path, &st, sha, o->crypt) == 0) { real_path = new_path; goto update_cache; } /* If the file was checked out and changed by user, we * don't need to check out again, since the user should * know the content of this file. */ g_free (new_path); return clean; } conflict_suffix = get_last_changer_of_file (o->remote_head, path); if (!conflict_suffix) conflict_suffix = g_strdup(o->branch2); rawdata_to_hex(sha, file_id, 20); if (seaf_fs_manager_checkout_file(seaf->fs_mgr, file_id, new_path, mode, o->crypt, conflict_suffix) < 0) { g_warning("Failed to checkout file %s.\n", file_id); g_free(new_path); g_free (conflict_suffix); return clean; } g_free (conflict_suffix); /* replace real_path with new_path. */ real_path = new_path; } update_cache: if (update_cache) add_cacheinfo(o->index, mode, sha, path, real_path, 0, update_wd, ADD_CACHE_OK_TO_ADD); g_free(real_path); return clean; }