Skip to content
This repository was archived by the owner on Jun 9, 2021. It is now read-only.

Commit 5a16a69

Browse files
committed
Adding buttons after refactoring #109
1 parent d937d3c commit 5a16a69

File tree

11 files changed

+75
-55
lines changed

11 files changed

+75
-55
lines changed

CHANGELOG.md

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,26 @@ Changelog of Pull Request Notifier for Bitbucket.
44

55
## Unreleased
66
### GitHub [#109](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/issues/109) Refactor admin pages
7-
Adding migration code for old settings format
7+
Adding buttons after refactoring
88

9-
[103427258c50c4b](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/103427258c50c4b) Tomas Bjerre *2016-05-08 11:55:28*
9+
[4647eea2af4d8f7](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/4647eea2af4d8f7) Tomas Bjerre *2016-05-08 20:22:34*
1010

11-
Admin GUI
11+
Adding migration code for old settings format
12+
13+
[d937d3cc18bdfd0](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/d937d3cc18bdfd0) Tomas Bjerre *2016-05-08 13:08:07*
1214

13-
* Also adding EVERYTHING_URL variable . Resolved to every other variable.
15+
Admin GUI
1416

15-
[da4e64ab06398ff](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/da4e64ab06398ff) Tomas Bjerre *2016-05-08 08:16:03*
17+
[319f5de5c123e06](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/319f5de5c123e06) Tomas Bjerre *2016-05-08 13:07:55*
1618

1719
Refactoring
1820

1921
[3e1fddaecb4aab8](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/3e1fddaecb4aab8) Tomas Bjerre *2016-05-03 16:01:52*
2022

21-
### GitHub [#114](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/issues/114) variable which contains all valid variables?
22-
Admin GUI
23-
24-
* Also adding EVERYTHING_URL variable . Resolved to every other variable.
25-
26-
[da4e64ab06398ff](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/da4e64ab06398ff) Tomas Bjerre *2016-05-08 08:16:03*
27-
2823
### GitHub [#25](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/issues/25) Enable configuration in per-repository hook screen
29-
Admin GUI
30-
31-
* Also adding EVERYTHING_URL variable . Resolved to every other variable.
24+
Admin GUI
3225

33-
[da4e64ab06398ff](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/da4e64ab06398ff) Tomas Bjerre *2016-05-08 08:16:03*
26+
[319f5de5c123e06](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/319f5de5c123e06) Tomas Bjerre *2016-05-08 13:07:55*
3427

3528
Adding repo and global admin pages
3629

@@ -41,17 +34,11 @@ Changelog of Pull Request Notifier for Bitbucket.
4134
[1fc12a72100afe8](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/1fc12a72100afe8) Tomas Bjerre *2016-05-03 16:44:25*
4235

4336
### GitHub [#55](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/issues/55) remove width limit
44-
Admin GUI
45-
46-
* Also adding EVERYTHING_URL variable . Resolved to every other variable.
37+
Admin GUI
4738

48-
[da4e64ab06398ff](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/da4e64ab06398ff) Tomas Bjerre *2016-05-08 08:16:03*
39+
[319f5de5c123e06](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/319f5de5c123e06) Tomas Bjerre *2016-05-08 13:07:55*
4940

5041
### No issue
51-
Adding migration code for old settings format
52-
53-
[515086b440e76de](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/515086b440e76de) Tomas Bjerre *2016-05-08 08:48:18*
54-
5542
changelog maven plugin 1.29
5643

