From f76fee63ed9cb3a30d3c0c092d860b1cb93a481b Mon Sep 17 00:00:00 2001 From: Gerard Smyth <gerard.smyth@gmail.com> Date: Thu, 08 May 2014 13:09:30 -0400 Subject: [PATCH] Updated the SyndicationServlet to provide an additional option to return details of the tags in the repository instead of the commits. This uses a new 'ot' request parameter to indicate the object type of the content to return, which can be ither TAG or COMMIT. If this is not provided, then COMMIT is assumed to maintain backwards compatability. If tags are returned, then the paging parameters, 'l' and 'pg' are still supported, but searching options are currently ignored. --- src/main/java/com/gitblit/manager/GitblitManager.java | 229 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 208 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gitblit/manager/GitblitManager.java b/src/main/java/com/gitblit/manager/GitblitManager.java index 9d096dd..2782e72 100644 --- a/src/main/java/com/gitblit/manager/GitblitManager.java +++ b/src/main/java/com/gitblit/manager/GitblitManager.java @@ -27,15 +27,25 @@ import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.TimeZone; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.api.CloneCommand; +import org.eclipse.jgit.api.FetchCommand; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.transport.RefSpec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + +import ro.fortsoft.pf4j.PluginState; +import ro.fortsoft.pf4j.PluginWrapper; +import ro.fortsoft.pf4j.Version; import com.gitblit.Constants; import com.gitblit.Constants.AccessPermission; @@ -50,7 +60,11 @@ import com.gitblit.models.FederationSet; import com.gitblit.models.ForkModel; import com.gitblit.models.GitClientApplication; +import com.gitblit.models.Mailing; import com.gitblit.models.Metric; +import com.gitblit.models.PluginRegistry.InstallState; +import com.gitblit.models.PluginRegistry.PluginRegistration; +import com.gitblit.models.PluginRegistry.PluginRelease; import com.gitblit.models.ProjectModel; import com.gitblit.models.RegistrantAccessPermission; import com.gitblit.models.RepositoryModel; @@ -61,9 +75,11 @@ import com.gitblit.models.SettingModel; import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; +import com.gitblit.tickets.ITicketService; +import com.gitblit.transport.ssh.IPublicKeyManager; +import com.gitblit.transport.ssh.SshKey; import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.HttpUtils; -import com.gitblit.utils.JGitUtils; import com.gitblit.utils.JsonUtils; import com.gitblit.utils.ObjectCache; import com.gitblit.utils.StringUtils; @@ -94,11 +110,15 @@ protected final IRuntimeManager runtimeManager; + protected final IPluginManager pluginManager; + protected final INotificationManager notificationManager; protected final IUserManager userManager; protected final IAuthenticationManager authenticationManager; + + protected final IPublicKeyManager publicKeyManager; protected final IRepositoryManager repositoryManager; @@ -108,18 +128,22 @@ public GitblitManager( IRuntimeManager runtimeManager, + IPluginManager pluginManager, INotificationManager notificationManager, IUserManager userManager, IAuthenticationManager authenticationManager, + IPublicKeyManager publicKeyManager, IRepositoryManager repositoryManager, IProjectManager projectManager, IFederationManager federationManager) { this.settings = runtimeManager.getSettings(); this.runtimeManager = runtimeManager; + this.pluginManager = pluginManager; this.notificationManager = notificationManager; this.userManager = userManager; this.authenticationManager = authenticationManager; + this.publicKeyManager = publicKeyManager; this.repositoryManager = repositoryManager; this.projectManager = projectManager; this.federationManager = federationManager; @@ -157,7 +181,33 @@ // clone the repository try { - JGitUtils.cloneRepository(repositoryManager.getRepositoriesFolder(), cloneName, fromUrl, true, null); + Repository canonical = getRepository(repository.name); + File folder = new File(repositoryManager.getRepositoriesFolder(), cloneName); + CloneCommand clone = new CloneCommand(); + clone.setBare(true); + + // fetch branches with exclusions + Collection<Ref> branches = canonical.getRefDatabase().getRefs(Constants.R_HEADS).values(); + List<String> branchesToClone = new ArrayList<String>(); + for (Ref branch : branches) { + String name = branch.getName(); + if (name.startsWith(Constants.R_TICKET)) { + // exclude ticket branches + continue; + } + branchesToClone.add(name); + } + clone.setBranchesToClone(branchesToClone); + clone.setURI(fromUrl); + clone.setDirectory(folder); + Git git = clone.call(); + + // fetch tags + FetchCommand fetch = git.fetch(); + fetch.setRefSpecs(new RefSpec("+refs/tags/*:refs/tags/*")); + fetch.call(); + + git.getRepository().close(); } catch (Exception e) { throw new GitBlitException(e); } @@ -290,6 +340,9 @@ repositoryManager.updateRepositoryModel(model.name, model, false); } } + + // rename the user's ssh public keystore + getPublicKeyManager().renameUser(username, user.username); } if (!userManager.updateUserModel(username, user)) { throw new GitBlitException("Failed to update user!"); @@ -389,7 +442,7 @@ // no user definitions, use system definitions if (!clientApplications.hasCurrent("system", new Date(0))) { try { - InputStream is = getClass().getResourceAsStream("/clientapps.json"); + InputStream is = GitblitManager.class.getResourceAsStream("/clientapps.json"); Collection<GitClientApplication> clients = readClientApplications(is); is.close(); if (clients != null) { @@ -431,7 +484,7 @@ // Read bundled Gitblit properties to extract setting descriptions. // This copy is pristine and only used for populating the setting // models map. - InputStream is = getClass().getResourceAsStream("/reference.properties"); + InputStream is = GitblitManager.class.getResourceAsStream("/reference.properties"); BufferedReader propertiesReader = new BufferedReader(new InputStreamReader(is)); StringBuilder description = new StringBuilder(); SettingModel setting = new SettingModel(); @@ -480,6 +533,20 @@ } catch (IOException e) { logger.error("Failed to load resource copy of gitblit.properties"); } + } + + /** + * Throws an exception if trying to get a ticket service. + * + */ + @Override + public ITicketService getTicketService() { + throw new RuntimeException("This class does not have a ticket service!"); + } + + @Override + public IPublicKeyManager getPublicKeyManager() { + return publicKeyManager; } /* @@ -540,6 +607,11 @@ } @Override + public Locale getLocale() { + return runtimeManager.getLocale(); + } + + @Override public boolean isDebugMode() { return runtimeManager.isDebugMode(); } @@ -584,28 +656,13 @@ } @Override - public void sendMail(String subject, String message, String... toAddresses) { - notificationManager.sendMail(subject, message, toAddresses); - } - - @Override public void sendHtmlMail(String subject, String message, Collection<String> toAddresses) { notificationManager.sendHtmlMail(subject, message, toAddresses); } @Override - public void sendHtmlMail(String subject, String message, String... toAddresses) { - notificationManager.sendHtmlMail(subject, message, toAddresses); - } - - @Override - public void sendHtmlMail(String from, String subject, String message, Collection<String> toAddresses) { - notificationManager.sendHtmlMail(from, subject, message, toAddresses); - } - - @Override - public void sendHtmlMail(String from, String subject, String message, String... toAddresses) { - notificationManager.sendHtmlMail(from, subject, message, toAddresses); + public void send(Mailing mail) { + notificationManager.send(mail); } /* @@ -625,6 +682,12 @@ } return user; } + + @Override + public UserModel authenticate(String username, SshKey key) { + return authenticationManager.authenticate(username, key); + } + @Override public UserModel authenticate(HttpServletRequest httpRequest, boolean requiresCertificate) { UserModel user = authenticationManager.authenticate(httpRequest, requiresCertificate); @@ -863,6 +926,11 @@ @Override public void resetRepositoryListCache() { repositoryManager.resetRepositoryListCache(); + } + + @Override + public void resetRepositoryCache(String repositoryName) { + repositoryManager.resetRepositoryCache(repositoryName); } @Override @@ -1113,4 +1181,123 @@ public boolean deletePendingFederationProposal(FederationProposal proposal) { return federationManager.deletePendingFederationProposal(proposal); } + + @Override + public void closeAll() { + repositoryManager.closeAll(); + } + + @Override + public void close(String repository) { + repositoryManager.close(repository); + } + + @Override + public boolean isIdle(Repository repository) { + return repositoryManager.isIdle(repository); + } + + /* + * PLUGIN MANAGER + */ + + @Override + public Version getSystemVersion() { + return pluginManager.getSystemVersion(); + } + + @Override + public void startPlugins() { + pluginManager.startPlugins(); + } + + @Override + public void stopPlugins() { + pluginManager.stopPlugins(); + } + + @Override + public List<PluginWrapper> getPlugins() { + return pluginManager.getPlugins(); + } + + @Override + public PluginWrapper getPlugin(String pluginId) { + return pluginManager.getPlugin(pluginId); + } + + @Override + public List<Class<?>> getExtensionClasses(String pluginId) { + return pluginManager.getExtensionClasses(pluginId); + } + + @Override + public <T> List<T> getExtensions(Class<T> clazz) { + return pluginManager.getExtensions(clazz); + } + + @Override + public PluginWrapper whichPlugin(Class<?> clazz) { + return pluginManager.whichPlugin(clazz); + } + + @Override + public PluginState startPlugin(String pluginId) { + return pluginManager.startPlugin(pluginId); + } + + @Override + public PluginState stopPlugin(String pluginId) { + return pluginManager.stopPlugin(pluginId); + } + + @Override + public boolean disablePlugin(String pluginId) { + return pluginManager.disablePlugin(pluginId); + } + + @Override + public boolean enablePlugin(String pluginId) { + return pluginManager.enablePlugin(pluginId); + } + + @Override + public boolean uninstallPlugin(String pluginId) { + return pluginManager.uninstallPlugin(pluginId); + } + + @Override + public boolean refreshRegistry(boolean verifyChecksum) { + return pluginManager.refreshRegistry(verifyChecksum); + } + + @Override + public boolean installPlugin(String url, boolean verifyChecksum) throws IOException { + return pluginManager.installPlugin(url, verifyChecksum); + } + + @Override + public boolean upgradePlugin(String pluginId, String url, boolean verifyChecksum) throws IOException { + return pluginManager.upgradePlugin(pluginId, url, verifyChecksum); + } + + @Override + public List<PluginRegistration> getRegisteredPlugins() { + return pluginManager.getRegisteredPlugins(); + } + + @Override + public List<PluginRegistration> getRegisteredPlugins(InstallState state) { + return pluginManager.getRegisteredPlugins(state); + } + + @Override + public PluginRegistration lookupPlugin(String pluginId) { + return pluginManager.lookupPlugin(pluginId); + } + + @Override + public PluginRelease lookupRelease(String pluginId, String version) { + return pluginManager.lookupRelease(pluginId, version); + } } -- Gitblit v1.9.1