)]}'
{
  "commit": "747d85c18a5237de95ea7f9eccb2367066f40a2e",
  "tree": "63ceed35c8c39f635e2670cdb2a868503eb51cb9",
  "parents": [
    "d984b9c6ce72f3025b5ff5ba6e791b512460de8f"
  ],
  "author": {
    "name": "Dariusz Luksza",
    "email": "dariusz@luksza.org",
    "time": "Wed Sep 10 10:04:02 2014 +0200"
  },
  "committer": {
    "name": "Dariusz Luksza",
    "email": "dariusz@luksza.org",
    "time": "Mon Feb 23 09:53:05 2015 +0100"
  },
  "message": "Make SecureStore an abstract class\n\nThis modification will make the implementation of a site program to\nswitch the secure store easier. The new SwitchSecureStore program will\nbe added by a follow-up change.\n\nIn switch-secure-store we need to migrate all values stored in the old\nSecureStore to new one. Because we don\u0027t store (and also can\u0027t reliably\nfigure out) the value type the only possible way is to first try read\nthe value as String, then when it is null try to get it as List. But\nthis assumption will fail with jgit Config implementation which is used\nin DefaultSecureStore. JGit Config during getString() method call will\ncall getRawStringList() and return its first element. Therefore migration\nwill be incorrect for all stored List values.\n\nThe solution here is to always use getList() and setList() in\nswitch-secure-store and repeat jgit behavior in SecureStore. Making the\nget() method to return getList()[0] and set() to call setList() with\nsingle element.\n\nTo provide default implementations of get() and set() method in\nSecureStore we need to make it as an abstract class. Also those methods\nare marked as final to prevent implementors from overriding them.\n\nAlso changes JarScanner.findImplementationsOf to findSubClassesOf(). This\nmethod was introduced for SecureStore (and it was only used by it), so\nnow when SecureStore becomes abstract class its implementation (and\nname) also should be updated.\n\nChange-Id: Id13bc6ec170c31b43b5a1cd696ba746006e1f0b2\nSigned-off-by: Dariusz Luksza \u003cdariusz@luksza.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "689a55602f4b934f98e67a4caea8688f5d64bf4c",
      "old_mode": 33188,
      "old_path": "gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java",
      "new_id": "c46f8e3f752e808b8cf15667d11a1d4d7b240a47",
      "new_mode": 33188,
      "new_path": "gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java"
    },
    {
      "type": "modify",
      "old_id": "c73a85fc5c2151476631847f7f0348ebae9fb0df",
      "old_mode": 33188,
      "old_path": "gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java",
      "new_id": "720d1082cd4158d12e7c2bd0de79c9160423491c",
      "new_mode": 33188,
      "new_path": "gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java"
    },
    {
      "type": "modify",
      "old_id": "df4ead8f80927d00605c7fcae5867d6ddfd6bc99",
      "old_mode": 33188,
      "old_path": "gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java",
      "new_id": "a8600fe68331278ec6515866e546694f63b522f9",
      "new_mode": 33188,
      "new_path": "gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java"
    },
    {
      "type": "modify",
      "old_id": "130ed0fdcea60de5fbcbc423faa070579e2228b3",
      "old_mode": 33188,
      "old_path": "gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java",
      "new_id": "b852217555681a992006bacd6cbed65fa41da60c",
      "new_mode": 33188,
      "new_path": "gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java"
    },
    {
      "type": "modify",
      "old_id": "b1f07aec7c6ed9ef63e81ce9e2af55d66f6e7c7b",
      "old_mode": 33188,
      "old_path": "gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java",
      "new_id": "f3eeaf6f503cfd71edb5a08ae39687828eccb12e",
      "new_mode": 33188,
      "new_path": "gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java"
    }
  ]
}
