From f96d3233fde0d6dc5b61690e59794d209d77ae90 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 06 Jun 2012 22:11:54 -0400 Subject: [PATCH] Possible fix for federation branch mirroring issue (issue 86) --- src/com/gitblit/FederationPullExecutor.java | 39 +++++++++++++++++++-------------------- 1 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/com/gitblit/FederationPullExecutor.java b/src/com/gitblit/FederationPullExecutor.java index 432e293..7b9c55b 100644 --- a/src/com/gitblit/FederationPullExecutor.java +++ b/src/com/gitblit/FederationPullExecutor.java @@ -33,10 +33,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; @@ -243,25 +239,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 -- Gitblit v1.9.1