)]}'
{"etc/glance-api.conf":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":119,"context_line":"delayed_delete \u003d False"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"# Delayed delete time in seconds"},{"line_number":122,"context_line":"scrub_time \u003d 43200"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Directory that the scrubber will use to remind itself of what to run"},{"line_number":125,"context_line":"# Make sure this is also set in glance-scrubber.conf"}],"source_content_type":"text/plain","patch_set":1,"id":"AAAACH%2F%2F%2FdY%3D","line":122,"updated":"2011-08-21 20:36:26.000000000","message":"What is the difference between wait_time in scrubber conf and this setting?","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":119,"context_line":"delayed_delete \u003d False"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"# Delayed delete time in seconds"},{"line_number":122,"context_line":"scrub_time \u003d 43200"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Directory that the scrubber will use to remind itself of what to run"},{"line_number":125,"context_line":"# Make sure this is also set in glance-scrubber.conf"}],"source_content_type":"text/plain","patch_set":1,"id":"AAAACH%2F%2F%2B2c%3D","line":122,"in_reply_to":"AAAACH%2F%2F%2FdY%3D","updated":"2011-08-30 20:24:25.000000000","message":"wakeup_time is the time interval in between looking for items that need to be deleted. scrub_time is the minimum time to wait before it is actually deleted from the backend.\n\nNow that you mention it, it is confusing. I\u0027ll see if I can\u0027t think of better names, I just copied it over from the old scrubber.conf since now the api server is the one calculating the delay.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":121,"context_line":"# Delayed delete time in seconds"},{"line_number":122,"context_line":"scrub_time \u003d 43200"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Directory that the scrubber will use to remind itself of what to run"},{"line_number":125,"context_line":"# Make sure this is also set in glance-scrubber.conf"},{"line_number":126,"context_line":"scrubber_datadir \u003d /var/lib/glance/scrubber"},{"line_number":127,"context_line":""}],"source_content_type":"text/plain","patch_set":1,"id":"AAAACH%2F%2F%2Fdg%3D","line":124,"updated":"2011-08-21 20:36:26.000000000","message":"What to run, or what to delete?","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":121,"context_line":"# Delayed delete time in seconds"},{"line_number":122,"context_line":"scrub_time \u003d 43200"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Directory that the scrubber will use to remind itself of what to run"},{"line_number":125,"context_line":"# Make sure this is also set in glance-scrubber.conf"},{"line_number":126,"context_line":"scrubber_datadir \u003d /var/lib/glance/scrubber"},{"line_number":127,"context_line":""}],"source_content_type":"text/plain","patch_set":1,"id":"AAAACH%2F%2F%2B2U%3D","line":124,"in_reply_to":"AAAACH%2F%2F%2Fdg%3D","updated":"2011-08-30 20:24:25.000000000","message":"Done","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Directory that the scrubber will use to remind itself of what to run"},{"line_number":125,"context_line":"# Make sure this is also set in glance-scrubber.conf"},{"line_number":126,"context_line":"scrubber_datadir \u003d /var/lib/glance/scrubber"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"[pipeline:glance-api]"},{"line_number":129,"context_line":"pipeline \u003d versionnegotiation context apiv1app"}],"source_content_type":"text/plain","patch_set":1,"id":"AAAACH%2F%2F%2Fdc%3D","line":126,"updated":"2011-08-21 20:36:26.000000000","message":"Is there a reason this has to be in both the scrubber and the API config files? It would be nice to have it in only one place...","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Directory that the scrubber will use to remind itself of what to run"},{"line_number":125,"context_line":"# Make sure this is also set in glance-scrubber.conf"},{"line_number":126,"context_line":"scrubber_datadir \u003d /var/lib/glance/scrubber"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"[pipeline:glance-api]"},{"line_number":129,"context_line":"pipeline \u003d versionnegotiation context apiv1app"}],"source_content_type":"text/plain","patch_set":1,"id":"AAAACH%2F%2F%2B2Y%3D","line":126,"in_reply_to":"AAAACH%2F%2F%2Fdc%3D","updated":"2011-08-30 20:24:25.000000000","message":"Both the scrubber and the api server need to know where their \"working\" directory is. The api server is writing to that directory and the scrubber is reading from it (and deleting from it when it has scrubbed the files).  I\u0027m don\u0027t think it could just be in one or the other unless they depended on each other somehow (like the api also read the scrubber.conf or the scrubber also read the api.conf).","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"}],"glance/common/context.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @property"},{"line_number":47,"context_line":"    def show_deleted(self):"},{"line_number":48,"context_line":"        \"\"\"Admins can see deleteded by default\"\"\""},{"line_number":49,"context_line":"        if self._show_deleted or self.is_admin:"},{"line_number":50,"context_line":"            return True"},{"line_number":51,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2FdU%3D","line":48,"updated":"2011-08-21 20:36:26.000000000","message":"deleteded :)","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @property"},{"line_number":47,"context_line":"    def show_deleted(self):"},{"line_number":48,"context_line":"        \"\"\"Admins can see deleteded by default\"\"\""},{"line_number":49,"context_line":"        if self._show_deleted or self.is_admin:"},{"line_number":50,"context_line":"            return True"},{"line_number":51,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B2Q%3D","line":48,"in_reply_to":"AAAACH%2F%2F%2FdU%3D","updated":"2011-08-30 20:24:25.000000000","message":"Done","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    @property"},{"line_number":47,"context_line":"    def show_deleted(self):"},{"line_number":48,"context_line":"        \"\"\"Admins can see deleteded by default\"\"\""},{"line_number":49,"context_line":"        if self._show_deleted or self.is_admin:"},{"line_number":50,"context_line":"            return True"},{"line_number":51,"context_line":"        return False"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2FdQ%3D","line":49,"updated":"2011-08-21 20:36:26.000000000","message":"I\u0027m not sure what the purpose of the _show_deleted attribute is. Could you explain its purpose?\n\nAlso, shouldn\u0027t a user be able to view their own deleted images?","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    @property"},{"line_number":47,"context_line":"    def show_deleted(self):"},{"line_number":48,"context_line":"        \"\"\"Admins can see deleteded by default\"\"\""},{"line_number":49,"context_line":"        if self._show_deleted or self.is_admin:"},{"line_number":50,"context_line":"            return True"},{"line_number":51,"context_line":"        return False"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B2M%3D","line":49,"in_reply_to":"AAAACH%2F%2F%2FdQ%3D","updated":"2011-08-30 20:24:25.000000000","message":"_show_deleted is the method for a user to be able to view their own deleted images. Admins by default get to see deleted images.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"}],"glance/registry/db/api.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                        options(joinedload(models.Image.members)).\\"},{"line_number":138,"context_line":"                        filter_by(id\u003dimage_id)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        if not _deleted(context):"},{"line_number":141,"context_line":"            query \u003d query.filter_by(deleted\u003dFalse)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        image \u003d query.one()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2FdM%3D","line":140,"updated":"2011-08-21 20:36:26.000000000","message":"Can we rename _deleted to something that is more descriptive?","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                        options(joinedload(models.Image.members)).\\"},{"line_number":138,"context_line":"                        filter_by(id\u003dimage_id)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        if not _deleted(context):"},{"line_number":141,"context_line":"            query \u003d query.filter_by(deleted\u003dFalse)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        image \u003d query.one()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B2I%3D","line":140,"in_reply_to":"AAAACH%2F%2F%2FdM%3D","updated":"2011-08-30 20:24:25.000000000","message":"renamed to _show_deleted","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"}],"glance/registry/server.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        if not deleted:"},{"line_number":251,"context_line":"            return False"},{"line_number":252,"context_line":"        deleted \u003d deleted.lower()"},{"line_number":253,"context_line":"        if deleted \u003d\u003d \u0027true\u0027 or deleted \u003d\u003d \u00271\u0027:"},{"line_number":254,"context_line":"            return True"},{"line_number":255,"context_line":"        return False"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2FdI%3D","line":253,"updated":"2011-08-21 20:36:26.000000000","message":"You can use the bool_from_string() function in utils...","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        if not deleted:"},{"line_number":251,"context_line":"            return False"},{"line_number":252,"context_line":"        deleted \u003d deleted.lower()"},{"line_number":253,"context_line":"        if deleted \u003d\u003d \u0027true\u0027 or deleted \u003d\u003d \u00271\u0027:"},{"line_number":254,"context_line":"            return True"},{"line_number":255,"context_line":"        return False"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B2E%3D","line":253,"in_reply_to":"AAAACH%2F%2F%2FdI%3D","updated":"2011-08-30 20:24:25.000000000","message":"excellent!","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"f7fa865b6fd24046aff2a4f0af9a437789476d0f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from webob import exc"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from glance.common import exception"},{"line_number":29,"context_line":"from glance.common import wsgi"},{"line_number":30,"context_line":"from glance.common import utils"},{"line_number":31,"context_line":"from glance.registry.db import api as db_api"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAACH%2F%2F%2BVE%3D","line":29,"updated":"2011-09-12 22:37:19.000000000","message":"Thanks for fixing the ordering of the wsgi import, but now you\u0027ve got utils out of orde :)","commit_id":"d58587dd559e29a558ebea75c81e39e979174894"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"48e1c02e48598573dc44fcc65c17cb007389b32a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from webob import exc"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from glance.common import exception"},{"line_number":29,"context_line":"from glance.common import wsgi"},{"line_number":30,"context_line":"from glance.common import utils"},{"line_number":31,"context_line":"from glance.registry.db import api as db_api"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAACH%2F%2F%2BUE%3D","line":29,"in_reply_to":"AAAACH%2F%2F%2BVE%3D","updated":"2011-09-12 23:16:56.000000000","message":"Done ;)","commit_id":"d58587dd559e29a558ebea75c81e39e979174894"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"f7fa865b6fd24046aff2a4f0af9a437789476d0f","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            raise exc.HTTPBadRequest(_(\"is_public must be None, True, \""},{"line_number":248,"context_line":"                                       \"or False\"))"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def _get_deleted(self, req):"},{"line_number":251,"context_line":"        \"\"\"Parse deleted into something usable.\"\"\""},{"line_number":252,"context_line":"        deleted \u003d req.str_params.get(\u0027deleted\u0027, False)"},{"line_number":253,"context_line":"        if not deleted:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAACH%2F%2F%2BVA%3D","line":250,"updated":"2011-09-12 22:37:19.000000000","message":"Can you call this _parse_deleted_filter? _get_deleted isn\u0027t quite clear what the intention of the function is","commit_id":"d58587dd559e29a558ebea75c81e39e979174894"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"48e1c02e48598573dc44fcc65c17cb007389b32a","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            raise exc.HTTPBadRequest(_(\"is_public must be None, True, \""},{"line_number":248,"context_line":"                                       \"or False\"))"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def _get_deleted(self, req):"},{"line_number":251,"context_line":"        \"\"\"Parse deleted into something usable.\"\"\""},{"line_number":252,"context_line":"        deleted \u003d req.str_params.get(\u0027deleted\u0027, False)"},{"line_number":253,"context_line":"        if not deleted:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAACH%2F%2F%2BTo%3D","line":250,"in_reply_to":"AAAACH%2F%2F%2BVA%3D","updated":"2011-09-12 23:16:56.000000000","message":"Done","commit_id":"d58587dd559e29a558ebea75c81e39e979174894"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"48e1c02e48598573dc44fcc65c17cb007389b32a","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        deleted \u003d req.str_params.get(\u0027deleted\u0027, False)"},{"line_number":253,"context_line":"        if not deleted:"},{"line_number":254,"context_line":"            return False"},{"line_number":255,"context_line":"        deleted \u003d deleted.lower()"},{"line_number":256,"context_line":"        return utils.bool_from_string(deleted)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def show(self, req, id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAACH%2F%2F%2BTs%3D","line":255,"updated":"2011-09-12 23:16:56.000000000","message":"Haha, it is ;) Leftover from before it was using the utils. Removed","commit_id":"d58587dd559e29a558ebea75c81e39e979174894"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"f7fa865b6fd24046aff2a4f0af9a437789476d0f","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        deleted \u003d req.str_params.get(\u0027deleted\u0027, False)"},{"line_number":253,"context_line":"        if not deleted:"},{"line_number":254,"context_line":"            return False"},{"line_number":255,"context_line":"        deleted \u003d deleted.lower()"},{"line_number":256,"context_line":"        return utils.bool_from_string(deleted)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def show(self, req, id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAACH%2F%2F%2BU8%3D","line":255,"updated":"2011-09-12 22:37:19.000000000","message":"Shouldn\u0027t this be build into bool_from_string?","commit_id":"d58587dd559e29a558ebea75c81e39e979174894"}],"glance/store/__init__.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":177,"context_line":"    delete_time \u003d time.time() + scrub_time"},{"line_number":178,"context_line":"    file_path \u003d os.path.join(datadir, str(id))"},{"line_number":179,"context_line":"    if not os.path.exists(datadir):"},{"line_number":180,"context_line":"        utils.safe_mkdirs(datadir)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    with open(file_path, \u0027w\u0027) as f:"},{"line_number":183,"context_line":"        f.write(\u0027\\n\u0027.join([uri, str(int(delete_time))]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2FdE%3D","line":180,"updated":"2011-08-21 20:36:26.000000000","message":"The purpose of your safe_mkdirs is to ignore already existing directories, but you check for the existence of the directory here :)","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":177,"context_line":"    delete_time \u003d time.time() + scrub_time"},{"line_number":178,"context_line":"    file_path \u003d os.path.join(datadir, str(id))"},{"line_number":179,"context_line":"    if not os.path.exists(datadir):"},{"line_number":180,"context_line":"        utils.safe_mkdirs(datadir)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    with open(file_path, \u0027w\u0027) as f:"},{"line_number":183,"context_line":"        f.write(\u0027\\n\u0027.join([uri, str(int(delete_time))]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B2A%3D","line":180,"in_reply_to":"AAAACH%2F%2F%2FdE%3D","updated":"2011-08-30 20:24:25.000000000","message":"Good catch.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        utils.safe_mkdirs(datadir)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    with open(file_path, \u0027w\u0027) as f:"},{"line_number":183,"context_line":"        f.write(\u0027\\n\u0027.join([uri, str(int(delete_time))]))"},{"line_number":184,"context_line":"    os.chmod(file_path, 0600)"},{"line_number":185,"context_line":"    os.utime(file_path, (delete_time, delete_time))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2FdA%3D","line":183,"updated":"2011-08-21 20:36:26.000000000","message":"This is not thread-safe. Multiple coroutines in the glance-api server may overwrite each other in this file. You will either need to place a mutex around this piece of code, or instead use the registry to store this information.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        utils.safe_mkdirs(datadir)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    with open(file_path, \u0027w\u0027) as f:"},{"line_number":183,"context_line":"        f.write(\u0027\\n\u0027.join([uri, str(int(delete_time))]))"},{"line_number":184,"context_line":"    os.chmod(file_path, 0600)"},{"line_number":185,"context_line":"    os.utime(file_path, (delete_time, delete_time))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B18%3D","line":183,"in_reply_to":"AAAACH%2F%2F%2FdA%3D","updated":"2011-08-30 20:24:25.000000000","message":"I\u0027ll add a check and a raise if the filepath already exists. Should that pass on multiple coroutines, they will be running so close together that it won\u0027t matter which one wins the contents contest as the timedelta between them wouldn\u0027t be significant.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"}],"glance/store/scrubber.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import time"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from contextlib import contextmanager"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import glance.store.filesystem"},{"line_number":27,"context_line":"import glance.store.http"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2Fc8%3D","line":24,"updated":"2011-08-21 20:36:26.000000000","message":"contextlib is a standard library module and should come after import calendar above.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import time"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from contextlib import contextmanager"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import glance.store.filesystem"},{"line_number":27,"context_line":"import glance.store.http"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B1w%3D","line":24,"in_reply_to":"AAAACH%2F%2F%2Fc8%3D","updated":"2011-08-30 20:24:25.000000000","message":"Yea, sorry, this was vestigial from an earlier attempt. I\u0027m not using it so I just removed it.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.registry \u003d client.RegistryClient(host, port)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if not os.path.exists(self.datadir):"},{"line_number":80,"context_line":"            utils.safe_mkdirs(self.datadir)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        if self.cleanup:"},{"line_number":83,"context_line":"            self.cleanup_time \u003d config.get_option(options,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2Fc4%3D","line":80,"updated":"2011-08-21 20:36:26.000000000","message":"Same comment from before :) Your safe_mkdirs function already ignores the existence of directories, so not necessary to check existence again here.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.registry \u003d client.RegistryClient(host, port)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if not os.path.exists(self.datadir):"},{"line_number":80,"context_line":"            utils.safe_mkdirs(self.datadir)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        if self.cleanup:"},{"line_number":83,"context_line":"            self.cleanup_time \u003d config.get_option(options,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B14%3D","line":80,"in_reply_to":"AAAACH%2F%2F%2Fc4%3D","updated":"2011-08-30 20:24:25.000000000","message":"Done ;)","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"019c26118aed7e91af87f4554081dc11232bfb36","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        pool.starmap(self._delete, delete_work)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @staticmethod"},{"line_number":174,"context_line":"    def read_queue_file(file_path):"},{"line_number":175,"context_line":"        with open(file_path) as f:"},{"line_number":176,"context_line":"            uri \u003d f.readline().strip()"},{"line_number":177,"context_line":"            delete_time \u003d int(f.readline().strip())"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2Fc0%3D","line":174,"updated":"2011-08-21 20:36:26.000000000","message":"Any reason to make these @staticmethods instead of just module-level functions?","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"},{"author":{"_account_id":385,"name":"Jason Kölker","email":"jason@koelker.net","username":"jason-koelker"},"change_message_id":"967a7dec50ca84a1c99b03108ad85c5411888129","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        pool.starmap(self._delete, delete_work)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @staticmethod"},{"line_number":174,"context_line":"    def read_queue_file(file_path):"},{"line_number":175,"context_line":"        with open(file_path) as f:"},{"line_number":176,"context_line":"            uri \u003d f.readline().strip()"},{"line_number":177,"context_line":"            delete_time \u003d int(f.readline().strip())"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAACH%2F%2F%2B10%3D","line":174,"in_reply_to":"AAAACH%2F%2F%2Fc0%3D","updated":"2011-08-30 20:24:25.000000000","message":"Nope ;) moved.","commit_id":"c3866f94fee1d3b21416784a64943ea36c364119"}]}
