FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
GitPython/test/test_tree.py at main · gitpython-developers/GitPython · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
gitpython-developers
/
GitPython
Public
Uh oh!
There was an error while loading.
Please reload this page
.
Notifications
You must be signed in to change notification settings
Fork
989
Star
5.2k
Code
Issues
8
Pull requests
2
Discussions
Actions
Security and quality
34
Insights
Additional navigation options
Code
Issues
Pull requests
Discussions
Actions
Security and quality
Insights
Expand file tree
Breadcrumbs
GitPython
/
test
/
test_tree.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
221 lines (181 loc) · 7.82 KB
Breadcrumbs
GitPython
/
test
/
test_tree.py
Copy path
File metadata and controls
221 lines (181 loc) · 7.82 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# Copyright (C) 2008, 2009 Michael Trier (mtrier@gmail.com) and contributors
#
# This module is part of GitPython and is released under the
# 3-Clause BSD License: https://opensource.org/license/bsd-3-clause/
from
io
import
BytesIO
import
os
.
path
as
osp
from
pathlib
import
Path
import
subprocess
import
pytest
from
git
.
objects
import
Blob
,
Tree
from
git
.
repo
import
Repo
from
git
.
util
import
cwd
from
test
.
lib
import
TestBase
,
with_rw_directory
from
.
lib
.
helper
import
PathLikeMock
,
with_rw_repo
class
TestTree
(
TestBase
):
def
test_serializable
(
self
):
# Tree at the given commit contains a submodule as well.
roottree
=
self
.
rorepo
.
tree
(
"6c1faef799095f3990e9970bc2cb10aa0221cf9c"
)
for
item
in
roottree
.
traverse
(
ignore_self
=
False
):
if
item
.
type
!=
Tree
.
type
:
continue
# END skip non-trees
tree
=
item
# Trees have no dict.
self
.
assertRaises
(
AttributeError
,
setattr
,
tree
,
"someattr"
,
1
)
orig_data
=
tree
.
data_stream
.
read
()
orig_cache
=
tree
.
_cache
stream
=
BytesIO
()
tree
.
_serialize
(
stream
)
assert
stream
.
getvalue
()
==
orig_data
stream
.
seek
(
0
)
testtree
=
Tree
(
self
.
rorepo
,
Tree
.
NULL_BIN_SHA
,
0
,
""
)
testtree
.
_deserialize
(
stream
)
assert
testtree
.
_cache
==
orig_cache
# Replaces cache, but we make sure of it.
del
testtree
.
_cache
testtree
.
_deserialize
(
stream
)
# END for each item in tree
@
with_rw_directory
def
_get_git_ordered_files
(
self
,
rw_dir
):
"""Get files as git orders them, to compare in test_tree_modifier_ordering."""
# Create directory contents.
Path
(
rw_dir
,
"file"
).
mkdir
()
for
filename
in
(
"bin"
,
"bin.d"
,
"file.to"
,
"file.toml"
,
"file.toml.bin"
,
"file0"
,
):
Path
(
rw_dir
,
filename
).
touch
()
Path
(
rw_dir
,
"file"
,
"a"
).
touch
()
with
cwd
(
rw_dir
):
# Prepare the repository.
subprocess
.
run
([
"git"
,
"init"
,
"-q"
],
check
=
True
)
subprocess
.
run
([
"git"
,
"add"
,
"."
],
check
=
True
)
subprocess
.
run
([
"git"
,
"commit"
,
"-m"
,
"c1"
],
check
=
True
)
# Get git output from which an ordered file list can be parsed.
rev_parse_command
=
[
"git"
,
"rev-parse"
,
"HEAD^{tree}"
]
tree_hash
=
subprocess
.
check_output
(
rev_parse_command
).
decode
().
strip
()
cat_file_command
=
[
"git"
,
"cat-file"
,
"-p"
,
tree_hash
]
cat_file_output
=
subprocess
.
check_output
(
cat_file_command
).
decode
()
return
[
line
.
split
()[
-
1
]
for
line
in
cat_file_output
.
split
(
"
\n
"
)
if
line
]
def
test_tree_modifier_ordering
(
self
):
"""TreeModifier.set_done() sorts files in the same order git does."""
git_file_names_in_order
=
self
.
_get_git_ordered_files
()
hexsha
=
"6c1faef799095f3990e9970bc2cb10aa0221cf9c"
roottree
=
self
.
rorepo
.
tree
(
hexsha
)
blob_mode
=
Tree
.
blob_id
<<
12
tree_mode
=
Tree
.
tree_id
<<
12
files_in_desired_order
=
[
(
blob_mode
,
"bin"
),
(
blob_mode
,
"bin.d"
),
(
blob_mode
,
"file.to"
),
(
blob_mode
,
"file.toml"
),
(
blob_mode
,
"file.toml.bin"
),
(
blob_mode
,
"file0"
),
(
tree_mode
,
"file"
),
]
mod
=
roottree
.
cache
for
file_mode
,
file_name
in
files_in_desired_order
:
mod
.
add
(
hexsha
,
file_mode
,
file_name
)
# end for each file
def
file_names_in_order
():
return
[
t
[
1
]
for
t
in
files_in_desired_order
]
def
names_in_mod_cache
():
a
=
[
t
[
2
]
for
t
in
mod
.
_cache
]
here
=
file_names_in_order
()
return
[
e
for
e
in
a
if
e
in
here
]
mod
.
set_done
()
assert
names_in_mod_cache
()
==
git_file_names_in_order
,
"set_done() performs git-sorting"
def
test_traverse
(
self
):
root
=
self
.
rorepo
.
tree
(
"0.1.6"
)
num_recursive
=
0
all_items
=
[]
for
obj
in
root
.
traverse
():
if
"/"
in
obj
.
path
:
num_recursive
+=
1
assert
isinstance
(
obj
, (
Blob
,
Tree
))
all_items
.
append
(
obj
)
# END for each object
assert
all_items
==
root
.
list_traverse
()
# Limit recursion level to 0 - should be same as default iteration.
assert
all_items
assert
"CHANGES"
in
root
assert
len
(
list
(
root
))
==
len
(
list
(
root
.
traverse
(
depth
=
1
)))
# Only choose trees.
def
trees_only
(
i
,
_d
):
return
i
.
type
==
"tree"
trees
=
list
(
root
.
traverse
(
predicate
=
trees_only
))
assert
len
(
trees
)
==
len
([
i
for
i
in
root
.
traverse
()
if
trees_only
(
i
,
0
)])
# Test prune.
def
lib_folder
(
t
,
_d
):
return
t
.
path
==
"lib"
pruned_trees
=
list
(
root
.
traverse
(
predicate
=
trees_only
,
prune
=
lib_folder
))
assert
len
(
pruned_trees
)
<
len
(
trees
)
# Trees and blobs.
assert
len
(
set
(
trees
)
|
set
(
root
.
trees
))
==
len
(
trees
)
assert
len
({
b
for
b
in
root
if
isinstance
(
b
,
Blob
)}
|
set
(
root
.
blobs
))
==
len
(
root
.
blobs
)
subitem
=
trees
[
0
][
0
]
assert
"/"
in
subitem
.
path
assert
subitem
.
name
==
osp
.
basename
(
subitem
.
path
)
# Check that at some point the traversed paths have a slash in them.
found_slash
=
False
for
item
in
root
.
traverse
():
assert
osp
.
isabs
(
item
.
abspath
)
if
"/"
in
item
.
path
:
found_slash
=
True
# END check for slash
# Slashes in paths are supported as well.
# NOTE: On Python 3, / doesn't work with strings anymore...
assert
root
[
item
.
path
]
==
item
==
root
/
item
.
path
# END for each item
assert
found_slash
@
with_rw_repo
(
"0.3.2.1"
)
def
test_repo_lookup_string_path
(
self
,
rw_repo
):
repo
=
Repo
(
rw_repo
.
git_dir
)
blob
=
repo
.
tree
()
/
".gitignore"
assert
isinstance
(
blob
,
Blob
)
assert
blob
.
hexsha
==
"787b3d442a113b78e343deb585ab5531eb7187fa"
@
with_rw_repo
(
"0.3.2.1"
)
def
test_repo_lookup_pathlike_path
(
self
,
rw_repo
):
repo
=
Repo
(
rw_repo
.
git_dir
)
blob
=
repo
.
tree
()
/
PathLikeMock
(
".gitignore"
)
assert
isinstance
(
blob
,
Blob
)
assert
blob
.
hexsha
==
"787b3d442a113b78e343deb585ab5531eb7187fa"
@
with_rw_repo
(
"0.3.2.1"
)
def
test_repo_lookup_invalid_string_path
(
self
,
rw_repo
):
repo
=
Repo
(
rw_repo
.
git_dir
)
with
pytest
.
raises
(
KeyError
):
repo
.
tree
()
/
"doesnotexist"
@
with_rw_repo
(
"0.3.2.1"
)
def
test_repo_lookup_invalid_pathlike_path
(
self
,
rw_repo
):
repo
=
Repo
(
rw_repo
.
git_dir
)
with
pytest
.
raises
(
KeyError
):
repo
.
tree
()
/
PathLikeMock
(
"doesnotexist"
)
@
with_rw_repo
(
"0.3.2.1"
)
def
test_repo_lookup_nested_string_path
(
self
,
rw_repo
):
repo
=
Repo
(
rw_repo
.
git_dir
)
blob
=
repo
.
tree
()
/
"git/__init__.py"
assert
isinstance
(
blob
,
Blob
)
assert
blob
.
hexsha
==
"d87dcbdbb65d2782e14eea27e7f833a209c052f3"
@
with_rw_repo
(
"0.3.2.1"
)
def
test_repo_lookup_nested_pathlike_path
(
self
,
rw_repo
):
repo
=
Repo
(
rw_repo
.
git_dir
)
blob
=
repo
.
tree
()
/
PathLikeMock
(
"git/__init__.py"
)
assert
isinstance
(
blob
,
Blob
)
assert
blob
.
hexsha
==
"d87dcbdbb65d2782e14eea27e7f833a209c052f3"
@
with_rw_repo
(
"0.3.2.1"
)
def
test_repo_lookup_folder_string_path
(
self
,
rw_repo
):
repo
=
Repo
(
rw_repo
.
git_dir
)
tree
=
repo
.
tree
()
/
"git"
assert
isinstance
(
tree
,
Tree
)
assert
tree
.
hexsha
==
"ec8ae429156d65afde4bbb3455570193b56f0977"
@
with_rw_repo
(
"0.3.2.1"
)
def
test_repo_lookup_folder_pathlike_path
(
self
,
rw_repo
):
repo
=
Repo
(
rw_repo
.
git_dir
)
tree
=
repo
.
tree
()
/
PathLikeMock
(
"git"
)
assert
isinstance
(
tree
,
Tree
)
assert
tree
.
hexsha
==
"ec8ae429156d65afde4bbb3455570193b56f0977"
Back
|
FazBrowse Home
|
New Git URL