t / t5600-clone-fail-cleanup.shon commit notes: avoid potential use-after-free during insertion (60fe477)
   1#!/bin/sh
   2#
   3# Copyright (C) 2006 Carl D. Worth <cworth@cworth.org>
   4#
   5
   6test_description='test git clone to cleanup after failure
   7
   8This 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.
  11
  12Unless the directory already exists, in which case we clean up only what we
  13wrote.
  14'
  15
  16. ./test-lib.sh
  17
  18corrupt_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}
  24
  25test_expect_success 'clone of non-existent source should fail' '
  26        test_must_fail git clone foo bar
  27'
  28
  29test_expect_success 'failed clone should not leave a directory' '
  30        test_path_is_missing bar
  31'
  32
  33test_expect_success 'create a repo to clone' '
  34        test_create_repo foo
  35'
  36
  37test_expect_success 'create objects in repo for later corruption' '
  38        test_commit -C foo file
  39'
  40
  41# 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'
  46
  47test_expect_success 'clone should work now that source exists' '
  48        git clone foo bar
  49'
  50
  51test_expect_success 'successful clone must leave the directory' '
  52        test_path_is_dir bar
  53'
  54
  55test_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'
  61
  62test_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'
  68
  69test_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'
  75
  76test_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'
  83
  84test_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'
  91
  92test_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'
  99
 100test_done