001package org.apache.maven.scm.provider.accurev;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *    http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import java.io.File;
023import java.text.DateFormat;
024import java.util.Collection;
025import java.util.List;
026import java.util.Map;
027
028import org.apache.maven.scm.command.blame.BlameLine;
029import org.apache.maven.scm.util.ThreadSafeDateFormat;
030
031/**
032 * Represents the AccuRev CLI interface
033 * 
034 * @author ggardner
035 */
036public interface AccuRev
037{
038
039    public static final String DEFAULT_ACCUREV_EXECUTABLE = "accurev";
040
041    public static final int DEFAULT_PORT = 5050;
042
043    public static final String ACCUREV_TIME_FORMAT_STRING = "yyyy/MM/dd HH:mm:ss";
044
045    public static final DateFormat ACCUREV_TIME_SPEC = new ThreadSafeDateFormat( ACCUREV_TIME_FORMAT_STRING );
046
047    public static final String DEFAULT_REMOVE_MESSAGE = "removed (maven-scm)";
048
049    public static final String DEFAULT_ADD_MESSAGE = "initial version (maven-scm)";
050
051    public static final String DEFAULT_PROMOTE_MESSAGE = "promote (maven-scm)";
052
053    /**
054     * Reset command process, clear command output accumulators
055     */
056    void reset();
057
058    /**
059     * Populate external to a workspace a (stream) and transactionId/time, to a specific location.
060     * 
061     * <p>
062     * You must check {@link AccuRevCapability#POPULATE_TO_TRANSACTION} before passing a tranid/time
063     * to this method. If not supported should pass "now","highest" or null for tranSpec
064     * 
065     * @param basedir
066     * @param stream stream to update to
067     * @param tranSpec transaction to update to or "now" if not supported.
068     * @param elements (must be depot relative. if null "/./" root is used)
069     * @return
070     * @throws AccuRevException
071     */
072    List<File> popExternal( File basedir, String stream, String tranSpec, Collection<File> elements )
073        throws AccuRevException;
074
075    /**
076     * Re populate missing files to existing workspace.
077     * 
078     * @param basedir
079     * @param elements
080     * @return
081     * @throws AccuRevException
082     */
083    List<File> pop( File basedir, Collection<File> elements )
084        throws AccuRevException;
085
086    /**
087     * Make workspace
088     * 
089     * @param basisStream
090     * @param workspaceName
091     * @param basedir
092     * @return
093     * @throws AccuRevException
094     */
095    boolean mkws( String basisStream, String workspaceName, File basedir )
096        throws AccuRevException;
097
098    /**
099     * Update a workspace or reftree, to a particular transaction id
100     * 
101     * @param basedir
102     * @param transactionId
103     * @return
104     * @throws AccuRevException
105     */
106    List<File> update( File basedir, String transactionId )
107        throws AccuRevException;
108
109    /**
110     * Get info about the current logged in user for the current workspace.
111     * 
112     * @param basedir
113     * @return
114     */
115    AccuRevInfo info( File basedir )
116        throws AccuRevException;
117
118    /**
119     * Deactivate a workspace
120     * 
121     * @param workSpaceName full name of the workspace, including the user suffix
122     * @return
123     */
124    boolean rmws( String workSpaceName )
125        throws AccuRevException;
126
127    /**
128     * Reactivate a workspace
129     * 
130     * @param workSpaceName full name of the workspace, including the user suffix
131     * @return
132     */
133    boolean reactivate( String workSpaceName )
134        throws AccuRevException;
135
136    /**
137     * The accurev command line strings since last reset(), separated by ";"
138     * 
139     * @return
140     */
141    String getCommandLines();
142
143    /**
144     * Full output of accurev command line invocations since reset
145     * 
146     * @return
147     */
148    String getErrorOutput();
149
150    /**
151     * Add the file to the repository. File must be within a workspace
152     * 
153     * @param basedir base directory of the workspace
154     * @param files to add (relative to basedir, or absolute)
155     * @param message the commit message
156     */
157    List<File> add( File basedir, List<File> files, String message )
158        throws AccuRevException;
159
160    /**
161     * Remove the file from the repository. Files must be within a workspace
162     * 
163     * @param basedir
164     * @param files
165     * @param message
166     * @return
167     * @throws AccuRevException
168     */
169    List<File> defunct( File basedir, List<File> files, String message )
170        throws AccuRevException;
171
172    /**
173     * Any elements that have been kept previously or are currently modified will be promoted.
174     * 
175     * @param basedir - location of the workspace to act on
176     * @param message
177     * @return
178     * @throws AccuRevException
179     */
180    List<File> promoteAll( File basedir, String message )
181        throws AccuRevException;
182
183    List<File> promote( File basedir, List<File> files, String message )
184        throws AccuRevException;
185
186    /**
187     * Relocate/reparent a workspace
188     * 
189     * @param basedir
190     * @param workSpaceName (full workspacename including user)
191     * @param newBasisStream
192     * @return
193     * @throws AccuRevException
194     */
195    boolean chws( File basedir, String workSpaceName, String newBasisStream )
196        throws AccuRevException;
197
198    boolean mksnap( String snapShotName, String basisStream )
199        throws AccuRevException;
200
201    List<File> statTag( String streamName )
202        throws AccuRevException;
203
204    /**
205     * Sorts list of elements by whether they exist in the backing stream or not.
206     * 
207     * @param basedir
208     * @param elements
209     * @return
210     * @throws AccuRevException
211     */
212    CategorisedElements statBackingStream( File basedir, Collection<File> elements )
213        throws AccuRevException;
214
215    /**
216     * @param basedir
217     * @param elements list of elements to stat, relative to basedir
218     * @param statType
219     * @return
220     * @throws AccuRevException
221     */
222    List<File> stat( File basedir, Collection<File> elements, AccuRevStat statType )
223        throws AccuRevException;
224
225    /**
226     * Accurev status of an element
227     * 
228     * @param element
229     * @return null if ignored or not in workspace
230     */
231    String stat( File element )
232        throws AccuRevException;
233
234    List<Transaction> history( String baseStream, String fromTimeSpec, String toTimeSpec, int count,
235                               boolean depotHistory, boolean transactionsOnly )
236        throws AccuRevException;
237
238    /**
239     * AccuRev differences of a stream between to timespecs
240     * 
241     * @param baseStream
242     * @param fromTimeSpec
243     * @param toTimeSpec
244     * @return
245     * @throws AccuRevException
246     */
247    List<FileDifference> diff( String baseStream, String fromTimeSpec, String toTimeSpec )
248        throws AccuRevException;
249
250    /**
251     * AccuRev annotate an element
252     * 
253     * @param file
254     * @return
255     * @throws AccuRevException
256     */
257    List<BlameLine> annotate( File baseDir, File file )
258        throws AccuRevException;
259
260    /**
261     * Logins in as the given user, retains authtoken for use with subsequent commands.
262     * 
263     * @param user
264     * @param password
265     * @return
266     * @throws AccuRevException
267     */
268    boolean login( String user, String password )
269        throws AccuRevException;
270
271    Map<String, WorkSpace> showWorkSpaces()
272        throws AccuRevException;
273
274    Map<String, WorkSpace> showRefTrees()
275        throws AccuRevException;
276
277    Stream showStream( String stream )
278        throws AccuRevException;
279
280    String getExecutable();
281
282    String getClientVersion()
283        throws AccuRevException;
284
285    boolean  syncReplica()
286        throws AccuRevException;
287
288}