Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
        }