From 30f9d25d77ccb5cd978d4cf8fa389ec819e90e95 Mon Sep 17 00:00:00 2001 From: Philip L. McMahon <philip.l.mcmahon@gmail.com> Date: Fri, 27 Jan 2012 02:02:19 -0500 Subject: [PATCH] Correct update of HEAD symbolic reference when target is a tag. --- src/com/gitblit/GitBlit.java | 226 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 188 insertions(+), 38 deletions(-) diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java index 835aa13..b6bf7bf 100644 --- a/src/com/gitblit/GitBlit.java +++ b/src/com/gitblit/GitBlit.java @@ -25,13 +25,15 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -67,12 +69,14 @@ import com.gitblit.models.FederationProposal; import com.gitblit.models.FederationSet; import com.gitblit.models.Metric; +import com.gitblit.models.RefModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.ServerSettings; import com.gitblit.models.ServerStatus; import com.gitblit.models.SettingModel; import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; +import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.ByteFormat; import com.gitblit.utils.FederationUtils; import com.gitblit.utils.JGitUtils; @@ -447,8 +451,18 @@ */ public List<String> getAllUsernames() { List<String> names = new ArrayList<String>(userService.getAllUsernames()); - Collections.sort(names); return names; + } + + /** + * Returns the list of all users available to the login service. + * + * @see IUserService.getAllUsernames() + * @return list of all usernames + */ + public List<UserModel> getAllUsers() { + List<UserModel> users = userService.getAllUsers(); + return users; } /** @@ -531,7 +545,17 @@ */ public List<String> getAllTeamnames() { List<String> teams = new ArrayList<String>(userService.getAllTeamNames()); - Collections.sort(teams); + return teams; + } + + /** + * Returns the list of available teams that a user or repository may be + * assigned to. + * + * @return the list of teams + */ + public List<TeamModel> getAllTeams() { + List<TeamModel> teams = userService.getAllTeams(); return teams; } @@ -630,21 +654,38 @@ * @return repository or null */ public Repository getRepository(String repositoryName) { + return getRepository(repositoryName, true); + } + + /** + * Returns the JGit repository for the specified name. + * + * @param repositoryName + * @param logError + * @return repository or null + */ + public Repository getRepository(String repositoryName, boolean logError) { Repository r = null; try { r = repositoryResolver.open(null, repositoryName); } catch (RepositoryNotFoundException e) { r = null; - logger.error("GitBlit.getRepository(String) failed to find " - + new File(repositoriesFolder, repositoryName).getAbsolutePath()); + if (logError) { + logger.error("GitBlit.getRepository(String) failed to find " + + new File(repositoriesFolder, repositoryName).getAbsolutePath()); + } } catch (ServiceNotAuthorizedException e) { r = null; - logger.error("GitBlit.getRepository(String) failed to find " - + new File(repositoriesFolder, repositoryName).getAbsolutePath(), e); + if (logError) { + logger.error("GitBlit.getRepository(String) failed to find " + + new File(repositoriesFolder, repositoryName).getAbsolutePath(), e); + } } catch (ServiceNotEnabledException e) { r = null; - logger.error("GitBlit.getRepository(String) failed to find " - + new File(repositoriesFolder, repositoryName).getAbsolutePath(), e); + if (logError) { + logger.error("GitBlit.getRepository(String) failed to find " + + new File(repositoriesFolder, repositoryName).getAbsolutePath(), e); + } } return r; } @@ -746,6 +787,10 @@ model.mailingLists = new ArrayList<String>(Arrays.asList(config.getStringList( "gitblit", null, "mailingList"))); } + model.defaultHead = JGitUtils.getDefaultHead(r); + model.availableHeads = new ArrayList<RefModel>(); + model.availableHeads.addAll(JGitUtils.getLocalBranches(r, true, -1)); + model.availableHeads.addAll(JGitUtils.getTags(r, true, -1)); r.close(); return model; } @@ -904,6 +949,11 @@ .format("Can not rename repository ''{0}'' to ''{1}'' because ''{1}'' already exists.", repositoryName, repository.name)); } + File parentFile = destFolder.getParentFile(); + if (!parentFile.exists() && !parentFile.mkdirs()) { + throw new GitBlitException(MessageFormat.format( + "Failed to create folder ''{0}''", parentFile.getAbsolutePath())); + } if (!folder.renameTo(destFolder)) { throw new GitBlitException(MessageFormat.format( "Failed to rename repository ''{0}'' to ''{1}''.", repositoryName, @@ -936,6 +986,9 @@ // update settings if (r != null) { updateConfiguration(r, repository); + if (repository.defaultHead != null) { + JGitUtils.setDefaultHead(r, repository.defaultHead.reference); + } r.close(); } } @@ -964,14 +1017,14 @@ config.setString("gitblit", null, "federationStrategy", repository.federationStrategy.name()); config.setBoolean("gitblit", null, "isFederated", repository.isFederated); - if (repository.preReceiveScripts != null) { + if (!ArrayUtils.isEmpty(repository.preReceiveScripts)) { config.setStringList("gitblit", null, "preReceiveScript", repository.preReceiveScripts); } - if (repository.postReceiveScripts != null) { + if (!ArrayUtils.isEmpty(repository.postReceiveScripts)) { config.setStringList("gitblit", null, "postReceiveScript", repository.postReceiveScripts); } - if (repository.mailingLists != null) { + if (!ArrayUtils.isEmpty(repository.mailingLists)) { config.setStringList("gitblit", null, "mailingList", repository.mailingLists); } try { @@ -1226,6 +1279,7 @@ case PULL_TEAMS: return token.equals(all) || token.equals(unr); case PULL_SETTINGS: + case PULL_SCRIPTS: return token.equals(all); } return false; @@ -1438,13 +1492,12 @@ } /** - * Returns the list of all available Groovy push hook scripts that are not - * already specified globally for all repositories. Script files must have + * Returns the list of all Groovy push hook scripts. Script files must have * .groovy extension * * @return list of available hook scripts */ - public List<String> getAvailableScripts() { + public List<String> getAllScripts() { File groovyFolder = getGroovyScriptsFolder(); File[] files = groovyFolder.listFiles(new FileFilter() { @Override @@ -1452,28 +1505,112 @@ return pathname.isFile() && pathname.getName().endsWith(".groovy"); } }); - - Set<String> globals = new HashSet<String>(); - String[] keys = { Keys.groovy.preReceiveScripts, Keys.groovy.postReceiveScripts }; - for (String key : keys) { - for (String script : getStrings(key)) { - if (script.endsWith(".groovy")) { - globals.add(script.substring(0, script.lastIndexOf('.'))); - } else { - globals.add(script); - } - } - } - - // create list of available scripts by excluding scripts that are - // globally specified List<String> scripts = new ArrayList<String>(); if (files != null) { for (File file : files) { String script = file.getName().substring(0, file.getName().lastIndexOf('.')); - if (!globals.contains(script)) { - scripts.add(script); - } + scripts.add(script); + } + } + return scripts; + } + + /** + * Returns the list of pre-receive scripts the repository inherited from the + * global settings and team affiliations. + * + * @param repository + * if null only the globally specified scripts are returned + * @return a list of scripts + */ + public List<String> getPreReceiveScriptsInherited(RepositoryModel repository) { + Set<String> scripts = new LinkedHashSet<String>(); + // Globals + for (String script : getStrings(Keys.groovy.preReceiveScripts)) { + if (script.endsWith(".groovy")) { + scripts.add(script.substring(0, script.lastIndexOf('.'))); + } else { + scripts.add(script); + } + } + + // Team Scripts + if (repository != null) { + for (String teamname : userService.getTeamnamesForRepositoryRole(repository.name)) { + TeamModel team = userService.getTeamModel(teamname); + scripts.addAll(team.preReceiveScripts); + } + } + return new ArrayList<String>(scripts); + } + + /** + * Returns the list of all available Groovy pre-receive push hook scripts + * that are not already inherited by the repository. Script files must have + * .groovy extension + * + * @param repository + * optional parameter + * @return list of available hook scripts + */ + public List<String> getPreReceiveScriptsUnused(RepositoryModel repository) { + Set<String> inherited = new TreeSet<String>(getPreReceiveScriptsInherited(repository)); + + // create list of available scripts by excluding inherited scripts + List<String> scripts = new ArrayList<String>(); + for (String script : getAllScripts()) { + if (!inherited.contains(script)) { + scripts.add(script); + } + } + return scripts; + } + + /** + * Returns the list of post-receive scripts the repository inherited from + * the global settings and team affiliations. + * + * @param repository + * if null only the globally specified scripts are returned + * @return a list of scripts + */ + public List<String> getPostReceiveScriptsInherited(RepositoryModel repository) { + Set<String> scripts = new LinkedHashSet<String>(); + // Global Scripts + for (String script : getStrings(Keys.groovy.postReceiveScripts)) { + if (script.endsWith(".groovy")) { + scripts.add(script.substring(0, script.lastIndexOf('.'))); + } else { + scripts.add(script); + } + } + // Team Scripts + if (repository != null) { + for (String teamname : userService.getTeamnamesForRepositoryRole(repository.name)) { + TeamModel team = userService.getTeamModel(teamname); + scripts.addAll(team.postReceiveScripts); + } + } + return new ArrayList<String>(scripts); + } + + /** + * Returns the list of unused Groovy post-receive push hook scripts that are + * not already inherited by the repository. Script files must have .groovy + * extension + * + * @param repository + * optional parameter + * @return list of available hook scripts + */ + public List<String> getPostReceiveScriptsUnused(RepositoryModel repository) { + Set<String> inherited = new TreeSet<String>(getPostReceiveScriptsInherited(repository)); + + // create list of available scripts by excluding inherited scripts + List<String> scripts = new ArrayList<String>(); + for (String script : getAllScripts()) { + if (!inherited.contains(script)) { + scripts.add(script); } } return scripts; @@ -1505,7 +1642,7 @@ * @param message * @param toAddresses */ - public void sendMail(String subject, String message, ArrayList<String> toAddresses) { + public void sendMail(String subject, String message, Collection<String> toAddresses) { this.sendMail(subject, message, toAddresses.toArray(new String[0])); } @@ -1542,7 +1679,7 @@ setting.currentValue = settings.getString(key, ""); } } - settingsModel.pushScripts = getAvailableScripts(); + settingsModel.pushScripts = getAllScripts(); return settingsModel; } @@ -1630,9 +1767,7 @@ try { // check to see if this "file" is a login service class Class<?> realmClass = Class.forName(realm); - if (IUserService.class.isAssignableFrom(realmClass)) { - loginService = (IUserService) realmClass.newInstance(); - } + loginService = (IUserService) realmClass.newInstance(); } catch (Throwable t) { loginService = new GitblitUserService(); } @@ -1676,6 +1811,21 @@ webxmlSettings.applyOverrides(overrideFile); } configureContext(webxmlSettings, true); + + // Copy the included scripts to the configured groovy folder + File localScripts = getFileOrFolder(Keys.groovy.scriptsFolder, "groovy"); + if (!localScripts.exists()) { + File includedScripts = new File(context.getRealPath("/WEB-INF/groovy")); + if (!includedScripts.equals(localScripts)) { + try { + com.gitblit.utils.FileUtils.copy(localScripts, includedScripts.listFiles()); + } catch (IOException e) { + logger.error(MessageFormat.format( + "Failed to copy included Groovy scripts from {0} to {1}", + includedScripts, localScripts)); + } + } + } } serverStatus.servletContainer = servletContext.getServerInfo(); -- Gitblit v1.9.1