From 9effe1630d97039b3e01cd9b58ed07e75be1d63c Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Mon, 25 Feb 2013 08:40:30 -0500 Subject: [PATCH] Merge pull request #75 from thefake/master --- src/com/gitblit/FederationPullExecutor.java | 96 +++++++++++++++++++++++++++++++---------------- 1 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/com/gitblit/FederationPullExecutor.java b/src/com/gitblit/FederationPullExecutor.java index 432e293..ad1022c 100644 --- a/src/com/gitblit/FederationPullExecutor.java +++ b/src/com/gitblit/FederationPullExecutor.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -33,10 +34,6 @@ import java.util.Set; import java.util.concurrent.TimeUnit; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.ResetCommand; -import org.eclipse.jgit.api.ResetCommand.ResetType; -import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.revwalk.RevCommit; @@ -45,6 +42,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.gitblit.Constants.AccessPermission; import com.gitblit.Constants.FederationPullStatus; import com.gitblit.Constants.FederationStrategy; import com.gitblit.GitBlitException.ForbiddenException; @@ -191,11 +189,17 @@ repositoryName.indexOf(DOT_GIT_EXT)); } } - + // confirm that the origin of any pre-existing repository matches // the clone url String fetchHead = null; Repository existingRepository = GitBlit.self().getRepository(repositoryName); + + if (existingRepository == null && GitBlit.self().isCollectingGarbage(repositoryName)) { + logger.warn(MessageFormat.format("Skipping local repository {0}, busy collecting garbage", repositoryName)); + continue; + } + if (existingRepository != null) { StoredConfig config = existingRepository.getConfig(); config.load(); @@ -243,25 +247,28 @@ if (registration.mirror) { // mirror if (fetched) { - // find the first branch name that FETCH_HEAD points to - List<RefModel> refs = JGitUtils.getAllRefs(r).get(commit.getId()); - if (!ArrayUtils.isEmpty(refs)) { - for (RefModel ref : refs) { - if (ref.displayName.startsWith(org.eclipse.jgit.lib.Constants.R_REMOTES)) { - newFetchHead = ref.displayName; - break; - } + // update local branches to match the remote tracking branches + for (RefModel ref : JGitUtils.getRemoteBranches(r, false, -1)) { + if (ref.displayName.startsWith("origin/")) { + String branch = org.eclipse.jgit.lib.Constants.R_HEADS + + ref.displayName.substring(ref.displayName.indexOf('/') + 1); + String hash = ref.getReferencedObjectId().getName(); + + JGitUtils.setBranchRef(r, branch, hash); + logger.info(MessageFormat.format(" resetting {0} of {1} to {2}", branch, + repository.name, hash)); } } - // reset HEAD to the FETCH_HEAD branch. - // if no branch was found, reset HEAD to the commit id. - Git git = new Git(r); - ResetCommand reset = git.reset(); - reset.setMode(ResetType.SOFT); - reset.setRef(newFetchHead); - Ref ref = reset.call(); + + String newHead; + if (StringUtils.isEmpty(repository.HEAD)) { + newHead = newFetchHead; + } else { + newHead = repository.HEAD; + } + JGitUtils.setHEADtoRef(r, newHead); logger.info(MessageFormat.format(" resetting HEAD of {0} to {1}", - repository.name, ref.getObjectId().getName())); + repository.name, newHead)); registration.updateStatus(repository, FederationPullStatus.MIRRORED); } else { // indicate no commits pulled @@ -334,10 +341,20 @@ // reparent all repository permissions if the local // repositories are stored within subfolders if (!StringUtils.isEmpty(registrationFolder)) { - List<String> permissions = new ArrayList<String>(user.repositories); - user.repositories.clear(); - for (String permission : permissions) { - user.addRepository(registrationFolder + "/" + permission); + if (user.permissions != null) { + // pulling from >= 1.2 version + Map<String, AccessPermission> copy = new HashMap<String, AccessPermission>(user.permissions); + user.permissions.clear(); + for (Map.Entry<String, AccessPermission> entry : copy.entrySet()) { + user.setRepositoryPermission(registrationFolder + "/" + entry.getKey(), entry.getValue()); + } + } else { + // pulling from <= 1.1 version + List<String> permissions = new ArrayList<String>(user.repositories); + user.repositories.clear(); + for (String permission : permissions) { + user.addRepositoryPermission(registrationFolder + "/" + permission); + } } } @@ -348,8 +365,17 @@ GitBlit.self().updateUserModel(user.username, user, true); } else { // update repository permissions of local user - for (String repository : user.repositories) { - localUser.addRepository(repository); + if (user.permissions != null) { + // pulling from >= 1.2 version + Map<String, AccessPermission> copy = new HashMap<String, AccessPermission>(user.permissions); + for (Map.Entry<String, AccessPermission> entry : copy.entrySet()) { + localUser.setRepositoryPermission(entry.getKey(), entry.getValue()); + } + } else { + // pulling from <= 1.1 version + for (String repository : user.repositories) { + localUser.addRepositoryPermission(repository); + } } localUser.password = user.password; localUser.canAdmin = user.canAdmin; @@ -370,12 +396,16 @@ // update team repositories TeamModel remoteTeam = user.getTeam(teamname); - if (remoteTeam != null && !ArrayUtils.isEmpty(remoteTeam.repositories)) { - int before = team.repositories.size(); - team.addRepositories(remoteTeam.repositories); - int after = team.repositories.size(); - if (after > before) { - // repository count changed, update + if (remoteTeam != null) { + if (remoteTeam.permissions != null) { + // pulling from >= 1.2 + for (Map.Entry<String, AccessPermission> entry : remoteTeam.permissions.entrySet()){ + team.setRepositoryPermission(entry.getKey(), entry.getValue()); + } + GitBlit.self().updateTeamModel(teamname, team, false); + } else if(!ArrayUtils.isEmpty(remoteTeam.repositories)) { + // pulling from <= 1.1 + team.addRepositoryPermissions(remoteTeam.repositories); GitBlit.self().updateTeamModel(teamname, team, false); } } -- Gitblit v1.9.1