)]}'
{"swift/common/manager.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"eb87cc356f2d9b1af06c0e5df6e1b1ff5bbe1adb","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                if sig \u003d\u003d signal.SIG_DFL:"},{"line_number":492,"context_line":"                    try:"},{"line_number":493,"context_line":"                        fd \u003d open((\u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)), \u0027r\u0027)"},{"line_number":494,"context_line":"                        if re.match((\u0027/usr/bin/python /usr/bin/swift-%s\u0027 %"},{"line_number":495,"context_line":"                                     self.server), fd.read()) is None:"},{"line_number":496,"context_line":"                            # unknown process uses the pid in pidfile"},{"line_number":497,"context_line":"                            raise OSError(errno.ESRCH)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_51177c51","line":494,"updated":"2014-09-09 01:08:57.000000000","message":"You don\u0027t think it would be prudent to start the re pattern with a caret or simply use .startswith()?","commit_id":"266d10cc034512155b8807c470b34aada4d32588"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b6e6c15c88b0d5ea52dea10aaa9f89e3d339570c","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    if sig \u003d\u003d signal.SIG_DFL:"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            with open((\u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)), \u0027r\u0027) as fd:"},{"line_number":150,"context_line":"                if fd.read().find(name) \u003d\u003d -1:"},{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_d806dd1b","line":150,"updated":"2015-03-02 19:26:42.000000000","message":"nit: I think pythonistas would normally expect to see this written with the __contains__ builtin.  e.g.\n\n    if name not in fd.read():\n        raise ...","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d2c383d0eb724d20a262455f06fd2b9f19c8dbbf","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    if sig \u003d\u003d signal.SIG_DFL:"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            with open((\u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)), \u0027r\u0027) as fd:"},{"line_number":150,"context_line":"                if fd.read().find(name) \u003d\u003d -1:"},{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_9b6eea2d","line":150,"in_reply_to":"9a80dd14_c30509c3","updated":"2015-04-03 17:06:14.000000000","message":"Done","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"422e572fd1df3e6a726fa574c269136838f475d5","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    if sig \u003d\u003d signal.SIG_DFL:"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            with open((\u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)), \u0027r\u0027) as fd:"},{"line_number":150,"context_line":"                if fd.read().find(name) \u003d\u003d -1:"},{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_c30509c3","line":150,"in_reply_to":"ba7be1f8_d806dd1b","updated":"2015-03-19 01:29:52.000000000","message":"OK, I will change this.","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b6e6c15c88b0d5ea52dea10aaa9f89e3d339570c","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            with open((\u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)), \u0027r\u0027) as fd:"},{"line_number":150,"context_line":"                if fd.read().find(name) \u003d\u003d -1:"},{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_2a59625b","line":152,"updated":"2015-03-02 19:26:42.000000000","message":"I think typically when raising an OSError it\u0027s good form include the error string:\n\n   OSError(errno.ESRCH, os.strerror(errno.ESRCH))\n\nBut is that really the best thing to do here?  It might be confusing to debug a system error, only to find out it\u0027s acctually coming from the application?\n\nMaybe if you created a Swift exception that inherits from OSError you can still reuse the error handling in the caller.","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d2c383d0eb724d20a262455f06fd2b9f19c8dbbf","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            with open((\u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)), \u0027r\u0027) as fd:"},{"line_number":150,"context_line":"                if fd.read().find(name) \u003d\u003d -1:"},{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_7b69e624","line":152,"in_reply_to":"9a80dd14_031d6162","updated":"2015-04-03 17:06:14.000000000","message":"Done","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"422e572fd1df3e6a726fa574c269136838f475d5","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            with open((\u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)), \u0027r\u0027) as fd:"},{"line_number":150,"context_line":"                if fd.read().find(name) \u003d\u003d -1:"},{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_031d6162","line":152,"in_reply_to":"ba7be1f8_2a59625b","updated":"2015-03-19 01:29:52.000000000","message":"Thanks. I will change this according to your comment.","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b6e6c15c88b0d5ea52dea10aaa9f89e3d339570c","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class UnknownCommandError(Exception):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_aaf1d26b","line":154,"updated":"2015-03-02 19:26:42.000000000","message":"given the description of the change it\u0027s not obvious to me why \"sake_kill\" will always send the signal, but only check the name afterwards?","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d2c383d0eb724d20a262455f06fd2b9f19c8dbbf","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class UnknownCommandError(Exception):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_dbe8f27e","line":154,"in_reply_to":"9a80dd14_83687189","updated":"2015-04-03 17:06:14.000000000","message":"Done","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"422e572fd1df3e6a726fa574c269136838f475d5","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                    # unknown process is using the pid"},{"line_number":152,"context_line":"                    raise OSError(errno.ESRCH)"},{"line_number":153,"context_line":"        except IOError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class UnknownCommandError(Exception):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_83687189","line":154,"in_reply_to":"ba7be1f8_aaf1d26b","updated":"2015-03-19 01:29:52.000000000","message":"After a deep thought, I noticed that  I have to move these checking before os.kill, while I also have to add some tests to check that os.kill never gets called when an invalid name is detected.\n\nI will fix it later.","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"cd590b5e2ffb303b8c0ce98b595b3a5a4ab0535a","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    if sig \u003d\u003d signal.SIG_DFL:"},{"line_number":149,"context_line":"        try:"},{"line_number":150,"context_line":"            proc_file \u003d \u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)"},{"line_number":151,"context_line":"            if os.path.exists(proc_file):"},{"line_number":152,"context_line":"                with open(proc_file, \u0027r\u0027) as fd:"},{"line_number":153,"context_line":"                    if name not in fd.read():"},{"line_number":154,"context_line":"                        # unknown process is using the pid"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_e8fa5d74","line":151,"updated":"2015-05-20 20:58:57.000000000","message":"Not sure why you want to check if file exists right before opening it. Surely the open would fail, even in a weird fs like proc?","commit_id":"ab9f63402de6d554528699a02955854ac28264c5"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"740777d6a42948d9b424e54617ddfd85378f436d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    if sig \u003d\u003d signal.SIG_DFL:"},{"line_number":149,"context_line":"        try:"},{"line_number":150,"context_line":"            proc_file \u003d \u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)"},{"line_number":151,"context_line":"            if os.path.exists(proc_file):"},{"line_number":152,"context_line":"                with open(proc_file, \u0027r\u0027) as fd:"},{"line_number":153,"context_line":"                    if name not in fd.read():"},{"line_number":154,"context_line":"                        # unknown process is using the pid"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_d32957e7","line":151,"in_reply_to":"7a016987_93487fcd","updated":"2015-05-23 18:30:29.000000000","message":"Well yeah, in general, but in this case we immediately reach for open(). If the /proc does not exist, then poof, you get the exception... right?","commit_id":"ab9f63402de6d554528699a02955854ac28264c5"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"e80d4f3ecee910e7e22763476021c9b2dfbd81f6","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    if sig \u003d\u003d signal.SIG_DFL:"},{"line_number":149,"context_line":"        try:"},{"line_number":150,"context_line":"            proc_file \u003d \u0027%s/%d/cmdline\u0027 % (PROC_DIR, pid)"},{"line_number":151,"context_line":"            if os.path.exists(proc_file):"},{"line_number":152,"context_line":"                with open(proc_file, \u0027r\u0027) as fd:"},{"line_number":153,"context_line":"                    if name not in fd.read():"},{"line_number":154,"context_line":"                        # unknown process is using the pid"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_93487fcd","line":151,"in_reply_to":"7a016987_e8fa5d74","updated":"2015-05-23 18:26:56.000000000","message":"Not sure if anyone runs Swift on BSD-ish systems any more, but I was happy to see the lack of assumption that /proc/whatever necessarily exists.","commit_id":"ab9f63402de6d554528699a02955854ac28264c5"}],"test/unit/common/test_manager.py":[{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"ef9046d35d332ed331a8b6bb7c3cc176c218f1ca","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    output \u003d f.read()"},{"line_number":64,"context_line":"    f.seek(0)"},{"line_number":65,"context_line":"    f.truncate()"},{"line_number":66,"context_line":"    # print \u003e\u003e sys.stderr, output"},{"line_number":67,"context_line":"    return output"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_eeda1e16","line":66,"updated":"2015-03-02 09:04:30.000000000","message":"nit pick: I prefer to remove this line.","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d2c383d0eb724d20a262455f06fd2b9f19c8dbbf","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    output \u003d f.read()"},{"line_number":64,"context_line":"    f.seek(0)"},{"line_number":65,"context_line":"    f.truncate()"},{"line_number":66,"context_line":"    # print \u003e\u003e sys.stderr, output"},{"line_number":67,"context_line":"    return output"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_fb63b63f","line":66,"in_reply_to":"9a80dd14_0041d762","updated":"2015-04-03 17:06:14.000000000","message":"Done","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"422e572fd1df3e6a726fa574c269136838f475d5","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    output \u003d f.read()"},{"line_number":64,"context_line":"    f.seek(0)"},{"line_number":65,"context_line":"    f.truncate()"},{"line_number":66,"context_line":"    # print \u003e\u003e sys.stderr, output"},{"line_number":67,"context_line":"    return output"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_0041d762","line":66,"in_reply_to":"ba7be1f8_eeda1e16","updated":"2015-03-19 01:29:52.000000000","message":"+1\n\nI will do it later, thanks!","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"ef9046d35d332ed331a8b6bb7c3cc176c218f1ca","unresolved":false,"context_lines":[{"line_number":764,"context_line":"            (\u00273/cmdline\u0027, \u0027swift-another-server\u0027)"},{"line_number":765,"context_line":"        )"},{"line_number":766,"context_line":"        with temptree(*zip(*pid_files)) as t1:"},{"line_number":767,"context_line":"            with temptree(*zip(*proc_files)) as t2:"},{"line_number":768,"context_line":"                manager.RUN_DIR \u003d t1"},{"line_number":769,"context_line":"                manager.PROC_DIR \u003d t2"},{"line_number":770,"context_line":"                server \u003d manager.Server(\u0027test-server\u0027, run_dir\u003dt1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_ecb6a7db","line":767,"updated":"2015-03-02 09:04:30.000000000","message":"nit picks: there are two temptree\u0027s variables here. I prefer to read proc_dir which uses below rather than t1.","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"d2c383d0eb724d20a262455f06fd2b9f19c8dbbf","unresolved":false,"context_lines":[{"line_number":764,"context_line":"            (\u00273/cmdline\u0027, \u0027swift-another-server\u0027)"},{"line_number":765,"context_line":"        )"},{"line_number":766,"context_line":"        with temptree(*zip(*pid_files)) as t1:"},{"line_number":767,"context_line":"            with temptree(*zip(*proc_files)) as t2:"},{"line_number":768,"context_line":"                manager.RUN_DIR \u003d t1"},{"line_number":769,"context_line":"                manager.PROC_DIR \u003d t2"},{"line_number":770,"context_line":"                server \u003d manager.Server(\u0027test-server\u0027, run_dir\u003dt1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_db5a3283","line":767,"in_reply_to":"9a80dd14_607453cf","updated":"2015-04-03 17:06:14.000000000","message":"Done","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"422e572fd1df3e6a726fa574c269136838f475d5","unresolved":false,"context_lines":[{"line_number":764,"context_line":"            (\u00273/cmdline\u0027, \u0027swift-another-server\u0027)"},{"line_number":765,"context_line":"        )"},{"line_number":766,"context_line":"        with temptree(*zip(*pid_files)) as t1:"},{"line_number":767,"context_line":"            with temptree(*zip(*proc_files)) as t2:"},{"line_number":768,"context_line":"                manager.RUN_DIR \u003d t1"},{"line_number":769,"context_line":"                manager.PROC_DIR \u003d t2"},{"line_number":770,"context_line":"                server \u003d manager.Server(\u0027test-server\u0027, run_dir\u003dt1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_607453cf","line":767,"in_reply_to":"ba7be1f8_b8884972","updated":"2015-03-19 01:29:52.000000000","message":"OK, I will change this in my next patch.","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b6e6c15c88b0d5ea52dea10aaa9f89e3d339570c","unresolved":false,"context_lines":[{"line_number":764,"context_line":"            (\u00273/cmdline\u0027, \u0027swift-another-server\u0027)"},{"line_number":765,"context_line":"        )"},{"line_number":766,"context_line":"        with temptree(*zip(*pid_files)) as t1:"},{"line_number":767,"context_line":"            with temptree(*zip(*proc_files)) as t2:"},{"line_number":768,"context_line":"                manager.RUN_DIR \u003d t1"},{"line_number":769,"context_line":"                manager.PROC_DIR \u003d t2"},{"line_number":770,"context_line":"                server \u003d manager.Server(\u0027test-server\u0027, run_dir\u003dt1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_b8884972","line":767,"in_reply_to":"ba7be1f8_ecb6a7db","updated":"2015-03-02 19:26:42.000000000","message":"+1\n\nIt sure looks like the temptree is willing to create directories having everything in common root would probably make the diff smaller and avoid a second level of nesting:\n\n    temp_files \u003d (\n        (\u0027var/run/test-server1.pid\u0027, 1),\n        (\u0027var/run/test-server2.pid\u0027, 2),\n        (\u0027var/run/test-server3.pid\u0027, 3),\n        (\u0027var/run/test-server3.pid\u0027, 3),\n        (\u0027proc/1/cmdline\u0027, \u0027swift-test-server test.conf\u0027),\n        (\u0027proc/3/cmdline\u0027, \u0027swift-another-server test.conf\u0027),\n    )\n    with temptree(*zip(*temp_files)) as t:\n        manager.RUN_DIR \u003d os.path.join(t, \u0027var/run\u0027)\n        manager.PROC_DIR \u003d os.path.join(t, \u0027proc\u0027)\n        ...\n\nwould that work?","commit_id":"86f167a61e5337a303e6841f099bc14d11ddf4f9"}]}
