1 package org.apache.maven.scm.provider.hg.command.diff;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.scm.ScmFile;
23 import org.apache.maven.scm.ScmFileStatus;
24 import org.apache.maven.scm.log.ScmLogger;
25 import org.apache.maven.scm.provider.hg.command.HgConsumer;
26
27 import java.io.File;
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32
33
34
35
36
37
38 public class HgDiffConsumer
39 extends HgConsumer
40 {
41
42
43
44 private static final String INDEX_TOKEN = "diff -r ";
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 static final int HASH_ID_LEN = 12;
63
64 private ScmLogger logger;
65
66 private String currentFile;
67
68 private StringBuilder currentDifference;
69
70 private List<ScmFile> changedFiles = new ArrayList<ScmFile>();
71
72 private Map<String, CharSequence> differences = new HashMap<String, CharSequence>();
73
74 private StringBuilder patch = new StringBuilder();
75
76 @SuppressWarnings( "unused" )
77 private File workingDirectory;
78
79
80 public HgDiffConsumer( ScmLogger logger, File workingDirectory )
81 {
82 super( logger );
83 this.logger = logger;
84 this.workingDirectory = workingDirectory;
85 }
86
87
88
89
90
91
92 public void consumeLine( String line )
93 {
94 if ( line.startsWith( INDEX_TOKEN ) )
95 {
96
97 currentFile = line.substring( INDEX_TOKEN.length() + HASH_ID_LEN + 1 );
98
99 changedFiles.add( new ScmFile( currentFile, ScmFileStatus.MODIFIED ) );
100
101 currentDifference = new StringBuilder();
102
103 differences.put( currentFile, currentDifference );
104
105 patch.append( line ).append( "\n" );
106
107 return;
108 }
109
110 if ( currentFile == null )
111 {
112 if ( logger.isWarnEnabled() )
113 {
114 logger.warn( "Unparseable line: '" + line + "'" );
115 }
116 patch.append( line ).append( "\n" );
117 return;
118 }
119
120 if ( line.startsWith( FILE_SEPARATOR_TOKEN ) )
121 {
122
123 patch.append( line ).append( "\n" );
124 }
125 else if ( line.startsWith( START_REVISION_TOKEN ) )
126 {
127
128 patch.append( line ).append( "\n" );
129 }
130 else if ( line.startsWith( END_REVISION_TOKEN ) )
131 {
132
133 patch.append( line ).append( "\n" );
134 }
135 else if ( line.startsWith( ADDED_LINE_TOKEN ) || line.startsWith( REMOVED_LINE_TOKEN )
136 || line.startsWith( UNCHANGED_LINE_TOKEN ) || line.startsWith( CHANGE_SEPARATOR_TOKEN )
137 || line.equals( NO_NEWLINE_TOKEN ) )
138 {
139
140 currentDifference.append( line ).append( "\n" );
141 patch.append( line ).append( "\n" );
142 }
143 else
144 {
145
146
147 if ( logger.isWarnEnabled() )
148 {
149 logger.warn( "Unparseable line: '" + line + "'" );
150 }
151 patch.append( line ).append( "\n" );
152
153 currentFile = null;
154 currentDifference = null;
155 }
156 }
157
158 public List<ScmFile> getChangedFiles()
159 {
160 return changedFiles;
161 }
162
163 public Map<String, CharSequence> getDifferences()
164 {
165 return differences;
166 }
167
168 public String getPatch()
169 {
170 return patch.toString();
171 }
172 }