forked fromgitpython-developers/GitPython
- Notifications
You must be signed in to change notification settings - Fork0
Expand file tree
/
Copy pathtest_diff.py
More file actions
155 lines (130 loc) · 6.08 KB
/
test_diff.py
File metadata and controls
155 lines (130 loc) · 6.08 KB
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
#-*-coding:utf-8-*-
# test_diff.py
# Copyright (C) 2008, 2009 Michael Trier (mtrier@gmail.com) and contributors
#
# This module is part of GitPython and is released under
# the BSD License: http://www.opensource.org/licenses/bsd-license.php
fromgit.test.libimport (
TestBase,
StringProcessAdapter,
fixture,
assert_equal,
assert_true,
)
fromgitimport (
Diff,
DiffIndex
)
classTestDiff(TestBase):
def_assert_diff_format(self,diffs):
# verify that the format of the diff is sane
fordiffindiffs:
ifdiff.a_mode:
assertisinstance(diff.a_mode,int)
ifdiff.b_mode:
assertisinstance(diff.b_mode,int)
ifdiff.a_blob:
assertnotdiff.a_blob.path.endswith('\n')
ifdiff.b_blob:
assertnotdiff.b_blob.path.endswith('\n')
# END for each diff
returndiffs
deftest_list_from_string_new_mode(self):
output=StringProcessAdapter(fixture('diff_new_mode'))
diffs=Diff._index_from_patch_format(self.rorepo,output.stdout)
self._assert_diff_format(diffs)
assert_equal(1,len(diffs))
assert_equal(10,len(diffs[0].diff.splitlines()))
deftest_diff_with_rename(self):
output=StringProcessAdapter(fixture('diff_rename'))
diffs=Diff._index_from_patch_format(self.rorepo,output.stdout)
self._assert_diff_format(diffs)
assert_equal(1,len(diffs))
diff=diffs[0]
assert_true(diff.renamed)
assert_equal(diff.rename_from,u'Jérôme')
assert_equal(diff.rename_to,u'müller')
assertisinstance(str(diff),str)
output=StringProcessAdapter(fixture('diff_rename_raw'))
diffs=Diff._index_from_raw_format(self.rorepo,output.stdout)
assertlen(diffs)==1
diff=diffs[0]
assertdiff.renamed
assertdiff.rename_from=='this'
assertdiff.rename_to=='that'
assertlen(list(diffs.iter_change_type('R')))==1
deftest_binary_diff(self):
formethod,file_namein ((Diff._index_from_patch_format,'diff_patch_binary'),
(Diff._index_from_raw_format,'diff_raw_binary')):
res=method(None,StringProcessAdapter(fixture(file_name)).stdout)
assertlen(res)==1
assertlen(list(res.iter_change_type('M')))==1
ifres[0].diff:
assertres[0].diff==b"Binary files a/rps and b/rps differ\n","in patch mode, we get a diff text"
assertstr(res[0]),"This call should just work"
# end for each method to test
deftest_diff_index(self):
output=StringProcessAdapter(fixture('diff_index_patch'))
res=Diff._index_from_patch_format(None,output.stdout)
assertlen(res)==6
fordrinres:
assertdr.diff
assertstr(dr),"Diff to string conversion should be possible"
# end for each diff
dr=res[3]
assertdr.diff.endswith(b"+Binary files a/rps and b/rps differ\n")
deftest_diff_patch_format(self):
# test all of the 'old' format diffs for completness - it should at least
# be able to deal with it
fixtures= ("diff_2","diff_2f","diff_f","diff_i","diff_mode_only",
"diff_new_mode","diff_numstat","diff_p","diff_rename",
"diff_tree_numstat_root")
forfixture_nameinfixtures:
diff_proc=StringProcessAdapter(fixture(fixture_name))
Diff._index_from_patch_format(self.rorepo,diff_proc.stdout)
# END for each fixture
deftest_diff_interface(self):
# test a few variations of the main diff routine
assertion_map=dict()
fori,commitinenumerate(self.rorepo.iter_commits('0.1.6',max_count=2)):
diff_item=commit
ifi%2==0:
diff_item=commit.tree
# END use tree every second item
forotherin (None,commit.Index,commit.parents[0]):
forpathsin (None,"CHANGES", ("CHANGES","lib")):
forcreate_patchinrange(2):
diff_index=diff_item.diff(other=other,paths=paths,create_patch=create_patch)
assertisinstance(diff_index,DiffIndex)
ifdiff_index:
self._assert_diff_format(diff_index)
forctinDiffIndex.change_type:
key='ct_%s'%ct
assertion_map.setdefault(key,0)
assertion_map[key]=assertion_map[key]+len(list(diff_index.iter_change_type(ct)))
# END for each changetype
# check entries
diff_set=set()
diff_set.add(diff_index[0])
diff_set.add(diff_index[0])
assertlen(diff_set)==1
assertdiff_index[0]==diff_index[0]
assertnot (diff_index[0]!=diff_index[0])
fordrindiff_index:
assertstr(dr),"Diff to string conversion should be possible"
# END diff index checking
# END for each patch option
# END for each path option
# END for each other side
# END for each commit
# assert we could always find at least one instance of the members we
# can iterate in the diff index - if not this indicates its not working correctly
# or our test does not span the whole range of possibilities
forkey,valueinassertion_map.items():
assertvalue,"Did not find diff for %s"%key
# END for each iteration type
# test path not existing in the index - should be ignored
c=self.rorepo.head.commit
cp=c.parents[0]
diff_index=c.diff(cp, ["does/not/exist"])
assertlen(diff_index)==0