diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgImportHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgImportHandler.java new file mode 100644 index 0000000000..6960ab43e5 --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgImportHandler.java @@ -0,0 +1,151 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.repository; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.io.INIConfiguration; +import sonia.scm.io.INIConfigurationReader; +import sonia.scm.io.INIConfigurationWriter; +import sonia.scm.io.INISection; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +public class HgImportHandler extends AbstactImportHandler +{ + + /** Field description */ + public static final String HG_DIR = ".hg"; + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param handler + */ + public HgImportHandler(HgRepositoryHandler handler) + { + this.handler = handler; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param repositoryDirectory + * @param repositoryName + * + * @return + * + * @throws IOException + * @throws RepositoryException + */ + @Override + protected Repository createRepository(File repositoryDirectory, + String repositoryName) + throws IOException, RepositoryException + { + Repository repository = super.createRepository(repositoryDirectory, + repositoryName); + File hgrc = new File(repositoryDirectory, HgRepositoryHandler.PATH_HGRC); + + if (hgrc.exists()) + { + INIConfigurationReader reader = new INIConfigurationReader(); + INIConfiguration c = reader.read(hgrc); + INISection web = c.getSection("web"); + + if (web == null) + { + handler.appendWebSection(c); + } + else + { + repository.setDescription(web.getParameter("description")); + repository.setContact(web.getParameter("contact")); + handler.setWebParameter(web); + } + + INIConfigurationWriter writer = new INIConfigurationWriter(); + + writer.write(c, hgrc); + } + else + { + handler.postCreate(repository, repositoryDirectory); + } + + return repository; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + @Override + protected String[] getDirectoryNames() + { + return new String[] { HG_DIR }; + } + + /** + * Method description + * + * + * @return + */ + @Override + protected AbstractRepositoryHandler getRepositoryHandler() + { + return handler; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private HgRepositoryHandler handler; +} diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java index 3d14f27c0f..9bbdc4f044 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java @@ -293,6 +293,18 @@ public class HgRepositoryHandler return diffViewer; } + /** + * Method description + * + * + * @return + */ + @Override + public ImportHandler getImportHandler() + { + return new HgImportHandler(this); + } + /** * Method description * @@ -320,6 +332,72 @@ public class HgRepositoryHandler return TYPE; } + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param hgrc + */ + void appendHookSection(INIConfiguration hgrc) + { + INISection hooksSection = new INISection("hooks"); + + setHookParameter(hooksSection); + hgrc.addSection(hooksSection); + } + + /** + * Method description + * + * + * @param hgrc + */ + void appendWebSection(INIConfiguration hgrc) + { + INISection webSection = new INISection("web"); + + setWebParameter(webSection); + hgrc.addSection(webSection); + } + + /** + * Method description + * + * + * @param c + * @param repositoryName + * + * @return + */ + boolean registerMissingHook(INIConfiguration c, String repositoryName) + { + INISection hooks = c.getSection("hooks"); + + if (hooks == null) + { + hooks = new INISection("hooks"); + c.addSection(hooks); + } + + boolean write = false; + + if (appendHook(repositoryName, hooks, "changegroup.scm")) + { + write = true; + } + + if (appendHook(repositoryName, hooks, "pretxnchangegroup.scm")) + { + write = true; + } + + return write; + } + + //~--- get methods ---------------------------------------------------------- + /** * Method description * @@ -341,6 +419,34 @@ public class HgRepositoryHandler hgContextProvider.get(), repositoryDirectory); } + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param hooksSection + */ + void setHookParameter(INISection hooksSection) + { + hooksSection.setParameter("changegroup.scm", "python:scmhooks.callback"); + hooksSection.setParameter("pretxnchangegroup.scm", + "python:scmhooks.callback"); + } + + /** + * Method description + * + * + * @param webSection + */ + void setWebParameter(INISection webSection) + { + webSection.setParameter("push_ssl", "false"); + webSection.setParameter("allow_read", "*"); + webSection.setParameter("allow_push", "*"); + } + //~--- methods -------------------------------------------------------------- /** @@ -376,20 +482,11 @@ public class HgRepositoryHandler { File hgrcFile = new File(directory, PATH_HGRC); INIConfiguration hgrc = new INIConfiguration(); - INISection webSection = new INISection("web"); - webSection.setParameter("push_ssl", "false"); - webSection.setParameter("allow_read", "*"); - webSection.setParameter("allow_push", "*"); - hgrc.addSection(webSection); + appendWebSection(hgrc); // register hooks - INISection hooksSection = new INISection("hooks"); - - hooksSection.setParameter("changegroup.scm", "python:scmhooks.callback"); - hooksSection.setParameter("pretxnchangegroup.scm", - "python:scmhooks.callback"); - hgrc.addSection(hooksSection); + appendHookSection(hgrc); INIConfigurationWriter writer = new INIConfigurationWriter(); @@ -483,28 +580,9 @@ public class HgRepositoryHandler { INIConfigurationReader reader = new INIConfigurationReader(); INIConfiguration c = reader.read(hgrc); - INISection hooks = c.getSection("hooks"); - - if (hooks == null) - { - hooks = new INISection("hooks"); - c.addSection(hooks); - } - String repositoryName = repositoryDir.getName(); - boolean write = false; - if (appendHook(repositoryName, hooks, "changegroup.scm")) - { - write = true; - } - - if (appendHook(repositoryName, hooks, "pretxnchangegroup.scm")) - { - write = true; - } - - if (write) + if (registerMissingHook(c, repositoryName)) { if (logger.isDebugEnabled()) {