Anonymous committed 628cd54

[PATCH] git-local-fetch: Avoid confusing error messages on packed repositories

If the source repository was packed, and git-local-fetch needed to
fetch a pack file, it spewed a misleading error message about not
being able to find the unpacked object. Fixed by adding the
warn_if_not_exists argument to copy_file(), which controls printing
of error messages in case the source file does not exist.

Signed-off-by: Sergey Vlasov <>
Signed-off-by: Junio C Hamano <>

Comments (0)

Files changed (1)

 	return 0;
-static int copy_file(const char *source, const char *dest, const char *hex)
+static int copy_file(const char *source, const char *dest, const char *hex,
+		     int warn_if_not_exists)
 	if (use_link) {
 		if (!link(source, dest)) {
 		/* If we got ENOENT there is no point continuing. */
 		if (errno == ENOENT) {
-			fprintf(stderr, "does not exist %s\n", source);
+			if (warn_if_not_exists)
+				fprintf(stderr, "does not exist %s\n", source);
 			return -1;
 	if (use_symlink) {
 		struct stat st;
 		if (stat(source, &st)) {
+			if (!warn_if_not_exists && errno == ENOENT)
+				return -1;
 			fprintf(stderr, "cannot stat %s: %s\n", source,
 			return -1;
 		void *map;
 		ifd = open(source, O_RDONLY);
 		if (ifd < 0 || fstat(ifd, &st) < 0) {
+			int err = errno;
 			if (ifd >= 0)
+			if (!warn_if_not_exists && err == ENOENT)
+				return -1;
 			fprintf(stderr, "cannot open %s\n", source);
 			return -1;
 	sprintf(filename, "%s/objects/pack/pack-%s.pack", 
 		path, sha1_to_hex(target->sha1));
 	copy_file(filename, sha1_pack_name(target->sha1),
-		  sha1_to_hex(target->sha1));
+		  sha1_to_hex(target->sha1), 1);
 	sprintf(filename, "%s/objects/pack/pack-%s.idx", 
 		path, sha1_to_hex(target->sha1));
 	copy_file(filename, sha1_pack_index_name(target->sha1),
-		  sha1_to_hex(target->sha1));
+		  sha1_to_hex(target->sha1), 1);
 	return 0;
 	filename[object_name_start+1] = hex[1];
 	filename[object_name_start+2] = '/';
 	strcpy(filename + object_name_start + 3, hex + 2);
-	return copy_file(filename, dest_filename, hex);
+	return copy_file(filename, dest_filename, hex, 0);
 int fetch(unsigned char *sha1)
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
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.