)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0e788b1b4aa7d5a79dc58e4d2da90300b1b6dedd","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This modifies the private interface a little so if"},{"line_number":10,"context_line":"people have custom subclasses, it will require them"},{"line_number":11,"context_line":"to modify their _record_ending function to take additional"},{"line_number":12,"context_line":"arguments.  Afaik, we\u0027re the only ones insane enough to"},{"line_number":13,"context_line":"do such a thing and we\u0027re ok with the change."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I24444d65a566023afcd1546e4f784ecae36d6126"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1a26ad4f_2cb20207","line":12,"updated":"2015-10-31 21:58:02.000000000","message":"ha","commit_id":"b5a72482178aeb6cde93a696fba0fac13e028173"}],"taskflow/listeners/timing.py":[{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"71422174382e1065243c2e18d536eadd1d5f23c8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    to storage. It saves the duration in seconds as float value"},{"line_number":51,"context_line":"    to task metadata with key ``\u0027duration\u0027``."},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    def __init__(self, engine, capture_flows\u003dFalse):"},{"line_number":54,"context_line":"        if capture_flows:"},{"line_number":55,"context_line":"            flow_states \u003d WATCH_STATES"},{"line_number":56,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a26ad4f_a32514ac","line":53,"updated":"2015-10-28 17:11:16.000000000","message":"I left the default behavior to not record flows, but I am happy to just make it always record flow durations and not have it be optional if we think that\u0027s a good idea.","commit_id":"04a8ef78107cc2511a5a89ca6a2705f4f9bf8b02"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"327129c80d9b7bb6c3d4ea8f7e38d76494b3079c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    to storage. It saves the duration in seconds as float value"},{"line_number":51,"context_line":"    to task metadata with key ``\u0027duration\u0027``."},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    def __init__(self, engine, capture_flows\u003dFalse):"},{"line_number":54,"context_line":"        if capture_flows:"},{"line_number":55,"context_line":"            flow_states \u003d WATCH_STATES"},{"line_number":56,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a26ad4f_3bd4bf45","line":53,"in_reply_to":"1a26ad4f_a32514ac","updated":"2015-10-29 02:17:24.000000000","message":"Let\u0027s try to capture both; might be ok? Doesn\u0027t seem like it would be to harmful...","commit_id":"04a8ef78107cc2511a5a89ca6a2705f4f9bf8b02"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"71422174382e1065243c2e18d536eadd1d5f23c8","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                         atom_type, FINISHED_STATES)"},{"line_number":72,"context_line":"            timers.clear()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _record_ending(self, timer, atom_type, atom_name, state):"},{"line_number":75,"context_line":"        meta_update \u003d {"},{"line_number":76,"context_line":"            \u0027duration\u0027: timer.elapsed(),"},{"line_number":77,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a26ad4f_43144043","line":74,"updated":"2015-10-28 17:11:16.000000000","message":"I added \u0027state\u0027 here even though this class doesn\u0027t use it because we have a custom subclass that does need it.  We record the state so we can track success vs failure timing separately.","commit_id":"04a8ef78107cc2511a5a89ca6a2705f4f9bf8b02"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"327129c80d9b7bb6c3d4ea8f7e38d76494b3079c","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            storage \u003d self._engine.storage"},{"line_number":81,"context_line":"            # Don\u0027t let storage failures throw exceptions in a listener method."},{"line_number":82,"context_line":"            if atom_type \u003d\u003d \u0027flow\u0027:"},{"line_number":83,"context_line":"                storage.update_flow_metadata(meta_update)"},{"line_number":84,"context_line":"            else:"},{"line_number":85,"context_line":"                storage.update_atom_metadata(atom_name, meta_update)"},{"line_number":86,"context_line":"        except exc.StorageFailure:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a26ad4f_1b38e39f","line":83,"updated":"2015-10-29 02:17:24.000000000","message":"Can u use the constant that should be accessible for this.\n\n    \u003e\u003e\u003e from taskflow.engines.action_engine import compiler as co\n    \u003e\u003e\u003e co.FLOW\n    \u0027flow\u0027","commit_id":"04a8ef78107cc2511a5a89ca6a2705f4f9bf8b02"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"327129c80d9b7bb6c3d4ea8f7e38d76494b3079c","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self._atom_receiver(\u0027flow\u0027, flow_name, state)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _atom_receiver(self, atom_type, atom_name, state):"},{"line_number":99,"context_line":"        if state \u003d\u003d states.PENDING:"},{"line_number":100,"context_line":"            self._timers[atom_type].pop(atom_name, None)"},{"line_number":101,"context_line":"        elif state in STARTING_STATES:"},{"line_number":102,"context_line":"            self._timers[atom_type][atom_name] \u003d timeutils.StopWatch().start()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a26ad4f_fb5ba7f4","line":99,"updated":"2015-10-29 02:17:24.000000000","message":"Maybe just call this \u0027_receiver\u0027 due to above naming of \u0027atom\u0027 issue?","commit_id":"04a8ef78107cc2511a5a89ca6a2705f4f9bf8b02"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c05ed87e722a18766bf5c461154af68dabfc30fc","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        super(DurationListener, self).deregister()"},{"line_number":62,"context_line":"        # There should be none that still exist at deregistering time, so log a"},{"line_number":63,"context_line":"        # warning if there were any that somehow still got left behind..."},{"line_number":64,"context_line":"        for atom_type, timers in six.iteritems(self._timers):"},{"line_number":65,"context_line":"            leftover_timers \u003d len(timers)"},{"line_number":66,"context_line":"            if leftover_timers:"},{"line_number":67,"context_line":"                LOG.warn(\"%s %s(s) did not enter %s states\", leftover_timers,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_aceff2e7","line":64,"updated":"2015-10-31 21:57:13.000000000","message":"atom_type -\u003e item_type","commit_id":"b5a72482178aeb6cde93a696fba0fac13e028173"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c05ed87e722a18766bf5c461154af68dabfc30fc","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            storage \u003d self._engine.storage"},{"line_number":78,"context_line":"            # Don\u0027t let storage failures throw exceptions in a listener method."},{"line_number":79,"context_line":"            if atom_type \u003d\u003d co.FLOW:"},{"line_number":80,"context_line":"                storage.update_flow_metadata(meta_update)"},{"line_number":81,"context_line":"            else:"},{"line_number":82,"context_line":"                storage.update_atom_metadata(atom_name, meta_update)"},{"line_number":83,"context_line":"        except exc.StorageFailure:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_ccecaef5","line":80,"updated":"2015-10-31 21:57:13.000000000","message":"atom_type -\u003e item_type","commit_id":"b5a72482178aeb6cde93a696fba0fac13e028173"}]}
