You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm-commits@maven.apache.org by ev...@apache.org on 2007/03/15 15:28:55 UTC

svn commit: r518639 - in /maven/scm/trunk: maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/co...

Author: evenisse
Date: Thu Mar 15 07:28:54 2007
New Revision: 518639

URL: http://svn.apache.org/viewvc?view=rev&rev=518639
Log:
[SCM-287] Support for checking out from a tag and auto-creation of config specs

Modified:
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommand.java
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepository.java
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommandTest.java
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepositoryTest.java
    maven/scm/trunk/maven-scm-site/src/site/apt/clearcase.apt

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java?view=diff&rev=518639&r1=518638&r2=518639
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java Thu Mar 15 07:28:54 2007
@@ -59,7 +59,7 @@
     public ScmProviderRepository makeProviderScmRepository( String scmSpecificUrl, char delimiter )
         throws ScmRepositoryException
     {
-        return new ClearCaseScmProviderRepository( scmSpecificUrl );
+        return new ClearCaseScmProviderRepository( getLogger(), scmSpecificUrl );
     }
 
     public String getScmType()

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommand.java?view=diff&rev=518639&r1=518638&r2=518639
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommand.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommand.java Thu Mar 15 07:28:54 2007
@@ -34,6 +34,7 @@
 import org.codehaus.plexus.util.cli.Commandline;
 
 import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -92,27 +93,46 @@
             {
                 File configSpecLocation;
 
-                if ( tag == null )
+                if ( !repo.isAutoConfigSpec() )
                 {
                     configSpecLocation = repo.getConfigSpec();
+                    if ( tag != null )
+                    {
+                        throw new UnsupportedOperationException(
+                            "Building on a label not supported with user-specified config specs" );
+                    }
                 }
                 else
                 {
-                    // TODO We are building on a label
-                    throw new UnsupportedOperationException( "Building on a label not supported yet" );
-                    // configSpecLocation = new File( "configspec.txt" );
-                    // FileWriter writer = new FileWriter( configSpecLocation );
-                    // writer.append( "ELEMENT * " + tag );
-                    // // If we did not tag the directories leading to the root directory
-                    // // of this module, then we need the following line also (otherwise, we will
-                    // // not be able to access our module in the given view
-                    // writer.append( "element * /main/LATEST" );
-                    // writer.close();
+
+                    // write config spec to temp file
+                    String configSpec = createConfigSpec( repo.getLoadDirectory(), tag );
+                    getLogger().info( "Created config spec for view '" + viewName + "':\n" + configSpec );
+                    configSpecLocation = File.createTempFile( "configspec-" + viewName, ".txt" );
+                    FileWriter fw = new FileWriter( configSpecLocation );
+                    try
+                    {
+                        fw.write( configSpec );
+                    }
+                    finally
+                    {
+                        try
+                        {
+                            fw.close();
+                        }
+                        catch ( IOException e )
+                        {
+                            // ignoree
+                        }
+                    }
+                    configSpecLocation.deleteOnExit();
                 }
+
                 cl = createUpdateConfigSpecCommandLine( workingDirectory, configSpecLocation, viewName );
 
                 getLogger().debug( "Executing: " + cl.getWorkingDirectory().getAbsolutePath() + ">>" + cl.toString() );
                 exitCode = CommandLineUtils.executeCommandLine( cl, consumer, stderr );
+
             }
         }
         catch ( CommandLineException ex )
