# SINCE 0.5.0\r
# RESTART REQUIRED\r
server.shutdownPort = 8081\r
+\r
+# Custom Defined Properties for Repositories\r
+# Space delimited (use quotes if labels have spaces) list of custom properties\r
+# to show up on the "Edit Repository" page, with labels. Thes custom properties will\r
+# then be available for hooks.\r
+#\r
+# E.g. "commit-msg-regex=Commit Message Regualar Expression" another-property=Another\r
+#\r
+# SINCE 1.0.0\r
+repository.customFields =
\ No newline at end of file
"gitblit", null, "indexBranch")));\r
\r
// Custom defined properties\r
- model.userDefinedProperties = new HashMap<String, String>();\r
+ model.customDefinedProperties = new HashMap<String, String>();\r
for (String aProperty : config.getNames(Constants.CUSTOM_DEFINED_PROP_SECTION, Constants.CUSTOM_DEFINED_PROP_SUBSECTION)) {\r
- model.userDefinedProperties.put(aProperty, config.getString(Constants.CUSTOM_DEFINED_PROP_SECTION, Constants.CUSTOM_DEFINED_PROP_SUBSECTION, aProperty));\r
+ model.customDefinedProperties.put(aProperty, config.getString(Constants.CUSTOM_DEFINED_PROP_SECTION, Constants.CUSTOM_DEFINED_PROP_SUBSECTION, aProperty));\r
}\r
}\r
model.HEAD = JGitUtils.getHEADRef(r);\r
updateList(config, "indexBranch", repository.indexedBranches);\r
\r
// User Defined Properties\r
- for (Entry<String, String> singleProperty : repository.userDefinedProperties.entrySet()) {\r
+ for (Entry<String, String> singleProperty : repository.customDefinedProperties.entrySet()) {\r
config.setString(Constants.CUSTOM_DEFINED_PROP_SECTION, Constants.CUSTOM_DEFINED_PROP_SUBSECTION, singleProperty.getKey(), singleProperty.getValue());\r
}\r
\r
public List<String> preReceiveScripts;\r
public List<String> postReceiveScripts;\r
public List<String> mailingLists;\r
- public Map<String, String> userDefinedProperties;\r
+ public Map<String, String> customDefinedProperties;\r
private String displayName;\r
\r
public RepositoryModel() {\r
gb.preReceiveScripts = pre-receive scripts\r
gb.postReceiveScripts = post-receive scripts\r
gb.hookScripts = hook scripts\r
+gb.customDefinedProperties = custom defined properties\r
+gb.customDefinedPropertiesDescription = custom properties available to groovy hooks\r
gb.accessPermissions = access permissions\r
gb.filters = filters\r
gb.generalDescription = common settings\r
<tr><td colspan="2"><h3><wicket:message key="gb.hookScripts"></wicket:message> <small><wicket:message key="gb.hookScriptsDescription"></wicket:message></small></h3></td></tr> \r
<tr><th style="vertical-align: top;"><wicket:message key="gb.preReceiveScripts"></wicket:message><p></p><span wicket:id="inheritedPreReceive"></span></th><td style="padding:2px;"><span wicket:id="preReceiveScripts"></span></td></tr>\r
<tr><th style="vertical-align: top;"><wicket:message key="gb.postReceiveScripts"></wicket:message><p></p><span wicket:id="inheritedPostReceive"></span></th><td style="padding:2px;"><span wicket:id="postReceiveScripts"></span></td></tr>\r
- <tr><td colspan='2'><div class="form-actions"><input class="btn btn-primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="16" /> <input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="17" /></div></td></tr>\r
+ <div wicket:id="customDefinedPropertiesSection">\r
+ <tr><td colspan="2"><h3><wicket:message key="gb.customDefinedProperties"></wicket:message> <small><wicket:message key="gb.customDefinedPropertiesDescription"></wicket:message></small></h3></td></tr>\r
+ <tr wicket:id="customDefinedProperties"><th style="vertical-align: top;"><span wicket:id="customLabel"></span></th><td class="edit"><input class="span8" type="text" wicket:id="customValue" size="30" tabindex="16" /></td></tr>\r
+ </div>\r
+ <tr><td colspan='2'><div class="form-actions"><input class="btn btn-primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="17" /> <input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="18" /></div></td></tr>\r
</tbody>\r
</table>\r
</form> \r
package com.gitblit.wicket.pages;\r
\r
import java.text.MessageFormat;\r
+import java.util.AbstractMap;\r
import java.util.ArrayList;\r
import java.util.Arrays;\r
import java.util.Collections;\r
import java.util.Iterator;\r
import java.util.List;\r
import java.util.Map;\r
+import java.util.Map.Entry;\r
import java.util.Set;\r
\r
import org.apache.wicket.PageParameters;\r
import org.apache.wicket.behavior.SimpleAttributeModifier;\r
import org.apache.wicket.extensions.markup.html.form.palette.Palette;\r
+import org.apache.wicket.markup.html.WebMarkupContainer;\r
+import org.apache.wicket.markup.html.basic.Label;\r
import org.apache.wicket.markup.html.form.Button;\r
import org.apache.wicket.markup.html.form.CheckBox;\r
import org.apache.wicket.markup.html.form.DropDownChoice;\r
import org.apache.wicket.markup.html.form.Form;\r
import org.apache.wicket.markup.html.form.IChoiceRenderer;\r
import org.apache.wicket.markup.html.form.TextField;\r
+import org.apache.wicket.markup.html.list.ListItem;\r
+import org.apache.wicket.markup.html.list.ListItemModel;\r
+import org.apache.wicket.markup.html.list.ListView;\r
import org.apache.wicket.model.CompoundPropertyModel;\r
import org.apache.wicket.model.IModel;\r
import org.apache.wicket.model.Model;\r
import org.apache.wicket.model.util.CollectionModel;\r
import org.apache.wicket.model.util.ListModel;\r
\r
+import com.gitblit.Constants;\r
import com.gitblit.Constants.AccessRestrictionType;\r
import com.gitblit.Constants.FederationStrategy;\r
-import com.gitblit.Constants;\r
import com.gitblit.GitBlit;\r
import com.gitblit.GitBlitException;\r
import com.gitblit.Keys;\r
new ListModel<String>(postReceiveScripts), new CollectionModel<String>(GitBlit\r
.self().getPostReceiveScriptsUnused(repositoryModel)),\r
new StringChoiceRenderer(), 12, true);\r
+ \r
+ // Dynamic Custom Defined Properties Properties\r
+ final List<Entry<String, String>> definedProperties = new ArrayList<Entry<String, String>>();\r
+ List<String> customFields = GitBlit.getStrings(Keys.repository.customFields);\r
+ for (String customFieldDef : customFields) {\r
+ String[] customFieldProperty = customFieldDef.split("=");\r
+ definedProperties.add(new AbstractMap.SimpleEntry<String, String>(customFieldProperty[0], customFieldProperty[1]));\r
+ }\r
+ \r
+ final ListView<Entry<String, String>> customDefinedProperties = new ListView<Entry<String, String>>("customDefinedProperties", definedProperties) {\r
+ @Override\r
+ protected void populateItem(ListItem<Entry<String, String>> item) {\r
+ String value = repositoryModel.customDefinedProperties.get(item.getModelObject().getKey());\r
+ \r
+ item.add(new Label(item.getModelObject().getKey(), item.getModelObject().getValue())); // Used to get the key later\r
+ item.add(new Label("customLabel", item.getModelObject().getValue()));\r
+ item.add(new TextField<String>("customValue", new Model<String>(value)));\r
+ }\r
+ };\r
+ customDefinedProperties.setReuseItems(true);\r
\r
CompoundPropertyModel<RepositoryModel> model = new CompoundPropertyModel<RepositoryModel>(\r
repositoryModel);\r
postReceiveScripts.add(post.next());\r
}\r
repositoryModel.postReceiveScripts = postReceiveScripts;\r
-\r
+ \r
+ // Loop over each of the user defined properties\r
+ for (int i = 0; i < customDefinedProperties.size(); i++) {\r
+ ListItem<ListItemModel<String>> item = (ListItem<ListItemModel<String>>) customDefinedProperties.get(i);\r
+ String key = item.get(0).getId(); // Item 0 is our 'fake' label\r
+ String value = ((TextField<String>)item.get(2)).getValue(); // Item 2 is out text box\r
+ \r
+ repositoryModel.customDefinedProperties.put(key, value);\r
+ }\r
+ \r
// save the repository\r
GitBlit.self().updateRepositoryModel(oldName, repositoryModel, isCreate);\r
\r
form.add(postReceivePalette);\r
form.add(new BulletListPanel("inheritedPostReceive", "inherited", GitBlit.self()\r
.getPostReceiveScriptsInherited(repositoryModel)));\r
+ \r
+ WebMarkupContainer customDefinedPropertiesSection = new WebMarkupContainer("customDefinedPropertiesSection") {\r
+ public boolean isVisible() {\r
+ return GitBlit.getString(Keys.repository.customFields, "").isEmpty() == false;\r
+ };\r
+ };\r
+ customDefinedPropertiesSection.add(customDefinedProperties);\r
+ form.add(customDefinedPropertiesSection);\r
\r
form.add(new Button("save"));\r
Button cancel = new Button("cancel") {\r
RepositoryModel model = GitBlit.self().getRepositoryModel(
GitBlitSuite.getHelloworldRepository().getDirectory().getName());
- assertEquals("\\d", model.userDefinedProperties.get("commitMessageRegEx"));
- assertEquals("Hello", model.userDefinedProperties.get("anotherProperty"));
+ assertEquals("\\d", model.customDefinedProperties.get("commitMessageRegEx"));
+ assertEquals("Hello", model.customDefinedProperties.get("anotherProperty"));
}
@Test
RepositoryModel model = GitBlit.self().getRepositoryModel(
GitBlitSuite.getHelloworldRepository().getDirectory().getName());
- assertEquals("\\d", model.userDefinedProperties.get("commitMessageRegEx"));
- assertEquals("Hello", model.userDefinedProperties.get("anotherProperty"));
+ assertEquals("\\d", model.customDefinedProperties.get("commitMessageRegEx"));
+ assertEquals("Hello", model.customDefinedProperties.get("anotherProperty"));
- assertEquals("Hello", model.userDefinedProperties.put("anotherProperty", "GoodBye"));
+ assertEquals("Hello", model.customDefinedProperties.put("anotherProperty", "GoodBye"));
GitBlit.self().updateRepositoryModel(model.name, model, false);
model = GitBlit.self().getRepositoryModel(
GitBlitSuite.getHelloworldRepository().getDirectory().getName());
- assertEquals("\\d", model.userDefinedProperties.get("commitMessageRegEx"));
- assertEquals("GoodBye", model.userDefinedProperties.get("anotherProperty"));
+ assertEquals("\\d", model.customDefinedProperties.get("commitMessageRegEx"));
+ assertEquals("GoodBye", model.customDefinedProperties.get("anotherProperty"));
}
}