{"action":"created","comment":{"url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/comments/53309873","id":53309873,"diff_hunk":"@@ -0,0 +1,259 @@\n+#! /usr/bin/env python\n+# -*- coding: utf-8 -*-\n+\n+from __future__ import division\n+\n+import argparse\n+import os\n+import sys\n+import subprocess\n+import json\n+from pwd import getpwuid\n+\n+# import SAMADhi stuff\n+CMSSW_BASE = os.environ['CMSSW_BASE']\n+SCRAM_ARCH = os.environ['SCRAM_ARCH']\n+sys.path.append(os.path.join(CMSSW_BASE,'bin', SCRAM_ARCH))\n+\n+# Add default ingrid storm package\n+sys.path.append('/nfs/soft/python/python-2.7.5-sl6_amd64_gcc44/lib/python2.7/site-packages/storm-0.20-py2.7-linux-x86_64.egg')\n+sys.path.append('/nfs/soft/python/python-2.7.5-sl6_amd64_gcc44/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-linux-x86_64.egg')\n+\n+from SAMADhi import Dataset, Sample, File, DbStore\n+import das_import\n+\n+# import some lumi utils\n+from FWCore.PythonUtilities.LumiList import LumiList\n+# import a bit of ROOT\n+import ROOT\n+ROOT.gROOT.Reset()\n+\n+def get_options():\n+    \"\"\"\n+    Parse and return the arguments provided by the user.\n+    \"\"\"\n+    parser = argparse.ArgumentParser(description='Gather the information on a processed sample and insert the information in SAMADhi')\n+    parser.add_argument('CrabConfig', type=str, metavar='FILE', nargs='+',\n+                        help='CRAB3 configuration file (including .py extension). If several inputs they will be merged in a single SAMADhi sample.')\n+    parser.add_argument('--debug', action='store_true', help='More verbose output', dest='debug')\n+    options = parser.parse_args()\n+    if options.CrabConfig is None:\n+        parser.error('You must specify a crab task you wish to add to the database')\n+    return options\n+\n+def load_file(filename):\n+    directory, module_name = os.path.split(filename)\n+    module_name = os.path.splitext(module_name)[0]\n+    path = list(sys.path)\n+    sys.path.insert(0, directory)\n+    try:\n+        module = __import__(module_name)\n+    finally:\n+        sys.path[:] = path # restore\n+    return module\n+\n+def get_dataset(inputDataset = None, inputID = None):\n+    dbstore = DbStore()\n+    if inputDataset is not None:\n+        resultset = dbstore.find(Dataset, Dataset.name == inputDataset)\n+    elif inputID is not None:\n+        resultset = dbstore.find(Dataset, Dataset.dataset_id == inputID)\n+    return list(resultset.values(Dataset.name, Dataset.dataset_id, Dataset.nevents, Dataset.process))\n+\n+def get_sample(inputSample):\n+    dbstore = DbStore()\n+    resultset = dbstore.find(Sample, Sample.name==inputSample)\n+    return list(resultset.values(Sample.name, Sample.sample_id, Sample.source_dataset_id))\n+\n+def getGitTagRepoUrl(gitCallPath):\n+    # get the stuff needed to write a valid url: name on github, name of repo, for both origin and upstream\n+    proc = subprocess.Popen(['git', 'remote', 'show', 'origin'], cwd = gitCallPath, stdout=subprocess.PIPE)\n+    remoteOrigin = proc.stdout.read()\n+    remoteOrigin = [x.split(':')[-1].split('/') for x in remoteOrigin.split('\\n') if 'Fetch URL' in x]\n+    remoteOrigin, repoOrigin = remoteOrigin[0]\n+    repoOrigin = repoOrigin.strip('.git')\n+    proc = subprocess.Popen(['git', 'remote', 'show', 'upstream'], cwd = gitCallPath, stdout=subprocess.PIPE)\n+    remoteUpstream = proc.stdout.read()\n+    remoteUpstream = [x.split(':')[-1].split('/') for x in remoteUpstream.split('\\n') if 'Fetch URL' in x]\n+    remoteUpstream, repoUpstream = remoteUpstream[0]\n+    repoUpstream = repoUpstream.strip('.git')\n+    # get the hash of the commit\n+    # Well, note that actually it should be the tag if a tag exist, the hash is the fallback solution\n+    proc = subprocess.Popen(['git', 'describe', '--tags', '--always', '--dirty'], cwd = gitCallPath, stdout=subprocess.PIPE)\n+    gitHash = proc.stdout.read().strip('\\n')\n+    if( 'dirty' in gitHash ):\n+        raise AssertionError(\"Aborting: your working tree for repository\", repoOrigin, \"is dirty, please clean the changes not staged/committed before inserting this in the database\") \n+    # get the list of branches in which you can find the hash\n+    proc = subprocess.Popen(['git', 'branch', '-r', '--contains', gitHash], cwd = gitCallPath, stdout=subprocess.PIPE)\n+    branch = proc.stdout.read()\n+    if( 'upstream' in branch ):\n+        url = \"https://github.com/\" + remoteUpstream + \"/\" + repoUpstream + \"/tree/\" + gitHash\n+        repo = repoUpstream\n+    elif( 'origin' in branch ):\n+        url = \"https://github.com/\" + remoteOrigin + \"/\" + repoOrigin + \"/tree/\" + gitHash\n+        repo = repoOrigin\n+    elif( '/' in branch ):\n+        url = \"https://github.com/\" + branch.strip(\" \").split(\"/\")[0] + \"/\" + repoOrigin + \"/tree/\" + branch.strip(\" \").split(\"/\")[1]\n+        repo = repoOrigin\n+    else:\n+        print \"PLEASE PUSH YOUR CODE!!! this result CANNOT be reproduced / bookkept outside of your ingrid session, so there is no point into putting it in the database, ABORTING now\"\n+        raise AssertionError(\"Code from repository \" + repoUpstream + \" has not been pushed\")\n+    return gitHash, repo, url\n+\n+def add_merged_sample(NAME, type, AnaUrl, FWUrl, samples):\n+    # samples is a simple dict containing three keys: 'process', 'dataset_id', 'sample_id'\n+    dbstore = DbStore()\n+    sample = None\n+\n+    # check that source dataset exist\n+    # Skip: should exist, the check has been done before calling this function\n+\n+    # check that there is no existing entry\n+    update = False\n+    localpath = ''\n+    nevents = 0\n+    checkExisting = dbstore.find(Sample, Sample.name == unicode(NAME))\n+    if checkExisting.is_empty():\n+        sample = Sample(unicode(NAME), unicode(localpath), unicode(type), nevents)\n+    else:\n+        update = True\n+        sample = checkExisting.one()\n+        sample.removeFiles(dbstore)\n+\n+    # collecting contents\n+    sample.nevents_processed = 0\n+    sample.nevents = 0\n+    sample.normalization = 1\n+    sample.event_weight_sum = 0\n+    extras_event_weight_sum = {}\n+    dataset_nevents = 0\n+    processed_lumi = LumiList()\n+    for i, s in enumerate(samples):\n+        if i == 0:\n+            sample.source_dataset_id = s['dataset_id']\n+            sample.source_sample_id = s['sample_id']\n+        results = dbstore.find(Sample, Sample.sample_id == s['sample_id'])\n+        # Should exist, the check has been done before calling this function\n+        sample.nevents_processed += results[0].nevents_processed\n+        sample.nevents += results[0].nevents\n+        sample.event_weight_sum += results[0].event_weight_sum\n+        extra_sumw = results[0].extras_event_weight_sum\n+        if extra_sumw is not None:\n+            extra_sumw = json.loads(extra_sumw)\n+            for key in extra_sumw:\n+                try:\n+                    extras_event_weight_sum[key] += extra_sumw[key]\n+                except KeyError:\n+                    extras_event_weight_sum[key] = extra_sumw[key]\n+        tmp_processed_lumi = results[0].processed_lumi\n+        if tmp_processed_lumi is not None:\n+            tmp_processed_lumi = json.loads( tmp_processed_lumi )\n+            processed_lumi = processed_lumi | LumiList(compactList = tmp_processed_lumi)\n+        # Get info from file table\n+        results = dbstore.find(File, File.sample_id == s['sample_id'])\n+        for lfn, pfn, event_weight_sum, file_extras_event_weight_sum, nevents in list(results.values(File.lfn, File.pfn, File.event_weight_sum, File.extras_event_weight_sum, File.nevents)):\n+            f = File(lfn, pfn, event_weight_sum, file_extras_event_weight_sum, nevents)\n+            sample.files.add(f)\n+        # Get info from parent datasets\n+        results = dbstore.find(Dataset, Dataset.dataset_id == s['dataset_id'])\n+        dataset_nevents +=  results[0].nevents\n+    if len(extras_event_weight_sum) > 0:\n+        sample.extras_event_weight_sum = unicode(extras_event_weight_sum)\n+    if len(processed_lumi.getCompactList()) > 0:\n+        sample.processed_lumi = unicode(processed_lumi.getCompactList())","path":"scripts/mergeDBSamples.py","position":163,"original_position":163,"commit_id":"3de1d71d825b3c76cd7461f8f613d822eae4d710","original_commit_id":"3de1d71d825b3c76cd7461f8f613d822eae4d710","user":{"login":"blinkseb","id":386274,"avatar_url":"https://avatars.githubusercontent.com/u/386274?v=3","gravatar_id":"","url":"https://api.github.com/users/blinkseb","html_url":"https://github.com/blinkseb","followers_url":"https://api.github.com/users/blinkseb/followers","following_url":"https://api.github.com/users/blinkseb/following{/other_user}","gists_url":"https://api.github.com/users/blinkseb/gists{/gist_id}","starred_url":"https://api.github.com/users/blinkseb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blinkseb/subscriptions","organizations_url":"https://api.github.com/users/blinkseb/orgs","repos_url":"https://api.github.com/users/blinkseb/repos","events_url":"https://api.github.com/users/blinkseb/events{/privacy}","received_events_url":"https://api.github.com/users/blinkseb/received_events","type":"User","site_admin":false},"body":"This must be encoded into JSON, a python representation is not valid. It should be:\r\n\r\n```python\r\nunicode(json.dumps(processed_lumi.getCompactList()))\r\n```","created_at":"2016-02-18T12:59:18Z","updated_at":"2016-02-18T12:59:18Z","html_url":"https://github.com/cp3-llbb/GridIn/pull/70#discussion_r53309873","pull_request_url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/70","_links":{"self":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/comments/53309873"},"html":{"href":"https://github.com/cp3-llbb/GridIn/pull/70#discussion_r53309873"},"pull_request":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/70"}}},"pull_request":{"url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/70","id":59642732,"html_url":"https://github.com/cp3-llbb/GridIn/pull/70","diff_url":"https://github.com/cp3-llbb/GridIn/pull/70.diff","patch_url":"https://github.com/cp3-llbb/GridIn/pull/70.patch","issue_url":"https://api.github.com/repos/cp3-llbb/GridIn/issues/70","number":70,"state":"open","locked":false,"title":"Cleanup and extensions","user":{"login":"OlivierBondu","id":2760084,"avatar_url":"https://avatars.githubusercontent.com/u/2760084?v=3","gravatar_id":"","url":"https://api.github.com/users/OlivierBondu","html_url":"https://github.com/OlivierBondu","followers_url":"https://api.github.com/users/OlivierBondu/followers","following_url":"https://api.github.com/users/OlivierBondu/following{/other_user}","gists_url":"https://api.github.com/users/OlivierBondu/gists{/gist_id}","starred_url":"https://api.github.com/users/OlivierBondu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OlivierBondu/subscriptions","organizations_url":"https://api.github.com/users/OlivierBondu/orgs","repos_url":"https://api.github.com/users/OlivierBondu/repos","events_url":"https://api.github.com/users/OlivierBondu/events{/privacy}","received_events_url":"https://api.github.com/users/OlivierBondu/received_events","type":"User","site_admin":false},"body":"Now runPostCrab should handle injecting in the DB an 'extended' sample if you pass more than 1 config file as argument:\r\n- each crab task should preexist in the DB first, and inherit from the same process (aka: the first part of the dataset name should be the same)\r\n- the name will be of the type `process_extended_i_plus_j_tags` where `i` and `j` are the original sample IDs\r\n- the `sumw` and `nevents` are summed, an 'or' of the `processed_lumi` jsons is done\r\n\r\nThe PR also include the cleanup from the fact datasets are now bookkept in the [Datasets](https://github.com/cp3-llbb/Datasets) repo","created_at":"2016-02-17T13:23:03Z","updated_at":"2016-02-18T12:59:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3b83803471eaca0ecd0f87bb857de16ac660d6ad","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/70/commits","review_comments_url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/70/comments","review_comment_url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cp3-llbb/GridIn/issues/70/comments","statuses_url":"https://api.github.com/repos/cp3-llbb/GridIn/statuses/3de1d71d825b3c76cd7461f8f613d822eae4d710","head":{"label":"OlivierBondu:cleanup_and_extensions","ref":"cleanup_and_extensions","sha":"3de1d71d825b3c76cd7461f8f613d822eae4d710","user":{"login":"OlivierBondu","id":2760084,"avatar_url":"https://avatars.githubusercontent.com/u/2760084?v=3","gravatar_id":"","url":"https://api.github.com/users/OlivierBondu","html_url":"https://github.com/OlivierBondu","followers_url":"https://api.github.com/users/OlivierBondu/followers","following_url":"https://api.github.com/users/OlivierBondu/following{/other_user}","gists_url":"https://api.github.com/users/OlivierBondu/gists{/gist_id}","starred_url":"https://api.github.com/users/OlivierBondu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OlivierBondu/subscriptions","organizations_url":"https://api.github.com/users/OlivierBondu/orgs","repos_url":"https://api.github.com/users/OlivierBondu/repos","events_url":"https://api.github.com/users/OlivierBondu/events{/privacy}","received_events_url":"https://api.github.com/users/OlivierBondu/received_events","type":"User","site_admin":false},"repo":{"id":38103122,"name":"GridIn","full_name":"OlivierBondu/GridIn","owner":{"login":"OlivierBondu","id":2760084,"avatar_url":"https://avatars.githubusercontent.com/u/2760084?v=3","gravatar_id":"","url":"https://api.github.com/users/OlivierBondu","html_url":"https://github.com/OlivierBondu","followers_url":"https://api.github.com/users/OlivierBondu/followers","following_url":"https://api.github.com/users/OlivierBondu/following{/other_user}","gists_url":"https://api.github.com/users/OlivierBondu/gists{/gist_id}","starred_url":"https://api.github.com/users/OlivierBondu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OlivierBondu/subscriptions","organizations_url":"https://api.github.com/users/OlivierBondu/orgs","repos_url":"https://api.github.com/users/OlivierBondu/repos","events_url":"https://api.github.com/users/OlivierBondu/events{/privacy}","received_events_url":"https://api.github.com/users/OlivierBondu/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/OlivierBondu/GridIn","description":"Tools and utilities to launch ExTreeAnalyzer over the grid","fork":true,"url":"https://api.github.com/repos/OlivierBondu/GridIn","forks_url":"https://api.github.com/repos/OlivierBondu/GridIn/forks","keys_url":"https://api.github.com/repos/OlivierBondu/GridIn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OlivierBondu/GridIn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OlivierBondu/GridIn/teams","hooks_url":"https://api.github.com/repos/OlivierBondu/GridIn/hooks","issue_events_url":"https://api.github.com/repos/OlivierBondu/GridIn/issues/events{/number}","events_url":"https://api.github.com/repos/OlivierBondu/GridIn/events","assignees_url":"https://api.github.com/repos/OlivierBondu/GridIn/assignees{/user}","branches_url":"https://api.github.com/repos/OlivierBondu/GridIn/branches{/branch}","tags_url":"https://api.github.com/repos/OlivierBondu/GridIn/tags","blobs_url":"https://api.github.com/repos/OlivierBondu/GridIn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OlivierBondu/GridIn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OlivierBondu/GridIn/git/refs{/sha}","trees_url":"https://api.github.com/repos/OlivierBondu/GridIn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OlivierBondu/GridIn/statuses/{sha}","languages_url":"https://api.github.com/repos/OlivierBondu/GridIn/languages","stargazers_url":"https://api.github.com/repos/OlivierBondu/GridIn/stargazers","contributors_url":"https://api.github.com/repos/OlivierBondu/GridIn/contributors","subscribers_url":"https://api.github.com/repos/OlivierBondu/GridIn/subscribers","subscription_url":"https://api.github.com/repos/OlivierBondu/GridIn/subscription","commits_url":"https://api.github.com/repos/OlivierBondu/GridIn/commits{/sha}","git_commits_url":"https://api.github.com/repos/OlivierBondu/GridIn/git/commits{/sha}","comments_url":"https://api.github.com/repos/OlivierBondu/GridIn/comments{/number}","issue_comment_url":"https://api.github.com/repos/OlivierBondu/GridIn/issues/comments{/number}","contents_url":"https://api.github.com/repos/OlivierBondu/GridIn/contents/{+path}","compare_url":"https://api.github.com/repos/OlivierBondu/GridIn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OlivierBondu/GridIn/merges","archive_url":"https://api.github.com/repos/OlivierBondu/GridIn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OlivierBondu/GridIn/downloads","issues_url":"https://api.github.com/repos/OlivierBondu/GridIn/issues{/number}","pulls_url":"https://api.github.com/repos/OlivierBondu/GridIn/pulls{/number}","milestones_url":"https://api.github.com/repos/OlivierBondu/GridIn/milestones{/number}","notifications_url":"https://api.github.com/repos/OlivierBondu/GridIn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OlivierBondu/GridIn/labels{/name}","releases_url":"https://api.github.com/repos/OlivierBondu/GridIn/releases{/id}","deployments_url":"https://api.github.com/repos/OlivierBondu/GridIn/deployments","created_at":"2015-06-26T09:37:41Z","updated_at":"2015-06-26T09:37:42Z","pushed_at":"2016-02-17T17:38:59Z","git_url":"git://github.com/OlivierBondu/GridIn.git","ssh_url":"git@github.com:OlivierBondu/GridIn.git","clone_url":"https://github.com/OlivierBondu/GridIn.git","svn_url":"https://github.com/OlivierBondu/GridIn","homepage":null,"size":94,"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":"cp3-llbb:master","ref":"master","sha":"09ccfd42db4b0b7f5fe2c00b656aa21d9c1c7490","user":{"login":"cp3-llbb","id":12397486,"avatar_url":"https://avatars.githubusercontent.com/u/12397486?v=3","gravatar_id":"","url":"https://api.github.com/users/cp3-llbb","html_url":"https://github.com/cp3-llbb","followers_url":"https://api.github.com/users/cp3-llbb/followers","following_url":"https://api.github.com/users/cp3-llbb/following{/other_user}","gists_url":"https://api.github.com/users/cp3-llbb/gists{/gist_id}","starred_url":"https://api.github.com/users/cp3-llbb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cp3-llbb/subscriptions","organizations_url":"https://api.github.com/users/cp3-llbb/orgs","repos_url":"https://api.github.com/users/cp3-llbb/repos","events_url":"https://api.github.com/users/cp3-llbb/events{/privacy}","received_events_url":"https://api.github.com/users/cp3-llbb/received_events","type":"Organization","site_admin":false},"repo":{"id":37651906,"name":"GridIn","full_name":"cp3-llbb/GridIn","owner":{"login":"cp3-llbb","id":12397486,"avatar_url":"https://avatars.githubusercontent.com/u/12397486?v=3","gravatar_id":"","url":"https://api.github.com/users/cp3-llbb","html_url":"https://github.com/cp3-llbb","followers_url":"https://api.github.com/users/cp3-llbb/followers","following_url":"https://api.github.com/users/cp3-llbb/following{/other_user}","gists_url":"https://api.github.com/users/cp3-llbb/gists{/gist_id}","starred_url":"https://api.github.com/users/cp3-llbb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cp3-llbb/subscriptions","organizations_url":"https://api.github.com/users/cp3-llbb/orgs","repos_url":"https://api.github.com/users/cp3-llbb/repos","events_url":"https://api.github.com/users/cp3-llbb/events{/privacy}","received_events_url":"https://api.github.com/users/cp3-llbb/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cp3-llbb/GridIn","description":"Tools and utilities to launch the cp3-llbb framework over the grid","fork":false,"url":"https://api.github.com/repos/cp3-llbb/GridIn","forks_url":"https://api.github.com/repos/cp3-llbb/GridIn/forks","keys_url":"https://api.github.com/repos/cp3-llbb/GridIn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cp3-llbb/GridIn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cp3-llbb/GridIn/teams","hooks_url":"https://api.github.com/repos/cp3-llbb/GridIn/hooks","issue_events_url":"https://api.github.com/repos/cp3-llbb/GridIn/issues/events{/number}","events_url":"https://api.github.com/repos/cp3-llbb/GridIn/events","assignees_url":"https://api.github.com/repos/cp3-llbb/GridIn/assignees{/user}","branches_url":"https://api.github.com/repos/cp3-llbb/GridIn/branches{/branch}","tags_url":"https://api.github.com/repos/cp3-llbb/GridIn/tags","blobs_url":"https://api.github.com/repos/cp3-llbb/GridIn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cp3-llbb/GridIn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cp3-llbb/GridIn/git/refs{/sha}","trees_url":"https://api.github.com/repos/cp3-llbb/GridIn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cp3-llbb/GridIn/statuses/{sha}","languages_url":"https://api.github.com/repos/cp3-llbb/GridIn/languages","stargazers_url":"https://api.github.com/repos/cp3-llbb/GridIn/stargazers","contributors_url":"https://api.github.com/repos/cp3-llbb/GridIn/contributors","subscribers_url":"https://api.github.com/repos/cp3-llbb/GridIn/subscribers","subscription_url":"https://api.github.com/repos/cp3-llbb/GridIn/subscription","commits_url":"https://api.github.com/repos/cp3-llbb/GridIn/commits{/sha}","git_commits_url":"https://api.github.com/repos/cp3-llbb/GridIn/git/commits{/sha}","comments_url":"https://api.github.com/repos/cp3-llbb/GridIn/comments{/number}","issue_comment_url":"https://api.github.com/repos/cp3-llbb/GridIn/issues/comments{/number}","contents_url":"https://api.github.com/repos/cp3-llbb/GridIn/contents/{+path}","compare_url":"https://api.github.com/repos/cp3-llbb/GridIn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cp3-llbb/GridIn/merges","archive_url":"https://api.github.com/repos/cp3-llbb/GridIn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cp3-llbb/GridIn/downloads","issues_url":"https://api.github.com/repos/cp3-llbb/GridIn/issues{/number}","pulls_url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls{/number}","milestones_url":"https://api.github.com/repos/cp3-llbb/GridIn/milestones{/number}","notifications_url":"https://api.github.com/repos/cp3-llbb/GridIn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cp3-llbb/GridIn/labels{/name}","releases_url":"https://api.github.com/repos/cp3-llbb/GridIn/releases{/id}","deployments_url":"https://api.github.com/repos/cp3-llbb/GridIn/deployments","created_at":"2015-06-18T10:02:17Z","updated_at":"2016-01-11T14:21:01Z","pushed_at":"2016-02-17T17:38:59Z","git_url":"git://github.com/cp3-llbb/GridIn.git","ssh_url":"git@github.com:cp3-llbb/GridIn.git","clone_url":"https://github.com/cp3-llbb/GridIn.git","svn_url":"https://github.com/cp3-llbb/GridIn","homepage":"","size":85,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":6,"forks":7,"open_issues":6,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/70"},"html":{"href":"https://github.com/cp3-llbb/GridIn/pull/70"},"issue":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/issues/70"},"comments":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/issues/70/comments"},"review_comments":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/70/comments"},"review_comment":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/70/commits"},"statuses":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/statuses/3de1d71d825b3c76cd7461f8f613d822eae4d710"}}}}