001package org.apache.maven.scm.provider.bazaar;
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 org.apache.maven.scm.CommandParameters;
023import org.apache.maven.scm.ScmException;
024import org.apache.maven.scm.ScmFileSet;
025import org.apache.maven.scm.ScmResult;
026import org.apache.maven.scm.command.add.AddScmResult;
027import org.apache.maven.scm.command.blame.BlameScmResult;
028import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
029import org.apache.maven.scm.command.checkin.CheckInScmResult;
030import org.apache.maven.scm.command.checkout.CheckOutScmResult;
031import org.apache.maven.scm.command.diff.DiffScmResult;
032import org.apache.maven.scm.command.remove.RemoveScmResult;
033import org.apache.maven.scm.command.status.StatusScmResult;
034import org.apache.maven.scm.command.tag.TagScmResult;
035import org.apache.maven.scm.command.update.UpdateScmResult;
036import org.apache.maven.scm.provider.AbstractScmProvider;
037import org.apache.maven.scm.provider.ScmProviderRepository;
038import org.apache.maven.scm.provider.bazaar.command.BazaarConstants;
039import org.apache.maven.scm.provider.bazaar.command.add.BazaarAddCommand;
040import org.apache.maven.scm.provider.bazaar.command.blame.BazaarBlameCommand;
041import org.apache.maven.scm.provider.bazaar.command.changelog.BazaarChangeLogCommand;
042import org.apache.maven.scm.provider.bazaar.command.checkin.BazaarCheckInCommand;
043import org.apache.maven.scm.provider.bazaar.command.checkout.BazaarCheckOutCommand;
044import org.apache.maven.scm.provider.bazaar.command.diff.BazaarDiffCommand;
045import org.apache.maven.scm.provider.bazaar.command.remove.BazaarRemoveCommand;
046import org.apache.maven.scm.provider.bazaar.command.status.BazaarStatusCommand;
047import org.apache.maven.scm.provider.bazaar.command.tag.BazaarTagCommand;
048import org.apache.maven.scm.provider.bazaar.command.update.BazaarUpdateCommand;
049import org.apache.maven.scm.provider.bazaar.repository.BazaarScmProviderRepository;
050import org.apache.maven.scm.repository.ScmRepositoryException;
051import org.apache.maven.scm.repository.UnknownRepositoryStructure;
052
053import java.io.File;
054import java.util.ArrayList;
055import java.util.List;
056
057/**
058 * Bazaar NG http://bazaar-vcs.org/ is a decentralized revision control system. <br>
059 *
060 * @author <a href="mailto:torbjorn@smorgrav.org">Torbjorn Eikli Smorgrav</a>
061 *
062 * @plexus.component role="org.apache.maven.scm.provider.ScmProvider" role-hint="bazaar"
063 */
064public class BazaarScmProvider
065    extends AbstractScmProvider
066{
067    /** {@inheritDoc} */
068    public String getScmSpecificFilename()
069    {
070        return ".bzr";
071    }
072
073    /** {@inheritDoc} */
074    public ScmProviderRepository makeProviderScmRepository( String scmSpecificUrl, char delimiter )
075        throws ScmRepositoryException
076    {
077        return new BazaarScmProviderRepository( scmSpecificUrl );
078    }
079
080    /** {@inheritDoc} */
081    public ScmProviderRepository makeProviderScmRepository( File path )
082        throws ScmRepositoryException, UnknownRepositoryStructure
083    {
084        if ( path == null || !path.isDirectory() )
085        {
086            throw new ScmRepositoryException( path.getAbsolutePath() + " isn't a valid directory." );
087        }
088
089        File bzrDir = new File( path, ".bzr" );
090
091        if ( !bzrDir.exists() )
092        {
093            throw new ScmRepositoryException( path.getAbsolutePath() + " isn't a bazaar directory." );
094        }
095
096        return makeProviderScmRepository( "file:///" + path.getAbsolutePath(), ':' );
097    }
098
099    /** {@inheritDoc} */
100    public List<String> validateScmUrl( String scmSpecificUrl, char delimiter )
101    {
102
103        List<String> errorMessages = new ArrayList<String>();
104
105        String[] checkCmd = new String[]{BazaarConstants.CHECK, scmSpecificUrl};
106        ScmResult result;
107        try
108        {
109            File tmpDir = new File( System.getProperty( "java.io.tmpdir" ) );
110            result = BazaarUtils.execute( tmpDir, checkCmd );
111            if ( !result.isSuccess() )
112            {
113                errorMessages.add( result.getCommandOutput() );
114                errorMessages.add( result.getProviderMessage() );
115            }
116        }
117        catch ( ScmException e )
118        {
119            errorMessages.add( e.getMessage() );
120        }
121
122        return errorMessages;
123    }
124
125    /** {@inheritDoc} */
126    public String getScmType()
127    {
128        return "bazaar";
129    }
130
131    /** {@inheritDoc} */
132    public AddScmResult add( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
133        throws ScmException
134    {
135        BazaarAddCommand command = new BazaarAddCommand();
136
137        command.setLogger( getLogger() );
138
139        return (AddScmResult) command.execute( repository, fileSet, parameters );
140    }
141
142    /** {@inheritDoc} */
143    public ChangeLogScmResult changelog( ScmProviderRepository repository, ScmFileSet fileSet,
144                                         CommandParameters parameters )
145        throws ScmException
146    {
147        BazaarChangeLogCommand command = new BazaarChangeLogCommand();
148
149        command.setLogger( getLogger() );
150
151        return (ChangeLogScmResult) command.execute( repository, fileSet, parameters );
152    }
153
154    /** {@inheritDoc} */
155    public CheckInScmResult checkin( ScmProviderRepository repository, ScmFileSet fileSet,
156                                     CommandParameters parameters )
157        throws ScmException
158    {
159        BazaarCheckInCommand command = new BazaarCheckInCommand();
160
161        command.setLogger( getLogger() );
162
163        return (CheckInScmResult) command.execute( repository, fileSet, parameters );
164    }
165
166    /** {@inheritDoc} */
167    public CheckOutScmResult checkout( ScmProviderRepository repository, ScmFileSet fileSet,
168                                       CommandParameters parameters )
169        throws ScmException
170    {
171        BazaarCheckOutCommand command = new BazaarCheckOutCommand();
172
173        command.setLogger( getLogger() );
174
175        return (CheckOutScmResult) command.execute( repository, fileSet, parameters );
176    }
177
178    /** {@inheritDoc} */
179    public DiffScmResult diff( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
180        throws ScmException
181    {
182        BazaarDiffCommand command = new BazaarDiffCommand();
183
184        command.setLogger( getLogger() );
185
186        return (DiffScmResult) command.execute( repository, fileSet, parameters );
187    }
188
189    /** {@inheritDoc} */
190    public RemoveScmResult remove( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
191        throws ScmException
192    {
193        BazaarRemoveCommand command = new BazaarRemoveCommand();
194
195        command.setLogger( getLogger() );
196
197        return (RemoveScmResult) command.execute( repository, fileSet, parameters );
198    }
199
200    /** {@inheritDoc} */
201    public StatusScmResult status( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
202        throws ScmException
203    {
204        BazaarStatusCommand command = new BazaarStatusCommand();
205
206        command.setLogger( getLogger() );
207
208        return (StatusScmResult) command.execute( repository, fileSet, parameters );
209    }
210
211    /** {@inheritDoc} */
212    public TagScmResult tag( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
213        throws ScmException
214    {
215        BazaarTagCommand command = new BazaarTagCommand();
216
217        command.setLogger( getLogger() );
218
219        return (TagScmResult) command.execute( repository, fileSet, parameters );
220    }
221
222    /** {@inheritDoc} */
223    public UpdateScmResult update( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
224        throws ScmException
225    {
226        BazaarUpdateCommand command = new BazaarUpdateCommand();
227
228        command.setLogger( getLogger() );
229
230        return (UpdateScmResult) command.execute( repository, fileSet, parameters );
231    }
232
233    /** {@inheritDoc} */
234    protected BlameScmResult blame( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
235        throws ScmException
236    {
237        BazaarBlameCommand command = new BazaarBlameCommand();
238
239        command.setLogger( getLogger() );
240
241        return (BlameScmResult) command.execute( repository, fileSet, parameters );
242    }
243}