)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38083,"name":"Jana Hussien","email":"jhussien@andrew.cmu.edu","username":"jana.hussien"},"change_message_id":"723f4a9d4fb5ff44ef38083a48e663193b1001ac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"56e0275e_7478da14","updated":"2025-08-03 12:34:18.000000000","message":"Status: upstream and first-time file work as expected, currently finalizing propose file and will upload soon.","commit_id":"deb54fb66eaeef670045a314d40687e7fa60a461"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"9cc81c8a136aec37051f2274bd11284854591b62","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"91ed44c9_708a1c31","updated":"2025-10-31 16:28:16.000000000","message":"(rebased from master)","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"aa0ce6d8_12d7af02","updated":"2025-11-01 04:35:29.000000000","message":"Let me comment first except \"weblate_first_time_migration.sh\" file.\n\n@ppiyakk2@printf.kr: Please review the patch. Thank you all,","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"}],"bin/common_translation_update.sh":[{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"function finish {"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    # Skip subunit generation if testr environment is not available"},{"line_number":79,"context_line":"    if [ -f \"$TESTR_VENV/bin/generate-subunit\" ]; then"},{"line_number":80,"context_line":"        if [[ \"$ERROR_ABORT\" -eq 1 ]] ; then"},{"line_number":81,"context_line":"            $TESTR_VENV/bin/generate-subunit $TRANS_START_TIME $SECONDS \\"}],"source_content_type":"text/x-sh","patch_set":4,"id":"ea25964b_fafbe981","line":78,"updated":"2025-11-01 04:35:29.000000000","message":"I don\u0027t know why the original patch submitter skipped subunit generation. What are decision points whether subunit generation should be used or not? Or, is it just for test purposes?","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":338,"context_line":"        if [[ \"${PREV_PATCH_ID}\" !\u003d \"${CUR_PATCH_ID}\" ]]; then"},{"line_number":339,"context_line":"            # Show current status of tree for debugging purpose"},{"line_number":340,"context_line":"            git status"},{"line_number":341,"context_line":"            # DRY RUN: Commented out git review to avoid pushing to Gerrit"},{"line_number":342,"context_line":"            # set +e"},{"line_number":343,"context_line":"            # output\u003d$(git review -t $TOPIC $branch)"},{"line_number":344,"context_line":"            # ret\u003d$?"}],"source_content_type":"text/x-sh","patch_set":4,"id":"73763dee_43a79daa","line":341,"range":{"start_line":341,"start_character":14,"end_line":341,"end_character":74},"updated":"2025-11-01 04:35:29.000000000","message":"I think those part does not need to be directly changed. If test purpose is needed, we might need to consider a flag like IS_TEST/IS_PRODUCTION.","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":734,"context_line":"    done"},{"line_number":735,"context_line":"}"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"# Pull all translations from Weblate for each component in the project."},{"line_number":738,"context_line":"# It downloads all translations for each component as a zip archive, extracts them,"},{"line_number":739,"context_line":"# and then removes new files that are not translated enough."},{"line_number":740,"context_line":"function pull_from_weblate {"}],"source_content_type":"text/x-sh","patch_set":4,"id":"c467c9e7_bde9140b","line":737,"updated":"2025-11-01 04:35:29.000000000","message":"1. How about defining this function additionally, rather than just changing from \"pull_from_zanata\" function?","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":739,"context_line":"# and then removes new files that are not translated enough."},{"line_number":740,"context_line":"function pull_from_weblate {"},{"line_number":741,"context_line":"    local project\u003d$1"},{"line_number":742,"context_line":"    local weblate_url\u003d${WEBLATE_URL:-\"https://openstack.weblate.cloud\"}"},{"line_number":743,"context_line":"    local token_header\u003d\"Authorization: Token $WEBLATE_TOKEN\""},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    # Get all components for the project"},{"line_number":746,"context_line":"    components\u003d$(curl -s -H \"$token_header\" \"$weblate_url/api/projects/$project/components/\" | \\"}],"source_content_type":"text/x-sh","patch_set":4,"id":"a861fb3f_48eeffed","line":743,"range":{"start_line":742,"start_character":0,"end_line":743,"end_character":60},"updated":"2025-11-01 04:35:29.000000000","message":"I think those parts need to be loaded from weblate.ini configuration file.","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":743,"context_line":"    local token_header\u003d\"Authorization: Token $WEBLATE_TOKEN\""},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    # Get all components for the project"},{"line_number":746,"context_line":"    components\u003d$(curl -s -H \"$token_header\" \"$weblate_url/api/projects/$project/components/\" | \\"},{"line_number":747,"context_line":"        python3 -c \"import sys, json; [print(comp[\u0027slug\u0027]) for comp in json.load(sys.stdin).get(\u0027results\u0027, [])]\")"},{"line_number":748,"context_line":""},{"line_number":749,"context_line":"    for component in $components; do"},{"line_number":750,"context_line":"        echo \"Pulling translations for component: $component\""}],"source_content_type":"text/x-sh","patch_set":4,"id":"15c8b118_d8c9f238","line":747,"range":{"start_line":746,"start_character":0,"end_line":747,"end_character":113},"updated":"2025-11-01 04:35:29.000000000","message":"@ppiyakk2@printf.kr - Does Weblate client support similar functionality as \"zanata-cli -B -e pull\"? I want to get confirmation from Weblate migration task lead.","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":798,"context_line":"    done"},{"line_number":799,"context_line":"}"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"# Replace all non [a-zA-Z0-9_-]/ with hyphens for slugs"},{"line_number":802,"context_line":"function clean_slug() {"},{"line_number":803,"context_line":"    echo \"${1//[^a-zA-Z0-9_-]/-}\""},{"line_number":804,"context_line":"}"}],"source_content_type":"text/x-sh","patch_set":4,"id":"47ec0515_8057e74a","line":801,"updated":"2025-11-01 04:35:29.000000000","message":"1. I think spec of slugs [1] need to be described in somewhere (e.g., i18n contributor guide).\n\n2. We might need to double-confirm that we are changing into \"hyphens\".\n\nBy the way, is it okay to use \"clean\" in part of function naming? The purpose might be purposeful conversation for Weblate slug.\n\n[1] https://github.com/WeblateOrg/weblate/issues/362","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":811,"context_line":"    local branch_slug"},{"line_number":812,"context_line":"    branch_slug\u003d$(echo \"$branch_version\" | tr \u0027.\u0027 \u0027-\u0027)"},{"line_number":813,"context_line":"    local module_slug"},{"line_number":814,"context_line":"    module_slug\u003d$(echo \"$module_path\" | sed \u0027s/[\\/\\.]/-/g\u0027)"},{"line_number":815,"context_line":"    local slug\u003d\"$branch_slug/$module_slug/$pot_filename\""},{"line_number":816,"context_line":"    # Replace \"/\" with \"%252F\""},{"line_number":817,"context_line":"    python3 -c \u0027import urllib.parse,sys; print(urllib.parse.quote(urllib.parse.quote(sys.argv[1], safe\u003d\"\"), safe\u003d\"\"))\u0027 \"$slug\""}],"source_content_type":"text/x-sh","patch_set":4,"id":"00b103dd_de682aae","line":814,"updated":"2025-11-01 04:35:29.000000000","message":"Q: Is it same as clean_slug() or different?","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":871,"context_line":"        echo \"$category_url\""},{"line_number":872,"context_line":"        return 0"},{"line_number":873,"context_line":"    else"},{"line_number":874,"context_line":"        cat /tmp/category_response.json \u003e\u00262"},{"line_number":875,"context_line":"        return 1"},{"line_number":876,"context_line":"    fi"},{"line_number":877,"context_line":"}"}],"source_content_type":"text/x-sh","patch_set":4,"id":"dd0e1e3e_19faf408","line":874,"range":{"start_line":874,"start_character":12,"end_line":874,"end_character":39},"updated":"2025-11-01 04:35:29.000000000","message":"The file name needs to be set as script variable.","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"}],"bin/upstream_translation_update.sh":[{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#!/bin/bash"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-sh","patch_set":4,"id":"734bde9d_46130998","line":1,"updated":"2025-11-01 04:35:29.000000000","message":"No need to remove \" -xe\"","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":22,"context_line":"ZANATA_VERSION\u003d${BRANCHNAME//\\//-}"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"SCRIPTSDIR\u003d\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" \u0026\u0026 pwd )\""},{"line_number":25,"context_line":"source \"$SCRIPTSDIR/common_translation_update.sh\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"init_branch $BRANCHNAME"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-sh","patch_set":4,"id":"8817ad38_aceacc33","line":25,"updated":"2025-11-01 04:35:29.000000000","message":"Q: Benefits using double-quotes?","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        module_path\u003d$(dirname \"$pot\")"},{"line_number":118,"context_line":"        branch_slug\u003d$(echo \"$ZANATA_VERSION\" | tr \u0027.\u0027 \u0027-\u0027)"},{"line_number":119,"context_line":"        module_slug\u003d$(echo \"$module_path\" | sed \u0027s/[\\/.]/-/g\u0027)"},{"line_number":120,"context_line":"        component_slug\u003d\"${branch_slug}-${module_slug}-$(echo \"$pot_filename\" | sed \u0027s/[^a-zA-Z0-9_-]/-/g\u0027)\""},{"line_number":121,"context_line":"        upload_pot_to_component \"$PROJECT\" \"$pot_filename\" \"$pot\" \"\" \"$module_path\" \"$ZANATA_VERSION\" \"$component_slug\""},{"line_number":122,"context_line":"    done"},{"line_number":123,"context_line":"done"}],"source_content_type":"text/x-sh","patch_set":4,"id":"b0dba579_dfd178a7","line":120,"range":{"start_line":120,"start_character":84,"end_line":120,"end_character":104},"updated":"2025-11-01 04:35:29.000000000","message":"Can it be leveraged using \"clean_slug()\" defined in common_translation_update.sh?","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"},{"author":{"_account_id":14482,"name":"Ian Y. Choi","email":"ianyrchoi@gmail.com","username":"ianychoi"},"change_message_id":"3e5fdf1cbe1166060ba82aeb24534fe84d2bb184","unresolved":true,"context_lines":[{"line_number":123,"context_line":"done"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Move pot files to translation-source directory"},{"line_number":126,"context_line":"rm -rf translation-source"},{"line_number":127,"context_line":"copy_pot \"$ALL_MODULES\""},{"line_number":128,"context_line":"mv .translation-source translation-source"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-sh","patch_set":4,"id":"fb505533_98a7e971","line":126,"updated":"2025-11-01 04:35:29.000000000","message":"1. This conflicts with L128: moving \".translation-source\" to \"translation-source\".\n2. L125 says that it moves but L126 says it deletes","commit_id":"e4b50b8d5be603c873f0119fb8b4e7f4f82675d0"}]}
