1 package org.apache.maven.scm.provider.perforce.command.tag;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.regex.Matcher;
25 import java.util.regex.Pattern;
26
27 import org.apache.maven.scm.ScmFile;
28 import org.apache.maven.scm.ScmFileStatus;
29 import org.apache.maven.scm.provider.perforce.command.AbstractPerforceConsumer;
30 import org.codehaus.plexus.util.cli.StreamConsumer;
31
32
33
34
35
36
37 public class PerforceTagConsumer
38 extends AbstractPerforceConsumer
39 implements StreamConsumer
40 {
41
42 private static final Pattern LABEL_PATTERN = Pattern.compile( "^Label ([^ ]+) saved.$" );
43
44 private static final Pattern SYNC_PATTERN = Pattern.compile( "^([^#]+)#\\d+ - (.*)" );
45
46 public static final int STATE_CREATE = 1;
47
48 public static final int STATE_SYNC = 2;
49
50 public static final int STATE_ERROR = 3;
51
52 private int currentState = STATE_CREATE;
53
54 private List<ScmFile> tagged = new ArrayList<ScmFile>();
55
56
57
58
59
60
61
62
63
64 public List<ScmFile> getTagged()
65 {
66 return tagged;
67 }
68
69
70
71
72
73
74
75
76
77
78
79
80
81 public void consumeLine( String line )
82 {
83 switch ( currentState )
84 {
85 case STATE_CREATE:
86 if ( !LABEL_PATTERN.matcher( line ).matches() )
87 {
88 error( line );
89 break;
90 }
91 currentState = STATE_SYNC;
92 break;
93 case STATE_SYNC:
94 Matcher matcher = SYNC_PATTERN.matcher( line );
95 if ( !matcher.matches() )
96 {
97 error( line );
98 break;
99 }
100 tagged.add( new ScmFile( matcher.group( 1 ), ScmFileStatus.TAGGED ) );
101 break;
102 default:
103 error( line );
104 break;
105 }
106 }
107
108 private void error( String line )
109 {
110 currentState = STATE_ERROR;
111 output.println( line );
112 }
113
114 public boolean isSuccess()
115 {
116 return currentState == STATE_SYNC;
117 }
118
119 }