Merge lp:~benji/juju-gui/bug-1103477 into lp:juju-gui/experimental
- bug-1103477
- Merge into trunk
Status: | Merged | ||||
---|---|---|---|---|---|
Merged at revision: | 345 | ||||
Proposed branch: | lp:~benji/juju-gui/bug-1103477 | ||||
Merge into: | lp:juju-gui/experimental | ||||
Diff against target: |
374 lines (+92/-68) 6 files modified
app/store/env.js (+13/-10) app/views/service.js (+2/-2) app/views/topology/relation.js (+9/-14) test/test_application_notifications.js (+24/-34) test/test_env.js (+9/-6) test/test_topology_relation.js (+35/-2) |
||||
To merge this branch: | bzr merge lp:~benji/juju-gui/bug-1103477 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Juju GUI Hackers | Pending | ||
Review via email: mp+144594@code.launchpad.net |
Commit message
Description of the change
Add a test for the fix for bug 1103204
This branch also includes some refactoring of where relation names are
calculated in an effort to DRY it up as well as make testing a tad easier.
Madison Scott-Clary (makyo) wrote : | # |
Gary Poster (gary) wrote : | # |
Land with changes.
Extremely nice branch, Benji. Thank you.
Gary
https:/
File app/views/
https:/
app/views/
I expected you to change this "d" argument to "relation" like your other
nice changes. Would be nice. :-)
https:/
File app/views/utils.js (right):
https:/
app/views/
data.
typo: derived
- 346. By Benji York
-
merge from trunk
- 347. By Benji York
-
give a parameter a better name
Preview Diff
1 | === modified file 'app/store/env.js' | |||
2 | --- app/store/env.js 2013-01-24 14:14:45 +0000 | |||
3 | +++ app/store/env.js 2013-01-24 19:23:21 +0000 | |||
4 | @@ -13,6 +13,9 @@ | |||
5 | 13 | Environment.superclass.constructor.apply(this, arguments); | 13 | Environment.superclass.constructor.apply(this, arguments); |
6 | 14 | } | 14 | } |
7 | 15 | 15 | ||
8 | 16 | var endpointToName = function(endpoint) { | ||
9 | 17 | return endpoint[0] + ':' + endpoint[1].name; | ||
10 | 18 | }; | ||
11 | 16 | 19 | ||
12 | 17 | Environment.NAME = 'env'; | 20 | Environment.NAME = 'env'; |
13 | 18 | Environment.ATTRS = { | 21 | Environment.ATTRS = { |
14 | @@ -204,19 +207,19 @@ | |||
15 | 204 | * Add a relation between two services. | 207 | * Add a relation between two services. |
16 | 205 | * | 208 | * |
17 | 206 | * @method add_relation | 209 | * @method add_relation |
19 | 207 | * @param {String} endpoint_a A string `service:interface` representing | 210 | * @param {Object} endpointA An array of [service, interface] representing |
20 | 208 | the first endpoint to connect. | 211 | the first endpoint to connect. |
22 | 209 | * @param {String} endpoint_b A string `service:interface` representing | 212 | * @param {Object} endpointB An array of [service, interface] representing |
23 | 210 | the second endpoint to connect. | 213 | the second endpoint to connect. |
24 | 211 | * @param {Function} callback A callable that must be called once the | 214 | * @param {Function} callback A callable that must be called once the |
25 | 212 | operation is performed. | 215 | operation is performed. |
26 | 213 | * @return {undefined} Sends a message to the server only. | 216 | * @return {undefined} Sends a message to the server only. |
27 | 214 | */ | 217 | */ |
29 | 215 | add_relation: function(endpoint_a, endpoint_b, callback) { | 218 | add_relation: function(endpointA, endpointB, callback) { |
30 | 216 | this._send_rpc({ | 219 | this._send_rpc({ |
31 | 217 | 'op': 'add_relation', | 220 | 'op': 'add_relation', |
34 | 218 | 'endpoint_a': endpoint_a, | 221 | 'endpoint_a': endpointToName(endpointA), |
35 | 219 | 'endpoint_b': endpoint_b}, callback, true); | 222 | 'endpoint_b': endpointToName(endpointB)}, callback, true); |
36 | 220 | }, | 223 | }, |
37 | 221 | 224 | ||
38 | 222 | get_charm: function(charm_url, callback) { | 225 | get_charm: function(charm_url, callback) { |
39 | @@ -311,19 +314,19 @@ | |||
40 | 311 | * Remove a relation between two services. | 314 | * Remove a relation between two services. |
41 | 312 | * | 315 | * |
42 | 313 | * @method remove_relation | 316 | * @method remove_relation |
44 | 314 | * @param {String} endpoint_a A string `service:interface` representing | 317 | * @param {Object} endpointA An array of [service, interface] representing |
45 | 315 | the first endpoint to disconnect. | 318 | the first endpoint to disconnect. |
47 | 316 | * @param {String} endpoint_b A string `service:interface` representing | 319 | * @param {Object} endpointB An array of [service, interface] representing |
48 | 317 | the second endpoint to disconnect. | 320 | the second endpoint to disconnect. |
49 | 318 | * @param {Function} callback A callable that must be called once the | 321 | * @param {Function} callback A callable that must be called once the |
50 | 319 | operation is performed. | 322 | operation is performed. |
51 | 320 | * @return {undefined} Sends a message to the server only. | 323 | * @return {undefined} Sends a message to the server only. |
52 | 321 | */ | 324 | */ |
54 | 322 | remove_relation: function(endpoint_a, endpoint_b, callback) { | 325 | remove_relation: function(endpointA, endpointB, callback) { |
55 | 323 | this._send_rpc({ | 326 | this._send_rpc({ |
56 | 324 | 'op': 'remove_relation', | 327 | 'op': 'remove_relation', |
59 | 325 | 'endpoint_a': endpoint_a, | 328 | 'endpoint_a': endpointToName(endpointA), |
60 | 326 | 'endpoint_b': endpoint_b}, callback, true); | 329 | 'endpoint_b': endpointToName(endpointB)}, callback, true); |
61 | 327 | }, | 330 | }, |
62 | 328 | 331 | ||
63 | 329 | /** | 332 | /** |
64 | 330 | 333 | ||
65 | === modified file 'app/views/service.js' | |||
66 | --- app/views/service.js 2013-01-24 14:14:45 +0000 | |||
67 | +++ app/views/service.js 2013-01-24 19:23:21 +0000 | |||
68 | @@ -445,14 +445,14 @@ | |||
69 | 445 | service = this.get('model'), | 445 | service = this.get('model'), |
70 | 446 | relation = db.relations.getById(rel_id), | 446 | relation = db.relations.getById(rel_id), |
71 | 447 | endpoints = relation.get('endpoints'), | 447 | endpoints = relation.get('endpoints'), |
73 | 448 | endpoint_a = endpoints[0][0] + ':' + endpoints[0][1].name, | 448 | endpoint_a = endpoints[0], |
74 | 449 | endpoint_b; | 449 | endpoint_b; |
75 | 450 | 450 | ||
76 | 451 | if (endpoints.length === 1) { | 451 | if (endpoints.length === 1) { |
77 | 452 | // For a peer relationship, both endpoints are the same. | 452 | // For a peer relationship, both endpoints are the same. |
78 | 453 | endpoint_b = endpoint_a; | 453 | endpoint_b = endpoint_a; |
79 | 454 | } else { | 454 | } else { |
81 | 455 | endpoint_b = endpoints[1][0] + ':' + endpoints[1][1].name; | 455 | endpoint_b = endpoints[1]; |
82 | 456 | } | 456 | } |
83 | 457 | 457 | ||
84 | 458 | ev.target.set('disabled', true); | 458 | ev.target.set('disabled', true); |
85 | 459 | 459 | ||
86 | === modified file 'app/views/topology/relation.js' | |||
87 | --- app/views/topology/relation.js 2013-01-24 19:02:40 +0000 | |||
88 | +++ app/views/topology/relation.js 2013-01-24 19:23:21 +0000 | |||
89 | @@ -445,19 +445,16 @@ | |||
90 | 445 | self.addRelation(); // Will clear the state. | 445 | self.addRelation(); // Will clear the state. |
91 | 446 | } | 446 | } |
92 | 447 | }, | 447 | }, |
94 | 448 | removeRelation: function(d, view, confirmButton) { | 448 | removeRelation: function(relation, view, confirmButton) { |
95 | 449 | var env = this.get('component').get('env'); | 449 | var env = this.get('component').get('env'); |
96 | 450 | var endpoints = d.endpoints; | ||
97 | 451 | var relationId = d.relation_id; | ||
98 | 452 | // At this time, relations may have been redrawn, so here we have to | 450 | // At this time, relations may have been redrawn, so here we have to |
99 | 453 | // retrieve the relation DOM element again. | 451 | // retrieve the relation DOM element again. |
101 | 454 | var relationElement = view.get('container').one('#' + relationId); | 452 | var relationElement = view.get('container') |
102 | 453 | .one('#' + relation.relation_id); | ||
103 | 455 | utils.addSVGClass(relationElement, 'to-remove pending-relation'); | 454 | utils.addSVGClass(relationElement, 'to-remove pending-relation'); |
107 | 456 | env.remove_relation( | 455 | env.remove_relation(relation.endpoints[0], relation.endpoints[1], |
105 | 457 | endpoints[0][0] + ':' + endpoints[0][1].name, | ||
106 | 458 | endpoints[1][0] + ':' + endpoints[1][1].name, | ||
108 | 459 | Y.bind(this._removeRelationCallback, this, view, | 456 | Y.bind(this._removeRelationCallback, this, view, |
110 | 460 | relationElement, relationId, confirmButton)); | 457 | relationElement, relation.relation_id, confirmButton)); |
111 | 461 | }, | 458 | }, |
112 | 462 | 459 | ||
113 | 463 | _removeRelationCallback: function(view, | 460 | _removeRelationCallback: function(view, |
114 | @@ -722,9 +719,7 @@ | |||
115 | 722 | 719 | ||
116 | 723 | // Fire event to add relation in juju. | 720 | // Fire event to add relation in juju. |
117 | 724 | // This needs to specify interface in the future. | 721 | // This needs to specify interface in the future. |
121 | 725 | env.add_relation( | 722 | env.add_relation(endpoints[0], endpoints[1], |
119 | 726 | endpoints[0][0] + ':' + endpoints[0][1].name, | ||
120 | 727 | endpoints[1][0] + ':' + endpoints[1][1].name, | ||
122 | 728 | Y.bind(this._addRelationCallback, this, view, relation_id) | 723 | Y.bind(this._addRelationCallback, this, view, relation_id) |
123 | 729 | ); | 724 | ); |
124 | 730 | view.set('currentServiceClickAction', 'hideServiceMenu'); | 725 | view.set('currentServiceClickAction', 'hideServiceMenu'); |
125 | @@ -838,8 +833,8 @@ | |||
126 | 838 | 'active'); | 833 | 'active'); |
127 | 839 | }, | 834 | }, |
128 | 840 | 835 | ||
131 | 841 | relationClick: function(d, self) { | 836 | relationClick: function(relation self) { |
132 | 842 | if (d.isSubordinate) { | 837 | if (relation.isSubordinate) { |
133 | 843 | var subRelDialog = views.createModalPanel( | 838 | var subRelDialog = views.createModalPanel( |
134 | 844 | 'You may not remove a subordinate relation.', | 839 | 'You may not remove a subordinate relation.', |
135 | 845 | '#rmsubrelation-modal-panel'); | 840 | '#rmsubrelation-modal-panel'); |
136 | @@ -861,7 +856,7 @@ | |||
137 | 861 | subRelDialog.get('boundingBox').all('.yui3-button') | 856 | subRelDialog.get('boundingBox').all('.yui3-button') |
138 | 862 | .removeClass('yui3-button'); | 857 | .removeClass('yui3-button'); |
139 | 863 | } else { | 858 | } else { |
141 | 864 | self.removeRelationConfirm(d, this, self); | 859 | self.removeRelationConfirm(relation, this, self); |
142 | 865 | } | 860 | } |
143 | 866 | } | 861 | } |
144 | 867 | 862 | ||
145 | 868 | 863 | ||
146 | === modified file 'test/test_application_notifications.js' | |||
147 | --- test/test_application_notifications.js 2013-01-17 16:19:17 +0000 | |||
148 | +++ test/test_application_notifications.js 2013-01-24 19:23:21 +0000 | |||
149 | @@ -2,7 +2,7 @@ | |||
150 | 2 | 2 | ||
151 | 3 | describe('juju application notifications', function() { | 3 | describe('juju application notifications', function() { |
152 | 4 | var _setTimeout, _viewsHighlightRow, db, ERR_EV, juju, models, NO_OP, | 4 | var _setTimeout, _viewsHighlightRow, db, ERR_EV, juju, models, NO_OP, |
154 | 5 | viewContainer, views, Y; | 5 | viewContainer, views, Y, willError; |
155 | 6 | 6 | ||
156 | 7 | before(function(done) { | 7 | before(function(done) { |
157 | 8 | Y = YUI(GlobalConfig).use(['node', | 8 | Y = YUI(GlobalConfig).use(['node', |
158 | @@ -22,6 +22,18 @@ | |||
159 | 22 | ERR_EV = { | 22 | ERR_EV = { |
160 | 23 | err: true | 23 | err: true |
161 | 24 | }; | 24 | }; |
162 | 25 | |||
163 | 26 | /** | ||
164 | 27 | * A function that accepts a callback as its last (rightmost) argument and | ||
165 | 28 | * calls that callback with a synthetic error event. | ||
166 | 29 | */ | ||
167 | 30 | willError = function() { | ||
168 | 31 | // The last argument is the callback. We do not care what the | ||
169 | 32 | // other arguments are or if they change in the future. | ||
170 | 33 | var callback = arguments[arguments.length - 1]; | ||
171 | 34 | callback(ERR_EV); | ||
172 | 35 | }; | ||
173 | 36 | |||
174 | 25 | NO_OP = function() {}; | 37 | NO_OP = function() {}; |
175 | 26 | }); | 38 | }); |
176 | 27 | 39 | ||
177 | @@ -91,12 +103,8 @@ | |||
178 | 91 | }, | 103 | }, |
179 | 92 | db: db, | 104 | db: db, |
180 | 93 | env: { | 105 | env: { |
187 | 94 | add_unit: function(serviceId, delta, callback) { | 106 | add_unit: willError, |
188 | 95 | callback(ERR_EV); | 107 | remove_units: willError |
183 | 96 | }, | ||
184 | 97 | remove_units: function(param, callback) { | ||
185 | 98 | callback(ERR_EV); | ||
186 | 99 | } | ||
189 | 100 | }, | 108 | }, |
190 | 101 | model: { | 109 | model: { |
191 | 102 | getAttrs: NO_OP, | 110 | getAttrs: NO_OP, |
192 | @@ -140,9 +148,8 @@ | |||
193 | 140 | { err: true, | 148 | { err: true, |
194 | 141 | unit_names: ['aaa']}); | 149 | unit_names: ['aaa']}); |
195 | 142 | }, | 150 | }, |
199 | 143 | resolved: function(unit_name, relation_name, retry, callback) { | 151 | resolved: willError |
200 | 144 | callback(ERR_EV); | 152 | }, |
198 | 145 | }}, | ||
201 | 146 | unit: {}, | 153 | unit: {}, |
202 | 147 | querystring: {} | 154 | querystring: {} |
203 | 148 | }); | 155 | }); |
204 | @@ -257,10 +264,7 @@ | |||
205 | 257 | }}, | 264 | }}, |
206 | 258 | getModelURL: NO_OP, | 265 | getModelURL: NO_OP, |
207 | 259 | db: db, | 266 | db: db, |
212 | 260 | env: | 267 | env: {set_constraints: willError}, |
209 | 261 | { set_constraints: function(id, values, callback) { | ||
210 | 262 | callback(ERR_EV); | ||
211 | 263 | }}, | ||
213 | 264 | container: viewContainer}).render(); | 268 | container: viewContainer}).render(); |
214 | 265 | 269 | ||
215 | 266 | view.updateConstraints(); | 270 | view.updateConstraints(); |
216 | @@ -274,15 +278,9 @@ | |||
217 | 274 | var view = new views.service_config( | 278 | var view = new views.service_config( |
218 | 275 | { db: db, | 279 | { db: db, |
219 | 276 | env: { | 280 | env: { |
229 | 277 | set_config: function(id, newValues, callback) { | 281 | set_config: willError, |
230 | 278 | callback(ERR_EV); | 282 | expose: willError, |
231 | 279 | }, | 283 | unexpose: willError |
223 | 280 | expose: function(id, callback) { | ||
224 | 281 | callback(ERR_EV); | ||
225 | 282 | }, | ||
226 | 283 | unexpose: function(id, callback) { | ||
227 | 284 | callback({err: true, service_name: '1234'}); | ||
228 | 285 | } | ||
232 | 286 | }, | 284 | }, |
233 | 287 | getModelURL: NO_OP, | 285 | getModelURL: NO_OP, |
234 | 288 | model: { | 286 | model: { |
235 | @@ -329,11 +327,7 @@ | |||
236 | 329 | 327 | ||
237 | 330 | var view = new views.service_relations( | 328 | var view = new views.service_relations( |
238 | 331 | { db: db, | 329 | { db: db, |
244 | 332 | env: { | 330 | env: {remove_relation: willError}, |
240 | 333 | remove_relation: function(id, newValues, callback) { | ||
241 | 334 | callback(ERR_EV); | ||
242 | 335 | } | ||
243 | 336 | }, | ||
245 | 337 | getModelURL: NO_OP, | 331 | getModelURL: NO_OP, |
246 | 338 | container: viewContainer}); | 332 | container: viewContainer}); |
247 | 339 | 333 | ||
248 | @@ -388,11 +382,7 @@ | |||
249 | 388 | return {get: NO_OP}; | 382 | return {get: NO_OP}; |
250 | 389 | } | 383 | } |
251 | 390 | }, | 384 | }, |
257 | 391 | env = { | 385 | env = {deploy: willError}, |
253 | 392 | deploy: function(charmUrl, serviceName, config, callback) { | ||
254 | 393 | callback(ERR_EV); | ||
255 | 394 | } | ||
256 | 395 | }, | ||
258 | 396 | mockView = { | 386 | mockView = { |
259 | 397 | fire: NO_OP, | 387 | fire: NO_OP, |
260 | 398 | _deployCallback: function() { | 388 | _deployCallback: function() { |
261 | @@ -418,7 +408,7 @@ | |||
262 | 418 | } | 408 | } |
263 | 419 | }; | 409 | }; |
264 | 420 | 410 | ||
266 | 421 | views.charm.prototype.on_charm_deploy.apply(mockView, [ERR_EV]); | 411 | views.charm.prototype.on_charm_deploy.call(mockView, ERR_EV); |
267 | 422 | assert.isTrue(notified); | 412 | assert.isTrue(notified); |
268 | 423 | }); | 413 | }); |
269 | 424 | 414 | ||
270 | 425 | 415 | ||
271 | === modified file 'test/test_env.js' | |||
272 | --- test/test_env.js 2013-01-24 04:11:52 +0000 | |||
273 | +++ test/test_env.js 2013-01-24 19:23:21 +0000 | |||
274 | @@ -10,7 +10,7 @@ | |||
275 | 10 | var Y; | 10 | var Y; |
276 | 11 | 11 | ||
277 | 12 | describe('Juju environment', function() { | 12 | describe('Juju environment', function() { |
279 | 13 | var juju, conn, env, msg, testUtils; | 13 | var juju, conn, env, msg, testUtils, endpoint1, endpoint2; |
280 | 14 | 14 | ||
281 | 15 | before(function(done) { | 15 | before(function(done) { |
282 | 16 | Y = YUI(GlobalConfig).use( | 16 | Y = YUI(GlobalConfig).use( |
283 | @@ -26,9 +26,13 @@ | |||
284 | 26 | }); | 26 | }); |
285 | 27 | }); | 27 | }); |
286 | 28 | 28 | ||
288 | 29 | after(function(done) { | 29 | beforeEach(function() { |
289 | 30 | endpoint1 = ['service1', {name: 'relation-name-1'}]; | ||
290 | 31 | endpoint2 = ['service2', {name: 'relation-name-2'}]; | ||
291 | 32 | }); | ||
292 | 33 | |||
293 | 34 | after(function() { | ||
294 | 30 | env.destroy(); | 35 | env.destroy(); |
295 | 31 | done(); | ||
296 | 32 | }); | 36 | }); |
297 | 33 | 37 | ||
298 | 34 | it('can deploy a service', function() { | 38 | it('can deploy a service', function() { |
299 | @@ -217,7 +221,7 @@ | |||
300 | 217 | }; | 221 | }; |
301 | 218 | 222 | ||
302 | 219 | it('denies adding a relation if the GUI is read-only', function() { | 223 | it('denies adding a relation if the GUI is read-only', function() { |
304 | 220 | assertOperationDenied('add_relation', ['haproxy:http', 'django:http']); | 224 | assertOperationDenied('add_relation', [endpoint1, endpoint2]); |
305 | 221 | }); | 225 | }); |
306 | 222 | 226 | ||
307 | 223 | it('denies adding a unit if the GUI is read-only', function() { | 227 | it('denies adding a unit if the GUI is read-only', function() { |
308 | @@ -242,8 +246,7 @@ | |||
309 | 242 | }); | 246 | }); |
310 | 243 | 247 | ||
311 | 244 | it('denies removing a relation if the GUI is read-only', function() { | 248 | it('denies removing a relation if the GUI is read-only', function() { |
314 | 245 | assertOperationDenied( | 249 | assertOperationDenied('remove_relation', [endpoint1, endpoint2]); |
313 | 246 | 'remove_relation', ['haproxy:http', 'django:http']); | ||
315 | 247 | }); | 250 | }); |
316 | 248 | 251 | ||
317 | 249 | it('denies removing units if the GUI is read-only', function() { | 252 | it('denies removing units if the GUI is read-only', function() { |
318 | 250 | 253 | ||
319 | === modified file 'test/test_topology_relation.js' | |||
320 | --- test/test_topology_relation.js 2013-01-23 16:46:40 +0000 | |||
321 | +++ test/test_topology_relation.js 2013-01-24 19:23:21 +0000 | |||
322 | @@ -39,12 +39,12 @@ | |||
323 | 39 | 39 | ||
324 | 40 | it('fires a "clearState" event if a drag line is clicked', function() { | 40 | it('fires a "clearState" event if a drag line is clicked', function() { |
325 | 41 | var firedEventName; | 41 | var firedEventName; |
327 | 42 | var fauxTopo = { | 42 | var topo = { |
328 | 43 | fire: function(eventName) { | 43 | fire: function(eventName) { |
329 | 44 | firedEventName = eventName; | 44 | firedEventName = eventName; |
330 | 45 | } | 45 | } |
331 | 46 | }; | 46 | }; |
333 | 47 | view.set('component', fauxTopo); | 47 | view.set('component', topo); |
334 | 48 | view.draglineClicked(undefined, view); | 48 | view.draglineClicked(undefined, view); |
335 | 49 | assert.equal(firedEventName, 'clearState'); | 49 | assert.equal(firedEventName, 'clearState'); |
336 | 50 | }); | 50 | }); |
337 | @@ -57,4 +57,37 @@ | |||
338 | 57 | assert.equal(view.render(), view); | 57 | assert.equal(view.render(), view); |
339 | 58 | }); | 58 | }); |
340 | 59 | 59 | ||
341 | 60 | it('retrieves the current relation DOM element when removing', function() { | ||
342 | 61 | var requestedSelector; | ||
343 | 62 | var container = { | ||
344 | 63 | one: function(selector) { | ||
345 | 64 | requestedSelector = selector; | ||
346 | 65 | } | ||
347 | 66 | }; | ||
348 | 67 | var env = { | ||
349 | 68 | remove_relation: function() {} | ||
350 | 69 | }; | ||
351 | 70 | var topo = { | ||
352 | 71 | get: function() { | ||
353 | 72 | return env; | ||
354 | 73 | } | ||
355 | 74 | }; | ||
356 | 75 | var fauxView = { | ||
357 | 76 | get: function(name) { | ||
358 | 77 | if (name === 'component') { | ||
359 | 78 | return topo; | ||
360 | 79 | } else if (name === 'container') { | ||
361 | 80 | return container; | ||
362 | 81 | } | ||
363 | 82 | } | ||
364 | 83 | }; | ||
365 | 84 | var relationId = 'the ID of this relation'; | ||
366 | 85 | var relation = { | ||
367 | 86 | relation_id: relationId, | ||
368 | 87 | endpoints: [null, null] | ||
369 | 88 | }; | ||
370 | 89 | view.removeRelation.call(fauxView, relation, fauxView, undefined); | ||
371 | 90 | assert.equal(requestedSelector, '#' + relationId); | ||
372 | 91 | }); | ||
373 | 92 | |||
374 | 60 | }); | 93 | }); |
Land as is after landing parent branch, looks good to me with the change
involved in the parent.
https:/ /codereview. appspot. com/7206047/