forked from newren/git-filter-repo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patht9392-python-callback.sh
executable file
·196 lines (175 loc) · 5.61 KB
/
t9392-python-callback.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/bin/bash
test_description='Usage of git-filter-repo with python callbacks'
. ./test-lib.sh
export PATH=$(dirname $TEST_DIRECTORY):$PATH # Put git-filter-repo in PATH
setup()
{
git init $1 &&
(
cd $1 &&
echo hello > world &&
git add world &&
test_tick &&
git commit -m initial &&
printf "The launch code is 1-2-3-4." > secret &&
git add secret &&
test_tick &&
git commit -m "Sssh. Dont tell no one" &&
echo A file that you cant trust > file.doc &&
echo there >> world &&
git add file.doc world &&
test_tick &&
printf "Random useless changes\n\nLet us be like the marketing group. Marketing is staffed with pansies" | git commit -F - &&
echo Do not use a preposition to end a setence with > advice &&
git add advice &&
test_tick &&
GIT_AUTHOR_NAME="Copy N. Paste" git commit -m "hypocrisy is fun" &&
echo Avoid cliches like the plague >> advice &&
test_tick &&
GIT_AUTHOR_EMAIL="[email protected]" git commit -m "it is still fun" advice &&
echo " \$Id: A bunch of junk$" > foobar.c &&
git add foobar.c &&
test_tick &&
git commit -m "Brain damage" &&
git tag v1.0 HEAD~3 &&
git tag -a -m 'Super duper snazzy release' v2.0 HEAD~1 &&
git branch testing master &&
# Make it look like a fresh clone (avoid need for --force)
git gc &&
git remote add origin . &&
git update-ref refs/remotes/origin/master refs/heads/master
git update-ref refs/remotes/origin/testing refs/heads/testing
)
}
test_expect_success '--filename-callback' '
setup filename-callback &&
(
cd filename-callback &&
git filter-repo --filename-callback "return None if filename.endswith(b\".doc\") else b\"src/\"+filename" &&
git log --format=%n --name-only | sort | uniq | grep -v ^$ > f &&
! grep file.doc f &&
COMPARE=$(wc -l <f) &&
grep src/ f >filtered_f &&
test_line_count = $COMPARE filtered_f
)
'
test_expect_success '--message-callback' '
setup message-callback &&
(
cd message-callback &&
git filter-repo --message-callback "return b\"TLDR: \"+message[0:5]" &&
git log --format=%s >log-messages &&
grep TLDR:...... log-messages >modified-messages &&
test_line_count = 6 modified-messages
)
'
test_expect_success '--name-callback' '
setup name-callback &&
(
cd name-callback &&
git filter-repo --name-callback "return name.replace(b\"N.\", b\"And\")" &&
git log --format=%an >log-person-names &&
grep Copy.And.Paste log-person-names
)
'
test_expect_success '--email-callback' '
setup email-callback &&
(
cd email-callback &&
git filter-repo --email-callback "return email.replace(b\".com\", b\".org\")" &&
git log --format=%ae%n%ce >log-emails &&
! grep .com log-emails &&
grep .org log-emails
)
'
test_expect_success '--refname-callback' '
setup refname-callback &&
(
cd refname-callback &&
git filter-repo --refname-callback "
dir,path = os.path.split(refname)
return dir+b\"/prefix-\"+path" &&
git show-ref | grep refs/heads/prefix-master &&
git show-ref | grep refs/tags/prefix-v1.0 &&
git show-ref | grep refs/tags/prefix-v2.0
)
'
test_expect_success '--refname-callback sanity check' '
setup refname-sanity-check &&
(
cd refname-sanity-check &&
test_must_fail git filter-repo --refname-callback "return re.sub(b\"tags\", b\"other-tags\", refname)" 2>../err &&
test_i18ngrep "fast-import requires tags to be in refs/tags/ namespace" ../err &&
rm ../err
)
'
test_expect_success '--blob-callback' '
setup blob-callback &&
(
cd blob-callback &&
git log --format=%n --name-only | sort | uniq | grep -v ^$ > f &&
test_line_count = 5 f &&
rm f &&
git filter-repo --blob-callback "if len(blob.data) > 25: blob.skip()" &&
git log --format=%n --name-only | sort | uniq | grep -v ^$ > f &&
test_line_count = 2 f
)
'
test_expect_success '--commit-callback' '
setup commit-callback &&
(
cd commit-callback &&
git filter-repo --commit-callback "
commit.committer_name = commit.author_name
commit.committer_email = commit.author_email
commit.committer_date = commit.author_date
for change in commit.file_changes:
change.mode = b\"100755\"
" &&
git log --format=%ae%n%ce >log-emails &&
! grep [email protected] log-emails &&
git log --raw | grep ^: >file-changes &&
! grep 100644 file-changes &&
grep 100755 file-changes
)
'
test_expect_success '--tag-callback' '
setup tag-callback &&
(
cd tag-callback &&
git filter-repo --tag-callback "
tag.tagger_name = b\"Dr. \"+tag.tagger_name
tag.message = b\"Awesome sauce \"+tag.message
" &&
git cat-file -p v2.0 | grep ^tagger.Dr\\. &&
git cat-file -p v2.0 | grep ^Awesome.sauce.Super
)
'
test_expect_success '--reset-callback' '
setup reset-callback &&
(
cd reset-callback &&
git filter-repo --reset-callback "reset.from_ref = 3" &&
test $(git rev-parse testing) = $(git rev-parse master~3)
)
'
test_expect_success 'callback has return statement sanity check' '
setup callback_return_sanity &&
(
cd callback_return_sanity &&
test_must_fail git filter-repo --filename-callback "filename + b\".txt\"" 2>../err&&
test_i18ngrep "Error: --filename-callback should have a return statement" ../err &&
rm ../err
)
'
test_expect_success 'Callback read from a file' '
setup name-callback-from-file &&
(
cd name-callback-from-file &&
echo "return name.replace(b\"N.\", b\"And\")" >../name-func &&
git filter-repo --name-callback ../name-func &&
git log --format=%an >log-person-names &&
grep Copy.And.Paste log-person-names
)
'
test_done