Author: chatellier Date: 2009-10-26 14:48:11 +0000 (Mon, 26 Oct 2009) New Revision: 2687 Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCS.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSSVN.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VetoableActionListener.java isis-fish/trunk/src/test/java/fr/ifremer/isisfish/vcs/VCSSVNTest.java Log: Global VCS improvments. Refactor some config name. Finish some method implementation. Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2009-10-26 14:39:04 UTC (rev 2686) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2009-10-26 14:48:11 UTC (rev 2687) @@ -71,9 +71,7 @@ /** * Config step after init. - * - * Refactored, can't be in enum - * + * * @see org.nuiton.util.ApplicationConfig.Action.Step */ public static final int STEP_AFTER_INIT = 0; @@ -81,8 +79,6 @@ /** * Config step after init vcs. * - * Refactored, can't be in enum - * * @see org.nuiton.util.ApplicationConfig.Action.Step */ public static final int STEP_AFTER_INIT_VCS = 1; @@ -90,8 +86,6 @@ /** * Config step after ui. * - * Refactored, can't be in enum - * * @see org.nuiton.util.ApplicationConfig.Action.Step */ public static final int STEP_AFTER_UI = 2; @@ -99,8 +93,6 @@ /** * Config step before exit. * - * Refactored, can't be in enum - * * @see org.nuiton.util.ApplicationConfig.Action.Step */ public static final int STEP_BEFORE_EXIT = 3; @@ -193,14 +185,6 @@ ////////////////////////////////////////////////// // Methode d'acces aux options ////////////////////////////////////////////////// - - /* - * @see org.nuiton.util.ApplicationConfig#getOption(java.lang.String) - */ - @Override - public String getOption(String key) { - return super.getOption(key); - } /** * Retourne le repertoire racine de toutes les donnees (script, simulation @@ -887,7 +871,7 @@ * * Set it protected to force getOption() call. */ - public static enum Option { + public static enum Option implements OptionDef { COMPILATION_DIRECTORY("compilation.directory", _("isisfish.config.main.compileDirectory.description"), getUserHome() + File.separator + "isis-build"), JAVADOC_DIRECTORY("javadoc.directory", _("isisfish.config.main.javadocDirectory.description"), getUserHome() + File.separator + "isis-docs"), @@ -953,16 +937,13 @@ // can be None, CVS or SVN. only None or SVN work VCS_TYPE(VCS.VCS_TYPE, _("isisfish.config.vcs.type.description"), VCS.TYPE_SVN), // depend of VCS_TYPE, for SVN can be svn, svn+ssh, http or file - VCS_PROTOCOLE(VCS.VCS_PROTOCOLE, _("isisfish.config.vcs.useSshConnexion.description"), "svn"), + VCS_PROTOCOLE(VCS.VCS_PROTOCOL, _("isisfish.config.vcs.useSshConnexion.description"), "svn"), VCS_SSH_KEY_FILE(VCS.VCS_SSH_KEY_FILE, _("isisfish.config.vcs.keyFile.description"), getUserHome() + File.separator + ".ssh" + File.separator + "isis_rsa"), // user login to access vcs VCS_USER_NAME(VCS.VCS_USER_NAME, _("isisfish.config.vcs.userName.description"), ""), VCS_USER_PASSWORD(VCS.VCS_USER_PASSWORD, _("isisfish.config.vcs.userPassword.description"), ""), VCS_HOST_NAME(VCS.VCS_HOST_NAME, _("isisfish.config.vcs.hostName.description"), "labs.libre-entreprise.org"), VCS_PATH(VCS.VCS_PATH, _("isisfish.config.vcs.remotePath.description"), "/svnroot/isis-fish-data/"), - // VCS_TAG(VCS.VCS_TAG, _("isisfish.config.vcs.remoteDatabase.description"), "/trunk"), - // TYPE_REPO_PROPERTY_KEY = newConfigPropertyKey("typeRepo", VCSTypeRepo.class, 9, n_("isisfish.config.vcs.typeRepo.description"), "TAG"), - // PROJECT_NAME_PROPERTY_KEY = newConfigPropertyKey("projectName", String.class, 11, n_("isisfish.config.main.projectName.description"), "Isis-Fish"), USER_NAME("user.name", _("isisfish.config.main.userName.description"), System.getProperty("user.name")), SMTP_SERVER("smtpServer", _("isisfish.config.main.smtpServer.description"), "smtp"), @@ -977,6 +958,54 @@ this.description = description; this.defaultValue = defaultValue; } + + /* + * @see org.nuiton.util.ApplicationConfig.OptionDef#getDefaultValue() + */ + @Override + public String getDefaultValue() { + return defaultValue; + } + + /* + * @see org.nuiton.util.ApplicationConfig.OptionDef#getDescription() + */ + @Override + public String getDescription() { + return description; + } + + /* + * @see org.nuiton.util.ApplicationConfig.OptionDef#getKey() + */ + @Override + public String getKey() { + return key; + } + + /* + * @see org.nuiton.util.ApplicationConfig.OptionDef#getType() + */ + @Override + public Class<?> getType() { + return String.class; + } + + /* + * @see org.nuiton.util.ApplicationConfig.OptionDef#isFinal() + */ + @Override + public boolean isFinal() { + return false; + } + + /* + * @see org.nuiton.util.ApplicationConfig.OptionDef#isTransient() + */ + @Override + public boolean isTransient() { + return false; + } } ////////////////////////////////////////////////// Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCS.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCS.java 2009-10-26 14:39:04 UTC (rev 2686) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCS.java 2009-10-26 14:48:11 UTC (rev 2687) @@ -62,7 +62,7 @@ /** * can be http, ssh, pserver, ... */ - public static final String VCS_PROTOCOLE = "vcs.protocol"; + public static final String VCS_PROTOCOL = "vcs.protocol"; /** * ssh key file Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java 2009-10-26 14:39:04 UTC (rev 2686) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java 2009-10-26 14:48:11 UTC (rev 2687) @@ -30,13 +30,13 @@ import org.apache.commons.logging.LogFactory; /** - * Permet de recupere le bon VCS en fonction de la configuration + * Permet de recupere le bon VCS en fonction de la configuration. * * @author poussin - * @version $Revision: 1.0 $ + * @version $Revision$ * - * Last update : $Date: 1 déc. 2008 $ - * By : $Author: chatellier $ + * Last update : $Date$ + * By : $Author$ */ public class VCSFactory { @@ -46,8 +46,9 @@ private VCSFactory() {} /** - * VCSNone factory, looking for vcs.type key in config to find vcs class to used + * VCSNone factory, looking for vcs.type key in config to find vcs class to used. * If no vcs.type found or is not valid class, use {@link VCSNone}. + * * @param config * @return usable VCSNone */ @@ -57,8 +58,6 @@ aliases.setProperty("", VCSNone.class.getName()); aliases.setProperty(VCS.TYPE_NONE, VCSNone.class.getName()); aliases.setProperty(VCS.TYPE_SVN, VCSSVN.class.getName()); - // FIXME active this line when svn and CVS are implemented -// aliases.setProperty(TYPE_CVS, VCSCVS.class.getName()); VCS result = null; String type = config.getOption(VCS.VCS_TYPE); @@ -66,7 +65,7 @@ String classname = aliases.getProperty(type, type); File dataDir = config.getDatabaseDirectory(); - String protocol = config.getOption(VCS.VCS_PROTOCOLE); + String protocol = config.getOption(VCS.VCS_PROTOCOL); String host = config.getOption(VCS.VCS_HOST_NAME); String path = config.getOption(VCS.VCS_PATH); File sshKeyFile = config.getOptionAsFile(VCS.VCS_SSH_KEY_FILE); @@ -74,12 +73,13 @@ String password = config.getOption(VCS.VCS_USER_PASSWORD); try { - Class clazz = (Class) ConvertUtils.convert(classname, Class.class); + Class<?> clazz = (Class<?>) ConvertUtils.convert(classname, Class.class); result = (VCS) ConstructorUtils.invokeConstructor(clazz, new Object[]{dataDir, protocol, host, path, sshKeyFile, login, password}); } catch (Exception eee) { - log.error(_("Can't instanciate wanted VCS (%s), use default", - config.getOption(VCS.VCS_TYPE)), eee); + if (log.isErrorEnabled()) { + log.error(_("isisfish.vcs.factory.cantinstanciate", type), eee); + } result = new VCSNone(dataDir, protocol, host, path, sshKeyFile, login, password); } return result; Property changes on: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSSVN.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSSVN.java 2009-10-26 14:39:04 UTC (rev 2686) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VCSSVN.java 2009-10-26 14:48:11 UTC (rev 2687) @@ -34,16 +34,21 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.Version; import org.tmatesoft.svn.core.ISVNDirEntryHandler; +import org.tmatesoft.svn.core.ISVNLogEntryHandler; import org.tmatesoft.svn.core.SVNCommitInfo; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNDirEntry; import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNLogEntry; +import org.tmatesoft.svn.core.SVNLogEntryPath; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory; import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; +import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; +import org.tmatesoft.svn.core.wc.ISVNOptions; import org.tmatesoft.svn.core.wc.ISVNStatusHandler; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNCommitClient; @@ -78,11 +83,15 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ protected static Log log = LogFactory.getLog(VCSSVN.class); + /** Connection state. */ protected static enum ConnectionState { NOT_TESTED, OFF_LINE, ON_LINE } + /** Svn client manager instance. */ protected SVNClientManager svnManager = null; + + /** Current connection state. */ protected ConnectionState connectionState = ConnectionState.NOT_TESTED; /** @@ -352,38 +361,16 @@ } /* - * @see fr.ifremer.isisfish.vcs.AbstractVCS#isVersionnableAbleFile(java.io.File) + * @see fr.ifremer.isisfish.vcs.AbstractVCS#isVersionnableFile(java.io.File) */ @Override public boolean isVersionnableFile(File file) { boolean result = super.isVersionnableFile(file); - //result = result && !getSVNManager().getOptions().isIgnored(file); - if (result) { - // if result is true, file start with getLocalRepository().getAbsolutePath() - String fileName = file.getAbsolutePath(); - String fileEnd = fileName.substring(getLocalRepository() - .getAbsolutePath().length()); - - for (String pattern : getSVNManager().getOptions() - .getIgnorePatterns()) { - - String localPattern = pattern.replaceAll("\\.", "\\\\."); - localPattern = localPattern.replaceAll("\\*", ".*"); - - if (fileEnd.matches(localPattern)) { - - if (log.isDebugEnabled()) { - log.debug("file " + file + " match pattern : " - + localPattern + " (svn-ignore:" + pattern - + ")"); - } - - result &= false; - } - } + ISVNOptions svnOptions = getSVNManager().getOptions(); + result &= !DefaultSVNOptions.isIgnored(svnOptions, file.getAbsolutePath()); } return result; @@ -437,24 +424,21 @@ } /** + * Commit without ask for registred listeners. * * @param files files to commit - * @param msg + * @param msg message for commit * @throws VCSException */ protected void commitWithoutCheck(List<File> files, String msg) throws VCSException { try { - // SVNCommitInfo commitInfo = getSVNManager().getCommitClient() - // .doCommit(files.toArray(new File[files.size()]), - // false, // keep lock - // msg, - // false, // force - // true); // recurse - SVNCommitClient commitClient = getSVNManager().getCommitClient(); File[] filesToCommit = files.toArray(new File[files.size()]); + + // warning, SVNDepth.INFINITY is important, mandatory for deletion + SVNCommitInfo commitInfo = commitClient.doCommit(filesToCommit, // paths false, // keepLocks msg, // commitMessage @@ -468,11 +452,20 @@ log.info(_("isisfish.vcs.vcssvn.global.torevision", commitInfo .getNewRevision())); } + + // commitInfo.getNewRevision() == -1 if file with no modification + // is commited } catch (SVNException e) { throw new VCSException(_("isisfish.vcs.vcssvn.commit.error"), e); } } + /** + * Perform : + * - svn add + * - commit + */ + @Override public void add(List<File> files, String msg) throws VCSException { if (!isWriteable()) { throw new VCSException(_("isisfish.vcs.vcssvn.add.errorreadonly")); @@ -483,19 +476,16 @@ for (File file : files) { // FIXME ajoute dans le ignore les fichiers regions/<region>/data/* - // getSVNManager().getWCClient().doAdd(file, - // true, // force add to allready added file (no error) - // false, // don't create dir if not exist - // true, // add parent dir if is not versionned - // false, // no recurse - // false); // don't add ignore file - + // warning, SVNDepth.EMPTY is important + // commit only files specified in {@files}, to not commit + // entiere directory !!! + SVNWCClient wcClient = getSVNManager().getWCClient(); wcClient.doAdd(file, // File path true, // boolean force false, // boolean mkdir true, // boolean climbUnversionedParents - SVNDepth.FILES, // SVNDepth depth + SVNDepth.EMPTY, // SVNDepth depth false, // boolean includeIgnored true); // boolean makeParents } @@ -556,9 +546,10 @@ if (fireAction(VCSActionEvent.DELETE, files.toArray(new File[files .size()]))) { for (File file : files) { - getSVNManager().getWCClient().doDelete(file, true, // force la deletion - true, // delete local file too - false); // is not just a test + getSVNManager().getWCClient().doDelete(file, // path + true, // force + true, // deleteFiles + false); // dryRun } commitWithoutCheck(files, msg); } @@ -743,15 +734,14 @@ */ public Map<File, String> getChanglog(List<File> files) throws VCSException { - throw new UnsupportedOperationException("Not supported yet."); - - /*final Map<File, String> changLog = new HashMap<File, String>(); + final Map<File, String> changLog = new HashMap<File, String>(); try { SVNInfo info = getSVNManager().getWCClient().doInfo(getLocalRepository(), SVNRevision.WORKING); - final String path = info.getURL().getPath(); - + final String repoPath = info.getURL().getPath(); + final String repoRootPath = info.getRepositoryRootURL().getPath(); + // Handler ISVNLogEntryHandler handler = new ISVNLogEntryHandler() { @@ -770,11 +760,14 @@ log.debug("path changed : " + path + " = [" + value.getType() + "] " + logEntry.getMessage()); } - String path2 = SVNPathUtil.getRelativePath(getRemoteRepository(), value.getPath()); - + // handler return url as : + // /isis-fish-data/trunk/scripts/version.txt + // just transform in into + // scripts/version.txt + String relativePath = SVNPathUtil.getRelativePath(repoPath, repoRootPath + path); + // tranform SVNLogEntryPath into file - String realPath = value.getPath().substring(getPath().length()); - File file = new File(getLocalRepository().getAbsoluteFile() + File.separator + realPath); + File file = new File(getLocalRepository().getAbsoluteFile() + File.separator + relativePath); changLog.put(file, logEntry.getMessage()); @@ -798,7 +791,7 @@ throw new VCSException(_("Can't get changlog"), e); } - return changLog; */ + return changLog; } Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VetoableActionListener.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VetoableActionListener.java 2009-10-26 14:39:04 UTC (rev 2686) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/vcs/VetoableActionListener.java 2009-10-26 14:48:11 UTC (rev 2687) @@ -1,5 +1,5 @@ /* - * Copyright (C) 2002-2008 Code Lutin, Benjamin Poussin + * Copyright (C) 2002-2009 Code Lutin, Benjamin Poussin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License Modified: isis-fish/trunk/src/test/java/fr/ifremer/isisfish/vcs/VCSSVNTest.java =================================================================== --- isis-fish/trunk/src/test/java/fr/ifremer/isisfish/vcs/VCSSVNTest.java 2009-10-26 14:39:04 UTC (rev 2686) +++ isis-fish/trunk/src/test/java/fr/ifremer/isisfish/vcs/VCSSVNTest.java 2009-10-26 14:48:11 UTC (rev 2687) @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,7 +33,6 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.tmatesoft.svn.core.SVNCommitInfo; import org.tmatesoft.svn.core.SVNDepth; @@ -47,6 +47,7 @@ import org.tmatesoft.svn.core.wc.SVNWCClient; import fr.ifremer.isisfish.AbstractIsisFishTest; +import fr.ifremer.isisfish.vcs.VCS.Status; /** * Class de test VCS. @@ -205,14 +206,14 @@ } /** - * Test of isVersionnableAbleFile method, of class VCSSVN. + * Test of isVersionnableFile method, of class VCSSVN. */ @Test - public void testIsVersionnableAbleFile() { + public void testIsVersionnableFile() { // log if (log.isInfoEnabled()) { - log.info("testIsVersionnableAbleFile()"); + log.info("testIsVersionnableFile()"); } // un fichier special, on refuse @@ -223,12 +224,12 @@ // Pas dans le repository local, on refuse file = new File("Toto.java"); result = vcs.isVersionnableFile(file); - Assert.assertEquals(false, result); + Assert.assertFalse(result); // enfin un bout fichier :) file = new File(vcs.getLocalRepository(), "Toto.java"); result = vcs.isVersionnableFile(file); - Assert.assertEquals(true, result); + Assert.assertTrue(result); // match pas (svn ignore) file = new File(vcs.getLocalRepository(), "libaudio.la"); @@ -301,7 +302,7 @@ Assert.assertTrue(demo.exists()); // suppression de DemoRegion - vcs.delete(Arrays.asList(demo), "suppression d'une region"); + vcs.delete(Collections.singletonList(demo), "suppression d'une region"); Assert.assertFalse(demo.exists()); // ajout d'un fichier sur le trunk avant passage sur le tag @@ -435,7 +436,7 @@ * @throws SVNException * */ - @Ignore + @Test public void testGetChanglog() throws VCSException, IOException, SVNException { @@ -453,9 +454,6 @@ files.add(firstFile); files.add(secondFile); - Map<File, String> expResult = new HashMap<File, String>(); - expResult.put(new File("ooo"), "eee"); - // first, checkout trunk vcs.checkout(null, true); @@ -476,6 +474,10 @@ SVNDepth.INFINITY); Map<File, String> result = vcs.getChanglog(files); + + Map<File, String> expResult = new HashMap<File, String>(); + expResult.put(firstFile, "mise a jour de la version"); + expResult.put(secondFile, "mise a jour de la version"); Assert.assertEquals(expResult, result); } @@ -1241,4 +1243,35 @@ filesInConflict = vcs.checkFileStatus(); Assert.assertNull(filesInConflict); } + + /** + * Test file local status. + * + * - Checkout + * - make modification + * - tests + * + * @throws VCSException + * @throws SVNException + * @throws IOException + */ + @Test + public void testGetLocalStatus() throws VCSException, SVNException, + IOException { + + // log + if (log.isInfoEnabled()) { + log.info("testGetLocalStatus()"); + } + + // chechout + vcs.checkout(null, false); + + // modif on remote repo + File file = new File(vcs.getLocalRepository(), "scripts" + + File.separator + "version.txt"); + FileUtil.writeString(file, "modified content"); + + Assert.assertEquals(Status.STATUS_MODIFIED, vcs.getLocalStatus(file)); + } } \ No newline at end of file