{"action":"created","comment":{"url":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments/66658996","id":66658996,"diff_hunk":"@@ -0,0 +1,248 @@\n+\n+from Ganga.GPIDev.Adapters.IPrepareApp import IPrepareApp\n+from Ganga.GPIDev.Adapters.IRuntimeHandler import IRuntimeHandler\n+from Ganga.GPIDev.Schema import Schema, Version, SimpleItem, GangaFileItem\n+\n+from Ganga.Utility.Config import getConfig\n+\n+from Ganga.GPIDev.Lib.File.File import File, ShareDir\n+from Ganga.Core import ApplicationConfigurationError, ApplicationPrepareError, GangaException\n+\n+from Ganga.Utility.logging import getLogger\n+\n+from Ganga.GPIDev.Base.Proxy import getName, isType, stripProxy\n+\n+from os import rename, path\n+import shutil\n+from Ganga.Utility.files import expandfilename\n+\n+from Ganga.GPIDev.Lib.File.LocalFile import LocalFile\n+from GangaDirac.Lib.Files.DiracFile import DiracFile\n+\n+from GangaDirac.Lib.Backends.DiracBase import DiracBase\n+\n+import tempfile\n+import time\n+import subprocess\n+\n+logger = getLogger()\n+cmake_sandbox_name = 'cmake-input-sandbox.tgz'\n+build_target = 'ganga-input-sandbox'\n+build_dest = 'input-sandbox.tgz'\n+defDir = '$HOME/cmtuser'\n+\n+def _exec_cmd(cmd, cwdir):\n+    pipe = subprocess.Popen(cmd,\n+            shell=True,\n+            env=None,\n+            cwd=cwdir,\n+            stdout=subprocess.PIPE,\n+            stderr=subprocess.PIPE)\n+    stdout, stderr = pipe.communicate()\n+    while pipe.poll() is None:\n+        time.sleep(0.5)\n+    return pipe.returncode, stdout, stderr\n+\n+def prepare_cmake_app(myApp, myVer, myPath=defDir, myGetpack=None):\n+    \"\"\"\n+    Short helper function for setting up minimal application environments on disk for job submission\n+    \"\"\"\n+    full_path = expandfilename(myPath)\n+    if not path.exists(full_path):\n+        os.makedirs(full_path)\n+    os.chdir(full_path)\n+    _exec_cmd('lb-dev %s %s' % (myApp, myVer), myPath)\n+    if myGetpack:\n+        os.chdir(path.join(full_path, myApp + 'Dev_' + myVer))\n+        _exec_cmd('getpack %s' % myGetpack)\n+\n+\n+class GaudiRun(IPrepareApp):\n+\n+    \"\"\"\n+    Welcome to the new GaudiApp for LHCb apps written/constructed making use of the new CMake framework\n+\n+    Before submitting jobs with this application you will need to run something similar to the following:\n+\n+    cd $SOMEPATH\n+    lb-dev DaVinci v40r2\n+    cd $SOMEPATH/DaVinciDev_v40r2\n+    getpack \n+\n+    This program will perform the following command to `prepare` the application before submission:\n+        make ganga-input-sandbox\n+\n+    This application needs to be configured with the absolute directory of the project and the options you want to pass to gaudirun.py\n+\n+    e.g.\n+\n+    j=Job()\n+    myApp = GaudiRun()\n+    myApp.directory = \"$SOMEPATH/DaVinciDev_v40r2\"\n+    myApp.myOpts = \"$SOMEPATH/DaVinciDev_v40r2/myDaVinciOpts.py\"\n+    j.application = myApp\n+    j.submit()\n+\n+    To setup a minimal application you can also run the helper function:\n+\n+    prepare_cmake_app(myApp, myVer, myPath, myGetpack)\n+\n+    \"\"\"\n+    _schema = Schema(Version(1, 0), {\n+        # Options created for constructing/submitting this app\n+        'directory':    SimpleItem(preparable=1, defvalue=None, typelist=[None, str], comparable=1,\n+            doc='A path to the project that you\\'re wanting to run.'),\n+        'build_opts':   SimpleItem(defvalue=[\"\"], typelist=[str], sequence=1, strict_sequence=0,\n+            doc=\"Options to be passed to 'make ganga-input-sandbox'\"),\n+        'myOpts':       GangaFileItem(defvalue=None, doc='File which contains the extra opts I want to pass to gaudirun.py'),\n+        'uploadedInput': GangaFileItem(defvalue=None, doc='This stores the input for the job which has been pre-uploaded so that it gets to the WN'),\n+\n+        # Prepared job object\n+        'is_prepared':  SimpleItem(defvalue=None, strict_sequence=0, visitable=1, copyable=1, hidden=0, typelist=[None, bool, ShareDir], protected=0, comparable=1,\n+            doc='Location of shared resources. Presence of this attribute implies the application has been prepared.'),\n+        'hash':         SimpleItem(defvalue=None, typelist=[None, str], hidden=0,\n+            doc='MD5 hash of the string representation of applications preparable attributes'),\n+        'arch':         SimpleItem(defvalue=\"x86_64-slc6-gcc49-opt\", typelist=[str], doc='Arch the application was built for'),\n+        })\n+    _category = 'applications'\n+    _name = 'GaudiRun'\n+    _exportmethods = ['prepare', 'unprepare', 'exec_cmd', 'getDir']\n+\n+    def __init__(self):\n+        super(GaudiRun, self).__init__()\n+\n+    def unprepare(self, force=False):\n+        logger.debug('Running unprepare in GaudiRun app')\n+        if self.is_prepared is not None:\n+            self.decrementShareCounter(self.is_prepared.name)\n+            self.is_prepared = None\n+        self.hash = None\n+        self.uploadedInput = None\n+\n+    def prepare(self, force=False):\n+        \"\"\"\n+        This method creates a set of prepared files for the application to pass to the RTHandler\n+        \"\"\"\n+\n+        if (self.is_prepared is not None) and (force is not True):\n+            raise ApplicationPrepareError('%s application has already been prepared. Use prepare(force=True) to prepare again.' % getName(self))\n+\n+        # lets use the same criteria as the configure() method for checking file existence & sanity\n+        # this will bail us out of prepare if there's somthing odd with the job config - like the executable\n+        # file is unspecified, has a space or is a relative path\n+        self.configure(self)\n+        logger.info('Preparing %s application.' % getName(self))\n+        setattr(self, 'is_prepared', ShareDir())\n+        logger.info('Created shared directory: %s' % (self.is_prepared.name))\n+\n+        build_target = self.buildGangaTarget()\n+\n+        try:\n+            # copy any 'preparable' objects into the shared directory\n+            send_to_sharedir = self.copyPreparables()\n+            # add the newly created shared directory into the metadata system\n+            # if the app is associated with a persisted object\n+            self.checkPreparedHasParent(self)\n+\n+            self.copyIntoPrepDir(build_target)\n+            opts_file = self.getOptsFile()\n+            if isinstance(opts_file, LocalFile):\n+                self.copyIntoPrepDir(path.join( opts_file.localDir, path.basename(opts_file.namePattern) ))\n+            elif isinstance(opts_file, DiracFile) and self.master and not isinstance(self.getJobObject().backend, DiracBase):\n+                # NB safe to put it here as should have expressly setup a path for this job by now\n+                opts_file.get(localPath=self.getSharedPath())\n+            else:\n+                raise ApplicationConfigurationError(\"Opts file type %s not yet supported please contact Ganga devs if you require this support\" % getName(opts_file))","path":"python/GangaLHCb/Lib/GaudiRunApp/GaudiRunApp.py","position":155,"original_position":155,"commit_id":"ab5b587a8bd45a38511ce2a8ab711a4f00dd2e35","original_commit_id":"ab5b587a8bd45a38511ce2a8ab711a4f00dd2e35","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":"`ApplicationConfigurationError` takes two arguments.","created_at":"2016-06-10T18:22:02Z","updated_at":"2016-06-10T18:22:02Z","html_url":"https://github.com/ganga-devs/ganga/pull/578#discussion_r66658996","pull_request_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/578","_links":{"self":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/comments/66658996"},"html":{"href":"https://github.com/ganga-devs/ganga/pull/578#discussion_r66658996"},"pull_request":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/578"}}},"pull_request":{"url":"https://api.github.com/repos/ganga-devs/ganga/pulls/578","id":73395625,"html_url":"https://github.com/ganga-devs/ganga/pull/578","diff_url":"https://github.com/ganga-devs/ganga/pull/578.diff","patch_url":"https://github.com/ganga-devs/ganga/pull/578.patch","issue_url":"https://api.github.com/repos/ganga-devs/ganga/issues/578","number":578,"state":"open","locked":false,"title":"CMake support","user":{"login":"rob-c","id":1102021,"avatar_url":"https://avatars.githubusercontent.com/u/1102021?v=3","gravatar_id":"","url":"https://api.github.com/users/rob-c","html_url":"https://github.com/rob-c","followers_url":"https://api.github.com/users/rob-c/followers","following_url":"https://api.github.com/users/rob-c/following{/other_user}","gists_url":"https://api.github.com/users/rob-c/gists{/gist_id}","starred_url":"https://api.github.com/users/rob-c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rob-c/subscriptions","organizations_url":"https://api.github.com/users/rob-c/orgs","repos_url":"https://api.github.com/users/rob-c/repos","events_url":"https://api.github.com/users/rob-c/events{/privacy}","received_events_url":"https://api.github.com/users/rob-c/received_events","type":"User","site_admin":false},"body":"OK this is the first PR for CMake support.\r\n\r\nI'm disabling CMake Dirac support for 6.1.20 so won't fix bugs for that here.\r\nThere is a short LHCb test incoming to simply create the new modules but this isn't in the PR yet.\r\n(Also some minor docs changes/enhancements)\r\n(and doesn't gain much as can only check the API/schema is working which is the same as everywhere else in Ganga).\r\n\r\nHopefully I'd like to get this merged Monday morning so the main outstanding features for 6.1.21 are in for testing.","created_at":"2016-06-10T15:54:41Z","updated_at":"2016-06-10T18:22:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8b14252f6220692000d4ef15e87088277af1d76c","assignee":{"login":"rob-c","id":1102021,"avatar_url":"https://avatars.githubusercontent.com/u/1102021?v=3","gravatar_id":"","url":"https://api.github.com/users/rob-c","html_url":"https://github.com/rob-c","followers_url":"https://api.github.com/users/rob-c/followers","following_url":"https://api.github.com/users/rob-c/following{/other_user}","gists_url":"https://api.github.com/users/rob-c/gists{/gist_id}","starred_url":"https://api.github.com/users/rob-c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rob-c/subscriptions","organizations_url":"https://api.github.com/users/rob-c/orgs","repos_url":"https://api.github.com/users/rob-c/repos","events_url":"https://api.github.com/users/rob-c/events{/privacy}","received_events_url":"https://api.github.com/users/rob-c/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/ganga-devs/ganga/milestones/9","html_url":"https://github.com/ganga-devs/ganga/milestones/6.1.21","labels_url":"https://api.github.com/repos/ganga-devs/ganga/milestones/9/labels","id":1762322,"number":9,"title":"6.1.21","description":null,"creator":{"login":"rob-c","id":1102021,"avatar_url":"https://avatars.githubusercontent.com/u/1102021?v=3","gravatar_id":"","url":"https://api.github.com/users/rob-c","html_url":"https://github.com/rob-c","followers_url":"https://api.github.com/users/rob-c/followers","following_url":"https://api.github.com/users/rob-c/following{/other_user}","gists_url":"https://api.github.com/users/rob-c/gists{/gist_id}","starred_url":"https://api.github.com/users/rob-c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rob-c/subscriptions","organizations_url":"https://api.github.com/users/rob-c/orgs","repos_url":"https://api.github.com/users/rob-c/repos","events_url":"https://api.github.com/users/rob-c/events{/privacy}","received_events_url":"https://api.github.com/users/rob-c/received_events","type":"User","site_admin":false},"open_issues":14,"closed_issues":57,"state":"open","created_at":"2016-05-12T12:39:16Z","updated_at":"2016-06-10T18:17:37Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/578/commits","review_comments_url":"https://api.github.com/repos/ganga-devs/ganga/pulls/578/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/578/comments","statuses_url":"https://api.github.com/repos/ganga-devs/ganga/statuses/ab5b587a8bd45a38511ce2a8ab711a4f00dd2e35","head":{"label":"ganga-devs:GaudiCMakeSupport","ref":"GaudiCMakeSupport","sha":"ab5b587a8bd45a38511ce2a8ab711a4f00dd2e35","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-06-10T18:17:37Z","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":29086,"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":128,"forks":13,"open_issues":128,"watchers":19,"default_branch":"develop"}},"base":{"label":"ganga-devs:develop","ref":"develop","sha":"0a306407e6bb7376c95b9acb7b84d0634018d91a","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-06-10T18:17:37Z","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":29086,"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":128,"forks":13,"open_issues":128,"watchers":19,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/578"},"html":{"href":"https://github.com/ganga-devs/ganga/pull/578"},"issue":{"href":"https://api.github.com/repos/ganga-devs/ganga/issues/578"},"comments":{"href":"https://api.github.com/repos/ganga-devs/ganga/issues/578/comments"},"review_comments":{"href":"https://api.github.com/repos/ganga-devs/ganga/pulls/578/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/578/commits"},"statuses":{"href":"https://api.github.com/repos/ganga-devs/ganga/statuses/ab5b587a8bd45a38511ce2a8ab711a4f00dd2e35"}}}}
{"actor":{"display_login":"milliams"}}