Anonymous avatar Anonymous committed d48a72f

Fix replacing of a directory with a file/symlink in git-checkout-cache

The symlink case had never worked, and the file case was broken by the
O_EXCL change because the error return changed from EISDIR to EEXIST.

Fix both problems by just moving the test for an existing directory to a
more logical place.

Comments (0)

Files changed (1)

 		die("cannot rmdir %s", path);
 }
 
-static int create_file(const char *path, unsigned int mode, int force)
+static int create_file(const char *path, unsigned int mode)
 {
-	int fd;
-
 	mode = (mode & 0100) ? 0777 : 0666;
-	fd = open(path, O_WRONLY | O_TRUNC | O_CREAT | O_EXCL, mode);
-	if (fd < 0) {
-		if (errno == EISDIR && force) {
-			remove_subtree(path);
-			fd = open(path, O_WRONLY | O_TRUNC | O_CREAT | O_EXCL, mode);
-		}
-	}
-	return fd;
+	return open(path, O_WRONLY | O_TRUNC | O_CREAT | O_EXCL, mode);
 }
 
 static int write_entry(struct cache_entry *ce, const char *path, struct checkout *state)
 	}
 	switch (ntohl(ce->ce_mode) & S_IFMT) {
 	case S_IFREG:
-		fd = create_file(path, ntohl(ce->ce_mode), state->force);
+		fd = create_file(path, ntohl(ce->ce_mode));
 		if (fd < 0) {
 			free(new);
 			return error("git-checkout-cache: unable to create file %s (%s)",
 		 * just do the right thing)
 		 */
 		unlink(path);
+		if (S_ISDIR(st.st_mode)) {
+			if (!state->force)
+				return error("%s is a directory", path);
+			remove_subtree(path);
+		}
 	} else if (state->not_new) 
 		return 0;
 	create_directories(path, state);
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.