Sebastian Sdorra avatar Sebastian Sdorra committed 244b462

fix repository create issue with directory structures

Comments (0)

Files changed (1)

scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java

   /** Field description */
   public static final String DIRECTORY_REPOSITORY = "repositories";
 
+  /** Field description */
+  public static final String DOT = ".";
+
   /** the logger for AbstractSimpleRepositoryHandler */
   private static final Logger logger =
     LoggerFactory.getLogger(AbstractSimpleRepositoryHandler.class);
       throw new RepositoryAllreadyExistExeption();
     }
 
+    checkPath(directory);
     fileSystem.create(directory);
     create(repository, directory);
     postCreate(repository, directory);
   protected void postCreate(Repository repository, File directory)
           throws IOException, RepositoryException {}
 
+  //~--- get methods ----------------------------------------------------------
+
+  /**
+   * Returns true if the directory is a repository.
+   *
+   *
+   * @param directory directory to check
+   *
+   * @return true if the directory is a repository
+   * @since 1.9
+   */
+  protected boolean isRepository(File directory)
+  {
+    return new File(directory, DOT.concat(getType().getName())).exists();
+  }
+
+  //~--- methods --------------------------------------------------------------
+
+  /**
+   * Check path for existing repositories
+   *
+   *
+   * @param directory repository target directory
+   *
+   * @throws RepositoryAllreadyExistExeption
+   */
+  private void checkPath(File directory) throws RepositoryAllreadyExistExeption
+  {
+    File repositoryDirectory = config.getRepositoryDirectory();
+    File parent = directory.getParentFile();
+
+    while ((parent != null) && ! repositoryDirectory.equals(parent))
+    {
+      if (isRepository(parent))
+      {
+        throw new RepositoryAllreadyExistExeption();
+      }
+
+      parent = parent.getParentFile();
+    }
+  }
+
   //~--- fields ---------------------------------------------------------------
 
   /** Field description */
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.