GitHub PullRequestReviewCommentEvent at 2014-07-28 23:13:23
Repository: libuv
Actor: saghul
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/joyent/libuv/pulls/comments/15497372","id":15497372,"diff_hunk":"@@ -616,91 +659,148 @@ static void check_required_vars_contains_var(env_var_t* required, int count,\n  * TEMP. SYSTEMDRIVE is probably also important. We therefore ensure that\n  * these get defined if the input environment block does not contain any\n  * values for them.\n+ *\n+ * Also add variables known to Cygwin to be required for correct\n+ * subprocess operation in many cases:\n+ * https://github.com/Alexpux/Cygwin/blob/b266b04fbbd3a595f02ea149e4306d3ab9b1fe3d/winsup/cygwin/environ.cc#L955\n+ *\n  */\n int make_program_env(char* env_block[], WCHAR** dst_ptr) {\n   WCHAR* dst;\n   WCHAR* ptr;\n   char** env;\n-  size_t env_len = 1; /* room for closing null */\n+  size_t env_len = 0;\n   int len;\n   size_t i;\n   DWORD var_size;\n+  size_t env_block_count = 1; /* 1 for null-terminator */\n+  WCHAR* dst_copy;\n+  WCHAR** ptr_copy;\n+  WCHAR** env_copy;\n+  DWORD* required_vars_value_len = (DWORD*)alloca(n_required_vars*sizeof(DWORD*));\n \n-  env_var_t required_vars[] = {\n-    E_V(\"SYSTEMROOT\"),\n-    E_V(\"SYSTEMDRIVE\"),\n-    E_V(\"TEMP\"),\n-  };\n-\n+  /* first pass: determine size in UTF-16 */\n   for (env = env_block; *env; env++) {\n     int len;\n-    check_required_vars_contains_var(required_vars,\n-                                     ARRAY_SIZE(required_vars),\n-                                     *env);\n-\n-    len = MultiByteToWideChar(CP_UTF8,\n-                              0,\n-                              *env,\n-                              -1,\n-                              NULL,\n-                              0);\n-    if (len <= 0) {\n-      return GetLastError();\n+    if (strchr(*env, '=')) {\n+      len = MultiByteToWideChar(CP_UTF8,\n+                                0,\n+                                *env,\n+                                -1,\n+                                NULL,\n+                                0);\n+      if (len <= 0) {\n+        return GetLastError();\n+      }\n+      env_len += len;\n+      env_block_count++;\n     }\n+  }\n+\n+  /* second pass: copy to UTF-16 environment block */\n+  dst_copy = _malloca(env_len * sizeof(WCHAR));\n+  if (!dst_copy) {\n+    return ERROR_OUTOFMEMORY;\n+  }\n+  env_copy = (WCHAR**)alloca(env_block_count * sizeof(WCHAR*));\n \n-    env_len += len;\n+  ptr = dst_copy;\n+  ptr_copy = env_copy;\n+  for (env = env_block; *env; env++) {\n+    if (strchr(*env, '=')) {\n+      len = MultiByteToWideChar(CP_UTF8,\n+                                0,\n+                                *env,\n+                                -1,\n+                                ptr,\n+                                (int) (env_len - (ptr - dst_copy)));\n+      if (len <= 0) {\n+        DWORD err = GetLastError();\n+        _freea(dst_copy);\n+        return err;\n+      }\n+      *ptr_copy++ = ptr;\n+      ptr += len;\n+    }\n   }\n+  *ptr_copy = NULL;\n+  assert(env_len == ptr - dst_copy);\n \n-  for (i = 0; i < ARRAY_SIZE(required_vars); ++i) {\n-    if (!required_vars[i].supplied) {\n-      env_len += required_vars[i].len;\n+  /* sort our (UTF-16) copy */\n+  qsort(env_copy, env_block_count-1, sizeof(wchar_t*), qsort_wcscmp);\n+\n+  /* third pass: check for required variables */\n+  for (ptr_copy = env_copy, i = 0; i < n_required_vars; ) {\n+    int cmp;\n+    if (!*ptr_copy) {\n+      cmp = -1;\n+    } else {\n+      cmp = env_strncmp(required_vars[i].wide_eq,\n+                       required_vars[i].len,\n+                        *ptr_copy);\n+    }\n+    if (cmp < 0) {\n+      /* missing required var */\n       var_size = GetEnvironmentVariableW(required_vars[i].wide, NULL, 0);\n-      if (var_size == 0) {\n-        return GetLastError();\n+      required_vars_value_len[i] = var_size;\n+      if (var_size != 0) {\n+        env_len += required_vars[i].len;\n+        env_len += var_size;\n       }\n-      required_vars[i].value_len = var_size;\n-      env_len += var_size;\n+      i++;\n+    } else {\n+      ptr_copy++;\n+      if (cmp == 0) i++;\n     }\n   }\n \n-  dst = malloc(env_len * sizeof(WCHAR));\n+  /* final pass: copy, in sort order, and inserting required variables */\n+  dst = malloc((1+env_len) * sizeof(WCHAR));\n   if (!dst) {\n+    _freea(dst_copy);\n     return ERROR_OUTOFMEMORY;\n   }\n \n-  ptr = dst;\n-\n-  for (env = env_block; *env; env++, ptr += len) {\n-    len = MultiByteToWideChar(CP_UTF8,\n-                              0,\n-                              *env,\n-                              -1,\n-                              ptr,\n-                              (int) (env_len - (ptr - dst)));\n-    if (len <= 0) {\n-      free(dst);\n-      return GetLastError();\n+  for (ptr = dst, ptr_copy = env_copy, i = 0;\n+        *ptr_copy || i < n_required_vars;\n+        ptr += len) {\n+    int cmp;\n+    if (i >= n_required_vars) {\n+      cmp = 1;\n+    } else if (!*ptr_copy) {\n+      cmp = -1;\n+    } else {\n+      cmp = env_strncmp(required_vars[i].wide_eq,\n+                        required_vars[i].len,\n+                        *ptr_copy);\n     }\n-  }\n-\n-  for (i = 0; i < ARRAY_SIZE(required_vars); ++i) {\n-    if (!required_vars[i].supplied) {\n-      wcscpy(ptr, required_vars[i].wide);\n-      ptr += required_vars[i].len - 1;\n-      *ptr++ = L'=';\n-      var_size = GetEnvironmentVariableW(required_vars[i].wide,\n-                                         ptr,\n-                                         required_vars[i].value_len);\n-      if (var_size == 0) {\n-        uv_fatal_error(GetLastError(), \"GetEnvironmentVariableW\");\n+    if (cmp < 0) {\n+      /* missing required var */\n+      len = required_vars_value_len[i];\n+      if (len) {\n+        wcscpy(ptr, required_vars[i].wide_eq);\n+        ptr += required_vars[i].len;\n+        var_size = GetEnvironmentVariableW(required_vars[i].wide, ptr, (int) (env_len - (ptr - dst)));\n+        if (var_size != len-1) { /* race condition? */\n+          uv_fatal_error(GetLastError(), \"GetEnvironmentVariableW\");\n+        }\n       }\n-      ptr += required_vars[i].value_len;\n+      i++;\n+    } else {\n+      /* copy var from env_block */\n+      len = wcslen(*ptr_copy)+1;\n+      DWORD r = wmemcpy_s(ptr, (env_len - (ptr - dst)), *ptr_copy, len);","path":"src/win/process.c","position":299,"original_position":299,"commit_id":"63b826d03da53ac2a50e1e16e22503261b284fb7","original_commit_id":"63b826d03da53ac2a50e1e16e22503261b284fb7","user":{"login":"saghul","id":317464,"avatar_url":"https://avatars.githubusercontent.com/u/317464?","gravatar_id":"acb8a5d8b51267e636e4736eee1379ea","url":"https://api.github.com/users/saghul","html_url":"https://github.com/saghul","followers_url":"https://api.github.com/users/saghul/followers","following_url":"https://api.github.com/users/saghul/following{/other_user}","gists_url":"https://api.github.com/users/saghul/gists{/gist_id}","starred_url":"https://api.github.com/users/saghul/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/saghul/subscriptions","organizations_url":"https://api.github.com/users/saghul/orgs","repos_url":"https://api.github.com/users/saghul/repos","events_url":"https://api.github.com/users/saghul/events{/privacy}","received_events_url":"https://api.github.com/users/saghul/received_events","type":"User","site_admin":false},"body":"Yeah, that will do.","created_at":"2014-07-28T23:13:23Z","updated_at":"2014-07-28T23:13:23Z","html_url":"https://github.com/joyent/libuv/pull/1276#discussion_r15497372","pull_request_url":"https://api.github.com/repos/joyent/libuv/pulls/1276","_links":{"self":{"href":"https://api.github.com/repos/joyent/libuv/pulls/comments/15497372"},"html":{"href":"https://github.com/joyent/libuv/pull/1276#discussion_r15497372"},"pull_request":{"href":"https://api.github.com/repos/joyent/libuv/pulls/1276"}}},"pull_request":{"url":"https://api.github.com/repos/joyent/libuv/pulls/1276","id":15730862,"html_url":"https://github.com/joyent/libuv/pull/1276","diff_url":"https://github.com/joyent/libuv/pull/1276.diff","patch_url":"https://github.com/joyent/libuv/pull/1276.patch","issue_url":"https://api.github.com/repos/joyent/libuv/issues/1276","number":1276,"state":"open","title":"windows: required environment variables","user":{"login":"vtjnash","id":330950,"avatar_url":"https://avatars.githubusercontent.com/u/330950?","gravatar_id":"8af4d5971a2308b86a94f58fb98129c5","url":"https://api.github.com/users/vtjnash","html_url":"https://github.com/vtjnash","followers_url":"https://api.github.com/users/vtjnash/followers","following_url":"https://api.github.com/users/vtjnash/following{/other_user}","gists_url":"https://api.github.com/users/vtjnash/gists{/gist_id}","starred_url":"https://api.github.com/users/vtjnash/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vtjnash/subscriptions","organizations_url":"https://api.github.com/users/vtjnash/orgs","repos_url":"https://api.github.com/users/vtjnash/repos","events_url":"https://api.github.com/users/vtjnash/events{/privacy}","received_events_url":"https://api.github.com/users/vtjnash/received_events","type":"User","site_admin":false},"body":"adds more of the undocumented-but-seemingly-required environment variables for uv_spawn\r\n\r\nwritten to address https://github.com/JuliaLang/julia/issues/5574\r\n\r\nthis list was created with the help of https://github.com/Alexpux/Cygwin/blob/b266b04fbbd3a595f02ea149e4306d3ab9b1fe3d/winsup/cygwin/environ.cc#L955 to get a more complete list\r\n\r\nI notice that cygwin file also ensures certain variables are uppercase for compatibility \"for posix and backwards compatibility\". Would you be interested in a pull request (written from scratch, but using the same variable list for reference) so that libuv also also does this? Or does this seem like a non-existent issue for libuv?","created_at":"2014-05-10T05:32:17Z","updated_at":"2014-07-28T23:13:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0862c207aa72c819b3d6f6eab8264479bab94d7f","assignee":null,"milestone":{"url":"https://api.github.com/repos/joyent/libuv/milestones/5","labels_url":"https://api.github.com/repos/joyent/libuv/milestones/5/labels","id":725845,"number":5,"title":"v0.12","description":null,"creator":{"login":"saghul","id":317464,"avatar_url":"https://avatars.githubusercontent.com/u/317464?","gravatar_id":"acb8a5d8b51267e636e4736eee1379ea","url":"https://api.github.com/users/saghul","html_url":"https://github.com/saghul","followers_url":"https://api.github.com/users/saghul/followers","following_url":"https://api.github.com/users/saghul/following{/other_user}","gists_url":"https://api.github.com/users/saghul/gists{/gist_id}","starred_url":"https://api.github.com/users/saghul/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/saghul/subscriptions","organizations_url":"https://api.github.com/users/saghul/orgs","repos_url":"https://api.github.com/users/saghul/repos","events_url":"https://api.github.com/users/saghul/events{/privacy}","received_events_url":"https://api.github.com/users/saghul/received_events","type":"User","site_admin":false},"open_issues":7,"closed_issues":3,"state":"open","created_at":"2014-07-19T09:10:45Z","updated_at":"2014-07-28T07:43:13Z","due_on":null},"commits_url":"https://api.github.com/repos/joyent/libuv/pulls/1276/commits","review_comments_url":"https://api.github.com/repos/joyent/libuv/pulls/1276/comments","review_comment_url":"https://api.github.com/repos/joyent/libuv/pulls/comments/{number}","comments_url":"https://api.github.com/repos/joyent/libuv/issues/1276/comments","statuses_url":"https://api.github.com/repos/joyent/libuv/statuses/63b826d03da53ac2a50e1e16e22503261b284fb7","head":{"label":"JuliaLang:jn/win_req_env_vars","ref":"jn/win_req_env_vars","sha":"63b826d03da53ac2a50e1e16e22503261b284fb7","user":{"login":"JuliaLang","id":743164,"avatar_url":"https://avatars.githubusercontent.com/u/743164?","gravatar_id":"d57c99557ab0dc0fa44b4c84447d0f15","url":"https://api.github.com/users/JuliaLang","html_url":"https://github.com/JuliaLang","followers_url":"https://api.github.com/users/JuliaLang/followers","following_url":"https://api.github.com/users/JuliaLang/following{/other_user}","gists_url":"https://api.github.com/users/JuliaLang/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaLang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaLang/subscriptions","organizations_url":"https://api.github.com/users/JuliaLang/orgs","repos_url":"https://api.github.com/users/JuliaLang/repos","events_url":"https://api.github.com/users/JuliaLang/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaLang/received_events","type":"Organization","site_admin":false},"repo":{"id":3619945,"name":"libuv","full_name":"JuliaLang/libuv","owner":{"login":"JuliaLang","id":743164,"avatar_url":"https://avatars.githubusercontent.com/u/743164?","gravatar_id":"d57c99557ab0dc0fa44b4c84447d0f15","url":"https://api.github.com/users/JuliaLang","html_url":"https://github.com/JuliaLang","followers_url":"https://api.github.com/users/JuliaLang/followers","following_url":"https://api.github.com/users/JuliaLang/following{/other_user}","gists_url":"https://api.github.com/users/JuliaLang/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaLang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaLang/subscriptions","organizations_url":"https://api.github.com/users/JuliaLang/orgs","repos_url":"https://api.github.com/users/JuliaLang/repos","events_url":"https://api.github.com/users/JuliaLang/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaLang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/JuliaLang/libuv","description":"Platform-independent event layer for Node.js.","fork":true,"url":"https://api.github.com/repos/JuliaLang/libuv","forks_url":"https://api.github.com/repos/JuliaLang/libuv/forks","keys_url":"https://api.github.com/repos/JuliaLang/libuv/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JuliaLang/libuv/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JuliaLang/libuv/teams","hooks_url":"https://api.github.com/repos/JuliaLang/libuv/hooks","issue_events_url":"https://api.github.com/repos/JuliaLang/libuv/issues/events{/number}","events_url":"https://api.github.com/repos/JuliaLang/libuv/events","assignees_url":"https://api.github.com/repos/JuliaLang/libuv/assignees{/user}","branches_url":"https://api.github.com/repos/JuliaLang/libuv/branches{/branch}","tags_url":"https://api.github.com/repos/JuliaLang/libuv/tags","blobs_url":"https://api.github.com/repos/JuliaLang/libuv/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JuliaLang/libuv/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JuliaLang/libuv/git/refs{/sha}","trees_url":"https://api.github.com/repos/JuliaLang/libuv/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JuliaLang/libuv/statuses/{sha}","languages_url":"https://api.github.com/repos/JuliaLang/libuv/languages","stargazers_url":"https://api.github.com/repos/JuliaLang/libuv/stargazers","contributors_url":"https://api.github.com/repos/JuliaLang/libuv/contributors","subscribers_url":"https://api.github.com/repos/JuliaLang/libuv/subscribers","subscription_url":"https://api.github.com/repos/JuliaLang/libuv/subscription","commits_url":"https://api.github.com/repos/JuliaLang/libuv/commits{/sha}","git_commits_url":"https://api.github.com/repos/JuliaLang/libuv/git/commits{/sha}","comments_url":"https://api.github.com/repos/JuliaLang/libuv/comments{/number}","issue_comment_url":"https://api.github.com/repos/JuliaLang/libuv/issues/comments/{number}","contents_url":"https://api.github.com/repos/JuliaLang/libuv/contents/{+path}","compare_url":"https://api.github.com/repos/JuliaLang/libuv/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JuliaLang/libuv/merges","archive_url":"https://api.github.com/repos/JuliaLang/libuv/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JuliaLang/libuv/downloads","issues_url":"https://api.github.com/repos/JuliaLang/libuv/issues{/number}","pulls_url":"https://api.github.com/repos/JuliaLang/libuv/pulls{/number}","milestones_url":"https://api.github.com/repos/JuliaLang/libuv/milestones{/number}","notifications_url":"https://api.github.com/repos/JuliaLang/libuv/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JuliaLang/libuv/labels{/name}","releases_url":"https://api.github.com/repos/JuliaLang/libuv/releases{/id}","created_at":"2012-03-04T18:07:09Z","updated_at":"2014-06-26T14:52:22Z","pushed_at":"2014-07-28T14:28:19Z","git_url":"git://github.com/JuliaLang/libuv.git","ssh_url":"git@github.com:JuliaLang/libuv.git","clone_url":"https://github.com/JuliaLang/libuv.git","svn_url":"https://github.com/JuliaLang/libuv","homepage":"http://nodejs.org/","size":13801,"stargazers_count":5,"watchers_count":5,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":6,"mirror_url":null,"open_issues_count":1,"forks":6,"open_issues":1,"watchers":5,"default_branch":"julia-uv0.11.26"}},"base":{"label":"joyent:master","ref":"master","sha":"eee4776549f4fc1b941506962dfa6e11a9773976","user":{"login":"joyent","id":10161,"avatar_url":"https://avatars.githubusercontent.com/u/10161?","gravatar_id":"95c8b4070c2ba024f87a8fdca63e9d24","url":"https://api.github.com/users/joyent","html_url":"https://github.com/joyent","followers_url":"https://api.github.com/users/joyent/followers","following_url":"https://api.github.com/users/joyent/following{/other_user}","gists_url":"https://api.github.com/users/joyent/gists{/gist_id}","starred_url":"https://api.github.com/users/joyent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joyent/subscriptions","organizations_url":"https://api.github.com/users/joyent/orgs","repos_url":"https://api.github.com/users/joyent/repos","events_url":"https://api.github.com/users/joyent/events{/privacy}","received_events_url":"https://api.github.com/users/joyent/received_events","type":"Organization","site_admin":false},"repo":{"id":1543431,"name":"libuv","full_name":"joyent/libuv","owner":{"login":"joyent","id":10161,"avatar_url":"https://avatars.githubusercontent.com/u/10161?","gravatar_id":"95c8b4070c2ba024f87a8fdca63e9d24","url":"https://api.github.com/users/joyent","html_url":"https://github.com/joyent","followers_url":"https://api.github.com/users/joyent/followers","following_url":"https://api.github.com/users/joyent/following{/other_user}","gists_url":"https://api.github.com/users/joyent/gists{/gist_id}","starred_url":"https://api.github.com/users/joyent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joyent/subscriptions","organizations_url":"https://api.github.com/users/joyent/orgs","repos_url":"https://api.github.com/users/joyent/repos","events_url":"https://api.github.com/users/joyent/events{/privacy}","received_events_url":"https://api.github.com/users/joyent/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/joyent/libuv","description":"Cross-platform asychronous I/O","fork":false,"url":"https://api.github.com/repos/joyent/libuv","forks_url":"https://api.github.com/repos/joyent/libuv/forks","keys_url":"https://api.github.com/repos/joyent/libuv/keys{/key_id}","collaborators_url":"https://api.github.com/repos/joyent/libuv/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/joyent/libuv/teams","hooks_url":"https://api.github.com/repos/joyent/libuv/hooks","issue_events_url":"https://api.github.com/repos/joyent/libuv/issues/events{/number}","events_url":"https://api.github.com/repos/joyent/libuv/events","assignees_url":"https://api.github.com/repos/joyent/libuv/assignees{/user}","branches_url":"https://api.github.com/repos/joyent/libuv/branches{/branch}","tags_url":"https://api.github.com/repos/joyent/libuv/tags","blobs_url":"https://api.github.com/repos/joyent/libuv/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/joyent/libuv/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/joyent/libuv/git/refs{/sha}","trees_url":"https://api.github.com/repos/joyent/libuv/git/trees{/sha}","statuses_url":"https://api.github.com/repos/joyent/libuv/statuses/{sha}","languages_url":"https://api.github.com/repos/joyent/libuv/languages","stargazers_url":"https://api.github.com/repos/joyent/libuv/stargazers","contributors_url":"https://api.github.com/repos/joyent/libuv/contributors","subscribers_url":"https://api.github.com/repos/joyent/libuv/subscribers","subscription_url":"https://api.github.com/repos/joyent/libuv/subscription","commits_url":"https://api.github.com/repos/joyent/libuv/commits{/sha}","git_commits_url":"https://api.github.com/repos/joyent/libuv/git/commits{/sha}","comments_url":"https://api.github.com/repos/joyent/libuv/comments{/number}","issue_comment_url":"https://api.github.com/repos/joyent/libuv/issues/comments/{number}","contents_url":"https://api.github.com/repos/joyent/libuv/contents/{+path}","compare_url":"https://api.github.com/repos/joyent/libuv/compare/{base}...{head}","merges_url":"https://api.github.com/repos/joyent/libuv/merges","archive_url":"https://api.github.com/repos/joyent/libuv/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/joyent/libuv/downloads","issues_url":"https://api.github.com/repos/joyent/libuv/issues{/number}","pulls_url":"https://api.github.com/repos/joyent/libuv/pulls{/number}","milestones_url":"https://api.github.com/repos/joyent/libuv/milestones{/number}","notifications_url":"https://api.github.com/repos/joyent/libuv/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/joyent/libuv/labels{/name}","releases_url":"https://api.github.com/repos/joyent/libuv/releases{/id}","created_at":"2011-03-29T21:10:45Z","updated_at":"2014-07-28T21:08:32Z","pushed_at":"2014-07-28T07:43:12Z","git_url":"git://github.com/joyent/libuv.git","ssh_url":"git@github.com:joyent/libuv.git","clone_url":"https://github.com/joyent/libuv.git","svn_url":"https://github.com/joyent/libuv","homepage":"http://libuv.org/","size":26779,"stargazers_count":2950,"watchers_count":2950,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":656,"mirror_url":null,"open_issues_count":121,"forks":656,"open_issues":121,"watchers":2950,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/joyent/libuv/pulls/1276"},"html":{"href":"https://github.com/joyent/libuv/pull/1276"},"issue":{"href":"https://api.github.com/repos/joyent/libuv/issues/1276"},"comments":{"href":"https://api.github.com/repos/joyent/libuv/issues/1276/comments"},"review_comments":{"href":"https://api.github.com/repos/joyent/libuv/pulls/1276/comments"},"review_comment":{"href":"https://api.github.com/repos/joyent/libuv/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/joyent/libuv/pulls/1276/commits"},"statuses":{"href":"https://api.github.com/repos/joyent/libuv/statuses/63b826d03da53ac2a50e1e16e22503261b284fb7"}}}}