Ejemplo n.º 1
0
        internal static Diff NewFileDiff(string content, string path)
        {
            var fileOne = new NullFile();
            var fileTwo = new File('b', path);
            var header = new DiffHeader(new DiffFormatType("generated"), new IFile[] { fileOne, fileTwo });

            var lines = content.SplitIntoLines()
                .Select(x => (ILine)new AdditionLine(x));
            var range = new ChunkRange(new ChangeRange(0, 0), new ChangeRange(1, lines.Count()));
            var snippet = new AdditionSnippet(lines);
            var chunk = new Chunk(range, new[] { snippet });

            return new Diff(header, new IHeader[0], new ChunksHeader(fileOne, fileTwo), new[] { chunk });
        }
            public IList<IFile> GetDiffFilesFromBinaryFiles(string binaryFilesRawFileDefs)
            {
                List<IFile> files = new List<IFile>(2);

                string rawFileDefs = binaryFilesRawFileDefs;

                // rawFileDefs has the following format:
                //   '<file def> and <file def> differ'
                // See IsValidFileDef for valid values of <file def>.

                // 1. remove ' differ' from the end
                int index = rawFileDefs.IndexOf(" differ");
                if(index != -1) {
                    rawFileDefs = rawFileDefs.Substring(0, index);
                } else {
                    System.Diagnostics.Trace.TraceWarning("Missing string ' differ' at end of BinaryFiles raw line: '{0}'", binaryFilesRawFileDefs);
                }

                // 2. repeatedly split at ' and ' positions, and find the ones where we have valid file names
                var candidates = new List<KeyValuePair<string, string>>(1);
                index = 0;
                while(true) {
                    index = rawFileDefs.IndexOf(" and ", index);
                    if(index == -1) break;
                    string filename1 = rawFileDefs.Substring(0, index);
                    string filename2 = rawFileDefs.Substring(index + 5 /* " and ".Length */);
                    if(AreValidFileDefs(filename1, filename2)) {
                        candidates.Add(new KeyValuePair<string, string>(filename1, filename2));
                    }
                }

                // 3. find the right candidate
                if(candidates.Count == 0) {
                    System.Diagnostics.Trace.TraceWarning("Missing file names in BinaryFiles raw line '{0}'", binaryFilesRawFileDefs);
                } else if(candidates.Count == 1) {
                    files[0] = FileFromFileDef(candidates[0].Key);
                    files[1] = FileFromFileDef(candidates[0].Value);
                } else {
                    // We got at least one file name with ' and b/' or ' and /dev/null' in its path ...
                    // We can consult the diff header's raw string, which looks like this:
                    //   '<file def> <file def>'
                    // Try to find a matching pair of candidates.
                    foreach(var candidate in candidates) {
                        if(this.headerSplitCandidates.Any(headerCandidate => CandidatesMatch(candidate.Key, headerCandidate.Key, candidate.Value, headerCandidate.Value))) {
                            files[0] = FileFromFileDef(candidate.Key);
                            files[1] = FileFromFileDef(candidate.Value);
                            break;
                        }
                    }
                    if(files.Count < 2) {
                        System.Diagnostics.Trace.TraceWarning("Could not find any pair of file names in BinaryFiles header that match the diff header file names.");
                    }
                }

                // 4. check if we found anything, and choose a default if not
                if(files.Count < 2) {
                    if(candidates.Count > 0) {
                        System.Diagnostics.Trace.TraceWarning("Defaulting to first candidate.");
                        files[0] = FileFromFileDef(candidates[0].Key);
                        files[1] = FileFromFileDef(candidates[0].Value);
                    } else {
                        System.Diagnostics.Trace.TraceWarning("Defaulting to NullFiles.");
                        files[0] = new NullFile();
                        files[1] = new NullFile();
                    }
                }
                return files;
            }