3030 CE_NAMEMASK ,
3131 CE_STAGESHIFT
3232 )
33+ CE_NAMEMASK_INV = ~ CE_NAMEMASK
3334
3435from util import (
3536 pack ,
@@ -53,22 +54,6 @@ def stat_mode_to_index_mode(mode):
5354 return S_IFREG | 0644 | (mode & 0100 ) # blobs with or without executable bit
5455
5556
56- def write_cache_entry (entry , stream ):
57- """Write the given entry to the stream"""
58- beginoffset = stream .tell ()
59- write = stream .write
60- write (entry [4 ]) # ctime
61- write (entry [5 ]) # mtime
62- path = entry [3 ]
63- plen = len (path ) & CE_NAMEMASK # path length
64- assert plen == len (path ), "Path %s too long to fit into index" % entry [3 ]
65- flags = plen | entry [2 ]
66- write (pack (">LLLLLL20sH" , entry [6 ], entry [7 ], entry [0 ],
67- entry [8 ], entry [9 ], entry [10 ], entry [1 ], flags ))
68- write (path )
69- real_size = ((stream .tell () - beginoffset + 8 ) & ~ 7 )
70- write ("\0 " * ((beginoffset + real_size ) - stream .tell ()))
71-
7257def write_cache (entries , stream , extension_data = None , ShaStreamCls = IndexFileSHA1Writer ):
7358 """Write the cache represented by entries to a stream
7459
@@ -83,15 +68,29 @@ def write_cache(entries, stream, extension_data=None, ShaStreamCls=IndexFileSHA1
8368 a 4 byte identifier, followed by its size ( 4 bytes )"""
8469 # wrap the stream into a compatible writer
8570 stream = ShaStreamCls (stream )
71+
72+ tell = stream .tell
73+ write = stream .write
8674
8775 # header
8876 version = 2
89- stream . write ("DIRC" )
90- stream . write (pack (">LL" , version , len (entries )))
77+ write ("DIRC" )
78+ write (pack (">LL" , version , len (entries )))
9179
9280 # body
9381 for entry in entries :
94- write_cache_entry (entry , stream )
82+ beginoffset = tell ()
83+ write (entry [4 ]) # ctime
84+ write (entry [5 ]) # mtime
85+ path = entry [3 ]
86+ plen = len (path ) & CE_NAMEMASK # path length
87+ assert plen == len (path ), "Path %s too long to fit into index" % entry [3 ]
88+ flags = plen | (entry [2 ] & CE_NAMEMASK_INV ) # clear possible previous values
89+ write (pack (">LLLLLL20sH" , entry [6 ], entry [7 ], entry [0 ],
90+ entry [8 ], entry [9 ], entry [10 ], entry [1 ], flags ))
91+ write (path )
92+ real_size = ((tell () - beginoffset + 8 ) & ~ 7 )
93+ write ("\0 " * ((beginoffset + real_size ) - tell ()))
9594 # END for each entry
9695
9796 # write previously cached extensions data
@@ -101,21 +100,6 @@ def write_cache(entries, stream, extension_data=None, ShaStreamCls=IndexFileSHA1
101100 # write the sha over the content
102101 stream .write_sha ()
103102
104- def read_entry (stream ):
105- """Return: One entry of the given stream"""
106- beginoffset = stream .tell ()
107- read = stream .read
108- ctime = unpack (">8s" , read (8 ))[0 ]
109- mtime = unpack (">8s" , read (8 ))[0 ]
110- (dev , ino , mode , uid , gid , size , sha , flags ) = \
111- unpack (">LLLLLL20sH" , read (20 + 4 * 6 + 2 ))
112- path_size = flags & CE_NAMEMASK
113- path = read (path_size )
114-
115- real_size = ((stream .tell () - beginoffset + 8 ) & ~ 7 )
116- data = read ((beginoffset + real_size ) - stream .tell ())
117- return IndexEntry ((mode , sha , flags , path , ctime , mtime , dev , ino , uid , gid , size ))
118-
119103def read_header (stream ):
120104 """Return tuple(version_long, num_entries) from the given stream"""
121105 type_id = stream .read (4 )
@@ -147,10 +131,23 @@ def read_cache(stream):
147131 version , num_entries = read_header (stream )
148132 count = 0
149133 entries = dict ()
134+
135+ read = stream .read
136+ tell = stream .tell
150137 while count < num_entries :
151- entry = read_entry (stream )
138+ beginoffset = tell ()
139+ ctime = unpack (">8s" , read (8 ))[0 ]
140+ mtime = unpack (">8s" , read (8 ))[0 ]
141+ (dev , ino , mode , uid , gid , size , sha , flags ) = \
142+ unpack (">LLLLLL20sH" , read (20 + 4 * 6 + 2 ))
143+ path_size = flags & CE_NAMEMASK
144+ path = read (path_size )
145+
146+ real_size = ((tell () - beginoffset + 8 ) & ~ 7 )
147+ data = read ((beginoffset + real_size ) - tell ())
148+ entry = IndexEntry ((mode , sha , flags , path , ctime , mtime , dev , ino , uid , gid , size ))
152149 # entry_key would be the method to use, but we safe the effort
153- entries [(entry . path , entry .stage )] = entry
150+ entries [(path , entry .stage )] = entry
154151 count += 1
155152 # END for each entry
156153
0 commit comments