about summary refs log tree commit diff
path: root/third_party/git/cache-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/cache-tree.c')
-rw-r--r--third_party/git/cache-tree.c103
1 files changed, 30 insertions, 73 deletions
diff --git a/third_party/git/cache-tree.c b/third_party/git/cache-tree.c
index a537a806c16e..706ffcf1883a 100644
--- a/third_party/git/cache-tree.c
+++ b/third_party/git/cache-tree.c
@@ -5,7 +5,6 @@
 #include "cache-tree.h"
 #include "object-store.h"
 #include "replace-object.h"
-#include "promisor-remote.h"
 
 #ifndef DEBUG_CACHE_TREE
 #define DEBUG_CACHE_TREE 0
@@ -358,7 +357,7 @@ static int update_one(struct cache_tree *it,
 		}
 
 		ce_missing_ok = mode == S_IFGITLINK || missing_ok ||
-			(has_promisor_remote() &&
+			(repository_format_partial_clone &&
 			 ce_skip_worktree(ce));
 		if (is_null_oid(oid) ||
 		    (!ce_missing_ok && !has_object_file(oid))) {
@@ -407,15 +406,13 @@ static int update_one(struct cache_tree *it,
 
 	if (repair) {
 		struct object_id oid;
-		hash_object_file(the_hash_algo, buffer.buf, buffer.len,
-				 tree_type, &oid);
-		if (has_object_file_with_flags(&oid, OBJECT_INFO_SKIP_FETCH_OBJECT))
+		hash_object_file(buffer.buf, buffer.len, tree_type, &oid);
+		if (has_object_file(&oid))
 			oidcpy(&it->oid, &oid);
 		else
 			to_invalidate = 1;
 	} else if (dryrun) {
-		hash_object_file(the_hash_algo, buffer.buf, buffer.len,
-				 tree_type, &it->oid);
+		hash_object_file(buffer.buf, buffer.len, tree_type, &it->oid);
 	} else if (write_object_file(buffer.buf, buffer.len, tree_type,
 				     &it->oid)) {
 		strbuf_release(&buffer);
@@ -611,66 +608,11 @@ static struct cache_tree *cache_tree_find(struct cache_tree *it, const char *pat
 	return it;
 }
 
-static int write_index_as_tree_internal(struct object_id *oid,
-					struct index_state *index_state,
-					int cache_tree_valid,
-					int flags,
-					const char *prefix)
-{
-	if (flags & WRITE_TREE_IGNORE_CACHE_TREE) {
-		cache_tree_free(&index_state->cache_tree);
-		cache_tree_valid = 0;
-	}
-
-	if (!index_state->cache_tree)
-		index_state->cache_tree = cache_tree();
-
-	if (!cache_tree_valid && cache_tree_update(index_state, flags) < 0)
-		return WRITE_TREE_UNMERGED_INDEX;
-
-	if (prefix) {
-		struct cache_tree *subtree;
-		subtree = cache_tree_find(index_state->cache_tree, prefix);
-		if (!subtree)
-			return WRITE_TREE_PREFIX_ERROR;
-		oidcpy(oid, &subtree->oid);
-	}
-	else
-		oidcpy(oid, &index_state->cache_tree->oid);
-
-	return 0;
-}
-
-struct tree* write_in_core_index_as_tree(struct repository *repo) {
-	struct object_id o;
-	int was_valid, ret;
-
-	struct index_state *index_state	= repo->index;
-	was_valid = index_state->cache_tree &&
-		    cache_tree_fully_valid(index_state->cache_tree);
-
-	ret = write_index_as_tree_internal(&o, index_state, was_valid, 0, NULL);
-	if (ret == WRITE_TREE_UNMERGED_INDEX) {
-		int i;
-		fprintf(stderr, "BUG: There are unmerged index entries:\n");
-		for (i = 0; i < index_state->cache_nr; i++) {
-			const struct cache_entry *ce = index_state->cache[i];
-			if (ce_stage(ce))
-				fprintf(stderr, "BUG: %d %.*s\n", ce_stage(ce),
-					(int)ce_namelen(ce), ce->name);
-		}
-		BUG("unmerged index entries when writing inmemory index");
-	}
-
-	return lookup_tree(repo, &index_state->cache_tree->oid);
-}
-
-
 int write_index_as_tree(struct object_id *oid, struct index_state *index_state, const char *index_path, int flags, const char *prefix)
 {
 	int entries, was_valid;
 	struct lock_file lock_file = LOCK_INIT;
-	int ret;
+	int ret = 0;
 
 	hold_lock_file_for_update(&lock_file, index_path, LOCK_DIE_ON_ERROR);
 
@@ -679,14 +621,18 @@ int write_index_as_tree(struct object_id *oid, struct index_state *index_state,
 		ret = WRITE_TREE_UNREADABLE_INDEX;
 		goto out;
 	}
+	if (flags & WRITE_TREE_IGNORE_CACHE_TREE)
+		cache_tree_free(&index_state->cache_tree);
 
-	was_valid = !(flags & WRITE_TREE_IGNORE_CACHE_TREE) &&
-		    index_state->cache_tree &&
-		    cache_tree_fully_valid(index_state->cache_tree);
+	if (!index_state->cache_tree)
+		index_state->cache_tree = cache_tree();
 
-	ret = write_index_as_tree_internal(oid, index_state, was_valid, flags,
-					   prefix);
-	if (!ret && !was_valid) {
+	was_valid = cache_tree_fully_valid(index_state->cache_tree);
+	if (!was_valid) {
+		if (cache_tree_update(index_state, flags) < 0) {
+			ret = WRITE_TREE_UNMERGED_INDEX;
+			goto out;
+		}
 		write_locked_index(index_state, &lock_file, COMMIT_LOCK);
 		/* Not being able to write is fine -- we are only interested
 		 * in updating the cache-tree part, and if the next caller
@@ -696,6 +642,18 @@ int write_index_as_tree(struct object_id *oid, struct index_state *index_state,
 		 */
 	}
 
+	if (prefix) {
+		struct cache_tree *subtree;
+		subtree = cache_tree_find(index_state->cache_tree, prefix);
+		if (!subtree) {
+			ret = WRITE_TREE_PREFIX_ERROR;
+			goto out;
+		}
+		oidcpy(oid, &subtree->oid);
+	}
+	else
+		oidcpy(oid, &index_state->cache_tree->oid);
+
 out:
 	rollback_lock_file(&lock_file);
 	return ret;
@@ -755,7 +713,7 @@ static struct cache_tree *find_cache_tree_from_traversal(struct cache_tree *root
 	if (!info->prev)
 		return root;
 	our_parent = find_cache_tree_from_traversal(root, info->prev);
-	return cache_tree_find(our_parent, info->name);
+	return cache_tree_find(our_parent, info->name.path);
 }
 
 int cache_tree_matches_traversal(struct cache_tree *root,
@@ -828,10 +786,9 @@ static void verify_one(struct repository *r,
 			i++;
 		}
 		strbuf_addf(&tree_buf, "%o %.*s%c", mode, entlen, name, '\0');
-		strbuf_add(&tree_buf, oid->hash, r->hash_algo->rawsz);
+		strbuf_add(&tree_buf, oid->hash, the_hash_algo->rawsz);
 	}
-	hash_object_file(r->hash_algo, tree_buf.buf, tree_buf.len, tree_type,
-			 &new_oid);
+	hash_object_file(tree_buf.buf, tree_buf.len, tree_type, &new_oid);
 	if (!oideq(&new_oid, &it->oid))
 		BUG("cache-tree for path %.*s does not match. "
 		    "Expected %s got %s", len, path->buf,