diff options
author | Junio C Hamano <gitster@pobox.com> | 2020-07-30 13:20:32 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-07-30 13:20:32 -0700 |
commit | f175e9b845a41f1a5135222d4d3b8aa9161b499a (patch) | |
tree | 5b0fc41171176ae07772e5e196b335e4c3dab65c /builtin/clone.c | |
parent | Merge branch 'pb/log-rev-list-doc' into master (diff) | |
parent | git clone: don't clone into non-empty directory (diff) | |
download | tgif-f175e9b845a41f1a5135222d4d3b8aa9161b499a.tar.xz |
Merge branch 'bw/fail-cloning-into-non-empty' into master
"git clone --separate-git-dir=$elsewhere" used to stomp on the
contents of the existing directory $elsewhere, which has been
taught to fail when $elsewhere is not an empty directory.
* bw/fail-cloning-into-non-empty:
git clone: don't clone into non-empty directory
Diffstat (limited to 'builtin/clone.c')
-rw-r--r-- | builtin/clone.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/builtin/clone.c b/builtin/clone.c index bef70745c0..a9f3312a54 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -946,7 +946,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) int is_bundle = 0, is_local; const char *repo_name, *repo, *work_tree, *git_dir; char *path, *dir, *display_repo = NULL; - int dest_exists; + int dest_exists, real_dest_exists = 0; const struct ref *refs, *remote_head; const struct ref *remote_head_points_at; const struct ref *our_head_points_at; @@ -1021,6 +1021,14 @@ int cmd_clone(int argc, const char **argv, const char *prefix) die(_("destination path '%s' already exists and is not " "an empty directory."), dir); + if (real_git_dir) { + real_dest_exists = path_exists(real_git_dir); + if (real_dest_exists && !is_empty_dir(real_git_dir)) + die(_("repository path '%s' already exists and is not " + "an empty directory."), real_git_dir); + } + + strbuf_addf(&reflog_msg, "clone: from %s", display_repo ? display_repo : repo); free(display_repo); @@ -1057,7 +1065,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) } if (real_git_dir) { - if (path_exists(real_git_dir)) + if (real_dest_exists) junk_git_dir_flags |= REMOVE_DIR_KEEP_TOPLEVEL; junk_git_dir = real_git_dir; } else { |