RPC support for hook script selection
diff --git a/src/com/gitblit/RpcServlet.java b/src/com/gitblit/RpcServlet.java
index 115d553..c33bd8a 100644
--- a/src/com/gitblit/RpcServlet.java
+++ b/src/com/gitblit/RpcServlet.java
@@ -276,7 +276,7 @@
 			}

 		} else if (RpcRequest.LIST_SETTINGS.equals(reqType)) {

 			// return the server's settings

-			ServerSettings settings = GitBlit.self().getSettingsModel();

+			ServerSettings settings = GitBlit.self().getSettingsModel();			

 			if (allowAdmin) {

 				// return all settings

 				result = settings;

@@ -294,10 +294,13 @@
 					keys.add(Keys.federation.sets);

 				}

 				// build the settings

-				ServerSettings managementSettings = new ServerSettings();

+				ServerSettings managementSettings = new ServerSettings();				

 				for (String key : keys) {

 					managementSettings.add(settings.get(key));

 				}

+				if (allowManagement) {

+					settings.pushScripts = settings.pushScripts;

+				}

 				result = managementSettings;

 			}

 		} else if (RpcRequest.EDIT_SETTINGS.equals(reqType)) {

diff --git a/src/com/gitblit/client/EditRepositoryDialog.java b/src/com/gitblit/client/EditRepositoryDialog.java
index a70a617..44b6fc6 100644
--- a/src/com/gitblit/client/EditRepositoryDialog.java
+++ b/src/com/gitblit/client/EditRepositoryDialog.java
@@ -88,7 +88,7 @@
 	private JCheckBox skipSummaryMetrics;

 

 	private JCheckBox isFrozen;

-	

+

 	private JTextField mailRecipientsField;

 

 	private JComboBox accessRestriction;

@@ -98,11 +98,15 @@
 	private JComboBox ownerField;

 

 	private JPalette<String> usersPalette;

-	

+

 	private JPalette<String> setsPalette;

-	

+

 	private JPalette<String> teamsPalette;

 

+	private JPalette<String> preReceivePalette;

+

+	private JPalette<String> postReceivePalette;

+

 	private Set<String> repositoryNames;

 

 	public EditRepositoryDialog(int protocolVersion) {

@@ -162,7 +166,7 @@
 

 		mailRecipientsField = new JTextField(anRepository.mailRecipients == null ? ""

 				: StringUtils.flattenStrings(anRepository.mailRecipients, " "), 50);

-		

+

 		accessRestriction = new JComboBox(AccessRestrictionType.values());

 		accessRestriction.setRenderer(new AccessRestrictionRenderer());

 		accessRestriction.setSelectedItem(anRepository.accessRestriction);

@@ -216,6 +220,18 @@
 		federationPanel.add(newFieldPanel(Translation.get("gb.federationSets"), setsPalette),

 				BorderLayout.CENTER);

 

+		preReceivePalette = new JPalette<String>(true);

+		JPanel preReceivePanel = new JPanel(new BorderLayout(5, 5));

+		preReceivePanel.add(

+				newFieldPanel(Translation.get("gb.preReceiveScripts"), preReceivePalette),

+				BorderLayout.CENTER);

+

+		postReceivePalette = new JPalette<String>(true);

+		JPanel postReceivePanel = new JPanel(new BorderLayout(5, 5));

+		postReceivePanel.add(

+				newFieldPanel(Translation.get("gb.postReceiveScripts"), postReceivePalette),

+				BorderLayout.CENTER);

+

 		JTabbedPane panel = new JTabbedPane(JTabbedPane.TOP);

 		panel.addTab(Translation.get("gb.general"), fieldsPanel);

 		panel.addTab(Translation.get("gb.accessRestriction"), accessPanel);

@@ -223,6 +239,8 @@
 			panel.addTab(Translation.get("gb.teams"), teamsPanel);

 		}

 		panel.addTab(Translation.get("gb.federation"), federationPanel);

+		panel.addTab(Translation.get("gb.preReceiveScripts"), preReceivePanel);

+		panel.addTab(Translation.get("gb.postReceiveScripts"), postReceivePanel);

 

 		JButton createButton = new JButton(Translation.get("gb.save"));

 		createButton.addActionListener(new ActionListener() {

@@ -352,8 +370,9 @@
 		repository.skipSizeCalculation = skipSizeCalculation.isSelected();

 		repository.skipSummaryMetrics = skipSummaryMetrics.isSelected();

 		repository.isFrozen = isFrozen.isSelected();

-		

-		repository.mailRecipients = StringUtils.getStringsFromValue(mailRecipientsField.getText().trim(), " ");

+

+		repository.mailRecipients = StringUtils.getStringsFromValue(mailRecipientsField.getText()

+				.trim(), " ");

 

 		repository.accessRestriction = (AccessRestrictionType) accessRestriction.getSelectedItem();

 		repository.federationStrategy = (FederationStrategy) federationStrategy.getSelectedItem();

@@ -361,6 +380,9 @@
 		if (repository.federationStrategy.exceeds(FederationStrategy.EXCLUDE)) {

 			repository.federationSets = setsPalette.getSelections();

 		}

+

+		repository.preReceiveScripts = preReceivePalette.getSelections();

+		repository.postReceiveScripts = postReceivePalette.getSelections();

 		return true;

 	}

 

@@ -376,7 +398,7 @@
 		}

 		usersPalette.setObjects(all, selected);

 	}

