{"action":"created","comment":{"url":"https://api.github.com/repos/dmwm/CRABServer/pulls/comments/47789388","id":47789388,"diff_hunk":"@@ -170,51 +182,167 @@ def _compactLumis(datasetInfo):\n             return lumilist\n \n         res = {}\n-        self.logger.info(\"About to compute report of workflow: %s with usedbs=%s. Getting status first.\" % (workflow, usedbs))\n-        statusRes = self.status(workflow, userdn)[0]\n \n-        #get the information we need from the taskdb/initilize variables\n+        ## Get the information we need from the Task DB.\n         row = next(self.api.query(None, None, self.Task.ID_sql, taskname = workflow))\n         row = self.Task.ID_tuple(*row)\n+        userWebDirURL = row.user_webdir\n         inputDataset = row.input_dataset\n-        outputDatasets = literal_eval(row.output_dataset.read() if row.output_dataset else 'None')\n         dbsUrl = row.dbs_url\n-\n-        #load the lumimask\n+        outputDatasets = literal_eval(row.output_dataset.read() if row.output_dataset else '[]')\n+        publication = True if row.publication == 'T' else False\n         splitArgs = literal_eval(row.split_args.read())\n+        res['publication'] = publication\n+\n+        ## Get the jobs status first.\n+        self.logger.info(\"About to compute report of workflow %s. Getting status first.\" % (workflow))\n+        statusRes = self.status(workflow, userdn)[0]\n+        statusPerJob = {}\n+        for status, jobid in statusRes['jobList']:\n+            statusPerJob[str(jobid)] = status\n+        res['statusPerJob'] = statusPerJob\n+        numJobs = len(statusPerJob)\n+\n+        ## What the input dataset had in DBS when the task was submitted\n+        ## -------------------------------------------------------------\n+        ## Get the lumis (and the lumis split across files) in the input dataset. Files\n+        ## containing this information were created at data discovery time and then\n+        ## copied to the schedd.\n+        res['inputDataset'] = {'lumis': {}, 'duplicateLumis': {}}\n+        if inputDataset:\n+            curl = self.prepareCurl()\n+            fp = tempfile.TemporaryFile()\n+            curl.setopt(pycurl.WRITEFUNCTION, fp.write)\n+            hbuf = StringIO.StringIO()\n+            curl.setopt(pycurl.HEADERFUNCTION, hbuf.write)\n+            try:\n+                ## Retrieve the lumis in the input dataset.\n+                url = userWebDirURL + \"/input_dataset_lumis.json\"\n+                curl.setopt(pycurl.URL, url)\n+                self.myPerform(curl, url)\n+                header = ResponseHeader(hbuf.getvalue())\n+                if header.status == 200:\n+                    fp.seek(0)\n+                    res['inputDataset']['lumis'] = json.load(fp)\n+                else:\n+                    self.logger.error(\"Failed to retrieve input dataset lumis.\")\n+                ## Clean temp file and buffer.\n+                fp.seek(0); fp.truncate(0); hbuf.truncate(0)\n+                ## Retrieve the lumis split across files in the input dataset.\n+                url = userWebDirURL + \"/input_dataset_duplicate_lumis.json\"\n+                curl.setopt(pycurl.URL, url)\n+                self.myPerform(curl, url)\n+                header = ResponseHeader(hbuf.getvalue())\n+                if header.status == 200:\n+                    fp.seek(0)\n+                    res['inputDataset']['duplicateLumis'] = json.load(fp)\n+                else:\n+                    self.logger.error(\"Failed to retrieve input dataset duplicate lumis.\")\n+            finally:\n+                fp.close()\n+                hbuf.close()\n+\n+        ## The filter of lumi-mask, run-range\n+        ## ----------------------------------\n+        ## Build a lumi-mask from the splitting arguments in the Task DB. This lumi-mask\n+        ## is equal to: user lumi-mask AND user run-range.\n         res['lumiMask'] = buildLumiMask(splitArgs['runs'], splitArgs['lumis'])\n-        self.logger.info(\"Lumi mask was: %s\" % res['lumiMask'])\n \n-        #extract the finished jobs from filemetadata\n-        jobids = [x[1] for x in statusRes['jobList'] if x[0] in ['finished']]\n-        rows = self.api.query(None, None, self.FileMetaData.GetFromTaskAndType_sql, filetype='EDM,TFILE,POOLIN', taskname=workflow)\n+        ## What each job was requested to process\n+        ## --------------------------------------\n+        ## Get the lumis to process by each job in the workflow.\n+        res['lumisToProcess'] = {}\n+        curl = self.prepareCurl()\n+        fp = tempfile.NamedTemporaryFile()\n+        curl.setopt(pycurl.WRITEFUNCTION, fp.write)\n+        hbuf = StringIO.StringIO()\n+        curl.setopt(pycurl.HEADERFUNCTION, hbuf.write)\n+        try:\n+            url = userWebDirURL + \"/run_and_lumis.tar.gz\"\n+            curl.setopt(pycurl.URL, url)\n+            self.myPerform(curl, url)\n+            header = ResponseHeader(hbuf.getvalue())\n+            if header.status == 200:\n+                fp.seek(0)\n+                tarball = tarfile.open(fp.name)\n+                for jobid in xrange(1, numJobs+1):\n+                    filename = \"job_lumis_%d.json\" % (jobid)\n+                    try:\n+                        member = tarball.getmember(filename)\n+                    except KeyError:\n+                        self.logger.warning(\"File %s not found in run_and_lumis.tar.gz\" % (filename))\n+                    else:\n+                        fd = tarball.extractfile(member)\n+                        res['lumisToProcess'][str(jobid)] = json.load(fd)\n+                        fd.close()\n+                tarball.close()\n+        finally:\n+            fp.close()\n+            hbuf.close()\n \n+        ## What each job has processed\n+        ## ---------------------------\n+        ## Retrieve the filemetadata of output and input files. (The filemetadata are\n+        ## uploaded by the post-job after stageout has finished for all output and log\n+        ## files in the job.)\n+        rows = self.api.query(None, None, self.FileMetaData.GetFromTaskAndType_sql, filetype='EDM,TFILE,FAKE,POOLIN', taskname=workflow)\n+        ## Extract from the filemetadata the necessary information. \n         res['runsAndLumis'] = {}\n         for row in rows:\n-            if row[GetFromTaskAndType.PANDAID] in jobids:\n-                if str(row[GetFromTaskAndType.PANDAID]) not in res['runsAndLumis']:\n-                    res['runsAndLumis'][str(row[GetFromTaskAndType.PANDAID])] = []\n-                res['runsAndLumis'][str(row[GetFromTaskAndType.PANDAID])].append( { 'parents': row[GetFromTaskAndType.PARENTS].read(),\n-                        'runlumi': row[GetFromTaskAndType.RUNLUMI].read(),\n-                        'events': row[GetFromTaskAndType.INEVENTS],\n-                        'type': row[GetFromTaskAndType.TYPE],\n-                        'lfn': row[GetFromTaskAndType.LFN],\n-                })\n-        self.logger.info(\"Got %s edm files for workflow %s\" % (len(res['runsAndLumis']), workflow))\n-\n-        if usedbs:\n-            if not outputDatasets:\n-                raise ExecutionError(\"Cannot find any information about the output datasets names. You can try to execute 'crab report' with --dbs=no\")\n+            jobidstr = str(row[GetFromTaskAndType.PANDAID])\n+            if statusPerJob.get(jobidstr) in ['finished']:\n+                if jobidstr not in res['runsAndLumis']:\n+                    res['runsAndLumis'][jobidstr] = []\n+                res['runsAndLumis'][jobidstr].append({'parents': row[GetFromTaskAndType.PARENTS].read(),\n+                                                      'runlumi': row[GetFromTaskAndType.RUNLUMI].read(),\n+                                                      'events': row[GetFromTaskAndType.INEVENTS],\n+                                                      'type': row[GetFromTaskAndType.TYPE],\n+                                                      'lfn': row[GetFromTaskAndType.LFN],\n+                                                     })\n+        self.logger.info(\"Got %s EDM,TFILE,FAKE,POOLIN filemetadata for workflow %s\" % (len(res['runsAndLumis']), workflow))\n+\n+        ## What has been published\n+        ## -----------------------\n+        ## Get the lumis and number of events in the published output datasets.\n+        res['outputDatasets'] = {}\n+        if publication:\n+            for outputDataset in outputDatasets:\n+                res['outputDatasets'][outputDataset] = {'lumis': {}, 'numEvents': 0}\n+                try:\n+                    dbs = DBSReader(\"https://cmsweb.cern.ch/dbs/prod/phys03/DBSReader\") #We can only publish here with DBS3\n+                    outputDatasetDetails = dbs.listDatasetFileDetails(outputDataset)\n+                except Exception as ex:\n+                    msg  = \"Failed to retrieve information from DBS for output dataset %s.\" % (outputDataset)\n+\t\t    msg += \" Exception while contacting DBS: %s\" % (str(ex))","path":"src/python/CRABInterface/HTCondorDataWorkflow.py","position":208,"original_position":208,"commit_id":"6a9abf3ed69d7057a802ec57e3b3a55f30055ea6","original_commit_id":"6a9abf3ed69d7057a802ec57e3b3a55f30055ea6","user":{"login":"mmascher","id":1586246,"avatar_url":"https://avatars.githubusercontent.com/u/1586246?v=3","gravatar_id":"","url":"https://api.github.com/users/mmascher","html_url":"https://github.com/mmascher","followers_url":"https://api.github.com/users/mmascher/followers","following_url":"https://api.github.com/users/mmascher/following{/other_user}","gists_url":"https://api.github.com/users/mmascher/gists{/gist_id}","starred_url":"https://api.github.com/users/mmascher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mmascher/subscriptions","organizations_url":"https://api.github.com/users/mmascher/orgs","repos_url":"https://api.github.com/users/mmascher/repos","events_url":"https://api.github.com/users/mmascher/events{/privacy}","received_events_url":"https://api.github.com/users/mmascher/received_events","type":"User","site_admin":false},"body":"indentation","created_at":"2015-12-16T15:28:58Z","updated_at":"2015-12-16T15:28:58Z","html_url":"https://github.com/dmwm/CRABServer/pull/5046#discussion_r47789388","pull_request_url":"https://api.github.com/repos/dmwm/CRABServer/pulls/5046","_links":{"self":{"href":"https://api.github.com/repos/dmwm/CRABServer/pulls/comments/47789388"},"html":{"href":"https://github.com/dmwm/CRABServer/pull/5046#discussion_r47789388"},"pull_request":{"href":"https://api.github.com/repos/dmwm/CRABServer/pulls/5046"}}},"pull_request":{"url":"https://api.github.com/repos/dmwm/CRABServer/pulls/5046","id":48515760,"html_url":"https://github.com/dmwm/CRABServer/pull/5046","diff_url":"https://github.com/dmwm/CRABServer/pull/5046.diff","patch_url":"https://github.com/dmwm/CRABServer/pull/5046.patch","issue_url":"https://api.github.com/repos/dmwm/CRABServer/issues/5046","number":5046,"state":"open","locked":false,"title":"Save input dataset lumis from DBS data discovery to file in schedd.","user":{"login":"AndresTanasijczuk","id":6575844,"avatar_url":"https://avatars.githubusercontent.com/u/6575844?v=3","gravatar_id":"","url":"https://api.github.com/users/AndresTanasijczuk","html_url":"https://github.com/AndresTanasijczuk","followers_url":"https://api.github.com/users/AndresTanasijczuk/followers","following_url":"https://api.github.com/users/AndresTanasijczuk/following{/other_user}","gists_url":"https://api.github.com/users/AndresTanasijczuk/gists{/gist_id}","starred_url":"https://api.github.com/users/AndresTanasijczuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndresTanasijczuk/subscriptions","organizations_url":"https://api.github.com/users/AndresTanasijczuk/orgs","repos_url":"https://api.github.com/users/AndresTanasijczuk/repos","events_url":"https://api.github.com/users/AndresTanasijczuk/events{/privacy}","received_events_url":"https://api.github.com/users/AndresTanasijczuk/received_events","type":"User","site_admin":false},"body":"The information contained in these files will be needed for the fixes in the report (https://github.com/dmwm/CRABClient/issues/4522).\r\nIf possible, I would like to have this PR included in the November release, so that in the next release (i.e. February) when the changes are implemented to the report, these files are already there for all tasks (simplifies life to not have to care about backward compatibility).\r\n\r\nNote that this PR includes also the change made in https://github.com/dmwm/CRABServer/pull/5045","created_at":"2015-10-22T21:30:46Z","updated_at":"2015-12-16T15:28:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3229c2c173190be81df3756518a586308a95991b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dmwm/CRABServer/pulls/5046/commits","review_comments_url":"https://api.github.com/repos/dmwm/CRABServer/pulls/5046/comments","review_comment_url":"https://api.github.com/repos/dmwm/CRABServer/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dmwm/CRABServer/issues/5046/comments","statuses_url":"https://api.github.com/repos/dmwm/CRABServer/statuses/6a9abf3ed69d7057a802ec57e3b3a55f30055ea6","head":{"label":"AndresTanasijczuk:filesForReport","ref":"filesForReport","sha":"6a9abf3ed69d7057a802ec57e3b3a55f30055ea6","user":{"login":"AndresTanasijczuk","id":6575844,"avatar_url":"https://avatars.githubusercontent.com/u/6575844?v=3","gravatar_id":"","url":"https://api.github.com/users/AndresTanasijczuk","html_url":"https://github.com/AndresTanasijczuk","followers_url":"https://api.github.com/users/AndresTanasijczuk/followers","following_url":"https://api.github.com/users/AndresTanasijczuk/following{/other_user}","gists_url":"https://api.github.com/users/AndresTanasijczuk/gists{/gist_id}","starred_url":"https://api.github.com/users/AndresTanasijczuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndresTanasijczuk/subscriptions","organizations_url":"https://api.github.com/users/AndresTanasijczuk/orgs","repos_url":"https://api.github.com/users/AndresTanasijczuk/repos","events_url":"https://api.github.com/users/AndresTanasijczuk/events{/privacy}","received_events_url":"https://api.github.com/users/AndresTanasijczuk/received_events","type":"User","site_admin":false},"repo":{"id":41291429,"name":"CRABServer","full_name":"AndresTanasijczuk/CRABServer","owner":{"login":"AndresTanasijczuk","id":6575844,"avatar_url":"https://avatars.githubusercontent.com/u/6575844?v=3","gravatar_id":"","url":"https://api.github.com/users/AndresTanasijczuk","html_url":"https://github.com/AndresTanasijczuk","followers_url":"https://api.github.com/users/AndresTanasijczuk/followers","following_url":"https://api.github.com/users/AndresTanasijczuk/following{/other_user}","gists_url":"https://api.github.com/users/AndresTanasijczuk/gists{/gist_id}","starred_url":"https://api.github.com/users/AndresTanasijczuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndresTanasijczuk/subscriptions","organizations_url":"https://api.github.com/users/AndresTanasijczuk/orgs","repos_url":"https://api.github.com/users/AndresTanasijczuk/repos","events_url":"https://api.github.com/users/AndresTanasijczuk/events{/privacy}","received_events_url":"https://api.github.com/users/AndresTanasijczuk/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AndresTanasijczuk/CRABServer","description":"","fork":true,"url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer","forks_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/forks","keys_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/teams","hooks_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/hooks","issue_events_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/issues/events{/number}","events_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/events","assignees_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/assignees{/user}","branches_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/branches{/branch}","tags_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/tags","blobs_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/git/refs{/sha}","trees_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/statuses/{sha}","languages_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/languages","stargazers_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/stargazers","contributors_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/contributors","subscribers_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/subscribers","subscription_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/subscription","commits_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/commits{/sha}","git_commits_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/git/commits{/sha}","comments_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/comments{/number}","issue_comment_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/issues/comments{/number}","contents_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/contents/{+path}","compare_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/merges","archive_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/downloads","issues_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/issues{/number}","pulls_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/pulls{/number}","milestones_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/milestones{/number}","notifications_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/labels{/name}","releases_url":"https://api.github.com/repos/AndresTanasijczuk/CRABServer/releases{/id}","created_at":"2015-08-24T08:28:18Z","updated_at":"2015-08-24T08:28:19Z","pushed_at":"2015-12-15T14:30:35Z","git_url":"git://github.com/AndresTanasijczuk/CRABServer.git","ssh_url":"git@github.com:AndresTanasijczuk/CRABServer.git","clone_url":"https://github.com/AndresTanasijczuk/CRABServer.git","svn_url":"https://github.com/AndresTanasijczuk/CRABServer","homepage":null,"size":12387,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"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":"dmwm:master","ref":"master","sha":"4dd6764a85c6fd43a49618dd7e26ea486546eb2d","user":{"login":"dmwm","id":988897,"avatar_url":"https://avatars.githubusercontent.com/u/988897?v=3","gravatar_id":"","url":"https://api.github.com/users/dmwm","html_url":"https://github.com/dmwm","followers_url":"https://api.github.com/users/dmwm/followers","following_url":"https://api.github.com/users/dmwm/following{/other_user}","gists_url":"https://api.github.com/users/dmwm/gists{/gist_id}","starred_url":"https://api.github.com/users/dmwm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmwm/subscriptions","organizations_url":"https://api.github.com/users/dmwm/orgs","repos_url":"https://api.github.com/users/dmwm/repos","events_url":"https://api.github.com/users/dmwm/events{/privacy}","received_events_url":"https://api.github.com/users/dmwm/received_events","type":"Organization","site_admin":false},"repo":{"id":4423776,"name":"CRABServer","full_name":"dmwm/CRABServer","owner":{"login":"dmwm","id":988897,"avatar_url":"https://avatars.githubusercontent.com/u/988897?v=3","gravatar_id":"","url":"https://api.github.com/users/dmwm","html_url":"https://github.com/dmwm","followers_url":"https://api.github.com/users/dmwm/followers","following_url":"https://api.github.com/users/dmwm/following{/other_user}","gists_url":"https://api.github.com/users/dmwm/gists{/gist_id}","starred_url":"https://api.github.com/users/dmwm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmwm/subscriptions","organizations_url":"https://api.github.com/users/dmwm/orgs","repos_url":"https://api.github.com/users/dmwm/repos","events_url":"https://api.github.com/users/dmwm/events{/privacy}","received_events_url":"https://api.github.com/users/dmwm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dmwm/CRABServer","description":"","fork":false,"url":"https://api.github.com/repos/dmwm/CRABServer","forks_url":"https://api.github.com/repos/dmwm/CRABServer/forks","keys_url":"https://api.github.com/repos/dmwm/CRABServer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dmwm/CRABServer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dmwm/CRABServer/teams","hooks_url":"https://api.github.com/repos/dmwm/CRABServer/hooks","issue_events_url":"https://api.github.com/repos/dmwm/CRABServer/issues/events{/number}","events_url":"https://api.github.com/repos/dmwm/CRABServer/events","assignees_url":"https://api.github.com/repos/dmwm/CRABServer/assignees{/user}","branches_url":"https://api.github.com/repos/dmwm/CRABServer/branches{/branch}","tags_url":"https://api.github.com/repos/dmwm/CRABServer/tags","blobs_url":"https://api.github.com/repos/dmwm/CRABServer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dmwm/CRABServer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dmwm/CRABServer/git/refs{/sha}","trees_url":"https://api.github.com/repos/dmwm/CRABServer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dmwm/CRABServer/statuses/{sha}","languages_url":"https://api.github.com/repos/dmwm/CRABServer/languages","stargazers_url":"https://api.github.com/repos/dmwm/CRABServer/stargazers","contributors_url":"https://api.github.com/repos/dmwm/CRABServer/contributors","subscribers_url":"https://api.github.com/repos/dmwm/CRABServer/subscribers","subscription_url":"https://api.github.com/repos/dmwm/CRABServer/subscription","commits_url":"https://api.github.com/repos/dmwm/CRABServer/commits{/sha}","git_commits_url":"https://api.github.com/repos/dmwm/CRABServer/git/commits{/sha}","comments_url":"https://api.github.com/repos/dmwm/CRABServer/comments{/number}","issue_comment_url":"https://api.github.com/repos/dmwm/CRABServer/issues/comments{/number}","contents_url":"https://api.github.com/repos/dmwm/CRABServer/contents/{+path}","compare_url":"https://api.github.com/repos/dmwm/CRABServer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dmwm/CRABServer/merges","archive_url":"https://api.github.com/repos/dmwm/CRABServer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dmwm/CRABServer/downloads","issues_url":"https://api.github.com/repos/dmwm/CRABServer/issues{/number}","pulls_url":"https://api.github.com/repos/dmwm/CRABServer/pulls{/number}","milestones_url":"https://api.github.com/repos/dmwm/CRABServer/milestones{/number}","notifications_url":"https://api.github.com/repos/dmwm/CRABServer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dmwm/CRABServer/labels{/name}","releases_url":"https://api.github.com/repos/dmwm/CRABServer/releases{/id}","created_at":"2012-05-23T18:31:37Z","updated_at":"2015-08-03T10:17:27Z","pushed_at":"2015-12-16T13:05:26Z","git_url":"git://github.com/dmwm/CRABServer.git","ssh_url":"git@github.com:dmwm/CRABServer.git","clone_url":"https://github.com/dmwm/CRABServer.git","svn_url":"https://github.com/dmwm/CRABServer","homepage":null,"size":12845,"stargazers_count":8,"watchers_count":8,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":21,"mirror_url":null,"open_issues_count":141,"forks":21,"open_issues":141,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dmwm/CRABServer/pulls/5046"},"html":{"href":"https://github.com/dmwm/CRABServer/pull/5046"},"issue":{"href":"https://api.github.com/repos/dmwm/CRABServer/issues/5046"},"comments":{"href":"https://api.github.com/repos/dmwm/CRABServer/issues/5046/comments"},"review_comments":{"href":"https://api.github.com/repos/dmwm/CRABServer/pulls/5046/comments"},"review_comment":{"href":"https://api.github.com/repos/dmwm/CRABServer/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dmwm/CRABServer/pulls/5046/commits"},"statuses":{"href":"https://api.github.com/repos/dmwm/CRABServer/statuses/6a9abf3ed69d7057a802ec57e3b3a55f30055ea6"}}}}