3535 Blob ,
3636 Tree ,
3737 Object ,
38- Commit
38+ Commit ,
3939 )
4040
41+ from git .objects .utils import Serializable
42+
4143from git .utils import (
4244 IndexFileSHA1Writer ,
4345 LazyMixin ,
4850
4951__all__ = ( 'IndexFile' , 'CheckoutError' )
5052
51- class IndexFile (LazyMixin , diff .Diffable ):
53+
54+ class IndexFile (LazyMixin , diff .Diffable , Serializable ):
5255 """Implements an Index that can be manipulated using a native implementation in
5356 order to save git command function calls wherever possible.
5457
@@ -103,7 +106,7 @@ def _set_cache_(self, attr):
103106 # END memory mapping
104107
105108 try :
106- self ._read_from_stream (stream )
109+ self ._deserialize (stream )
107110 finally :
108111 pass
109112 # make sure we close the stream ( possibly an mmap )
@@ -158,7 +161,9 @@ def _read_header(cls, stream):
158161 assert version in (1 , 2 )
159162 return version , num_entries
160163
161- def _read_from_stream (self , stream ):
164+ #{ Serializable Interface
165+
166+ def _deserialize (self , stream ):
162167 """ Initialize this instance with index values read from the given stream """
163168 self .version , num_entries = self ._read_header (stream )
164169 count = 0
@@ -182,7 +187,43 @@ def _read_from_stream(self, stream):
182187
183188 # truncate the sha in the end as we will dynamically create it anyway
184189 self ._extension_data = self ._extension_data [:- 20 ]
190+
191+ return self
192+
193+ def _serialize (self , stream , ignore_tree_extension_data = False ):
194+
195+ # wrap the stream into a compatible writer
196+ stream = IndexFileSHA1Writer (stream )
197+
198+ # header
199+ stream .write ("DIRC" )
200+ stream .write (pack (">LL" , self .version , len (self .entries )))
185201
202+ # body
203+ entries_sorted = self .entries .values ()
204+ entries_sorted .sort (key = lambda e : (e [3 ], e [2 ])) # use path/stage as sort key
205+ for entry in entries_sorted :
206+ self ._write_cache_entry (stream , entry )
207+ # END for each entry
208+
209+ stored_ext_data = None
210+ if ignore_tree_extension_data and self ._extension_data and self ._extension_data [:4 ] == 'TREE' :
211+ stored_ext_data = self ._extension_data
212+ self ._extension_data = ''
213+ # END extension data special handling
214+
215+ # write previously cached extensions data
216+ stream .write (self ._extension_data )
217+
218+ if stored_ext_data :
219+ self ._extension_data = stored_ext_data
220+ # END reset previous ext data
221+
222+ # write the sha over the content
223+ stream .write_sha ()
224+ return self
225+
226+ #} END serializable interface
186227
187228 @classmethod
188229 def _write_cache_entry (cls , stream , entry ):
@@ -229,34 +270,8 @@ def write(self, file_path = None, ignore_tree_extension_data=False):
229270 write_op = ConcurrentWriteOperation (file_path or self ._file_path )
230271 stream = write_op ._begin_writing ()
231272
232- stream = IndexFileSHA1Writer (stream )
233-
234- # header
235- stream .write ("DIRC" )
236- stream .write (pack (">LL" , self .version , len (self .entries )))
237-
238- # body
239- entries_sorted = self .entries .values ()
240- entries_sorted .sort (key = lambda e : (e [3 ], e [2 ])) # use path/stage as sort key
241- for entry in entries_sorted :
242- self ._write_cache_entry (stream , entry )
243- # END for each entry
244-
245- stored_ext_data = None
246- if ignore_tree_extension_data and self ._extension_data and self ._extension_data [:4 ] == 'TREE' :
247- stored_ext_data = self ._extension_data
248- self ._extension_data = ''
249- # END extension data special handling
250-
251- # write previously cached extensions data
252- stream .write (self ._extension_data )
253-
254- if stored_ext_data :
255- self ._extension_data = stored_ext_data
256- # END reset previous ext data
257-
258- # write the sha over the content
259- stream .write_sha ()
273+ self ._serialize (stream , ignore_tree_extension_data )
274+
260275 write_op ._end_writing ()
261276
262277 # make sure we represent what we have written
0 commit comments