From cb285cbfddfc0b633d6b8cdb4dc0d2bd2b8b51ef Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Thu, 05 Jan 2012 17:34:05 -0500 Subject: [PATCH] Fixed bug in receive hook for repositories in subfolders --- src/com/gitblit/FederationPullExecutor.java | 83 +++++++++++++++++++++++++++++++++++++++-- 1 files changed, 79 insertions(+), 4 deletions(-) diff --git a/src/com/gitblit/FederationPullExecutor.java b/src/com/gitblit/FederationPullExecutor.java index 20fd67c..0fd1355 100644 --- a/src/com/gitblit/FederationPullExecutor.java +++ b/src/com/gitblit/FederationPullExecutor.java @@ -47,8 +47,11 @@ import com.gitblit.GitBlitException.ForbiddenException; import com.gitblit.models.FederationModel; import com.gitblit.models.RepositoryModel; +import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; +import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.FederationUtils; +import com.gitblit.utils.FileUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.JGitUtils.CloneResult; import com.gitblit.utils.StringUtils; @@ -112,7 +115,7 @@ String message = "Federation pull of " + registration.name + " @ " + registration.url + " is now at " + is.name(); GitBlit.self() - .notifyAdministrators( + .sendMailToAdministrators( "Pull Status of " + registration.name + " is " + is.name(), message); } @@ -280,14 +283,18 @@ r.close(); } + IUserService userService = null; + try { // Pull USERS + // TeamModels are automatically pulled because they are contained + // within the UserModel. The UserService creates unknown teams + // and updates existing teams. Collection<UserModel> users = FederationUtils.getUsers(registration); if (users != null && users.size() > 0) { - File realmFile = new File(registrationFolderFile, registration.name - + "_users.conf"); + File realmFile = new File(registrationFolderFile, registration.name + "_users.conf"); realmFile.delete(); - ConfigUserService userService = new ConfigUserService(realmFile); + userService = new ConfigUserService(realmFile); for (UserModel user : users) { userService.updateUserModel(user.username, user); @@ -318,6 +325,31 @@ localUser.canAdmin = user.canAdmin; GitBlit.self().updateUserModel(localUser.username, localUser, false); } + + for (String teamname : GitBlit.self().getAllTeamnames()) { + TeamModel team = GitBlit.self().getTeamModel(teamname); + if (user.isTeamMember(teamname) && !team.hasUser(user.username)) { + // new team member + team.addUser(user.username); + GitBlit.self().updateTeamModel(teamname, team, false); + } else if (!user.isTeamMember(teamname) && team.hasUser(user.username)) { + // remove team member + team.removeUser(user.username); + GitBlit.self().updateTeamModel(teamname, team, false); + } + + // 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 + GitBlit.self().updateTeamModel(teamname, team, false); + } + } + } } } } @@ -326,6 +358,27 @@ } catch (IOException e) { logger.warn(MessageFormat.format( "Failed to retrieve USERS from federated gitblit ({0} @ {1})", + registration.name, registration.url), e); + } + + try { + // Pull TEAMS + // We explicitly pull these even though they are embedded in + // UserModels because it is possible to use teams to specify + // mailing lists or push scripts without specifying users. + if (userService != null) { + Collection<TeamModel> teams = FederationUtils.getTeams(registration); + if (teams != null && teams.size() > 0) { + for (TeamModel team : teams) { + userService.updateTeamModel(team); + } + } + } + } catch (ForbiddenException e) { + // ignore forbidden exceptions + } catch (IOException e) { + logger.warn(MessageFormat.format( + "Failed to retrieve TEAMS from federated gitblit ({0} @ {1})", registration.name, registration.url), e); } @@ -347,6 +400,28 @@ "Failed to retrieve SETTINGS from federated gitblit ({0} @ {1})", registration.name, registration.url), e); } + + try { + // Pull SCRIPTS + Map<String, String> scripts = FederationUtils.getScripts(registration); + if (scripts != null && scripts.size() > 0) { + for (Map.Entry<String, String> script : scripts.entrySet()) { + String scriptName = script.getKey(); + if (scriptName.endsWith(".groovy")) { + scriptName = scriptName.substring(0, scriptName.indexOf(".groovy")); + } + File file = new File(registrationFolderFile, registration.name + "_" + + scriptName + ".groovy"); + FileUtils.writeContent(file, script.getValue()); + } + } + } catch (ForbiddenException e) { + // ignore forbidden exceptions + } catch (IOException e) { + logger.warn(MessageFormat.format( + "Failed to retrieve SCRIPTS from federated gitblit ({0} @ {1})", + registration.name, registration.url), e); + } } /** -- Gitblit v1.9.1