)]}'
{"doc/source/admin/examples/docker-compose.yaml":[{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"e80417abfb074e39218cf4581b1bf3f21838fc43","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    command: \"sh -c \u0027/var/playbooks/wait-to-start.sh \u0026\u0026 zuul-scheduler -d\u0027\""},{"line_number":57,"context_line":"    # FIXME: The scheduler has no ansible anymore so use the executor image."},{"line_number":58,"context_line":"    #        This needs to be changes such that ansible is not required for startup."},{"line_number":59,"context_line":"    build:"},{"line_number":60,"context_line":"      context: ../../../../"},{"line_number":61,"context_line":"      dockerfile: Dockerfile"},{"line_number":62,"context_line":"      target: zuul-scheduler"},{"line_number":63,"context_line":"    volumes:"},{"line_number":64,"context_line":"      - \"./etc_zuul/:/etc/zuul/:z\""},{"line_number":65,"context_line":"      - \"./playbooks/:/var/playbooks/:z\""}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_c9b12be2","line":62,"range":{"start_line":59,"start_character":0,"end_line":62,"end_character":28},"updated":"2019-04-10 06:57:24.000000000","message":"Aren\u0027t those left-over dev change?","commit_id":"6a4f34674415990653f4a4e3e3afbbdaabbc3ed6"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"1e5e0208340936f53538a9d56be401afca38cf0b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    command: \"sh -c \u0027/var/playbooks/wait-to-start.sh \u0026\u0026 zuul-scheduler -d\u0027\""},{"line_number":57,"context_line":"    # FIXME: The scheduler has no ansible anymore so use the executor image."},{"line_number":58,"context_line":"    #        This needs to be changes such that ansible is not required for startup."},{"line_number":59,"context_line":"    build:"},{"line_number":60,"context_line":"      context: ../../../../"},{"line_number":61,"context_line":"      dockerfile: Dockerfile"},{"line_number":62,"context_line":"      target: zuul-scheduler"},{"line_number":63,"context_line":"    volumes:"},{"line_number":64,"context_line":"      - \"./etc_zuul/:/etc/zuul/:z\""},{"line_number":65,"context_line":"      - \"./playbooks/:/var/playbooks/:z\""}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_92802cf9","line":62,"range":{"start_line":59,"start_character":0,"end_line":62,"end_character":28},"in_reply_to":"5fc1f717_b76f5ac2","updated":"2019-04-10 09:44:34.000000000","message":"This change is not really meant for merging, just for letting people test around the auth feature (which we wouldn\u0027t want so closely tied to keycloak anyway). They\u0027re supposed to build the image locally, hence the relative context.","commit_id":"6a4f34674415990653f4a4e3e3afbbdaabbc3ed6"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"51b0b52c05bd49b4ca83c324e5bb406e4688848e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    command: \"sh -c \u0027/var/playbooks/wait-to-start.sh \u0026\u0026 zuul-scheduler -d\u0027\""},{"line_number":57,"context_line":"    # FIXME: The scheduler has no ansible anymore so use the executor image."},{"line_number":58,"context_line":"    #        This needs to be changes such that ansible is not required for startup."},{"line_number":59,"context_line":"    build:"},{"line_number":60,"context_line":"      context: ../../../../"},{"line_number":61,"context_line":"      dockerfile: Dockerfile"},{"line_number":62,"context_line":"      target: zuul-scheduler"},{"line_number":63,"context_line":"    volumes:"},{"line_number":64,"context_line":"      - \"./etc_zuul/:/etc/zuul/:z\""},{"line_number":65,"context_line":"      - \"./playbooks/:/var/playbooks/:z\""}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_cc8299c7","line":62,"range":{"start_line":59,"start_character":0,"end_line":62,"end_character":28},"in_reply_to":"5fc1f717_c9b12be2","updated":"2019-04-10 08:08:50.000000000","message":"It\u0027s still WIP alpha early access code, I\u0027ll set the workflow -1 flag for clarity. I\u0027m just uploading/updating it when the patch chain changes or to make sure I save progress.\n\nAlthough in that specific case this is intentional, in order to build the container based on this branch rather than master (or use the official container in the docker registry).","commit_id":"6a4f34674415990653f4a4e3e3afbbdaabbc3ed6"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"37fc12b9b501b03c271606882dc58a6325f4bc2f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    command: \"sh -c \u0027/var/playbooks/wait-to-start.sh \u0026\u0026 zuul-scheduler -d\u0027\""},{"line_number":57,"context_line":"    # FIXME: The scheduler has no ansible anymore so use the executor image."},{"line_number":58,"context_line":"    #        This needs to be changes such that ansible is not required for startup."},{"line_number":59,"context_line":"    build:"},{"line_number":60,"context_line":"      context: ../../../../"},{"line_number":61,"context_line":"      dockerfile: Dockerfile"},{"line_number":62,"context_line":"      target: zuul-scheduler"},{"line_number":63,"context_line":"    volumes:"},{"line_number":64,"context_line":"      - \"./etc_zuul/:/etc/zuul/:z\""},{"line_number":65,"context_line":"      - \"./playbooks/:/var/playbooks/:z\""}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_b76f5ac2","line":62,"range":{"start_line":59,"start_character":0,"end_line":62,"end_character":28},"in_reply_to":"5fc1f717_cc8299c7","updated":"2019-04-10 08:33:08.000000000","message":"that should already be the case in opendev ci, the quick-start job test image speculatively, not the one from the docker registry.","commit_id":"6a4f34674415990653f4a4e3e3afbbdaabbc3ed6"}],"web/src/App.jsx":[{"author":{"_account_id":28047,"name":"Guillaume Vincent","email":"gvincent@redhat.com","username":"guillaumevincent"},"change_message_id":"56e588a3ff3605feb7f1f32a74262f1c1a91c5cc","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"// This connect the info state from the store to the info property of the App."},{"line_number":303,"context_line":"export default withRouter(connect("},{"line_number":304,"context_line":"  state \u003d\u003e {"},{"line_number":305,"context_line":"      console.log(state)"},{"line_number":306,"context_line":"      return ({"},{"line_number":307,"context_line":"    errors: state.errors,"},{"line_number":308,"context_line":"    configErrors: state.configErrors,"},{"line_number":309,"context_line":"    info: state.info,"},{"line_number":310,"context_line":"    tenant: state.tenant,"},{"line_number":311,"context_line":"    auth: state.auth"},{"line_number":312,"context_line":"})}"},{"line_number":313,"context_line":")(App))"}],"source_content_type":"text/jsx","patch_set":13,"id":"9fb8cfa7_6797e93b","line":311,"range":{"start_line":304,"start_character":11,"end_line":311,"end_character":11},"updated":"2019-06-14 10:41:32.000000000","message":"in javascript state \u003d\u003e ({}) is equivalent to \n\nfunction (state) {\n    return {}\n}\n\nstate \u003d\u003e {} will result in a syntax error","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"8b0a0734563924288b09b5ca3c8bc132c33a6b16","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"// This connect the info state from the store to the info property of the App."},{"line_number":303,"context_line":"export default withRouter(connect("},{"line_number":304,"context_line":"  state \u003d\u003e {"},{"line_number":305,"context_line":"      console.log(state)"},{"line_number":306,"context_line":"      return ({"},{"line_number":307,"context_line":"    errors: state.errors,"},{"line_number":308,"context_line":"    configErrors: state.configErrors,"},{"line_number":309,"context_line":"    info: state.info,"},{"line_number":310,"context_line":"    tenant: state.tenant,"},{"line_number":311,"context_line":"    auth: state.auth"},{"line_number":312,"context_line":"})}"},{"line_number":313,"context_line":")(App))"}],"source_content_type":"text/jsx","patch_set":13,"id":"9fb8cfa7_7d5bf6f4","line":311,"range":{"start_line":304,"start_character":11,"end_line":311,"end_character":11},"in_reply_to":"9fb8cfa7_6797e93b","updated":"2019-06-14 12:23:04.000000000","message":"Done","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"}],"web/src/actions/auth.js":[{"author":{"_account_id":28047,"name":"Guillaume Vincent","email":"gvincent@redhat.com","username":"guillaumevincent"},"change_message_id":"56e588a3ff3605feb7f1f32a74262f1c1a91c5cc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import { fetchUserAuthZ } from \u0027../api\u0027"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"export const USER_EXPIRED \u003d \u0027redux-oidc/USER_EXPIRED\u0027"},{"line_number":4,"context_line":"export const SILENT_RENEW_ERROR \u003d \u0027redux-oidc/SILENT_RENEW_ERROR\u0027"},{"line_number":5,"context_line":"export const SESSION_TERMINATED \u003d \u0027redux-oidc/SESSION_TERMINATED\u0027"},{"line_number":6,"context_line":"export const USER_EXPIRING \u003d \u0027redux-oidc/USER_EXPIRING\u0027"},{"line_number":7,"context_line":"export const USER_FOUND \u003d \u0027redux-oidc/USER_FOUND\u0027"},{"line_number":8,"context_line":"export const LOADING_USER \u003d \u0027redux-oidc/LOADING_USER\u0027"},{"line_number":9,"context_line":"export const USER_SIGNED_OUT \u003d \u0027redux-oidc/USER_SIGNED_OUT\u0027"},{"line_number":10,"context_line":"export const LOAD_USER_ERROR \u003d \u0027redux-oidc/LOAD_USER_ERROR\u0027"},{"line_number":11,"context_line":"export const LOADING_USER_AUTHORIZATIONS \u003d \u0027LOADING_USER_AUTHORIZATIONS\u0027"},{"line_number":12,"context_line":"export const USER_AUTHORIZATIONS_LOADED \u003d \u0027USER_AUTHORIZATIONS_LOADED\u0027"},{"line_number":13,"context_line":""}],"source_content_type":"text/javascript","patch_set":13,"id":"9fb8cfa7_a7c96126","line":10,"range":{"start_line":3,"start_character":0,"end_line":10,"end_character":59},"updated":"2019-06-14 10:41:32.000000000","message":"remove this, you have access to it un the reduc-oidc component","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d59e9824c3a4ceac57321d2779a4ce7712d12603","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import { fetchUserAuthZ } from \u0027../api\u0027"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"export const LOADING_USER_AUTHORIZATIONS \u003d \u0027LOADING_USER_AUTHORIZATIONS\u0027"},{"line_number":4,"context_line":"export const USER_AUTHORIZATIONS_LOADED \u003d \u0027USER_AUTHORIZATIONS_LOADED\u0027"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"const loadingUserAuthz \u003d () \u003d\u003e ({"},{"line_number":7,"context_line":"    type: LOADING_USER_AUTHORIZATIONS"},{"line_number":8,"context_line":"})"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"const userAuthzLoaded \u003d (data) \u003d\u003e ({"},{"line_number":11,"context_line":"    type: USER_AUTHORIZATIONS_LOADED,"},{"line_number":12,"context_line":"    adminTenants: data.zuul.admin,"},{"line_number":13,"context_line":"})"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"export const fetchUserAuthorizations \u003d (user) \u003d\u003e dispatch \u003d\u003e {"},{"line_number":16,"context_line":"    dispatch(loadingUserAuthz())"},{"line_number":17,"context_line":"    return fetchUserAuthZ(user.access_token)"},{"line_number":18,"context_line":"        .then(response \u003d\u003e {"},{"line_number":19,"context_line":"            dispatch(userAuthzLoaded(response.data))"},{"line_number":20,"context_line":"        })"},{"line_number":21,"context_line":"}"}],"source_content_type":"text/javascript","patch_set":30,"id":"3fa7e38b_75ca2e46","line":21,"range":{"start_line":1,"start_character":0,"end_line":21,"end_character":1},"updated":"2019-12-12 15:02:49.000000000","message":"I don\u0027t think any of this is actually used at all anywhere.","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"}],"web/src/api.js":[{"author":{"_account_id":28047,"name":"Guillaume Vincent","email":"gvincent@redhat.com","username":"guillaumevincent"},"change_message_id":"56e588a3ff3605feb7f1f32a74262f1c1a91c5cc","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"// Authenticated APIs"},{"line_number":106,"context_line":"function enqueue (token, apiPrefix, projectName, trigger, changeId, pipeline) {"},{"line_number":107,"context_line":"    Axios.defaults.headers.common[\u0027Authorization\u0027] \u003d \u0027Bearer \u0027 + token"},{"line_number":108,"context_line":"    let res \u003d Axios.post("},{"line_number":109,"context_line":"        apiUrl + apiPrefix +\u0027project/\u0027 + projectName + \u0027/enqueue\u0027,"},{"line_number":110,"context_line":"        {"}],"source_content_type":"text/javascript","patch_set":13,"id":"9fb8cfa7_87e8ddb2","line":107,"range":{"start_line":107,"start_character":4,"end_line":107,"end_character":70},"updated":"2019-06-14 10:41:32.000000000","message":"instead of doing this every time on every request, you probably need to configure axios globally and call the module everytime you need it.","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"}],"web/src/config.js":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"8b0a0734563924288b09b5ca3c8bc132c33a6b16","unresolved":false,"context_lines":[{"line_number":1,"context_line":"// TODO: what\u0027s the best practice for config in deployments?"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"const userManagerConfig \u003d {"},{"line_number":4,"context_line":"  client_id: \u0027localhost\u0027,"}],"source_content_type":"text/javascript","patch_set":13,"id":"9fb8cfa7_fde926e2","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":60},"updated":"2019-06-14 12:23:04.000000000","message":"What\u0027s the best way to allow operators to set this config? IIUC the whole project is compiled with yarn before shipping. Can this file be excluded so that it can be modified depending on your deployment?","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d59e9824c3a4ceac57321d2779a4ce7712d12603","unresolved":false,"context_lines":[{"line_number":1,"context_line":"// TODO: what\u0027s the best practice for config in deployments?"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"const userManagerConfig \u003d null"},{"line_number":4,"context_line":""}],"source_content_type":"text/javascript","patch_set":30,"id":"3fa7e38b_b5fd066e","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":60},"updated":"2019-12-12 15:02:49.000000000","message":"While the current approach \"just works\", it requires a deployer to modify this file before building the react app.\n\nIt\u0027d be better to have these settings live somewhere else. Any suggestions?","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"cdd0b82389d8026fbfb78bd3ffda495c26fe85fc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"// TODO: what\u0027s the best practice for config in deployments?"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"const userManagerConfig \u003d null"},{"line_number":4,"context_line":""}],"source_content_type":"text/javascript","patch_set":30,"id":"3fa7e38b_6754c5c6","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":60},"in_reply_to":"3fa7e38b_b5fd066e","updated":"2019-12-12 15:26:48.000000000","message":"There are some other functionality which queries the /info endpoint to get settings like those. Then this could be configured in the zuul-web service.","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"}],"web/src/containers/auth/Login.jsx":[{"author":{"_account_id":28047,"name":"Guillaume Vincent","email":"gvincent@redhat.com","username":"guillaumevincent"},"change_message_id":"56e588a3ff3605feb7f1f32a74262f1c1a91c5cc","unresolved":false,"context_lines":[{"line_number":4,"context_line":"import userManager from \u0027../../userManager\u0027"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class LoginButton extends React.Component {"},{"line_number":7,"context_line":"    onLoginButtonClick(event) {"},{"line_number":8,"context_line":"      event.preventDefault()"},{"line_number":9,"context_line":"      userManager.signinRedirect()"},{"line_number":10,"context_line":"    }"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    render () {"},{"line_number":13,"context_line":"        return ("}],"source_content_type":"text/jsx","patch_set":13,"id":"9fb8cfa7_e74679c0","line":10,"range":{"start_line":7,"start_character":0,"end_line":10,"end_character":5},"updated":"2019-06-14 10:41:32.000000000","message":"This wont work because the method is not binded to the component\n\nWhat you want is \n\nonLoginButtonClick \u003d (event) \u003d\u003e {\n    event.preventDefault()\n    userManager.signinRedirect()\n}\n\nor bind your method in the constructor\n\nconstructor(props) {\n    super(props);\n    // This binding is necessary to make `this` work in the render method\n    this.onLoginButtonClick \u003d this.onLoginButtonClick.bind(this);\n  }\n\nI prefer the first one. Just you need to understand that the this is binded automatically thanks to the ES6 arrow function () \u003d\u003e ()","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"8b0a0734563924288b09b5ca3c8bc132c33a6b16","unresolved":false,"context_lines":[{"line_number":4,"context_line":"import userManager from \u0027../../userManager\u0027"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class LoginButton extends React.Component {"},{"line_number":7,"context_line":"    onLoginButtonClick(event) {"},{"line_number":8,"context_line":"      event.preventDefault()"},{"line_number":9,"context_line":"      userManager.signinRedirect()"},{"line_number":10,"context_line":"    }"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    render () {"},{"line_number":13,"context_line":"        return ("}],"source_content_type":"text/jsx","patch_set":13,"id":"9fb8cfa7_7d29b634","line":10,"range":{"start_line":7,"start_character":0,"end_line":10,"end_character":5},"in_reply_to":"9fb8cfa7_e74679c0","updated":"2019-06-14 12:23:04.000000000","message":"This was working for me, and straight from redux-oidc\u0027s doc, but I trust you!","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"}],"web/src/containers/status/ChangePanel.jsx":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"17939073560cec98d8c686816debee182ceb72a9","unresolved":false,"context_lines":[{"line_number":169,"context_line":"      // TODO: dequeue should be a function of buildset ID"},{"line_number":170,"context_line":"      let projectName \u003d change.project"},{"line_number":171,"context_line":"      // TODO: Trigger info needed in change or component property"},{"line_number":172,"context_line":"      let trigger \u003d \u0027gerrit\u0027"},{"line_number":173,"context_line":"      // TODO: Add pipeline info as a component property"},{"line_number":174,"context_line":"      let pipeline \u003d \u0027check\u0027"},{"line_number":175,"context_line":"      let changeId \u003d change.id"}],"source_content_type":"text/jsx","patch_set":15,"id":"9fb8cfa7_03048bc5","line":172,"updated":"2019-06-19 19:20:56.000000000","message":"same as for buildsets, I think a specific trigger would work better there","commit_id":"e6630a314763f9847b89e0954f58452e2d4667a0"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"17939073560cec98d8c686816debee182ceb72a9","unresolved":false,"context_lines":[{"line_number":170,"context_line":"      let projectName \u003d change.project"},{"line_number":171,"context_line":"      // TODO: Trigger info needed in change or component property"},{"line_number":172,"context_line":"      let trigger \u003d \u0027gerrit\u0027"},{"line_number":173,"context_line":"      // TODO: Add pipeline info as a component property"},{"line_number":174,"context_line":"      let pipeline \u003d \u0027check\u0027"},{"line_number":175,"context_line":"      let changeId \u003d change.id"},{"line_number":176,"context_line":"      dequeue(this.props.token, this.props.tenant.apiPrefix, projectName, trigger, changeId, pipeline).then(() \u003d\u003e {"},{"line_number":177,"context_line":"          alert(\u0027change \"\u0027 + changeId + \u0027\" dequeued.\u0027)"}],"source_content_type":"text/jsx","patch_set":15,"id":"9fb8cfa7_8372bb7b","line":174,"range":{"start_line":173,"start_character":0,"end_line":174,"end_character":28},"updated":"2019-06-19 19:20:56.000000000","message":"Can this be inherited from a parent react component? But how do we get this info if only one change is shown?","commit_id":"e6630a314763f9847b89e0954f58452e2d4667a0"}],"web/src/loginButton.jsx":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d59e9824c3a4ceac57321d2779a4ce7712d12603","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"   render() {"},{"line_number":12,"context_line":"       return ("},{"line_number":13,"context_line":"           \u003cdiv\u003e"},{"line_number":14,"context_line":"              \u003cbutton onClick\u003d{this.onLoginButtonClick}\u003eSign in\u003c/button\u003e"},{"line_number":15,"context_line":"           \u003c/div\u003e"},{"line_number":16,"context_line":"       )"},{"line_number":17,"context_line":"   }"},{"line_number":18,"context_line":"}"}],"source_content_type":"text/jsx","patch_set":30,"id":"3fa7e38b_f52cde01","line":15,"range":{"start_line":13,"start_character":0,"end_line":15,"end_character":17},"updated":"2019-12-12 15:02:49.000000000","message":"could use better styling","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"}],"web/src/pages/Builds.jsx":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d59e9824c3a4ceac57321d2779a4ce7712d12603","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    })"},{"line_number":53,"context_line":"  }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"  updateAuthZ () {"},{"line_number":56,"context_line":"    this.setState({isAdmin: false})"},{"line_number":57,"context_line":"    if (this.props.auth.user) {"},{"line_number":58,"context_line":"      fetchUserAuthZ(this.props.auth.user.access_token).then(response \u003d\u003e {"},{"line_number":59,"context_line":"        this.setState({isAdmin: response.data.zuul.admin.indexOf(this.props.tenant.name) \u003e -1 ? true : false})"},{"line_number":60,"context_line":"      })"},{"line_number":61,"context_line":"    }"},{"line_number":62,"context_line":"  }"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  componentDidMount () {"},{"line_number":65,"context_line":"    document.title \u003d \u0027Zuul Builds\u0027"}],"source_content_type":"text/jsx","patch_set":30,"id":"3fa7e38b_553db229","line":62,"range":{"start_line":55,"start_character":0,"end_line":62,"end_character":3},"updated":"2019-12-12 15:02:49.000000000","message":"this code is repeated in many files. Refactoring would be good, maybe later.","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"}],"web/src/pages/Buildsets.jsx":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"6081e41438d84f417304affd995b00c2a0f189b9","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"  reenqueue(rowdata) {"},{"line_number":68,"context_line":"      let projectName \u003d rowdata.rowData.project"},{"line_number":69,"context_line":"      // TODO: Add trigger info to rowdata"},{"line_number":70,"context_line":"      let trigger \u003d \u0027gerrit\u0027"},{"line_number":71,"context_line":"      let pipeline \u003d rowdata.rowData.pipeline"},{"line_number":72,"context_line":"      // TODO: Handle buildsets from refs, or better, handle buildset IDs"},{"line_number":73,"context_line":"      let changeId \u003d rowdata.rowData.change + \u0027,\u0027 + rowdata.rowData.patchset"}],"source_content_type":"text/jsx","patch_set":15,"id":"9fb8cfa7_c8f1b003","line":70,"range":{"start_line":69,"start_character":0,"end_line":70,"end_character":28},"updated":"2019-06-19 19:13:46.000000000","message":"There are two ways to address this:\n\n1. Store trigger info in the buildsets table in the DB. This will require a migration script to update existing deployments.\n2. Create a specific trigger for manual events.\n\nI lean towards #2, as there is already a potential implementation in https://review.opendev.org/#/c/555153/","commit_id":"e6630a314763f9847b89e0954f58452e2d4667a0"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d59e9824c3a4ceac57321d2779a4ce7712d12603","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    })"},{"line_number":53,"context_line":"  }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"  updateAuthZ () {"},{"line_number":56,"context_line":"    this.setState({isAdmin: false})"},{"line_number":57,"context_line":"    if (this.props.auth.user) {"},{"line_number":58,"context_line":"      fetchUserAuthZ(this.props.auth.user.access_token).then(response \u003d\u003e {"},{"line_number":59,"context_line":"        this.setState({isAdmin: response.data.zuul.admin.indexOf(this.props.tenant.name) \u003e -1 ? true : false})"},{"line_number":60,"context_line":"      })"},{"line_number":61,"context_line":"    }"},{"line_number":62,"context_line":"  }"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  componentDidMount () {"},{"line_number":65,"context_line":"    document.title \u003d \u0027Zuul Buildsets\u0027"}],"source_content_type":"text/jsx","patch_set":30,"id":"3fa7e38b_d51202b4","line":62,"range":{"start_line":55,"start_character":0,"end_line":62,"end_character":3},"updated":"2019-12-12 15:02:49.000000000","message":"duplicate code","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"}],"web/src/pages/auth/Callback.jsx":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"8b0a0734563924288b09b5ca3c8bc132c33a6b16","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    static propTypes \u003d {}"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"  successCallback \u003d (user) \u003d\u003e {"},{"line_number":12,"context_line":"      this.props.dispatch(fetchUserAuthorizations(user))"},{"line_number":13,"context_line":"      this.props.history.push(\u0027/\u0027)"},{"line_number":14,"context_line":"  }"},{"line_number":15,"context_line":""}],"source_content_type":"text/jsx","patch_set":13,"id":"9fb8cfa7_9da34ab2","line":12,"range":{"start_line":12,"start_character":6,"end_line":12,"end_character":56},"updated":"2019-06-14 12:23:04.000000000","message":"Authorizations are fetched only when this callback page is loaded. If I\u0027m already authenticated on the SSO service, my user details are loaded in the store but the authorizations aren\u0027t. Is there a way to load them properly?","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d59e9824c3a4ceac57321d2779a4ce7712d12603","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"  successCallback \u003d (user) \u003d\u003e {"},{"line_number":16,"context_line":"      this.props.dispatch(fetchUserAuthorizations(user))"},{"line_number":17,"context_line":"      this.props.history.push(\u0027/\u0027)"},{"line_number":18,"context_line":"  }"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"  errorCallback \u003d (error) \u003d\u003e {"}],"source_content_type":"text/jsx","patch_set":30,"id":"3fa7e38b_b50bc679","line":17,"range":{"start_line":17,"start_character":6,"end_line":17,"end_character":34},"updated":"2019-12-12 15:02:49.000000000","message":"could be improved by getting the previous page in navigation history?","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d59e9824c3a4ceac57321d2779a4ce7712d12603","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"  errorCallback \u003d (error) \u003d\u003e {"},{"line_number":21,"context_line":"      console.log(error)"},{"line_number":22,"context_line":"      this.props.history.push(\u0027/\u0027)"},{"line_number":23,"context_line":"  }"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"  render() {"}],"source_content_type":"text/jsx","patch_set":30,"id":"3fa7e38b_55261218","line":22,"range":{"start_line":22,"start_character":5,"end_line":22,"end_character":34},"updated":"2019-12-12 15:02:49.000000000","message":"same","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"}],"web/src/reducers/auth.js":[{"author":{"_account_id":28047,"name":"Guillaume Vincent","email":"gvincent@redhat.com","username":"guillaumevincent"},"change_message_id":"56e588a3ff3605feb7f1f32a74262f1c1a91c5cc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import update from \u0027immutability-helper\u0027"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"import {"},{"line_number":4,"context_line":"  USER_EXPIRED,"},{"line_number":5,"context_line":"  USER_FOUND,"},{"line_number":6,"context_line":"  SILENT_RENEW_ERROR,"},{"line_number":7,"context_line":"  SESSION_TERMINATED,"},{"line_number":8,"context_line":"  LOADING_USER,"},{"line_number":9,"context_line":"  USER_SIGNED_OUT,"},{"line_number":10,"context_line":"  LOADING_USER_AUTHORIZATIONS,"},{"line_number":11,"context_line":"  USER_AUTHORIZATIONS_LOADED"},{"line_number":12,"context_line":"} from \u0027../actions/auth\u0027"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"const initialState \u003d {"},{"line_number":15,"context_line":"  user: null,"}],"source_content_type":"text/javascript","patch_set":13,"id":"9fb8cfa7_07de2dd9","line":12,"range":{"start_line":3,"start_character":0,"end_line":12,"end_character":24},"updated":"2019-06-14 10:41:32.000000000","message":"import {\n  USER_EXPIRED,\n  USER_FOUND,\n  SILENT_RENEW_ERROR,\n  SESSION_TERMINATED,\n  LOADING_USER,\n  USER_SIGNED_OUT\n} from \u0027redux-oidc\u0027\nimport {\n  LOADING_USER_AUTHORIZATIONS,\n  USER_AUTHORIZATIONS_LOADED\n} from \u0027../actions/auth\u0027","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d59e9824c3a4ceac57321d2779a4ce7712d12603","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import update from \u0027immutability-helper\u0027"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"import {"},{"line_number":4,"context_line":"  USER_EXPIRED,"},{"line_number":5,"context_line":"  USER_FOUND,"},{"line_number":6,"context_line":"  SILENT_RENEW_ERROR,"},{"line_number":7,"context_line":"  SESSION_TERMINATED,"},{"line_number":8,"context_line":"  LOADING_USER,"},{"line_number":9,"context_line":"  USER_SIGNED_OUT"},{"line_number":10,"context_line":"} from \u0027redux-oidc\u0027"},{"line_number":11,"context_line":"import {"},{"line_number":12,"context_line":"  LOADING_USER_AUTHORIZATIONS,"},{"line_number":13,"context_line":"  USER_AUTHORIZATIONS_LOADED"},{"line_number":14,"context_line":"} from \u0027../actions/auth\u0027"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"const initialState \u003d {"},{"line_number":17,"context_line":"  user: null,"},{"line_number":18,"context_line":"  isLoadingUser: false,"},{"line_number":19,"context_line":"  adminTenants: []"},{"line_number":20,"context_line":"}"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"export default function reducer(state \u003d initialState, action) {"},{"line_number":23,"context_line":"  switch (action.type) {"},{"line_number":24,"context_line":"    case USER_EXPIRED:"},{"line_number":25,"context_line":"        return { user: null, isLoadingUser: false, adminTenants: [] }"},{"line_number":26,"context_line":"    case SILENT_RENEW_ERROR:"},{"line_number":27,"context_line":"        return { user: null, isLoadingUser: false, adminTenants: [] }"},{"line_number":28,"context_line":"    case SESSION_TERMINATED:"},{"line_number":29,"context_line":"    case USER_SIGNED_OUT:"},{"line_number":30,"context_line":"        return { user: null, isLoadingUser: false, adminTenants: [] }"},{"line_number":31,"context_line":"    case USER_FOUND:"},{"line_number":32,"context_line":"        return { user: action.payload, isLoadingUser: false, adminTenants: [] }"},{"line_number":33,"context_line":"    case LOADING_USER:"},{"line_number":34,"context_line":"        return { user: null, isLoadingUser: true, adminTenants: [] }"},{"line_number":35,"context_line":"    case LOADING_USER_AUTHORIZATIONS:"},{"line_number":36,"context_line":"        return update(state, { isLoadingUser: {$set: true}, adminTenants: {$set: []} })"},{"line_number":37,"context_line":"    case USER_AUTHORIZATIONS_LOADED:"},{"line_number":38,"context_line":"        return update(state, { isLoadingUser: {$set: false}, adminTenants: {$set: action.adminTenants} })"},{"line_number":39,"context_line":"    default:"},{"line_number":40,"context_line":"        return state"},{"line_number":41,"context_line":"  }"},{"line_number":42,"context_line":"}"}],"source_content_type":"text/javascript","patch_set":30,"id":"3fa7e38b_d5776207","line":42,"range":{"start_line":1,"start_character":0,"end_line":42,"end_character":1},"updated":"2019-12-12 15:02:49.000000000","message":"not sure if used at all, and possibly redundant with what exists in redux-oidc","commit_id":"f0e334d14071bee4e8d0bdef7dbeeeee4f2c24c1"}],"web/src/store.js":[{"author":{"_account_id":28047,"name":"Guillaume Vincent","email":"gvincent@redhat.com","username":"guillaumevincent"},"change_message_id":"56e588a3ff3605feb7f1f32a74262f1c1a91c5cc","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import appReducers from \u0027./reducers\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"export default function createZuulStore() {"},{"line_number":24,"context_line":"  let zuulStore \u003d createStore(appReducers, applyMiddleware(thunk))"},{"line_number":25,"context_line":"  // TODO this requires silent renew mode to be configured"},{"line_number":26,"context_line":"  loadUser(zuulStore, userManager)"},{"line_number":27,"context_line":"  return zuulStore"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/javascript","patch_set":13,"id":"9fb8cfa7_875d3d7a","line":28,"range":{"start_line":23,"start_character":0,"end_line":28,"end_character":1},"updated":"2019-06-14 10:41:32.000000000","message":"hum, you probably want to avoid that and do the loadUser(store, userManager) in the componentDidMount of your app.js\n\nIt will be easier to test","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"8b0a0734563924288b09b5ca3c8bc132c33a6b16","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import appReducers from \u0027./reducers\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"export default function createZuulStore() {"},{"line_number":24,"context_line":"  let zuulStore \u003d createStore(appReducers, applyMiddleware(thunk))"},{"line_number":25,"context_line":"  // TODO this requires silent renew mode to be configured"},{"line_number":26,"context_line":"  loadUser(zuulStore, userManager)"},{"line_number":27,"context_line":"  return zuulStore"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/javascript","patch_set":13,"id":"9fb8cfa7_7df456f1","line":28,"range":{"start_line":23,"start_character":0,"end_line":28,"end_character":1},"in_reply_to":"9fb8cfa7_875d3d7a","updated":"2019-06-14 12:23:04.000000000","message":"If I read the doc correctly that\u0027s where you\u0027re supposed to do it: https://github.com/maxmantz/redux-oidc/blob/master/docs/API.md#loaduser\nIt\u0027s not active anyway because I haven\u0027t figured out how silent renew works","commit_id":"c3f58706f527f32ffc8ff8bc9b803e6514284991"}]}
