{"action":"created","comment":{"url":"https://api.github.com/repos/ESMCI/cime/pulls/comments/68127355","id":68127355,"diff_hunk":"@@ -1,24 +1,413 @@\n+\"\"\"\n+short term archiving\n+\"\"\"\n+\n from CIME.XML.standard_module_setup import *\n from CIME.case_submit               import submit\n from CIME.case                      import Case\n+from CIME.XML.env_archive           import EnvArchive\n from CIME.utils                     import get_model, run_cmd, append_status\n+from CIME.utils                     import expect, append_status\n+from os.path                        import isfile, isdir, join\n+import shutil, glob, re\n \n logger = logging.getLogger(__name__)\n \n ###############################################################################\n+def check_run(case):\n+###############################################################################\n+\n+    logger.debug('In check_run...')\n+    dout_s_root = case.get_value('DOUT_S_ROOT')\n+    if dout_s_root is None or dout_s_root == 'UNSET':\n+        expect(False, 'XML variable DOUT_S_ROOT is required for root location of short-term achiver')\n+    if not isdir(dout_s_root):\n+        os.makedirs(dout_s_root)\n+    dout_s_save_interim = case.get_value('DOUT_S_SAVE_INTERIM_RESTART_FILES')\n+    if dout_s_save_interim == 'FALSE' or dout_s_save_interim == 'UNSET':\n+        rest_n = int(case.get_value('REST_N'))\n+        stop_n = int(case.get_value('STOP_N'))\n+        if rest_n < stop_n:\n+            logger.warn('Restart files from end of run will be saved, interim restart files will be deleted')\n+    statusFile = 'CaseStatus'\n+    runComplete = False\n+    caseroot = case.get_value('CASEROOT')\n+    if isfile(join(caseroot, statusFile)):\n+        if 'Run SUCCESSFUL' in open(join(caseroot, statusFile)).read():\n+            runComplete = True\n+    return runComplete\n+\n+\n+###############################################################################\n+def list_xml(case, archive):\n+###############################################################################\n+\n+    logger.debug('In list_xml...')\n+\n+    for archive_entry in archive.get_entries():\n+        compname,compclass = archive.get_entry_info(archive_entry)\n+\n+        if compclass != 'unset':\n+            ninst = case.get_value('NINST_' + compclass.upper())\n+        else:\n+            ninst = 1\n+        multi = ninst > 1\n+        logger.info('component name %s, component class %s ' % (compname, compclass))\n+        logger.info('  multiple-instance support = %s ' % multi)\n+        casename = case.get_value('CASE')\n+        dout_s_root = case.get_value('DOUT_S_ROOT')\n+\n+        # get file extensions suffixes\n+        file_extensions = archive.get_rest_file_extensions(archive_entry)\n+        for suffix in file_extensions:\n+            logger.info('  restart file suffix = %s ' % suffix)\n+\n+        file_extensions = archive.get_hist_file_extensions(archive_entry)\n+        for suffix in file_extensions:\n+            logger.info('  history file suffix = %s ' % suffix)\n+\n+\n+###############################################################################\n+def list_archive(dirname):\n+###############################################################################\n+\n+    logger.debug('In list_archive: %s ...' % dirname)\n+    logger.info('%s ' % dirname)\n+    if isdir(dirname):\n+        list_dirs = os.walk(dirname)\n+        for root, dirs, files in list_dirs:\n+            for f in files:\n+                print join(root, f)\n+\n+\n+###############################################################################\n+def get_datenames(case):\n+###############################################################################\n+\n+    logger.debug('In get_datename...')\n+    rundir = case.get_value('RUNDIR')\n+    expect(isdir(rundir), 'Cannot open directory %s ' % rundir)\n+    casename = case.get_value(\"CASE\")\n+    files = sorted(glob.glob(os.path.join(rundir,casename + '.cpl.r*.nc')))\n+    if not files:\n+        expect(False, 'Cannot find a %s.cpl.r.*.nc file in directory %s ' % (casename,rundir))\n+    datenames = []\n+    for filename in files:\n+        names = filename.split('.')\n+        datename = names[-2]\n+        datenames.append(datename)\n+        logger.debug('cpl dateName: %s ' % datename)\n+    return datenames\n+\n+\n+###############################################################################\n+def get_ninst_info(case, compclass):\n+###############################################################################\n+\n+    if compclass != 'cpl':\n+        ninst = case.get_value('NINST_' + compclass.upper())\n+    else:\n+        ninst = 1\n+    ninst_strings = []\n+    if ninst is None:\n+        ninst = 1\n+        for i in range(ninst):\n+            if ninst > 1:\n+                ninst_strings.append('_' + '%04d' % i)\n+            else:\n+                ninst_strings.append('')\n+\n+    logger.debug(\"ninst and ninst_strings are: %s and %s for %s\" %(ninst,ninst_strings,compclass))\n+    return ninst, ninst_strings\n+\n+           \n+###############################################################################\n+def archive_rpointer_files(case, archive, archive_entry, archive_restdir, \n+                     datename, datename_is_last):\n+###############################################################################\n+\n+    # archive the rpointer files associated with datename \n+    casename = case.get_value(\"CASE\")\n+    compname,compclass = archive.get_entry_info(archive_entry)\n+    ninst, ninst_strings = get_ninst_info(case, compclass)\n+\n+    if (datename_is_last):\n+        # Copy of all rpointer files for latest restart date\n+        rundir = case.get_value(\"RUNDIR\")\n+        rpointers = glob.glob(os.path.join(rundir,'rpointer.*'))\n+        for rpointer in rpointers:\n+            shutil.copy(rpointer,os.path.join(archive_restdir,os.path.basename(rpointer)))\n+    else:\n+        # Generate rpointer file(s) for interim restarts for the one datename and each \n+        # possible value of ninst_strings\n+        if case.get_value('DOUT_S_SAVE_INTERIM_RESTART_FILES'):\n+\n+            # parse env_archive.xml to determine the rpointer files\n+            # and contents for the given archive_entry tag\n+            rpointer_items = archive.get_rpointer_contents(archive_entry)\n+\n+            # loop through the possible rpointer files and contents\n+            for rpointer_file,rpointer_content in rpointer_items:\n+\n+                # put in a temporary setting for ninst_strings if they are empty\n+                # in order to have just one loop over ninst_strings below\n+                if rpointer_content is not 'unset':\n+                    if not ninst_strings:\n+                        ninst_strings = [\"empty\"]\n+                for ninst_string in ninst_strings:\n+                    if ninst_string == 'empty':\n+                        ninst_string = \"\"\n+                    subs = dict()\n+                    subs['$CASE'] = casename\n+                    subs['$DATENAME'] = datename\n+                    subs['$NINST_STRING'] = ninst_string\n+                    for key in subs.keys():\n+                        rpointer_file = rpointer_file.replace(key, subs[key])\n+                        rpointer_content = rpointer_content.replace(key, subs[key])\n+\n+                    # write out the respect files with the correct contents\n+                    rpointer_file = os.path.join(archive_restdir, rpointer_file)\n+                    logger.info(\"writing rpointer_file %s\" % rpointer_file)\n+                    f = open(rpointer_file,'w')\n+                    for output in rpointer_content.split(','):\n+                        f.write(\"%s \\n\" %output)\n+                    f.close()\n+\n+\n+###############################################################################\n+def archive_log_files(case):\n+###############################################################################\n+\n+    dout_s_root = case.get_value(\"DOUT_S_ROOT\")\n+    rundir = case.get_value(\"RUNDIR\")\n+    archive_logdir = os.path.join(dout_s_root, 'logs')\n+    if not os.path.exists(archive_logdir):\n+        os.makedirs(archive_logdir)\n+        logger.debug(\"created directory %s \" %archive_logdir)\n+                          \n+    logfiles = glob.glob(os.path.join(rundir,'*.log.*'))\n+    for logfile in logfiles:\n+        srcfile = join(rundir, os.path.basename(logfile))\n+        destfile = join(archive_logdir, os.path.basename(logfile))\n+        shutil.move(srcfile, destfile)\n+\n+\n+###############################################################################\n+def archive_history_files(case, archive, archive_entry,\n+                          compclass, compname, histfiles_savein_rundir):\n+###############################################################################\n+\n+    # determine history archive directory (create if it does not exist)\n+    dout_s_root = case.get_value(\"DOUT_S_ROOT\")\n+    archive_histdir = os.path.join(dout_s_root, compclass, 'hist')\n+    if not os.path.exists(archive_histdir):\n+        os.makedirs(archive_histdir)\n+        logger.debug(\"created directory %s\" %archive_histdir)\n+\n+    # determine ninst and ninst_string\n+    ninst, ninst_string = get_ninst_info(case, compclass)\n+\n+    # archive history files - the only history files that kept in the\n+    # run directory are those that are needed for restarts\n+    rundir = case.get_value(\"RUNDIR\")\n+    for suffix in archive.get_hist_file_extensions(archive_entry):\n+        for i in range(ninst):\n+            if ninst_string:\n+                newsuffix = compname + \".*\" + ninst_string[i] + suffix\n+            else:\n+                newsuffix = compname + \".*\"  + suffix\n+            logger.debug(\"short term archiving suffix is %s \" %newsuffix)\n+            p = re.compile(newsuffix)\n+            histfiles = [ f for f in os.listdir(rundir) if p.search(f) ]\n+            if histfiles:\n+                logger.debug(\"hist files are %s \" %histfiles)\n+                for histfile in histfiles:\n+                    srcfile = join(rundir, histfile)\n+                    expect(os.path.isfile(srcfile),\n+                           \"history file %s does not exist \" %srcfile)\n+                    destfile = join(archive_histdir, histfile)\n+                    if histfile in histfiles_savein_rundir:\n+                        logger.debug(\"copying %s to %s \" %(srcfile, destfile))\n+                        shutil.copy(srcfile, destfile)\n+                    else:\n+                        logger.debug(\"moving %s to %s \" %(srcfile, destfile))\n+                        shutil.move(srcfile, destfile)\n+\n+\n+###############################################################################\n+def get_histfiles_for_restarts(case, archive, archive_entry, restfile):\n+###############################################################################\n+\n+    # determine history files that are needed for restarts \n+    histfiles = []\n+    rest_hist_varname = archive.get_entry_value('rest_history_varname', archive_entry)\n+    if rest_hist_varname != 'unset':\n+        rundir = case.get_value(\"RUNDIR\")\n+        cmd = \"ncdump -v %s %s \" %(rest_hist_varname, os.path.join(rundir,restfile))\n+        rc,out,error = run_cmd(cmd, ok_to_fail=True)\n+        searchname = \"%s =\" %rest_hist_varname\n+        if searchname in out:\n+            offset = out.index(searchname)\n+            items  = out[offset:].split(\",\")\n+            for item in items:\n+                # the following match has an option of having a './' at the beginning of\n+                # the history filename\n+                matchobj = re.search(\"\\\"(\\.*\\/*\\w.*)\\s?\\\"\",item)","path":"utils/python/CIME/case_st_archive.py","position":255,"original_position":255,"commit_id":"7de153c844f63480b94ae8dc4c8f71b4f1f70ca0","original_commit_id":"7de153c844f63480b94ae8dc4c8f71b4f1f70ca0","user":{"login":"jgfouca","id":7292036,"avatar_url":"https://avatars.githubusercontent.com/u/7292036?v=3","gravatar_id":"","url":"https://api.github.com/users/jgfouca","html_url":"https://github.com/jgfouca","followers_url":"https://api.github.com/users/jgfouca/followers","following_url":"https://api.github.com/users/jgfouca/following{/other_user}","gists_url":"https://api.github.com/users/jgfouca/gists{/gist_id}","starred_url":"https://api.github.com/users/jgfouca/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgfouca/subscriptions","organizations_url":"https://api.github.com/users/jgfouca/orgs","repos_url":"https://api.github.com/users/jgfouca/repos","events_url":"https://api.github.com/users/jgfouca/events{/privacy}","received_events_url":"https://api.github.com/users/jgfouca/received_events","type":"User","site_admin":false},"body":"This needs to be a raw string. Did you run this through pylint?","created_at":"2016-06-22T20:21:31Z","updated_at":"2016-06-22T20:21:31Z","html_url":"https://github.com/ESMCI/cime/pull/231#discussion_r68127355","pull_request_url":"https://api.github.com/repos/ESMCI/cime/pulls/231","_links":{"self":{"href":"https://api.github.com/repos/ESMCI/cime/pulls/comments/68127355"},"html":{"href":"https://github.com/ESMCI/cime/pull/231#discussion_r68127355"},"pull_request":{"href":"https://api.github.com/repos/ESMCI/cime/pulls/231"}}},"pull_request":{"url":"https://api.github.com/repos/ESMCI/cime/pulls/231","id":74844953,"html_url":"https://github.com/ESMCI/cime/pull/231","diff_url":"https://github.com/ESMCI/cime/pull/231.diff","patch_url":"https://github.com/ESMCI/cime/pull/231.patch","issue_url":"https://api.github.com/repos/ESMCI/cime/issues/231","number":231,"state":"open","locked":false,"title":"Short term archive","user":{"login":"mvertens","id":7958803,"avatar_url":"https://avatars.githubusercontent.com/u/7958803?v=3","gravatar_id":"","url":"https://api.github.com/users/mvertens","html_url":"https://github.com/mvertens","followers_url":"https://api.github.com/users/mvertens/followers","following_url":"https://api.github.com/users/mvertens/following{/other_user}","gists_url":"https://api.github.com/users/mvertens/gists{/gist_id}","starred_url":"https://api.github.com/users/mvertens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mvertens/subscriptions","organizations_url":"https://api.github.com/users/mvertens/orgs","repos_url":"https://api.github.com/users/mvertens/repos","events_url":"https://api.github.com/users/mvertens/events{/privacy}","received_events_url":"https://api.github.com/users/mvertens/received_events","type":"User","site_admin":false},"body":"New pythonized short term archiving capability. This permits creating rpointer files on the fly for interim restart files.\r\n\r\nTest suite: scripts_regression_tests\r\nTest baseline: NA\r\nTest namelist changes: none\r\nTest status: [bit for bit, roundoff, climate changing] All passed except for ERI_D.f45_g37.X.yellowstone_intel - but this is not failing in the short term archiving.\r\n\r\nFixes: [CIME Github issue #]\r\n\r\nUser interface changes?: \r\nconfig_archive.xml (used to be archive.xml) has a new xml schema - but this is not a user interface change.\r\n\r\nCode review: J\r\nim Edwards, Alice Bertini\r\n","created_at":"2016-06-22T19:46:22Z","updated_at":"2016-06-22T20:21:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5089238b490d80c77c6bec666bc9a389fe366f86","assignee":{"login":"jgfouca","id":7292036,"avatar_url":"https://avatars.githubusercontent.com/u/7292036?v=3","gravatar_id":"","url":"https://api.github.com/users/jgfouca","html_url":"https://github.com/jgfouca","followers_url":"https://api.github.com/users/jgfouca/followers","following_url":"https://api.github.com/users/jgfouca/following{/other_user}","gists_url":"https://api.github.com/users/jgfouca/gists{/gist_id}","starred_url":"https://api.github.com/users/jgfouca/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgfouca/subscriptions","organizations_url":"https://api.github.com/users/jgfouca/orgs","repos_url":"https://api.github.com/users/jgfouca/repos","events_url":"https://api.github.com/users/jgfouca/events{/privacy}","received_events_url":"https://api.github.com/users/jgfouca/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/ESMCI/cime/pulls/231/commits","review_comments_url":"https://api.github.com/repos/ESMCI/cime/pulls/231/comments","review_comment_url":"https://api.github.com/repos/ESMCI/cime/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ESMCI/cime/issues/231/comments","statuses_url":"https://api.github.com/repos/ESMCI/cime/statuses/7de153c844f63480b94ae8dc4c8f71b4f1f70ca0","head":{"label":"mvertens:short_term_archive","ref":"short_term_archive","sha":"7de153c844f63480b94ae8dc4c8f71b4f1f70ca0","user":{"login":"mvertens","id":7958803,"avatar_url":"https://avatars.githubusercontent.com/u/7958803?v=3","gravatar_id":"","url":"https://api.github.com/users/mvertens","html_url":"https://github.com/mvertens","followers_url":"https://api.github.com/users/mvertens/followers","following_url":"https://api.github.com/users/mvertens/following{/other_user}","gists_url":"https://api.github.com/users/mvertens/gists{/gist_id}","starred_url":"https://api.github.com/users/mvertens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mvertens/subscriptions","organizations_url":"https://api.github.com/users/mvertens/orgs","repos_url":"https://api.github.com/users/mvertens/repos","events_url":"https://api.github.com/users/mvertens/events{/privacy}","received_events_url":"https://api.github.com/users/mvertens/received_events","type":"User","site_admin":false},"repo":{"id":38934329,"name":"cime","full_name":"mvertens/cime","owner":{"login":"mvertens","id":7958803,"avatar_url":"https://avatars.githubusercontent.com/u/7958803?v=3","gravatar_id":"","url":"https://api.github.com/users/mvertens","html_url":"https://github.com/mvertens","followers_url":"https://api.github.com/users/mvertens/followers","following_url":"https://api.github.com/users/mvertens/following{/other_user}","gists_url":"https://api.github.com/users/mvertens/gists{/gist_id}","starred_url":"https://api.github.com/users/mvertens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mvertens/subscriptions","organizations_url":"https://api.github.com/users/mvertens/orgs","repos_url":"https://api.github.com/users/mvertens/repos","events_url":"https://api.github.com/users/mvertens/events{/privacy}","received_events_url":"https://api.github.com/users/mvertens/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mvertens/cime","description":"Common Infrastructure for Modeling the Environment","fork":true,"url":"https://api.github.com/repos/mvertens/cime","forks_url":"https://api.github.com/repos/mvertens/cime/forks","keys_url":"https://api.github.com/repos/mvertens/cime/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mvertens/cime/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mvertens/cime/teams","hooks_url":"https://api.github.com/repos/mvertens/cime/hooks","issue_events_url":"https://api.github.com/repos/mvertens/cime/issues/events{/number}","events_url":"https://api.github.com/repos/mvertens/cime/events","assignees_url":"https://api.github.com/repos/mvertens/cime/assignees{/user}","branches_url":"https://api.github.com/repos/mvertens/cime/branches{/branch}","tags_url":"https://api.github.com/repos/mvertens/cime/tags","blobs_url":"https://api.github.com/repos/mvertens/cime/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mvertens/cime/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mvertens/cime/git/refs{/sha}","trees_url":"https://api.github.com/repos/mvertens/cime/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mvertens/cime/statuses/{sha}","languages_url":"https://api.github.com/repos/mvertens/cime/languages","stargazers_url":"https://api.github.com/repos/mvertens/cime/stargazers","contributors_url":"https://api.github.com/repos/mvertens/cime/contributors","subscribers_url":"https://api.github.com/repos/mvertens/cime/subscribers","subscription_url":"https://api.github.com/repos/mvertens/cime/subscription","commits_url":"https://api.github.com/repos/mvertens/cime/commits{/sha}","git_commits_url":"https://api.github.com/repos/mvertens/cime/git/commits{/sha}","comments_url":"https://api.github.com/repos/mvertens/cime/comments{/number}","issue_comment_url":"https://api.github.com/repos/mvertens/cime/issues/comments{/number}","contents_url":"https://api.github.com/repos/mvertens/cime/contents/{+path}","compare_url":"https://api.github.com/repos/mvertens/cime/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mvertens/cime/merges","archive_url":"https://api.github.com/repos/mvertens/cime/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mvertens/cime/downloads","issues_url":"https://api.github.com/repos/mvertens/cime/issues{/number}","pulls_url":"https://api.github.com/repos/mvertens/cime/pulls{/number}","milestones_url":"https://api.github.com/repos/mvertens/cime/milestones{/number}","notifications_url":"https://api.github.com/repos/mvertens/cime/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mvertens/cime/labels{/name}","releases_url":"https://api.github.com/repos/mvertens/cime/releases{/id}","deployments_url":"https://api.github.com/repos/mvertens/cime/deployments","created_at":"2015-07-11T17:27:10Z","updated_at":"2016-01-27T18:43:31Z","pushed_at":"2016-06-22T19:30:28Z","git_url":"git://github.com/mvertens/cime.git","ssh_url":"git@github.com:mvertens/cime.git","clone_url":"https://github.com/mvertens/cime.git","svn_url":"https://github.com/mvertens/cime","homepage":null,"size":19820,"stargazers_count":0,"watchers_count":0,"language":"FORTRAN","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ESMCI:master","ref":"master","sha":"cc0781dcf9ea262a0cabc0b703f8311027a9c6ea","user":{"login":"ESMCI","id":10676238,"avatar_url":"https://avatars.githubusercontent.com/u/10676238?v=3","gravatar_id":"","url":"https://api.github.com/users/ESMCI","html_url":"https://github.com/ESMCI","followers_url":"https://api.github.com/users/ESMCI/followers","following_url":"https://api.github.com/users/ESMCI/following{/other_user}","gists_url":"https://api.github.com/users/ESMCI/gists{/gist_id}","starred_url":"https://api.github.com/users/ESMCI/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ESMCI/subscriptions","organizations_url":"https://api.github.com/users/ESMCI/orgs","repos_url":"https://api.github.com/users/ESMCI/repos","events_url":"https://api.github.com/users/ESMCI/events{/privacy}","received_events_url":"https://api.github.com/users/ESMCI/received_events","type":"Organization","site_admin":false},"repo":{"id":31605662,"name":"cime","full_name":"ESMCI/cime","owner":{"login":"ESMCI","id":10676238,"avatar_url":"https://avatars.githubusercontent.com/u/10676238?v=3","gravatar_id":"","url":"https://api.github.com/users/ESMCI","html_url":"https://github.com/ESMCI","followers_url":"https://api.github.com/users/ESMCI/followers","following_url":"https://api.github.com/users/ESMCI/following{/other_user}","gists_url":"https://api.github.com/users/ESMCI/gists{/gist_id}","starred_url":"https://api.github.com/users/ESMCI/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ESMCI/subscriptions","organizations_url":"https://api.github.com/users/ESMCI/orgs","repos_url":"https://api.github.com/users/ESMCI/repos","events_url":"https://api.github.com/users/ESMCI/events{/privacy}","received_events_url":"https://api.github.com/users/ESMCI/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ESMCI/cime","description":"Common Infrastructure for Modeling the Earth","fork":false,"url":"https://api.github.com/repos/ESMCI/cime","forks_url":"https://api.github.com/repos/ESMCI/cime/forks","keys_url":"https://api.github.com/repos/ESMCI/cime/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ESMCI/cime/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ESMCI/cime/teams","hooks_url":"https://api.github.com/repos/ESMCI/cime/hooks","issue_events_url":"https://api.github.com/repos/ESMCI/cime/issues/events{/number}","events_url":"https://api.github.com/repos/ESMCI/cime/events","assignees_url":"https://api.github.com/repos/ESMCI/cime/assignees{/user}","branches_url":"https://api.github.com/repos/ESMCI/cime/branches{/branch}","tags_url":"https://api.github.com/repos/ESMCI/cime/tags","blobs_url":"https://api.github.com/repos/ESMCI/cime/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ESMCI/cime/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ESMCI/cime/git/refs{/sha}","trees_url":"https://api.github.com/repos/ESMCI/cime/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ESMCI/cime/statuses/{sha}","languages_url":"https://api.github.com/repos/ESMCI/cime/languages","stargazers_url":"https://api.github.com/repos/ESMCI/cime/stargazers","contributors_url":"https://api.github.com/repos/ESMCI/cime/contributors","subscribers_url":"https://api.github.com/repos/ESMCI/cime/subscribers","subscription_url":"https://api.github.com/repos/ESMCI/cime/subscription","commits_url":"https://api.github.com/repos/ESMCI/cime/commits{/sha}","git_commits_url":"https://api.github.com/repos/ESMCI/cime/git/commits{/sha}","comments_url":"https://api.github.com/repos/ESMCI/cime/comments{/number}","issue_comment_url":"https://api.github.com/repos/ESMCI/cime/issues/comments{/number}","contents_url":"https://api.github.com/repos/ESMCI/cime/contents/{+path}","compare_url":"https://api.github.com/repos/ESMCI/cime/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ESMCI/cime/merges","archive_url":"https://api.github.com/repos/ESMCI/cime/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ESMCI/cime/downloads","issues_url":"https://api.github.com/repos/ESMCI/cime/issues{/number}","pulls_url":"https://api.github.com/repos/ESMCI/cime/pulls{/number}","milestones_url":"https://api.github.com/repos/ESMCI/cime/milestones{/number}","notifications_url":"https://api.github.com/repos/ESMCI/cime/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ESMCI/cime/labels{/name}","releases_url":"https://api.github.com/repos/ESMCI/cime/releases{/id}","deployments_url":"https://api.github.com/repos/ESMCI/cime/deployments","created_at":"2015-03-03T15:33:00Z","updated_at":"2016-02-21T17:54:50Z","pushed_at":"2016-06-22T19:46:22Z","git_url":"git://github.com/ESMCI/cime.git","ssh_url":"git@github.com:ESMCI/cime.git","clone_url":"https://github.com/ESMCI/cime.git","svn_url":"https://github.com/ESMCI/cime","homepage":"","size":19165,"stargazers_count":2,"watchers_count":2,"language":"FORTRAN","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":32,"mirror_url":null,"open_issues_count":41,"forks":32,"open_issues":41,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ESMCI/cime/pulls/231"},"html":{"href":"https://github.com/ESMCI/cime/pull/231"},"issue":{"href":"https://api.github.com/repos/ESMCI/cime/issues/231"},"comments":{"href":"https://api.github.com/repos/ESMCI/cime/issues/231/comments"},"review_comments":{"href":"https://api.github.com/repos/ESMCI/cime/pulls/231/comments"},"review_comment":{"href":"https://api.github.com/repos/ESMCI/cime/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ESMCI/cime/pulls/231/commits"},"statuses":{"href":"https://api.github.com/repos/ESMCI/cime/statuses/7de153c844f63480b94ae8dc4c8f71b4f1f70ca0"}}}}
{"actor":{"display_login":"jgfouca"}}