-	

+

 	public void setTeams(List<String> all, List<String> selected) {

 		teamsPalette.setObjects(all, selected);

 	}

@@ -396,6 +418,14 @@
 		setsPalette.setObjects(all, selected);

 	}

 

+	public void setPreReceiveScripts(List<String> all, List<String> selected) {

+		preReceivePalette.setObjects(all, selected);

+	}

+

+	public void setPostReceiveScripts(List<String> all, List<String> selected) {

+		postReceivePalette.setObjects(all, selected);

+	}

+

 	public RepositoryModel getRepository() {

 		if (canceled) {

 			return null;

diff --git a/src/com/gitblit/client/GitblitClient.java b/src/com/gitblit/client/GitblitClient.java
index b944486..f9af8df 100644
--- a/src/com/gitblit/client/GitblitClient.java
+++ b/src/com/gitblit/client/GitblitClient.java
@@ -183,6 +183,13 @@
 		}

 	}

 

+	public List<String> getAvailableScripts() {

+		if (settings.pushScripts == null) {

+			return new ArrayList<String>();

+		}

+		return settings.pushScripts;

+	}

+

 	public ServerSettings getSettings() {

 		return settings;

 	}

diff --git a/src/com/gitblit/client/JPalette.java b/src/com/gitblit/client/JPalette.java
index eb445b4..699b271 100644
--- a/src/com/gitblit/client/JPalette.java
+++ b/src/com/gitblit/client/JPalette.java
@@ -40,6 +40,10 @@
 	private PaletteModel<T> selectedModel;

 

 	public JPalette() {

+		this(false);

+	}

+

+	public JPalette(boolean controlOrder) {

 		super(new BorderLayout(5, 5));

 

 		availableModel = new PaletteModel<T>();

@@ -86,9 +90,37 @@
 			}

 		});

 

+		JButton up = new JButton("\u2191");

+		up.addActionListener(new ActionListener() {

+			public void actionPerformed(ActionEvent event) {

+				int row = selected.getSelectedRow();

+				if (row > 0) {

+					T o = selectedModel.list.remove(row);

+					selectedModel.list.add(row - 1, o);

+					selectedModel.fireTableDataChanged();

+				}

+			}

+		});

+

+		JButton down = new JButton("\u2193");

