James Moger
2012-03-24 87db82f28371bac4a8bf4551ad964078301da8bd
Ensure that FederationPullExecutor resets to FETCH_HEAD for mirrors
2 files modified
54 ■■■■ changed files
src/com/gitblit/FederationPullExecutor.java 31 ●●●● patch | view | raw | blame | history
src/com/gitblit/utils/JGitUtils.java 23 ●●●●● patch | view | raw | blame | history
src/com/gitblit/FederationPullExecutor.java
@@ -33,6 +33,9 @@
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.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 @@
                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 @@
            } 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);
src/com/gitblit/utils/JGitUtils.java
@@ -36,8 +36,6 @@
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;
@@ -250,27 +248,6 @@
        fetch.setRefSpecs(specs);
        FetchResult fetchRes = fetch.call();
        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;
    }
    /**