)]}'
{
  "commit": "c2c330ba4a92c915f0180457f0d7ee29031bb253",
  "tree": "bb3ec8743022d0c220b0093d0f42c4fb6c384abf",
  "parents": [
    "cc88be34d214418511c13f2284ecdb22245fb650"
  ],
  "author": {
    "name": "Brian Gan",
    "email": "brgan@google.com",
    "time": "Mon Sep 14 14:14:24 2026 +0000"
  },
  "committer": {
    "name": "gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Mon Sep 14 13:27:19 2026 -0700"
  },
  "message": "project: report why refreshing the index failed\n\n\"repo status\" aborts the whole tree when one project fails, without\nsaying why. The three callers that refresh the index stat cache pass -q,\nwhich suppresses git\u0027s diagnosis when it cannot create the index lock;\ngit then exits 128 with both streams empty. A stale lock, a permissions\nproblem on the gitdir and a full disk all reach that same silent exit,\nyet each needs a different remedy.\n\nRoute the three identical call sites through one helper that keeps -q\nfor the refresh itself. When that fails, it repeats the command without\n-q to obtain git\u0027s diagnosis. The command still fails, which is correct,\nbut the user is now told why.\n\nKeeping -q on the common path matters: without it git exits 1 whenever\npaths hold uncommitted changes, which would report a failure to\ntelemetry for every modified project, even if we treat it as benign in\nthe code. The retry accepts that 1, since --unmerged makes git skip\nconflicted paths rather than count them, so nothing else yields it.\n\nThe similar call in subcmds/sync.py is unchanged: it passes different\nflags, without --unmerged, so exit 1 cannot be assumed benign there.\n\nBug: 560289756\nChange-Id: I2e1024c84454f86076081f2d7f155728b1aa35c6\nReviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/630641\nTested-by: Brian Gan \u003cbrgan@google.com\u003e\nReviewed-by: Gavin Mak \u003cgavinmak@google.com\u003e\nCommit-Queue: Brian Gan \u003cbrgan@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "2f72bb02d938e5db33ebb1987d625768137fd089",
      "old_mode": 33188,
      "old_path": "project.py",
      "new_id": "a084d8db8f5688b0851c1bae9bdddfe1dc211401",
      "new_mode": 33188,
      "new_path": "project.py"
    },
    {
      "type": "modify",
      "old_id": "af296c2fb6a2fe10a20bee68572d6f5d975b9262",
      "old_mode": 33188,
      "old_path": "tests/test_project.py",
      "new_id": "911bf72854e0e55f8950c4b72b677cbbf45dde36",
      "new_mode": 33188,
      "new_path": "tests/test_project.py"
    }
  ]
}
