From 856c8a2ad521064d69b2b50003c1df382d375013 Mon Sep 17 00:00:00 2001
From: Marcin Floryan <marcin.floryan@gmail.com>
Date: Sat, 03 Nov 2012 15:15:22 -0400
Subject: [PATCH] Download progress - CR character behaves as expected on Windows but not on other platforms.
---
src/com/gitblit/FederationPullExecutor.java | 96 +++++++++++++++++++++++++++++++----------------
1 files changed, 63 insertions(+), 33 deletions(-)
diff --git a/src/com/gitblit/FederationPullExecutor.java b/src/com/gitblit/FederationPullExecutor.java
index 432e293..ad1022c 100644
--- a/src/com/gitblit/FederationPullExecutor.java
+++ b/src/com/gitblit/FederationPullExecutor.java
@@ -26,6 +26,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -33,10 +34,6 @@
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;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -45,6 +42,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.FederationPullStatus;
import com.gitblit.Constants.FederationStrategy;
import com.gitblit.GitBlitException.ForbiddenException;
@@ -191,11 +189,17 @@
repositoryName.indexOf(DOT_GIT_EXT));
}
}
-
+
// confirm that the origin of any pre-existing repository matches
// the clone url
String fetchHead = null;
Repository existingRepository = GitBlit.self().getRepository(repositoryName);
+
+ if (existingRepository == null && GitBlit.self().isCollectingGarbage(repositoryName)) {
+ logger.warn(MessageFormat.format("Skipping local repository {0}, busy collecting garbage", repositoryName));
+ continue;
+ }
+
if (existingRepository != null) {
StoredConfig config = existingRepository.getConfig();
config.load();
@@ -243,25 +247,28 @@
if (registration.mirror) {
// mirror
if (fetched) {
- // 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;
- }
+ // update local branches to match the remote tracking branches
+ for (RefModel ref : JGitUtils.getRemoteBranches(r, false, -1)) {
+ if (ref.displayName.startsWith("origin/")) {
+ String branch = org.eclipse.jgit.lib.Constants.R_HEADS
+ + ref.displayName.substring(ref.displayName.indexOf('/') + 1);
+ String hash = ref.getReferencedObjectId().getName();
+
+ JGitUtils.setBranchRef(r, branch, hash);
+ logger.info(MessageFormat.format(" resetting {0} of {1} to {2}", branch,
+ repository.name, hash));
}
}
- // 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();
+
+ String newHead;
+ if (StringUtils.isEmpty(repository.HEAD)) {
+ newHead = newFetchHead;
+ } else {
+ newHead = repository.HEAD;
+ }
+ JGitUtils.setHEADtoRef(r, newHead);
logger.info(MessageFormat.format(" resetting HEAD of {0} to {1}",
- repository.name, ref.getObjectId().getName()));
+ repository.name, newHead));
registration.updateStatus(repository, FederationPullStatus.MIRRORED);
} else {
// indicate no commits pulled
@@ -334,10 +341,20 @@
// reparent all repository permissions if the local
// repositories are stored within subfolders
if (!StringUtils.isEmpty(registrationFolder)) {
- List<String> permissions = new ArrayList<String>(user.repositories);
- user.repositories.clear();
- for (String permission : permissions) {
- user.addRepository(registrationFolder + "/" + permission);
+ if (user.permissions != null) {
+ // pulling from >= 1.2 version
+ Map<String, AccessPermission> copy = new HashMap<String, AccessPermission>(user.permissions);
+ user.permissions.clear();
+ for (Map.Entry<String, AccessPermission> entry : copy.entrySet()) {
+ user.setRepositoryPermission(registrationFolder + "/" + entry.getKey(), entry.getValue());
+ }
+ } else {
+ // pulling from <= 1.1 version
+ List<String> permissions = new ArrayList<String>(user.repositories);
+ user.repositories.clear();
+ for (String permission : permissions) {
+ user.addRepositoryPermission(registrationFolder + "/" + permission);
+ }
}
}
@@ -348,8 +365,17 @@
GitBlit.self().updateUserModel(user.username, user, true);
} else {
// update repository permissions of local user
- for (String repository : user.repositories) {
- localUser.addRepository(repository);
+ if (user.permissions != null) {
+ // pulling from >= 1.2 version
+ Map<String, AccessPermission> copy = new HashMap<String, AccessPermission>(user.permissions);
+ for (Map.Entry<String, AccessPermission> entry : copy.entrySet()) {
+ localUser.setRepositoryPermission(entry.getKey(), entry.getValue());
+ }
+ } else {
+ // pulling from <= 1.1 version
+ for (String repository : user.repositories) {
+ localUser.addRepositoryPermission(repository);
+ }
}
localUser.password = user.password;
localUser.canAdmin = user.canAdmin;
@@ -370,12 +396,16 @@
// update team repositories
TeamModel remoteTeam = user.getTeam(teamname);
- if (remoteTeam != null && !ArrayUtils.isEmpty(remoteTeam.repositories)) {
- int before = team.repositories.size();
- team.addRepositories(remoteTeam.repositories);
- int after = team.repositories.size();
- if (after > before) {
- // repository count changed, update
+ if (remoteTeam != null) {
+ if (remoteTeam.permissions != null) {
+ // pulling from >= 1.2
+ for (Map.Entry<String, AccessPermission> entry : remoteTeam.permissions.entrySet()){
+ team.setRepositoryPermission(entry.getKey(), entry.getValue());
+ }
+ GitBlit.self().updateTeamModel(teamname, team, false);
+ } else if(!ArrayUtils.isEmpty(remoteTeam.repositories)) {
+ // pulling from <= 1.1
+ team.addRepositoryPermissions(remoteTeam.repositories);
GitBlit.self().updateTeamModel(teamname, team, false);
}
}
--
Gitblit v1.9.1