summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2015-06-15 10:20:58 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2015-06-15 10:20:58 +0200
commit2665fefa0f3af60c04b747e2f06c0d4ca6ea75f7 (patch)
tree622623d6a1515175d56258e9520abb7aaf53386d
parentb224c3886924d181e2699d799826d3e631d5f90f (diff)
parent10940736887e279583e6b14d7e25de5db73768e1 (diff)
downloadlibgit2-2665fefa0f3af60c04b747e2f06c0d4ca6ea75f7.tar.gz
Merge pull request #3171 from libgit2/cmn/link-fallback
clone: fall back to copying when linking does not work
-rw-r--r--src/clone.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/clone.c b/src/clone.c
index 8b42ce706..070daf94d 100644
--- a/src/clone.c
+++ b/src/clone.c
@@ -532,8 +532,21 @@ static int clone_local_into(git_repository *repo, git_remote *remote, const git_
if (can_link(git_repository_path(src), git_repository_path(repo), link))
flags |= GIT_CPDIR_LINK_FILES;
- if ((error = git_futils_cp_r(git_buf_cstr(&src_odb), git_buf_cstr(&dst_odb),
- flags, GIT_OBJECT_DIR_MODE)) < 0)
+ error = git_futils_cp_r(git_buf_cstr(&src_odb), git_buf_cstr(&dst_odb),
+ flags, GIT_OBJECT_DIR_MODE);
+
+ /*
+ * can_link() doesn't catch all variations, so if we hit an
+ * error and did want to link, let's try again without trying
+ * to link.
+ */
+ if (error < 0 && link) {
+ flags &= ~GIT_CPDIR_LINK_FILES;
+ error = git_futils_cp_r(git_buf_cstr(&src_odb), git_buf_cstr(&dst_odb),
+ flags, GIT_OBJECT_DIR_MODE);
+ }
+
+ if (error < 0)
goto cleanup;
git_buf_printf(&reflog_message, "clone: from %s", git_remote_url(remote));