1#!/bin/sh
   2#
   3# Copyright (C) 2006 Carl D. Worth <cworth@cworth.org>
   4#
   5test_description='test git clone to cleanup after failure
   7This test covers the fact that if git clone fails, it should remove
   9the directory it created, to avoid the user having to manually
  10remove the directory before attempting a clone again.
  11Unless the directory already exists, in which case we clean up only what we
  13wrote.
  14'
  15. ./test-lib.sh
  17corrupt_repo () {
  19        test_when_finished "rmdir foo/.git/objects.bak" &&
  20        mkdir foo/.git/objects.bak/ &&
  21        test_when_finished "mv foo/.git/objects.bak/* foo/.git/objects/" &&
  22        mv foo/.git/objects/* foo/.git/objects.bak/
  23}
  24test_expect_success 'clone of non-existent source should fail' '
  26        test_must_fail git clone foo bar
  27'
  28test_expect_success 'failed clone should not leave a directory' '
  30        test_path_is_missing bar
  31'
  32test_expect_success 'create a repo to clone' '
  34        test_create_repo foo
  35'
  36test_expect_success 'create objects in repo for later corruption' '
  38        test_commit -C foo file
  39'
  40# source repository given to git clone should be relative to the
  42# current path not to the target dir
  43test_expect_success 'clone of non-existent (relative to $PWD) source should fail' '
  44        test_must_fail git clone ../foo baz
  45'
  46test_expect_success 'clone should work now that source exists' '
  48        git clone foo bar
  49'
  50test_expect_success 'successful clone must leave the directory' '
  52        test_path_is_dir bar
  53'
  54test_expect_success 'failed clone --separate-git-dir should not leave any directories' '
  56        corrupt_repo &&
  57        test_must_fail git clone --separate-git-dir gitdir foo worktree &&
  58        test_path_is_missing gitdir &&
  59        test_path_is_missing worktree
  60'
  61test_expect_success 'failed clone into empty leaves directory (vanilla)' '
  63        mkdir -p empty &&
  64        corrupt_repo &&
  65        test_must_fail git clone foo empty &&
  66        test_dir_is_empty empty
  67'
  68test_expect_success 'failed clone into empty leaves directory (bare)' '
  70        mkdir -p empty &&
  71        corrupt_repo &&
  72        test_must_fail git clone --bare foo empty &&
  73        test_dir_is_empty empty
  74'
  75test_expect_success 'failed clone into empty leaves directory (separate)' '
  77        mkdir -p empty-git empty-wt &&
  78        corrupt_repo &&
  79        test_must_fail git clone --separate-git-dir empty-git foo empty-wt &&
  80        test_dir_is_empty empty-git &&
  81        test_dir_is_empty empty-wt
  82'
  83test_expect_success 'failed clone into empty leaves directory (separate, git)' '
  85        mkdir -p empty-git &&
  86        corrupt_repo &&
  87        test_must_fail git clone --separate-git-dir empty-git foo no-wt &&
  88        test_dir_is_empty empty-git &&
  89        test_path_is_missing no-wt
  90'
  91test_expect_success 'failed clone into empty leaves directory (separate, wt)' '
  93        mkdir -p empty-wt &&
  94        corrupt_repo &&
  95        test_must_fail git clone --separate-git-dir no-git foo empty-wt &&
  96        test_path_is_missing no-git &&
  97        test_dir_is_empty empty-wt
  98'
  99test_done