)]}'
{
  "log": [
    {
      "commit": "dc16ae57e2e80376584bc65179eedbea88e2df6a",
      "tree": "18084426f3203e15f9f7e4815be0a49a533eaea8",
      "parents": [
        "1905d83fdd20d575c7c180088175fa1f6812ab7c"
      ],
      "author": {
        "name": "David Ostrovsky",
        "email": "david@ostrovsky.org",
        "time": "Mon Aug 03 07:59:40 2026 +0200"
      },
      "committer": {
        "name": "David Ostrovsky",
        "email": "david@ostrovsky.org",
        "time": "Tue Aug 04 08:22:05 2026 +0200"
      },
      "message": "Migrate UI to a PolyGerrit repo-command web component\n\nThe plugin UI still used the GWT-era screen API: the static\nJavaScript called self.onAction(\u0027project\u0027, \u0027parent\u0027, ...) with the\npopup action context. PolyGerrit removed onAction() long ago, so the\nplugin loaded but never showed any UI.\n\nReplace it with a Lit web component in TypeScript, built with the\nsame toolchain as the delete-project plugin: a web/ directory with a\nts_project compiled against the shared plugins tsconfig base, rolled\nup by gerrit_js_bundle into static/reparent-project.js and attached\nto the plugin jar as a resource jar. Because the bundle keeps the\nold file name, HttpModule and its JavaScriptPlugin binding are\nunchanged.\n\nThe component registers at the repo-command endpoint. It renders\nonly when the server-side UiAction is present in config.actions,\nwhich preserves the permission-based visibility of the old popup:\nthe action is exposed only to users passing the plugin\u0027s\ncanReparent() check. The dialog offers the new parent project and an\noptional commit message, and issues the same\nPUT /projects/{name}/reparent~parent request as before.\n\nChange-Id: I7d94e2c8f1b60a5372840df9ce1b7a46e8d05c31\n"
    },
    {
      "commit": "1905d83fdd20d575c7c180088175fa1f6812ab7c",
      "tree": "1ca3a02641e95288190bf5f41f9b42ba09780e27",
      "parents": [
        "7a564517fa86b5496c16d6f38c4918cce4c93e22"
      ],
      "author": {
        "name": "David Ostrovsky",
        "email": "david@ostrovsky.org",
        "time": "Mon Aug 03 07:43:16 2026 +0200"
      },
      "committer": {
        "name": "David Ostrovsky",
        "email": "david@ostrovsky.org",
        "time": "Tue Aug 04 08:22:02 2026 +0200"
      },
      "message": "Add acceptance test coverage\n\nThe plugin had no tests. Add ReparentIT, a\nLightweightPluginDaemonTest with thirteen tests covering the REST\nendpoint, the plugin\u0027s own permission model with non-admin users,\nand the jail/protectorate policy rules from gerrit.config:\n\n* an administrator can reparent a project and the new parent is\n  visible through the projects API;\n* a user without any grant gets 403;\n* a user holding only the reparent-reparentProject plugin\n  capability can reparent any project;\n* a user holding only reparent-reparentOwnProject can reparent a\n  project they own, and gets 403 on a project they do not own;\n* an unknown target parent is rejected with 422;\n* a child of a configured jail cannot be moved away from it, but\n  may move within the jail subtree;\n* a project outside a configured protectorate cannot be moved\n  under it, while a project already inside may move within it;\n* an administrator bypasses both jail and protectorate rules;\n* reparenting All-Projects is rejected by the core endpoint.\n\nThe BUILD file gains a gerrit_plugin_tests rule so the suite runs\nin-tree via bazel test //plugins/reparent:reparent_tests.\n\nTest Plan: bazelisk test //plugins/reparent:reparent_tests\nChange-Id: I2e8d0f61a94c37b528e1f04d7c65a29318f5b7da\n"
    },
    {
      "commit": "7a564517fa86b5496c16d6f38c4918cce4c93e22",
      "tree": "d3c98a9a21310f6339ebce59a19f03c616de93b6",
      "parents": [
        "af5377e6acfb2de37b7d448063b6d531ba592bfd"
      ],
      "author": {
        "name": "David Ostrovsky",
        "email": "david@ostrovsky.org",
        "time": "Mon Aug 03 07:40:42 2026 +0200"
      },
      "committer": {
        "name": "David Ostrovsky",
        "email": "david@ostrovsky.org",
        "time": "Tue Aug 04 08:03:01 2026 +0200"
      },
      "message": "Adapt to current Gerrit plugin API\n\nThe plugin still compiled against APIs that were removed years ago:\nthe ReviewDb entity classes, CapabilityControl, ProjectControl via\nProjectResource.getControl(), and the pre-2.16 location and Input\ntype of the core SetParent REST endpoint.\n\nMigrate to the NoteDb-era equivalents:\n\n* com.google.gerrit.reviewdb.client.Project is now\n  com.google.gerrit.entities.Project; NameKey instances are created\n  via Project.nameKey().\n* Capability and ownership checks go through PermissionBackend:\n  ADMINISTRATE_SERVER for admins, PluginPermission for the two\n  plugin capabilities, and ProjectPermission.WRITE_CONFIG on the\n  project as the modern equivalent of ProjectControl.isOwner().\n* The core endpoint moved to\n  com.google.gerrit.server.restapi.project.SetParent and takes\n  ParentInput from the extensions API; RestModifyView.apply() now\n  returns Response\u003cString\u003e.\n* ProjectCache.get() returns Optional\u003cProjectState\u003e.\n\nThe delegation to the core endpoint with checkIfAdmin\u003dfalse is\nunchanged, as are the jail/protectorate rules from gerrit.config.\n\nChange-Id: I5c1f4b29d8a37e60f14c2db9a5b8e17203f6c4d8\n"
    },
    {
      "commit": "af5377e6acfb2de37b7d448063b6d531ba592bfd",
      "tree": "3a3027e6878d98cb868cecb4c787f4702f7e85ab",
      "parents": [
        "33d62a09a925b80becd62f76751db093438e1390"
      ],
      "author": {
        "name": "Paladox none",
        "email": "thomasmulhall410@yahoo.com",
        "time": "Sat Feb 11 02:05:36 2017 +0000"
      },
      "committer": {
        "name": "Paladox none",
        "email": "thomasmulhall410@yahoo.com",
        "time": "Sat Feb 11 02:06:10 2017 +0000"
      },
      "message": "Remove maven build\n\nChange-Id: I027d7c88b0bf90536220077b38c99fb4b61861c1\n"
    },
    {
      "commit": "33d62a09a925b80becd62f76751db093438e1390",
      "tree": "d3aa517e16460cf27bb728dfcf5c86b55787a4c9",
      "parents": [
        "d71d13b9de587ebe1c5f53f7aac472aa333c467e"
      ],
      "author": {
        "name": "Paladox none",
        "email": "thomasmulhall410@yahoo.com",
        "time": "Sun Feb 05 16:35:01 2017 +0000"
      },
      "committer": {
        "name": "Paladox none",
        "email": "thomasmulhall410@yahoo.com",
        "time": "Sun Feb 05 16:40:31 2017 +0000"
      },
      "message": "Add support for Bazel in Gerrit tree build\n\nChange-Id: I19d4a93b467c000cdfe5acfc8f816a700a967325\n"
    },
    {
      "commit": "d71d13b9de587ebe1c5f53f7aac472aa333c467e",
      "tree": "7cfaa6ba2a5711952f5f85e0d4e4b571771cf19d",
      "parents": [],
      "author": {
        "name": "Edwin Kempin",
        "email": "edwin.kempin@sap.com",
        "time": "Thu Jun 25 13:45:20 2015 +0200"
      },
      "committer": {
        "name": "Edwin Kempin",
        "email": "edwin.kempin@sap.com",
        "time": "Fri Jun 26 08:16:54 2015 +0200"
      },
      "message": "Plugin that provides a self-service for reparenting projects\n\nIn Gerrit core only administrators are allowed to reparent project.\nThis is because inherited access rights (in particular block rules)\ncan be removed by reparenting a project under a different parent.\n\nThis plugin allows users with the \u0027Reparent Project\u0027 capability\n(provided by this plugin) and project owners with the\n\u0027Reparent Own Project\u0027 capability (provided by this plugin) to\nreparent projects, while the Gerrit administrator can control by the\nplugin configuration under which project subtrees reparenting is\nallowed.\n\nChange-Id: I76a020d05189f097cd2ced3a33d31287a672f2e5\nSigned-off-by: Edwin Kempin \u003cedwin.kempin@sap.com\u003e\n"
    }
  ]
}
