Brandon Casey wrote: > Brandon Casey wrote: >> 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html