private DiffFileHeader ReadDiffFileHeader2(bool combinedDiff) { var fileHeader = new DiffFileHeader(FileStatus.Modified); bool[] headerPresent = new bool[DiffHeaders.Length]; if (combinedDiff) { headerPresent[(int)Header.OldMode] = true; headerPresent[(int)Header.NewMode] = true; headerPresent[(int)Header.CopyFrom] = true; headerPresent[(int)Header.CopyTo] = true; headerPresent[(int)Header.RenameFrom] = true; headerPresent[(int)Header.RenameTo] = true; headerPresent[(int)Header.SimilarityIndex] = true; headerPresent[(int)Header.DissimilarityIndex] = true; } else { headerPresent[(int)Header.Mode] = true; } bool completed = false; while (!completed) { var header = Header.Unknown; bool dataPresent = false; for (int i = 0; i < DiffHeaders.Length; ++i) { if (!headerPresent[i]) { if (CheckValue(DiffHeaders[i])) { Skip(DiffHeaders[i].Length); if (CheckValue(' ')) { dataPresent = true; } Skip(); headerPresent[i] = true; header = (Header)i; break; } } } switch (header) { case Header.Index: if (dataPresent) { if (combinedDiff) { // index <hash>,<hash>..<hash> SkipLine(); } else { int pos = FindNoAdvance(".."); fileHeader.OldIndex = ReadStringUpTo(pos, 2); pos = FindNewLineOrEndOfString(); int space = FindSpace(pos - Position); if (space == -1) { // index <hash>..<hash> fileHeader.NewIndex = ReadStringUpTo(pos, 1); } else { // index <hash>..<hash> <mode> fileHeader.NewIndex = ReadStringUpTo(space, 1); fileHeader.NewMode = int.Parse(ReadStringUpTo(pos, 1), NumberStyles.None, CultureInfo.InvariantCulture); } } } break; case Header.OldMode: // old mode <mode> if (dataPresent) { fileHeader.OldMode = int.Parse(ReadLine(), NumberStyles.None, CultureInfo.InvariantCulture); } break; case Header.NewMode: // new mode <mode> if (dataPresent) { fileHeader.NewMode = int.Parse(ReadLine(), NumberStyles.None, CultureInfo.InvariantCulture); } break; case Header.Mode: // mode <mode>,<mode>..<mode> if (dataPresent) { SkipLine(); } break; case Header.NewFileMode: // new file mode <mode> fileHeader.Status = FileStatus.Added; if (dataPresent) { fileHeader.NewMode = int.Parse(ReadLine(), NumberStyles.None, CultureInfo.InvariantCulture); } break; case Header.DeletedFileMode: fileHeader.Status = FileStatus.Removed; if (dataPresent) { if (combinedDiff) { // deleted file mode <mode>,<mode> SkipLine(); } else { // deleted file mode <mode> fileHeader.OldMode = int.Parse(ReadLine(), NumberStyles.None, CultureInfo.InvariantCulture); } } break; case Header.CopyFrom: fileHeader.Status = FileStatus.Copied; if (dataPresent) { // copy from <path> fileHeader.CopyFrom = DecodeEscapedString(FindNewLineOrEndOfString(), 1); } break; case Header.CopyTo: fileHeader.Status = FileStatus.Copied; if (dataPresent) { // copy to <path> fileHeader.CopyTo = DecodeEscapedString(FindNewLineOrEndOfString(), 1); } break; case Header.RenameFrom: fileHeader.Status = FileStatus.Renamed; if (dataPresent) { // rename from <path> fileHeader.RenameFrom = DecodeEscapedString(FindNewLineOrEndOfString(), 1); } break; case Header.RenameTo: fileHeader.Status = FileStatus.Renamed; if (dataPresent) { // rename to <path> fileHeader.RenameTo = DecodeEscapedString(FindNewLineOrEndOfString(), 1); } break; case Header.SimilarityIndex: { int index; string strIndex = ReadStringUpTo(FindNewLineOrEndOfString() - 1); Skip(2); if (int.TryParse(strIndex, NumberStyles.Integer, CultureInfo.InvariantCulture, out index)) { fileHeader.SimilarityIndex = index; } } break; case Header.DissimilarityIndex: { int index; string strIndex = ReadStringUpTo(FindNewLineOrEndOfString() - 1); Skip(2); if (int.TryParse(strIndex, NumberStyles.Integer, CultureInfo.InvariantCulture, out index)) { fileHeader.DissimilarityIndex = index; } } break; case Header.Unknown: if (IsAtEndOfString || CheckValue("---") || CheckValue(HunkHeader) || CheckValue(FileHeader) || CheckValue(BinaryFilesHeader) || CheckValue(BinaryPatchHeader)) { completed = true; } else { SkipLine(); } break; default: if (dataPresent) { SkipLine(); } break; } } return(fileHeader); }
private DiffFileHeader ReadDiffFileHeader2(bool combinedDiff) { var fileHeader = new DiffFileHeader(FileStatus.Modified); bool[] headerPresent = new bool[DiffHeaders.Length]; if(combinedDiff) { headerPresent[(int)Header.OldMode] = true; headerPresent[(int)Header.NewMode] = true; headerPresent[(int)Header.CopyFrom] = true; headerPresent[(int)Header.CopyTo] = true; headerPresent[(int)Header.RenameFrom] = true; headerPresent[(int)Header.RenameTo] = true; headerPresent[(int)Header.SimilarityIndex] = true; headerPresent[(int)Header.DissimilarityIndex] = true; } else { headerPresent[(int)Header.Mode] = true; } bool completed = false; while(!completed) { var header = Header.Unknown; bool dataPresent = false; for(int i = 0; i < DiffHeaders.Length; ++i) { if(!headerPresent[i]) { if(CheckValue(DiffHeaders[i])) { Skip(DiffHeaders[i].Length); if(CheckValue(' ')) { dataPresent = true; } Skip(); headerPresent[i] = true; header = (Header)i; break; } } } switch(header) { case Header.Index: if(dataPresent) { if(combinedDiff) { // index <hash>,<hash>..<hash> SkipLine(); } else { int pos = FindNoAdvance(".."); fileHeader.OldIndex = ReadStringUpTo(pos, 2); pos = FindNewLineOrEndOfString(); int space = FindSpace(pos - Position); if(space == -1) { // index <hash>..<hash> fileHeader.NewIndex = ReadStringUpTo(pos, 1); } else { // index <hash>..<hash> <mode> fileHeader.NewIndex = ReadStringUpTo(space, 1); fileHeader.NewMode = int.Parse(ReadStringUpTo(pos, 1), NumberStyles.None, CultureInfo.InvariantCulture); } } } break; case Header.OldMode: // old mode <mode> if(dataPresent) { fileHeader.OldMode = int.Parse(ReadLine(), NumberStyles.None, CultureInfo.InvariantCulture); } break; case Header.NewMode: // new mode <mode> if(dataPresent) { fileHeader.NewMode = int.Parse(ReadLine(), NumberStyles.None, CultureInfo.InvariantCulture); } break; case Header.Mode: // mode <mode>,<mode>..<mode> if(dataPresent) { SkipLine(); } break; case Header.NewFileMode: // new file mode <mode> fileHeader.Status = FileStatus.Added; if(dataPresent) { fileHeader.NewMode = int.Parse(ReadLine(), NumberStyles.None, CultureInfo.InvariantCulture); } break; case Header.DeletedFileMode: fileHeader.Status = FileStatus.Removed; if(dataPresent) { if(combinedDiff) { // deleted file mode <mode>,<mode> SkipLine(); } else { // deleted file mode <mode> fileHeader.OldMode = int.Parse(ReadLine(), NumberStyles.None, CultureInfo.InvariantCulture); } } break; case Header.CopyFrom: fileHeader.Status = FileStatus.Copied; if(dataPresent) { // copy from <path> fileHeader.CopyFrom = DecodeEscapedString(FindNewLineOrEndOfString(), 1); } break; case Header.CopyTo: fileHeader.Status = FileStatus.Copied; if(dataPresent) { // copy to <path> fileHeader.CopyTo = DecodeEscapedString(FindNewLineOrEndOfString(), 1); } break; case Header.RenameFrom: fileHeader.Status = FileStatus.Renamed; if(dataPresent) { // rename from <path> fileHeader.RenameFrom = DecodeEscapedString(FindNewLineOrEndOfString(), 1); } break; case Header.RenameTo: fileHeader.Status = FileStatus.Renamed; if(dataPresent) { // rename to <path> fileHeader.RenameTo = DecodeEscapedString(FindNewLineOrEndOfString(), 1); } break; case Header.SimilarityIndex: { int index; string strIndex = ReadStringUpTo(FindNewLineOrEndOfString() - 1); Skip(2); if(int.TryParse(strIndex, NumberStyles.Integer, CultureInfo.InvariantCulture, out index)) { fileHeader.SimilarityIndex = index; } } break; case Header.DissimilarityIndex: { int index; string strIndex = ReadStringUpTo(FindNewLineOrEndOfString() - 1); Skip(2); if(int.TryParse(strIndex, NumberStyles.Integer, CultureInfo.InvariantCulture, out index)) { fileHeader.DissimilarityIndex = index; } } break; case Header.Unknown: if(IsAtEndOfString || CheckValue("---") || CheckValue(HunkHeader) || CheckValue(FileHeader) || CheckValue(BinaryFilesHeader) || CheckValue(BinaryPatchHeader)) { completed = true; } else { SkipLine(); } break; default: if(dataPresent) { SkipLine(); } break; } } return fileHeader; }