From eecaad8b8e2c447429c31a01d49260ddd6b4ee03 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Sat, 16 Apr 2016 17:35:32 -0400
Subject: [PATCH] Proof of concept #1026

---
 src/main/java/com/gitblit/manager/IRepositoryManager.java |   91 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 89 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/gitblit/manager/IRepositoryManager.java b/src/main/java/com/gitblit/manager/IRepositoryManager.java
index 383ca0d..f37612d 100644
--- a/src/main/java/com/gitblit/manager/IRepositoryManager.java
+++ b/src/main/java/com/gitblit/manager/IRepositoryManager.java
@@ -30,13 +30,14 @@
 import com.gitblit.models.SearchResult;
 import com.gitblit.models.UserModel;
 
-public interface IRepositoryManager {
+public interface IRepositoryManager extends IManager {
 
 	/**
 	 * Returns the path of the repositories folder. This method checks to see if
 	 * Gitblit is running on a cloud service and may return an adjusted path.
 	 *
 	 * @return the repositories folder path
+ 	 * @since 1.4.0
 	 */
 	File getRepositoriesFolder();
 
@@ -45,6 +46,7 @@
 	 * Gitblit is running on a cloud service and may return an adjusted path.
 	 *
 	 * @return the Groovy hook scripts folder path
+ 	 * @since 1.4.0
 	 */
 	File getHooksFolder();
 
@@ -53,6 +55,7 @@
 	 * Gitblit is running on a cloud service and may return an adjusted path.
 	 *
 	 * @return the Groovy grapes folder path
+ 	 * @since 1.4.0
 	 */
 	File getGrapesFolder();
 
@@ -60,6 +63,7 @@
 	 * Returns the most recent change date of any repository served by Gitblit.
 	 *
 	 * @return a date
+ 	 * @since 1.4.0
 	 */
 	Date getLastActivityDate();
 
@@ -69,6 +73,7 @@
 	 *
 	 * @param user
 	 * @return the effective list of permissions for the user
+ 	 * @since 1.4.0
 	 */
 	List<RegistrantAccessPermission> getUserAccessPermissions(UserModel user);
 
@@ -79,6 +84,7 @@
 	 *
 	 * @param repository
 	 * @return a list of RegistrantAccessPermissions
+ 	 * @since 1.4.0
 	 */
 	List<RegistrantAccessPermission> getUserAccessPermissions(RepositoryModel repository);
 
@@ -88,6 +94,7 @@
 	 * @param repository
 	 * @param permissions
 	 * @return true if the user models have been updated
+ 	 * @since 1.4.0
 	 */
 	boolean setUserAccessPermissions(RepositoryModel repository, Collection<RegistrantAccessPermission> permissions);
 
@@ -98,6 +105,7 @@
 	 * @see IUserService.getUsernamesForRepositoryRole(String)
 	 * @param repository
 	 * @return list of all usernames that have an access permission for the repository
+ 	 * @since 1.4.0
 	 */
 	List<String> getRepositoryUsers(RepositoryModel repository);
 
@@ -108,6 +116,7 @@
 	 *
 	 * @param repository
 	 * @return a list of RegistrantAccessPermissions
+ 	 * @since 1.4.0
 	 */
 	List<RegistrantAccessPermission> getTeamAccessPermissions(RepositoryModel repository);
 
@@ -117,6 +126,7 @@
 	 * @param repository
 	 * @param permissions
 	 * @return true if the team models have been updated
+ 	 * @since 1.4.0
 	 */
 	boolean setTeamAccessPermissions(RepositoryModel repository, Collection<RegistrantAccessPermission> permissions);
 
@@ -127,6 +137,7 @@
 	 * @see IUserService.getTeamnamesForRepositoryRole(String)
 	 * @param repository
 	 * @return list of all teamnames with explicit access permissions to the repository
+ 	 * @since 1.4.0
 	 */
 	List<String> getRepositoryTeams(RepositoryModel repository);
 
@@ -135,20 +146,32 @@
 	 * configured to cache the repository list.
 	 *
 	 * @param model
+ 	 * @since 1.4.0
 	 */
 	void addToCachedRepositoryList(RepositoryModel model);
 
 	/**
 	 * Resets the repository list cache.
 	 *
+ 	 * @since 1.4.0
+	 *
 	 */
 	void resetRepositoryListCache();
+
+	/**
+	 * Reset all caches for this repository.
+	 *
+	 * @param repositoryName
+	 * @since 1.5.1
+	 */
+	void resetRepositoryCache(String repositoryName);
 
 	/**
 	 * Returns the list of all repositories available to Gitblit. This method
 	 * does not consider user access permissions.
 	 *
 	 * @return list of all repositories
+ 	 * @since 1.4.0
 	 */
 	List<String> getRepositoryList();
 
@@ -157,6 +180,7 @@
 	 *
 	 * @param repositoryName
 	 * @return repository or null
+ 	 * @since 1.4.0
 	 */
 	Repository getRepository(String repositoryName);
 
@@ -166,14 +190,24 @@
 	 * @param repositoryName
 	 * @param logError
 	 * @return repository or null
+ 	 * @since 1.4.0
 	 */
 	Repository getRepository(String repositoryName, boolean logError);
+
+	/**
+	 * Returns the list of all repository models.
+	 *
+	 * @return list of all repository models
+ 	 * @since 1.6.1
+	 */
+	List<RepositoryModel> getRepositoryModels();
 
 	/**
 	 * Returns the list of repository models that are accessible to the user.
 	 *
 	 * @param user
 	 * @return list of repository models accessible to user
+ 	 * @since 1.4.0
 	 */
 	List<RepositoryModel> getRepositoryModels(UserModel user);
 
@@ -184,6 +218,7 @@
 	 * @param user
 	 * @param repositoryName
 	 * @return repository model or null
+ 	 * @since 1.4.0
 	 */
 	RepositoryModel getRepositoryModel(UserModel user, String repositoryName);
 
@@ -193,6 +228,7 @@
 	 *
 	 * @param repositoryName
 	 * @return repository model or null
+ 	 * @since 1.4.0
 	 */
 	RepositoryModel getRepositoryModel(String repositoryName);
 
@@ -201,6 +237,7 @@
 	 *
 	 * @param repository
 	 * @return the star count
+ 	 * @since 1.4.0
 	 */
 	long getStarCount(RepositoryModel repository);
 
@@ -209,6 +246,7 @@
 	 *
 	 * @param n
 	 * @return true if the repository exists
+ 	 * @since 1.4.0
 	 */
 	boolean hasRepository(String repositoryName);
 
@@ -218,6 +256,7 @@
 	 * @param n
 	 * @param caseInsensitive
 	 * @return true if the repository exists
+ 	 * @since 1.4.0
 	 */
 	boolean hasRepository(String repositoryName, boolean caseSensitiveCheck);
 
@@ -228,6 +267,7 @@
 	 * @param username
 	 * @param origin
 	 * @return true the if the user has a fork
+ 	 * @since 1.4.0
 	 */
 	boolean hasFork(String username, String origin);
 
@@ -238,6 +278,7 @@
 	 * @param username
 	 * @param origin
 	 * @return the name of the user's fork, null otherwise
+ 	 * @since 1.4.0
 	 */
 	String getFork(String username, String origin);
 
@@ -247,6 +288,7 @@
 	 *
 	 * @param repository
 	 * @return a ForkModel
+ 	 * @since 1.4.0
 	 */
 	ForkModel getForkNetwork(String repository);
 
@@ -258,6 +300,7 @@
 	 *
 	 * @param model
 	 * @return size in bytes of the repository
+ 	 * @since 1.4.0
 	 */
 	long updateLastChangeFields(Repository r, RepositoryModel model);
 
@@ -270,6 +313,7 @@
 	 * @param model
 	 * @param repository
 	 * @return a new array list of metrics
+ 	 * @since 1.4.0
 	 */
 	List<Metric> getRepositoryDefaultMetrics(RepositoryModel model, Repository repository);
 
@@ -286,6 +330,7 @@
 	 * @param repository
 	 * @param isCreate
 	 * @throws GitBlitException
+ 	 * @since 1.4.0
 	 */
 	void updateRepositoryModel(String repositoryName, RepositoryModel repository, boolean isCreate)
 			throws GitBlitException;
@@ -297,8 +342,18 @@
 	 *            the Git repository
 	 * @param repository
 	 *            the Gitblit repository model
+ 	 * @since 1.4.0
 	 */
 	void updateConfiguration(Repository r, RepositoryModel repository);
+
+	/**
+	 * Returns true if the repository can be deleted.
+	 *
+	 * @param model
+	 * @return true if the repository can be deleted
+	 * @since 1.6.0
+	 */
+	boolean canDelete(RepositoryModel model);
 
 	/**
 	 * Deletes the repository from the file system and removes the repository
@@ -306,6 +361,7 @@
 	 *
 	 * @param model
 	 * @return true if successful
+ 	 * @since 1.4.0
 	 */
 	boolean deleteRepositoryModel(RepositoryModel model);
 
@@ -315,6 +371,7 @@
 	 *
 	 * @param repositoryName
 	 * @return true if successful
+ 	 * @since 1.4.0
 	 */
 	boolean deleteRepository(String repositoryName);
 
@@ -323,6 +380,7 @@
 	 * .groovy extension
 	 *
 	 * @return list of available hook scripts
+ 	 * @since 1.4.0
 	 */
 	List<String> getAllScripts();
 
@@ -333,6 +391,7 @@
 	 * @param repository
 	 *            if null only the globally specified scripts are returned
 	 * @return a list of scripts
+ 	 * @since 1.4.0
 	 */
 	List<String> getPreReceiveScriptsInherited(RepositoryModel repository);
 
@@ -344,6 +403,7 @@
 	 * @param repository
 	 *            optional parameter
 	 * @return list of available hook scripts
+ 	 * @since 1.4.0
 	 */
 	List<String> getPreReceiveScriptsUnused(RepositoryModel repository);
 
@@ -354,6 +414,7 @@
 	 * @param repository
 	 *            if null only the globally specified scripts are returned
 	 * @return a list of scripts
+ 	 * @since 1.4.0
 	 */
 	List<String> getPostReceiveScriptsInherited(RepositoryModel repository);
 
@@ -365,6 +426,7 @@
 	 * @param repository
 	 *            optional parameter
 	 * @return list of available hook scripts
+ 	 * @since 1.4.0
 	 */
 	List<String> getPostReceiveScriptsUnused(RepositoryModel repository);
 
@@ -375,13 +437,15 @@
 	 * @param page
 	 * @param pageSize
 	 * @param repositories
-	 * @return
+	 * @return a list of search results
+ 	 * @since 1.4.0
 	 */
 	List<SearchResult> search(String query, int page, int pageSize, List<String> repositories);
 
 	/**
 	 *
 	 * @return true if we are running the gc executor
+ 	 * @since 1.4.0
 	 */
 	boolean isCollectingGarbage();
 
@@ -390,7 +454,30 @@
 	 *
 	 * @param repositoryName
 	 * @return true if actively collecting garbage
+ 	 * @since 1.4.0
 	 */
 	boolean isCollectingGarbage(String repositoryName);
 
+	/**
+	 * Ensures that all cached repositories are completely closed and their resources
+	 * are properly released.
+ 	 * @since 1.4.0
+	 */
+	void closeAll();
+
+	/**
+	 * Ensures that a cached repository is completely closed and it's resources
+	 * are properly released.
+ 	 * @since 1.4.0
+	 */
+	void close(String repository);
+
+	/**
+	 * Returns true if the repository is idle (not being accessed).
+	 *
+	 * @param repository
+	 * @return true if the repository is idle
+ 	 * @since 1.4.0
+	 */
+	boolean isIdle(Repository repository);
 }
\ No newline at end of file

--
Gitblit v1.9.1