From 0e44acbb2fec928a1606dc60f427a148fff405c9 Mon Sep 17 00:00:00 2001
From: Mohamed Ragab <moragab@gmail.com>
Date: Wed, 02 May 2012 11:15:01 -0400
Subject: [PATCH] Added a script to facilitate setting the proxy host and port and no proxy hosts, and then it concatenates all the java system properties for setting the java proxy configurations and puts the resulting string in an environment variable JAVA_PROXY_CONFIG, modified the scirpts gitblit,  gitblit-ubuntu, and gitblit-centos to source the java-proxy-config.sh script and then include the resulting java proxy configuration in the java command

---
 src/com/gitblit/client/GitblitClient.java |  433 +++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 331 insertions(+), 102 deletions(-)

diff --git a/src/com/gitblit/client/GitblitClient.java b/src/com/gitblit/client/GitblitClient.java
index ccde45a..09bcaab 100644
--- a/src/com/gitblit/client/GitblitClient.java
+++ b/src/com/gitblit/client/GitblitClient.java
@@ -19,22 +19,29 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
+import com.gitblit.Constants;
 import com.gitblit.GitBlitException.ForbiddenException;
 import com.gitblit.GitBlitException.NotAllowedException;
 import com.gitblit.GitBlitException.UnauthorizedException;
 import com.gitblit.GitBlitException.UnknownRequestException;
 import com.gitblit.Keys;
 import com.gitblit.models.FederationModel;
+import com.gitblit.models.FeedEntryModel;
+import com.gitblit.models.FeedModel;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.ServerSettings;
 import com.gitblit.models.ServerStatus;
-import com.gitblit.models.SyndicatedEntryModel;
+import com.gitblit.models.TeamModel;
 import com.gitblit.models.UserModel;
+import com.gitblit.utils.ArrayUtils;
 import com.gitblit.utils.RpcUtils;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.utils.SyndicationUtils;
@@ -50,6 +57,8 @@
 
 	private static final long serialVersionUID = 1L;
 
+	private static final Date NEVER = new Date(0);
+
 	protected final GitblitRegistration reg;
 
 	public final String url;
@@ -57,6 +66,8 @@
 	public final String account;
 
 	private final char[] password;
+
+	private volatile int protocolVersion;
 
 	private volatile boolean allowManagement;
 
@@ -68,9 +79,15 @@
 
 	private final List<UserModel> allUsers;
 
+	private final List<TeamModel> allTeams;
+
 	private final List<FederationModel> federationRegistrations;
 
-	private final List<SyndicatedEntryModel> syndicatedEntries;
+	private final List<FeedModel> availableFeeds;
+
+	private final List<FeedEntryModel> syndicatedEntries;
+
+	private final Set<String> subscribedRepositories;
 
 	private ServerStatus status;
 
@@ -81,26 +98,28 @@
 		this.password = reg.password;
 
 		this.allUsers = new ArrayList<UserModel>();
+		this.allTeams = new ArrayList<TeamModel>();
 		this.allRepositories = new ArrayList<RepositoryModel>();
 		this.federationRegistrations = new ArrayList<FederationModel>();
