James Moger
2012-10-04 9f5a860d1ecaebb80530fc22607d34fc80d8c09d
src/com/gitblit/GitBlit.java
@@ -746,17 +746,17 @@
    * Adds the repository to the list of cached repositories if Gitblit is
    * configured to cache the repository list.
    * 
    * @param name
    * @param model
    */
   private void addToCachedRepositoryList(String name, RepositoryModel model) {
   private void addToCachedRepositoryList(RepositoryModel model) {
      if (settings.getBoolean(Keys.git.cacheRepositoryList, true)) {
         repositoryListCache.put(name, model);
         repositoryListCache.put(model.name, model);
         
         // update the fork origin repository with this repository clone
         if (!StringUtils.isEmpty(model.originRepository)) {
            if (repositoryListCache.containsKey(model.originRepository)) {
               RepositoryModel origin = repositoryListCache.get(model.originRepository);
               origin.addFork(name);
               origin.addFork(model.name);
            }
         }
      }
@@ -1001,7 +1001,7 @@
         if (model == null) {
            return null;
         }
         addToCachedRepositoryList(repositoryName, model);
         addToCachedRepositoryList(model);
         return model;
      }
      
@@ -1023,7 +1023,7 @@
         logger.info(MessageFormat.format("Config for \"{0}\" has changed. Reloading model and updating cache.", repositoryName));
         model = loadRepositoryModel(repositoryName);
         removeFromCachedRepositoryList(repositoryName);
         addToCachedRepositoryList(repositoryName, model);
         addToCachedRepositoryList(model);
      } else {
         // update a few repository parameters 
         if (!model.hasCommits) {
@@ -1236,10 +1236,15 @@
         return null;
      }
      RepositoryModel model = new RepositoryModel();
      model.name = repositoryName;
      model.isBare = r.isBare();
      File basePath = getFileOrFolder(Keys.git.repositoriesFolder, "git");
      if (model.isBare) {
         model.name = com.gitblit.utils.FileUtils.getRelativePath(basePath, r.getDirectory());
      } else {
         model.name = com.gitblit.utils.FileUtils.getRelativePath(basePath, r.getDirectory().getParentFile());
      }
      model.hasCommits = JGitUtils.hasCommits(r);
      model.lastChange = JGitUtils.getLastChange(r);
      model.isBare = r.isBare();
      if (repositoryName.indexOf('/') == -1) {
         model.projectPath = "";
      } else {
@@ -1270,6 +1275,9 @@
               Constants.CONFIG_GITBLIT, null, "federationSets")));
         model.isFederated = getConfig(config, "isFederated", false);
         model.origin = config.getString("remote", "origin", "url");
         if (model.origin != null) {
            model.origin = model.origin.replace('\\', '/');
         }
         model.preReceiveScripts = new ArrayList<String>(Arrays.asList(config.getStringList(
               Constants.CONFIG_GITBLIT, null, "preReceiveScript")));
         model.postReceiveScripts = new ArrayList<String>(Arrays.asList(config.getStringList(
@@ -1425,7 +1433,7 @@
   
   private ForkModel getForkModel(String repository) {
      RepositoryModel model = repositoryListCache.get(repository);
      ForkModel fork = new ForkModel(model.originRepository, model.name);
      ForkModel fork = new ForkModel(model);
      if (!ArrayUtils.isEmpty(model.forks)) {
         for (String aFork : model.forks) {
            ForkModel fm = getForkModel(aFork);
@@ -1667,7 +1675,7 @@
      // update repository cache
      removeFromCachedRepositoryList(repositoryName);
      // model will actually be replaced on next load because config is stale
      addToCachedRepositoryList(repository.name, repository);
      addToCachedRepositoryList(repository);
   }
   
   /**
@@ -2637,44 +2645,45 @@
    * 
    * @param repository
    * @param user
    * @return true, if successful
    * @return the repository model of the fork, if successful
    * @throws GitBlitException
    */
   public boolean fork(RepositoryModel repository, UserModel user) {
   public RepositoryModel fork(RepositoryModel repository, UserModel user) throws GitBlitException {
      String cloneName = MessageFormat.format("~{0}/{1}.git", user.username, StringUtils.stripDotGit(StringUtils.getLastPathElement(repository.name)));
      String fromUrl = MessageFormat.format("file://{0}/{1}", repositoriesFolder.getAbsolutePath(), repository.name);
      // clone the repository
      try {
         // clone the repository
         JGitUtils.cloneRepository(repositoriesFolder, cloneName, fromUrl, true, null);
         // create a Gitblit repository model for the clone
         RepositoryModel cloneModel = repository.cloneAs(cloneName);
         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);
               }
            }
            // inherit origin's access lists
            List<String> users = getRepositoryUsers(repository);
            setRepositoryUsers(cloneModel, users);
            List<String> teams = getRepositoryTeams(repository);
            setRepositoryTeams(cloneModel, teams);
         }
         // add this clone to the cached model
         addToCachedRepositoryList(cloneModel.name, cloneModel);
         return true;
      } catch (Exception e) {
         logger.error("failed to fork", e);
         throw new GitBlitException(e);
      }
      return false;
      // create a Gitblit repository model for the clone
      RepositoryModel cloneModel = repository.cloneAs(cloneName);
      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);
            }
         }
         // inherit origin's access lists
         List<String> users = getRepositoryUsers(repository);
         setRepositoryUsers(cloneModel, users);
         List<String> teams = getRepositoryTeams(repository);
         setRepositoryTeams(cloneModel, teams);
      }
      // add this clone to the cached model
      addToCachedRepositoryList(cloneModel);
      return cloneModel;
   }
}