]> source.dussan.org Git - gitblit.git/commitdiff
Ensure that FederationPullExecutor resets to FETCH_HEAD for mirrors
authorJames Moger <james.moger@gitblit.com>
Sat, 24 Mar 2012 18:50:35 +0000 (14:50 -0400)
committerJames Moger <james.moger@gitblit.com>
Sat, 24 Mar 2012 18:50:35 +0000 (14:50 -0400)
src/com/gitblit/FederationPullExecutor.java
src/com/gitblit/utils/JGitUtils.java

index 10f69d2fce88073606eb289745c07073895e64d0..432e293fd8613a242909f6a2f1ee9d4602dff1b1 100644 (file)
@@ -33,6 +33,9 @@ import java.util.Properties;
 import java.util.Set;\r
 import java.util.concurrent.TimeUnit;\r
 \r
+import org.eclipse.jgit.api.Git;\r
+import org.eclipse.jgit.api.ResetCommand;\r
+import org.eclipse.jgit.api.ResetCommand.ResetType;\r
 import org.eclipse.jgit.lib.Ref;\r
 import org.eclipse.jgit.lib.Repository;\r
 import org.eclipse.jgit.lib.StoredConfig;\r
@@ -46,6 +49,7 @@ import com.gitblit.Constants.FederationPullStatus;
 import com.gitblit.Constants.FederationStrategy;\r
 import com.gitblit.GitBlitException.ForbiddenException;\r
 import com.gitblit.models.FederationModel;\r
+import com.gitblit.models.RefModel;\r
 import com.gitblit.models.RepositoryModel;\r
 import com.gitblit.models.TeamModel;\r
 import com.gitblit.models.UserModel;\r
@@ -197,7 +201,7 @@ public class FederationPullExecutor implements Runnable {
                                config.load();\r
                                String origin = config.getString("remote", "origin", "url");\r
                                RevCommit commit = JGitUtils.getCommit(existingRepository,\r
-                                               "refs/remotes/origin/master");\r
+                                               org.eclipse.jgit.lib.Constants.FETCH_HEAD);\r
                                if (commit != null) {\r
                                        fetchHead = commit.getName();\r
                                }\r
@@ -232,15 +236,30 @@ public class FederationPullExecutor implements Runnable {
                        } else {\r
                                // fetch and update\r
                                boolean fetched = false;\r
-                               RevCommit commit = JGitUtils.getCommit(r, "refs/remotes/origin/master");\r
-                               String origin = commit.getName();\r
-                               fetched = fetchHead == null || !fetchHead.equals(origin);\r
+                               RevCommit commit = JGitUtils.getCommit(r, org.eclipse.jgit.lib.Constants.FETCH_HEAD);\r
+                               String newFetchHead = commit.getName();\r
+                               fetched = fetchHead == null || !fetchHead.equals(newFetchHead);\r
 \r
                                if (registration.mirror) {\r
                                        // mirror\r
                                        if (fetched) {\r
-                                               // reset the local HEAD to origin/master\r
-                                               Ref ref = JGitUtils.resetHEAD(r, "origin/master");\r
+                                               // find the first branch name that FETCH_HEAD points to\r
+                                               List<RefModel> refs = JGitUtils.getAllRefs(r).get(commit.getId());\r
+                                               if (!ArrayUtils.isEmpty(refs)) {\r
+                                                       for (RefModel ref : refs) {\r
+                                                               if (ref.displayName.startsWith(org.eclipse.jgit.lib.Constants.R_REMOTES)) {\r
+                                                                       newFetchHead = ref.displayName;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                               // reset HEAD to the FETCH_HEAD branch.\r
+                                               // if no branch was found, reset HEAD to the commit id.\r
+                                               Git git = new Git(r);\r
+                                               ResetCommand reset = git.reset();\r
+                                               reset.setMode(ResetType.SOFT);\r
+                                               reset.setRef(newFetchHead);\r
+                                               Ref ref = reset.call();\r
                                                logger.info(MessageFormat.format("     resetting HEAD of {0} to {1}",\r
                                                                repository.name, ref.getObjectId().getName()));\r
                                                registration.updateStatus(repository, FederationPullStatus.MIRRORED);\r
index 99b2f73828e336cb241b203cd64009bb7a80442a..f495a38f300cbaa726b8aba5cc3680be739c2987 100644 (file)
@@ -36,8 +36,6 @@ import java.util.zip.ZipOutputStream;
 import org.eclipse.jgit.api.CloneCommand;\r
 import org.eclipse.jgit.api.FetchCommand;\r
 import org.eclipse.jgit.api.Git;\r
-import org.eclipse.jgit.api.ResetCommand;\r
-import org.eclipse.jgit.api.ResetCommand.ResetType;\r
 import org.eclipse.jgit.diff.DiffEntry;\r
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;\r
 import org.eclipse.jgit.diff.DiffFormatter;\r
@@ -252,27 +250,6 @@ public class JGitUtils {
                return fetchRes;\r
        }\r
 \r
-       /**\r
-        * Reset HEAD to the latest remote tracking commit.\r
-        * \r
-        * @param repository\r
-        * @param remoteRef\r
-        *            the remote tracking reference (e.g. origin/master)\r
-        * @return Ref\r
-        * @throws Exception\r
-        */\r
-       public static Ref resetHEAD(Repository repository, String remoteRef) throws Exception {\r
-               if (!remoteRef.startsWith(Constants.R_REMOTES)) {\r
-                       remoteRef = Constants.R_REMOTES + remoteRef;\r
-               }\r
-               Git git = new Git(repository);\r
-               ResetCommand reset = git.reset();\r
-               reset.setMode(ResetType.SOFT);\r
-               reset.setRef(remoteRef);\r
-               Ref result = reset.call();\r
-               return result;\r
-       }\r
-\r
        /**\r
         * Creates a bare repository.\r
         * \r