-		this.syndicatedEntries = new ArrayList<SyndicatedEntryModel>();
+		this.availableFeeds = new ArrayList<FeedModel>();
+		this.syndicatedEntries = new ArrayList<FeedEntryModel>();
+		this.subscribedRepositories = new HashSet<String>();
 	}
 
 	public void login() throws IOException {
+		protocolVersion = RpcUtils.getProtocolVersion(url, account, password);
+		refreshSettings();
+		refreshAvailableFeeds();
 		refreshRepositories();
+		refreshSubscribedFeeds(0);
 
-		try {
-			// RSS feeds may be disabled by server
-			refreshSubscribedFeeds();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		
 		try {
 			// credentials may not have administrator access
 			// or server may have disabled rpc management
 			refreshUsers();
-			refreshSettings();
+			if (protocolVersion > 1) {
+				refreshTeams();
+			}
 			allowManagement = true;
 		} catch (UnauthorizedException e) {
 		} catch (ForbiddenException e) {
@@ -122,7 +141,10 @@
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
+	}
 
+	public int getProtocolVersion() {
+		return protocolVersion;
 	}
 
 	public boolean allowManagement() {
@@ -135,6 +157,140 @@
 
 	public boolean isOwner(RepositoryModel model) {
 		return account != null && account.equalsIgnoreCase(model.owner);
+	}
+
+	public String getURL(String action, String repository, String objectId) {
+		boolean mounted = settings.get(Keys.web.mountParameters).getBoolean(true);
+		StringBuilder sb = new StringBuilder();
+		sb.append(url);
+		sb.append('/');
+		sb.append(action);
+		sb.append('/');
+		if (mounted) {
+			// mounted url/action/repository/objectId
+			sb.append(StringUtils.encodeURL(repository));
+			if (!StringUtils.isEmpty(objectId)) {
+				sb.append('/');
+				sb.append(objectId);
+			}
+			return sb.toString();
+		} else {
+			// parameterized url/action/&r=repository&h=objectId
+			sb.append("?r=");
+			sb.append(repository);
+			if (!StringUtils.isEmpty(objectId)) {
+				sb.append("&h=");
+				sb.append(objectId);
+			}
+			return sb.toString();
+		}
+	}
+
+	/**
+	 * Returns the list of pre-receive scripts the repository inherited from the
+	 * global settings and team affiliations.
+	 * 
+	 * @param repository
+	 *            if null only the globally specified scripts are returned
+	 * @return a list of scripts
+	 */
+	public List<String> getPreReceiveScriptsInherited(RepositoryModel repository) {
+		Set<String> scripts = new LinkedHashSet<String>();
+		// Globals
+		for (String script : settings.get(Keys.groovy.preReceiveScripts).getStrings()) {
+			if (script.endsWith(".groovy")) {
+				scripts.add(script.substring(0, script.lastIndexOf('.')));
+			} else {
+				scripts.add(script);
+			}
+		}
+
+		// Team Scripts
+		if (repository != null) {
+			for (String teamname : getPermittedTeamnames(repository)) {
+				TeamModel team = getTeamModel(teamname);
+				if (!ArrayUtils.isEmpty(team.preReceiveScripts)) {
+					scripts.addAll(team.preReceiveScripts);
+				}
+			}
+		}
+		return new ArrayList<String>(scripts);
+	}
+
+	/**
+	 * Returns the list of all available Groovy pre-receive push hook scripts
+	 * that are not already inherited by the repository. Script files must have
+	 * .groovy extension
+	 * 
+	 * @param repository
+	 *            optional parameter
+	 * @return list of available hook scripts
+	 */
+	public List<String> getPreReceiveScriptsUnused(RepositoryModel repository) {
+		Set<String> inherited = new TreeSet<String>(getPreReceiveScriptsInherited(repository));
+
+		// create list of available scripts by excluding inherited scripts
+		List<String> scripts = new ArrayList<String>();
+		for (String script : settings.pushScripts) {
+			if (!inherited.contains(script)) {
+				scripts.add(script);
+			}
+		}
+		return scripts;
+	}
+
+	/**
+	 * Returns the list of post-receive scripts the repository inherited from
+	 * the global settings and team affiliations.
+	 * 
+	 * @param repository
+	 *            if null only the globally specified scripts are returned
+	 * @return a list of scripts
+	 */
+	public List<String> getPostReceiveScriptsInherited(RepositoryModel repository) {
+		Set<String> scripts = new LinkedHashSet<String>();
+		// Global Scripts
+		for (String script : settings.get(Keys.groovy.postReceiveScripts).getStrings()) {
+			if (script.endsWith(".groovy")) {
+				scripts.add(script.substring(0, script.lastIndexOf('.')));
+			} else {
+				scripts.add(script);
+			}
+		}
+		// Team Scripts
+		if (repository != null) {
+			for (String teamname : getPermittedTeamnames(repository)) {
+				TeamModel team = getTeamModel(teamname);
+				if (!ArrayUtils.isEmpty(team.postReceiveScripts)) {
+					scripts.addAll(team.postReceiveScripts);
+				}
+			}
+		}
+		return new ArrayList<String>(scripts);
+	}
+
+	/**
+	 * Returns the list of unused Groovy post-receive push hook scripts that are
+	 * not already inherited by the repository. Script files must have .groovy
+	 * extension
+	 * 
+	 * @param repository
+	 *            optional parameter
+	 * @return list of available hook scripts
+	 */
+	public List<String> getPostReceiveScriptsUnused(RepositoryModel repository) {
+		Set<String> inherited = new TreeSet<String>(getPostReceiveScriptsInherited(repository));
+
+		// create list of available scripts by excluding inherited scripts
+		List<String> scripts = new ArrayList<String>();
+		if (!ArrayUtils.isEmpty(settings.pushScripts)) {			
+			for (String script : settings.pushScripts) {
+				if (!inherited.contains(script)) {
+					scripts.add(script);
+				}
+			}
+		}
+		return scripts;
 	}
 
 	public ServerSettings getSettings() {
@@ -155,7 +311,7 @@
 		allRepositories.clear();
 		allRepositories.addAll(repositories.values());
 		Collections.sort(allRepositories);
-		updateSubscribedStates();
+		markSubscribedFeeds();
 		return allRepositories;
 	}
 
@@ -164,6 +320,13 @@
 		allUsers.clear();
 		allUsers.addAll(users);
 		return allUsers;
+	}
+
+	public List<TeamModel> refreshTeams() throws IOException {
+		List<TeamModel> teams = RpcUtils.getTeams(url, account, password);
+		allTeams.clear();
+		allTeams.addAll(teams);
+		return allTeams;
 	}
 
 	public ServerSettings refreshSettings() throws IOException {
@@ -176,108 +339,109 @@
 		return status;
 	}
 
-	public List<SyndicatedEntryModel> refreshSubscribedFeeds() throws IOException {
-		Set<SyndicatedEntryModel> allFeeds = new HashSet<SyndicatedEntryModel>();
-		if (reg.feeds != null && reg.feeds.size() > 0) {
-			for (String feed : reg.feeds) {
-				String[] values = feed.split(":");
-				String repository = values[0];
-				String branch = null;
-				if (values.length > 1) {
-					branch = values[1];
-				}
-				List<SyndicatedEntryModel> list = SyndicationUtils.readFeed(url, repository,
-						branch, -1, account, password);
-				allFeeds.addAll(list);
+	public List<String> getBranches(String repository) {
+		List<FeedModel> feeds = getAvailableFeeds(repository);
+		List<String> branches = new ArrayList<String>();
+		for (FeedModel feed : feeds) {
+			branches.add(feed.branch);
+		}
+		Collections.sort(branches);
+		return branches;
+	}
+
+	public List<FeedModel> getAvailableFeeds() {
+		return availableFeeds;
+	}
+
+	public List<FeedModel> getAvailableFeeds(RepositoryModel repository) {
+		return getAvailableFeeds(repository.name);
+	}
+
+	public List<FeedModel> getAvailableFeeds(String repository) {
+		List<FeedModel> repositoryFeeds = new ArrayList<FeedModel>();
+		if (repository == null) {
+			return repositoryFeeds;
+		}
+		for (FeedModel feed : availableFeeds) {
+			if (feed.repository.equalsIgnoreCase(repository)) {
+				repositoryFeeds.add(feed);
 			}
 		}
+		return repositoryFeeds;
+	}
+
+	public List<FeedModel> refreshAvailableFeeds() throws IOException {
+		List<FeedModel> feeds = RpcUtils.getBranchFeeds(url, account, password);
+		availableFeeds.clear();
+		availableFeeds.addAll(feeds);
+		markSubscribedFeeds();
+		return availableFeeds;
+	}
+
+	public List<FeedEntryModel> refreshSubscribedFeeds(int page) throws IOException {
+		Set<FeedEntryModel> allEntries = new HashSet<FeedEntryModel>();
+		if (reg.feeds.size() > 0) {
+			for (FeedModel feed : reg.feeds) {
+				feed.lastRefreshDate = feed.currentRefreshDate;
+				feed.currentRefreshDate = new Date();
+				List<FeedEntryModel> entries = SyndicationUtils.readFeed(url, feed.repository,
+						feed.branch, -1, page, account, password);
+				allEntries.addAll(entries);
+			}
+		}
+		reg.cacheFeeds();
 		syndicatedEntries.clear();
-		syndicatedEntries.addAll(allFeeds);
+		syndicatedEntries.addAll(allEntries);
 		Collections.sort(syndicatedEntries);
 		return syndicatedEntries;
 	}
 
-	private void updateSubscribedStates() {
-		if (reg.feeds != null) {
-			Set<String> subscribedRepositories = new HashSet<String>();
-			for (String feed : reg.feeds) {
-				if (feed.indexOf(':') > -1) {
-					// strip branch
-					subscribedRepositories.add(feed.substring(0, feed.indexOf(':')).toLowerCase());
-				} else {
-					// default branch
-					subscribedRepositories.add(feed.toLowerCase());
-				}
-			}
-			// set subscribed flag
-			for (RepositoryModel repository : allRepositories) {
-				repository.subscribed = subscribedRepositories.contains(repository.name
-						.toLowerCase());
+	public void updateSubscribedFeeds(List<FeedModel> list) {
+		reg.updateSubscribedFeeds(list);
+		markSubscribedFeeds();
+	}
+
+	private void markSubscribedFeeds() {
+		subscribedRepositories.clear();
+		for (FeedModel feed : availableFeeds) {
+			// mark feed in the available list as subscribed
+			feed.subscribed = reg.feeds.contains(feed);
+			if (feed.subscribed) {
+				subscribedRepositories.add(feed.repository.toLowerCase());
 			}
 		}
 	}
 
-	public List<SyndicatedEntryModel> getSyndicatedEntries() {
+	public Date getLastFeedRefresh(String repository, String branch) {
+		FeedModel feed = new FeedModel();
+		feed.repository = repository;
+		feed.branch = branch;
+		if (reg.feeds.contains(feed)) {
+			int idx = reg.feeds.indexOf(feed);
+			feed = reg.feeds.get(idx);
+			return feed.lastRefreshDate;
+		}
+		return NEVER;
+	}
+
+	public boolean isSubscribed(RepositoryModel repository) {
+		return subscribedRepositories.contains(repository.name.toLowerCase());
+	}
+
+	public List<FeedEntryModel> getSyndicatedEntries() {
 		return syndicatedEntries;
 	}
 
-	public boolean isSubscribed(RepositoryModel repository, String branch) {
-		if (reg.feeds != null && reg.feeds.size() > 0) {
-			for (String feed : reg.feeds) {
-				String[] values = feed.split(":");
-				String repositoryName = values[0];
-				if (repository.name.equalsIgnoreCase(repositoryName)) {
-					return true;
-				}
-				// TODO check branch subscriptions
-				String branchName = null;
-				if (values.length > 1) {
-					branchName = values[1];
-				}
-			}
-		}
-		return false;
+	public List<FeedEntryModel> log(String repository, String branch, int numberOfEntries, int page)
+			throws IOException {
+		return SyndicationUtils.readFeed(url, repository, branch, numberOfEntries, page, account,
+				password);
 	}
 
-	public boolean subscribe(RepositoryModel repository, String branch) {
-		String feed = repository.name;
-		if (!StringUtils.isEmpty(branch)) {
-			feed += ":" + branch;
-		}
-		if (reg.feeds == null) {
-			reg.feeds = new ArrayList<String>();
-		}
-		reg.feeds.add(feed);
-		updateSubscribedStates();
-		return true;
-	}
-
-	public boolean unsubscribe(RepositoryModel repository, String branch) {
-		String feed = repository.name;
-		if (!StringUtils.isEmpty(branch)) {
-			feed += ":" + branch;
-		}
-		reg.feeds.remove(feed);
-		if (syndicatedEntries.size() > 0) {
-			List<SyndicatedEntryModel> toRemove = new ArrayList<SyndicatedEntryModel>();
-			for (SyndicatedEntryModel model : syndicatedEntries) {
-				if (model.repository.equalsIgnoreCase(repository.name)) {
-					boolean emptyUnsubscribeBranch = StringUtils.isEmpty(branch);
-					boolean emptyFromBranch = StringUtils.isEmpty(model.branch);
-					if (emptyUnsubscribeBranch && emptyFromBranch) {
-						// default branch, remove
-						toRemove.add(model);
-					} else if (!emptyUnsubscribeBranch && !emptyFromBranch) {
-						if (model.branch.equals(branch)) {
-							// specific branch, remove
-							toRemove.add(model);
-						}
-					}
-				}
-			}
-		}
-		updateSubscribedStates();
-		return true;
+	public List<FeedEntryModel> search(String repository, String branch, String fragment,
+			Constants.SearchType type, int numberOfEntries, int page) throws IOException {
+		return SyndicationUtils.readSearchFeed(url, repository, branch, fragment, type,
+				numberOfEntries, page, account, password);
 	}
 
 	public List<FederationModel> refreshFederationRegistrations() throws IOException {
@@ -310,6 +474,38 @@
 		return usernames;
 	}
 
+	public List<TeamModel> getTeams() {
+		return allTeams;
+	}
+
+	public List<String> getTeamnames() {
+		List<String> teamnames = new ArrayList<String>();
+		for (TeamModel team : this.allTeams) {
+			teamnames.add(team.name);
+		}
+		Collections.sort(teamnames);
+		return teamnames;
+	}
+
+	public List<String> getPermittedTeamnames(RepositoryModel repository) {
+		List<String> teamnames = new ArrayList<String>();
+		for (TeamModel team : this.allTeams) {
+			if (team.repositories.contains(repository.name)) {
+				teamnames.add(team.name);
+			}
+		}
+		return teamnames;
+	}
+
+	public TeamModel getTeamModel(String name) {
+		for (TeamModel team : allTeams) {
+			if (team.name.equalsIgnoreCase(name)) {
+				return team;
+			}
+		}
+		return null;
+	}
+
 	public List<String> getFederationSets() {
 		return settings.get(Keys.federation.sets).getStrings();
 	}
@@ -320,11 +516,21 @@
 
 	public boolean createRepository(RepositoryModel repository, List<String> permittedUsers)
 			throws IOException {
+		return createRepository(repository, permittedUsers, null);
+	}
+
+	public boolean createRepository(RepositoryModel repository, List<String> permittedUsers,
+			List<String> permittedTeams) throws IOException {
 		boolean success = true;
 		success &= RpcUtils.createRepository(repository, url, account, password);
-		if (permittedUsers.size() > 0) {
+		if (permittedUsers != null && permittedUsers.size() > 0) {
 			// if new repository has named members, set them
 			success &= RpcUtils.setRepositoryMembers(repository, permittedUsers, url, account,
+					password);
+		}
+		if (permittedTeams != null && permittedTeams.size() > 0) {
+			// if new repository has named teams, set them
+			success &= RpcUtils.setRepositoryTeams(repository, permittedTeams, url, account,
 					password);
 		}
 		return success;
@@ -332,11 +538,22 @@
 
 	public boolean updateRepository(String name, RepositoryModel repository,
 			List<String> permittedUsers) throws IOException {
+		return updateRepository(name, repository, permittedUsers, null);
+	}
+
+	public boolean updateRepository(String name, RepositoryModel repository,
+			List<String> permittedUsers, List<String> permittedTeams) throws IOException {
 		boolean success = true;
 		success &= RpcUtils.updateRepository(name, repository, url, account, password);
-		// always set the repository members
-		success &= RpcUtils
-				.setRepositoryMembers(repository, permittedUsers, url, account, password);
+		// set the repository members
+		if (permittedUsers != null) {
+			success &= RpcUtils.setRepositoryMembers(repository, permittedUsers, url, account,
+					password);
+		}
+		if (permittedTeams != null) {
+			success &= RpcUtils.setRepositoryTeams(repository, permittedTeams, url, account,
+					password);
+		}
 		return success;
 	}
 
@@ -356,6 +573,18 @@
 		return RpcUtils.deleteUser(user, url, account, password);
 	}
 
+	public boolean createTeam(TeamModel team) throws IOException {
+		return RpcUtils.createTeam(team, url, account, password);
+	}
+
+	public boolean updateTeam(String name, TeamModel team) throws IOException {
+		return RpcUtils.updateTeam(name, team, url, account, password);
+	}
+
+	public boolean deleteTeam(TeamModel team) throws IOException {
+		return RpcUtils.deleteTeam(team, url, account, password);
+	}
+
 	public boolean updateSettings(Map<String, String> newSettings) throws IOException {
 		return RpcUtils.updateSettings(newSettings, url, account, password);
 	}

--
Gitblit v1.9.1