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
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
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
} 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
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
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