)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"758973d4cbfece3a5b5b56666d9931cbb13d597a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Implements the lite-spec defining an operator command for viewing"},{"line_number":10,"context_line":"pending migrations."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Have only tested and polished behavior for offline db sync, have"},{"line_number":13,"context_line":"not tested for E-M-C pattern yet."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Bhagyashri Shewale \u003cbhagyashri.shewale@nttdata.com\u003e"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"5f93b717_960cfd41","line":13,"range":{"start_line":12,"start_character":0,"end_line":13,"end_character":33},"updated":"2018-01-30 09:15:34.000000000","message":"IF this is still not tested with E-M-C pattern then it should be before getting this in.","commit_id":"971b6b212cb3748fa53946546438a60f28442042"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5f826c735ce510ee02fb4e9eed9410990008085e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implementation of db check command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements the lite-spec defining an operator command for viewing"},{"line_number":10,"context_line":"pending migrations."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Bhagyashri Shewale \u003cbhagyashri.shewale@nttdata.com\u003e"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3fa0c359_5ca932dd","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":19},"updated":"2018-02-05 08:54:32.000000000","message":"Is it possible to write detail commit message for example what actually check command will do otherwise reviewers who are not familiar with the specs has to read it first.","commit_id":"2e5a49edf12f0793458bc14f4009fc04bdf27c24"}],"glance/cmd/manage.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"758973d4cbfece3a5b5b56666d9931cbb13d597a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        An exit code of 4 indicates db contract is needed, see stdout output"},{"line_number":101,"context_line":"        \"\"\""},{"line_number":102,"context_line":"        engine \u003d db_api.get_engine()"},{"line_number":103,"context_line":"        if engine.engine.name !\u003d \u0027mysql\u0027:"},{"line_number":104,"context_line":"            print(_(\u0027Rolling upgrades are currently supported only for \u0027"},{"line_number":105,"context_line":"                    \u0027MySQL\u0027))"},{"line_number":106,"context_line":"            sys.exit(1)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_d90b9621","line":103,"range":{"start_line":103,"start_character":33,"end_line":103,"end_character":40},"updated":"2018-01-30 09:15:34.000000000","message":"I guess in this patch [1] sqlite is also checked, do you want to rebase your patch on top of this?\n\n[1] https://review.openstack.org/#/c/433934/","commit_id":"971b6b212cb3748fa53946546438a60f28442042"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5f826c735ce510ee02fb4e9eed9410990008085e","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def check(self):"},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        Report any pending migrations"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        An exit code of 0 indicates no migrations are necessary"},{"line_number":97,"context_line":"        An exit code of 1 indicates db expand is needed, see stdout output"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_fcad9eea","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":37},"updated":"2018-02-05 08:54:32.000000000","message":"Nit: doc string is not as per standard.","commit_id":"2e5a49edf12f0793458bc14f4009fc04bdf27c24"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5f826c735ce510ee02fb4e9eed9410990008085e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            print(_(\u0027Your database is not up to date. \u0027"},{"line_number":116,"context_line":"                    \u0027Your first step is to run `glance-manage db expand`.\u0027))"},{"line_number":117,"context_line":"            sys.exit(1)"},{"line_number":118,"context_line":"        elif data_migrations.has_pending_migrations(db_api.get_engine()):"},{"line_number":119,"context_line":"            print(_(\u0027Your database is not up to date. \u0027"},{"line_number":120,"context_line":"                    \u0027Your next step is to run `glance-manage db migrate`.\u0027))"},{"line_number":121,"context_line":"            sys.exit(2)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_fce59e0b","line":118,"range":{"start_line":118,"start_character":29,"end_line":118,"end_character":51},"updated":"2018-02-05 08:54:32.000000000","message":"I guess has_pending_migrations returns module names which are pending to run. If it so then IMO it will be good to add those modules exit message.","commit_id":"2e5a49edf12f0793458bc14f4009fc04bdf27c24"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"98f0e19829cde5deba0c7e210fd13bb57d072941","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            print(_(\u0027Your database is not up to date. \u0027"},{"line_number":116,"context_line":"                    \u0027Your first step is to run `glance-manage db expand`.\u0027))"},{"line_number":117,"context_line":"            sys.exit(1)"},{"line_number":118,"context_line":"        elif data_migrations.has_pending_migrations(db_api.get_engine()):"},{"line_number":119,"context_line":"            print(_(\u0027Your database is not up to date. \u0027"},{"line_number":120,"context_line":"                    \u0027Your next step is to run `glance-manage db migrate`.\u0027))"},{"line_number":121,"context_line":"            sys.exit(2)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_5cbcd268","line":118,"range":{"start_line":118,"start_character":29,"end_line":118,"end_character":51},"in_reply_to":"3fa0c359_fce59e0b","updated":"2018-02-05 09:09:39.000000000","message":"changed my mind, no need to add module names to message as any way operator need to run migrate command anyhow.","commit_id":"2e5a49edf12f0793458bc14f4009fc04bdf27c24"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"63006f94d4c05027082a0e78bc65f2c1041d3592","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                    \u0027alembic migration control.\u0027))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def check(self):"},{"line_number":93,"context_line":"        \"\"\"Report any pending migrations."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        An exit code of 0 indicates no migrations are necessary."},{"line_number":96,"context_line":"        An exit code of 1 indicates db expand is needed, see stdout output."}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa0c359_c8625cd9","line":93,"range":{"start_line":93,"start_character":30,"end_line":93,"end_character":40},"updated":"2018-02-05 11:17:21.000000000","message":"database upgrades is more appropriate as migration is one of the step in the E-M-C","commit_id":"2ef71047f5320a0b59cb3ffc63e58c4c69695682"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"63006f94d4c05027082a0e78bc65f2c1041d3592","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def check(self):"},{"line_number":93,"context_line":"        \"\"\"Report any pending migrations."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        An exit code of 0 indicates no migrations are necessary."},{"line_number":96,"context_line":"        An exit code of 1 indicates db expand is needed, see stdout output."},{"line_number":97,"context_line":"        An exit code of 2 indicates db migrate is needed, see stdout output."},{"line_number":98,"context_line":"        An exit code of 3 indicates db contract is needed, see stdout output."}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa0c359_889a14c3","line":95,"range":{"start_line":95,"start_character":39,"end_line":95,"end_character":49},"updated":"2018-02-05 11:17:21.000000000","message":"upgrades","commit_id":"2ef71047f5320a0b59cb3ffc63e58c4c69695682"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"63006f94d4c05027082a0e78bc65f2c1041d3592","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            db_migration.CONTRACT_BRANCH)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        if (contract_heads in curr_heads):"},{"line_number":111,"context_line":"            print(_(\u0027Database is up to date. No migrations needed.\u0027))"},{"line_number":112,"context_line":"            sys.exit(0)"},{"line_number":113,"context_line":"        elif ((not expand_heads) or (expand_heads not in curr_heads)):"},{"line_number":114,"context_line":"            print(_(\u0027Your database is not up to date. \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa0c359_28abc0d6","line":111,"range":{"start_line":111,"start_character":48,"end_line":111,"end_character":65},"updated":"2018-02-05 11:17:21.000000000","message":"upgrades needed","commit_id":"2ef71047f5320a0b59cb3ffc63e58c4c69695682"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"0e5bba14b5509d3bb7741f04592157d14d3ce32f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        \"\"\"Report any pending database upgrades."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        An exit code of 0 indicates no upgrades are necessary."},{"line_number":96,"context_line":"        An exit code of 1 indicates db expand is needed, see stdout output."},{"line_number":97,"context_line":"        An exit code of 2 indicates db migrate is needed, see stdout output."},{"line_number":98,"context_line":"        An exit code of 3 indicates db contract is needed, see stdout output."},{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":"        engine \u003d db_api.get_engine()"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa0c359_6481938f","line":97,"range":{"start_line":96,"start_character":0,"end_line":97,"end_character":76},"updated":"2018-02-08 10:35:05.000000000","message":"Exit codes 1 and 2 has normally their special meanings:\n1) catch all for any error condition\n2) misuse of shell builtins\n\nSpecially as we would expect these to be ran as part of shell scripts, if we have special meanings for our exit codes, we should not use these 2.","commit_id":"5bc9c84ae40e5505c7e6f453556f9f398067a5c1"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"8773e1422b05b56ef4b107466b3542d8d525f5cc","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        if (contract_heads in curr_heads):"},{"line_number":111,"context_line":"            print(_(\u0027Database is up to date. No upgrades needed.\u0027))"},{"line_number":112,"context_line":"            sys.exit(0)"},{"line_number":113,"context_line":"        elif ((not expand_heads) or (expand_heads not in curr_heads)):"},{"line_number":114,"context_line":"            print(_(\u0027Your database is not up to date. \u0027"},{"line_number":115,"context_line":"                    \u0027Your first step is to run `glance-manage db expand`.\u0027))"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa0c359_6ad63df4","line":112,"range":{"start_line":112,"start_character":21,"end_line":112,"end_character":22},"updated":"2018-02-08 11:06:24.000000000","message":"the 0 does not need to be specified","commit_id":"5bc9c84ae40e5505c7e6f453556f9f398067a5c1"}],"glance/tests/functional/test_glance_manage.py":[{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"8773e1422b05b56ef4b107466b3542d8d525f5cc","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    @depends_on_exe(\u0027sqlite3\u0027)"},{"line_number":105,"context_line":"    @skip_if_disabled"},{"line_number":106,"context_line":"    def test_check(self):"},{"line_number":107,"context_line":"        exitcode, out \u003d self._check_db(1)"},{"line_number":108,"context_line":"        self.assertEqual(1, exitcode)"},{"line_number":109,"context_line":"        self.assertEqual(\u0027Your database is not up to date. \u0027"},{"line_number":110,"context_line":"                         \u0027Your first step is to run `glance-manage db \u0027"},{"line_number":111,"context_line":"                         \u0027expand`.\u0027, out.rstrip().decode(\"utf-8\"))"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        self._db_command(db_method\u003d\u0027expand\u0027)"},{"line_number":114,"context_line":"        if data_migrations.has_pending_migrations(db_api.get_engine()):"},{"line_number":115,"context_line":"            exitcode, out \u003d self._check_db(2)"},{"line_number":116,"context_line":"            self.assertEqual(2, exitcode)"},{"line_number":117,"context_line":"            self.assertEqual(\u0027Your database is not up to date. \u0027"},{"line_number":118,"context_line":"                             \u0027Your next step is to run `glance-manage db \u0027"},{"line_number":119,"context_line":"                             \u0027migrate`.\u0027, out.rstrip().decode(\"utf-8\"))"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self._db_command(db_method\u003d\u0027migrate\u0027)"},{"line_number":122,"context_line":"        exitcode, out \u003d self._check_db(3)"},{"line_number":123,"context_line":"        self.assertEqual(3, exitcode)"},{"line_number":124,"context_line":"        self.assertEqual(\u0027Your database is not up to date. \u0027"},{"line_number":125,"context_line":"                         \u0027Your next step is to run `glance-manage db \u0027"},{"line_number":126,"context_line":"                         \u0027contract`.\u0027, out.rstrip().decode(\"utf-8\"))"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        self._db_command(db_method\u003d\u0027contract\u0027)"},{"line_number":129,"context_line":"        exitcode, out \u003d self._check_db(0)"},{"line_number":130,"context_line":"        self.assertEqual(0, exitcode)"},{"line_number":131,"context_line":"        self.assertEqual(\u0027Database is up to date. No upgrades needed.\u0027,"},{"line_number":132,"context_line":"                         out.rstrip().decode(\"utf-8\"))"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa0c359_2a2fd5f6","line":132,"range":{"start_line":106,"start_character":1,"end_line":132,"end_character":54},"updated":"2018-02-08 11:06:24.000000000","message":"I\u0027m not convinced that it\u0027s beneficial to test static output strings as the exit code is already defining that we\u0027re in correct branch of execution.","commit_id":"5bc9c84ae40e5505c7e6f453556f9f398067a5c1"}],"glance/tests/unit/test_manage.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"758973d4cbfece3a5b5b56666d9931cbb13d597a","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        self.assertIn(\u0027Rolling upgrades are currently supported only for \u0027"},{"line_number":187,"context_line":"                      \u0027MySQL\u0027, self.output.getvalue())"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        get_mock_engine.return_value \u003d mock.Mock()"},{"line_number":190,"context_line":"        engine \u003d get_mock_engine.return_value"},{"line_number":191,"context_line":"        engine.engine.name \u003d \u0027mysql\u0027"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_39b63a40","line":189,"range":{"start_line":189,"start_character":8,"end_line":189,"end_character":50},"updated":"2018-01-30 09:15:34.000000000","message":"I guess no need to mock it again.","commit_id":"971b6b212cb3748fa53946546438a60f28442042"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"8773e1422b05b56ef4b107466b3542d8d525f5cc","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                             mock_has_pending_migrations,"},{"line_number":179,"context_line":"                             get_mock_engine):"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        get_mock_engine.return_value \u003d mock.Mock()"},{"line_number":182,"context_line":"        engine \u003d get_mock_engine.return_value"},{"line_number":183,"context_line":"        engine.engine.name \u003d \u0027postgresql\u0027"},{"line_number":184,"context_line":"        exit \u003d self.assertRaises(SystemExit, self.db.check)"},{"line_number":185,"context_line":"        self.assertIn(\u0027Rolling upgrades are currently supported only for \u0027"},{"line_number":186,"context_line":"                      \u0027MySQL and Sqlite\u0027, exit.code)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        engine \u003d get_mock_engine.return_value"},{"line_number":189,"context_line":"        engine.engine.name \u003d \u0027mysql\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa0c359_2a1835d1","line":186,"range":{"start_line":181,"start_character":0,"end_line":186,"end_character":52},"updated":"2018-02-08 11:06:24.000000000","message":"This is likely gonna cause us problem very soon. See: https://bugs.launchpad.net/glance/+bug/1747869\n\nAs a current test it\u0027s still not any less valid.","commit_id":"5bc9c84ae40e5505c7e6f453556f9f398067a5c1"}],"releasenotes/notes/implement-lite-spec-db-sync-check-3e2e147aec0ae82b.yaml":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"63006f94d4c05027082a0e78bc65f2c1041d3592","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    Using db_check"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    In order to check the current state of your rolling upgrades, you may run the"},{"line_number":12,"context_line":"    command ``glance-manage db_check``. This will inform you of any"},{"line_number":13,"context_line":"    outstanding actions you have left to take as well as any possible upgrades you"},{"line_number":14,"context_line":"    can make from your current version. Here are a list of possible return codes:"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa0c359_28d98082","line":12,"range":{"start_line":12,"start_character":14,"end_line":12,"end_character":36},"updated":"2018-02-05 11:17:21.000000000","message":"this sounds little bit confusing as we are adding --check flag to db_sync command. If you have added this db_check command as well then you should explain with \"either glance-manage --check db_sync or glance-manage db_check\" (same needs to be mentioned in the commit message as well).","commit_id":"2ef71047f5320a0b59cb3ffc63e58c4c69695682"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"48a719fa12bf8c680cf4f20722576db76c687a43","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added an option ``glance-manage db check``, the option will"},{"line_number":5,"context_line":"    allow a user to check the status of rolling upgrades in the database."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"3fa0c359_efcb5b50","line":5,"range":{"start_line":5,"start_character":40,"end_line":5,"end_character":56},"updated":"2018-02-07 14:32:58.000000000","message":"just \"upgrades\" here","commit_id":"ffb6aaee7a032eacd4098514de993a4b4ec61db1"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"48a719fa12bf8c680cf4f20722576db76c687a43","unresolved":false,"context_lines":[{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Using db check"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    In order to check the current state of your rolling upgrades, you may run the"},{"line_number":12,"context_line":"    command ``glance-manage db check``. This will inform you of any"},{"line_number":13,"context_line":"    outstanding actions you have left to take."},{"line_number":14,"context_line":"    Here is a list of possible return codes:"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"3fa0c359_efd03bfa","line":11,"range":{"start_line":11,"start_character":48,"end_line":11,"end_character":55},"updated":"2018-02-07 14:32:58.000000000","message":"s/rolling/database/","commit_id":"ffb6aaee7a032eacd4098514de993a4b4ec61db1"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"b965962305309afee944dfffb259178efd16e223","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added an option ``glance-manage db check``, the option will"},{"line_number":5,"context_line":"    allow a user to check the status of upgrades in the database."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3fa0c359_95740f6a","line":4,"range":{"start_line":4,"start_character":10,"end_line":4,"end_character":19},"updated":"2018-02-08 05:11:54.000000000","message":"Added a new command","commit_id":"d4411db8cd65a0d81ecf50fcce48df315f2ba28b"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"b965962305309afee944dfffb259178efd16e223","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added an option ``glance-manage db check``, the option will"},{"line_number":5,"context_line":"    allow a user to check the status of upgrades in the database."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3fa0c359_556e8795","line":4,"range":{"start_line":4,"start_character":52,"end_line":4,"end_character":59},"updated":"2018-02-08 05:11:54.000000000","message":"command","commit_id":"d4411db8cd65a0d81ecf50fcce48df315f2ba28b"}]}
