{"action":"created","comment":{"url":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments/69296801","id":69296801,"diff_hunk":"@@ -646,98 +527,37 @@ def flush_all(self):\n         if self.metadata and self.metadata.hasStarted():\n             self.metadata.flush_all()\n \n-    def _read_access(self, _obj, sub_obj=None):\n-        \"\"\"Obtain read access on a given object.\n-        sub-obj is the object the read access is actually desired (ignored at the moment)\n-        Raise RegistryAccessError\n-        Raise RegistryKeyError\n-        Args:\n-            _obj (GangaObject): The object which we want to get read access to and lock on disk\n-            sub_obj (GangaObject):  Ignored under the current model\n+    def _load(self, obj):\n         \"\"\"\n-        logger.debug(\"_read_access\")\n-        obj_id = id(stripProxy(_obj))\n-        if obj_id in self._inprogressDict:\n-            return\n-\n-        with _obj.const_lock:\n-            self.__safe_read_access(_obj, sub_obj)\n-\n-    @synchronised\n-    def _load(self, obj_ids):\n+        Use this function to load an object from disk as it will check if the object is already loaded *outside*\n+         of the lock for when the actual load takes place in _locked_load\n         \"\"\"\n-        Fully load an object from a Repo/disk into memory\n-        Args:\n-            obj_ids (list): This is the list of id which we want to fully load objects for according to object dict\n-        \"\"\"\n-        logger.debug(\"_load\")\n-        these_ids = []\n-        for obj_id in obj_ids:\n-            this_id = id(self[obj_id])\n-            these_ids.append(this_id)\n-            self.lock_transaction(this_id, \"_load\")\n-\n-        ## Record dirty status before flushing\n-        ## Just in case we've requested loading over the job in memory\n-        prior_status = {}\n-        for obj_id in obj_ids:\n-            if obj_id in self._objects:\n-                prior_status[obj_id] = self._objects[obj_id]._dirty\n+        if not self.repository.isObjectLoaded(obj):\n+            self._locked_load(obj)\n \n-        try:\n-            for obj_id in obj_ids:\n-                self.repository.load([obj_id])\n-        except Exception as err:\n-            logger.error(\"Error Loading Jobs! '%s'\" % obj_ids)\n-            ## Cleanup aftr ourselves if an error occured\n-            for obj_id in obj_ids:\n-                ## Didn't load mark as clean so it's not flushed\n-                if obj_id in self._objects:\n-                    self._objects[obj_id]._setFlushed()\n-            raise\n-        finally:\n-            for obj_id in these_ids:\n-                self.unlock_transaction(obj_id)\n-\n-    def __safe_read_access(self, _obj, sub_obj):\n+    @synchronised_complete_lock\n+    def _locked_load(self, obj):\n         \"\"\"\n-        This method will attempt to load an unloaded object from disk and acquire a file lock to prevent other Ganga sessions modifying it\n+        Fully load an object from a Repo/disk into memory. Should only ever be called from _load!\n         Args:\n-            _obj (GangaObject): The object which we want to get read access to and lock on disk\n-            sub_obj (str): Ignored under the current model\n+            obj (GangaObject): This is the object we want to fully load\n         \"\"\"\n-        logger.debug(\"_safe_read_access\")\n-        obj = stripProxy(_obj)\n-        if id(obj) in self._inprogressDict:\n-            return\n-\n-        if self.hasStarted() is not True:\n-            raise RegistryAccessError(\"The object #%i in registry '%s' is not fully loaded and the registry is disconnected! Type 'reactivate()' if you want to reconnect.\" % (self.find(obj), self.name))\n+        logger.debug(\"_locked_load\")\n \n-        if hasattr(obj, \"_registry_refresh\"):\n-            delattr(obj, \"_registry_refresh\")\n-        assert not hasattr(obj, \"_registry_refresh\")\n+        # find the object ID\n+        obj_id = self.find(obj)\n \n         try:\n-            try:\n-                if not self.has_loaded(obj):\n-                    this_id = self.find(obj)\n-                    self._load([this_id])\n-            except KeyError as err:\n-                logger.error(\"_read_access KeyError %s\" % err)\n-                raise RegistryKeyError(\"Read: The object #%i in registry '%s' was deleted!\" % (this_id, self.name))\n-            except InaccessibleObjectError as err:\n-                raise\n-                raise RegistryKeyError(\"Read: The object #%i in registry '%s' could not be accessed - %s!\" % (this_id, self.name, err))\n-            for this_d in self.changed_ids.itervalues():\n-                this_d.add(this_id)\n-        except (RepositoryError, RegistryAccessError, RegistryLockError, ObjectNotInRegistryError) as err:\n-            raise\n+            self.repository.load([obj_id])\n         except Exception as err:\n-            logger.debug(\"Unknown read access Error: %s\" % err)\n+            logger.error(\"Error Loading Job! '%s'\" % obj_id)\n+            ## Cleanup after ourselves if an error occured\n+            ## Didn't load mark as clean so it's not flushed","path":"python/Ganga/Core/GangaRepository/Registry.py","position":566,"original_position":566,"commit_id":"8d21d14e1c04c2b6c72b999d3c77ac19dfaefc00","original_commit_id":"8d21d14e1c04c2b6c72b999d3c77ac19dfaefc00","user":{"login":"milliams","id":61316,"avatar_url":"https://avatars.githubusercontent.com/u/61316?v=3","gravatar_id":"","url":"https://api.github.com/users/milliams","html_url":"https://github.com/milliams","followers_url":"https://api.github.com/users/milliams/followers","following_url":"https://api.github.com/users/milliams/following{/other_user}","gists_url":"https://api.github.com/users/milliams/gists{/gist_id}","starred_url":"https://api.github.com/users/milliams/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/milliams/subscriptions","organizations_url":"https://api.github.com/users/milliams/orgs","repos_url":"https://api.github.com/users/milliams/repos","events_url":"https://api.github.com/users/milliams/events{/privacy}","received_events_url":"https://api.github.com/users/milliams/received_events","type":"User","site_admin":false},"body":"Since leading `# ` for comments as per PEP8.","created_at":"2016-07-01T13:10:08Z","updated_at":"2016-07-01T13:10:08Z","html_url":"https://github.com/ganga-devs/ganga/pull/627#discussion_r69296801","pull_request_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/627","_links":{"self":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments/69296801"},"html":{"href":"https://github.com/ganga-devs/ganga/pull/627#discussion_r69296801"},"pull_request":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/627"}}},"pull_request":{"url":"https://api.github.com/repos/ganga-devs/ganga/pulls/627","id":75465522,"html_url":"https://github.com/ganga-devs/ganga/pull/627","diff_url":"https://github.com/ganga-devs/ganga/pull/627.diff","patch_url":"https://github.com/ganga-devs/ganga/pull/627.patch","issue_url":"https://api.github.com/repos/ganga-devs/ganga/issues/627","number":627,"state":"open","locked":false,"title":"Remove getwriteaccess calls where possible","user":{"login":"drmarkwslater","id":13677368,"avatar_url":"https://avatars.githubusercontent.com/u/13677368?v=3","gravatar_id":"","url":"https://api.github.com/users/drmarkwslater","html_url":"https://github.com/drmarkwslater","followers_url":"https://api.github.com/users/drmarkwslater/followers","following_url":"https://api.github.com/users/drmarkwslater/following{/other_user}","gists_url":"https://api.github.com/users/drmarkwslater/gists{/gist_id}","starred_url":"https://api.github.com/users/drmarkwslater/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drmarkwslater/subscriptions","organizations_url":"https://api.github.com/users/drmarkwslater/orgs","repos_url":"https://api.github.com/users/drmarkwslater/repos","events_url":"https://api.github.com/users/drmarkwslater/events{/privacy}","received_events_url":"https://api.github.com/users/drmarkwslater/received_events","type":"User","site_admin":false},"body":"This is a rather large PR that removes the confusing `_getReadAccess` and `_getWriteAccess` calls and replaces them with more specific calls to load or lock the object. It also does a certain amount of cleanup around these and other functions in the Registry and Objects.py.\r\n\r\nThere are still some more minor changes to come in the next hour but I wanted to see it in a PR and make sure I document everything both in code and in the PR.\r\n\r\nSummary of changes:\r\n\r\n* Break out the single overall Registry lock into two locks: A quick 'read' lock and a specific 'flush' lock. This means functions that don't care about read actions taking place can acquire the lock they want (I have two as the flush can take significantly longer than any other call) whereas 'destructive' functions have to acquire both to continue. Practical upshot: quick registry read calls don't have to wait for the flush but write ones still need have exclusive access.\r\n\r\n* Made the `_load` registry function decide whether to load an object or not itself and also moved this check to outside the lock acquisition.\r\n\r\n* Removed references to `_update_index_time` and `_changed_ids` as this was only ever done semi-randomly on calls to `items` or `ids` in code that did something very strange. The call to `repository.update_index()` might need to be shifted elsewhere but certainly as was, it didn't seem to be working as intended.\r\n\r\n* Removed the transaction locks as these were only ever called within functions that were protected in by `@syncronised` anyway.\r\n\r\n* Did some general clean up, e.g. removed functions that were only called once, removed some `try...except` blocks that weren't doing anything with the caught exception, etc.\r\n\r\n* Removed `_getReadAccess` and `_read_access` and replaced with explicit load calls as this just boiled down to trying to load the object from disk.\r\n\r\n* Removed `_getWriteAccess` and `_write_access` and replaced with explicit calls as these were attempting to acquire a Session Lock and then attempting a load. Note that the only place a load is attempted is now in the setter and getter. Other calls to `_getWriteAccess` have just been replaced with the Session Lock call (which also may not be needed but at least is explicit now 😄 )\r\n\r\n* Removed `getGangaList` function and just replaced with appropriate imports in `Objects.py`\r\n\r\nAs this touches quite a bit of low-level code I won't even consider merging this without at least 2 other devs OK 😄 \r\n\r\nFixes #528 ","created_at":"2016-06-28T12:06:45Z","updated_at":"2016-07-01T13:10:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0bf89bc9a471dd8de20cc55dda90f05972356c60","assignee":{"login":"drmarkwslater","id":13677368,"avatar_url":"https://avatars.githubusercontent.com/u/13677368?v=3","gravatar_id":"","url":"https://api.github.com/users/drmarkwslater","html_url":"https://github.com/drmarkwslater","followers_url":"https://api.github.com/users/drmarkwslater/followers","following_url":"https://api.github.com/users/drmarkwslater/following{/other_user}","gists_url":"https://api.github.com/users/drmarkwslater/gists{/gist_id}","starred_url":"https://api.github.com/users/drmarkwslater/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drmarkwslater/subscriptions","organizations_url":"https://api.github.com/users/drmarkwslater/orgs","repos_url":"https://api.github.com/users/drmarkwslater/repos","events_url":"https://api.github.com/users/drmarkwslater/events{/privacy}","received_events_url":"https://api.github.com/users/drmarkwslater/received_events","type":"User","site_admin":false},"assignees":[{"login":"drmarkwslater","id":13677368,"avatar_url":"https://avatars.githubusercontent.com/u/13677368?v=3","gravatar_id":"","url":"https://api.github.com/users/drmarkwslater","html_url":"https://github.com/drmarkwslater","followers_url":"https://api.github.com/users/drmarkwslater/followers","following_url":"https://api.github.com/users/drmarkwslater/following{/other_user}","gists_url":"https://api.github.com/users/drmarkwslater/gists{/gist_id}","starred_url":"https://api.github.com/users/drmarkwslater/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drmarkwslater/subscriptions","organizations_url":"https://api.github.com/users/drmarkwslater/orgs","repos_url":"https://api.github.com/users/drmarkwslater/repos","events_url":"https://api.github.com/users/drmarkwslater/events{/privacy}","received_events_url":"https://api.github.com/users/drmarkwslater/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/ganga-devs/ganga/milestones/10","html_url":"https://github.com/ganga-devs/ganga/milestones/6.1.22","labels_url":"https://api.github.com/repos/ganga-devs/ganga/milestones/10/labels","id":1789194,"number":10,"title":"6.1.22","description":"","creator":{"login":"drmarkwslater","id":13677368,"avatar_url":"https://avatars.githubusercontent.com/u/13677368?v=3","gravatar_id":"","url":"https://api.github.com/users/drmarkwslater","html_url":"https://github.com/drmarkwslater","followers_url":"https://api.github.com/users/drmarkwslater/followers","following_url":"https://api.github.com/users/drmarkwslater/following{/other_user}","gists_url":"https://api.github.com/users/drmarkwslater/gists{/gist_id}","starred_url":"https://api.github.com/users/drmarkwslater/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drmarkwslater/subscriptions","organizations_url":"https://api.github.com/users/drmarkwslater/orgs","repos_url":"https://api.github.com/users/drmarkwslater/repos","events_url":"https://api.github.com/users/drmarkwslater/events{/privacy}","received_events_url":"https://api.github.com/users/drmarkwslater/received_events","type":"User","site_admin":false},"open_issues":23,"closed_issues":6,"state":"open","created_at":"2016-05-26T08:24:44Z","updated_at":"2016-07-01T10:12:19Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/627/commits","review_comments_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/627/comments","review_comment_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ganga-devs/ganga/issues/627/comments","statuses_url":"https://api.github.com/repos/ganga-devs/ganga/statuses/8d21d14e1c04c2b6c72b999d3c77ac19dfaefc00","head":{"label":"ganga-devs:remove-getwriteaccess-calls-where-possible","ref":"remove-getwriteaccess-calls-where-possible","sha":"8d21d14e1c04c2b6c72b999d3c77ac19dfaefc00","user":{"login":"ganga-devs","id":13271048,"avatar_url":"https://avatars.githubusercontent.com/u/13271048?v=3","gravatar_id":"","url":"https://api.github.com/users/ganga-devs","html_url":"https://github.com/ganga-devs","followers_url":"https://api.github.com/users/ganga-devs/followers","following_url":"https://api.github.com/users/ganga-devs/following{/other_user}","gists_url":"https://api.github.com/users/ganga-devs/gists{/gist_id}","starred_url":"https://api.github.com/users/ganga-devs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganga-devs/subscriptions","organizations_url":"https://api.github.com/users/ganga-devs/orgs","repos_url":"https://api.github.com/users/ganga-devs/repos","events_url":"https://api.github.com/users/ganga-devs/events{/privacy}","received_events_url":"https://api.github.com/users/ganga-devs/received_events","type":"Organization","site_admin":false},"repo":{"id":43645564,"name":"ganga","full_name":"ganga-devs/ganga","owner":{"login":"ganga-devs","id":13271048,"avatar_url":"https://avatars.githubusercontent.com/u/13271048?v=3","gravatar_id":"","url":"https://api.github.com/users/ganga-devs","html_url":"https://github.com/ganga-devs","followers_url":"https://api.github.com/users/ganga-devs/followers","following_url":"https://api.github.com/users/ganga-devs/following{/other_user}","gists_url":"https://api.github.com/users/ganga-devs/gists{/gist_id}","starred_url":"https://api.github.com/users/ganga-devs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganga-devs/subscriptions","organizations_url":"https://api.github.com/users/ganga-devs/orgs","repos_url":"https://api.github.com/users/ganga-devs/repos","events_url":"https://api.github.com/users/ganga-devs/events{/privacy}","received_events_url":"https://api.github.com/users/ganga-devs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ganga-devs/ganga","description":"Ganga is an easy-to-use frontend for job definition and management","fork":false,"url":"https://api.github.com/repos/ganga-devs/ganga","forks_url":"https://api.github.com/repos/ganga-devs/ganga/forks","keys_url":"https://api.github.com/repos/ganga-devs/ganga/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ganga-devs/ganga/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ganga-devs/ganga/teams","hooks_url":"https://api.github.com/repos/ganga-devs/ganga/hooks","issue_events_url":"https://api.github.com/repos/ganga-devs/ganga/issues/events{/number}","events_url":"https://api.github.com/repos/ganga-devs/ganga/events","assignees_url":"https://api.github.com/repos/ganga-devs/ganga/assignees{/user}","branches_url":"https://api.github.com/repos/ganga-devs/ganga/branches{/branch}","tags_url":"https://api.github.com/repos/ganga-devs/ganga/tags","blobs_url":"https://api.github.com/repos/ganga-devs/ganga/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ganga-devs/ganga/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ganga-devs/ganga/git/refs{/sha}","trees_url":"https://api.github.com/repos/ganga-devs/ganga/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ganga-devs/ganga/statuses/{sha}","languages_url":"https://api.github.com/repos/ganga-devs/ganga/languages","stargazers_url":"https://api.github.com/repos/ganga-devs/ganga/stargazers","contributors_url":"https://api.github.com/repos/ganga-devs/ganga/contributors","subscribers_url":"https://api.github.com/repos/ganga-devs/ganga/subscribers","subscription_url":"https://api.github.com/repos/ganga-devs/ganga/subscription","commits_url":"https://api.github.com/repos/ganga-devs/ganga/commits{/sha}","git_commits_url":"https://api.github.com/repos/ganga-devs/ganga/git/commits{/sha}","comments_url":"https://api.github.com/repos/ganga-devs/ganga/comments{/number}","issue_comment_url":"https://api.github.com/repos/ganga-devs/ganga/issues/comments{/number}","contents_url":"https://api.github.com/repos/ganga-devs/ganga/contents/{+path}","compare_url":"https://api.github.com/repos/ganga-devs/ganga/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ganga-devs/ganga/merges","archive_url":"https://api.github.com/repos/ganga-devs/ganga/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ganga-devs/ganga/downloads","issues_url":"https://api.github.com/repos/ganga-devs/ganga/issues{/number}","pulls_url":"https://api.github.com/repos/ganga-devs/ganga/pulls{/number}","milestones_url":"https://api.github.com/repos/ganga-devs/ganga/milestones{/number}","notifications_url":"https://api.github.com/repos/ganga-devs/ganga/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ganga-devs/ganga/labels{/name}","releases_url":"https://api.github.com/repos/ganga-devs/ganga/releases{/id}","deployments_url":"https://api.github.com/repos/ganga-devs/ganga/deployments","created_at":"2015-10-04T17:39:11Z","updated_at":"2016-06-04T15:16:49Z","pushed_at":"2016-07-01T09:48:14Z","git_url":"git://github.com/ganga-devs/ganga.git","ssh_url":"git@github.com:ganga-devs/ganga.git","clone_url":"https://github.com/ganga-devs/ganga.git","svn_url":"https://github.com/ganga-devs/ganga","homepage":"https://cern.ch/ganga","size":29534,"stargazers_count":19,"watchers_count":19,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":139,"forks":13,"open_issues":139,"watchers":19,"default_branch":"develop"}},"base":{"label":"ganga-devs:develop","ref":"develop","sha":"4fb6ae668965a04dfdf7532feaf7bd1a7aabe780","user":{"login":"ganga-devs","id":13271048,"avatar_url":"https://avatars.githubusercontent.com/u/13271048?v=3","gravatar_id":"","url":"https://api.github.com/users/ganga-devs","html_url":"https://github.com/ganga-devs","followers_url":"https://api.github.com/users/ganga-devs/followers","following_url":"https://api.github.com/users/ganga-devs/following{/other_user}","gists_url":"https://api.github.com/users/ganga-devs/gists{/gist_id}","starred_url":"https://api.github.com/users/ganga-devs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganga-devs/subscriptions","organizations_url":"https://api.github.com/users/ganga-devs/orgs","repos_url":"https://api.github.com/users/ganga-devs/repos","events_url":"https://api.github.com/users/ganga-devs/events{/privacy}","received_events_url":"https://api.github.com/users/ganga-devs/received_events","type":"Organization","site_admin":false},"repo":{"id":43645564,"name":"ganga","full_name":"ganga-devs/ganga","owner":{"login":"ganga-devs","id":13271048,"avatar_url":"https://avatars.githubusercontent.com/u/13271048?v=3","gravatar_id":"","url":"https://api.github.com/users/ganga-devs","html_url":"https://github.com/ganga-devs","followers_url":"https://api.github.com/users/ganga-devs/followers","following_url":"https://api.github.com/users/ganga-devs/following{/other_user}","gists_url":"https://api.github.com/users/ganga-devs/gists{/gist_id}","starred_url":"https://api.github.com/users/ganga-devs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganga-devs/subscriptions","organizations_url":"https://api.github.com/users/ganga-devs/orgs","repos_url":"https://api.github.com/users/ganga-devs/repos","events_url":"https://api.github.com/users/ganga-devs/events{/privacy}","received_events_url":"https://api.github.com/users/ganga-devs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ganga-devs/ganga","description":"Ganga is an easy-to-use frontend for job definition and management","fork":false,"url":"https://api.github.com/repos/ganga-devs/ganga","forks_url":"https://api.github.com/repos/ganga-devs/ganga/forks","keys_url":"https://api.github.com/repos/ganga-devs/ganga/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ganga-devs/ganga/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ganga-devs/ganga/teams","hooks_url":"https://api.github.com/repos/ganga-devs/ganga/hooks","issue_events_url":"https://api.github.com/repos/ganga-devs/ganga/issues/events{/number}","events_url":"https://api.github.com/repos/ganga-devs/ganga/events","assignees_url":"https://api.github.com/repos/ganga-devs/ganga/assignees{/user}","branches_url":"https://api.github.com/repos/ganga-devs/ganga/branches{/branch}","tags_url":"https://api.github.com/repos/ganga-devs/ganga/tags","blobs_url":"https://api.github.com/repos/ganga-devs/ganga/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ganga-devs/ganga/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ganga-devs/ganga/git/refs{/sha}","trees_url":"https://api.github.com/repos/ganga-devs/ganga/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ganga-devs/ganga/statuses/{sha}","languages_url":"https://api.github.com/repos/ganga-devs/ganga/languages","stargazers_url":"https://api.github.com/repos/ganga-devs/ganga/stargazers","contributors_url":"https://api.github.com/repos/ganga-devs/ganga/contributors","subscribers_url":"https://api.github.com/repos/ganga-devs/ganga/subscribers","subscription_url":"https://api.github.com/repos/ganga-devs/ganga/subscription","commits_url":"https://api.github.com/repos/ganga-devs/ganga/commits{/sha}","git_commits_url":"https://api.github.com/repos/ganga-devs/ganga/git/commits{/sha}","comments_url":"https://api.github.com/repos/ganga-devs/ganga/comments{/number}","issue_comment_url":"https://api.github.com/repos/ganga-devs/ganga/issues/comments{/number}","contents_url":"https://api.github.com/repos/ganga-devs/ganga/contents/{+path}","compare_url":"https://api.github.com/repos/ganga-devs/ganga/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ganga-devs/ganga/merges","archive_url":"https://api.github.com/repos/ganga-devs/ganga/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ganga-devs/ganga/downloads","issues_url":"https://api.github.com/repos/ganga-devs/ganga/issues{/number}","pulls_url":"https://api.github.com/repos/ganga-devs/ganga/pulls{/number}","milestones_url":"https://api.github.com/repos/ganga-devs/ganga/milestones{/number}","notifications_url":"https://api.github.com/repos/ganga-devs/ganga/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ganga-devs/ganga/labels{/name}","releases_url":"https://api.github.com/repos/ganga-devs/ganga/releases{/id}","deployments_url":"https://api.github.com/repos/ganga-devs/ganga/deployments","created_at":"2015-10-04T17:39:11Z","updated_at":"2016-06-04T15:16:49Z","pushed_at":"2016-07-01T09:48:14Z","git_url":"git://github.com/ganga-devs/ganga.git","ssh_url":"git@github.com:ganga-devs/ganga.git","clone_url":"https://github.com/ganga-devs/ganga.git","svn_url":"https://github.com/ganga-devs/ganga","homepage":"https://cern.ch/ganga","size":29534,"stargazers_count":19,"watchers_count":19,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":139,"forks":13,"open_issues":139,"watchers":19,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/627"},"html":{"href":"https://github.com/ganga-devs/ganga/pull/627"},"issue":{"href":"https://api.github.com/repos/ganga-devs/ganga/issues/627"},"comments":{"href":"https://api.github.com/repos/ganga-devs/ganga/issues/627/comments"},"review_comments":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/627/comments"},"review_comment":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/627/commits"},"statuses":{"href":"https://api.github.com/repos/ganga-devs/ganga/statuses/8d21d14e1c04c2b6c72b999d3c77ac19dfaefc00"}}}}
{"actor":{"display_login":"milliams"}}