James Moger
2012-01-05 cb285cbfddfc0b633d6b8cdb4dc0d2bd2b8b51ef
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;
@@ -73,6 +75,7 @@
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 +450,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 +544,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;
   }
@@ -743,8 +766,8 @@
               "gitblit", null, "preReceiveScript")));
         model.postReceiveScripts = new ArrayList<String>(Arrays.asList(config.getStringList(
               "gitblit", null, "postReceiveScript")));
         model.mailRecipients = new ArrayList<String>(Arrays.asList(config.getStringList(
               "gitblit", null, "mailRecipient")));
         model.mailingLists = new ArrayList<String>(Arrays.asList(config.getStringList(
               "gitblit", null, "mailingList")));
      }
      r.close();
      return model;
@@ -904,6 +927,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,
@@ -964,15 +992,15 @@
      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.mailRecipients != null) {
         config.setStringList("gitblit", null, "mailRecipient", repository.mailRecipients);
      if (!ArrayUtils.isEmpty(repository.mailingLists)) {
         config.setStringList("gitblit", null, "mailingList", repository.mailingLists);
      }
      try {
         config.save();
@@ -1226,6 +1254,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 +1467,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 +1480,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;
@@ -1485,7 +1597,7 @@
    * @param subject
    * @param message
    */
   public void sendEmailToAdministrators(String subject, String message) {
   public void sendMailToAdministrators(String subject, String message) {
      try {
         Message mail = mailExecutor.createMessageForAdministrators();
         if (mail != null) {
@@ -1505,8 +1617,8 @@
    * @param message
    * @param toAddresses
    */
   public void sendEmail(String subject, String message, ArrayList<String> toAddresses) {
      this.sendEmail(subject, message, toAddresses.toArray(new String[0]));
   public void sendMail(String subject, String message, Collection<String> toAddresses) {
      this.sendMail(subject, message, toAddresses.toArray(new String[0]));
   }
   /**
@@ -1516,7 +1628,7 @@
    * @param message
    * @param toAddresses
    */
   public void sendEmail(String subject, String message, String... toAddresses) {
   public void sendMail(String subject, String message, String... toAddresses) {
      try {
         Message mail = mailExecutor.createMessage(toAddresses);
         if (mail != null) {
@@ -1542,7 +1654,7 @@
            setting.currentValue = settings.getString(key, "");
         }
      }
      settingsModel.pushScripts = getAvailableScripts();
      settingsModel.pushScripts = getAllScripts();
      return settingsModel;
   }
@@ -1634,11 +1746,7 @@
            loginService = (IUserService) realmClass.newInstance();
         }
      } catch (Throwable t) {
         loginService = new UserServiceWrapper() {
            @Override
            public void setupService(IStoredSettings settings) {
            }
         };
         loginService = new GitblitUserService();
      }
      setUserService(loginService);
      mailExecutor = new MailExecutor(settings);