001package org.apache.maven.scm.provider;
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
022/**
023 * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
024 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
025 * @author <a href="mailto:ChrisGWarp@gmail.com">Chris Graham</a>
026 *
027 */
028public abstract class ScmProviderRepository
029{
030    private String user;
031
032    private String password;
033
034    private boolean persistCheckout = false;
035
036    /**
037     * @since 1.4
038     */
039    private boolean pushChanges = true;
040
041    /**
042     * Some SCMs have the concept of a work item (or task) which may need to be
043     * specified to allow changes to be pushed or delivered to a target.
044     * This allows you to answer the question: For this workItem, what changed?
045     * Auditors have been known to love this... :)
046     * SCMs known to implement this are:
047     * <ul>
048     * <li>IBM Rational Team Concert (workItem)
049     * <li>Microsoft Team Foundation Server (workItem)
050     * <li>IBM Rational ClearQuest Enabled UCM ClearCase (task)
051     * </ul>
052     * There may be others that support this feature.
053     * <P>
054     * These SCMs can be configured to reject a push/deliver unless additional
055     * information (by way of a workItem/task) is supplied.
056     * <P>
057     * This field is only relevant when pushChanges = true.
058     * <P>
059     * It should be noted however, when pushChanges = true, a workItem does not
060     * need to be set, as the need for a workItem may be optional.
061     * 
062     * @since 1.9.5
063     */
064    private String workItem;
065
066    /**
067     * @return The user.
068     */
069    public String getUser()
070    {
071        return user;
072    }
073
074    /**
075     * Set the user.
076     *
077     * @param user The user
078     */
079    public void setUser( String user )
080    {
081        this.user = user;
082    }
083
084    /**
085     * @return The password.
086     */
087    public String getPassword()
088    {
089        return password;
090    }
091
092    /**
093     * Set the password.
094     *
095     * @param password The user password
096     */
097    public void setPassword( String password )
098    {
099        this.password = password;
100    }
101
102    /**
103     * Should distributed changes be pushed to the central repository?
104     * For many distributed SCMs like Git, a change like a commit 
105     * is only stored in your local copy of the repository.  Pushing
106     * the change allows your to more easily share it with other users.
107     * @return TODO
108     * @since 1.4
109     */
110    public boolean isPushChanges() 
111    {
112        return pushChanges;
113    }
114
115    /**
116     * @since 1.4
117     * @param pushChanges TODO
118     */
119    public void setPushChanges( boolean pushChanges )
120    {
121        this.pushChanges = pushChanges;
122    }
123
124    /**
125     * @return The workItem.
126     * @since 1.9.5
127     */
128    public String getWorkItem()
129    {
130        return workItem;
131    }
132
133    /**
134     * Set the workItem.
135     *
136     * @param workItem The workItem.
137     * @since 1.9.5
138     */
139    public void setWorkItem( String workItem )
140    {
141        this.workItem = workItem;
142    }
143
144    /**
145     * Will checkouts using this repository be persisted so they can
146     * be refreshed in the future?  This property is of concern to SCMs
147     * like Perforce and Clearcase where the server must track where a
148     * user checks out to.  If false, the server entry (clientspec in Perforce
149     * terminology) will be deleted after the checkout is complete so the
150     * files will not be able to be updated.
151     * <p>
152     * This setting can be overriden by using the system property
153     * "maven.scm.persistcheckout" to true.
154     * <p>
155     * The default is false.  See SCM-113 for more detail.
156     * @return TODO
157     */
158    public boolean isPersistCheckout()
159    {
160        String persist = System.getProperty( "maven.scm.persistcheckout" );
161        if ( persist != null )
162        {
163            return Boolean.valueOf( persist ).booleanValue();
164        }
165        return persistCheckout;
166    }
167
168    public void setPersistCheckout( boolean persistCheckout )
169    {
170        this.persistCheckout = persistCheckout;
171    }
172
173    /**
174     * Get a {@link ScmProviderRepository} that represents the parent folder in the repository.
175     * Useful when the repository does not exist yet and we need to create it from the parent.
176     *
177     * @return the parent repository
178     * @throws UnsupportedOperationException unless overridden by subclass
179     */
180    public ScmProviderRepository getParent()
181    {
182        throw new UnsupportedOperationException();
183    }
184
185    /**
186     * Get the relative path between the repository provided as argument and the current repository.
187     *
188     * @param ancestor another repository that should be ancestor of this one
189     * @return the relative path or <code>null</code> if it can't be resolved
190     * @throws UnsupportedOperationException unless overridden by subclass
191     */
192    public String getRelativePath( ScmProviderRepository ancestor )
193    {
194        throw new UnsupportedOperationException();
195    }
196}