+ /* Do we have an entry in the cache that makes our path a prefix
+ * of it? That is, are we creating a file where they already expect
+ * a directory there?
+ */
+ pos = cache_name_pos(path,
+ htons(create_ce_flags(namelen, stage)));
+
+ /* (0 <= pos) cannot happen because add_cache_entry()
+ * should have taken care of that case.
+ */
+ pos = -pos-1;
+
+ /* pos would point at an existing entry that would come immediately
+ * after our path. It could be the same as our path in higher stage,
+ * or different path but in a lower stage.
+ *
+ * E.g. when we are inserting path at stage 2,
+ *
+ * 1 path
+ * pos-> 3 path
+ * 2 path/file1
+ * 3 path/file1
+ * 2 path/file2
+ * 2 patho
+ *
+ * We need to examine pos, ignore it because it is at different
+ * stage, examine next to find the path/file at stage 2, and
+ * complain. We need to do this until we are not the leading
+ * path of an existing entry anymore.
+ */
+
+ while (pos < active_nr) {
+ struct cache_entry *other = active_cache[pos];
+ if (strncmp(other->name, path, namelen))
+ break; /* it is not our "subdirectory" anymore */
+ if ((ce_stage(other) == stage) &&
+ other->name[namelen] == '/') {
+ if (!ok_to_replace)
+ return -1;
+ fprintf(stderr, "removing file '%s' under '%s' to be replaced with a file\n", other->name, path);
+ remove_cache_entry_at(pos);
+ replaced = 1;
+ continue; /* cycle without updating pos */
+ }
+ pos++;
+ }
+ return replaced;
+}
+
+int add_cache_entry(struct cache_entry *ce, int option)
+{
+ int pos;
+ int ok_to_add = option & ADD_CACHE_OK_TO_ADD;
+ int ok_to_replace = option & ADD_CACHE_OK_TO_REPLACE;