James Moger
2012-10-13 c658df9e87d65b08d5482cf04489cb0532ff83dd
src/com/gitblit/GitBlit.java
@@ -69,6 +69,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.AccessRestrictionType;
import com.gitblit.Constants.AuthorizationControl;
import com.gitblit.Constants.FederationRequest;
@@ -618,6 +619,7 @@
    * @param usernames
    * @return true if successful
    */
   @Deprecated
   public boolean setRepositoryUsers(RepositoryModel repository, List<String> repositoryUsers) {
      return userService.setUsernamesForRepositoryRole(repository.name, repositoryUsers);
   }
@@ -639,6 +641,22 @@
            throw new GitBlitException(MessageFormat.format(
                  "Failed to rename ''{0}'' because ''{1}'' already exists.", username,
                  user.username));
         }
         // rename repositories and owner fields for all repositories
         for (RepositoryModel model : getRepositoryModels(user)) {
            if (model.isUsersPersonalRepository(username)) {
               // personal repository
               model.owner = user.username;
               String oldRepositoryName = model.name;
               model.name = "~" + user.username + model.name.substring(model.projectPath.length());
               model.projectPath = "~" + user.username;
               updateRepositoryModel(oldRepositoryName, model, false);
            } else if (model.isOwner(username)) {
               // common/shared repo
               model.owner = user.username;
               updateRepositoryModel(model.name, model, false);
            }
         }
      }
      if (!userService.updateUserModel(username, user)) {
@@ -699,6 +717,7 @@
    * @param teamnames
    * @return true if successful
    */
   @Deprecated
   public boolean setRepositoryTeams(RepositoryModel repository, List<String> repositoryTeams) {
      return userService.setTeamnamesForRepositoryRole(repository.name, repositoryTeams);
   }
@@ -957,14 +976,13 @@
      if (model == null) {
         return null;
      }
      if (model.accessRestriction.atLeast(AccessRestrictionType.VIEW)) {
         if (user != null && user.canAccessRepository(model)) {
            return model;
         }
         return null;
      } else {
      if (user == null) {
         user = UserModel.ANONYMOUS;
      }
      if (user.canView(model)) {
         return model;
      }
      return null;
   }
   /**
@@ -1224,11 +1242,7 @@
      }
      model.hasCommits = JGitUtils.hasCommits(r);
      model.lastChange = JGitUtils.getLastChange(r);
      if (repositoryName.indexOf('/') == -1) {
         model.projectPath = "";
      } else {
         model.projectPath = repositoryName.substring(0, repositoryName.indexOf('/'));
      }
      model.projectPath = StringUtils.getFirstPathElement(repositoryName);
      
      StoredConfig config = r.getConfig();
      boolean hasOrigin = !StringUtils.isEmpty(config.getString("remote", "origin", "url"));
@@ -1243,6 +1257,7 @@
               "accessRestriction", settings.getString(Keys.git.defaultAccessRestriction, null)));
         model.authorizationControl = AuthorizationControl.fromName(getConfig(config,
               "authorizationControl", settings.getString(Keys.git.defaultAuthorizationControl, null)));
         model.verifyCommitter = getConfig(config, "verifyCommitter", false);
         model.showRemoteBranches = getConfig(config, "showRemoteBranches", hasOrigin);
         model.isFrozen = getConfig(config, "isFrozen", false);
         model.showReadme = getConfig(config, "showReadme", false);
@@ -1449,6 +1464,9 @@
    */
   private void closeRepository(String repositoryName) {
      Repository repository = getRepository(repositoryName);
      if (repository == null) {
         return;
      }
      RepositoryCache.close(repository);
      // assume 2 uses in case reflection fails
@@ -1547,6 +1565,13 @@
   public void updateRepositoryModel(String repositoryName, RepositoryModel repository,
         boolean isCreate) throws GitBlitException {
      Repository r = null;
      String projectPath = StringUtils.getFirstPathElement(repository.name);
      if (!StringUtils.isEmpty(projectPath)) {
         if (projectPath.equalsIgnoreCase(getString(Keys.web.repositoryRootGroupName, "main"))) {
            // strip leading group name
            repository.name = repository.name.substring(projectPath.length() + 1);
         }
      }
      if (isCreate) {
         // ensure created repository name ends with .git
         if (!repository.name.toLowerCase().endsWith(org.eclipse.jgit.lib.Constants.DOT_GIT_EXT)) {
@@ -1674,6 +1699,7 @@
      config.setBoolean(Constants.CONFIG_GITBLIT, null, "allowForks", repository.allowForks);
      config.setString(Constants.CONFIG_GITBLIT, null, "accessRestriction", repository.accessRestriction.name());
      config.setString(Constants.CONFIG_GITBLIT, null, "authorizationControl", repository.authorizationControl.name());
      config.setBoolean(Constants.CONFIG_GITBLIT, null, "verifyCommitter", repository.verifyCommitter);
      config.setBoolean(Constants.CONFIG_GITBLIT, null, "showRemoteBranches", repository.showRemoteBranches);
      config.setBoolean(Constants.CONFIG_GITBLIT, null, "isFrozen", repository.isFrozen);
      config.setBoolean(Constants.CONFIG_GITBLIT, null, "showReadme", repository.showReadme);
@@ -1749,7 +1775,7 @@
         clearRepositoryMetadataCache(repositoryName);
         
         RepositoryModel model = removeFromCachedRepositoryList(repositoryName);
         if (!ArrayUtils.isEmpty(model.forks)) {
         if (model != null && !ArrayUtils.isEmpty(model.forks)) {
            resetRepositoryListCache();
         }
@@ -2639,27 +2665,47 @@
      // create a Gitblit repository model for the clone
      RepositoryModel cloneModel = repository.cloneAs(cloneName);
      // owner has REWIND/RW+ permissions
      cloneModel.owner = user.username;
      updateRepositoryModel(cloneName, cloneModel, false);
      if (AuthorizationControl.NAMED.equals(cloneModel.authorizationControl)) {
         // add the owner of the source repository to the clone's access list
         if (!StringUtils.isEmpty(repository.owner)) {
            UserModel owner = getUserModel(repository.owner);
            if (owner != null) {
               owner.repositories.add(cloneName);
               updateUserModel(owner.username, owner, false);
            }
      // add the owner of the source repository to the clone's access list
      if (!StringUtils.isEmpty(repository.owner)) {
         UserModel originOwner = getUserModel(repository.owner);
         if (originOwner != null) {
            originOwner.setRepositoryPermission(cloneName, AccessPermission.CLONE);
            updateUserModel(originOwner.username, originOwner, false);
         }
         // inherit origin's access lists
         List<String> users = getRepositoryUsers(repository);
         setRepositoryUsers(cloneModel, users);
         List<String> teams = getRepositoryTeams(repository);
         setRepositoryTeams(cloneModel, teams);
      }
      // grant origin's user list clone permission to fork
      List<String> users = getRepositoryUsers(repository);
      List<UserModel> cloneUsers = new ArrayList<UserModel>();
      for (String name : users) {
         if (!name.equalsIgnoreCase(user.username)) {
            UserModel cloneUser = getUserModel(name);
            if (cloneUser.canClone(repository)) {
               // origin user can clone origin, grant clone access to fork
               cloneUser.setRepositoryPermission(cloneName, AccessPermission.CLONE);
            }
            cloneUsers.add(cloneUser);
         }
      }
      userService.updateUserModels(cloneUsers);
      // grant origin's team list clone permission to fork
      List<String> teams = getRepositoryTeams(repository);
      List<TeamModel> cloneTeams = new ArrayList<TeamModel>();
      for (String name : teams) {
         TeamModel cloneTeam = getTeamModel(name);
         if (cloneTeam.canClone(repository)) {
            // origin team can clone origin, grant clone access to fork
            cloneTeam.setRepositoryPermission(cloneName, AccessPermission.CLONE);
         }
         cloneTeams.add(cloneTeam);
      }
      userService.updateTeamModels(cloneTeams);
      // add this clone to the cached model
      addToCachedRepositoryList(cloneModel);
      return cloneModel;