)]}'
{
  "commit": "ccf9ce39b8228403d94007d3a1e9f2b153df7e8c",
  "tree": "cb5ae83936cdcce97bc251447c7942b1032e9ec8",
  "parents": [
    "9066409c2ddc24bbd2405f66e3358d479a17038f"
  ],
  "author": {
    "name": "Victor Pushkarev",
    "email": "corvinus.v@gmail.com",
    "time": "Thu Sep 17 10:47:00 2026 +0300"
  },
  "committer": {
    "name": "gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Sat Sep 26 01:17:45 2026 -0700"
  },
  "message": "sync: keep local sync state paths relative to repo root\n\n`LocalSyncState` uses `Project.relpath` to identify projects, but that\npath is relative to each project\u0027s own manifest. Projects in different\nmanifests can have the same relpath, so their fetch and checkout\ntimestamps overwrite each other. This can make a later partial sync look\nlike a full sync.\n\nPruning has a related problem. It treats the stored paths as relative to\nthe current manifest\u0027s topdir, so when sync starts from the outermost\nmanifest it can look for submanifest projects in the wrong place and\nremove valid state.\n\nUse `Project.RelPath(local\u003dFalse)` to identify projects in local sync\nstate and check stored paths from the repo root when pruning.\n\nAdd tests for same-relpath projects, partial-sync detection, and pruning\nwhen sync starts from either the outermost manifest or a submanifest.\n\nChange-Id: I24485c315f1277a14913443674245cedd20820fe\nReviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/632421\nReviewed-by: Gavin Mak \u003cgavinmak@google.com\u003e\nReviewed-by: Mike Frysinger \u003cvapier@google.com\u003e\nTested-by: Victor Pushkarev \u003ccorvinus.v@gmail.com\u003e\nCommit-Queue: Victor Pushkarev \u003ccorvinus.v@gmail.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "523fac7dfe1c00d2c3f452702f09b71c729096f1",
      "old_mode": 33188,
      "old_path": "subcmds/sync.py",
      "new_id": "32fd7f0a203a5e316e47fe971b6fd02b98d846ae",
      "new_mode": 33188,
      "new_path": "subcmds/sync.py"
    },
    {
      "type": "modify",
      "old_id": "349202d3cc4c92bf64a6d2bf32503e797e4a7387",
      "old_mode": 33188,
      "old_path": "tests/test_subcmds_sync.py",
      "new_id": "7203414aa010e45b1cf36d921e44577df5c5c6d6",
      "new_mode": 33188,
      "new_path": "tests/test_subcmds_sync.py"
    }
  ]
}
