t / t3100-ls-tree-restrict.shon commit t4208: abstract away SHA-1-specific constants (0b2c4af)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano
   4#
   5
   6test_description='git ls-tree test.
   7
   8This test runs git ls-tree with the following in a tree.
   9
  10    path0       - a file
  11    path1       - a symlink
  12    path2/foo   - a file in a directory
  13    path2/bazbo - a symlink in a directory
  14    path2/baz/b - a file in a directory in a directory
  15
  16The new path restriction code should do the right thing for path2 and
  17path2/baz.  Also path0/ should snow nothing.
  18'
  19. ./test-lib.sh
  20
  21test_expect_success \
  22    'setup' \
  23    'mkdir path2 path2/baz &&
  24     echo Hi >path0 &&
  25     test_ln_s_add path0 path1 &&
  26     test_ln_s_add ../path1 path2/bazbo &&
  27     echo Lo >path2/foo &&
  28     echo Mi >path2/baz/b &&
  29     find path? \( -type f -o -type l \) -print |
  30     xargs git update-index --add &&
  31     tree=$(git write-tree) &&
  32     echo $tree'
  33
  34test_output () {
  35    sed -e "s/ $OID_REGEX       / X     /" <current >check
  36    test_cmp expected check
  37}
  38
  39test_expect_success \
  40    'ls-tree plain' \
  41    'git ls-tree $tree >current &&
  42     cat >expected <<\EOF &&
  43100644 blob X   path0
  44120000 blob X   path1
  45040000 tree X   path2
  46EOF
  47     test_output'
  48
  49test_expect_success \
  50    'ls-tree recursive' \
  51    'git ls-tree -r $tree >current &&
  52     cat >expected <<\EOF &&
  53100644 blob X   path0
  54120000 blob X   path1
  55100644 blob X   path2/baz/b
  56120000 blob X   path2/bazbo
  57100644 blob X   path2/foo
  58EOF
  59     test_output'
  60
  61test_expect_success \
  62    'ls-tree recursive with -t' \
  63    'git ls-tree -r -t $tree >current &&
  64     cat >expected <<\EOF &&
  65100644 blob X   path0
  66120000 blob X   path1
  67040000 tree X   path2
  68040000 tree X   path2/baz
  69100644 blob X   path2/baz/b
  70120000 blob X   path2/bazbo
  71100644 blob X   path2/foo
  72EOF
  73     test_output'
  74
  75test_expect_success \
  76    'ls-tree recursive with -d' \
  77    'git ls-tree -r -d $tree >current &&
  78     cat >expected <<\EOF &&
  79040000 tree X   path2
  80040000 tree X   path2/baz
  81EOF
  82     test_output'
  83
  84test_expect_success \
  85    'ls-tree filtered with path' \
  86    'git ls-tree $tree path >current &&
  87     cat >expected <<\EOF &&
  88EOF
  89     test_output'
  90
  91
  92# it used to be path1 and then path0, but with pathspec semantics
  93# they are shown in canonical order.
  94test_expect_success \
  95    'ls-tree filtered with path1 path0' \
  96    'git ls-tree $tree path1 path0 >current &&
  97     cat >expected <<\EOF &&
  98100644 blob X   path0
  99120000 blob X   path1
 100EOF
 101     test_output'
 102
 103test_expect_success \
 104    'ls-tree filtered with path0/' \
 105    'git ls-tree $tree path0/ >current &&
 106     cat >expected <<\EOF &&
 107EOF
 108     test_output'
 109
 110# It used to show path2 and its immediate children but
 111# with pathspec semantics it shows only path2
 112test_expect_success \
 113    'ls-tree filtered with path2' \
 114    'git ls-tree $tree path2 >current &&
 115     cat >expected <<\EOF &&
 116040000 tree X   path2
 117EOF
 118     test_output'
 119
 120# ... and path2/ shows the children.
 121test_expect_success \
 122    'ls-tree filtered with path2/' \
 123    'git ls-tree $tree path2/ >current &&
 124     cat >expected <<\EOF &&
 125040000 tree X   path2/baz
 126120000 blob X   path2/bazbo
 127100644 blob X   path2/foo
 128EOF
 129     test_output'
 130
 131# The same change -- exact match does not show children of
 132# path2/baz
 133test_expect_success \
 134    'ls-tree filtered with path2/baz' \
 135    'git ls-tree $tree path2/baz >current &&
 136     cat >expected <<\EOF &&
 137040000 tree X   path2/baz
 138EOF
 139     test_output'
 140
 141test_expect_success \
 142    'ls-tree filtered with path2/bak' \
 143    'git ls-tree $tree path2/bak >current &&
 144     cat >expected <<\EOF &&
 145EOF
 146     test_output'
 147
 148test_expect_success \
 149    'ls-tree -t filtered with path2/bak' \
 150    'git ls-tree -t $tree path2/bak >current &&
 151     cat >expected <<\EOF &&
 152040000 tree X   path2
 153EOF
 154     test_output'
 155
 156test_expect_success \
 157    'ls-tree with one path a prefix of the other' \
 158    'git ls-tree $tree path2/baz path2/bazbo >current &&
 159     cat >expected <<\EOF &&
 160040000 tree X   path2/baz
 161120000 blob X   path2/bazbo
 162EOF
 163     test_output'
 164
 165test_done