Beispiel #1
0
        internal virtual int ParseBody(NGit.Patch.Patch script, int end)
        {
            byte[] buf = file.buf;
            int c = RawParseUtils.NextLF(buf, startOffset);
            int last = c;
            old.nDeleted = 0;
            old.nAdded = 0;
            for (; c < end; last = c, c = RawParseUtils.NextLF(buf, c))
            {
                switch (buf[c])
                {
                    case (byte)(' '):
                    case (byte)('\n'):
                    {
                        nContext++;
                        continue;
                        goto case (byte)('-');
                    }

                    case (byte)('-'):
                    {
                        old.nDeleted++;
                        continue;
                        goto case (byte)('+');
                    }

                    case (byte)('+'):
                    {
                        old.nAdded++;
                        continue;
                        goto case (byte)('\\');
                    }

                    case (byte)('\\'):
                    {
                        // Matches "\ No newline at end of file"
                        continue;
                        goto default;
                    }

                    default:
                    {
                        goto SCAN_break;
                        break;
                    }
                }
            SCAN_continue: ;
            }
            SCAN_break: ;
            if (last < end && nContext + old.nDeleted - 1 == old.lineCount && nContext + old.
                nAdded == newLineCount && RawParseUtils.Match(buf, last, NGit.Patch.Patch.SIG_FOOTER
                ) >= 0)
            {
                // This is an extremely common occurrence of "corruption".
                // Users add footers with their signatures after this mark,
                // and git diff adds the git executable version number.
                // Let it slide; the hunk otherwise looked sound.
                //
                old.nDeleted--;
                return last;
            }
            if (nContext + old.nDeleted < old.lineCount)
            {
                int missingCount = old.lineCount - (nContext + old.nDeleted);
                script.Error(buf, startOffset, MessageFormat.Format(JGitText.Get().truncatedHunkOldLinesMissing
                    , missingCount));
            }
            else
            {
                if (nContext + old.nAdded < newLineCount)
                {
                    int missingCount = newLineCount - (nContext + old.nAdded);
                    script.Error(buf, startOffset, MessageFormat.Format(JGitText.Get().truncatedHunkNewLinesMissing
                        , missingCount));
                }
                else
                {
                    if (nContext + old.nDeleted > old.lineCount || nContext + old.nAdded > newLineCount)
                    {
                        string oldcnt = old.lineCount + ":" + newLineCount;
                        string newcnt = (nContext + old.nDeleted) + ":" + (nContext + old.nAdded);
                        script.Warn(buf, startOffset, MessageFormat.Format(JGitText.Get().hunkHeaderDoesNotMatchBodyLineCountOf
                            , oldcnt, newcnt));
                    }
                }
            }
            return c;
        }
		internal override int ParseBody(NGit.Patch.Patch script, int end)
		{
			byte[] buf = file.buf;
			int c = RawParseUtils.NextLF(buf, startOffset);
			foreach (CombinedHunkHeader.CombinedOldImage o in old)
			{
				o.nDeleted = 0;
				o.nAdded = 0;
				o.nContext = 0;
			}
			nContext = 0;
			int nAdded = 0;
			for (int eol; c < end; c = eol)
			{
				eol = RawParseUtils.NextLF(buf, c);
				if (eol - c < old.Length + 1)
				{
					// Line isn't long enough to mention the state of each
					// ancestor. It must be the end of the hunk.
					goto SCAN_break;
				}
				switch (buf[c])
				{
					case (byte)(' '):
					case (byte)('-'):
					case (byte)('+'):
					{
						break;
					}

					default:
					{
						// Line can't possibly be part of this hunk; the first
						// ancestor information isn't recognizable.
						//
						goto SCAN_break;
						break;
					}
				}
				int localcontext = 0;
				for (int ancestor = 0; ancestor < old.Length; ancestor++)
				{
					switch (buf[c + ancestor])
					{
						case (byte)(' '):
						{
							localcontext++;
							old[ancestor].nContext++;
							continue;
							goto case (byte)('-');
						}

						case (byte)('-'):
						{
							old[ancestor].nDeleted++;
							continue;
							goto case (byte)('+');
						}

						case (byte)('+'):
						{
							old[ancestor].nAdded++;
							nAdded++;
							continue;
							goto default;
						}

						default:
						{
							goto SCAN_break;
							break;
						}
					}
				}
				if (localcontext == old.Length)
				{
					nContext++;
				}
SCAN_continue: ;
			}
SCAN_break: ;
			for (int ancestor_1 = 0; ancestor_1 < old.Length; ancestor_1++)
			{
				CombinedHunkHeader.CombinedOldImage o_1 = old[ancestor_1];
				int cmp = o_1.nContext + o_1.nDeleted;
				if (cmp < o_1.lineCount)
				{
					int missingCnt = o_1.lineCount - cmp;
					script.Error(buf, startOffset, MessageFormat.Format(JGitText.Get().truncatedHunkLinesMissingForAncestor
						, Sharpen.Extensions.ValueOf(missingCnt), Sharpen.Extensions.ValueOf(ancestor_1 
						+ 1)));
				}
			}
			if (nContext + nAdded < newLineCount)
			{
				int missingCount = newLineCount - (nContext + nAdded);
				script.Error(buf, startOffset, MessageFormat.Format(JGitText.Get().truncatedHunkNewLinesMissing
					, Sharpen.Extensions.ValueOf(missingCount)));
			}
			return c;
		}