Thread (6 messages) flat view 6 messages, 3 authors, 2016-06-15

Re: builtin-clone does not fallback to copy when link fails

From: Brandon Casey <hidden>
Date: 2016-06-15 22:44:37

Brandon Casey wrote:
quoted hunk ↗ jump to hunk
Brandon Casey wrote:
quoted
When cloning with the new builtin-clone, if the src repo is not
on the same disk as the dest repo, cloning fails. This is because
hard linking does not fall back to copying like the shell version
did.

The shell version also made a distinction between defaulting to
hard linking and an explicit request to hard link. In the latter
case it would not fall back to copying, but would die.
Something like this (if not too ugly) might do the trick:
diff --git a/builtin-clone.c b/builtin-clone.c
index 8713128..1062371 100644
--- a/builtin-clone.c
+++ b/builtin-clone.c
@@ -208,11 +208,17 @@ static void copy_or_link_directory(char *src, char *dest)
 		if (unlink(dest) && errno != ENOENT)
 			die("failed to unlink %s\n", dest);
 		if (option_no_hardlinks) {
+FALLBACK_TO_COPY:
 			if (copy_file(dest, src, 0666))
 				die("failed to copy file to %s\n", dest);
 		} else {
-			if (link(src, dest))
+			if (link(src, dest)) {
+				if (errno == EXDEV && !option_local) {
Maybe EPERM should be tested also.

Or maybe it should be simplified to:

	if (!option_local)
		goto FALLBACK_TO_COPY;

-brandon
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help