diff options
author | James Moger <james.moger@gitblit.com> | 2012-03-24 14:50:35 -0400 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2012-03-24 14:50:35 -0400 |
commit | 87db82f28371bac4a8bf4551ad964078301da8bd (patch) | |
tree | 18bed5050578445b017e47fe3da687eca8a850e2 | |
parent | 5b29c53b326b5fd283cb06356e94df5f78508860 (diff) | |
download | gitblit-87db82f28371bac4a8bf4551ad964078301da8bd.tar.gz gitblit-87db82f28371bac4a8bf4551ad964078301da8bd.zip |
Ensure that FederationPullExecutor resets to FETCH_HEAD for mirrors
-rw-r--r-- | src/com/gitblit/FederationPullExecutor.java | 31 | ||||
-rw-r--r-- | 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<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;
+ }
+ }
+ }
+ // 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;
@@ -253,27 +251,6 @@ public class JGitUtils { }
/**
- * 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.
*
* @param repositoriesFolder
|