)]}'
{"tools/move-implemented-specs.py":[{"author":{"_account_id":12898,"name":"Tony Breeds","email":"tony@bakeyournoodle.com","username":"tonyb"},"change_message_id":"661eadd6ded65a1d00dfd825db0dffbf8e01530b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        print(\u0027Processing specs for release: %s\u0027 % release)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    cwd \u003d os.getcwd()"},{"line_number":52,"context_line":"    approved_dir \u003d \u0027%s/specs/%s/approved/\u0027 % (cwd, release)"},{"line_number":53,"context_line":"    implemented_dir \u003d \u0027%s/specs/%s/implemented/\u0027 % (cwd, release)"},{"line_number":54,"context_line":"    redirects_file \u003d \u0027%s/specs/%s/redirects\u0027 % (cwd, release)"},{"line_number":55,"context_line":"    approved_specs \u003d os.listdir(approved_dir)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_88dcff47","line":52,"range":{"start_line":52,"start_character":19,"end_line":52,"end_character":59},"updated":"2016-09-19 22:59:41.000000000","message":"os.path.join() ?","commit_id":"4a0a44e78595fc5e316132e49e40d406b70be948"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"497f9c297bbb6af9cbc05ec1c67818bba9cf41b3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        print(\u0027Processing specs for release: %s\u0027 % release)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    cwd \u003d os.getcwd()"},{"line_number":52,"context_line":"    approved_dir \u003d \u0027%s/specs/%s/approved/\u0027 % (cwd, release)"},{"line_number":53,"context_line":"    implemented_dir \u003d \u0027%s/specs/%s/implemented/\u0027 % (cwd, release)"},{"line_number":54,"context_line":"    redirects_file \u003d \u0027%s/specs/%s/redirects\u0027 % (cwd, release)"},{"line_number":55,"context_line":"    approved_specs \u003d os.listdir(approved_dir)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_715db778","line":52,"range":{"start_line":52,"start_character":19,"end_line":52,"end_character":59},"in_reply_to":"7a8ec9b2_88dcff47","updated":"2016-09-20 14:14:18.000000000","message":"I\u0027ll try it.","commit_id":"4a0a44e78595fc5e316132e49e40d406b70be948"},{"author":{"_account_id":12898,"name":"Tony Breeds","email":"tony@bakeyournoodle.com","username":"tonyb"},"change_message_id":"661eadd6ded65a1d00dfd825db0dffbf8e01530b","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            continue"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        # check for the template file and skip that"},{"line_number":72,"context_line":"        template_file \u003d \u0027%s-template.rst\u0027 % release"},{"line_number":73,"context_line":"        if spec_fname \u003d\u003d template_file:"},{"line_number":74,"context_line":"            continue"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_68bed3d5","line":72,"updated":"2016-09-19 22:59:41.000000000","message":"micro optimisation.  You don\u0027t need to do this inside the loop","commit_id":"4a0a44e78595fc5e316132e49e40d406b70be948"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"497f9c297bbb6af9cbc05ec1c67818bba9cf41b3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            continue"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        # check for the template file and skip that"},{"line_number":72,"context_line":"        template_file \u003d \u0027%s-template.rst\u0027 % release"},{"line_number":73,"context_line":"        if spec_fname \u003d\u003d template_file:"},{"line_number":74,"context_line":"            continue"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_1160f334","line":72,"in_reply_to":"7a8ec9b2_68bed3d5","updated":"2016-09-20 14:14:18.000000000","message":"Good point.","commit_id":"4a0a44e78595fc5e316132e49e40d406b70be948"},{"author":{"_account_id":12898,"name":"Tony Breeds","email":"tony@bakeyournoodle.com","username":"tonyb"},"change_message_id":"661eadd6ded65a1d00dfd825db0dffbf8e01530b","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"                if not dry_run:"},{"line_number":91,"context_line":"                    # move the file from approved to implemented"},{"line_number":92,"context_line":"                    os.rename(approved_dir + spec_fname,"},{"line_number":93,"context_line":"                              implemented_dir + spec_fname)"},{"line_number":94,"context_line":"                    # add an entry to the redirects file"},{"line_number":95,"context_line":"                    with open(redirects_file, \u0027a\u0027) as redirects:"},{"line_number":96,"context_line":"                        redirects.write(\u0027approved/%s ../implemented/%s\\n\u0027 %"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_688c1336","line":93,"range":{"start_line":92,"start_character":0,"end_line":93,"end_character":59},"updated":"2016-09-19 22:59:41.000000000","message":"is it worth using GitPython to call git mv for you?\n\n import git\n g \u003d git.Git()\n g.mv(approved_dir + spec_fname, implemented_dir + spec_fname)","commit_id":"4a0a44e78595fc5e316132e49e40d406b70be948"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"497f9c297bbb6af9cbc05ec1c67818bba9cf41b3","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"                if not dry_run:"},{"line_number":91,"context_line":"                    # move the file from approved to implemented"},{"line_number":92,"context_line":"                    os.rename(approved_dir + spec_fname,"},{"line_number":93,"context_line":"                              implemented_dir + spec_fname)"},{"line_number":94,"context_line":"                    # add an entry to the redirects file"},{"line_number":95,"context_line":"                    with open(redirects_file, \u0027a\u0027) as redirects:"},{"line_number":96,"context_line":"                        redirects.write(\u0027approved/%s ../implemented/%s\\n\u0027 %"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_51e8bb7c","line":93,"range":{"start_line":92,"start_character":0,"end_line":93,"end_character":59},"in_reply_to":"7a8ec9b2_688c1336","updated":"2016-09-20 14:14:18.000000000","message":"No IMO, I\u0027ve had not so great experiences with the git python lib and random changes between versions such that I\u0027d like to just move the file and native git locally will figure it out and do the right thing when I commit.","commit_id":"4a0a44e78595fc5e316132e49e40d406b70be948"},{"author":{"_account_id":12898,"name":"Tony Breeds","email":"tony@bakeyournoodle.com","username":"tonyb"},"change_message_id":"661eadd6ded65a1d00dfd825db0dffbf8e01530b","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                    print(\u0027Blueprint is not complete: %s\u0027 % bp_name)"},{"line_number":102,"context_line":"                incomplete_count +\u003d 1"},{"line_number":103,"context_line":"        else:"},{"line_number":104,"context_line":"            print(\u0027WARNING: Spec %s does not exist in launchpad for nova. The \u0027"},{"line_number":105,"context_line":"                  \u0027spec filename should be fixed.\u0027 % bp_name)"},{"line_number":106,"context_line":"            warnings.append(spec_fname)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    if verbose:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_887b1f7b","line":105,"range":{"start_line":104,"start_character":18,"end_line":105,"end_character":50},"updated":"2016-09-19 22:59:41.000000000","message":"Huh, I didn\u0027t know that was a requirement.","commit_id":"4a0a44e78595fc5e316132e49e40d406b70be948"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"497f9c297bbb6af9cbc05ec1c67818bba9cf41b3","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                    print(\u0027Blueprint is not complete: %s\u0027 % bp_name)"},{"line_number":102,"context_line":"                incomplete_count +\u003d 1"},{"line_number":103,"context_line":"        else:"},{"line_number":104,"context_line":"            print(\u0027WARNING: Spec %s does not exist in launchpad for nova. The \u0027"},{"line_number":105,"context_line":"                  \u0027spec filename should be fixed.\u0027 % bp_name)"},{"line_number":106,"context_line":"            warnings.append(spec_fname)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    if verbose:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_f17c67b7","line":105,"range":{"start_line":104,"start_character":18,"end_line":105,"end_character":50},"in_reply_to":"7a8ec9b2_887b1f7b","updated":"2016-09-20 14:14:18.000000000","message":"Yes, the name of the spec file should match the title of the blueprint in LP:\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/newton/template.html\n\n\"The filename in the git repository should match the launchpad URL, for example a URL of: https://blueprints.launchpad.net/nova/+spec/awesome-thing should be named awesome-thing.rst\"","commit_id":"4a0a44e78595fc5e316132e49e40d406b70be948"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"9793f1d0c27bfb05a2f06064f361ac7470a394b3","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    incomplete_count \u003d 0"},{"line_number":64,"context_line":"    warnings \u003d []"},{"line_number":65,"context_line":"    for spec_fname in sorted(approved_specs):"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # get the blueprint name, it should be the name of the rst file"},{"line_number":68,"context_line":"        if not spec_fname.endswith(\u0027.rst\u0027):"},{"line_number":69,"context_line":"            continue"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_36526cde","line":66,"updated":"2016-09-20 00:30:35.000000000","message":"This blank line is odd given your lack of them above.","commit_id":"4cdc04b33987acd120dfda95a513c9ac7b79f780"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"946c069aa1fca5fe45c91f70b1f2e34f086605ff","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    incomplete_count \u003d 0"},{"line_number":64,"context_line":"    warnings \u003d []"},{"line_number":65,"context_line":"    for spec_fname in sorted(approved_specs):"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # get the blueprint name, it should be the name of the rst file"},{"line_number":68,"context_line":"        if not spec_fname.endswith(\u0027.rst\u0027):"},{"line_number":69,"context_line":"            continue"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_f171c745","line":66,"in_reply_to":"7a8ec9b2_36526cde","updated":"2016-09-20 14:08:50.000000000","message":"IDK, I wanted to chunk it up somewhere.","commit_id":"4cdc04b33987acd120dfda95a513c9ac7b79f780"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"9793f1d0c27bfb05a2f06064f361ac7470a394b3","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        # get the blueprint object from launchpad"},{"line_number":81,"context_line":"        lp_spec \u003d lp_nova.getSpecification(name\u003dbp_name)"},{"line_number":82,"context_line":"        if lp_spec:"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            # check the status"},{"line_number":85,"context_line":"            if lp_spec.is_complete:"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_565d38eb","line":83,"updated":"2016-09-20 00:30:35.000000000","message":"Stop it!","commit_id":"4cdc04b33987acd120dfda95a513c9ac7b79f780"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"9793f1d0c27bfb05a2f06064f361ac7470a394b3","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            # check the status"},{"line_number":85,"context_line":"            if lp_spec.is_complete:"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"                if verbose:"},{"line_number":88,"context_line":"                    print(\u0027Moving blueprint to implemented: %s\u0027 % spec_fname)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_766234af","line":86,"updated":"2016-09-20 00:30:35.000000000","message":"Sigh.","commit_id":"4cdc04b33987acd120dfda95a513c9ac7b79f780"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"9793f1d0c27bfb05a2f06064f361ac7470a394b3","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    # add an entry to the redirects file"},{"line_number":95,"context_line":"                    with open(redirects_file, \u0027a\u0027) as redirects:"},{"line_number":96,"context_line":"                        redirects.write(\u0027approved/%s ../implemented/%s\\n\u0027 %"},{"line_number":97,"context_line":"                                        (spec_fname, spec_fname))"},{"line_number":98,"context_line":"                move_count +\u003d 1"},{"line_number":99,"context_line":"            else:"},{"line_number":100,"context_line":"                if verbose:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_d6714879","line":97,"updated":"2016-09-20 00:30:35.000000000","message":"Do you think its worth checking if there\u0027s already a redirect or a destination file with that name?","commit_id":"4cdc04b33987acd120dfda95a513c9ac7b79f780"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d4eced0ffe196cccb8e1f93a2481656a6c4c6235","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    # add an entry to the redirects file"},{"line_number":95,"context_line":"                    with open(redirects_file, \u0027a\u0027) as redirects:"},{"line_number":96,"context_line":"                        redirects.write(\u0027approved/%s ../implemented/%s\\n\u0027 %"},{"line_number":97,"context_line":"                                        (spec_fname, spec_fname))"},{"line_number":98,"context_line":"                move_count +\u003d 1"},{"line_number":99,"context_line":"            else:"},{"line_number":100,"context_line":"                if verbose:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_b92e3d40","line":97,"in_reply_to":"7a8ec9b2_3107af82","updated":"2016-09-20 16:54:28.000000000","message":"Oh do you mean checking if the entry already exists in the redirects file so it\u0027s idempotent if we run this multiple times?","commit_id":"4cdc04b33987acd120dfda95a513c9ac7b79f780"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"946c069aa1fca5fe45c91f70b1f2e34f086605ff","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    # add an entry to the redirects file"},{"line_number":95,"context_line":"                    with open(redirects_file, \u0027a\u0027) as redirects:"},{"line_number":96,"context_line":"                        redirects.write(\u0027approved/%s ../implemented/%s\\n\u0027 %"},{"line_number":97,"context_line":"                                        (spec_fname, spec_fname))"},{"line_number":98,"context_line":"                move_count +\u003d 1"},{"line_number":99,"context_line":"            else:"},{"line_number":100,"context_line":"                if verbose:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_3107af82","line":97,"in_reply_to":"7a8ec9b2_d6714879","updated":"2016-09-20 14:08:50.000000000","message":"meh, we always create it when we setup the directories and files for a new release...","commit_id":"4cdc04b33987acd120dfda95a513c9ac7b79f780"}]}