+		down.addActionListener(new ActionListener() {

+			public void actionPerformed(ActionEvent event) {

+				int row = selected.getSelectedRow();

+				if (row < selected.getRowCount() - 1) {

+					T o = selectedModel.list.remove(row);

+					selectedModel.list.add(row + 1, o);

+					selectedModel.fireTableDataChanged();

+				}

+			}

+		});

+

 		JPanel controls = new JPanel(new GridLayout(0, 1, 0, 5));

 		controls.add(add);

 		controls.add(subtract);

+		if (controlOrder) {

+			controls.add(up);

+			controls.add(down);

+		}

 

 		JPanel center = new JPanel(new GridBagLayout());

 		center.add(controls);

diff --git a/src/com/gitblit/client/RepositoriesPanel.java b/src/com/gitblit/client/RepositoriesPanel.java
index cd3f46b..2994b76 100644
--- a/src/com/gitblit/client/RepositoriesPanel.java
+++ b/src/com/gitblit/client/RepositoriesPanel.java
@@ -277,7 +277,7 @@
 	protected abstract void subscribeFeeds(List<FeedModel> feeds);

 

 	protected abstract void updateUsersTable();

-	

+

 	protected abstract void updateTeamsTable();

 

 	protected void disableManagement() {

@@ -357,6 +357,8 @@
 		dialog.setTeams(gitblit.getTeamnames(), null);

 		dialog.setRepositories(gitblit.getRepositories());

 		dialog.setFederationSets(gitblit.getFederationSets(), null);

+		dialog.setPreReceiveScripts(gitblit.getAvailableScripts(), null);

+		dialog.setPostReceiveScripts(gitblit.getAvailableScripts(), null);

 		dialog.setVisible(true);

 		final RepositoryModel newRepository = dialog.getRepository();

 		final List<String> permittedUsers = dialog.getPermittedUsers();

@@ -369,7 +371,8 @@
 

 			@Override

 			protected Boolean doRequest() throws IOException {

-				boolean success = gitblit.createRepository(newRepository, permittedUsers, permittedTeams);

+				boolean success = gitblit.createRepository(newRepository, permittedUsers,

+						permittedTeams);

 				if (success) {

 					gitblit.refreshRepositories();

 					if (permittedUsers.size() > 0) {

@@ -405,7 +408,8 @@
 	 * @param repository

 	 */

 	protected void editRepository(final RepositoryModel repository) {

-		EditRepositoryDialog dialog = new EditRepositoryDialog(gitblit.getProtocolVersion(), repository);

+		EditRepositoryDialog dialog = new EditRepositoryDialog(gitblit.getProtocolVersion(),

+				repository);

 		dialog.setLocationRelativeTo(RepositoriesPanel.this);

 		List<String> usernames = gitblit.getUsernames();

 		List<String> members = gitblit.getPermittedUsernames(repository);

@@ -413,6 +417,8 @@
 		dialog.setTeams(gitblit.getTeamnames(), gitblit.getPermittedTeamnames(repository));

 		dialog.setRepositories(gitblit.getRepositories());

 		dialog.setFederationSets(gitblit.getFederationSets(), repository.federationSets);

+		dialog.setPreReceiveScripts(gitblit.getAvailableScripts(), repository.preReceiveScripts);

+		dialog.setPostReceiveScripts(gitblit.getAvailableScripts(), repository.postReceiveScripts);

 		dialog.setVisible(true);

 		final RepositoryModel revisedRepository = dialog.getRepository();

 		final List<String> permittedUsers = dialog.getPermittedUsers();

diff --git a/src/com/gitblit/models/ServerSettings.java b/src/com/gitblit/models/ServerSettings.java
index 3aae2e3..72a7f00 100644
--- a/src/com/gitblit/models/ServerSettings.java
+++ b/src/com/gitblit/models/ServerSettings.java
@@ -35,6 +35,8 @@
 

 	private static final long serialVersionUID = 1L;

 

+	public List<String> pushScripts;

+

 	public ServerSettings() {

 		settings = new TreeMap<String, SettingModel>();

 	}