{"action":"created","comment":{"url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/comments/36070447","id":36070447,"diff_hunk":"@@ -0,0 +1,219 @@\n+#!/nfs/soft/python/python-2.7.5-sl6_amd64_gcc44/bin/python\n+\n+import argparse\n+import os\n+import sys\n+import subprocess\n+import tarfile\n+import contextlib\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+from SAMADhi import Dataset, Sample, DbStore\n+import das_import\n+from userPrompt import confirm\n+# import CRAB3 stuff\n+from CRABAPI.RawCommand import crabCommand\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',\n+                        help='CRAB3 configuration file (including .py extension).')\n+    options = parser.parse_args()\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):\n+    dbstore = DbStore()\n+    resultset = dbstore.find(Dataset, Dataset.name==inputDataset)\n+    return list(resultset.values(Dataset.name, Dataset.dataset_id, Dataset.nevents))\n+\n+def getGitTagBranchUrl(gitCallPath):\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'], cwd = gitCallPath, stdout=subprocess.PIPE)\n+    gitHash = proc.stdout.read().strip('\\n')\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+    # 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+    if( 'upstream' in branch ):\n+        url = \"https://github.com/\" + remoteUpstream + \"/\" + repoUpstream + \"/tree/\" + gitHash\n+    elif( 'origin' in branch ):\n+        url = \"https://github.com/\" + remoteOrigin + \"/\" + repoOrigin + \"/tree/\" + gitHash\n+        # FIXME: advertize you should consider a pull request?\n+#        branches = [x.strip().split('/')[-1] for x in branch.strip().split('\\n') if 'HEAD' not in x and 'master' not in x and 'origin' in x]\n+#        print \"WARNING: please consider merging your changes to upstream by opening a pull request, for example:\"\n+#        print \"\\thttps://github.com/cp3-llbb/Framework/compare/master...\" + githubUser + \":\" + branches[0] + \"?expand=1\"\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, branch, url\n+\n+def add_sample(NAME, localpath, type, dataset_nevents, nselected, AnaUrl, FWUrl, dataset_id):\n+    # Large part of this imported from SAMADhi add_sample.py\n+    sample = Sample(unicode(NAME), unicode(localpath), unicode(type), dataset_nevents) \n+    sample.nevents = nselected\n+#    sample.normalization\n+#    sample.luminosity # FIXME: figure out the fix for data whenever the tools will stabilize and be on cvmfs\n+    sample.code_version = unicode(AnaUrl) #NB: limited to 255 characters, but so far so good\n+    sample.user_comment = unicode(FWUrl)\n+    sample.source_dataset_id = dataset_id\n+#    sample.source_sample_id = None\n+#    sample.author = \n+#    sample.creation_time = \n+    # connect to the MySQL database using default credentials\n+    dbstore = DbStore()\n+    # check that source dataset exist\n+    if dbstore.find(Dataset,Dataset.dataset_id==sample.source_dataset_id).is_empty():\n+        raise IndexError(\"No dataset with such index: %d\"%sample.source_dataset_id)\n+    # check that there is no existing entry\n+    checkExisting = dbstore.find(Sample,Sample.name==sample.name)\n+    if checkExisting.is_empty():\n+      print sample\n+      if confirm(prompt=\"Insert into the database?\", resp=True):\n+        dbstore.add(sample)\n+        # compute the luminosity, if possible\n+        if sample.luminosity is None:\n+          dbstore.flush()\n+          sample.luminosity = sample.getLuminosity()\n+    else:\n+      existing = checkExisting.one()\n+      prompt  = \"Replace existing \"\n+      prompt += str(existing)\n+      prompt += \"\\nby new \"\n+      prompt += str(sample)\n+      prompt += \"\\n?\"\n+      if confirm(prompt, resp=False):\n+        existing.replaceBy(sample)\n+        if existing.luminosity is None:\n+          dbstore.flush()\n+          existing.luminosity = existing.getLuminosity()\n+    # commit\n+    dbstore.commit()\n+\n+\n+def main():\n+    options = get_options()\n+    ingridStoragePrefix = \"/storage/data/cms\"\n+\n+    print \"##### Get information out of the crab config file (work area, dataset, pset)\"\n+    module = load_file(options.CrabConfig)\n+    workArea = module.config.General.workArea\n+    requestName = module.config.General.requestName\n+    psetName = module.config.JobType.psetName\n+    inputDataset = unicode(module.config.Data.inputDataset)\n+    \n+    print \"##### Check the dataset exists in the database\"\n+    # if yes then grab its ID\n+    # if not then run das_import.py to add it\n+    values = get_dataset(inputDataset)\n+    if( len(values) == 0 ):\n+        tmp_sysargv = sys.argv\n+        sys.argv = [\"das_import.py\", inputDataset]\n+        das_import.main()\n+        sys.argv = tmp_sysargv\n+        values = get_dataset(inputDataset)\n+    # if there is more than one sample then we're in trouble, crash here\n+    assert( len(values) == 1 )\n+    dataset_name, dataset_id, dataset_nevents = values[0]\n+    \n+    print \"##### Get info from crab (logs, outputs, report)\"\n+    taskdir = os.path.join(workArea, 'crab_' + requestName)\n+    # list logs\n+    log_files = crabCommand('getlog', '--dump', dir = taskdir )\n+    # list output\n+    output_files = crabCommand('getoutput', '--dump', dir = taskdir )\n+    # get crab report\n+    report = crabCommand('report', dir = taskdir )\n+#    print report\n+\n+    print \"##### Check the job processed the whole sample\"\n+    # FIXME: should it rather be just a warning ? Will likely be problematic at some point for big samples\n+    # FIXME: if changing to a warning, be careful what you actually insert in the DB\n+    assert( dataset_nevents == report['eventsRead'] )\n+\n+    print \"##### Figure out the code(s) version\"\n+    # first the version of the framework\n+    FWHash, FWBranch, FWUrl = getGitTagBranchUrl( os.path.join(CMSSW_BASE, 'src/cp3_llbb/Framework') )\n+    # then the version of the analyzer\n+    AnaHash, AnaBranch, AnaUrl = getGitTagBranchUrl( os.path.dirname( psetName ) )\n+\n+    print \"##### Figure out the number of selected events\"\n+    # Need to get this from the output log of the jobs, and sum them all\n+#    log_files = {'lfn': ['/store/user/obondu/GluGluToRadionToHHTo2B2VTo2L2Nu_M-260_narrow_13TeV-madgraph/GluGluToRadionToHHTo2B2VTo2L2Nu_M-260_narrow_Asympt25ns/150728_092137/0000/log/cmsRun_1.log.tar.gz'], 'pfn': ['srm://ingrid-se02.cism.ucl.ac.be:8444/srm/managerv2?SFN=/storage/data/cms/store/user/obondu/GluGluToRadionToHHTo2B2VTo2L2Nu_M-260_narrow_13TeV-madgraph/GluGluToRadionToHHTo2B2VTo2L2Nu_M-260_narrow_Asympt25ns/150728_092137/0000/log/cmsRun_1.log.tar.gz']}\n+    nselected = 0\n+    for lfn in log_files['lfn']:\n+        tarLog =  ingridStoragePrefix + lfn\n+        with tarfile.open(tarLog) as tar:\n+            for tarFile in tar.getmembers():\n+                if 'stdout' not in tarFile.name:\n+                    continue\n+                # For some reason, even though we are using python 2.7, the with statement here seems broken... Using contextlib to handle the file opening / reading cleanly\n+                with contextlib.closing(tar.extractfile(tarFile)) as file:\n+                    for line in file:\n+                        if 'processed' not in line and 'selected' not in line:\n+                            continue\n+                        l = line.split()\n+                        nselected  += int(line.split()[3])\n+#    print nselected\n+\n+    print \"##### For the path, check that the files there do correspond EXACTLY to the list of output files from crab\"\n+    # (crab being crab, we're never too careful!)\n+#    output_files = {'lfn': ['/store/user/obondu/GluGluToRadionToHHTo2B2VTo2L2Nu_M-260_narrow_13TeV-madgraph/GluGluToRadionToHHTo2B2VTo2L2Nu_M-260_narrow_Asympt25ns/150728_092137/0000/output_mc_1.root'], 'pfn': ['srm://ingrid-se02.cism.ucl.ac.be:8444/srm/managerv2?SFN=/storage/data/cms/store/user/obondu/GluGluToRadionToHHTo2B2VTo2L2Nu_M-260_narrow_13TeV-madgraph/GluGluToRadionToHHTo2B2VTo2L2Nu_M-260_narrow_Asympt25ns/150728_092137/0000/output_mc_1.root']}\n+    # first check what we do have locally\n+    p = os.path.dirname( output_files['lfn'][0] )\n+    localpath = ingridStoragePrefix + p\n+    localfiles = [ os.path.join(p, f) for f in os.listdir(localpath) if os.path.isfile( os.path.join(localpath, f) ) and 'root' in f ]\n+    # unordered comparison: the two list should be equal\n+    if set(localfiles) != set(output_files['lfn']):\n+        print \"ERROR: the content of the path and the list of crab outputs are different, abort now!\"\n+        print \"localfiles (what's here locally)= \", localfiles\n+        print \"outputfiles (what crab is saying)= \", output_files['lfn']\n+        raise AssertionError(\"CRAB3 and local list of files do not match\")","path":"scripts/runPostCrab.py","position":197,"original_position":197,"commit_id":"49f88df312964b5e72b84bb43ef9e7f18e65f734","original_commit_id":"49f88df312964b5e72b84bb43ef9e7f18e65f734","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":"Ah ok ... Well I guess it'd be better to store a list of files instead of a directory into the database but in the mean time this'll fine.\r\n\r\nI was mostly about my crab2 experience. It's good to see they seem to have changed how failed jobs are treated :smile: ","created_at":"2015-08-03T09:49:18Z","updated_at":"2015-08-03T09:49:18Z","html_url":"https://github.com/cp3-llbb/GridIn/pull/6#discussion_r36070447","pull_request_url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/6","_links":{"self":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/comments/36070447"},"html":{"href":"https://github.com/cp3-llbb/GridIn/pull/6#discussion_r36070447"},"pull_request":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/6"}}},"pull_request":{"url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/6","id":41356006,"html_url":"https://github.com/cp3-llbb/GridIn/pull/6","diff_url":"https://github.com/cp3-llbb/GridIn/pull/6.diff","patch_url":"https://github.com/cp3-llbb/GridIn/pull/6.patch","issue_url":"https://api.github.com/repos/cp3-llbb/GridIn/issues/6","number":6,"state":"open","locked":false,"title":"Setup SAMADhi","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":"Automatic script putting the sample of the framework output in the database\r\n\r\n@delaere : currently I put https://github.com/cp3-llbb/GridIn/compare/cp3-llbb:master...OlivierBondu:setup_SAMADhi?expand=1#diff-b975cf591369e83050619b4cba81fad1R183, but due to https://github.com/delaere/SAMADhi/blob/292dd4fb8ec09ed3547cf48cecd2385172e553fd/scripts/add_sample.py#L108-L109 it is generating a lot of output.... Do you have an idea of a work-around without breaking the functionality ?","created_at":"2015-07-31T16:20:49Z","updated_at":"2015-08-03T09:49:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a0f1ffb04d96d6c16c0a5b1a5ed50e3ac3566dcb","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/6/commits","review_comments_url":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/6/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/6/comments","statuses_url":"https://api.github.com/repos/cp3-llbb/GridIn/statuses/49f88df312964b5e72b84bb43ef9e7f18e65f734","head":{"label":"OlivierBondu:setup_SAMADhi","ref":"setup_SAMADhi","sha":"49f88df312964b5e72b84bb43ef9e7f18e65f734","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}","created_at":"2015-06-26T09:37:41Z","updated_at":"2015-06-26T09:37:42Z","pushed_at":"2015-08-03T08:28:33Z","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":114,"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":"604fed66bf41e38fe0176c0ad6f89864a48f218f","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 ExTreeAnalyzer 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}","created_at":"2015-06-18T10:02:17Z","updated_at":"2015-06-22T14:25:05Z","pushed_at":"2015-08-03T08:28:34Z","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":null,"size":191,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":3,"forks":1,"open_issues":3,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/6"},"html":{"href":"https://github.com/cp3-llbb/GridIn/pull/6"},"issue":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/issues/6"},"comments":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/issues/6/comments"},"review_comments":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/pulls/6/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/6/commits"},"statuses":{"href":"https://api.github.com/repos/cp3-llbb/GridIn/statuses/49f88df312964b5e72b84bb43ef9e7f18e65f734"}}}}