@@ -135,6 +155,33 @@
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------
+
+    /**
+     * Creates a config spec that loads the given loadDirectory and uses the
+     * given version tag
+     *
+     * @param loadDirectory the VOB directory to be loaded
+     * @param tag           ClearCase label type; notice that branch types are not
+     *                      supported
+     * @return Config Spec as String
+     */
+    protected static String createConfigSpec( String loadDirectory, String tag )
+    {
+        // create config spec
+        StringBuffer configSpec = new StringBuffer();
+        configSpec.append( "element * CHECKEDOUT\n" );
+        if ( tag != null )
+        {
+            configSpec.append( "element * " + tag + "\n" );
+            configSpec.append( "element -directory * /main/LATEST\n" );
+        }
+        else
+        {
+            configSpec.append( "element * /main/LATEST\n" );
+        }
+        configSpec.append( "load " + loadDirectory + "\n" );
+        return configSpec.toString();
+    }
 
     private static Commandline createDeleteViewCommandLine( ClearCaseScmProviderRepository repository,
                                                             File workingDirectory )

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepository.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepository.java?view=diff&rev=518639&r1=518638&r2=518639
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepository.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepository.java Thu Mar 15 07:28:54 2007
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.maven.scm.log.ScmLogger;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 
@@ -32,24 +33,46 @@
 import java.util.StringTokenizer;
 
 /**
+ * Provider Repository
+ * <p/>
+ * Url format is [view_name]:[configspec|] or [view_name]|[configspec]
+ * <p/>
+ * [configspec] can be used in two different ways:
+ * <ul>
+ * <li>Path to a config spec file that is
+ * used when creating the snapshot view, e.g.
+ * "\\myserver\clearcase\configspecs\my_module.txt", or:</li>
+ * <li>A load rule that is used to automatically create a config spec, e.g. "load /MY_VOB/my/project/dir"</li>
+ * </ul>
+ * Notice that checking out from a tag is currently only supported when the second option is used.
+ *
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
- * @version $Id$
+ * @version $Id: ClearCaseScmProviderRepository.java 483105 2006-12-06 15:07:54Z
+ *          evenisse $
  */
 public class ClearCaseScmProviderRepository
     extends ScmProviderRepository
 {
+    private ScmLogger logger;
+
     private boolean viewNameGivenByUser = false;
 
     private String viewName;
 
+    /**
+     * The user-specified config spec; may be null.
+     */
     private File configSpec;
 
     /**
-     * @param url format is [view_name]:[url_to_configspec] or [view_name]|[url_to_configspec]
+     * The directory to be loaded, when auto-generating the config spec.
      */
-    public ClearCaseScmProviderRepository( String url )
+    private String loadDirectory;
+
+    public ClearCaseScmProviderRepository( ScmLogger logger, String url )
         throws ScmRepositoryException
     {
+        this.logger = logger;
         try
         {
             parseUrl( url );
@@ -86,22 +109,38 @@
     private void fillInProperties( StringTokenizer tokenizer )
         throws UnknownHostException, URISyntaxException, MalformedURLException
     {
+
+        String configSpecString;
         if ( tokenizer.countTokens() == 1 )
         {
             //No view name was given
             viewName = getDefaultViewName();
-            String spec = tokenizer.nextToken();
-            System.out.println( "spec = " + spec );
-            configSpec = createConfigSpecFile( spec );
+            configSpecString = tokenizer.nextToken();
         }
         else
         {
             viewName = tokenizer.nextToken();
-            viewNameGivenByUser = true;
-            System.out.println( "viewName = " + viewName );
-            String pathname = tokenizer.nextToken();
-            System.out.println( "pathname = " + pathname );
-            configSpec = createConfigSpecFile( pathname );
+            if ( viewName.length() > 0 )
+            {
+                viewNameGivenByUser = true;
+            }
+            else
+            {
+                viewName = getDefaultViewName();
+            }
+            configSpecString = tokenizer.nextToken();
+        }
+        logger.info( "viewName = '" + viewName + "' ; configSpec = '" + configSpecString + "'" );
+        if ( !configSpecString.startsWith( "load " ) )
+        {
+            configSpec = createConfigSpecFile( configSpecString );
+            loadDirectory = null;
+        }
+        else
+        {
+            configSpec = null;
+            loadDirectory = configSpecString.substring( 5 );
+
         }
     }
 
@@ -161,8 +200,38 @@
         return result;
     }
 
+    /**
+     * Returns the user-supplied config spec or <code>null</code> in case it
+     * should be automatically generated
+     *
+     * @return File or <code>null</code>
+     * @see #isAutoConfigSpec()
+     */
     public File getConfigSpec()
     {
         return configSpec;
+    }
+
+    /**
+     * Returns true when the config spec has not been supplied by the user, but
+     * instead should automatically be generated by the plugin
+     *
+     * @return true if auto config spec
+     */
+    public boolean isAutoConfigSpec()
+    {
+        return configSpec == null;
+    }
+
+    /**
+     * Returns the VOB directory to be loaded when auto-generating the config
+     * spec.
+     *
+     * @return <code>null</code> when isAutoConfigSpec() returns false;
+     *         otherwise the VOB directory
+     */
+    public String getLoadDirectory()
+    {
+        return loadDirectory;
     }
 }

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommandTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommandTest.java?view=diff&rev=518639&r1=518638&r2=518639
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommandTest.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/checkout/ClearCaseCheckOutCommandTest.java Thu Mar 15 07:28:54 2007
@@ -79,4 +79,14 @@
                                                                                   configSpecLocation, "testView" );
         assertEquals( "cleartool setcs -tag testView " + configSpecLocation, commandLine.toString() );
     }
+
+    public void testCreateConfigSpec()
+    {
+        assertEquals( "element * CHECKEDOUT\n" + "element * /main/LATEST\n" + "load MYVOB/my/dir\n",
+                      ClearCaseCheckOutCommand
+                          .createConfigSpec( "MYVOB/my/dir", null ) );
+        assertEquals( "element * CHECKEDOUT\n" + "element * MYTAG\n" + "element -directory * /main/LATEST\n" +
+            "load MYVOB/my/dir\n", ClearCaseCheckOutCommand
+            .createConfigSpec( "MYVOB/my/dir", "MYTAG" ) );
+    }
 }

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepositoryTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepositoryTest.java?view=diff&rev=518639&r1=518638&r2=518639
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepositoryTest.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/repository/ClearCaseScmProviderRepositoryTest.java Thu Mar 15 07:28:54 2007
@@ -20,6 +20,7 @@
  */
 
 import junit.framework.TestCase;
+import org.apache.maven.scm.log.DefaultLog;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 
 import java.io.File;
@@ -41,9 +42,10 @@
         String viewName = "my_module_view";
         String configSpecPath = "//myserver/ClearCase/ConfigSpecs/mymodule.txt";
         String url = viewName + "|" + configSpecPath;
-        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( url );
+        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( new DefaultLog(), url );
         assertEquals( new File( configSpecPath ).getPath(), repository.getConfigSpec().getPath() );
         assertEquals( viewName, repository.getViewName( "bla" ) );
+        assertNull( repository.getLoadDirectory() );
     }
 
     public void testParsingUrlWithColon()
@@ -52,9 +54,10 @@
         String viewName = "my_module_view";
         String configSpecPath = "//myserver/ClearCase/ConfigSpecs/mymodule.txt";
         String url = viewName + ":" + configSpecPath;
-        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( url );
+        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( new DefaultLog(), url );
         assertEquals( new File( configSpecPath ).getPath(), repository.getConfigSpec().getPath() );
         assertEquals( viewName, repository.getViewName( "bla" ) );
+        assertNull( repository.getLoadDirectory() );
     }
 
     public void testParsingUrlWithoutViewName()
@@ -62,9 +65,44 @@
     {
         String configSpecPath = "//myserver/ClearCase/ConfigSpecs/mymodule.txt";
         String url = configSpecPath;
-        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( url );
+        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( new DefaultLog(), url );
         assertEquals( new File( configSpecPath ).getPath(), repository.getConfigSpec().getPath() );
         assertNotNull( repository.getViewName( "15" ) );
         assertTrue( repository.getViewName( "15" ).indexOf( "15" ) != -1 );
+        assertNull( repository.getLoadDirectory() );
+    }
+
+    public void testAutoConfigSpecWithColon()
+        throws Exception
+    {
+        String url = "my_view_name:load /VOB/some/dir";
+        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( new DefaultLog(), url );
+        assertNull( repository.getConfigSpec() );
+        assertTrue( repository.isAutoConfigSpec() );
+        assertEquals( "my_view_name", repository.getViewName( "bla" ) );
+        assertEquals( "/VOB/some/dir", repository.getLoadDirectory() );
+    }
+
+    public void testAutoConfigSpecWithPipe()
+        throws Exception
+    {
+        String url = "my_view_name|load /VOB/some/dir";
+        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( new DefaultLog(), url );
+        assertNull( repository.getConfigSpec() );
+        assertTrue( repository.isAutoConfigSpec() );
+        assertEquals( "my_view_name", repository.getViewName( "bla" ) );
+        assertEquals( "/VOB/some/dir", repository.getLoadDirectory() );
+    }
+
+    public void testAutoConfigSpecWithoutViewName()
+        throws Exception
+    {
+        String url = "load /VOB/some/dir";
+        ClearCaseScmProviderRepository repository = new ClearCaseScmProviderRepository( new DefaultLog(), url );
+        assertNull( repository.getConfigSpec() );
+        assertTrue( repository.isAutoConfigSpec() );
+        assertNotNull( repository.getViewName( "15" ) );
+        assertTrue( repository.getViewName( "15" ).indexOf( "15" ) != -1 );
+        assertEquals( "/VOB/some/dir", repository.getLoadDirectory() );
     }
 }

Modified: maven/scm/trunk/maven-scm-site/src/site/apt/clearcase.apt
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-site/src/site/apt/clearcase.apt?view=diff&rev=518639&r1=518638&r2=518639
==============================================================================
--- maven/scm/trunk/maven-scm-site/src/site/apt/clearcase.apt (original)
+++ maven/scm/trunk/maven-scm-site/src/site/apt/clearcase.apt Thu Mar 15 07:28:54 2007
@@ -19,31 +19,62 @@
     For all URLs below, we use a colon (:) as separator. If you use a colon for one of the variables (e.g. a windows path), then use a pipe (|) as separator.
 
 -------
-scm:clearcase<delimiter>[view_name]<delimiter>path_to_config_spec
+scm:clearcase<delimiter>[view_name]<delimiter>config_spec
 -------
     
     <view_name>: This is the name of the view that is created on a 'checkout' of the code. This parameter is optional.
 
-    <path_to_config_spec>: The config spec that is referred here will be used in the snapshot view that is created by the 'checkout' command. Be sure to add "load" rules to the config spec!
+    <config_spec>: This parameter can be used to
+    
+    * either specify the location of an user-supplied config spec file. It will be used for the snapshot view that 
+      is created by the 'checkout' command. Be sure to add "load" rules to the config spec.
+    
+    * Or specify one load rule that is used by the ClearCase SCM provider to auto-generate a config spec for you. Please note
+      that checking out from a version tag (ClearCase label type) is only supported when this option is used.
 
 * Examples
 
 -------
 scm:clearcase:\\myserver\clearcase\configspecs\my_module.txt
 scm:clearcase:my_module_view:\\myserver\clearcase\configspecs\my_module.txt
+scm:clearcase:load /MY_VOB/my/project/dir
+scm:clearcase:my_module_view:load /MY_VOB/my/project/dir
 -------
 
 * Extra Information
 
 ** Config spec
     
-    When a 'checkout' happens, then there will be a snapshot view created. To make sure all the correct elements are loaded in the view, the config spec must have "load" rules specified.
+    When a 'checkout' happens, then there will be a snapshot view created.
+    
+    In case of an user-supplied config spec file: To make sure all the correct elements are loaded in the view, the config spec must
+    have "load" rules specified.
     If you work with dynamic views, you will need to create an additonal config spec to include the load-rules. The easiest to do this is to
     include your dynamic view config spec and add the necessairy load-rules. This is an example of a config spec with a load-rule:
     
 -------
 include \\myserver\clearcase\configspecs\my_dynamic_configspec.txt
 load /myvob/modules/my_module
+-------
+
+   In case you provide a load rule instead of a config spec file within the SCM url, the following config spec is automatically created
+   as long as no tag has been specified:
+   
+-------
+element * CHECKEDOUT
+element * /main/LATEST
+load <load_directory>
+-------
+
+   When working with auto-generated config specs, checking out from version tags (= ClearCase label types) is supported as well. (Notice
+   that checking out from a branch tag (= ClearCase branch type) is not supported.)
+   In case a tag has been specified, the following config spec is created:
+
+-------
+element * CHECKEDOUT
+element * <tag>
+element -directory * /main/LATEST
+load <load_directory>
 -------
 
 ** Viewstore location