rubys       01/10/07 14:16:30

  Modified:    proposal/gump gen.bat gen.sh
               proposal/gump/java Module.java
  Removed:     proposal/gump/perl cvslogin.pl
  Log:
  Replace perl implementation of cvs login with a Java one.  This code
  is based on code from jakarta-ant; will provide feedback to the ant-dev
  mailing list of issues found in the original code base.
  
  Revision  Changes    Path
  1.11      +6 -4      jakarta-alexandria/proposal/gump/gen.bat
  
  Index: gen.bat
  ===================================================================
  RCS file: /home/cvs/jakarta-alexandria/proposal/gump/gen.bat,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- gen.bat   2001/10/07 15:54:47     1.10
  +++ gen.bat   2001/10/07 21:16:29     1.11
  @@ -8,8 +8,13 @@
   SET CLASSPATH=%XALAN%\bin\xalan.jar;%XALAN%\bin\xerces.jar;%CLASSPATH%
   
   SET SOURCE=%1
  +
   IF "%1"=="" SET SOURCE=%COMPUTERNAME%.xml
   
  +IF "%HOME%"=="" SET HOME=%USERPROFILE%
  +IF "%HOME%"=="" SET HOME=%HOMEDRIVE%%HOMEPATH%
  +IF "%HOME%"=="" SET HOME=C:\
  +
   if exist work rmdir /s /q work
   mkdir work
   
  @@ -23,7 +28,7 @@
   jar cf jenny.jar -C classes .
   if errorlevel 1 goto fail
   echo.
  -java -classpath jenny.jar;%CLASSPATH% Jenny %SOURCE%
  +java -Duser.home=%HOME% -classpath jenny.jar;%CLASSPATH% Jenny %SOURCE%
   if not errorlevel 0 goto fail
   
   REM ********************************************************************
  @@ -96,9 +101,6 @@
   cd work
   puball %SOURCE%
   cd ..
  -
  -REM Automatic login to each :pserver: cvsroot
  -perl perl\cvslogin.pl work\merge.xml
   
   goto eof
   :fail
  
  
  
  1.15      +0 -4      jakarta-alexandria/proposal/gump/gen.sh
  
  Index: gen.sh
  ===================================================================
  RCS file: /home/cvs/jakarta-alexandria/proposal/gump/gen.sh,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- gen.sh    2001/10/07 15:54:47     1.14
  +++ gen.sh    2001/10/07 21:16:29     1.15
  @@ -123,9 +123,5 @@
     cd ..
   fi
   
  -# Automatic login to each :pserver: cvsroot
  -test -n "$FAIL" || \
  -perl perl/cvslogin.pl work/merge.xml
  -
   test -z "$FAIL" || echo "*** FAILED ***"
   
  
  
  
  1.5       +101 -4    jakarta-alexandria/proposal/gump/java/Module.java
  
  Index: Module.java
  ===================================================================
  RCS file: /home/cvs/jakarta-alexandria/proposal/gump/java/Module.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Module.java       2001/10/07 12:16:00     1.4
  +++ Module.java       2001/10/07 21:16:30     1.5
  @@ -3,17 +3,44 @@
   import org.w3c.dom.Node;
   
   // Java classes
  +import java.io.BufferedReader;
  +import java.io.File;
  +import java.io.FileReader;
  +import java.io.FileWriter;
  +import java.io.PrintWriter;
   import java.util.Enumeration;
  -import java.util.Vector;
   import java.util.Hashtable;
  +import java.util.Vector;
   
   public class Module {
   
       static private Hashtable modules = new Hashtable();
       private Element element;
  +    private Element cvs;
       private String name;
       private String srcdir;
   
  +    private static String cvspass = System.getProperty("user.home")+"/.cvspass";
  +
  +    /** cvspass char conversion data */
  +    private static final char shifts[] = {
  +          0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  +         16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  +        114,120, 53, 79, 96,109, 72,108, 70, 64, 76, 67,116, 74, 68, 87,
  +        111, 52, 75,119, 49, 34, 82, 81, 95, 65,112, 86,118,110,122,105,
  +         41, 57, 83, 43, 46,102, 40, 89, 38,103, 45, 50, 42,123, 91, 35,
  +        125, 55, 54, 66,124,126, 59, 47, 92, 71,115, 78, 88,107,106, 56,
  +         36,121,117,104,101,100, 69, 73, 99, 63, 94, 93, 39, 37, 61, 48,
  +         58,113, 32, 90, 44, 98, 60, 51, 33, 97, 62, 77, 84, 80, 85,223,
  +        225,216,187,166,229,189,222,188,141,249,148,200,184,136,248,190,
  +        199,170,181,204,138,232,218,183,255,234,220,247,213,203,226,193,
  +        174,172,228,252,217,201,131,230,197,211,145,238,161,179,160,212,
  +        207,221,254,173,202,146,224,151,140,196,205,130,135,133,143,246,
  +        192,159,244,239,185,168,215,144,139,165,180,157,147,186,214,176,
  +        227,231,219,169,175,156,206,198,129,164,150,210,154,177,134,127,
  +        182,128,158,208,162,132,167,209,149,241,153,251,237,236,171,195,
  +        243,233,253,240,194,250,191,155,142,137,245,235,163,242,178,152 };
  +
       /**
        * Create a set of Module definitions based on XML nodes.
        * @param moudules list of <module> elements
  @@ -22,6 +49,8 @@
           while (modules.hasMoreElements()) {
               new Module((Element)modules.nextElement());
           }
  +
  +        cvslogin();
       }
   
       /**
  @@ -100,15 +129,24 @@
       }
   
       /**
  -     * Resolves a repository name into a cvsroot.  In the process it also
  -     * decorates the cvs tag with the module name and tag info.
  +     * Resolves a repository name into a cvsroot.  If there are multiple
  +     * cvs entries, first they are combined into a single elemnt.  Then
  +     * the single resulting element (if any) will get decorated with the
  +     * the module name, cvsroot, and password info.
        */
       private void resolveCvsroot() throws Exception {
           Node child=element.getFirstChild();
           for (; child != null; child=child.getNextSibling()) {
               if (! child.getNodeName().equals("cvs")) continue;
  -            Element cvs = (Element) child;
  +            if (cvs == null)  {
  +                cvs = (Element) child;
  +            } else {
  +                Jenny.copyChildren((Element) child, cvs);
  +            }
  +
  +        }
   
  +        if (cvs != null) {
               cvs.setAttribute("srcdir", name);
               if (cvs.getAttributeNode("module") == null) {
                   cvs.setAttribute("module", name);
  @@ -134,4 +172,63 @@
               cvs.setAttribute("password", r.get("password"));
           }
       }
  +
  +
  +    /**
  +     * Add entries to cvspass, as necessary, to simulate logon to 
  +     * cvs repositories accessed as :pserver:.  Note: the .cvspass file
  +     * will not be updated unless there are new entries to add.
  +     */
  +    private static void cvslogin() throws Exception {
  +
  +        Hashtable password = new Hashtable();
  +        File file = new File(cvspass);
  +
  +        // read existing cvsroot entries
  +
  +        if (file.exists()) {
  +            BufferedReader reader = new BufferedReader(new FileReader(file));
  +
  +            for (String line = null; (line=reader.readLine())!=null; ) {
  +                int split = line.indexOf(' ');
  +                password.put(line.substring(0,split), line.substring(split+1));
  +            }
  +    
  +            reader.close();
  +        }
  +
  +        // append new entries
  +
  +        PrintWriter writer = null;
  +
  +        for (Enumeration e=modules.elements(); e.hasMoreElements(); ) {
  +            Element cvs = ((Module) e.nextElement()).cvs;
  +            if (cvs == null) continue;
  +
  +            String cvsroot = cvs.getAttribute("cvsroot");
  +            if (!cvsroot.startsWith(":pserver:")) continue;
  +
  +            if (password.get(cvsroot) == null) {
  +                if (writer == null) {
  +                    writer = new PrintWriter(new FileWriter(cvspass, true));
  +                }
  +                String data = mangle(cvs.getAttribute("password"));
  +                writer.println(cvsroot + " " + data);
  +            }
  +        }
  +
  +        if (writer != null) writer.close();
  +    }
  +
  +    /**
  +     * Encode a password using the same encryption scheme that cvs uses.
  +     */
  +    private static String mangle(String password){
  +        char[] buf = password.toCharArray();
  +        for(int i=0; i<buf.length; i++) {
  +            buf[i] = shifts[buf[i]];
  +        }
  +        return new String(buf);
  +    }
  +
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to