t / t6501-freshen-objects.shon commit prune: keep objects reachable from recent objects (d3038d2)
   1#!/bin/sh
   2#
   3# This test covers the handling of objects which might have old
   4# mtimes in the filesystem (because they were used previously)
   5# and are just now becoming referenced again.
   6#
   7# We're going to do two things that are a little bit "fake" to
   8# help make our simulation easier:
   9#
  10#   1. We'll turn off reflogs. You can still run into
  11#      problems with reflogs on, but your objects
  12#      don't get pruned until both the reflog expiration
  13#      has passed on their references, _and_ they are out
  14#      of prune's expiration period. Dropping reflogs
  15#      means we only have to deal with one variable in our tests,
  16#      but the results generalize.
  17#
  18#   2. We'll use a temporary index file to create our
  19#      works-in-progress. Most workflows would mention
  20#      referenced objects in the index, which prune takes
  21#      into account. However, many operations don't. For
  22#      example, a partial commit with "git commit foo"
  23#      will use a temporary index. Or they may not need
  24#      an index at all (e.g., creating a new commit
  25#      to refer to an existing tree).
  26
  27test_description='check pruning of dependent objects'
  28. ./test-lib.sh
  29
  30# We care about reachability, so we do not want to use
  31# the normal test_commit, which creates extra tags.
  32add () {
  33        echo "$1" >"$1" &&
  34        git add "$1"
  35}
  36commit () {
  37        test_tick &&
  38        add "$1" &&
  39        git commit -m "$1"
  40}
  41
  42test_expect_success 'disable reflogs' '
  43        git config core.logallrefupdates false &&
  44        rm -rf .git/logs
  45'
  46
  47test_expect_success 'setup basic history' '
  48        commit base
  49'
  50
  51test_expect_success 'create and abandon some objects' '
  52        git checkout -b experiment &&
  53        commit abandon &&
  54        git checkout master &&
  55        git branch -D experiment
  56'
  57
  58test_expect_success 'simulate time passing' '
  59        find .git/objects -type f |
  60        xargs test-chmtime -v -86400
  61'
  62
  63test_expect_success 'start writing new commit with old blob' '
  64        tree=$(
  65                GIT_INDEX_FILE=index.tmp &&
  66                export GIT_INDEX_FILE &&
  67                git read-tree HEAD &&
  68                add unrelated &&
  69                add abandon &&
  70                git write-tree
  71        )
  72'
  73
  74test_expect_success 'simultaneous gc' '
  75        git gc --prune=12.hours.ago
  76'
  77
  78test_expect_success 'finish writing out commit' '
  79        commit=$(echo foo | git commit-tree -p HEAD $tree) &&
  80        git update-ref HEAD $commit
  81'
  82
  83# "abandon" blob should have been rescued by reference from new tree
  84test_expect_success 'repository passes fsck' '
  85        git fsck
  86'
  87
  88test_done