Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4f1110b

Browse files
committed
fix(tree): show that fixing Tree.cache is not possible
The problem is that a per-tree modification API cannot work properly, as the sorting is basedon full paths of all entries within the repository. This feat can only be achieved by the index,which to my knowledge already does it correctly.The only fix is to remove the misleading API entirely, which will happen in the next commit.Related to#369
1 parent0de827a commit4f1110b

File tree

2 files changed

+64
-43
lines changed

2 files changed

+64
-43
lines changed

‎git/objects/tree.py

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,42 @@ def git_cmp(t1, t2):
3535
ifmin_cmp:
3636
returnmin_cmp
3737

38-
returnlen_b-len_a
38+
returnlen_a-len_b
3939

40-
ifPY3:
41-
# taken from https://wiki.python.org/moin/HowTo/Sorting#The_Old_Way_Using_the_cmp_Parameter
42-
classCmpToKey(object):
43-
__slots__='obj'
4440

45-
def__init__(self,obj,*args):
46-
self.obj=obj
41+
defmerge_sort(a,cmp):
42+
iflen(a)<2:
43+
return
4744

48-
def__lt__(self,other):
49-
returngit_cmp(self.obj,other.obj)<0
45+
mid=len(a)//2
46+
lefthalf=a[:mid]
47+
righthalf=a[mid:]
5048

51-
def__gt__(self,other):
52-
returngit_cmp(self.obj,other.obj)>0
49+
merge_sort(lefthalf,cmp)
50+
merge_sort(righthalf,cmp)
5351

54-
def__eq__(self,other):
55-
returngit_cmp(self.obj,other.obj)==0
52+
i=0
53+
j=0
54+
k=0
5655

57-
def__le__(self,other):
58-
returngit_cmp(self.obj,other.obj)<=0
56+
whilei<len(lefthalf)andj<len(righthalf):
57+
ifcmp(lefthalf[i],righthalf[j])<=0:
58+
a[k]=lefthalf[i]
59+
i=i+1
60+
else:
61+
a[k]=righthalf[j]
62+
j=j+1
63+
k=k+1
5964

60-
def__ge__(self,other):
61-
returngit_cmp(self.obj,other.obj)>=0
65+
whilei<len(lefthalf):
66+
a[k]=lefthalf[i]
67+
i=i+1
68+
k=k+1
6269

63-
def__ne__(self,other):
64-
returngit_cmp(self.obj,other.obj)!=0
70+
whilej<len(righthalf):
71+
a[k]=righthalf[j]
72+
j=j+1
73+
k=k+1
6574

6675

6776
classTreeModifier(object):
@@ -90,10 +99,7 @@ def set_done(self):
9099
It may be called several times, but be aware that each call will cause
91100
a sort operation
92101
:return self:"""
93-
ifPY3:
94-
self._cache.sort(key=CmpToKey)
95-
else:
96-
self._cache.sort(cmp=git_cmp)
102+
merge_sort(self._cache,git_cmp)
97103
returnself
98104
#} END interface
99105

‎git/test/test_tree.py

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -77,30 +77,10 @@ def test_serializable(self):
7777
# del again, its fine
7878
del(mod[invalid_name])
7979

80-
# SPECIAL ORDERING !
81-
# Add items which should sort differently from standard alum sort order
82-
mod.add(hexsha,Tree.blob_id<<12,'fild')
83-
mod.add(hexsha,Tree.blob_id<<12,'file')
84-
mod.add(hexsha,Tree.blob_id<<12,'file.second')
85-
mod.add(hexsha,Tree.blob_id<<12,'filf')
86-
87-
defnames_in_mod_cache():
88-
return [t[2]fortinmod._cache]
89-
90-
defchunk_from(a,name,size):
91-
index=a.index(name)
92-
returna[index:index+size]
93-
94-
assertchunk_from(names_in_mod_cache(),'fild',4)== ['fild','file','file.second',
95-
'filf']
96-
9780
# have added one item, we are done
9881
mod.set_done()
9982
mod.set_done()# multiple times are okay
10083

101-
assertchunk_from(names_in_mod_cache(),'fild',4)== ['fild','file.second','file',
102-
'filf']
103-
10484
# serialize, its different now
10585
stream=BytesIO()
10686
testtree._serialize(stream)
@@ -114,6 +94,41 @@ def chunk_from(a, name, size):
11494
assertinvalid_namenotintesttree
11595
# END for each item in tree
11696

97+
deftest_tree_modifier_ordering(self):
98+
hexsha='6c1faef799095f3990e9970bc2cb10aa0221cf9c'
99+
roottree=self.rorepo.tree(hexsha)
100+
blob_mode=Tree.blob_id<<12
101+
tree_mode=Tree.tree_id<<12
102+
103+
files_in_desired_order= [
104+
(blob_mode,'_.htaccess'),
105+
(tree_mode,'fileadmin'),
106+
(blob_mode,'index.php'),
107+
(tree_mode,'typo3'),
108+
(tree_mode,'typo3_src-6.2.12'),
109+
(tree_mode,'typo3_src'),
110+
(blob_mode,'typo3cms'),
111+
(tree_mode,'typo3conf'),
112+
(tree_mode,'uploads'),
113+
]
114+
mod=roottree.cache
115+
for (file_mode,file_name)infiles_in_desired_order:
116+
mod.add(hexsha,file_mode,file_name)
117+
# end for each file
118+
119+
deffile_names_in_order():
120+
return [t[1]fortinfiles_in_desired_order]
121+
122+
defnames_in_mod_cache():
123+
a= [t[2]fortinmod._cache]
124+
here=file_names_in_order()
125+
return [eforeinaifeinhere]
126+
127+
assertnames_in_mod_cache()==file_names_in_order(),'add() keeps order'
128+
129+
mod.set_done()
130+
assertnames_in_mod_cache()==file_names_in_order(),'set_done() performs git-sorting'
131+
117132
deftest_traverse(self):
118133
root=self.rorepo.tree('0.1.6')
119134
num_recursive=0

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp