From b799d545f37f7123aaa1ee1d0ff3b61f1f3cc8c2 Mon Sep 17 00:00:00 2001
From: David Ostrovsky <david@ostrovsky.org>
Date: Thu, 10 Apr 2014 18:58:08 -0400
Subject: [PATCH] Add review SSH command

---
 src/main/java/com/gitblit/GitBlit.java |  203 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 203 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index da80a74..a15bed8 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -19,12 +19,14 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.inject.Singleton;
 import javax.servlet.http.HttpServletRequest;
 
 import com.gitblit.Constants.AccessPermission;
 import com.gitblit.manager.GitblitManager;
 import com.gitblit.manager.IAuthenticationManager;
 import com.gitblit.manager.IFederationManager;
+import com.gitblit.manager.IGitblit;
 import com.gitblit.manager.INotificationManager;
 import com.gitblit.manager.IProjectManager;
 import com.gitblit.manager.IRepositoryManager;
@@ -34,7 +36,16 @@
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.RepositoryUrl;
 import com.gitblit.models.UserModel;
+import com.gitblit.tickets.BranchTicketService;
+import com.gitblit.tickets.FileTicketService;
+import com.gitblit.tickets.ITicketService;
+import com.gitblit.tickets.NullTicketService;
+import com.gitblit.tickets.RedisTicketService;
 import com.gitblit.utils.StringUtils;
+
+import dagger.Module;
+import dagger.ObjectGraph;
+import dagger.Provides;
 
 /**
  * GitBlit is the aggregate manager for the Gitblit webapp.  It provides all
@@ -45,7 +56,11 @@
  */
 public class GitBlit extends GitblitManager {
 
+	private final ObjectGraph injector;
+
 	private final ServicesManager servicesManager;
+
+	private ITicketService ticketService;
 
 	public GitBlit(
 			IRuntimeManager runtimeManager,
@@ -64,6 +79,8 @@
 				projectManager,
 				federationManager);
 
+		this.injector = ObjectGraph.create(getModules());
+
 		this.servicesManager = new ServicesManager(this);
 	}
 
@@ -72,6 +89,7 @@
 		super.start();
 		logger.info("Starting services manager...");
 		servicesManager.start();
+		configureTicketService();
 		return this;
 	}
 
@@ -79,7 +97,12 @@
 	public GitBlit stop() {
 		super.stop();
 		servicesManager.stop();
+		ticketService.stop();
 		return this;
+	}
+
+	protected Object [] getModules() {
+		return new Object [] { new GitBlitModule()};
 	}
 
 	/**
@@ -98,11 +121,21 @@
 		String username = StringUtils.encodeUsername(UserModel.ANONYMOUS.equals(user) ? "" : user.username);
 
 		List<RepositoryUrl> list = new ArrayList<RepositoryUrl>();
+
 		// http/https url
 		if (settings.getBoolean(Keys.git.enableGitServlet, true)) {
 			AccessPermission permission = user.getRepositoryPermission(repository).permission;
 			if (permission.exceeds(AccessPermission.NONE)) {
 				list.add(new RepositoryUrl(getRepositoryUrl(request, username, repository), permission));
+			}
+		}
+
+		// ssh daemon url
+		String sshDaemonUrl = servicesManager.getSshDaemonUrl(request, user, repository);
+		if (!StringUtils.isEmpty(sshDaemonUrl)) {
+			AccessPermission permission = servicesManager.getSshDaemonAccessPermission(user, repository);
+			if (permission.exceeds(AccessPermission.NONE)) {
+				list.add(new RepositoryUrl(sshDaemonUrl, permission));
 			}
 		}
 
@@ -131,4 +164,174 @@
 		}
 		return list;
 	}
+
+	/**
+	 * Detect renames and reindex as appropriate.
+	 */
+	@Override
+	public void updateRepositoryModel(String repositoryName, RepositoryModel repository,
+			boolean isCreate) throws GitBlitException {
+		RepositoryModel oldModel = null;
+		boolean isRename = !isCreate && !repositoryName.equalsIgnoreCase(repository.name);
+		if (isRename) {
+			oldModel = repositoryManager.getRepositoryModel(repositoryName);
+		}
+
+		super.updateRepositoryModel(repositoryName, repository, isCreate);
+
+		if (isRename && ticketService != null) {
+			ticketService.rename(oldModel, repository);
+		}
+	}
+
+	/**
+	 * Delete the repository and all associated tickets.
+	 */
+	@Override
+	public boolean deleteRepository(String repositoryName) {
+		RepositoryModel repository = repositoryManager.getRepositoryModel(repositoryName);
+		return deleteRepositoryModel(repository);
+	}
+
+	@Override
+	public boolean deleteRepositoryModel(RepositoryModel model) {
+		boolean success = repositoryManager.deleteRepositoryModel(model);
+		if (success && ticketService != null) {
+			return ticketService.deleteAll(model);
+		}
+		return success;
+	}
+
+	/**
+	 * Returns the configured ticket service.
+	 *
+	 * @return a ticket service
+	 */
+	@Override
+	public ITicketService getTicketService() {
+		return ticketService;
+	}
+
+	protected void configureTicketService() {
+		String clazz = settings.getString(Keys.tickets.service, NullTicketService.class.getName());
+		if (StringUtils.isEmpty(clazz)) {
+			clazz = NullTicketService.class.getName();
+		}
+		try {
+			Class<? extends ITicketService> serviceClass = (Class<? extends ITicketService>) Class.forName(clazz);
+			ticketService = injector.get(serviceClass).start();
+			if (ticketService instanceof NullTicketService) {
+				logger.warn("No ticket service configured.");
+			} else if (ticketService.isReady()) {
+				logger.info("{} is ready.", ticketService);
+			} else {
+				logger.warn("{} is disabled.", ticketService);
+			}
+		} catch (Exception e) {
+			logger.error("failed to create ticket service " + clazz, e);
+			ticketService = injector.get(NullTicketService.class).start();
+		}
+	}
+
+	/**
+	 * A nested Dagger graph is used for constructor dependency injection of
+	 * complex classes.
+	 *
+	 * @author James Moger
+	 *
+	 */
+	@Module(
+			library = true,
+			injects = {
+					IStoredSettings.class,
+
+					// core managers
+					IRuntimeManager.class,
+					INotificationManager.class,
+					IUserManager.class,
+					IAuthenticationManager.class,
+					IRepositoryManager.class,
+					IProjectManager.class,
+					IFederationManager.class,
+
+					// the monolithic manager
+					IGitblit.class,
+
+					// ticket services
+					NullTicketService.class,
+					FileTicketService.class,
+					BranchTicketService.class,
+					RedisTicketService.class
+			}
+			)
+	class GitBlitModule {
+
+		@Provides @Singleton IStoredSettings provideSettings() {
+			return settings;
+		}
+
+		@Provides @Singleton IRuntimeManager provideRuntimeManager() {
+			return runtimeManager;
+		}
+
+		@Provides @Singleton INotificationManager provideNotificationManager() {
+			return notificationManager;
+		}
+
+		@Provides @Singleton IUserManager provideUserManager() {
+			return userManager;
+		}
+
+		@Provides @Singleton IAuthenticationManager provideAuthenticationManager() {
+			return authenticationManager;
+		}
+
+		@Provides @Singleton IRepositoryManager provideRepositoryManager() {
+			return repositoryManager;
+		}
+
+		@Provides @Singleton IProjectManager provideProjectManager() {
+			return projectManager;
+		}
+
+		@Provides @Singleton IFederationManager provideFederationManager() {
+			return federationManager;
+		}
+
+		@Provides @Singleton IGitblit provideGitblit() {
+			return GitBlit.this;
+		}
+
+		@Provides @Singleton NullTicketService provideNullTicketService() {
+			return new NullTicketService(
+					runtimeManager,
+					notificationManager,
+					userManager,
+					repositoryManager);
+		}
+
+		@Provides @Singleton FileTicketService provideFileTicketService() {
+			return new FileTicketService(
+					runtimeManager,
+					notificationManager,
+					userManager,
+					repositoryManager);
+		}
+
+		@Provides @Singleton BranchTicketService provideBranchTicketService() {
+			return new BranchTicketService(
+					runtimeManager,
+					notificationManager,
+					userManager,
+					repositoryManager);
+		}
+
+		@Provides @Singleton RedisTicketService provideRedisTicketService() {
+			return new RedisTicketService(
+					runtimeManager,
+					notificationManager,
+					userManager,
+					repositoryManager);
+		}
+	}
 }

--
Gitblit v1.9.1