From 87db82f28371bac4a8bf4551ad964078301da8bd Mon Sep 17 00:00:00 2001 From: James Moger Date: Sat, 24 Mar 2012 14:50:35 -0400 Subject: [PATCH] Ensure that FederationPullExecutor resets to FETCH_HEAD for mirrors --- src/com/gitblit/FederationPullExecutor.java | 31 +++++++++++++++++---- src/com/gitblit/utils/JGitUtils.java | 23 --------------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/com/gitblit/FederationPullExecutor.java b/src/com/gitblit/FederationPullExecutor.java index 10f69d2f..432e293f 100644 --- a/src/com/gitblit/FederationPullExecutor.java +++ b/src/com/gitblit/FederationPullExecutor.java @@ -33,6 +33,9 @@ import java.util.Properties; 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; @@ -46,6 +49,7 @@ import com.gitblit.Constants.FederationPullStatus; import com.gitblit.Constants.FederationStrategy; import com.gitblit.GitBlitException.ForbiddenException; import com.gitblit.models.FederationModel; +import com.gitblit.models.RefModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; @@ -197,7 +201,7 @@ public class FederationPullExecutor implements Runnable { config.load(); String origin = config.getString("remote", "origin", "url"); RevCommit commit = JGitUtils.getCommit(existingRepository, - "refs/remotes/origin/master"); + org.eclipse.jgit.lib.Constants.FETCH_HEAD); if (commit != null) { fetchHead = commit.getName(); } @@ -232,15 +236,30 @@ public class FederationPullExecutor implements Runnable { } else { // fetch and update boolean fetched = false; - RevCommit commit = JGitUtils.getCommit(r, "refs/remotes/origin/master"); - String origin = commit.getName(); - fetched = fetchHead == null || !fetchHead.equals(origin); + RevCommit commit = JGitUtils.getCommit(r, org.eclipse.jgit.lib.Constants.FETCH_HEAD); + String newFetchHead = commit.getName(); + fetched = fetchHead == null || !fetchHead.equals(newFetchHead); if (registration.mirror) { // mirror if (fetched) { - // reset the local HEAD to origin/master - Ref ref = JGitUtils.resetHEAD(r, "origin/master"); + // find the first branch name that FETCH_HEAD points to + List 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; + } + } + } + // 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(); logger.info(MessageFormat.format(" resetting HEAD of {0} to {1}", repository.name, ref.getObjectId().getName())); registration.updateStatus(repository, FederationPullStatus.MIRRORED); diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java index 99b2f738..f495a38f 100644 --- a/src/com/gitblit/utils/JGitUtils.java +++ b/src/com/gitblit/utils/JGitUtils.java @@ -36,8 +36,6 @@ import java.util.zip.ZipOutputStream; import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.FetchCommand; import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.ResetCommand; -import org.eclipse.jgit.api.ResetCommand.ResetType; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffEntry.ChangeType; import org.eclipse.jgit.diff.DiffFormatter; @@ -252,27 +250,6 @@ public class JGitUtils { return fetchRes; } - /** - * Reset HEAD to the latest remote tracking commit. - * - * @param repository - * @param remoteRef - * the remote tracking reference (e.g. origin/master) - * @return Ref - * @throws Exception - */ - public static Ref resetHEAD(Repository repository, String remoteRef) throws Exception { - if (!remoteRef.startsWith(Constants.R_REMOTES)) { - remoteRef = Constants.R_REMOTES + remoteRef; - } - Git git = new Git(repository); - ResetCommand reset = git.reset(); - reset.setMode(ResetType.SOFT); - reset.setRef(remoteRef); - Ref result = reset.call(); - return result; - } - /** * Creates a bare repository. * -- 2.39.5