)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"A few weeks ago it was mentioned in channel that someone wished"},{"line_number":10,"context_line":"they could compare builders to rings. So as a random lunch time"},{"line_number":11,"context_line":"hack I created a partition diffing tool. I polished it up a bit"},{"line_number":12,"context_line":"and thought it might be usful in the Swift tool box."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch adds a new tool, swift-partition-diff, which does"},{"line_number":15,"context_line":"exactly what it says. It takes 2 builder or ring files"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa0c359_0db79df8","line":12,"range":{"start_line":12,"start_character":24,"end_line":12,"end_character":29},"updated":"2018-02-08 05:03:40.000000000","message":"nit) useful","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  Number of diffs: 4 (0.13%)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"There is also a `--verbose` (`-v`) option, which will pring the entire"},{"line_number":81,"context_line":"_replica2part2dev table. It looks pretty, but is obviously very verbose:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"  $ swift-partition-diff object.builder other-object.builder -v"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa0c359_6d93c150","line":80,"range":{"start_line":80,"start_character":54,"end_line":80,"end_character":59},"updated":"2018-02-08 05:03:40.000000000","message":"nit) print","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"}],"swift/cli/part_diff.py":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def main(self, file1, file2, verbose\u003dFalse, show_diffs\u003dFalse):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        if None in (file1, file2):"},{"line_number":49,"context_line":"            return EXIT_NUM_BUILDERS"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        try:"},{"line_number":52,"context_line":"            builder1, builder2 \u003d [PartDiff.load_file(builder) for builder in"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_021207b2","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":36},"updated":"2018-02-08 05:03:40.000000000","message":"In my understanding, parsed argument length is already checked before PartDiff is called.\nI think this check is not needed.","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            print(\u0027Error: Replica counts differ\u0027)"},{"line_number":60,"context_line":"            return EXIT_REPLICA_COUNT_DIFFER"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        max_part_len \u003d len(str(max(builder1.parts, builder2.parts)))"},{"line_number":63,"context_line":"        max_dev_len \u003d len(str(max(PartDiff.get_max_dev_id(builder1),"},{"line_number":64,"context_line":"                                  PartDiff.get_max_dev_id(builder2))))"},{"line_number":65,"context_line":"        err_part \u003d \u0027({:\u003e%d})\u0027 % max_dev_len"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_22bf0362","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":68},"updated":"2018-02-08 05:03:40.000000000","message":"In current implementation, difference is checked for common partition numbers. (e.g. if builder1.parts \u003d 1024 and builder2.parts \u003d 512, then difference is checked for 0 ~ 511).\n\nSo I think we should use min_part_len.","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"74f693caa810e023cf22e62ee8f03a4cf8d0d85b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            print(\u0027Error: Replica counts differ\u0027)"},{"line_number":60,"context_line":"            return EXIT_REPLICA_COUNT_DIFFER"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        max_part_len \u003d len(str(max(builder1.parts, builder2.parts)))"},{"line_number":63,"context_line":"        max_dev_len \u003d len(str(max(PartDiff.get_max_dev_id(builder1),"},{"line_number":64,"context_line":"                                  PartDiff.get_max_dev_id(builder2))))"},{"line_number":65,"context_line":"        err_part \u003d \u0027({:\u003e%d})\u0027 % max_dev_len"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_0939ca3f","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":68},"in_reply_to":"3fa0c359_22bf0362","updated":"2018-02-08 10:17:40.000000000","message":"max_part_len is just used to autogenerate the size of the output table. But yeah I like only comparing the lessor parts builder. Good idea","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            num_dash +\u003d builder_len * 2"},{"line_number":76,"context_line":"            head_line \u003d \u0027|{:^%d}|{:^%d}|{:^%d}|\u0027 % (max_part_len, builder_len,"},{"line_number":77,"context_line":"                                                    builder_len)"},{"line_number":78,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":79,"context_line":"            print(head_line.format(\u0027P\u0027, \u0027b1\u0027, \u0027b2\u0027))"},{"line_number":80,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":81,"context_line":"        for part, (b1r, b2r) in enumerate("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_d52297a4","line":78,"range":{"start_line":78,"start_character":24,"end_line":78,"end_character":37},"updated":"2018-02-08 05:03:40.000000000","message":"Because num_dash is integer value, int() is not needed.","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"74f693caa810e023cf22e62ee8f03a4cf8d0d85b","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            num_dash +\u003d builder_len * 2"},{"line_number":76,"context_line":"            head_line \u003d \u0027|{:^%d}|{:^%d}|{:^%d}|\u0027 % (max_part_len, builder_len,"},{"line_number":77,"context_line":"                                                    builder_len)"},{"line_number":78,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":79,"context_line":"            print(head_line.format(\u0027P\u0027, \u0027b1\u0027, \u0027b2\u0027))"},{"line_number":80,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":81,"context_line":"        for part, (b1r, b2r) in enumerate("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_a47ebb16","line":78,"range":{"start_line":78,"start_character":24,"end_line":78,"end_character":37},"in_reply_to":"3fa0c359_d52297a4","updated":"2018-02-08 10:17:40.000000000","message":"num_dash is actually a float (builder.replicas). so needs to be converted","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                                    builder_len)"},{"line_number":78,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":79,"context_line":"            print(head_line.format(\u0027P\u0027, \u0027b1\u0027, \u0027b2\u0027))"},{"line_number":80,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":81,"context_line":"        for part, (b1r, b2r) in enumerate("},{"line_number":82,"context_line":"                zip(zip(*builder1._replica2part2dev),"},{"line_number":83,"context_line":"                    zip(*builder2._replica2part2dev))):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_f52553ac","line":80,"range":{"start_line":80,"start_character":24,"end_line":80,"end_character":37},"updated":"2018-02-08 05:03:40.000000000","message":"Same as above.","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":79,"context_line":"            print(head_line.format(\u0027P\u0027, \u0027b1\u0027, \u0027b2\u0027))"},{"line_number":80,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":81,"context_line":"        for part, (b1r, b2r) in enumerate("},{"line_number":82,"context_line":"                zip(zip(*builder1._replica2part2dev),"},{"line_number":83,"context_line":"                    zip(*builder2._replica2part2dev))):"},{"line_number":84,"context_line":"            b1data \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_224dc399","line":81,"range":{"start_line":81,"start_character":18,"end_line":81,"end_character":28},"updated":"2018-02-08 05:03:40.000000000","message":"IMHO, I think these variable names are too short, and it is hard to understand the meanings.\nHow about (b1devs, b2devs) ?","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            b1data \u003d []"},{"line_number":85,"context_line":"            b2data \u003d []"},{"line_number":86,"context_line":"            errors \u003d 0"},{"line_number":87,"context_line":"            for a, b in zip(b1r, b2r):"},{"line_number":88,"context_line":"                if a \u003d\u003d b:"},{"line_number":89,"context_line":"                    part_str \u003d good_part"},{"line_number":90,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_42500f33","line":87,"range":{"start_line":87,"start_character":16,"end_line":87,"end_character":20},"updated":"2018-02-08 05:03:40.000000000","message":"IMHO, How about b1dev and b2dev?","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            str_data \u003d \"|{:\u003e0%d}|%s|%s|\" % \\"},{"line_number":96,"context_line":"                       (max_part_len, \"\".join(b1data), \"\".join(b2data))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            if errors and show_diffs:"},{"line_number":99,"context_line":"                print(str_data.format(part))"},{"line_number":100,"context_line":"            elif verbose:"},{"line_number":101,"context_line":"                print(str_data.format(part))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            diff_dev_count +\u003d errors"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_42356ff6","line":101,"range":{"start_line":98,"start_character":0,"end_line":101,"end_character":44},"updated":"2018-02-08 05:03:40.000000000","message":"The if-clause and elif-clause have same bodies.\nHow about following code?\n\nif (errors and show_diffs) or verbose:\n    print (str_data.format(part))","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"74f693caa810e023cf22e62ee8f03a4cf8d0d85b","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            str_data \u003d \"|{:\u003e0%d}|%s|%s|\" % \\"},{"line_number":96,"context_line":"                       (max_part_len, \"\".join(b1data), \"\".join(b2data))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            if errors and show_diffs:"},{"line_number":99,"context_line":"                print(str_data.format(part))"},{"line_number":100,"context_line":"            elif verbose:"},{"line_number":101,"context_line":"                print(str_data.format(part))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            diff_dev_count +\u003d errors"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_c9cc4263","line":101,"range":{"start_line":98,"start_character":0,"end_line":101,"end_character":44},"in_reply_to":"3fa0c359_42356ff6","updated":"2018-02-08 10:17:40.000000000","message":"Done","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            diff_dev_count +\u003d errors"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        replicanth_diff \u003d diff_dev_count / (builder1.parts * builder1.replicas)"},{"line_number":106,"context_line":"        if show_diffs or verbose:"},{"line_number":107,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":108,"context_line":"            print(\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_d509372c","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":79},"updated":"2018-02-08 05:03:40.000000000","message":"If builder1 and builder2 have different part power, the replicanth_diff depends on argument order.\nI feel this behavior is strange...","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        replicanth_diff \u003d diff_dev_count / (builder1.parts * builder1.replicas)"},{"line_number":106,"context_line":"        if show_diffs or verbose:"},{"line_number":107,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":108,"context_line":"            print(\u0027\u0027)"},{"line_number":109,"context_line":"        print(\"Number of diffs: %s (%.2f%%)\" % (diff_dev_count,"},{"line_number":110,"context_line":"                                                replicanth_diff * 100))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_553687e8","line":107,"range":{"start_line":107,"start_character":24,"end_line":107,"end_character":36},"updated":"2018-02-08 05:03:40.000000000","message":"Same as above.","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"74f693caa810e023cf22e62ee8f03a4cf8d0d85b","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        replicanth_diff \u003d diff_dev_count / (builder1.parts * builder1.replicas)"},{"line_number":106,"context_line":"        if show_diffs or verbose:"},{"line_number":107,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":108,"context_line":"            print(\u0027\u0027)"},{"line_number":109,"context_line":"        print(\"Number of diffs: %s (%.2f%%)\" % (diff_dev_count,"},{"line_number":110,"context_line":"                                                replicanth_diff * 100))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_c490a751","line":107,"range":{"start_line":107,"start_character":24,"end_line":107,"end_character":36},"in_reply_to":"3fa0c359_553687e8","updated":"2018-02-08 10:17:40.000000000","message":"num_dash is actually a float (builder.replicas). so needs to be converted","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        if show_diffs or verbose:"},{"line_number":107,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":108,"context_line":"            print(\u0027\u0027)"},{"line_number":109,"context_line":"        print(\"Number of diffs: %s (%.2f%%)\" % (diff_dev_count,"},{"line_number":110,"context_line":"                                                replicanth_diff * 100))"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if diff_dev_count:"},{"line_number":113,"context_line":"            return EXIT_DIFF"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_95416f3c","line":110,"range":{"start_line":109,"start_character":0,"end_line":110,"end_character":71},"updated":"2018-02-08 05:03:40.000000000","message":"IMHO, if the total number of dev count (\u003d part * replica) is printed too, it is more convenient.","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"74f693caa810e023cf22e62ee8f03a4cf8d0d85b","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        if show_diffs or verbose:"},{"line_number":107,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":108,"context_line":"            print(\u0027\u0027)"},{"line_number":109,"context_line":"        print(\"Number of diffs: %s (%.2f%%)\" % (diff_dev_count,"},{"line_number":110,"context_line":"                                                replicanth_diff * 100))"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if diff_dev_count:"},{"line_number":113,"context_line":"            return EXIT_DIFF"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_84c5bf5d","line":110,"range":{"start_line":109,"start_character":0,"end_line":110,"end_character":71},"in_reply_to":"3fa0c359_95416f3c","updated":"2018-02-08 10:17:40.000000000","message":"Done","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"dd04467384f5e366885d5c7c43a3f0360b75e4ab","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    options, arguments \u003d args.parse_args()"},{"line_number":126,"context_line":"    if len(arguments) !\u003d 2:"},{"line_number":127,"context_line":"        args.print_help()"},{"line_number":128,"context_line":"        sys.exit(EXIT_NUM_BUILDERS)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    partdiff \u003d PartDiff()"},{"line_number":131,"context_line":"    sys.exit("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_2e1b6c81","line":128,"updated":"2018-02-08 09:00:21.000000000","message":"Thanks so much for this Kazuhiro! I hacked this together and then tried to refactor and clean it up. Really needed your fresh eyes!","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    options, arguments \u003d args.parse_args()"},{"line_number":126,"context_line":"    if len(arguments) !\u003d 2:"},{"line_number":127,"context_line":"        args.print_help()"},{"line_number":128,"context_line":"        sys.exit(EXIT_NUM_BUILDERS)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    partdiff \u003d PartDiff()"},{"line_number":131,"context_line":"    sys.exit("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_0288c71c","line":128,"range":{"start_line":128,"start_character":8,"end_line":128,"end_character":17},"updated":"2018-02-08 05:03:40.000000000","message":"sys.exit is called in bin/swift-partition-diff too.\nI think there is no need for the main function to call sys.exit.\nThe main function should return exit-code instead.","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"ba5f614de6538bd00a307aea9b3f080b7a80686a","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        sys.exit(EXIT_NUM_BUILDERS)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    partdiff \u003d PartDiff()"},{"line_number":131,"context_line":"    sys.exit("},{"line_number":132,"context_line":"        partdiff.main(*arguments, verbose\u003doptions.verbose,"},{"line_number":133,"context_line":"                      show_diffs\u003doptions.diffs))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_22d4e31f","line":131,"range":{"start_line":131,"start_character":4,"end_line":131,"end_character":13},"updated":"2018-02-08 05:03:40.000000000","message":"Same as above.","commit_id":"642c6a7003a0d6ffaaa475c39e3e58baf9953843"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"9eb0cc7768479094d64df3d652e317956ad7736c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"# limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from itertools import izip_longest"},{"line_number":18,"context_line":"from swift.common.ring.builder import RingBuilder"},{"line_number":19,"context_line":"from swift.common.ring import Ring"},{"line_number":20,"context_line":"from swift.common.exceptions import FileNotFoundError, UnPicklingError"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_ec4ed06d","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":34},"updated":"2018-02-09 05:51:48.000000000","message":"izip_longest is not supported in Python3.\nI think \"from six.moves import zip_longest\" is better.","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ee2567d2e3dc8ce8e90de6f56f23098231b58415","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"# limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from itertools import izip_longest"},{"line_number":18,"context_line":"from swift.common.ring.builder import RingBuilder"},{"line_number":19,"context_line":"from swift.common.ring import Ring"},{"line_number":20,"context_line":"from swift.common.exceptions import FileNotFoundError, UnPicklingError"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_3d6ebdc8","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":34},"in_reply_to":"3fa0c359_ec4ed06d","updated":"2018-02-14 03:28:02.000000000","message":"Done","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"9eb0cc7768479094d64df3d652e317956ad7736c","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def get_max_dev_id(builder):"},{"line_number":44,"context_line":"        return max(map(lambda x: x[\u0027id\u0027], builder.devs))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def main(self, file1, file2, verbose\u003dFalse, show_diffs\u003dFalse):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        if None in (file1, file2):"},{"line_number":49,"context_line":"            return EXIT_NUM_BUILDERS"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_8cf70cd4","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":66},"updated":"2018-02-09 05:51:48.000000000","message":"Why this function is not staticmethod?\nThis function doesn\u0027t use \"self\".","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ee2567d2e3dc8ce8e90de6f56f23098231b58415","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def get_max_dev_id(builder):"},{"line_number":44,"context_line":"        return max(map(lambda x: x[\u0027id\u0027], builder.devs))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def main(self, file1, file2, verbose\u003dFalse, show_diffs\u003dFalse):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        if None in (file1, file2):"},{"line_number":49,"context_line":"            return EXIT_NUM_BUILDERS"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_1d6741eb","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":66},"in_reply_to":"3fa0c359_8cf70cd4","updated":"2018-02-14 03:28:02.000000000","message":"Done","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"9eb0cc7768479094d64df3d652e317956ad7736c","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            errors \u003d 0"},{"line_number":98,"context_line":"            for b1_dev_id, b2_dev_id in zip(b1_replicas, b2_replicas):"},{"line_number":99,"context_line":"                part_str \u003d good_part"},{"line_number":100,"context_line":"                if scanning:"},{"line_number":101,"context_line":"                    if b1_dev_id !\u003d b2_dev_id:"},{"line_number":102,"context_line":"                        errors +\u003d 1"},{"line_number":103,"context_line":"                        part_str \u003d err_part"},{"line_number":104,"context_line":"                b1data.append(part_str.format(b1_dev_id))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_aca208fb","line":101,"range":{"start_line":100,"start_character":0,"end_line":101,"end_character":46},"updated":"2018-02-09 05:51:48.000000000","message":"nit) I think \"if scanning and (b1_dev_id !\u003d b2_dev_id):\" is better.","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"9eb0cc7768479094d64df3d652e317956ad7736c","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            diff_dev_count +\u003d errors"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        replicanth_diff \u003d diff_dev_count / (num_parts * builder1.replicas)"},{"line_number":115,"context_line":"        replicanth_total \u003d num_parts * builder1.replicas"},{"line_number":116,"context_line":"        if show_diffs or verbose:"},{"line_number":117,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":118,"context_line":"            print(\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_ac7be878","line":115,"range":{"start_line":114,"start_character":0,"end_line":115,"end_character":56},"updated":"2018-02-09 05:51:48.000000000","message":"I think the following is better:\n\nreplicanth_total \u003d num_parts * builder1.replicas\nrepilcanth_diff \u003d diff_dev_count / replicanth_total","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ee2567d2e3dc8ce8e90de6f56f23098231b58415","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            diff_dev_count +\u003d errors"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        replicanth_diff \u003d diff_dev_count / (num_parts * builder1.replicas)"},{"line_number":115,"context_line":"        replicanth_total \u003d num_parts * builder1.replicas"},{"line_number":116,"context_line":"        if show_diffs or verbose:"},{"line_number":117,"context_line":"            print(\u0027-\u0027 * int(num_dash))"},{"line_number":118,"context_line":"            print(\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_bdb64d3d","line":115,"range":{"start_line":114,"start_character":0,"end_line":115,"end_character":56},"in_reply_to":"3fa0c359_ac7be878","updated":"2018-02-14 03:28:02.000000000","message":"Lol, yeah, much better. opps","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"}],"test/unit/cli/test_part_diff.py":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"9eb0cc7768479094d64df3d652e317956ad7736c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        # Now make sure is can load ring and builder objects"},{"line_number":71,"context_line":"        def test_builder_attrs(builder_fn):"},{"line_number":72,"context_line":"            builder \u003d part_diff.PartDiff.load_file(builder_fn)"},{"line_number":73,"context_line":"            for attr in (\"parts\", \"replicas\", \"_replica2part2dev\"):"},{"line_number":74,"context_line":"                self.assertTrue(hasattr(builder, attr))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        for builder_fn in (self._save_builder(), self._save_ring()):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_2c191821","line":73,"range":{"start_line":73,"start_character":24,"end_line":73,"end_character":65},"updated":"2018-02-09 05:51:48.000000000","message":"\"devs\" is also used in PartDiff.","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ee2567d2e3dc8ce8e90de6f56f23098231b58415","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        # Now make sure is can load ring and builder objects"},{"line_number":71,"context_line":"        def test_builder_attrs(builder_fn):"},{"line_number":72,"context_line":"            builder \u003d part_diff.PartDiff.load_file(builder_fn)"},{"line_number":73,"context_line":"            for attr in (\"parts\", \"replicas\", \"_replica2part2dev\"):"},{"line_number":74,"context_line":"                self.assertTrue(hasattr(builder, attr))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        for builder_fn in (self._save_builder(), self._save_ring()):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_dd8a3962","line":73,"range":{"start_line":73,"start_character":24,"end_line":73,"end_character":65},"in_reply_to":"3fa0c359_2c191821","updated":"2018-02-14 03:28:02.000000000","message":"Done","commit_id":"37db23a4b0db6fec4199bd4e843708837f913de7"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb563ead76680df4080d96523a376add25036730","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        rd.save(fname)"},{"line_number":51,"context_line":"        return fname"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _save_builder(self, rb\u003dNone):"},{"line_number":54,"context_line":"        if not rb:"},{"line_number":55,"context_line":"            rb \u003d self.rb"},{"line_number":56,"context_line":"        fname \u003d os.path.join(self.testdir, \u0027%s.builder\u0027 % uuid.uuid4())"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_43588af8","line":53,"range":{"start_line":53,"start_character":26,"end_line":53,"end_character":35},"updated":"2018-02-14 07:24:15.000000000","message":"Umm... _save_builder method saves both of self.rb and self.smaller_rb.\nI know this method saves self.rb in most cases, but I think self._save_builder(self.rb) is more readable than using default value.","commit_id":"61a4634f84292b8d14dd6fdce322179ac2a27d28"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a0aac0ada4d1ca3cb0e19f3cd51ef6a01e8f5407","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        rd.save(fname)"},{"line_number":51,"context_line":"        return fname"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _save_builder(self, rb\u003dNone):"},{"line_number":54,"context_line":"        if not rb:"},{"line_number":55,"context_line":"            rb \u003d self.rb"},{"line_number":56,"context_line":"        fname \u003d os.path.join(self.testdir, \u0027%s.builder\u0027 % uuid.uuid4())"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_adbb62c2","line":53,"range":{"start_line":53,"start_character":26,"end_line":53,"end_character":35},"in_reply_to":"3fa0c359_43588af8","updated":"2018-02-14 23:51:18.000000000","message":"done, another good call. Thanks :)","commit_id":"61a4634f84292b8d14dd6fdce322179ac2a27d28"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb563ead76680df4080d96523a376add25036730","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        # Show diffs when different"},{"line_number":149,"context_line":"        expected_num_diffs \u003d \"Number of diffs: 2/1536 (0.13%)\""},{"line_number":150,"context_line":"        expected_num_diffs_smaller \u003d \"Number of diffs: 2/768 (0.26%)\\n\""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        expected \u003d ("},{"line_number":153,"context_line":"            \"-------------------------------------------\\n\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_2348de2a","line":150,"range":{"start_line":150,"start_character":68,"end_line":150,"end_character":70},"updated":"2018-02-14 07:24:15.000000000","message":"Why only `expected_num_diffs_smaller` ends with \u0027\\n\u0027?","commit_id":"61a4634f84292b8d14dd6fdce322179ac2a27d28"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a0aac0ada4d1ca3cb0e19f3cd51ef6a01e8f5407","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        # Show diffs when different"},{"line_number":149,"context_line":"        expected_num_diffs \u003d \"Number of diffs: 2/1536 (0.13%)\""},{"line_number":150,"context_line":"        expected_num_diffs_smaller \u003d \"Number of diffs: 2/768 (0.26%)\\n\""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        expected \u003d ("},{"line_number":153,"context_line":"            \"-------------------------------------------\\n\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_0d7cd61e","line":150,"range":{"start_line":150,"start_character":68,"end_line":150,"end_character":70},"in_reply_to":"3fa0c359_2348de2a","updated":"2018-02-14 23:51:18.000000000","message":"Oh it doesn\u0027t need to, thanks","commit_id":"61a4634f84292b8d14dd6fdce322179ac2a27d28"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"bb563ead76680df4080d96523a376add25036730","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            with mock.patch(\u0027sys.stdout\u0027, new\u003dstdout):"},{"line_number":162,"context_line":"                pd.main(b1, b2, show_diffs\u003dTrue)"},{"line_number":163,"context_line":"            self.assertIn(expected, stdout.getvalue())"},{"line_number":164,"context_line":"            if b2 \u003d\u003d smaller_builder:"},{"line_number":165,"context_line":"                self.assertIn(expected_num_diffs_smaller, stdout.getvalue())"},{"line_number":166,"context_line":"            else:"},{"line_number":167,"context_line":"                self.assertIn(expected_num_diffs, stdout.getvalue())"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        # now diff in verbose (print the entire ring!) so lets only"},{"line_number":170,"context_line":"        # check a small part of the ring."}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_e36676bb","line":167,"range":{"start_line":164,"start_character":0,"end_line":167,"end_character":68},"updated":"2018-02-14 07:24:15.000000000","message":"IMO, codes in for-loop should not depends on the iterated variables.\nHow about following code?:\n\nfor b1, b2, expected_diffs in (\n        (ring, builder2, expected_num_diffs),\n        (builder, smaller_builder, expected_num_diffs_smaller)):\n    stdout \u003d StringIO()\n    with mock.patch(\u0027sys.stdout\u0027, new\u003dstdout):\n        pd.main(b1, b2, show_diffs\u003dTrue)\n    self.assertIn(expected, stdout.getvalue())\n    self.assertIn(expected_diffs, stdout.getvalue())","commit_id":"61a4634f84292b8d14dd6fdce322179ac2a27d28"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a0aac0ada4d1ca3cb0e19f3cd51ef6a01e8f5407","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            with mock.patch(\u0027sys.stdout\u0027, new\u003dstdout):"},{"line_number":162,"context_line":"                pd.main(b1, b2, show_diffs\u003dTrue)"},{"line_number":163,"context_line":"            self.assertIn(expected, stdout.getvalue())"},{"line_number":164,"context_line":"            if b2 \u003d\u003d smaller_builder:"},{"line_number":165,"context_line":"                self.assertIn(expected_num_diffs_smaller, stdout.getvalue())"},{"line_number":166,"context_line":"            else:"},{"line_number":167,"context_line":"                self.assertIn(expected_num_diffs, stdout.getvalue())"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        # now diff in verbose (print the entire ring!) so lets only"},{"line_number":170,"context_line":"        # check a small part of the ring."}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_2d79922e","line":167,"range":{"start_line":164,"start_character":0,"end_line":167,"end_character":68},"in_reply_to":"3fa0c359_e36676bb","updated":"2018-02-14 23:51:18.000000000","message":"Oh nice one, yeah much better. Seems I get a little lazy with tests :)","commit_id":"61a4634f84292b8d14dd6fdce322179ac2a27d28"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"84e24afdd7d6296a1078c5e6278cc4b3eda2d4d6","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            ip \u003d \"127.0.0.%s\" % i"},{"line_number":37,"context_line":"            self.rb.add_dev({\u0027id\u0027: i, \u0027region\u0027: 0, \u0027zone\u0027: 0, \u0027weight\u0027: 1,"},{"line_number":38,"context_line":"                             \u0027ip\u0027: ip, \u0027port\u0027: 10000, \u0027device\u0027: \u0027sda1\u0027})"},{"line_number":39,"context_line":"        self.rb.rebalance(seed\u003d1)"},{"line_number":40,"context_line":"        rb \u003d self._save_builder(self.rb)"},{"line_number":41,"context_line":"        self.smaller_rb \u003d ring.RingBuilder.load(rb)"},{"line_number":42,"context_line":"        self.smaller_rb.part_power \u003d 7"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_8a1a5ec9","line":39,"updated":"2019-03-13 19:08:04.000000000","message":"This will likely produce different rings between py2 and py3, which may explain the py3 failures. See also my frustrated comments at https://review.openstack.org/#/c/401397/11/test/unit/common/ring/test_ring.py@477","commit_id":"854909c621b2e65ba7719b432880c0309cacc325"}]}
