)]}'
{"jenkins/scripts/common_translation_update.sh":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92f68e07a457e79ef37d5f7a882c30be018a2e0d","unresolved":false,"context_lines":[{"line_number":274,"context_line":""},{"line_number":275,"context_line":"# Extract messages for a django project, we need to update django.pot"},{"line_number":276,"context_line":"# and djangojs.pot."},{"line_number":277,"context_line":"function extract_django {"},{"line_number":278,"context_line":"    local modulename\u003d$1"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    # We need to install horizon"}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_2fe9bb80","line":277,"range":{"start_line":277,"start_character":9,"end_line":277,"end_character":23},"updated":"2016-01-13 18:31:41.000000000","message":"-\u003e extract_messages_django","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92f68e07a457e79ef37d5f7a882c30be018a2e0d","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    KEYWORDS\u003d\"-k gettext_noop -k gettext_lazy -k ngettext_lazy:1,2\""},{"line_number":296,"context_line":"    KEYWORDS+\u003d\" -k ugettext_noop -k ugettext_lazy -k ungettext_lazy:1,2\""},{"line_number":297,"context_line":"    KEYWORDS+\u003d\" -k npgettext:1c,2,3 -k pgettext_lazy:1c,2 -k npgettext_lazy:1c,2,3\""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    for DOMAIN in djangojs django ; do"},{"line_number":300,"context_line":"        $VENV/bin/pybabel extract -F babel-${DOMAIN}.cfg \\"},{"line_number":301,"context_line":"            -o ${modulename}/locale/${DOMAIN}.pot $KEYWORDS ${modulename}"}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_2a58c931","line":298,"updated":"2016-01-13 18:31:41.000000000","message":"Does each project need to prepare djnago.pot and djangojs.pot?\npybabel expects they exist.","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":6547,"name":"Andreas Jaeger","email":"jaegerandi@gmail.com","username":"jaegerandi"},"change_message_id":"567247b35bee35f13d95b18478cb6547d1e57662","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    KEYWORDS\u003d\"-k gettext_noop -k gettext_lazy -k ngettext_lazy:1,2\""},{"line_number":296,"context_line":"    KEYWORDS+\u003d\" -k ugettext_noop -k ugettext_lazy -k ungettext_lazy:1,2\""},{"line_number":297,"context_line":"    KEYWORDS+\u003d\" -k npgettext:1c,2,3 -k pgettext_lazy:1c,2 -k npgettext_lazy:1c,2,3\""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    for DOMAIN in djangojs django ; do"},{"line_number":300,"context_line":"        $VENV/bin/pybabel extract -F babel-${DOMAIN}.cfg \\"},{"line_number":301,"context_line":"            -o ${modulename}/locale/${DOMAIN}.pot $KEYWORDS ${modulename}"}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_9a6342dc","line":298,"in_reply_to":"da6ed579_2a58c931","updated":"2016-01-13 19:01:11.000000000","message":"The script should work if the files do not exist, so we might need to touch the files first... I don\u0027t want anymore that projects first manually need to create files.","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"14e7732593d5e27760d6d8694611a9917a05226c","unresolved":false,"context_lines":[{"line_number":264,"context_line":"function setup_django {"},{"line_number":265,"context_line":"    local project\u003d$1"},{"line_number":266,"context_line":"    local modulename\u003d$2"},{"line_number":267,"context_line":"    local version\u003d$3"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    /usr/local/jenkins/slave_scripts/create-zanata-xml.py \\"},{"line_number":270,"context_line":"        -p $project -v $version --srcdir $modulename/locale \\"}],"source_content_type":"text/x-sh","patch_set":4,"id":"9a68dd71_c7c63e16","line":267,"range":{"start_line":267,"start_character":0,"end_line":267,"end_character":20},"updated":"2016-01-20 12:06:37.000000000","message":"All other setup_* func\u0027s have \n\n    local version\u003d${1:-master}\n\nSo it might be wise to follow that convention? Although I don\u0027t think these functions would ever be called without version param","commit_id":"ddbef468a5cea82e1bd1974bcfd1e47300cb1863"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d954963a6771204fc18ae43e9e0aebccc96bd872","unresolved":false,"context_lines":[{"line_number":264,"context_line":"function setup_django {"},{"line_number":265,"context_line":"    local project\u003d$1"},{"line_number":266,"context_line":"    local modulename\u003d$2"},{"line_number":267,"context_line":"    local version\u003d$3"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    /usr/local/jenkins/slave_scripts/create-zanata-xml.py \\"},{"line_number":270,"context_line":"        -p $project -v $version --srcdir $modulename/locale \\"}],"source_content_type":"text/x-sh","patch_set":4,"id":"9a68dd71_5552c668","line":267,"range":{"start_line":267,"start_character":0,"end_line":267,"end_character":20},"in_reply_to":"9a68dd71_c7c63e16","updated":"2016-01-21 04:17:45.000000000","message":"Done","commit_id":"ddbef468a5cea82e1bd1974bcfd1e47300cb1863"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"14e7732593d5e27760d6d8694611a9917a05226c","unresolved":false,"context_lines":[{"line_number":291,"context_line":"    (cd ${root}/openstack/horizon \u0026\u0026 $VENV/bin/pip install .)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    # Horizon has these as dependencies but let\u0027s be sure."},{"line_number":294,"context_line":"    $VENV/bin/pip install Babel django-babel"},{"line_number":295,"context_line":"    KEYWORDS\u003d\"-k gettext_noop -k gettext_lazy -k ngettext_lazy:1,2\""},{"line_number":296,"context_line":"    KEYWORDS+\u003d\" -k ugettext_noop -k ugettext_lazy -k ungettext_lazy:1,2\""},{"line_number":297,"context_line":"    KEYWORDS+\u003d\" -k npgettext:1c,2,3 -k pgettext_lazy:1c,2 -k npgettext_lazy:1c,2,3\""}],"source_content_type":"text/x-sh","patch_set":4,"id":"9a68dd71_6a3e37ba","line":294,"range":{"start_line":294,"start_character":0,"end_line":294,"end_character":44},"updated":"2016-01-20 12:06:37.000000000","message":"This looks a bit dangerous since requirements might have them capped at some point. (They aren\u0027t now though)","commit_id":"ddbef468a5cea82e1bd1974bcfd1e47300cb1863"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d954963a6771204fc18ae43e9e0aebccc96bd872","unresolved":false,"context_lines":[{"line_number":291,"context_line":"    (cd ${root}/openstack/horizon \u0026\u0026 $VENV/bin/pip install .)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    # Horizon has these as dependencies but let\u0027s be sure."},{"line_number":294,"context_line":"    $VENV/bin/pip install Babel django-babel"},{"line_number":295,"context_line":"    KEYWORDS\u003d\"-k gettext_noop -k gettext_lazy -k ngettext_lazy:1,2\""},{"line_number":296,"context_line":"    KEYWORDS+\u003d\" -k ugettext_noop -k ugettext_lazy -k ungettext_lazy:1,2\""},{"line_number":297,"context_line":"    KEYWORDS+\u003d\" -k npgettext:1c,2,3 -k pgettext_lazy:1c,2 -k npgettext_lazy:1c,2,3\""}],"source_content_type":"text/x-sh","patch_set":4,"id":"9a68dd71_f54e5ac0","line":294,"range":{"start_line":294,"start_character":0,"end_line":294,"end_character":44},"in_reply_to":"9a68dd71_6a3e37ba","updated":"2016-01-21 04:17:45.000000000","message":"Added TODO note.","commit_id":"ddbef468a5cea82e1bd1974bcfd1e47300cb1863"},{"author":{"_account_id":6547,"name":"Andreas Jaeger","email":"jaegerandi@gmail.com","username":"jaegerandi"},"change_message_id":"36464026ef8c378972374b2fd6ba518ce3c75481","unresolved":false,"context_lines":[{"line_number":294,"context_line":"    trap \"rm -rf $VENV\" EXIT"},{"line_number":295,"context_line":"    virtualenv $VENV"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    zc\u003d\u0027/usr/zuul-env/bin/zuul-cloner\u0027"},{"line_number":298,"context_line":"    root\u003d$(mktemp -d)"},{"line_number":299,"context_line":"    trap \"rm -rf $VENV $root\" EXIT"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-sh","patch_set":7,"id":"9a68dd71_c7af6328","line":297,"updated":"2016-01-24 13:40:20.000000000","message":"I learned recently that we cannot use zuul-cloner in post queue and this is run in post queue.\n\nWe have to rethink how to do this best.","commit_id":"35484d4f6173e3f0fd653e5c6044b30f2deb246b"}],"jenkins/scripts/get-modulename.py":[{"author":{"_account_id":6547,"name":"Andreas Jaeger","email":"jaegerandi@gmail.com","username":"jaegerandi"},"change_message_id":"36464026ef8c378972374b2fd6ba518ce3c75481","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    parser.add_argument(\u0027-t\u0027, \u0027--target\u0027,"},{"line_number":32,"context_line":"                        choices\u003d[\u0027python\u0027, \u0027django\u0027],"},{"line_number":33,"context_line":"                        default\u003d\u0027python\u0027,"},{"line_number":34,"context_line":"                        help\u003d\u0027Type of modules to search (dfault: python).\u0027)"},{"line_number":35,"context_line":"    parser.add_argument(\u0027-f\u0027, \u0027--file\u0027, default\u003d\u0027setup.cfg\u0027,"},{"line_number":36,"context_line":"                        help\u003d\u0027Path of setup.cfg file.\u0027)"},{"line_number":37,"context_line":"    return parser.parse_args()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a68dd71_47c373ed","line":34,"range":{"start_line":34,"start_character":57,"end_line":34,"end_character":63},"updated":"2016-01-24 13:40:20.000000000","message":"typo: default","commit_id":"35484d4f6173e3f0fd653e5c6044b30f2deb246b"}],"jenkins/scripts/propose_translation_update.sh":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92f68e07a457e79ef37d5f7a882c30be018a2e0d","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    # Invoke run_tests.sh to update the po files"},{"line_number":143,"context_line":"    # Or else, \"../manage.py makemessages\" can be used."},{"line_number":144,"context_line":"    ./run_tests.sh --makemessages -V"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    # Compress downloaded po files"},{"line_number":147,"context_line":"    compress_po_files \"horizon\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_21f6b4d7","line":144,"updated":"2016-01-13 18:31:41.000000000","message":"I noticed the current run_tests.sh --makemessages does not update PO files. After horizon --makemessages is changed to run pybabel, it no longer udpates PO files.\n\npropose_xxxx method expects PO files, so I will post a patch to fix it.","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":6547,"name":"Andreas Jaeger","email":"jaegerandi@gmail.com","username":"jaegerandi"},"change_message_id":"567247b35bee35f13d95b18478cb6547d1e57662","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    # Invoke run_tests.sh to update the po files"},{"line_number":143,"context_line":"    # Or else, \"../manage.py makemessages\" can be used."},{"line_number":144,"context_line":"    ./run_tests.sh --makemessages -V"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    # Compress downloaded po files"},{"line_number":147,"context_line":"    compress_po_files \"horizon\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_9aba6222","line":144,"in_reply_to":"da6ed579_21f6b4d7","updated":"2016-01-13 19:01:11.000000000","message":"Why should it update PO files? It\u0027s not needed.\n\nWe do: Upload files to Zanata, Zanata updates PO files, we download PO files.","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8bd44eb694be9b6ef4f09c51dadc7f6304f8ad94","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    # Invoke run_tests.sh to update the po files"},{"line_number":143,"context_line":"    # Or else, \"../manage.py makemessages\" can be used."},{"line_number":144,"context_line":"    ./run_tests.sh --makemessages -V"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    # Compress downloaded po files"},{"line_number":147,"context_line":"    compress_po_files \"horizon\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_9c7fb9aa","line":144,"in_reply_to":"da6ed579_9aba6222","updated":"2016-01-14 05:39:47.000000000","message":"Agree. Good point.\n\nIn my understanding, we are updating PO files to ensure POT file and PO files are synced.\n\nHowever, PO files and POT file are synced in most cases because we are pushing a new POT file to Zanata when a commit is merged. Only exception is a case where a new commit is merged while propose_transaltion_update is running, but it is a corner case and I don\u0027t think we need to consider it.","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92f68e07a457e79ef37d5f7a882c30be018a2e0d","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    # Update the .pot file"},{"line_number":160,"context_line":"    extract_messages"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    update_po_files \"openstack_auth\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    # Compress downloaded po files"},{"line_number":165,"context_line":"    compress_po_files \"openstack_auth\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_84ba09bf","line":162,"updated":"2016-01-13 18:31:41.000000000","message":"update_po_files checks $PROJECT.po files exist, but in django_openstack_auth the filename of PO files is django.po.\nI wonder why it works.","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":6547,"name":"Andreas Jaeger","email":"jaegerandi@gmail.com","username":"jaegerandi"},"change_message_id":"567247b35bee35f13d95b18478cb6547d1e57662","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    # Update the .pot file"},{"line_number":160,"context_line":"    extract_messages"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    update_po_files \"openstack_auth\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    # Compress downloaded po files"},{"line_number":165,"context_line":"    compress_po_files \"openstack_auth\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_da4c5a44","line":162,"in_reply_to":"da6ed579_84ba09bf","updated":"2016-01-13 19:01:11.000000000","message":"Like above - I think we can get rid of the updating completely....\n\nYes, update_po files is a nop for this invocation","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92f68e07a457e79ef37d5f7a882c30be018a2e0d","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    # Update the .pot file"},{"line_number":195,"context_line":"    extract_messages_django \"$modulename\""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    update_po_files \"$modulename\""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    # Compress downloaded po files"},{"line_number":200,"context_line":"    compress_po_files \"$modulename\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_30acbc9f","line":197,"updated":"2016-01-13 18:31:41.000000000","message":"update_po_files update a single domain.\nWe need to enhance update_po_files to take \"domain\" as optional argumetn and call update_po_files for both django and djangojs domains.","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"},{"author":{"_account_id":6547,"name":"Andreas Jaeger","email":"jaegerandi@gmail.com","username":"jaegerandi"},"change_message_id":"567247b35bee35f13d95b18478cb6547d1e57662","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    # Update the .pot file"},{"line_number":195,"context_line":"    extract_messages_django \"$modulename\""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    update_po_files \"$modulename\""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    # Compress downloaded po files"},{"line_number":200,"context_line":"    compress_po_files \"$modulename\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"da6ed579_ba5166da","line":197,"in_reply_to":"da6ed579_30acbc9f","updated":"2016-01-13 19:01:11.000000000","message":"See my comments above, I think we can remove it. Do you agree?","commit_id":"b7cac8ccaffe7639ae231e92c4d1f844655c52f1"}]}
