{"action":"created","comment":{"url":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/comments/122892214","pull_request_review_id":45044496,"id":122892214,"diff_hunk":"@@ -0,0 +1,199 @@\n+﻿using UnityEngine;\n+using System.Collections.Generic;\n+using System.Linq;\n+using FullInspector.Internal;\n+using UnityEngine.SceneManagement;\n+\n+namespace FullInspector.StoragesManager {\n+\n+    public class fiStoragesManager<T>\n+        where T : MonoBehaviour {\n+        private readonly Dictionary<Scene, T> _Storages = new Dictionary<Scene, T>();\n+        private readonly string SceneStorageName;\n+        private readonly string PrefabStoragePath;\n+\n+        private bool _didInitialRefresh;\n+\n+        private List<Scene> _lastSeenScenes = new List<Scene>();\n+\n+\n+        public fiStoragesManager(string sceneStorageName, string prefabStoragePath) {\n+            SceneStorageName = sceneStorageName;\n+            PrefabStoragePath = prefabStoragePath;\n+        }\n+\n+        private T _prefabStorage;\n+        public T PrefabStorage {\n+            get {\n+                if (_prefabStorage == null) {\n+                    GameObject prefabGameObject = null;\n+\n+                    // Try finding the current prefab\n+                    prefabGameObject = fiLateBindings.AssetDatabase.LoadAssetAtPath(PrefabStoragePath, typeof(GameObject)) as GameObject;\n+\n+                    // Failed to find it; create a new one\n+                    if (prefabGameObject == null) {\n+                        var cloned = new GameObject();\n+                        prefabGameObject = fiLateBindings.PrefabUtility.CreatePrefab(PrefabStoragePath, cloned);\n+                        fiUtility.DestroyObject(cloned);\n+\n+                        prefabGameObject.AddComponent<T>();\n+\n+                        Debug.Log(\"Created new backup persistent storage object at \" + PrefabStorage +\n+                                  \"; this should only happen once. Please report a bug if it keeps on \" +\n+                                  \"occurring.\", prefabGameObject);\n+                    }\n+\n+                    _prefabStorage = prefabGameObject.GetComponent<T>();\n+\n+                    if (_prefabStorage == null) {\n+                        _prefabStorage = prefabGameObject.AddComponent<T>();\n+                    }\n+                }\n+\n+                return _prefabStorage;\n+            }\n+        }\n+\n+\n+        public IEnumerable<T> GetAllSceneStorages() {\n+            RefreshStorages();\n+            return _Storages.Select(t => t.Value);\n+        }\n+\n+\n+        public T GetStorage(Scene scene) {\n+            RefreshStorages();\n+            T storage;\n+            if (_Storages.TryGetValue(scene, out storage)) {\n+                return storage;\n+            }\n+\n+            return _prefabStorage;\n+        }\n+\n+        public T GetStorage(Object o) {\n+            RefreshStorages();\n+\n+            Scene scene;\n+            var c = o as Component;\n+            if (c != null) {\n+                scene = c.gameObject.scene;\n+            } else {\n+                var g = o as GameObject;\n+                if (g != null) {\n+                    scene = g.scene;\n+                } else {\n+                    return PrefabStorage;\n+                }\n+            }\n+\n+            //latodo this should be on the PR as well (the DontDestroyOnLoad check)\n+            if (!scene.IsValid() || !scene.isLoaded || scene.name == \"DontDestroyOnLoad\") {\n+                return PrefabStorage;\n+            }\n+\n+            return _Storages[scene];\n+        }\n+\n+\n+        /// <summary>\n+        /// This will ensure that <see cref=\"_Storages\"/> always has fresh\n+        /// references for each storage in the loaded scenes.\n+        /// </summary>\n+        /// <param name=\"forced\"></param>\n+        private void RefreshStorages(bool forced = false) {\n+            //always refresh at least once\n+            if (_didInitialRefresh && !UpdateLastSeenScenes()) {\n+                // ReSharper disable once ConditionIsAlwaysTrueOrFalse\n+                var hasNullStorages = _Storages.Any(s => s.Value == null || s.Value.gameObject == null);\n+                var mustRefresh = false;\n+                if (!hasNullStorages) {\n+                    if (_Storages.Count == 0) {\n+                        mustRefresh = true;\n+                    } else {\n+                        for (var i = 0; i < SceneManager.sceneCount; i++) {\n+                            var scene = SceneManager.GetSceneAt(i);\n+                            if (scene.isLoaded) {\n+                                if (_Storages.ContainsKey(scene)) {\n+                                    continue;\n+                                }\n+\n+                                //we'll have to refresh if we stored keys for scenes that were unloaded\n+                            } else if (!_Storages.ContainsKey(scene)) {\n+                                continue;\n+                            }\n+\n+                            mustRefresh = true;\n+                            break;\n+                        }\n+                    }\n+                }\n+\n+                if (!forced && !mustRefresh && !hasNullStorages) {\n+                    return;\n+                }\n+            }\n+\n+            _didInitialRefresh = true;\n+\n+            //get fresh references for all storages that already exist in the currently loaded scenes\n+            _Storages.Clear();\n+            foreach (var found in Object.FindObjectsOfType<T>()) {\n+                var scene = found.gameObject.scene;\n+                if (!_Storages.Keys.Contains(scene)) {\n+                    _Storages[scene] = found;\n+                } else {\n+                    //Debug.LogWarning(\"scene \" + scene.name + \" already has a storage, but found another. Destroying...\");\n+                    Object.DestroyImmediate(found.gameObject);\n+                    if (!fiLateBindings.EditorApplication.isPlaying) {\n+                        fiLateBindings.SceneManagement.EditorSceneManager.MarkSceneDirty(scene);\n+                    }\n+                }\n+            }\n+\n+            for (var i = 0; i < SceneManager.sceneCount; i++) {\n+                var scene = SceneManager.GetSceneAt(i);","path":"Assets/FullInspector2/Modules/StoragesManager/fiStoragesManager.cs","position":156,"original_position":156,"commit_id":"e45909395942505f02d0e2e9f83c98a8b052a0f0","original_commit_id":"e45909395942505f02d0e2e9f83c98a8b052a0f0","user":{"login":"jacobdufault","id":356714,"avatar_url":"https://avatars0.githubusercontent.com/u/356714?v=3","gravatar_id":"","url":"https://api.github.com/users/jacobdufault","html_url":"https://github.com/jacobdufault","followers_url":"https://api.github.com/users/jacobdufault/followers","following_url":"https://api.github.com/users/jacobdufault/following{/other_user}","gists_url":"https://api.github.com/users/jacobdufault/gists{/gist_id}","starred_url":"https://api.github.com/users/jacobdufault/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacobdufault/subscriptions","organizations_url":"https://api.github.com/users/jacobdufault/orgs","repos_url":"https://api.github.com/users/jacobdufault/repos","events_url":"https://api.github.com/users/jacobdufault/events{/privacy}","received_events_url":"https://api.github.com/users/jacobdufault/received_events","type":"User","site_admin":false},"body":"FYI: var should only be used when the type is obvious (ie, already in the line) - otherwise it decreases readability.","created_at":"2017-06-20T06:46:36Z","updated_at":"2017-06-20T06:48:10Z","html_url":"https://github.com/jacobdufault/fullinspector/pull/201#discussion_r122892214","pull_request_url":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/201","_links":{"self":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/comments/122892214"},"html":{"href":"https://github.com/jacobdufault/fullinspector/pull/201#discussion_r122892214"},"pull_request":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/201"}}},"pull_request":{"url":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/201","id":112478452,"html_url":"https://github.com/jacobdufault/fullinspector/pull/201","diff_url":"https://github.com/jacobdufault/fullinspector/pull/201.diff","patch_url":"https://github.com/jacobdufault/fullinspector/pull/201.patch","issue_url":"https://api.github.com/repos/jacobdufault/fullinspector/issues/201","number":201,"state":"open","locked":false,"title":"Multi-scene support for storage systems","user":{"login":"SugoiDev","id":7355630,"avatar_url":"https://avatars3.githubusercontent.com/u/7355630?v=3","gravatar_id":"","url":"https://api.github.com/users/SugoiDev","html_url":"https://github.com/SugoiDev","followers_url":"https://api.github.com/users/SugoiDev/followers","following_url":"https://api.github.com/users/SugoiDev/following{/other_user}","gists_url":"https://api.github.com/users/SugoiDev/gists{/gist_id}","starred_url":"https://api.github.com/users/SugoiDev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SugoiDev/subscriptions","organizations_url":"https://api.github.com/users/SugoiDev/orgs","repos_url":"https://api.github.com/users/SugoiDev/repos","events_url":"https://api.github.com/users/SugoiDev/events{/privacy}","received_events_url":"https://api.github.com/users/SugoiDev/received_events","type":"User","site_admin":false},"body":"This is a initial working version of a multi-scene storage system.\r\nFI's backup and storage systems are broken with multi-scene. This PR brings initial support for multi-scene setups.\r\n\r\nI would appreciate some code review and ideas for dealing with Unity's cross-scene weirdness, if anyone has know-how in that area.\r\n\r\nWarning\r\n---\r\n\r\n* This pull-request is not considered ready, and should not be merged to master. The underlying systems seem to be working under my limited testing, but it could have edge cases that aren't account for. There's also rough spots (see below) with Unity's cross-scene references.\r\n\r\n* Those changes are probably **not** compatible with older Unity versions. I only tested on Unity 5.5.2.\r\n\r\n\r\nOverview of changes\r\n---\r\n\r\n* abstracted the ideas for storages that were used only for the backups system into a new abstract type `fiBaseStorageComponent<T>`. This object has methods to refresh the storage references, as well as create new ones if they become stale or corrupted. It does not perform cleanup based on name.\r\n\r\n* `fiStorageManager` in the `BackupService` has a member of that type, as well as `fiPersistentEditorStorage`.\r\n\r\n* for `fiPersistentEditorStorage`, create a `fiPersistentEditorStorageComponent` that is just a MonoBehavior shell so we can use `FindObjectsOfType`.\r\n\r\nMost other changes are just related to API change (like using instance IDs in certain places, since the actual references would be dead when exiting playmode or changing serialization type). Also adding a null-guard for the only usage of Read<T> method, that can now return a default(T).\r\n\r\nWhat isn't good yet\r\n---\r\n\r\n**Note**: Unity will show warnings when we move a FI object from a scene to another. This is because we're storing a reference to the object in the scene storage(s), and Unity forbids cross-scene references (will show a \"scene mismatch\" message on the object's field, as well as warnings in the console).\r\n\r\n* I managed to get the references from the `fiBackupSceneStorage` properly (Unity will still show warnings), but I found no way to migrate the references stored in the `fiPersistentEditorStorage`.\r\n\r\n* This is a potential problem-case that I didn't test: In playmode, the user can load scenes in-game, then backup a object in the newly loaded scene. When exiting playmode, we would not be able to migrate that object's backups. I imagine that, with the current way the `fiStorageManager.MigrateStorage()` is called, the migration would occur the next time the scene is loaded. Again, I did not test this.\r\n","created_at":"2017-03-24T15:16:30Z","updated_at":"2017-06-20T06:48:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c057ee4b3eb0616008223a5f9fb9117e75c1c110","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/201/commits","review_comments_url":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/201/comments","review_comment_url":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jacobdufault/fullinspector/issues/201/comments","statuses_url":"https://api.github.com/repos/jacobdufault/fullinspector/statuses/e45909395942505f02d0e2e9f83c98a8b052a0f0","head":{"label":"SugoiDev:multi-scene-support","ref":"multi-scene-support","sha":"e45909395942505f02d0e2e9f83c98a8b052a0f0","user":{"login":"SugoiDev","id":7355630,"avatar_url":"https://avatars3.githubusercontent.com/u/7355630?v=3","gravatar_id":"","url":"https://api.github.com/users/SugoiDev","html_url":"https://github.com/SugoiDev","followers_url":"https://api.github.com/users/SugoiDev/followers","following_url":"https://api.github.com/users/SugoiDev/following{/other_user}","gists_url":"https://api.github.com/users/SugoiDev/gists{/gist_id}","starred_url":"https://api.github.com/users/SugoiDev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SugoiDev/subscriptions","organizations_url":"https://api.github.com/users/SugoiDev/orgs","repos_url":"https://api.github.com/users/SugoiDev/repos","events_url":"https://api.github.com/users/SugoiDev/events{/privacy}","received_events_url":"https://api.github.com/users/SugoiDev/received_events","type":"User","site_admin":false},"repo":{"id":72537995,"name":"fullinspector","full_name":"SugoiDev/fullinspector","owner":{"login":"SugoiDev","id":7355630,"avatar_url":"https://avatars3.githubusercontent.com/u/7355630?v=3","gravatar_id":"","url":"https://api.github.com/users/SugoiDev","html_url":"https://github.com/SugoiDev","followers_url":"https://api.github.com/users/SugoiDev/followers","following_url":"https://api.github.com/users/SugoiDev/following{/other_user}","gists_url":"https://api.github.com/users/SugoiDev/gists{/gist_id}","starred_url":"https://api.github.com/users/SugoiDev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SugoiDev/subscriptions","organizations_url":"https://api.github.com/users/SugoiDev/orgs","repos_url":"https://api.github.com/users/SugoiDev/repos","events_url":"https://api.github.com/users/SugoiDev/events{/privacy}","received_events_url":"https://api.github.com/users/SugoiDev/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/SugoiDev/fullinspector","description":"Full Inspector supercharges Unity's inspector","fork":true,"url":"https://api.github.com/repos/SugoiDev/fullinspector","forks_url":"https://api.github.com/repos/SugoiDev/fullinspector/forks","keys_url":"https://api.github.com/repos/SugoiDev/fullinspector/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SugoiDev/fullinspector/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SugoiDev/fullinspector/teams","hooks_url":"https://api.github.com/repos/SugoiDev/fullinspector/hooks","issue_events_url":"https://api.github.com/repos/SugoiDev/fullinspector/issues/events{/number}","events_url":"https://api.github.com/repos/SugoiDev/fullinspector/events","assignees_url":"https://api.github.com/repos/SugoiDev/fullinspector/assignees{/user}","branches_url":"https://api.github.com/repos/SugoiDev/fullinspector/branches{/branch}","tags_url":"https://api.github.com/repos/SugoiDev/fullinspector/tags","blobs_url":"https://api.github.com/repos/SugoiDev/fullinspector/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SugoiDev/fullinspector/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SugoiDev/fullinspector/git/refs{/sha}","trees_url":"https://api.github.com/repos/SugoiDev/fullinspector/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SugoiDev/fullinspector/statuses/{sha}","languages_url":"https://api.github.com/repos/SugoiDev/fullinspector/languages","stargazers_url":"https://api.github.com/repos/SugoiDev/fullinspector/stargazers","contributors_url":"https://api.github.com/repos/SugoiDev/fullinspector/contributors","subscribers_url":"https://api.github.com/repos/SugoiDev/fullinspector/subscribers","subscription_url":"https://api.github.com/repos/SugoiDev/fullinspector/subscription","commits_url":"https://api.github.com/repos/SugoiDev/fullinspector/commits{/sha}","git_commits_url":"https://api.github.com/repos/SugoiDev/fullinspector/git/commits{/sha}","comments_url":"https://api.github.com/repos/SugoiDev/fullinspector/comments{/number}","issue_comment_url":"https://api.github.com/repos/SugoiDev/fullinspector/issues/comments{/number}","contents_url":"https://api.github.com/repos/SugoiDev/fullinspector/contents/{+path}","compare_url":"https://api.github.com/repos/SugoiDev/fullinspector/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SugoiDev/fullinspector/merges","archive_url":"https://api.github.com/repos/SugoiDev/fullinspector/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SugoiDev/fullinspector/downloads","issues_url":"https://api.github.com/repos/SugoiDev/fullinspector/issues{/number}","pulls_url":"https://api.github.com/repos/SugoiDev/fullinspector/pulls{/number}","milestones_url":"https://api.github.com/repos/SugoiDev/fullinspector/milestones{/number}","notifications_url":"https://api.github.com/repos/SugoiDev/fullinspector/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SugoiDev/fullinspector/labels{/name}","releases_url":"https://api.github.com/repos/SugoiDev/fullinspector/releases{/id}","deployments_url":"https://api.github.com/repos/SugoiDev/fullinspector/deployments","created_at":"2016-11-01T13:19:50Z","updated_at":"2016-11-01T13:19:52Z","pushed_at":"2017-06-09T03:04:55Z","git_url":"git://github.com/SugoiDev/fullinspector.git","ssh_url":"git@github.com:SugoiDev/fullinspector.git","clone_url":"https://github.com/SugoiDev/fullinspector.git","svn_url":"https://github.com/SugoiDev/fullinspector","homepage":"","size":101111,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"jacobdufault:master","ref":"master","sha":"dd5b1401e329e3fa3aef96078720e3bc974e0688","user":{"login":"jacobdufault","id":356714,"avatar_url":"https://avatars0.githubusercontent.com/u/356714?v=3","gravatar_id":"","url":"https://api.github.com/users/jacobdufault","html_url":"https://github.com/jacobdufault","followers_url":"https://api.github.com/users/jacobdufault/followers","following_url":"https://api.github.com/users/jacobdufault/following{/other_user}","gists_url":"https://api.github.com/users/jacobdufault/gists{/gist_id}","starred_url":"https://api.github.com/users/jacobdufault/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacobdufault/subscriptions","organizations_url":"https://api.github.com/users/jacobdufault/orgs","repos_url":"https://api.github.com/users/jacobdufault/repos","events_url":"https://api.github.com/users/jacobdufault/events{/privacy}","received_events_url":"https://api.github.com/users/jacobdufault/received_events","type":"User","site_admin":false},"repo":{"id":16458371,"name":"fullinspector","full_name":"jacobdufault/fullinspector","owner":{"login":"jacobdufault","id":356714,"avatar_url":"https://avatars0.githubusercontent.com/u/356714?v=3","gravatar_id":"","url":"https://api.github.com/users/jacobdufault","html_url":"https://github.com/jacobdufault","followers_url":"https://api.github.com/users/jacobdufault/followers","following_url":"https://api.github.com/users/jacobdufault/following{/other_user}","gists_url":"https://api.github.com/users/jacobdufault/gists{/gist_id}","starred_url":"https://api.github.com/users/jacobdufault/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacobdufault/subscriptions","organizations_url":"https://api.github.com/users/jacobdufault/orgs","repos_url":"https://api.github.com/users/jacobdufault/repos","events_url":"https://api.github.com/users/jacobdufault/events{/privacy}","received_events_url":"https://api.github.com/users/jacobdufault/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jacobdufault/fullinspector","description":"Full Inspector supercharges Unity's inspector","fork":false,"url":"https://api.github.com/repos/jacobdufault/fullinspector","forks_url":"https://api.github.com/repos/jacobdufault/fullinspector/forks","keys_url":"https://api.github.com/repos/jacobdufault/fullinspector/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jacobdufault/fullinspector/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jacobdufault/fullinspector/teams","hooks_url":"https://api.github.com/repos/jacobdufault/fullinspector/hooks","issue_events_url":"https://api.github.com/repos/jacobdufault/fullinspector/issues/events{/number}","events_url":"https://api.github.com/repos/jacobdufault/fullinspector/events","assignees_url":"https://api.github.com/repos/jacobdufault/fullinspector/assignees{/user}","branches_url":"https://api.github.com/repos/jacobdufault/fullinspector/branches{/branch}","tags_url":"https://api.github.com/repos/jacobdufault/fullinspector/tags","blobs_url":"https://api.github.com/repos/jacobdufault/fullinspector/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jacobdufault/fullinspector/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jacobdufault/fullinspector/git/refs{/sha}","trees_url":"https://api.github.com/repos/jacobdufault/fullinspector/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jacobdufault/fullinspector/statuses/{sha}","languages_url":"https://api.github.com/repos/jacobdufault/fullinspector/languages","stargazers_url":"https://api.github.com/repos/jacobdufault/fullinspector/stargazers","contributors_url":"https://api.github.com/repos/jacobdufault/fullinspector/contributors","subscribers_url":"https://api.github.com/repos/jacobdufault/fullinspector/subscribers","subscription_url":"https://api.github.com/repos/jacobdufault/fullinspector/subscription","commits_url":"https://api.github.com/repos/jacobdufault/fullinspector/commits{/sha}","git_commits_url":"https://api.github.com/repos/jacobdufault/fullinspector/git/commits{/sha}","comments_url":"https://api.github.com/repos/jacobdufault/fullinspector/comments{/number}","issue_comment_url":"https://api.github.com/repos/jacobdufault/fullinspector/issues/comments{/number}","contents_url":"https://api.github.com/repos/jacobdufault/fullinspector/contents/{+path}","compare_url":"https://api.github.com/repos/jacobdufault/fullinspector/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jacobdufault/fullinspector/merges","archive_url":"https://api.github.com/repos/jacobdufault/fullinspector/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jacobdufault/fullinspector/downloads","issues_url":"https://api.github.com/repos/jacobdufault/fullinspector/issues{/number}","pulls_url":"https://api.github.com/repos/jacobdufault/fullinspector/pulls{/number}","milestones_url":"https://api.github.com/repos/jacobdufault/fullinspector/milestones{/number}","notifications_url":"https://api.github.com/repos/jacobdufault/fullinspector/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jacobdufault/fullinspector/labels{/name}","releases_url":"https://api.github.com/repos/jacobdufault/fullinspector/releases{/id}","deployments_url":"https://api.github.com/repos/jacobdufault/fullinspector/deployments","created_at":"2014-02-02T16:51:38Z","updated_at":"2017-06-13T11:52:01Z","pushed_at":"2017-06-09T03:04:57Z","git_url":"git://github.com/jacobdufault/fullinspector.git","ssh_url":"git@github.com:jacobdufault/fullinspector.git","clone_url":"https://github.com/jacobdufault/fullinspector.git","svn_url":"https://github.com/jacobdufault/fullinspector","homepage":"","size":101105,"stargazers_count":43,"watchers_count":43,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":11,"mirror_url":null,"open_issues_count":49,"forks":11,"open_issues":49,"watchers":43,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/201"},"html":{"href":"https://github.com/jacobdufault/fullinspector/pull/201"},"issue":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/issues/201"},"comments":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/issues/201/comments"},"review_comments":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/201/comments"},"review_comment":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/pulls/201/commits"},"statuses":{"href":"https://api.github.com/repos/jacobdufault/fullinspector/statuses/e45909395942505f02d0e2e9f83c98a8b052a0f0"}}}}
{"actor":{"display_login":"jacobdufault"}}