Author: chatellier Date: 2011-06-08 13:03:49 +0000 (Wed, 08 Jun 2011) New Revision: 3370 Log: Add configuration for community VCS Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/IsisConfig.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/IsisFish.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/ui/WelcomeHandler.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/vcs/VCSSVN.java Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/IsisConfig.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2011-06-08 13:02:19 UTC (rev 3369) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2011-06-08 13:03:49 UTC (rev 3370) @@ -206,6 +206,16 @@ File result = getOptionAsFile(Option.DATABASE_DIRECTORY.key); return result; } + + /** + * Retourne le repertoire racine de toutes les donnees communauté (commit utilisateur). + * + * @return community database directory + */ + public File getCommunityDatabaseDirectory() { + File result = getOptionAsFile(Option.COMMUNITY_DATABASE_DIRECTORY.key); + return result; + } /** * Get database directory to use for script. @@ -957,10 +967,10 @@ */ public static enum Option implements OptionDef { + CONFIG_FILE(CONFIG_FILE_NAME, n_("isisfish.config.main.configFileName.description"), CONFIG_FILENAME), COMPILATION_DIRECTORY("compilation.directory", n_("isisfish.config.main.compileDirectory.description"), getUserHome() + File.separator + "isis-build"), MONITORING_DIRECTORY("monitoring.directory", n_("isisfish.config.main.monitoringDirectory.description"), getUserHome() + File.separator + "isis-monitoring"), JAVADOC_DIRECTORY("javadoc.directory", n_("isisfish.config.main.javadocDirectory.description"), getUserHome() + File.separator + "isis-docs"), - CONFIG_FILE(CONFIG_FILE_NAME, n_("isisfish.config.main.configFileName.description"), CONFIG_FILENAME), BACKUP_DIRECTORY("backup.directory", n_("isisfish.config.main.defaultBackupDirectory.description"), getUserHome() + File.separator + "isis-backup"), DEFAULT_EXPORT_NAMES("default.export.names", n_("isisfish.config.main.defaultExportNames.description"), ""), @@ -1002,7 +1012,7 @@ /** Application locale (for i18n init). */ LOCALE("locale", n_("isisfish.config.main.locale.description"), "fr_FR"), SIMULATION_SHOW_ONLY_ERROR("simulationShowOnlyError", n_("isisfish.config.main.simulationShowOnlyError.description"), "false"), - + /** Perform ui launch option. */ LAUNCH_UI("launch.ui", n_("isisfish.config.main.launchUI.description"), "true"), /** Perform data migration option. */ @@ -1011,32 +1021,35 @@ PERFORM_VCS_UPDATE("perform.vcsupdate", n_("isisfish.config.main.performvcsupdate.description"), "true"), /** Perform cron option. */ PERFORM_CRON("perform.cron", n_("isisfish.config.main.performcron.description"), "true"), - - /** Database directory. */ - DATABASE_DIRECTORY("database.directory", n_("isisfish.config.vcs.localDatabasePath.description"), getUserHome() + File.separator + "isis-database-3"), + /** Database lock mode (h2).*/ DATABASE_LOCK_MODE("database.lockmode", n_("isisfish.config.database.lockmode.description"), "file"), - + // SSH (global, for both VCS and caparmor) SSH_KEY_FILE("ssh.key.file", n_("isisfish.config.ssh.key.file.description"), getUserHome() + File.separator + ".ssh" + File.separator + "isis_rsa"), - //SSH_PASSPHRASE_ENABLED("ssh.passphrase.enabled", _("isisfish.config.vcs.noPassPhrase.description"), "false"), - //SSH_PASSPHRASE("ssh.passphrase", _("isisfish.config.vcs.passphrase.description"), ""), - // can be None, CVS or SVN. only None or SVN work + DATABASE_DIRECTORY("database.directory", n_("isisfish.config.vcs.localDatabasePath.description"), getUserHome() + File.separator + "isis-database-3"), VCS_TYPE(VCS.VCS_TYPE, n_("isisfish.config.vcs.type.description"), VCS.TYPE_SVN), - // depend of VCS_TYPE, for SVN can be svn, svn+ssh, http or file - VCS_PROTOCOL(VCS.VCS_PROTOCOL, n_("isisfish.config.vcs.useSshConnexion.description"), "svn"), - - // user login to access vcs + VCS_PROTOCOL(VCS.VCS_PROTOCOL, n_("isisfish.config.vcs.protocol.description"), "svn"), VCS_USER_NAME(VCS.VCS_USER_NAME, n_("isisfish.config.vcs.userName.description"), ""), VCS_USER_PASSWORD(VCS.VCS_USER_PASSWORD, n_("isisfish.config.vcs.userPassword.description"), ""), VCS_HOST_NAME(VCS.VCS_HOST_NAME, n_("isisfish.config.vcs.hostName.description"), "labs.libre-entreprise.org"), VCS_PATH(VCS.VCS_PATH, n_("isisfish.config.vcs.remotePath.description"), "/svnroot/isis-fish-data/"), + // community vsc + COMMUNITY_DATABASE_DIRECTORY("community.database.directory", n_("isisfish.config.vcs.localCommunityDatabasePath.description"), getUserHome() + File.separator + "isis-community-database-3"), + VCS_COMMUNITY_TYPE("vcs.community.type", n_("isisfish.config.vcs.community.type.description"), VCS.TYPE_SVN), + VCS_COMMUNITY_PROTOCOL("vcs.community.protocole", n_("isisfish.config.vcs.community.protocol.description"), "http"), + VCS_COMMUNITY_USER_NAME("vcs.community.username", n_("isisfish.config.vcs.community.username.description"), ""), + VCS_COMMUNITY_PASSWORD("vcs.community.password", n_("isisfish.config.vcs.community.password.description"), ""), + VCS_COMMUNITY_HOST_NAME("vcs.community.hostname", n_("isisfish.config.vcs.community.hostname.description"), "www.isis-fish.org"), + VCS_COMMUNITY_PATH("vcs.community.path", n_("isisfish.config.vcs.community.remotepath.description"), "/svn/isis-fish-community/"), + + // misc options USER_NAME("user.name", n_("isisfish.config.main.userName.description"), System.getProperty("user.name")), SMTP_SERVER("smtpServer", n_("isisfish.config.main.smtpServer.description"), "smtp"), USER_MAIL("userMail", n_("isisfish.config.main.userMail.description"), USER_NAME.key + "@" + VCS_HOST_NAME.key); - + public String key; public String description; public String defaultValue; Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/IsisFish.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/IsisFish.java 2011-06-08 13:02:19 UTC (rev 3369) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/IsisFish.java 2011-06-08 13:03:49 UTC (rev 3370) @@ -112,6 +112,8 @@ static public IsisConfig config = null; static public VCS vcs = null; + + static public VCS communityVcs = null; /** * ask for application quit @@ -141,6 +143,7 @@ // static vcs init (needed for some actions) try { initVCS(); + initCommunityVCS(); } catch (Exception eee) { log.warn(_("Error during vcs initialisation"), eee); } @@ -151,8 +154,6 @@ // after init vcs and local data config.doAction(IsisConfig.STEP_AFTER_INIT_VCS); - - doNuitonMigration(); launchUI(); @@ -174,82 +175,6 @@ } /** - * Move user script to nuiton dependants packages. - * - * Find all files containing "org.codelutin." into "org.nuiton." - */ - protected static void doNuitonMigration() { - if (config.isPerformMigration()) { - // Search in a set of directories - // Searching throw simulations/* can take a huge time... - File[] folders = new File[]{ - AnalysePlanStorage.getAnalysePlanDirectory(), - ExportStorage.getExportDirectory(), - FormuleStorage.getFormuleDirectory(), - RuleStorage.getRuleDirectory(), - ScriptStorage.getScriptDirectory(), - SensitivityStorage.getSensitivityDirectory(), - SensitivityExportStorage.getSensitivityExportDirectory(), - SimulatorStorage.getSimulatorDirectory() - }; - - try { - Map<File, List<CharSequence>> filesToMigrate = new HashMap<File, List<CharSequence>>(); - for (File folder : folders) { - filesToMigrate.putAll(FileUtil.grep("org\\.codelutin\\.", folder, ".*\\.java", "ISO-8859-1")); - } - - if (!filesToMigrate.isEmpty()) { - - // yes by defaut (for tests) - // but ask user if UI launch - boolean migrationOption = true; - if (IsisFish.config.isLaunchUI()) { - // display a user frame - String migratedFiles = ""; - String separator = ""; - for (File fileToMigrate : filesToMigrate.keySet()) { - migratedFiles += separator + fileToMigrate.toString(); - separator = "\n"; - } - JLabel labelModifiedFiles = new JLabel(_("isisfish.misc.nuitonmigration")); - JTextArea areaModifiedFiles = new JTextArea(migratedFiles); - areaModifiedFiles.setEditable(false); - areaModifiedFiles.setAutoscrolls(true); - JScrollPane sp = new JScrollPane(areaModifiedFiles); - sp.setPreferredSize(new Dimension(500, 100)); // don't remove popup is huge - migrationOption = ask(new Component[] { labelModifiedFiles, sp} ); - } - - // if migration has to be done - if (migrationOption) { - if (log.isInfoEnabled()) { - log.info("Starting nuiton.org migration for user scripts :"); - } - - for (File fileToMigrate : filesToMigrate.keySet()) { - if (log.isInfoEnabled()) { - log.info(" migrate file : " + fileToMigrate.getAbsolutePath()); - } - FileUtil.sed("org\\.codelutin\\.", "org.nuiton.", fileToMigrate, "ISO-8859-1"); - } - } - } - } - catch(IOException eee) { - if (log.isErrorEnabled()) { - log.error("Can't to nuiton migration", eee); - } - } - } - else { - if (log.isInfoEnabled()) { - log.info(_("Skip data migration (disabled)")); - } - } - } - - /** * Install "Nimbus" LookAndFeel if available. * * @throws InstantiationException @@ -297,6 +222,7 @@ // i18n is not inited here if (log.isInfoEnabled()) { log.info("Starting Isis-Fish with args : " + java.util.Arrays.toString(args)); + log.info("Isis Version: " + IsisConfig.getVersion()); log.info("Date: " + SimpleDateFormat.getInstance().format(new java.util.Date())); log.info("Java version: " + System.getProperty("java.runtime.version")); log.info("Java VM: " + System.getProperty("java.vm.name")); @@ -385,16 +311,6 @@ } /** - * Switch le vcs vers VCSNone et le sauvegarde pour le prochain lancement - */ - protected static void switchToNoneVCS() { - log.info(_("Switch repository type to none")); - config.setOption(IsisConfig.Option.VCS_TYPE.key, VCS.TYPE_NONE); - config.saveForUser(); - vcs = VCSFactory.createVCS(config); - } - - /** * Initialise le VCS et check s'il y a des mises à jour pour * prevenir l'utilisateur. * @@ -436,7 +352,10 @@ "Can't rename local repository that don't use svn"); } } else { - switchToNoneVCS(); + log.info(_("Switch repository type to none")); + config.setOption(IsisConfig.Option.VCS_TYPE.key, VCS.TYPE_NONE); + config.saveForUser(); + vcs = VCSFactory.createVCS(config); } } } @@ -447,8 +366,7 @@ log.info(_("Local repository don't exist")); } if (!vcs.isConnected()) { - ErrorHelper.showErrorDialog(_( - "isisfish.vcs.init.notfoundcantdownload", + ErrorHelper.showErrorDialog(_("isisfish.vcs.init.notfoundcantdownload", IsisConfig.getApiVersion()), null); } else { // Si on utilise pas le bon tag on change de tag @@ -540,11 +458,94 @@ else { // VCS can't be null // set none if ui isn't launched - config.setOption(VCS.VCS_TYPE, "none"); // to make him happy + config.setOption(VCS.VCS_TYPE, VCS.TYPE_NONE); // to make him happy vcs = VCSFactory.createVCS(config); } } + + /** + * Initialise le VCS et check s'il y a des mises à jour pour + * prevenir l'utilisateur. + * + * @throws VCSException + */ + static public void initCommunityVCS() throws VCSException { + // vcs must be done is ui is enabled too + if (config.isLaunchUI() && config.isPerformVcsUpdate()) { + + // init vcs + // in graphical mode, real VCS + communityVcs = VCSFactory.createPublicVCS(config); + + VCSActionAsker asker = new VCSActionAsker(); + communityVcs.addVetoableActionListener(asker); + + // Si le repo local exist mais n'est pas du bon type, on renome ce repertoire + File local = config.getCommunityDatabaseDirectory(); + + if (local.exists()) { + if (!communityVcs.isValidLocalRepository()) { + if (log.isInfoEnabled()) { + log.info(_("Local repository exists but it's not valide for current vcs: %s", + config.getOption(VCS.VCS_TYPE))); + } + if (ask(_("isisfish.vcs.init.wrongprotocol", local))) { + File localBackup = new File(local.getParentFile(), + local.getName() + "-" + + new SimpleDateFormat("yyyy-mm-dd-HH-mm-ss").format(new java.util.Date())); + if (log.isInfoEnabled()) { + log.info(_("Rename data directory to %s", localBackup)); + } + if (!local.renameTo(localBackup)) { + throw new IsisFishRuntimeException( + "Can't rename local repository that don't use svn"); + } + } else { + log.info(_("Switch repository type to none")); + config.setOption(IsisConfig.Option.VCS_COMMUNITY_TYPE.key, VCS.TYPE_NONE); + config.saveForUser(); + communityVcs = VCSFactory.createPublicVCS(config); + } + } + } + + // Si le repo local n'existe pas on fait un check out complet + if (!local.exists()) { + if (log.isInfoEnabled()) { + log.info(_("Local repository don't exist")); + } + if (!communityVcs.isConnected()) { + ErrorHelper.showErrorDialog(_("isisfish.vcs.init.notfoundcantdownload", + "trunk"), null); + } else { + // initialise le repo local + communityVcs.checkout(null, true); + } + } + + // on s'arrete la si on est pas connecte + if (communityVcs.isConnected()) { + + // cleanup + communityVcs.cleanup(null); + + // check protocol, user, host + communityVcs.checkProtocol(); + + } + + // fin de l'init on supprime le vetoable du vcs + communityVcs.remoteVetoableActionListener(asker); + } + else { + // VCS can't be null + // set none if ui isn't launched + config.setOption(IsisConfig.Option.VCS_COMMUNITY_TYPE.key, VCS.TYPE_NONE); // to make him happy + communityVcs = VCSFactory.createPublicVCS(config); + } + } + /** * Display dialog with files list, and specifique label. * @@ -625,8 +626,6 @@ // init IsisTray IsisTray.getInstance(); - //initRSyntaxJavaSupport(config); - // configure swing session // can't be in config ? getUserConfigDirectory() not static File isisConfigDirectory = new File(config.getUserConfigDirectory(), "isis-fish"); Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/ui/WelcomeHandler.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/ui/WelcomeHandler.java 2011-06-08 13:02:19 UTC (rev 3369) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/ui/WelcomeHandler.java 2011-06-08 13:03:49 UTC (rev 3370) @@ -202,7 +202,7 @@ } /** - * Show config frame (Jaxx based). + * Show config frame. * * @param welcomeUI parent ui */ @@ -213,6 +213,7 @@ modelBuilder.addCategory(_("isisfish.config.category.main"), _("isisfish.config.category.main.description")); modelBuilder.addOption(IsisConfig.Option.CONFIG_FILE); modelBuilder.addOption(IsisConfig.Option.DATABASE_DIRECTORY); + modelBuilder.addOption(IsisConfig.Option.COMMUNITY_DATABASE_DIRECTORY); modelBuilder.addOption(IsisConfig.Option.COMPILATION_DIRECTORY); modelBuilder.addOption(IsisConfig.Option.MONITORING_DIRECTORY); modelBuilder.addOption(IsisConfig.Option.JAVADOC_DIRECTORY); @@ -220,15 +221,24 @@ modelBuilder.addOption(IsisConfig.Option.LOCALE); modelBuilder.addOption(IsisConfig.Option.SIMULATION_SHOW_ONLY_ERROR); - // category control - modelBuilder.addCategory(_("isisfish.config.category.versioning"), _("isisfish.config.category.versioning.description")); + // category database vcs + modelBuilder.addCategory(_("isisfish.config.category.officialvcs"), _("isisfish.config.category.officialvcs.description")); modelBuilder.addOption(IsisConfig.Option.VCS_TYPE); modelBuilder.addOption(IsisConfig.Option.VCS_PROTOCOL); + modelBuilder.addOption(IsisConfig.Option.VCS_HOST_NAME); + modelBuilder.addOption(IsisConfig.Option.VCS_PATH); modelBuilder.addOption(IsisConfig.Option.VCS_USER_NAME); modelBuilder.addOption(IsisConfig.Option.VCS_USER_PASSWORD); - modelBuilder.addOption(IsisConfig.Option.VCS_HOST_NAME); - modelBuilder.addOption(IsisConfig.Option.VCS_PATH); + // category community vcs + modelBuilder.addCategory(_("isisfish.config.category.communityvcs"), _("isisfish.config.category.communityvcs.description")); + modelBuilder.addOption(IsisConfig.Option.VCS_COMMUNITY_TYPE); + modelBuilder.addOption(IsisConfig.Option.VCS_COMMUNITY_PROTOCOL); + modelBuilder.addOption(IsisConfig.Option.VCS_COMMUNITY_HOST_NAME); + modelBuilder.addOption(IsisConfig.Option.VCS_COMMUNITY_PATH); + modelBuilder.addOption(IsisConfig.Option.VCS_COMMUNITY_USER_NAME); + modelBuilder.addOption(IsisConfig.Option.VCS_COMMUNITY_PASSWORD); + // category misc modelBuilder.addCategory(_("isisfish.config.category.misc"), _("isisfish.config.category.misc.description")); modelBuilder.addOption(IsisConfig.Option.SSH_KEY_FILE); Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java 2011-06-08 13:02:19 UTC (rev 3369) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/vcs/VCSFactory.java 2011-06-08 13:03:49 UTC (rev 3370) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2002 - 2010 Ifremer, Code Lutin, Benjamin Poussin + * Copyright (C) 2002 - 2011 Ifremer, Code Lutin, Benjamin Poussin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -49,26 +49,29 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ private static Log log = LogFactory.getLog(VCSFactory.class); - private VCSFactory() {} + protected static final Properties TYPE_ALIASES = new Properties(); + static { + TYPE_ALIASES.setProperty("", VCSNone.class.getName()); + TYPE_ALIASES.setProperty(VCS.TYPE_NONE, VCSNone.class.getName()); + TYPE_ALIASES.setProperty(VCS.TYPE_SVN, VCSSVN.class.getName()); + } + + private VCSFactory() { + + } + /** - * VCSNone factory, looking for vcs.type key in config to find vcs class to used. + * VCS 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 + * @param config config + * @return usable VCS */ static public VCS createVCS(IsisConfig config) { - Properties aliases = new Properties(); - // for empty and TYPE_NONE we used this class - aliases.setProperty("", VCSNone.class.getName()); - aliases.setProperty(VCS.TYPE_NONE, VCSNone.class.getName()); - aliases.setProperty(VCS.TYPE_SVN, VCSSVN.class.getName()); - - VCS result = null; String type = config.getOption(VCS.VCS_TYPE); // try to convert if type is not class name but an alias - String classname = aliases.getProperty(type, type); + String classname = TYPE_ALIASES.getProperty(type, type); File dataDir = config.getDatabaseDirectory(); String protocol = config.getOption(VCS.VCS_PROTOCOL); @@ -78,13 +81,56 @@ String login = config.getOption(VCS.VCS_USER_NAME); String password = config.getOption(VCS.VCS_USER_PASSWORD); + VCS result = makeVCSInstance(classname, dataDir, protocol, host, path, sshKeyFile, login, password); + return result; + } + + /** + * Create VCS to manage community VCS repository. + * + * @param config config + * @return usable VCS + */ + static public VCS createPublicVCS(IsisConfig config) { + String type = config.getOption(IsisConfig.Option.VCS_COMMUNITY_TYPE.key); + // try to convert if type is not class name but an alias + String classname = TYPE_ALIASES.getProperty(type, type); + + File dataDir = config.getCommunityDatabaseDirectory(); + String protocol = config.getOption(IsisConfig.Option.VCS_COMMUNITY_PROTOCOL.key); + String host = config.getOption(IsisConfig.Option.VCS_COMMUNITY_HOST_NAME.key); + String path = config.getOption(IsisConfig.Option.VCS_COMMUNITY_PATH.key); + File sshKeyFile = config.getSSHPrivateKeyFilePath(); + String login = config.getOption(IsisConfig.Option.VCS_COMMUNITY_USER_NAME.key); + String password = config.getOption(IsisConfig.Option.VCS_COMMUNITY_PASSWORD.key); + + VCS result = makeVCSInstance(classname, dataDir, protocol, host, path, sshKeyFile, login, password); + return result; + } + + /** + * Make CSV instance. + * + * @param classname class name + * @param dataDir root data dir + * @param protocol protocol + * @param host host + * @param path path + * @param sshKeyFile ssh key file + * @param login login + * @param password password + * @return CSV instance + */ + static protected VCS makeVCSInstance(String classname, File dataDir, String protocol, + String host, String path, File sshKeyFile, String login, String password) { + VCS result = null; 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) { if (log.isErrorEnabled()) { - log.error(_("isisfish.vcs.factory.cantinstanciate", type), eee); + log.error(_("isisfish.vcs.factory.cantinstanciate", classname), eee); } result = new VCSNone(dataDir, protocol, host, path, sshKeyFile, login, password); } Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/vcs/VCSSVN.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/vcs/VCSSVN.java 2011-06-08 13:02:19 UTC (rev 3369) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/vcs/VCSSVN.java 2011-06-08 13:03:49 UTC (rev 3370) @@ -168,7 +168,7 @@ passphrase = SSHAgent.getAgent().getPassphrase(sshKeyFile); } catch(InvalidPassphraseException e) { - if(log.isWarnEnabled()) { + if (log.isWarnEnabled()) { log.warn("Can't get passphrase for key", e); } } @@ -283,8 +283,7 @@ || !url.getHost().equals(newUrl.getHost())) { if (fireAction(VCSActionEvent.SWITCH_PROTOCOL)) { if (log.isInfoEnabled()) { - log.info(_( - "isisfish.vcs.vcssvn.checkProtocol.relocate", + log.info(_("isisfish.vcs.vcssvn.checkProtocol.relocate", localRoot, url, newUrl)); }