From 5af5748ed72cf7c38827448b9b7bba610e895f31 Mon Sep 17 00:00:00 2001 From: William Chargin Date: Mon, 30 Apr 2018 15:23:37 -0700 Subject: [PATCH] Convert in-memory Git repos to cred graphs (#169) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test Plan: This snapshot test is too unwieldy to actually read—it’s 1000 lines of opaque SHAs and thrice-stringified JSON objects—so it should be interpreted as a regression test only. The programmatic tests should suffice. wchargin-branch: wip-git-create-graph --- package.json | 1 + .../__snapshots__/createGraph.test.js.snap | 1231 +++++++++++++++++ src/plugins/git/createGraph.js | 142 ++ src/plugins/git/createGraph.test.js | 224 +++ src/plugins/git/types.js | 66 + yarn.lock | 4 + 6 files changed, 1668 insertions(+) create mode 100644 src/plugins/git/__snapshots__/createGraph.test.js.snap create mode 100644 src/plugins/git/createGraph.js create mode 100644 src/plugins/git/createGraph.test.js diff --git a/package.json b/package.json index 8adfc07..701544c 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "jest": "20.0.4", "json-stable-stringify": "^1.0.1", "lint-staged": "^6.1.1", + "lodash.clonedeep": "^4.5.0", "lodash.isequal": "^4.5.0", "lodash.sortby": "^4.7.0", "object-assign": "4.1.1", diff --git a/src/plugins/git/__snapshots__/createGraph.test.js.snap b/src/plugins/git/__snapshots__/createGraph.test.js.snap new file mode 100644 index 0000000..7b00eaf --- /dev/null +++ b/src/plugins/git/__snapshots__/createGraph.test.js.snap @@ -0,0 +1,1231 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`createGraph processes a simple repository 1`] = ` +Object { + "edges": Object { + "{\\"id\\":\\"2f7155e359fd0ecb96ffdca66fa45b6ed5792809:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "2f7155e359fd0ecb96ffdca66fa45b6ed5792809:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "2f7155e359fd0ecb96ffdca66fa45b6ed5792809", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"2f7155e359fd0ecb96ffdca66fa45b6ed5792809:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "2f7155e359fd0ecb96ffdca66fa45b6ed5792809:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "2f7155e359fd0ecb96ffdca66fa45b6ed5792809", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:pygravitydefier", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:TODOS.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:TODOS.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:pygravitydefier", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:src\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:src", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"78fc9c83023386854c6bfdc5761c0e58f68e226f:index.py\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "78fc9c83023386854c6bfdc5761c0e58f68e226f:index.py", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "78fc9c83023386854c6bfdc5761c0e58f68e226f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"78fc9c83023386854c6bfdc5761c0e58f68e226f:quantum_gravity.py\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "78fc9c83023386854c6bfdc5761c0e58f68e226f:quantum_gravity.py", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "78fc9c83023386854c6bfdc5761c0e58f68e226f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"7b79d579b62994faba3b69fdf8aa442586c32681:index.py\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "7b79d579b62994faba3b69fdf8aa442586c32681:index.py", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "7b79d579b62994faba3b69fdf8aa442586c32681", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"7b79d579b62994faba3b69fdf8aa442586c32681:quantum_gravity.py\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "7b79d579b62994faba3b69fdf8aa442586c32681:quantum_gravity.py", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "7b79d579b62994faba3b69fdf8aa442586c32681", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:pygravitydefier", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:src\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:src", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:TODOS.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:TODOS.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:pygravitydefier", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:src\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:src", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"2f7155e359fd0ecb96ffdca66fa45b6ed5792809:README.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"0fb31858c8e3710be77e1dbb8880acf8a5543d82\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "0fb31858c8e3710be77e1dbb8880acf8a5543d82", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "2f7155e359fd0ecb96ffdca66fa45b6ed5792809:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"2f7155e359fd0ecb96ffdca66fa45b6ed5792809:science.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"f1f2514ca6d7a6a1a0511957021b1995bf9ace1c\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "f1f2514ca6d7a6a1a0511957021b1995bf9ace1c", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "2f7155e359fd0ecb96ffdca66fa45b6ed5792809:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"3715ddfb8d4c4fd2a6f6af75488c82f84c92ec2f\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"COMMIT\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_TREE\\"}": Object { + "dst": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "3715ddfb8d4c4fd2a6f6af75488c82f84c92ec2f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "COMMIT", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:.gitmodules\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"8c6cac301e763aa6d36466e0a775eb804be2c311\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "8c6cac301e763aa6d36466e0a775eb804be2c311", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:README.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"0fb31858c8e3710be77e1dbb8880acf8a5543d82\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "0fb31858c8e3710be77e1dbb8880acf8a5543d82", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:science.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"f1f2514ca6d7a6a1a0511957021b1995bf9ace1c\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "f1f2514ca6d7a6a1a0511957021b1995bf9ace1c", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"569e1d383759903134df75230d63c0090196d4cb:.gitmodules\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"8c6cac301e763aa6d36466e0a775eb804be2c311\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "8c6cac301e763aa6d36466e0a775eb804be2c311", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"569e1d383759903134df75230d63c0090196d4cb:README.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"0fb31858c8e3710be77e1dbb8880acf8a5543d82\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "0fb31858c8e3710be77e1dbb8880acf8a5543d82", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"569e1d383759903134df75230d63c0090196d4cb:TODOS.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"ddec7477206c30c31b81482e56b877a0b3c2638b\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "ddec7477206c30c31b81482e56b877a0b3c2638b", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:TODOS.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"569e1d383759903134df75230d63c0090196d4cb:science.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"f1f2514ca6d7a6a1a0511957021b1995bf9ace1c\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "f1f2514ca6d7a6a1a0511957021b1995bf9ace1c", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"569e1d383759903134df75230d63c0090196d4cb:src\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"7b79d579b62994faba3b69fdf8aa442586c32681\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "7b79d579b62994faba3b69fdf8aa442586c32681", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb:src", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"69c5aad50eec8f2a0a07c988c3b283a6490eb45b\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"COMMIT\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"bbf3b8b3d26a4f884b5c022d46851f593d329192\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_TREE\\"}": Object { + "dst": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "69c5aad50eec8f2a0a07c988c3b283a6490eb45b", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "COMMIT", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"78fc9c83023386854c6bfdc5761c0e58f68e226f:index.py\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"674b0b476989384510304846248b3acd16206782\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "674b0b476989384510304846248b3acd16206782", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "78fc9c83023386854c6bfdc5761c0e58f68e226f:index.py", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"78fc9c83023386854c6bfdc5761c0e58f68e226f:quantum_gravity.py\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"aea4f28abb23abde151b0ead4063227f8bf6c0b0\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "aea4f28abb23abde151b0ead4063227f8bf6c0b0", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "78fc9c83023386854c6bfdc5761c0e58f68e226f:quantum_gravity.py", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"7b79d579b62994faba3b69fdf8aa442586c32681:index.py\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"674b0b476989384510304846248b3acd16206782\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "674b0b476989384510304846248b3acd16206782", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "7b79d579b62994faba3b69fdf8aa442586c32681:index.py", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"7b79d579b62994faba3b69fdf8aa442586c32681:quantum_gravity.py\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"887ad856bbc1373da146106c86cb581ad78cdafe\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "887ad856bbc1373da146106c86cb581ad78cdafe", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "7b79d579b62994faba3b69fdf8aa442586c32681:quantum_gravity.py", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:.gitmodules\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"8c6cac301e763aa6d36466e0a775eb804be2c311\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "8c6cac301e763aa6d36466e0a775eb804be2c311", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:README.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"0fb31858c8e3710be77e1dbb8880acf8a5543d82\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "0fb31858c8e3710be77e1dbb8880acf8a5543d82", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:science.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"f1f2514ca6d7a6a1a0511957021b1995bf9ace1c\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "f1f2514ca6d7a6a1a0511957021b1995bf9ace1c", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:src\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"78fc9c83023386854c6bfdc5761c0e58f68e226f\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "78fc9c83023386854c6bfdc5761c0e58f68e226f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:src", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:.gitmodules\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"8c6cac301e763aa6d36466e0a775eb804be2c311\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "8c6cac301e763aa6d36466e0a775eb804be2c311", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:README.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"0fb31858c8e3710be77e1dbb8880acf8a5543d82\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "0fb31858c8e3710be77e1dbb8880acf8a5543d82", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:TODOS.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"ddec7477206c30c31b81482e56b877a0b3c2638b\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "ddec7477206c30c31b81482e56b877a0b3c2638b", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:TODOS.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:science.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"f1f2514ca6d7a6a1a0511957021b1995bf9ace1c\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "f1f2514ca6d7a6a1a0511957021b1995bf9ace1c", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:src\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"7b79d579b62994faba3b69fdf8aa442586c32681\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "7b79d579b62994faba3b69fdf8aa442586c32681", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f:src", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"8d287c3bfbf8455ef30187bf5153ffc1b6eef268\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"COMMIT\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_TREE\\"}": Object { + "dst": Object { + "id": "3dfb84795e07341b05fad3a0d5a55f8304b2d7d8", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "8d287c3bfbf8455ef30187bf5153ffc1b6eef268", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "COMMIT", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:.gitmodules\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"8c6cac301e763aa6d36466e0a775eb804be2c311\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "8c6cac301e763aa6d36466e0a775eb804be2c311", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:README.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"0fb31858c8e3710be77e1dbb8880acf8a5543d82\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "0fb31858c8e3710be77e1dbb8880acf8a5543d82", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:TODOS.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"ddec7477206c30c31b81482e56b877a0b3c2638b\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "ddec7477206c30c31b81482e56b877a0b3c2638b", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:TODOS.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:science.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"f1f2514ca6d7a6a1a0511957021b1995bf9ace1c\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "f1f2514ca6d7a6a1a0511957021b1995bf9ace1c", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:src\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"78fc9c83023386854c6bfdc5761c0e58f68e226f\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "78fc9c83023386854c6bfdc5761c0e58f68e226f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:src", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"bdff5d94193170015d6cbb549b7b630649428b1f:README.txt\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE_ENTRY\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"0fb31858c8e3710be77e1dbb8880acf8a5543d82\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"BLOB\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_CONTENTS\\"}": Object { + "dst": Object { + "id": "0fb31858c8e3710be77e1dbb8880acf8a5543d82", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "BLOB", + }, + "payload": Object {}, + "src": Object { + "id": "bdff5d94193170015d6cbb549b7b630649428b1f:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"c08ee3a4edea384d5291ffcbf06724a13ed72325\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"COMMIT\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"2f7155e359fd0ecb96ffdca66fa45b6ed5792809\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_TREE\\"}": Object { + "dst": Object { + "id": "2f7155e359fd0ecb96ffdca66fa45b6ed5792809", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "c08ee3a4edea384d5291ffcbf06724a13ed72325", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "COMMIT", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"c2b51945e7457546912a8ce158ed9d294558d294\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"COMMIT\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"bdff5d94193170015d6cbb549b7b630649428b1f\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_TREE\\"}": Object { + "dst": Object { + "id": "bdff5d94193170015d6cbb549b7b630649428b1f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "c2b51945e7457546912a8ce158ed9d294558d294", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "COMMIT", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"d160cca97611e9dfed642522ad44408d0292e8ea\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"COMMIT\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"569e1d383759903134df75230d63c0090196d4cb\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_TREE\\"}": Object { + "dst": Object { + "id": "569e1d383759903134df75230d63c0090196d4cb", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "d160cca97611e9dfed642522ad44408d0292e8ea", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "COMMIT", + }, + }, + "{\\"id\\":\\"[{\\\\\\"id\\\\\\":\\\\\\"e8b7a8f19701cd5a25e4a097d513ead60e5f8bcc\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"COMMIT\\\\\\"},{\\\\\\"id\\\\\\":\\\\\\"819fc546cea489476ce8dc90785e9ba7753d0a8f\\\\\\",\\\\\\"pluginName\\\\\\":\\\\\\"sourcecred/git-beta\\\\\\",\\\\\\"repositoryName\\\\\\":\\\\\\"sourcecred/example-git\\\\\\",\\\\\\"type\\\\\\":\\\\\\"TREE\\\\\\"}]\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"HAS_TREE\\"}": Object { + "dst": Object { + "id": "819fc546cea489476ce8dc90785e9ba7753d0a8f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + "payload": Object {}, + "src": Object { + "id": "e8b7a8f19701cd5a25e4a097d513ead60e5f8bcc", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "COMMIT", + }, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:.gitmodules", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:TODOS.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:TODOS.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:pygravitydefier", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:science.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:src\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192:src", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "bbf3b8b3d26a4f884b5c022d46851f593d329192", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + "{\\"id\\":\\"bdff5d94193170015d6cbb549b7b630649428b1f:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"INCLUDES\\"}": Object { + "dst": Object { + "id": "bdff5d94193170015d6cbb549b7b630649428b1f:README.txt", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE_ENTRY", + }, + "payload": Object {}, + "src": Object { + "id": "bdff5d94193170015d6cbb549b7b630649428b1f", + "pluginName": "sourcecred/git-beta", + "repositoryName": "sourcecred/example-git", + "type": "TREE", + }, + }, + }, + "nodes": Object { + "{\\"id\\":\\"0fb31858c8e3710be77e1dbb8880acf8a5543d82\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"BLOB\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"2f7155e359fd0ecb96ffdca66fa45b6ed5792809\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"2f7155e359fd0ecb96ffdca66fa45b6ed5792809:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"2f7155e359fd0ecb96ffdca66fa45b6ed5792809:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"3715ddfb8d4c4fd2a6f6af75488c82f84c92ec2f\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"COMMIT\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"3dfb84795e07341b05fad3a0d5a55f8304b2d7d8:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:TODOS.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"569e1d383759903134df75230d63c0090196d4cb:src\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"674b0b476989384510304846248b3acd16206782\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"BLOB\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"69c5aad50eec8f2a0a07c988c3b283a6490eb45b\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"COMMIT\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"78fc9c83023386854c6bfdc5761c0e58f68e226f\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"78fc9c83023386854c6bfdc5761c0e58f68e226f:index.py\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"78fc9c83023386854c6bfdc5761c0e58f68e226f:quantum_gravity.py\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7b79d579b62994faba3b69fdf8aa442586c32681\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7b79d579b62994faba3b69fdf8aa442586c32681:index.py\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7b79d579b62994faba3b69fdf8aa442586c32681:quantum_gravity.py\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"7be3ecfee5314ffa9b2d93fc4377792b2d6d70ed:src\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:TODOS.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"819fc546cea489476ce8dc90785e9ba7753d0a8f:src\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"887ad856bbc1373da146106c86cb581ad78cdafe\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"BLOB\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"8c6cac301e763aa6d36466e0a775eb804be2c311\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"BLOB\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"8d287c3bfbf8455ef30187bf5153ffc1b6eef268\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"COMMIT\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"aea4f28abb23abde151b0ead4063227f8bf6c0b0\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"BLOB\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:.gitmodules\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:TODOS.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:pygravitydefier\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:science.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bbf3b8b3d26a4f884b5c022d46851f593d329192:src\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bdff5d94193170015d6cbb549b7b630649428b1f\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"bdff5d94193170015d6cbb549b7b630649428b1f:README.txt\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"TREE_ENTRY\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"c08ee3a4edea384d5291ffcbf06724a13ed72325\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"COMMIT\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"c2b51945e7457546912a8ce158ed9d294558d294\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"COMMIT\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"d160cca97611e9dfed642522ad44408d0292e8ea\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"COMMIT\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"ddec7477206c30c31b81482e56b877a0b3c2638b\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"BLOB\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"e8b7a8f19701cd5a25e4a097d513ead60e5f8bcc\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"COMMIT\\"}": Object { + "payload": Object {}, + }, + "{\\"id\\":\\"f1f2514ca6d7a6a1a0511957021b1995bf9ace1c\\",\\"pluginName\\":\\"sourcecred/git-beta\\",\\"repositoryName\\":\\"sourcecred/example-git\\",\\"type\\":\\"BLOB\\"}": Object { + "payload": Object {}, + }, + }, +} +`; diff --git a/src/plugins/git/createGraph.js b/src/plugins/git/createGraph.js new file mode 100644 index 0000000..2fab270 --- /dev/null +++ b/src/plugins/git/createGraph.js @@ -0,0 +1,142 @@ +// @flow + +import type {Address} from "../../core/address"; +import type { + Repository, + Commit, + Tree, + NodePayload, + EdgePayload, + NodeType, + EdgeType, +} from "./types"; +import {Graph, edgeID} from "../../core/graph"; +import { + BLOB_NODE_TYPE, + COMMIT_NODE_TYPE, + TREE_NODE_TYPE, + TREE_ENTRY_NODE_TYPE, + INCLUDES_EDGE_TYPE, + HAS_CONTENTS_EDGE_TYPE, + HAS_TREE_EDGE_TYPE, + GIT_PLUGIN_NAME, + includesEdgeId, + treeEntryId, +} from "./types"; + +class GitGraphCreator { + repositoryName: string; + + constructor(repositoryName) { + this.repositoryName = repositoryName; + } + + makeAddress(type: NodeType | EdgeType, id: string): Address { + return { + pluginName: GIT_PLUGIN_NAME, + repositoryName: this.repositoryName, + type, + id, + }; + } + + createGraph(repository: Repository): Graph { + const graphs = [ + ...Object.keys(repository.commits).map((hash) => + this.commitGraph(repository.commits[hash]) + ), + ...Object.keys(repository.trees).map((hash) => + this.treeGraph(repository.trees[hash]) + ), + ]; + return graphs.reduce((g, h) => Graph.mergeConservative(g, h), new Graph()); + } + + commitGraph(commit: Commit) { + const commitNode = { + address: this.makeAddress(COMMIT_NODE_TYPE, commit.hash), + payload: {}, + }; + const treeNode = { + address: this.makeAddress(TREE_NODE_TYPE, commit.treeHash), + payload: {}, + }; + const edge = { + address: this.makeAddress( + HAS_TREE_EDGE_TYPE, + edgeID(commitNode.address, treeNode.address) + ), + src: commitNode.address, + dst: treeNode.address, + payload: {}, + }; + return new Graph() + .addNode(commitNode) + .addNode(treeNode) + .addEdge(edge); + } + + treeGraph(tree: Tree) { + const treeNode = { + address: this.makeAddress(TREE_NODE_TYPE, tree.hash), + payload: {}, + }; + const result = new Graph().addNode(treeNode); + Object.keys(tree.entries).forEach((name) => { + const entry = tree.entries[name]; + const entryNode = { + address: this.makeAddress( + TREE_ENTRY_NODE_TYPE, + treeEntryId(tree.hash, entry.name) + ), + payload: {}, + }; + const entryEdge = { + address: this.makeAddress( + INCLUDES_EDGE_TYPE, + includesEdgeId(tree.hash, entry.name) + ), + src: treeNode.address, + dst: entryNode.address, + payload: {}, + }; + result.addNode(entryNode).addEdge(entryEdge); + if (entry.type === "commit") { + // We don't represent subproject commits in the graph. + } else { + let contentsNodeType; + if (entry.type === "tree") { + contentsNodeType = TREE_NODE_TYPE; + } else if (entry.type === "blob") { + contentsNodeType = BLOB_NODE_TYPE; + } else { + // eslint-disable-next-line no-unused-expressions + (entry.type: empty); + throw new Error(`Unknown entry type: ${entry.type}`); + } + const contentsNode = { + address: this.makeAddress(contentsNodeType, entry.hash), + payload: {}, + }; + const contentsEdge = { + address: this.makeAddress( + HAS_CONTENTS_EDGE_TYPE, + edgeID(entryNode.address, contentsNode.address) + ), + src: entryNode.address, + dst: contentsNode.address, + payload: {}, + }; + result.addNode(contentsNode).addEdge(contentsEdge); + } + }); + return result; + } +} + +export function createGraph( + repository: Repository, + repositoryName: string +): Graph { + return new GitGraphCreator(repositoryName).createGraph(repository); +} diff --git a/src/plugins/git/createGraph.test.js b/src/plugins/git/createGraph.test.js new file mode 100644 index 0000000..a166819 --- /dev/null +++ b/src/plugins/git/createGraph.test.js @@ -0,0 +1,224 @@ +// @flow + +import cloneDeep from "lodash.clonedeep"; + +import {createGraph} from "./createGraph"; +import { + BLOB_NODE_TYPE, + COMMIT_NODE_TYPE, + GIT_PLUGIN_NAME, + HAS_CONTENTS_EDGE_TYPE, + HAS_TREE_EDGE_TYPE, + INCLUDES_EDGE_TYPE, + TREE_ENTRY_NODE_TYPE, + TREE_NODE_TYPE, + treeEntryId, +} from "./types"; + +const makeData = () => cloneDeep(require("./demoData/example-git")); + +describe("createGraph", () => { + it("processes a simple repository", () => { + expect(createGraph(makeData(), "sourcecred/example-git")).toMatchSnapshot(); + }); + + it("has no dangling edges", () => { + const graph = createGraph(makeData(), "sourcecred/example-git"); + graph.edges().forEach((edge) => { + expect(graph.node(edge.src)).toEqual(expect.anything()); + expect(graph.node(edge.dst)).toEqual(expect.anything()); + }); + }); + + it("has all commits, each with correct edges", () => { + const data = makeData(); + const graph = createGraph(data, "sourcecred/example-git"); + Object.keys(data.commits).forEach((hash) => { + const address = { + pluginName: GIT_PLUGIN_NAME, + repositoryName: "sourcecred/example-git", + type: COMMIT_NODE_TYPE, + id: hash, + }; + expect(graph.node(address)).toEqual({address, payload: {}}); + expect(graph.neighborhood(address)).toHaveLength(1); + expect( + graph.neighborhood(address, { + nodeType: TREE_NODE_TYPE, + edgeType: HAS_TREE_EDGE_TYPE, + }) + ).toHaveLength(1); + }); + }); + + it("has all trees, each with correct edges", () => { + const data = makeData(); + const graph = createGraph(data, "sourcecred/example-git"); + Object.keys(data.trees).forEach((hash) => { + const address = { + pluginName: GIT_PLUGIN_NAME, + repositoryName: "sourcecred/example-git", + type: TREE_NODE_TYPE, + id: hash, + }; + + const entryChildren = graph.outEdges(address, { + nodeType: TREE_ENTRY_NODE_TYPE, + edgeType: INCLUDES_EDGE_TYPE, + }); + expect(entryChildren).toHaveLength( + Object.keys(data.trees[hash].entries).length + ); + expect(graph.outEdges(address)).toHaveLength(entryChildren.length); + + expect(graph.node(address)).toEqual({address, payload: {}}); + const owningCommits = graph.inEdges(address, { + nodeType: COMMIT_NODE_TYPE, + edgeType: HAS_TREE_EDGE_TYPE, + }); + expect(owningCommits.length).toBeLessThanOrEqual(1); + const parentTreeEntries = graph.inEdges(address, { + nodeType: TREE_ENTRY_NODE_TYPE, + edgeType: HAS_CONTENTS_EDGE_TYPE, + }); + expect(graph.inEdges(address)).toHaveLength( + owningCommits.length + parentTreeEntries.length + ); + }); + }); + + it("has all tree entries, each with correct edges", () => { + const data = makeData(); + const graph = createGraph(data, "sourcecred/example-git"); + Object.keys(data.trees).forEach((hash) => { + const tree = data.trees[hash]; + const treeAddress = { + pluginName: GIT_PLUGIN_NAME, + repositoryName: "sourcecred/example-git", + type: TREE_NODE_TYPE, + id: hash, + }; + expect(graph.node(treeAddress)).toEqual({ + address: treeAddress, + payload: {}, + }); + Object.keys(tree.entries).forEach((name) => { + const entryAddress = { + pluginName: GIT_PLUGIN_NAME, + repositoryName: "sourcecred/example-git", + type: TREE_ENTRY_NODE_TYPE, + id: treeEntryId(hash, name), + }; + expect( + graph.inEdges(entryAddress, { + nodeType: TREE_NODE_TYPE, + edgeType: INCLUDES_EDGE_TYPE, + }) + ).toHaveLength(1); + const shouldHaveContents = tree.entries[name].type !== "commit"; + expect( + graph.outEdges(entryAddress, {edgeType: HAS_CONTENTS_EDGE_TYPE}) + ).toHaveLength(shouldHaveContents ? 1 : 0); + expect(graph.neighborhood(entryAddress)).toHaveLength( + shouldHaveContents ? 2 : 1 + ); + }); + }); + }); + + describe("has specific paths:", () => { + const headCommitHash = "3715ddfb8d4c4fd2a6f6af75488c82f84c92ec2f"; + if (makeData().commits[headCommitHash] == null) { + throw new Error("Commit hash out of date."); + } + + function uniqueNeighborMatching( + graph, + nodeAddress, + filter?, + predicate = (_) => true + ) { + const edges = graph + .neighborhood(nodeAddress, filter) + .filter((x) => predicate(x)); + expect(edges).toHaveLength(1); + return edges[0].neighborAddress; + } + + function uniqueTree(graph, commitAddress) { + return uniqueNeighborMatching(graph, commitAddress, { + nodeType: TREE_NODE_TYPE, + edgeType: HAS_TREE_EDGE_TYPE, + }); + } + + function uniqueEntry(graph, treeAddress, entryName: string) { + return uniqueNeighborMatching( + graph, + treeAddress, + { + nodeType: TREE_ENTRY_NODE_TYPE, + edgeType: INCLUDES_EDGE_TYPE, + }, + ({edge}) => edge.address.id.endsWith(`:${entryName}`) + ); + } + + function uniqueContents(graph, treeEntryNodeAddress) { + return uniqueNeighborMatching(graph, treeEntryNodeAddress, { + edgeType: HAS_CONTENTS_EDGE_TYPE, + }); + } + + test("HEAD^{tree}:src/quantum_gravity.py with correct contents", () => { + const data = makeData(); + const graph = createGraph(data, "sourcecred/example-git"); + + const headCommitAddress = { + pluginName: GIT_PLUGIN_NAME, + repositoryName: "sourcecred/example-git", + type: COMMIT_NODE_TYPE, + id: headCommitHash, + }; + const headTreeAddress = uniqueTree(graph, headCommitAddress); + const srcTreeEntryAddress = uniqueEntry(graph, headTreeAddress, "src"); + const srcTreeAddress = uniqueContents(graph, srcTreeEntryAddress); + const blobEntryAddress = uniqueEntry( + graph, + srcTreeAddress, + "quantum_gravity.py" + ); + const blobAddress = uniqueContents(graph, blobEntryAddress); + expect(graph.node(blobAddress)).toEqual( + expect.objectContaining({ + address: expect.objectContaining({ + type: BLOB_NODE_TYPE, + id: "aea4f28abb23abde151b0ead4063227f8bf6c0b0", + }), + }) + ); + }); + + test("HEAD^{tree}:pygravitydefier with no contents", () => { + const data = makeData(); + const graph = createGraph(data, "sourcecred/example-git"); + + const headCommitAddress = { + pluginName: GIT_PLUGIN_NAME, + repositoryName: "sourcecred/example-git", + type: COMMIT_NODE_TYPE, + id: headCommitHash, + }; + const headTreeAddress = uniqueTree(graph, headCommitAddress); + const treeEntryAddress = uniqueEntry( + graph, + headTreeAddress, + "pygravitydefier" + ); + expect(graph.node(treeEntryAddress)).toEqual(expect.anything()); + // Submodule commits never have contents, because the commit nodes + // are from an unknown repository. + expect(graph.outEdges(treeEntryAddress)).toHaveLength(0); + }); + }); +}); diff --git a/src/plugins/git/types.js b/src/plugins/git/types.js index d7727cc..3e87e90 100644 --- a/src/plugins/git/types.js +++ b/src/plugins/git/types.js @@ -1,5 +1,8 @@ // @flow +export const GIT_PLUGIN_NAME = "sourcecred/git-beta"; + +// Logical types export type Repository = {| +commits: {[Hash]: Commit}, +trees: {[Hash]: Tree}, @@ -18,3 +21,66 @@ export type TreeEntry = {| +name: string, +hash: Hash, |}; + +// Graph types + +// Nodes +export const COMMIT_NODE_TYPE: "COMMIT" = "COMMIT"; +export type CommitNodePayload = {||}; + +export const TREE_NODE_TYPE: "TREE" = "TREE"; +export type TreeNodePayload = {||}; + +export const BLOB_NODE_TYPE: "BLOB" = "BLOB"; +export type BlobNodePayload = {||}; // we do not store the content + +export const TREE_ENTRY_NODE_TYPE: "TREE_ENTRY" = "TREE_ENTRY"; +export type TreeEntryNodePayload = {||}; +export function treeEntryId(treeSha: string, name: string): string { + return `${treeSha}:${name}`; +} + +export type NodePayload = + | CommitNodePayload + | TreeNodePayload + | TreeEntryNodePayload + | HasContentsEdgePayload; + +export type NodeType = + | typeof COMMIT_NODE_TYPE + | typeof TREE_NODE_TYPE + | typeof TREE_ENTRY_NODE_TYPE + | typeof BLOB_NODE_TYPE; + +// Edges + +// CommitNode -> TreeNode +export const HAS_TREE_EDGE_TYPE: "HAS_TREE" = "HAS_TREE"; +export type HasTreeEdgePayload = {||}; + +// TreeNode -> TreeEntryNode +export const INCLUDES_EDGE_TYPE: "INCLUDES" = "INCLUDES"; +export type IncludesEdgePayload = {||}; +export function includesEdgeId(treeSha: string, name: string): string { + return `${treeSha}:${name}`; +} + +// TreeEntryNode -> TreeEntryNode +export const BECOMES_EDGE_TYPE: "BECOMES" = "BECOMES"; +export type BecomesEdgePayload = {||}; + +// TreeEntryNode -> BlobNode | TreeNode +export const HAS_CONTENTS_EDGE_TYPE: "HAS_CONTENTS" = "HAS_CONTENTS"; +export type HasContentsEdgePayload = {||}; + +export type EdgeType = + | typeof HAS_TREE_EDGE_TYPE + | typeof INCLUDES_EDGE_TYPE + | typeof BECOMES_EDGE_TYPE + | typeof HAS_CONTENTS_EDGE_TYPE; + +export type EdgePayload = + | HasTreeEdgePayload + | IncludesEdgePayload + | BecomesEdgePayload + | HasContentsEdgePayload; diff --git a/yarn.lock b/yarn.lock index 6bae075..88e5a8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4282,6 +4282,10 @@ lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5"