)]}'
{"oslo_concurrency/lockutils.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c75c0d0cac251326bbf7e966f46eec70fefe089d","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        _remove_lock_file(_get_lock_path(name, lock_file_prefix, lock_path))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def remove_external_lock_files_matching_glob(lock_file_glob_pattern,"},{"line_number":154,"context_line":"                                             lock_prefix,"},{"line_number":155,"context_line":"                                             lock_path\u003dNone,"},{"line_number":156,"context_line":"                                             semaphores\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_3ea9e4df","line":153,"updated":"2015-11-05 18:48:33.000000000","message":"Maybe it would be better to add new parameter to remove_external_lock_file. If it\u0027s True, then we treat lock name as glob.\n\nThat\u0027s just a thought - I think that oslo cores need to decide which solution is closer to their policy.","commit_id":"6e29e518079d46a5473632117426f1e44a88d67d"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"cafdf78c8c15058f80c72d88725953b33312c25e","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        _remove_lock_file(_get_lock_path(name, lock_file_prefix, lock_path))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def remove_external_lock_files_matching_glob(lock_file_glob_pattern,"},{"line_number":154,"context_line":"                                             lock_prefix,"},{"line_number":155,"context_line":"                                             lock_path\u003dNone,"},{"line_number":156,"context_line":"                                             semaphores\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_0f586831","line":153,"in_reply_to":"fa80f949_3ea9e4df","updated":"2015-11-05 20:12:05.000000000","message":"Good suggestion - moving to a single method sounds reasonable to me but will follow up with oslo folks on this.","commit_id":"6e29e518079d46a5473632117426f1e44a88d67d"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c75c0d0cac251326bbf7e966f46eec70fefe089d","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    deleted.  The full glob pattern is created by taking:"},{"line_number":161,"context_line":"        lock_path + \"/\" + lock_prefix + lock_file_glob_pattern"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    with internal_lock(lock_file_glob_pattern, semaphores\u003dsemaphores):"},{"line_number":164,"context_line":"        lock_files \u003d glob.glob(_get_lock_path(lock_file_glob_pattern,"},{"line_number":165,"context_line":"                                              lock_prefix, lock_path))"},{"line_number":166,"context_line":"        for lock_file in lock_files:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_fb084e2f","line":163,"updated":"2015-11-05 18:48:33.000000000","message":"I think you should actually lock per each name and not on whole glob expression - for example to make this method not interfere with standard remove_external_lock_file.","commit_id":"6e29e518079d46a5473632117426f1e44a88d67d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"92accc6cc08e31f68bfd1fb3b4931a3834e0d813","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    deleted.  The full glob pattern is created by taking:"},{"line_number":161,"context_line":"        lock_path + \"/\" + lock_prefix + lock_file_glob_pattern"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    with internal_lock(lock_file_glob_pattern, semaphores\u003dsemaphores):"},{"line_number":164,"context_line":"        lock_files \u003d glob.glob(_get_lock_path(lock_file_glob_pattern,"},{"line_number":165,"context_line":"                                              lock_prefix, lock_path))"},{"line_number":166,"context_line":"        for lock_file in lock_files:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_d12f5e86","line":163,"in_reply_to":"fa80f949_fb084e2f","updated":"2015-11-06 01:30:48.000000000","message":"Agreed.","commit_id":"6e29e518079d46a5473632117426f1e44a88d67d"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"cf86142f2e0fcfd7fe6da6cbbc8fc53e724d8131","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    \"\"\"Remove an external lock file when it\u0027s not used anymore"},{"line_number":155,"context_line":"    This will be helpful when we have a lot of lock files"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_e1cfcd26","line":157,"updated":"2015-11-12 13:35:15.000000000","message":"also add other parameters explanation ?","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"c197837153ca68c0afe39c50f4fd3dc8e0633e8e","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    \"\"\"Remove an external lock file when it\u0027s not used anymore"},{"line_number":155,"context_line":"    This will be helpful when we have a lot of lock files"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_28302d07","line":157,"in_reply_to":"da85f559_280852d9","updated":"2015-11-13 05:17:36.000000000","message":"ok, maybe another commit is better :-)","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"4151afb136f6e9ecab10377333322972cafd69b5","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    \"\"\"Remove an external lock file when it\u0027s not used anymore"},{"line_number":155,"context_line":"    This will be helpful when we have a lot of lock files"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_0f0e3c3b","line":157,"in_reply_to":"da85f559_28302d07","updated":"2015-11-25 22:34:28.000000000","message":"I agree, it should be done in a separate commit.","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"f8a6eea2b099db3e40e2ee6313ed13100a06aa94","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    \"\"\"Remove an external lock file when it\u0027s not used anymore"},{"line_number":155,"context_line":"    This will be helpful when we have a lot of lock files"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_280852d9","line":157,"in_reply_to":"da85f559_e1cfcd26","updated":"2015-11-12 14:31:40.000000000","message":"The reason I added just this param string is the rest of them already existed but didn\u0027t have docstrings describing them.  If I do another patch set for this I will add the docstrings for the remaining params.","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"4151afb136f6e9ecab10377333322972cafd69b5","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    This will be helpful when we have a lot of lock files"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"},{"line_number":161,"context_line":"    lock_files \u003d [full_name] if not is_name_glob else glob.glob(full_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_8200c302","line":158,"updated":"2015-11-25 22:34:28.000000000","message":"Please add versionchanged string","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"0a67138d7387291a2626bfe2d98693efe4d3275e","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    This will be helpful when we have a lot of lock files"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"},{"line_number":161,"context_line":"    lock_files \u003d [full_name] if not is_name_glob else glob.glob(full_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_98509460","line":158,"in_reply_to":"9a8ffd7b_8200c302","updated":"2015-11-30 15:05:55.000000000","message":"Done","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"935c63eeee94d9b07f43c34ad523e53f9ece67d4","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"},{"line_number":161,"context_line":"    lock_files \u003d [full_name] if not is_name_glob else glob.glob(full_name)"},{"line_number":162,"context_line":"    for lock_file in lock_files:"},{"line_number":163,"context_line":"        with internal_lock(name, semaphores\u003dsemaphores):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_244216af","line":160,"updated":"2015-11-11 06:54:09.000000000","message":"you are changing the method remove_external_lock_file\u0027s behavior: remove only one file, and the  parameter  lock_file_prefix,  lock_path  are string type. not specified pattern.\n\nwhat about add new method  and call method remove_external_lock_file in the new method ?","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"f65e353e9c7941ea3023476027798a8c65fe0cca","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"},{"line_number":161,"context_line":"    lock_files \u003d [full_name] if not is_name_glob else glob.glob(full_name)"},{"line_number":162,"context_line":"    for lock_file in lock_files:"},{"line_number":163,"context_line":"        with internal_lock(name, semaphores\u003dsemaphores):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_91c20a33","line":160,"in_reply_to":"da85f559_244216af","updated":"2015-11-11 16:34:00.000000000","message":"The behavior is only changed if you pass in the new is_name_glob\u003dTrue, otherwise existing behavior stays the same.\n\nAre you mentioning lock_file_prefix and lock_path because you think I should be more descriptive in the naming of is_name_glob?\n\nPlease check out patch set #3 - I had this in two separate methods but combined them because the code is almost identical between them, and we can do this without changing the default behavior of remove_external_lock_file.\n\nIf you feel strongly about this let me know and I can go back to the previous 2 method way of doing things.","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"cf86142f2e0fcfd7fe6da6cbbc8fc53e724d8131","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    :param is_name_glob: if True, the name passed in is treated as a glob and"},{"line_number":158,"context_line":"        all lock files matching the pattern are removed"},{"line_number":159,"context_line":"    \"\"\""},{"line_number":160,"context_line":"    full_name \u003d _get_lock_path(name, lock_file_prefix, lock_path)"},{"line_number":161,"context_line":"    lock_files \u003d [full_name] if not is_name_glob else glob.glob(full_name)"},{"line_number":162,"context_line":"    for lock_file in lock_files:"},{"line_number":163,"context_line":"        with internal_lock(name, semaphores\u003dsemaphores):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_a1dea5da","line":160,"in_reply_to":"da85f559_91c20a33","updated":"2015-11-12 13:35:15.000000000","message":"thanks for your explanation , that makes sense.","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"}],"oslo_concurrency/tests/unit/test_lockutils.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"4151afb136f6e9ecab10377333322972cafd69b5","unresolved":false,"context_lines":[{"line_number":323,"context_line":"                                             use_external\u003dTrue)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def test_remove_external_file_lock_files_matching_glob(self):"},{"line_number":326,"context_line":"        lock_dir \u003d tempfile.mkdtemp()"},{"line_number":327,"context_line":"        lock_prefix \u003d \"project-\""},{"line_number":328,"context_line":"        lock_names \u003d [\"12345\", \"12345-action\", \"12345_diff_action\", \"54321\"]"},{"line_number":329,"context_line":"        lock_files \u003d [open(\"%s/%s%s\" % (lock_dir, lock_prefix, name), \u0027a\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_02437343","line":326,"updated":"2015-11-25 22:34:28.000000000","message":"You should use fixtures.TempDir fixture instead. If anything fails, you\u0027ll leak this lock_dir otherwise.","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"0a67138d7387291a2626bfe2d98693efe4d3275e","unresolved":false,"context_lines":[{"line_number":323,"context_line":"                                             use_external\u003dTrue)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def test_remove_external_file_lock_files_matching_glob(self):"},{"line_number":326,"context_line":"        lock_dir \u003d tempfile.mkdtemp()"},{"line_number":327,"context_line":"        lock_prefix \u003d \"project-\""},{"line_number":328,"context_line":"        lock_names \u003d [\"12345\", \"12345-action\", \"12345_diff_action\", \"54321\"]"},{"line_number":329,"context_line":"        lock_files \u003d [open(\"%s/%s%s\" % (lock_dir, lock_prefix, name), \u0027a\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_b8cf9828","line":326,"in_reply_to":"9a8ffd7b_02437343","updated":"2015-11-30 15:05:55.000000000","message":"Done","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"4151afb136f6e9ecab10377333322972cafd69b5","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        lock_dir \u003d tempfile.mkdtemp()"},{"line_number":327,"context_line":"        lock_prefix \u003d \"project-\""},{"line_number":328,"context_line":"        lock_names \u003d [\"12345\", \"12345-action\", \"12345_diff_action\", \"54321\"]"},{"line_number":329,"context_line":"        lock_files \u003d [open(\"%s/%s%s\" % (lock_dir, lock_prefix, name), \u0027a\u0027)"},{"line_number":330,"context_line":"                      for name in lock_names]"},{"line_number":331,"context_line":"        # Delete all locks like project-12345*"},{"line_number":332,"context_line":"        # All but last lock file should be removed"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_8283e355","line":329,"updated":"2015-11-25 22:34:28.000000000","message":"Why open all of them?","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"0a67138d7387291a2626bfe2d98693efe4d3275e","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        lock_dir \u003d tempfile.mkdtemp()"},{"line_number":327,"context_line":"        lock_prefix \u003d \"project-\""},{"line_number":328,"context_line":"        lock_names \u003d [\"12345\", \"12345-action\", \"12345_diff_action\", \"54321\"]"},{"line_number":329,"context_line":"        lock_files \u003d [open(\"%s/%s%s\" % (lock_dir, lock_prefix, name), \u0027a\u0027)"},{"line_number":330,"context_line":"                      for name in lock_names]"},{"line_number":331,"context_line":"        # Delete all locks like project-12345*"},{"line_number":332,"context_line":"        # All but last lock file should be removed"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_588f8ccc","line":329,"in_reply_to":"9a8ffd7b_8283e355","updated":"2015-11-30 15:05:55.000000000","message":"Opening them in order to create the lock files and simulate someone waiting on the lock - any reason you wouldn\u0027t want them all opened?","commit_id":"ef5852b08f427d3696951c8c00fee9decc14145e"}]}
