)]}'
{
  "commit": "09914bcab7d1d5570c20a52d1861957145da8a5a",
  "tree": "0f9488ef64d251f5cf356f75913666ccb38e30a0",
  "parents": [
    "3f1775607ffe67548fc5b43a0ce2021002069ee6"
  ],
  "author": {
    "name": "Ram Peri",
    "email": "ramperi@google.com",
    "time": "Fri Aug 07 21:54:45 2026 +0000"
  },
  "committer": {
    "name": "gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Wed Aug 26 10:19:42 2026 -0700"
  },
  "message": "Add detailed upload context to Trace2 telemetry\n\nThis patch intercepts the output during a successful upload\nexecution to capture the generated CL URLs. It logs a dynamically\nconstructed \"repo.uploadstate\" data event to the active trace2\nlog containing:\n- Uploaded CL URLs\n- Target remote name\n- Source branch\n- Modified files\n\nTest:\n1. ./run_tests\n2. pytest tests/test_project.py\n3. Manual verification:\n- Created a dummy branch `test_upload_branch` in a project with local file changes.\n- Invoked repo upload passing an explicit trace output directory:\n  `repo --git-trace2-event-log\u003d/tmp/trace2out upload --dry-run --no-verify art`\n- Verified the injected payload successfully appeared on disk within the generated log:\n  ```json\n  {\"event\":\"data\",...\"key\":\"repo.uploadstate/cls\",\"value\":\"\"}\n  {\"event\":\"data\",...\"key\":\"repo.uploadstate/remote\",\"value\":\"goog\"}\n  {\"event\":\"data\",...\"key\":\"repo.uploadstate/branch\",\"value\":\"test_upload_branch\"}\n  {\"event\":\"data\",...\"key\":\"repo.uploadstate/files\",\"value\":\"dummy_file.txt\"}\n  ```\n  (cls is correctly blank on --dry-run but populates on real HTTP pushes)\n\nBug: 543953499\nChange-Id: I9c402a32d01d156d42cf24eaa2e60e22710b5e6f\nReviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/616581\nReviewed-by: Gavin Mak \u003cgavinmak@google.com\u003e\nTested-by: Ram Peri \u003cramperi@google.com\u003e\nCommit-Queue: Ram Peri \u003cramperi@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "2b0019070275b19494b27e3a22421f39b54fb5ce",
      "old_mode": 33188,
      "old_path": "project.py",
      "new_id": "1c3d8bf21fc861fe640caf1800913555321e5512",
      "new_mode": 33188,
      "new_path": "project.py"
    },
    {
      "type": "modify",
      "old_id": "49d8e2e5fee07e4598197c9f4592e87eff8b6f20",
      "old_mode": 33188,
      "old_path": "subcmds/upload.py",
      "new_id": "56a2066e7621251017d46f0f24319ea0dca84858",
      "new_mode": 33188,
      "new_path": "subcmds/upload.py"
    },
    {
      "type": "modify",
      "old_id": "8c13c4f0eb079b616a1919af2df294fb1ac140d4",
      "old_mode": 33188,
      "old_path": "tests/test_project.py",
      "new_id": "7d77ed8b6ca30f0f63d4acdb3adb7c1fa96bbe89",
      "new_mode": 33188,
      "new_path": "tests/test_project.py"
    }
  ]
}
