{"action":"created","comment":{"url":"https://api.github.com/repos/Automattic/Cron-Control/pulls/comments/88523805","pull_request_review_id":9095701,"id":88523805,"diff_hunk":"@@ -0,0 +1,375 @@\n+<?php\n+\n+namespace Automattic\\WP\\Cron_Control;\n+\n+class Cron_Options_CPT extends Singleton {\n+\t/**\n+\t * PLUGIN SETUP\n+\t */\n+\n+\t/**\n+\t * Class properties\n+\t */\n+\tconst LOCK = 'create-jobs';\n+\n+\tconst POST_TYPE   = 'a8c_cron_ctrl_events';\n+\tconst POST_STATUS = 'inherit';\n+\n+\tprivate $posts_to_clean = array();\n+\n+\tprivate $option_before_unscheduling = null;\n+\n+\t/**\n+\t * Register hooks\n+\t */\n+\tprotected function class_init() {\n+\t\t// Data storage\n+\t\tadd_action( 'init', array( $this, 'register_post_type' ) );\n+\n+\t\t// Lock for post insertion, to guard against endless event creation when `wp_next_scheduled()` is misused\n+\t\tLock::prime_lock( self::LOCK );\n+\n+\t\t// Option interception\n+\t\tadd_filter( 'pre_option_cron', array( $this, 'get_option' ) );\n+\t\tadd_filter( 'pre_update_option_cron', array( $this, 'update_option' ), 10, 2 );\n+\t}\n+\n+\t/**\n+\t * Register a private post type to store cron events\n+\t */\n+\tpublic function register_post_type() {\n+\t\tregister_post_type( self::POST_TYPE, array(\n+\t\t\t'label'               => 'Cron Events',\n+\t\t\t'public'              => false,\n+\t\t\t'rewrite'             => false,\n+\t\t\t'export'              => false,\n+\t\t\t'exclude_from_search' => true,\n+\t\t) );\n+\n+\t\t// Clear caches for any manually-inserted posts, lest stale caches be used\n+\t\tif ( ! empty( $this->posts_to_clean ) ) {\n+\t\t\tforeach ( $this->posts_to_clean as $index => $post_to_clean ) {\n+\t\t\t\tclean_post_cache( $post_to_clean );\n+\t\t\t\tunset( $this->posts_to_clean[ $index ] );\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * PLUGIN FUNCTIONALITY\n+\t */\n+\n+\t/**\n+\t * Override cron option requests with data from CPT\n+\t */\n+\tpublic function get_option() {\n+\t\t$cron_array = array(\n+\t\t\t'version' => 2, // Core versions the cron array; without this, events will continually requeue\n+\t\t);\n+\n+\t\t// Get events to re-render as the cron option\n+\t\t$page  = 1;\n+\n+\t\tdo {\n+\t\t\t$jobs_posts = $this->get_jobs( array(\n+\t\t\t\t'post_type'        => self::POST_TYPE,\n+\t\t\t\t'post_status'      => self::POST_STATUS,\n+\t\t\t\t'suppress_filters' => false,\n+\t\t\t\t'posts_per_page'   => 100,\n+\t\t\t\t'paged'            => $page,\n+\t\t\t\t'orderby'          => 'date',\n+\t\t\t\t'order'            => 'ASC',\n+\t\t\t) );\n+\n+\t\t\t// Nothing more to add\n+\t\t\tif ( empty( $jobs_posts ) ) {\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\t$page++;\n+\n+\t\t\t// Loop through results and built output Core expects\n+\t\t\tif ( ! empty( $jobs_posts ) ) {\n+\t\t\t\tforeach ( $jobs_posts as $jobs_post ) {\n+\t\t\t\t\t$timestamp = strtotime( $jobs_post->post_date_gmt );\n+\n+\t\t\t\t\t$job_args = maybe_unserialize( $jobs_post->post_content_filtered );\n+\t\t\t\t\tif ( ! is_array( $job_args ) ) {\n+\t\t\t\t\t\tcontinue;\n+\t\t\t\t\t}\n+\n+\t\t\t\t\t$action   = $job_args['action'];\n+\t\t\t\t\t$instance = $job_args['instance'];\n+\t\t\t\t\t$args     = $job_args['args'];\n+\n+\t\t\t\t\t$cron_array[ $timestamp ][ $action ][ $instance ] = array(\n+\t\t\t\t\t\t'schedule' => $args['schedule'],\n+\t\t\t\t\t\t'args'     => $args['args'],\n+\t\t\t\t\t);\n+\n+\t\t\t\t\tif ( isset( $args['interval'] ) ) {\n+\t\t\t\t\t\t$cron_array[ $timestamp ][ $action ][ $instance ]['interval'] = $args['interval'];\n+\t\t\t\t\t}\n+\n+\t\t\t\t}\n+\t\t\t}\n+\t\t} while( true );\n+\n+\t\tuksort( $cron_array, 'strnatcasecmp' );\n+\n+\t\t// If we're unscheduling an event, hold onto the previous value so we can identify what's unscheduled\n+\t\tif ( $this->is_unscheduling() ) {\n+\t\t\t$this->option_before_unscheduling = $cron_array;\n+\t\t} else {\n+\t\t\t$this->option_before_unscheduling = null;\n+\t\t}\n+\n+\t\treturn $cron_array;\n+\t}\n+\n+\t/**\n+\t * Handle requests to update the cron option\n+\t *\n+\t * By returning $old_value, `cron` option won't be updated\n+\t */\n+\tpublic function update_option( $new_value, $old_value ) {\n+\t\tif ( $this->is_unscheduling() ) {\n+\t\t\t$this->unschedule_job( $new_value, $this->option_before_unscheduling );\n+\t\t} else {\n+\t\t\t$this->convert_option( $new_value );\n+\t\t}\n+\n+\t\treturn $old_value;\n+\t}\n+\n+\t/**\n+\t * Delete jobs that are unscheduled using `wp_unschedule_event()`\n+\t */\n+\tprivate function unschedule_job( $new_value, $old_value ) {\n+\t\t$jobs = $this->find_unscheduled_jobs( $new_value, $old_value );\n+\n+\t\tforeach ( $jobs as $job ) {\n+\t\t\t$this->delete_job( $job['timestamp'], $job['action'], $job['instance'] );\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * Save cron events in CPT\n+\t */\n+\tprivate function convert_option( $new_value ) {\n+\t\tif ( is_array( $new_value ) && ! empty( $new_value ) ) {\n+\t\t\t$events = collapse_events_array( $new_value );\n+\n+\t\t\tforeach ( $events as $event ) {\n+\t\t\t\t$job_exists = $this->job_exists( array(\n+\t\t\t\t\t'name'             => $this->event_name( $event['timestamp'], $event['action'], $event['instance'] ),\n+\t\t\t\t\t'post_type'        => self::POST_TYPE,\n+\t\t\t\t\t'post_status'      => self::POST_STATUS,\n+\t\t\t\t\t'suppress_filters' => false,\n+\t\t\t\t\t'posts_per_page'   => 1,\n+\t\t\t\t) );\n+\n+\t\t\t\tif ( ! $job_exists ) {\n+\t\t\t\t\t// Build minimum information needed to create a post\n+\t\t\t\t\t$job_post = array(\n+\t\t\t\t\t\t'post_title'            => $this->event_title( $event['timestamp'], $event['action'], $event['instance'] ),\n+\t\t\t\t\t\t'post_name'             => $this->event_name( $event['timestamp'], $event['action'], $event['instance'] ),\n+\t\t\t\t\t\t'post_content_filtered' => maybe_serialize( array(","path":"includes/class-cron-options-cpt.php","position":177,"original_position":177,"commit_id":"884834910e18305e90813611b56fb156fd19b8ae","original_commit_id":"884834910e18305e90813611b56fb156fd19b8ae","user":{"login":"ethitter","id":321503,"avatar_url":"https://avatars.githubusercontent.com/u/321503?v=3","gravatar_id":"","url":"https://api.github.com/users/ethitter","html_url":"https://github.com/ethitter","followers_url":"https://api.github.com/users/ethitter/followers","following_url":"https://api.github.com/users/ethitter/following{/other_user}","gists_url":"https://api.github.com/users/ethitter/gists{/gist_id}","starred_url":"https://api.github.com/users/ethitter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethitter/subscriptions","organizations_url":"https://api.github.com/users/ethitter/orgs","repos_url":"https://api.github.com/users/ethitter/repos","events_url":"https://api.github.com/users/ethitter/events{/privacy}","received_events_url":"https://api.github.com/users/ethitter/received_events","type":"User","site_admin":false},"body":"Since we're only using `post_content_filtered`, there's no risk. Neither `wp_insert_post()` nor `sanitize_post_field()` modify the value from that column.","created_at":"2016-11-17T19:10:12Z","updated_at":"2016-11-17T19:10:12Z","html_url":"https://github.com/Automattic/Cron-Control/pull/1#discussion_r88523805","pull_request_url":"https://api.github.com/repos/Automattic/Cron-Control/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/Automattic/Cron-Control/pulls/comments/88523805"},"html":{"href":"https://github.com/Automattic/Cron-Control/pull/1#discussion_r88523805"},"pull_request":{"href":"https://api.github.com/repos/Automattic/Cron-Control/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/Automattic/Cron-Control/pulls/1","id":92441525,"html_url":"https://github.com/Automattic/Cron-Control/pull/1","diff_url":"https://github.com/Automattic/Cron-Control/pull/1.diff","patch_url":"https://github.com/Automattic/Cron-Control/pull/1.patch","issue_url":"https://api.github.com/repos/Automattic/Cron-Control/issues/1","number":1,"state":"open","locked":false,"title":"Initial commit","user":{"login":"ethitter","id":321503,"avatar_url":"https://avatars.githubusercontent.com/u/321503?v=3","gravatar_id":"","url":"https://api.github.com/users/ethitter","html_url":"https://github.com/ethitter","followers_url":"https://api.github.com/users/ethitter/followers","following_url":"https://api.github.com/users/ethitter/following{/other_user}","gists_url":"https://api.github.com/users/ethitter/gists{/gist_id}","starred_url":"https://api.github.com/users/ethitter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethitter/subscriptions","organizations_url":"https://api.github.com/users/ethitter/orgs","repos_url":"https://api.github.com/users/ethitter/repos","events_url":"https://api.github.com/users/ethitter/events{/privacy}","received_events_url":"https://api.github.com/users/ethitter/received_events","type":"User","site_admin":false},"body":"Moving over from https://github.com/Automattic/vip-go-mu-plugins/pull/329.\r\n\r\nRather than executing scheduled cron tasks in series, multiple tasks can run simultaneously, preventing long-running tasks from blocking other events. \r\n\r\n**How**\r\n1. An endpoint provides a list of tasks to run in the next 60 seconds. Enough information about each is provided to identify it, but its specific arguments are not exposed.\r\n2. A second endpoint accepts the JSON object for an individual task. After confirming that it isn't scheduled more than 15 seconds ahead of the current time, the endpoint runs that job, mimicking the environment Core provides.\r\n3. The existing runners on WordPress.com are updated to use these two endpoints. For each cron task to run, an individual job will be queued on WordPress.com's jobs system.\r\n\r\n_All_ attempts to execute Core's native cron methods (`wp-cron.php`, `wp_cron()`, `spawn_cron()`) are blocked to prevent rogue execution.","created_at":"2016-11-05T04:04:31Z","updated_at":"2016-11-17T19:10:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f3d43fed329bdd5404b0f7c9c09e8f26d2d439ab","assignee":{"login":"mjangda","id":86105,"avatar_url":"https://avatars.githubusercontent.com/u/86105?v=3","gravatar_id":"","url":"https://api.github.com/users/mjangda","html_url":"https://github.com/mjangda","followers_url":"https://api.github.com/users/mjangda/followers","following_url":"https://api.github.com/users/mjangda/following{/other_user}","gists_url":"https://api.github.com/users/mjangda/gists{/gist_id}","starred_url":"https://api.github.com/users/mjangda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mjangda/subscriptions","organizations_url":"https://api.github.com/users/mjangda/orgs","repos_url":"https://api.github.com/users/mjangda/repos","events_url":"https://api.github.com/users/mjangda/events{/privacy}","received_events_url":"https://api.github.com/users/mjangda/received_events","type":"User","site_admin":false},"assignees":[{"login":"mjangda","id":86105,"avatar_url":"https://avatars.githubusercontent.com/u/86105?v=3","gravatar_id":"","url":"https://api.github.com/users/mjangda","html_url":"https://github.com/mjangda","followers_url":"https://api.github.com/users/mjangda/followers","following_url":"https://api.github.com/users/mjangda/following{/other_user}","gists_url":"https://api.github.com/users/mjangda/gists{/gist_id}","starred_url":"https://api.github.com/users/mjangda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mjangda/subscriptions","organizations_url":"https://api.github.com/users/mjangda/orgs","repos_url":"https://api.github.com/users/mjangda/repos","events_url":"https://api.github.com/users/mjangda/events{/privacy}","received_events_url":"https://api.github.com/users/mjangda/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Automattic/Cron-Control/pulls/1/commits","review_comments_url":"https://api.github.com/repos/Automattic/Cron-Control/pulls/1/comments","review_comment_url":"https://api.github.com/repos/Automattic/Cron-Control/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Automattic/Cron-Control/issues/1/comments","statuses_url":"https://api.github.com/repos/Automattic/Cron-Control/statuses/884834910e18305e90813611b56fb156fd19b8ae","head":{"label":"Automattic:develop","ref":"develop","sha":"884834910e18305e90813611b56fb156fd19b8ae","user":{"login":"Automattic","id":887802,"avatar_url":"https://avatars.githubusercontent.com/u/887802?v=3","gravatar_id":"","url":"https://api.github.com/users/Automattic","html_url":"https://github.com/Automattic","followers_url":"https://api.github.com/users/Automattic/followers","following_url":"https://api.github.com/users/Automattic/following{/other_user}","gists_url":"https://api.github.com/users/Automattic/gists{/gist_id}","starred_url":"https://api.github.com/users/Automattic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Automattic/subscriptions","organizations_url":"https://api.github.com/users/Automattic/orgs","repos_url":"https://api.github.com/users/Automattic/repos","events_url":"https://api.github.com/users/Automattic/events{/privacy}","received_events_url":"https://api.github.com/users/Automattic/received_events","type":"Organization","site_admin":false},"repo":{"id":72902182,"name":"Cron-Control","full_name":"Automattic/Cron-Control","owner":{"login":"Automattic","id":887802,"avatar_url":"https://avatars.githubusercontent.com/u/887802?v=3","gravatar_id":"","url":"https://api.github.com/users/Automattic","html_url":"https://github.com/Automattic","followers_url":"https://api.github.com/users/Automattic/followers","following_url":"https://api.github.com/users/Automattic/following{/other_user}","gists_url":"https://api.github.com/users/Automattic/gists{/gist_id}","starred_url":"https://api.github.com/users/Automattic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Automattic/subscriptions","organizations_url":"https://api.github.com/users/Automattic/orgs","repos_url":"https://api.github.com/users/Automattic/repos","events_url":"https://api.github.com/users/Automattic/events{/privacy}","received_events_url":"https://api.github.com/users/Automattic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Automattic/Cron-Control","description":"A fresh take on running WordPress's cron system, allowing parallel processing","fork":false,"url":"https://api.github.com/repos/Automattic/Cron-Control","forks_url":"https://api.github.com/repos/Automattic/Cron-Control/forks","keys_url":"https://api.github.com/repos/Automattic/Cron-Control/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Automattic/Cron-Control/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Automattic/Cron-Control/teams","hooks_url":"https://api.github.com/repos/Automattic/Cron-Control/hooks","issue_events_url":"https://api.github.com/repos/Automattic/Cron-Control/issues/events{/number}","events_url":"https://api.github.com/repos/Automattic/Cron-Control/events","assignees_url":"https://api.github.com/repos/Automattic/Cron-Control/assignees{/user}","branches_url":"https://api.github.com/repos/Automattic/Cron-Control/branches{/branch}","tags_url":"https://api.github.com/repos/Automattic/Cron-Control/tags","blobs_url":"https://api.github.com/repos/Automattic/Cron-Control/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Automattic/Cron-Control/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Automattic/Cron-Control/git/refs{/sha}","trees_url":"https://api.github.com/repos/Automattic/Cron-Control/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Automattic/Cron-Control/statuses/{sha}","languages_url":"https://api.github.com/repos/Automattic/Cron-Control/languages","stargazers_url":"https://api.github.com/repos/Automattic/Cron-Control/stargazers","contributors_url":"https://api.github.com/repos/Automattic/Cron-Control/contributors","subscribers_url":"https://api.github.com/repos/Automattic/Cron-Control/subscribers","subscription_url":"https://api.github.com/repos/Automattic/Cron-Control/subscription","commits_url":"https://api.github.com/repos/Automattic/Cron-Control/commits{/sha}","git_commits_url":"https://api.github.com/repos/Automattic/Cron-Control/git/commits{/sha}","comments_url":"https://api.github.com/repos/Automattic/Cron-Control/comments{/number}","issue_comment_url":"https://api.github.com/repos/Automattic/Cron-Control/issues/comments{/number}","contents_url":"https://api.github.com/repos/Automattic/Cron-Control/contents/{+path}","compare_url":"https://api.github.com/repos/Automattic/Cron-Control/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Automattic/Cron-Control/merges","archive_url":"https://api.github.com/repos/Automattic/Cron-Control/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Automattic/Cron-Control/downloads","issues_url":"https://api.github.com/repos/Automattic/Cron-Control/issues{/number}","pulls_url":"https://api.github.com/repos/Automattic/Cron-Control/pulls{/number}","milestones_url":"https://api.github.com/repos/Automattic/Cron-Control/milestones{/number}","notifications_url":"https://api.github.com/repos/Automattic/Cron-Control/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Automattic/Cron-Control/labels{/name}","releases_url":"https://api.github.com/repos/Automattic/Cron-Control/releases{/id}","deployments_url":"https://api.github.com/repos/Automattic/Cron-Control/deployments","created_at":"2016-11-05T03:15:35Z","updated_at":"2016-11-17T01:15:17Z","pushed_at":"2016-11-17T01:07:21Z","git_url":"git://github.com/Automattic/Cron-Control.git","ssh_url":"git@github.com:Automattic/Cron-Control.git","clone_url":"https://github.com/Automattic/Cron-Control.git","svn_url":"https://github.com/Automattic/Cron-Control","homepage":null,"size":208,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"Automattic:master","ref":"master","sha":"d9d4304a7ccaee5b300d4a83ae358ae72d87757b","user":{"login":"Automattic","id":887802,"avatar_url":"https://avatars.githubusercontent.com/u/887802?v=3","gravatar_id":"","url":"https://api.github.com/users/Automattic","html_url":"https://github.com/Automattic","followers_url":"https://api.github.com/users/Automattic/followers","following_url":"https://api.github.com/users/Automattic/following{/other_user}","gists_url":"https://api.github.com/users/Automattic/gists{/gist_id}","starred_url":"https://api.github.com/users/Automattic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Automattic/subscriptions","organizations_url":"https://api.github.com/users/Automattic/orgs","repos_url":"https://api.github.com/users/Automattic/repos","events_url":"https://api.github.com/users/Automattic/events{/privacy}","received_events_url":"https://api.github.com/users/Automattic/received_events","type":"Organization","site_admin":false},"repo":{"id":72902182,"name":"Cron-Control","full_name":"Automattic/Cron-Control","owner":{"login":"Automattic","id":887802,"avatar_url":"https://avatars.githubusercontent.com/u/887802?v=3","gravatar_id":"","url":"https://api.github.com/users/Automattic","html_url":"https://github.com/Automattic","followers_url":"https://api.github.com/users/Automattic/followers","following_url":"https://api.github.com/users/Automattic/following{/other_user}","gists_url":"https://api.github.com/users/Automattic/gists{/gist_id}","starred_url":"https://api.github.com/users/Automattic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Automattic/subscriptions","organizations_url":"https://api.github.com/users/Automattic/orgs","repos_url":"https://api.github.com/users/Automattic/repos","events_url":"https://api.github.com/users/Automattic/events{/privacy}","received_events_url":"https://api.github.com/users/Automattic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Automattic/Cron-Control","description":"A fresh take on running WordPress's cron system, allowing parallel processing","fork":false,"url":"https://api.github.com/repos/Automattic/Cron-Control","forks_url":"https://api.github.com/repos/Automattic/Cron-Control/forks","keys_url":"https://api.github.com/repos/Automattic/Cron-Control/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Automattic/Cron-Control/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Automattic/Cron-Control/teams","hooks_url":"https://api.github.com/repos/Automattic/Cron-Control/hooks","issue_events_url":"https://api.github.com/repos/Automattic/Cron-Control/issues/events{/number}","events_url":"https://api.github.com/repos/Automattic/Cron-Control/events","assignees_url":"https://api.github.com/repos/Automattic/Cron-Control/assignees{/user}","branches_url":"https://api.github.com/repos/Automattic/Cron-Control/branches{/branch}","tags_url":"https://api.github.com/repos/Automattic/Cron-Control/tags","blobs_url":"https://api.github.com/repos/Automattic/Cron-Control/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Automattic/Cron-Control/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Automattic/Cron-Control/git/refs{/sha}","trees_url":"https://api.github.com/repos/Automattic/Cron-Control/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Automattic/Cron-Control/statuses/{sha}","languages_url":"https://api.github.com/repos/Automattic/Cron-Control/languages","stargazers_url":"https://api.github.com/repos/Automattic/Cron-Control/stargazers","contributors_url":"https://api.github.com/repos/Automattic/Cron-Control/contributors","subscribers_url":"https://api.github.com/repos/Automattic/Cron-Control/subscribers","subscription_url":"https://api.github.com/repos/Automattic/Cron-Control/subscription","commits_url":"https://api.github.com/repos/Automattic/Cron-Control/commits{/sha}","git_commits_url":"https://api.github.com/repos/Automattic/Cron-Control/git/commits{/sha}","comments_url":"https://api.github.com/repos/Automattic/Cron-Control/comments{/number}","issue_comment_url":"https://api.github.com/repos/Automattic/Cron-Control/issues/comments{/number}","contents_url":"https://api.github.com/repos/Automattic/Cron-Control/contents/{+path}","compare_url":"https://api.github.com/repos/Automattic/Cron-Control/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Automattic/Cron-Control/merges","archive_url":"https://api.github.com/repos/Automattic/Cron-Control/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Automattic/Cron-Control/downloads","issues_url":"https://api.github.com/repos/Automattic/Cron-Control/issues{/number}","pulls_url":"https://api.github.com/repos/Automattic/Cron-Control/pulls{/number}","milestones_url":"https://api.github.com/repos/Automattic/Cron-Control/milestones{/number}","notifications_url":"https://api.github.com/repos/Automattic/Cron-Control/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Automattic/Cron-Control/labels{/name}","releases_url":"https://api.github.com/repos/Automattic/Cron-Control/releases{/id}","deployments_url":"https://api.github.com/repos/Automattic/Cron-Control/deployments","created_at":"2016-11-05T03:15:35Z","updated_at":"2016-11-17T01:15:17Z","pushed_at":"2016-11-17T01:07:21Z","git_url":"git://github.com/Automattic/Cron-Control.git","ssh_url":"git@github.com:Automattic/Cron-Control.git","clone_url":"https://github.com/Automattic/Cron-Control.git","svn_url":"https://github.com/Automattic/Cron-Control","homepage":null,"size":208,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Automattic/Cron-Control/pulls/1"},"html":{"href":"https://github.com/Automattic/Cron-Control/pull/1"},"issue":{"href":"https://api.github.com/repos/Automattic/Cron-Control/issues/1"},"comments":{"href":"https://api.github.com/repos/Automattic/Cron-Control/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/Automattic/Cron-Control/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/Automattic/Cron-Control/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Automattic/Cron-Control/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/Automattic/Cron-Control/statuses/884834910e18305e90813611b56fb156fd19b8ae"}}}}
{"actor":{"display_login":"ethitter"}}