1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.scm.provider.svn.command.diff;
20
21 import java.io.File;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26
27 import org.apache.maven.scm.ScmFile;
28 import org.apache.maven.scm.ScmFileStatus;
29 import org.apache.maven.scm.util.AbstractConsumer;
30
31
32
33
34
35
36 public class SvnDiffConsumer extends AbstractConsumer {
37
38
39
40
41
42
43
44 private static final String INDEX_TOKEN = "Index: ";
45
46 private static final String FILE_SEPARATOR_TOKEN = "===";
47
48 private static final String START_REVISION_TOKEN = "---";
49
50 private static final String END_REVISION_TOKEN = "+++";
51
52 private static final String ADDED_LINE_TOKEN = "+";
53
54 private static final String REMOVED_LINE_TOKEN = "-";
55
56 private static final String UNCHANGED_LINE_TOKEN = " ";
57
58 private static final String CHANGE_SEPARATOR_TOKEN = "@@";
59
60 private static final String NO_NEWLINE_TOKEN = "\\ No newline at end of file";
61
62 private String currentFile;
63
64 private StringBuilder currentDifference;
65
66 private final List<ScmFile> changedFiles = new ArrayList<>();
67
68 private final Map<String, CharSequence> differences = new HashMap<>();
69
70 private final StringBuilder patch = new StringBuilder();
71
72
73
74
75
76 public SvnDiffConsumer(File workingDirectory) {
77
78 }
79
80
81
82
83
84
85 public void consumeLine(String line) {
86 if (line.startsWith(INDEX_TOKEN)) {
87
88 currentFile = line.substring(INDEX_TOKEN.length());
89
90 changedFiles.add(new ScmFile(currentFile, ScmFileStatus.MODIFIED));
91
92 currentDifference = new StringBuilder();
93
94 differences.put(currentFile, currentDifference);
95
96 patch.append(line).append("\n");
97
98 return;
99 }
100
101 if (currentFile == null) {
102 if (logger.isWarnEnabled()) {
103 logger.warn("Unparseable line: '" + line + "'");
104 }
105 patch.append(line).append("\n");
106 return;
107 }
108
109 if (line.startsWith(FILE_SEPARATOR_TOKEN)) {
110
111 patch.append(line).append("\n");
112 } else if (line.startsWith(START_REVISION_TOKEN)) {
113
114 patch.append(line).append("\n");
115 } else if (line.startsWith(END_REVISION_TOKEN)) {
116
117 patch.append(line).append("\n");
118 } else if (line.startsWith(ADDED_LINE_TOKEN)
119 || line.startsWith(REMOVED_LINE_TOKEN)
120 || line.startsWith(UNCHANGED_LINE_TOKEN)
121 || line.startsWith(CHANGE_SEPARATOR_TOKEN)
122 || line.equals(NO_NEWLINE_TOKEN)) {
123
124 currentDifference.append(line).append("\n");
125 patch.append(line).append("\n");
126 } else {
127
128
129 if (logger.isWarnEnabled()) {
130 logger.warn("Unparseable line: '" + line + "'");
131 }
132 patch.append(line).append("\n");
133
134 currentFile = null;
135 currentDifference = null;
136 }
137 }
138
139 public List<ScmFile> getChangedFiles() {
140 return changedFiles;
141 }
142
143 public Map<String, CharSequence> getDifferences() {
144 return differences;
145 }
146
147 public String getPatch() {
148 return patch.toString();
149 }
150 }