5744
[25ccd05b465bd4a](https://github.com/tomasbjerre/pull-request-notifier-for-bitbucket/commit/25ccd05b465bd4a) Tomas Bjerre *2016-04-14 16:36:16*

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ Some rest resources are available. You can figure out the JSON structure by look
115115
* `GET /projectKey/{projectKey}` Get all buttons for the project.
116116
* `GET /projectKey/{projectKey}/repositorySlug/{repositorySlug}` Get all buttons for the project and repository.
117117
* `POST` Save a button.
118-
* `POST /press` Press the button.
118+
* `POST {uuid}/press/repository/{repositoryId}/pullrequest/{pullRequestId}` Press the button.
119119

120120
### Jenkins
121121
Parameterized Jenkins jobs can be triggered remotely via:

src/main/java/se/bjurr/prnfb/presentation/ButtonServlet.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import javax.ws.rs.Path;
1919
import javax.ws.rs.PathParam;
2020
import javax.ws.rs.Produces;
21-
import javax.ws.rs.QueryParam;
2221
import javax.ws.rs.core.Response;
2322

2423
import se.bjurr.prnfb.presentation.dto.ButtonDTO;
@@ -128,11 +127,11 @@ public Response get(@PathParam("uuid") UUID uuid) {
128127
}
129128

130129
@POST
131-
@Path("/press")
130+
@Path("{uuid}/press/repository/{repositoryId}/pullrequest/{pullRequestId}")
132131
@XsrfProtectionExcluded
133132
@Produces(APPLICATION_JSON)
134-
public Response press(@QueryParam("repositoryId") Integer repositoryId,
135-
@QueryParam("pullRequestId") Long pullRequestId, @QueryParam("uuid") final UUID buttionUuid) {
133+
public Response press(@PathParam("repositoryId") Integer repositoryId, @PathParam("pullRequestId") Long pullRequestId,
134+
@PathParam("uuid") final UUID buttionUuid) {
136135
PrnfbButton button = this.settingsService.getButton(buttionUuid);
137136
if (!this.userCheckService.isAllowedUseButton(button)) {
138137
return status(UNAUTHORIZED).build();

src/main/java/se/bjurr/prnfb/service/PrnfbRenderer.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.atlassian.bitbucket.repository.RepositoryService;
1717
import com.atlassian.bitbucket.server.ApplicationPropertiesService;
1818
import com.atlassian.bitbucket.user.ApplicationUser;
19+
import com.google.common.annotations.VisibleForTesting;
1920
import com.google.common.base.Supplier;
2021

2122
public class PrnfbRenderer {
@@ -64,12 +65,7 @@ private String getRenderedString(String string, Boolean forUrl, ClientKeyStore c
6465
String resolved = variable.resolve(this.pullRequest, this.pullRequestAction, this.applicationUser,
6566
this.repositoryService, this.propertiesService, this.prnfbNotification, this.variables, clientKeyStore,
6667
shouldAcceptAnyCertificate);
67-
string = string.replaceAll(regExpStr, forUrl ? encode(resolved, UTF_8.name()) : resolved);
68-
return string;
69-
}
70-
71-
private String regexp(PrnfbVariable variable) {
72-
return "\\$\\{" + variable.name() + "\\}";
68+
return getRenderedStringResolved(string, forUrl, regExpStr, resolved);
7369
}
7470

7571
private String renderVariable(String string, Boolean forUrl, ClientKeyStore clientKeyStore,
@@ -84,4 +80,21 @@ private String renderVariable(String string, Boolean forUrl, ClientKeyStore clie
8480
}
8581
return string;
8682
}
83+
84+
@VisibleForTesting
85+
String getRenderedStringResolved(String string, Boolean forUrl, final String regExpStr, String resolved)
86+
throws UnsupportedEncodingException {
87+
String replaceWith = forUrl ? encode(resolved, UTF_8.name()) : resolved;
88+
try {
89+
string = string.replaceAll(regExpStr, replaceWith);
90+
} catch (IllegalArgumentException e) {
91+
throw new RuntimeException("Tried to replace " + regExpStr + " with " + replaceWith, e);
92+
}
93+
return string;
94+
}
95+
96+
@VisibleForTesting
97+
String regexp(PrnfbVariable variable) {
98+
return "\\$\\{" + variable.name() + "\\}";
99+
}
87100
}

src/main/java/se/bjurr/prnfb/service/PrnfbVariable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public String resolve(PullRequest pullRequest, PrnfbPullRequestAction pullReques
5353
List<String> parts = newArrayList();
5454
for (PrnfbVariable v : PrnfbVariable.values()) {
5555
if (v != EVERYTHING_URL) {
56-
parts.add(v.name() + "=${" + v.name() + "}");
56+
parts.add(v.name() + "=\\${" + v.name() + "}");
5757
}
5858
}
5959
return on('&').join(parts);

src/main/java/se/bjurr/prnfb/service/SettingsService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package se.bjurr.prnfb.service;
22

33
import static com.atlassian.bitbucket.permission.Permission.ADMIN;
4+
import static com.google.common.base.Joiner.on;
45
import static com.google.common.base.Predicates.not;
56
import static com.google.common.base.Throwables.propagate;
67
import static com.google.common.collect.Iterables.filter;
@@ -111,7 +112,11 @@ public Optional<PrnfbNotification> findNotification(UUID notificationUuid) {
111112
}
112113

113114
public PrnfbButton getButton(UUID buttionUuid) {
114-
return find(getButtons(), withUuid(buttionUuid));
115+
Optional<PrnfbButton> foundOpt = findButton(buttionUuid);
116+
if (!foundOpt.isPresent()) {
117+
throw new RuntimeException(buttionUuid + " not fond in:\n" + on('\n').join(getButtons()));
118+
}
119+
return foundOpt.get();
115120
}
116121

117122
public List<PrnfbButton> getButtons() {

src/main/resources/admin.vm

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -294,15 +294,15 @@
294294
</legend>
295295
<div class="radio">
296296
<label>
297-
<input class="radio" type="radio" name="ALWAYS"> trigger for any merge condition</label>
297+
<input class="radio" type="radio" name="triggerIfCanMerge" value="ALWAYS"> trigger for any merge condition</label>
298298
</div>
299299
<div class="radio">
300300
<label>
301-
<input class="radio" type="radio" name="CONFLICTING"> trigger only when merge is conflicting</label>
301+
<input class="radio" type="radio" name="triggerIfCanMerge" value="CONFLICTING"> trigger only when merge is conflicting</label>
302302
</div>
303303
<div class="radio">
304304
<label>
305-
<input class="radio" type="radio" name="NOT_CONFLICTING"> trigger only when merge is not conflicting</label>
305+
<input class="radio" type="radio" name="triggerIfCanMerge" value="NOT_CONFLICTING"> trigger only when merge is not conflicting</label>
306306
</div>
307307
</fieldset>
308308

@@ -482,11 +482,8 @@
482482
<input class="text text-field" type="text" name="headers[][value]" value="{value}">
483483
</div>
484484
</script>
485-
<div class="listfields template" data-template="header-template" data-field="headers" data-target=".listfields">
486-
<div class="field-group listfield">
487-
<input class="text text-field" type="text" name="headers[][name]">
488-
<input class="text text-field" type="text" name="headers[][value]">
489-
</div>
485+
<div class="listfields template" data-template="header-template" data-field="headers" data-target=".listfields" data-empty="{'name':'','value':''}">
486+
490487
</div>
491488
</fieldset>
492489

src/main/resources/pr-triggerbutton.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ define('plugin/prnfb/pr-triggerbutton', [
44
'bitbucket/util/state'
55
], function($, AJS, pageState) {
66

7-
var getResourceUrl = function() {
8-
return AJS.contextPath() + '/rest/prnfb-admin/1.0/manual/?repositoryId=' + pageState.getRepository().id + '&pullRequestId=' + pageState.getPullRequest().id;
9-
};
7+
var buttonsAdminUrl = AJS.contextPath() + "/rest/prnfb-admin/1.0/settings/buttons"; 
108

119
var waiting = '<span class="aui-icon aui-icon-wait aui-icon-small">Wait</span>';
1210

@@ -30,18 +28,18 @@ define('plugin/prnfb/pr-triggerbutton', [
3028
function loadSettingsAndShowButtons() {
3129
var hasButtons = false;
3230
$buttonDropdownItems.empty();
33-
$.get(getResourceUrl(), function(settings) {
31+
$.get(buttonsAdminUrl + '/repository/' + pageState.getRepository().id + '/pullrequest/' + pageState.getPullRequest().id, function(settings) {
3432
settings.forEach(function(item) {
3533
hasButtons = true;
3634

37-
var $buttonDropdownItem = $('<li><a class="aui-icon-container" href="#">' + item.title + '</a></li>');
35+
var $buttonDropdownItem = $('<li><a class="aui-icon-container" href="#">' + item.name + '</a></li>');
3836
$buttonDropdownItem.find("a").click(function() {
3937
var $this = $(this);
4038
$this.attr("disabled", "disabled");
4139
$this.attr("aria-disabled", "true");
4240
$this.prepend(waiting);
4341

44-
$.post(getResourceUrl() + '&formIdentifier=' + item.formIdentifier, function() {
42+
$.post(buttonsAdminUrl + '/' + item.uuid + '/press/repository/' + pageState.getRepository().id + '/pullrequest/' + pageState.getPullRequest().id, function() {
4543
setTimeout(function() {
4644
$this.removeAttr("disabled");
4745
$this.removeAttr("aria-disabled");

src/main/resources/utils.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,15 @@ define('plugin/prnfb/utils', [
153153
var template = $(el).data('template');
154154
var field = $(el).data('field');
155155
var target = $(el).data('target');
156+
var emptyJson = $(el).data('empty').replace(/\'/g, '"');
157+
var empty = JSON.parse(emptyJson);
156158
var rendered = "";
157-
for (var i = 0; i < data[field].length; i++)
158-
rendered += AJS.template.load(template).fill(data[field][i]);
159+
if (data[field]) {
160+
for (var i = 0; i < data[field].length; i++) {
161+
rendered += AJS.template.load(template).fill(data[field][i]);
162+
}
163+
}
164+
rendered += AJS.template.load(template).fill(empty);
159165
$(target).html(rendered);
160166
});
161167
}
@@ -214,6 +220,8 @@ define('plugin/prnfb/utils', [
214220
}
215221
});
216222

223+
populateForm(formSelector, {});
224+
217225
$(formSelector).submit(function(e) {
218226
e.preventDefault();
219227
postForm(restResource, formSelector, populateSelect);

src/test/java/se/bjurr/prnfb/service/PrnfbRendererTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
import static org.mockito.Mockito.when;
66
import static org.mockito.MockitoAnnotations.initMocks;
77
import static se.bjurr.prnfb.listener.PrnfbPullRequestAction.APPROVED;
8+
import static se.bjurr.prnfb.service.PrnfbVariable.EVERYTHING_URL;
89
import static se.bjurr.prnfb.service.PrnfbVariable.INJECTION_URL_VALUE;
910
import static se.bjurr.prnfb.service.PrnfbVariable.PULL_REQUEST_COMMENT_TEXT;
1011
import static se.bjurr.prnfb.service.PrnfbVariable.PULL_REQUEST_FROM_HASH;
1112
import static se.bjurr.prnfb.service.PrnfbVariable.PULL_REQUEST_MERGE_COMMIT;
1213
import static se.bjurr.prnfb.settings.PrnfbNotificationBuilder.prnfbNotificationBuilder;
1314

15+
import java.io.UnsupportedEncodingException;
1416
import java.util.Map;
1517

1618
import org.junit.Before;
@@ -72,10 +74,21 @@ public void before() throws ValidationException {
7274
public void invoke(UrlInvoker toInvoke) {
7375
toInvoke.setResponseString("theResponse");
7476
}
75-
7677
});
7778
}
7879

80+
@Test
81+
public void testThatEverythingCanBeRendered() throws UnsupportedEncodingException {
82+
String actual = this.sut.getRenderedStringResolved("asd ${" + EVERYTHING_URL.name() + "} asd", this.forUrl, this.sut
83+
.regexp(EVERYTHING_URL), EVERYTHING_URL.resolve(this.pullRequest, this.pullRequestAction, this.applicationUser,
84+
this.repositoryService, this.propertiesService, this.prnfbNotification, this.variables, this.clientKeyStore,
85+
this.shouldAcceptAnyCertificate));
86+
87+
assertThat(actual)//
88+
.isEqualTo(
89+
"asd BUTTON_TRIGGER_TITLE=${BUTTON_TRIGGER_TITLE}&INJECTION_URL_VALUE=${INJECTION_URL_VALUE}&PULL_REQUEST_ACTION=${PULL_REQUEST_ACTION}&PULL_REQUEST_AUTHOR_DISPLAY_NAME=${PULL_REQUEST_AUTHOR_DISPLAY_NAME}&PULL_REQUEST_AUTHOR_EMAIL=${PULL_REQUEST_AUTHOR_EMAIL}&PULL_REQUEST_AUTHOR_ID=${PULL_REQUEST_AUTHOR_ID}&PULL_REQUEST_AUTHOR_NAME=${PULL_REQUEST_AUTHOR_NAME}&PULL_REQUEST_AUTHOR_SLUG=${PULL_REQUEST_AUTHOR_SLUG}&PULL_REQUEST_COMMENT_TEXT=${PULL_REQUEST_COMMENT_TEXT}&PULL_REQUEST_FROM_BRANCH=${PULL_REQUEST_FROM_BRANCH}&PULL_REQUEST_FROM_HASH=${PULL_REQUEST_FROM_HASH}&PULL_REQUEST_FROM_HTTP_CLONE_URL=${PULL_REQUEST_FROM_HTTP_CLONE_URL}&PULL_REQUEST_FROM_ID=${PULL_REQUEST_FROM_ID}&PULL_REQUEST_FROM_REPO_ID=${PULL_REQUEST_FROM_REPO_ID}&PULL_REQUEST_FROM_REPO_NAME=${PULL_REQUEST_FROM_REPO_NAME}&PULL_REQUEST_FROM_REPO_PROJECT_ID=${PULL_REQUEST_FROM_REPO_PROJECT_ID}&PULL_REQUEST_FROM_REPO_PROJECT_KEY=${PULL_REQUEST_FROM_REPO_PROJECT_KEY}&PULL_REQUEST_FROM_REPO_SLUG=${PULL_REQUEST_FROM_REPO_SLUG}&PULL_REQUEST_FROM_SSH_CLONE_URL=${PULL_REQUEST_FROM_SSH_CLONE_URL}&PULL_REQUEST_ID=${PULL_REQUEST_ID}&PULL_REQUEST_MERGE_COMMIT=${PULL_REQUEST_MERGE_COMMIT}&PULL_REQUEST_PARTICIPANTS_APPROVED_COUNT=${PULL_REQUEST_PARTICIPANTS_APPROVED_COUNT}&PULL_REQUEST_REVIEWERS=${PULL_REQUEST_REVIEWERS}&PULL_REQUEST_REVIEWERS_APPROVED_COUNT=${PULL_REQUEST_REVIEWERS_APPROVED_COUNT}&PULL_REQUEST_REVIEWERS_ID=${PULL_REQUEST_REVIEWERS_ID}&PULL_REQUEST_REVIEWERS_SLUG=${PULL_REQUEST_REVIEWERS_SLUG}&PULL_REQUEST_TITLE=${PULL_REQUEST_TITLE}&PULL_REQUEST_TO_BRANCH=${PULL_REQUEST_TO_BRANCH}&PULL_REQUEST_TO_HASH=${PULL_REQUEST_TO_HASH}&PULL_REQUEST_TO_HTTP_CLONE_URL=${PULL_REQUEST_TO_HTTP_CLONE_URL}&PULL_REQUEST_TO_ID=${PULL_REQUEST_TO_ID}&PULL_REQUEST_TO_REPO_ID=${PULL_REQUEST_TO_REPO_ID}&PULL_REQUEST_TO_REPO_NAME=${PULL_REQUEST_TO_REPO_NAME}&PULL_REQUEST_TO_REPO_PROJECT_ID=${PULL_REQUEST_TO_REPO_PROJECT_ID}&PULL_REQUEST_TO_REPO_PROJECT_KEY=${PULL_REQUEST_TO_REPO_PROJECT_KEY}&PULL_REQUEST_TO_REPO_SLUG=${PULL_REQUEST_TO_REPO_SLUG}&PULL_REQUEST_TO_SSH_CLONE_URL=${PULL_REQUEST_TO_SSH_CLONE_URL}&PULL_REQUEST_URL=${PULL_REQUEST_URL}&PULL_REQUEST_USER_DISPLAY_NAME=${PULL_REQUEST_USER_DISPLAY_NAME}&PULL_REQUEST_USER_EMAIL_ADDRESS=${PULL_REQUEST_USER_EMAIL_ADDRESS}&PULL_REQUEST_USER_ID=${PULL_REQUEST_USER_ID}&PULL_REQUEST_USER_NAME=${PULL_REQUEST_USER_NAME}&PULL_REQUEST_USER_SLUG=${PULL_REQUEST_USER_SLUG}&PULL_REQUEST_VERSION=${PULL_REQUEST_VERSION} asd");
90+
}
91+
7992
@Test
8093
public void testThatInjectionUrlCanBeRendered() throws ValidationException {
8194
this.prnfbNotification = prnfbNotificationBuilder(this.prnfbNotification)//

0 commit comments

Comments
 (0)