@@ -53,22 +53,6 @@ def stat_mode_to_index_mode(mode):
5353 return S_IFREG | 0644 | (mode & 0100 ) # blobs with or without executable bit
5454
5555
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-
7256def write_cache (entries , stream , extension_data = None , ShaStreamCls = IndexFileSHA1Writer ):
7357 """Write the cache represented by entries to a stream
7458
@@ -83,15 +67,29 @@ def write_cache(entries, stream, extension_data=None, ShaStreamCls=IndexFileSHA1
8367 a 4 byte identifier, followed by its size ( 4 bytes )"""
8468 # wrap the stream into a compatible writer
8569 stream = ShaStreamCls (stream )
70+
71+ tell = stream .tell
72+ write = stream .write
8673
8774 # header
8875 version = 2
89- stream . write ("DIRC" )
90- stream . write (pack (">LL" , version , len (entries )))
76+ write ("DIRC" )
77+ write (pack (">LL" , version , len (entries )))
9178
9279 # body
9380 for entry in entries :
94- write_cache_entry (entry , stream )
81+ beginoffset = tell ()
82+ write (entry [4 ]) # ctime
83+ write (entry [5 ]) # mtime
84+ path = entry [3 ]
85+ plen = len (path ) & CE_NAMEMASK # path length
86+ assert plen == len (path ), "Path %s too long to fit into index" % entry [3 ]
87+ flags = plen | entry [2 ]
88+ write (pack (">LLLLLL20sH" , entry [6 ], entry [7 ], entry [0 ],
89+ entry [8 ], entry [9 ], entry [10 ], entry [1 ], flags ))
90+ write (path )
91+ real_size = ((tell () - beginoffset + 8 ) & ~ 7 )
92+ write ("\0 " * ((beginoffset + real_size ) - tell ()))
9593 # END for each entry
9694
9795 # write previously cached extensions data
@@ -101,21 +99,6 @@ def write_cache(entries, stream, extension_data=None, ShaStreamCls=IndexFileSHA1
10199 # write the sha over the content
102100 stream .write_sha ()
103101
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-
119102def read_header (stream ):
120103 """Return tuple(version_long, num_entries) from the given stream"""
121104 type_id = stream .read (4 )
@@ -147,10 +130,23 @@ def read_cache(stream):
147130 version , num_entries = read_header (stream )
148131 count = 0
149132 entries = dict ()
133+
134+ read = stream .read
135+ tell = stream .tell
150136 while count < num_entries :
151- entry = read_entry (stream )
137+ beginoffset = tell ()
138+ ctime = unpack (">8s" , read (8 ))[0 ]
139+ mtime = unpack (">8s" , read (8 ))[0 ]
140+ (dev , ino , mode , uid , gid , size , sha , flags ) = \
141+ unpack (">LLLLLL20sH" , read (20 + 4 * 6 + 2 ))
142+ path_size = flags & CE_NAMEMASK
143+ path = read (path_size )
144+
145+ real_size = ((tell () - beginoffset + 8 ) & ~ 7 )
146+ data = read ((beginoffset + real_size ) - tell ())
147+ entry = IndexEntry ((mode , sha , flags , path , ctime , mtime , dev , ino , uid , gid , size ))
152148 # entry_key would be the method to use, but we safe the effort
153- entries [(entry . path , entry .stage )] = entry
149+ entries [(path , entry .stage )] = entry
154150 count += 1
155151 # END for each entry
156152
0 commit comments