@@ -39,21 +39,20 @@ def parse(self, data: bytes):
3939 lines = data .split (self .separator )
4040 fullFileAStr = None
4141 fullFileBStr = None
42+ fullDisplayFileStr = None
4243 fileState = FileState .Normal
4344
4445 def _updateFileState ():
45- nonlocal fullFileAStr , fullFileBStr , fileState
46+ nonlocal fullFileAStr , fullFileBStr , fullDisplayFileStr , fileState
4647 if fileState != FileState .Normal :
47- if fullFileAStr :
48- self ._fileStates [fullFileAStr ] = fileState
49- if fullFileAStr in fileItems :
50- fileItems [fullFileAStr ].state = fileState
51- if fullFileBStr :
52- self ._fileStates [fullFileBStr ] = fileState
53- if fullFileBStr in fileItems :
54- fileItems [fullFileBStr ].state = fileState
48+ fileToUpdate = fullDisplayFileStr or fullFileBStr or fullFileAStr
49+ if fileToUpdate :
50+ self ._fileStates [fileToUpdate ] = fileState
51+ if fileToUpdate in fileItems :
52+ fileItems [fileToUpdate ].state = fileState
5553 fullFileAStr = None
5654 fullFileBStr = None
55+ fullDisplayFileStr = None
5756 fileState = FileState .Normal
5857
5958 for line in lines :
@@ -75,13 +74,6 @@ def _updateFileState():
7574
7675 fullFileA = self .makeFilePath (fileA )
7776 fullFileAStr = fullFileA .decode (diff_encoding )
78- fileItems [fullFileAStr ] = FileInfo (self ._row )
79- # Apply previously tracked state from earlier parse calls
80- if fullFileAStr in self ._fileStates :
81- fileItems [fullFileAStr ].state = self ._fileStates [fullFileAStr ]
82-
83- # Store current file for incremental parsing
84- self ._currentFileA = fullFileAStr
8577
8678 # renames, keep new file name only
8779 if fileB and fileB != fileA :
@@ -91,9 +83,17 @@ def _updateFileState():
9183 fileItems [fullFileBStr ] = FileInfo (self ._row )
9284 if fullFileBStr in self ._fileStates :
9385 fileItems [fullFileBStr ].state = self ._fileStates [fullFileBStr ]
86+ fullDisplayFileStr = fullFileBStr
87+ self ._currentFileA = fullFileAStr
9488 self ._currentFileB = fullFileBStr
9589 else :
9690 lineItems .append ((DiffType .File , fullFileA ))
91+ fileItems [fullFileAStr ] = FileInfo (self ._row )
92+ # Apply previously tracked state from earlier parse calls
93+ if fullFileAStr in self ._fileStates :
94+ fileItems [fullFileAStr ].state = self ._fileStates [fullFileAStr ]
95+ fullDisplayFileStr = fullFileAStr
96+ self ._currentFileA = fullFileAStr
9797 self ._currentFileB = None
9898
9999 self ._row += 1
@@ -146,35 +146,27 @@ def _updateFileState():
146146 fileState = FileState .Renamed
147147 elif fileState == FileState .Modified :
148148 fileState = FileState .RenamedModified
149+ elif line .startswith (b"copy to " ):
150+ fileState = FileState .Added
149151 elif line .startswith (b"index " ):
150152 if fileState == FileState .Renamed :
151153 fileState = FileState .RenamedModified
152154 elif fileState == FileState .Normal :
153155 fileState = FileState .Modified
154156
155- fileAToUpdate = fullFileAStr or self ._currentFileA
156- fileBToUpdate = fullFileBStr or self ._currentFileB
157-
158- if fileAToUpdate :
159- oldState = self ._fileStates .get (fileAToUpdate )
160- self ._fileStates [fileAToUpdate ] = fileState
161- # If file not in fileItems yet (metadata from previous chunk)
162- if fileAToUpdate not in fileItems :
163- if oldState != fileState :
164- self .fileStateChanged .emit (
165- fileAToUpdate , fileState )
166- else :
167- fileItems [fileAToUpdate ].state = fileState
168-
169- if fileBToUpdate :
170- oldState = self ._fileStates .get (fileBToUpdate )
171- self ._fileStates [fileBToUpdate ] = fileState
172- if fileBToUpdate not in fileItems :
173- if oldState != fileState :
174- self .fileStateChanged .emit (
175- fileBToUpdate , fileState )
176- else :
177- fileItems [fileBToUpdate ].state = fileState
157+ if fileState != FileState .Normal :
158+ fileToUpdate = fullDisplayFileStr or fullFileBStr or \
159+ fullFileAStr or self ._currentFileB or self ._currentFileA
160+ if fileToUpdate :
161+ oldState = self ._fileStates .get (fileToUpdate )
162+ self ._fileStates [fileToUpdate ] = fileState
163+ # If file not in fileItems yet (metadata from previous chunk)
164+ if fileToUpdate not in fileItems :
165+ if oldState != fileState :
166+ self .fileStateChanged .emit (
167+ fileToUpdate , fileState )
168+ else :
169+ fileItems [fileToUpdate ].state = fileState
178170
179171 if itemType != DiffType .Diff :
180172 line = line .rstrip (b'\r ' )
0 commit comments