t1700: new tests for split-index mode
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Nguyễn Thái Ngọc Duy committed
Jun 13, 2014 at 19:19 UTC
3e52f70b1505956bf91cb7b107e526d1c67da0a6
6 files changed
+233
-2
.gitignore
+1
@@ -180,6 +180,7 @@
180
/test-date
181
/test-delta
182
/test-dump-cache-tree
183
+/test-dump-split-index
184
/test-scrap-cache-tree
185
/test-genrandom
186
/test-hashmap
Makefile
+1
@@ -565,6 +565,7 @@ TEST_PROGRAMS_NEED_X += test-ctype
565
TEST_PROGRAMS_NEED_X += test-date
566
TEST_PROGRAMS_NEED_X += test-delta
567
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
568
+TEST_PROGRAMS_NEED_X += test-dump-split-index
569
TEST_PROGRAMS_NEED_X += test-genrandom
570
TEST_PROGRAMS_NEED_X += test-hashmap
571
TEST_PROGRAMS_NEED_X += test-index-version
cache.h
+2
@@ -473,6 +473,8 @@ extern int daemonize(void);
473
struct lock_file;
474
extern int read_index(struct index_state *);
475
extern int read_index_preload(struct index_state *, const struct pathspec *pathspec);
476
+extern int do_read_index(struct index_state *istate, const char *path,
477
+ int must_exist); /* for testting only! */
478
extern int read_index_from(struct index_state *, const char *path);
479
extern int is_index_unborn(struct index_state *);
480
extern int read_index_unmerged(struct index_state *);
read-cache.c
+1
-2
@@ -1463,8 +1463,7 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk,
1463
}
1464
1465
/* remember to discard_cache() before reading a different cache! */
1466
-static int do_read_index(struct index_state *istate, const char *path,
1467
- int must_exist)
1466
+int do_read_index(struct index_state *istate, const char *path, int must_exist)
1467
{
1468
int fd, i;
1469
struct stat st;
t/t1700-split-index.sh
new
+194
@@ -0,0 +1,194 @@
1
+#!/bin/sh
2
+
3
+test_description='split index mode tests'
4
+
5
+. ./test-lib.sh
6
+
7
+# We need total control of index splitting here
8
+sane_unset GIT_TEST_SPLIT_INDEX
9
+
10
+test_expect_success 'enable split index' '
11
+ git update-index --split-index &&
12
+ test-dump-split-index .git/index >actual &&
13
+ cat >expect <<EOF &&
14
+own 8299b0bcd1ac364e5f1d7768efb62fa2da79a339
15
+base 39d890139ee5356c7ef572216cebcd27aa41f9df
16
+replacements:
17
+deletions:
18
+EOF
19
+ test_cmp expect actual
20
+'
21
+
22
+test_expect_success 'add one file' '
23
+ : >one &&
24
+ git update-index --add one &&
25
+ git ls-files --stage >ls-files.actual &&
26
+ cat >ls-files.expect <<EOF &&
27
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
28
+EOF
29
+ test_cmp ls-files.expect ls-files.actual &&
30
+
31
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
32
+ cat >expect <<EOF &&
33
+base 39d890139ee5356c7ef572216cebcd27aa41f9df
34
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
35
+replacements:
36
+deletions:
37
+EOF
38
+ test_cmp expect actual
39
+'
40
+
41
+test_expect_success 'disable split index' '
42
+ git update-index --no-split-index &&
43
+ git ls-files --stage >ls-files.actual &&
44
+ cat >ls-files.expect <<EOF &&
45
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
46
+EOF
47
+ test_cmp ls-files.expect ls-files.actual &&
48
+
49
+ BASE=`test-dump-split-index .git/index | grep "^own" | sed "s/own/base/"` &&
50
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
51
+ cat >expect <<EOF &&
52
+not a split index
53
+EOF
54
+ test_cmp expect actual
55
+'
56
+
57
+test_expect_success 'enable split index again, "one" now belongs to base index"' '
58
+ git update-index --split-index &&
59
+ git ls-files --stage >ls-files.actual &&
60
+ cat >ls-files.expect <<EOF &&
61
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
62
+EOF
63
+ test_cmp ls-files.expect ls-files.actual &&
64
+
65
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
66
+ cat >expect <<EOF &&
67
+$BASE
68
+replacements:
69
+deletions:
70
+EOF
71
+ test_cmp expect actual
72
+'
73
+
74
+test_expect_success 'modify original file, base index untouched' '
75
+ echo modified >one &&
76
+ git update-index one &&
77
+ git ls-files --stage >ls-files.actual &&
78
+ cat >ls-files.expect <<EOF &&
79
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
80
+EOF
81
+ test_cmp ls-files.expect ls-files.actual &&
82
+
83
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
84
+ q_to_tab >expect <<EOF &&
85
+$BASE
86
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
87
+replacements: 0
88
+deletions:
89
+EOF
90
+ test_cmp expect actual
91
+'
92
+
93
+test_expect_success 'add another file, which stays index' '
94
+ : >two &&
95
+ git update-index --add two &&
96
+ git ls-files --stage >ls-files.actual &&
97
+ cat >ls-files.expect <<EOF &&
98
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
99
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 two
100
+EOF
101
+ test_cmp ls-files.expect ls-files.actual &&
102
+
103
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
104
+ q_to_tab >expect <<EOF &&
105
+$BASE
106
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
107
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 two
108
+replacements: 0
109
+deletions:
110
+EOF
111
+ test_cmp expect actual
112
+'
113
+
114
+test_expect_success 'remove file not in base index' '
115
+ git update-index --force-remove two &&
116
+ git ls-files --stage >ls-files.actual &&
117
+ cat >ls-files.expect <<EOF &&
118
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
119
+EOF
120
+ test_cmp ls-files.expect ls-files.actual &&
121
+
122
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
123
+ q_to_tab >expect <<EOF &&
124
+$BASE
125
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
126
+replacements: 0
127
+deletions:
128
+EOF
129
+ test_cmp expect actual
130
+'
131
+
132
+test_expect_success 'remove file in base index' '
133
+ git update-index --force-remove one &&
134
+ git ls-files --stage >ls-files.actual &&
135
+ cat >ls-files.expect <<EOF &&
136
+EOF
137
+ test_cmp ls-files.expect ls-files.actual &&
138
+
139
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
140
+ cat >expect <<EOF &&
141
+$BASE
142
+replacements:
143
+deletions: 0
144
+EOF
145
+ test_cmp expect actual
146
+'
147
+
148
+test_expect_success 'add original file back' '
149
+ : >one &&
150
+ git update-index --add one &&
151
+ git ls-files --stage >ls-files.actual &&
152
+ cat >ls-files.expect <<EOF &&
153
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
154
+EOF
155
+ test_cmp ls-files.expect ls-files.actual &&
156
+
157
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
158
+ cat >expect <<EOF &&
159
+$BASE
160
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
161
+replacements:
162
+deletions: 0
163
+EOF
164
+ test_cmp expect actual
165
+'
166
+
167
+test_expect_success 'add new file' '
168
+ : >two &&
169
+ git update-index --add two &&
170
+ git ls-files --stage >actual &&
171
+ cat >expect <<EOF &&
172
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
173
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 two
174
+EOF
175
+ test_cmp expect actual
176
+'
177
+
178
+test_expect_success 'unify index, two files remain' '
179
+ git update-index --no-split-index &&
180
+ git ls-files --stage >ls-files.actual &&
181
+ cat >ls-files.expect <<EOF &&
182
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
183
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 two
184
+EOF
185
+ test_cmp ls-files.expect ls-files.actual
186
+
187
+ test-dump-split-index .git/index | sed "/^own/d" >actual &&
188
+ cat >expect <<EOF &&
189
+not a split index
190
+EOF
191
+ test_cmp expect actual
192
+'
193
+
194
+test_done
test-dump-split-index.c
new
+34
@@ -0,0 +1,34 @@
1
+#include "cache.h"
2
+#include "split-index.h"
3
+#include "ewah/ewok.h"
4
+
5
+static void show_bit(size_t pos, void *data)
6
+{
7
+ printf(" %d", (int)pos);
8
+}
9
+
10
+int main(int ac, char **av)
11
+{
12
+ struct split_index *si;
13
+ int i;
14
+
15
+ do_read_index(&the_index, av[1], 1);
16
+ printf("own %s\n", sha1_to_hex(the_index.sha1));
17
+ si = the_index.split_index;
18
+ if (!si) {
19
+ printf("not a split index\n");
20
+ return 0;
21
+ }
22
+ printf("base %s\n", sha1_to_hex(si->base_sha1));
23
+ for (i = 0; i < the_index.cache_nr; i++) {
24
+ struct cache_entry *ce = the_index.cache[i];
25
+ printf("%06o %s %d\t%s\n", ce->ce_mode,
26
+ sha1_to_hex(ce->sha1), ce_stage(ce), ce->name);
27
+ }
28
+ printf("replacements:");
29
+ ewah_each_bit(si->replace_bitmap, show_bit, NULL);
30
+ printf("\ndeletions:");
31
+ ewah_each_bit(si->delete_bitmap, show_bit, NULL);
32
+ printf("\n");
33
+ return 0;
34
+}