{"action":"created","comment":{"url":"https://api.github.com/repos/nodejs/nodereport/pulls/comments/83261721","pull_request_review_id":4109035,"id":83261721,"diff_hunk":"@@ -0,0 +1,808 @@\n+#include \"node_report.h\"\n+#include \"node_version.h\"\n+#include \"v8.h\"\n+#include \"time.h\"\n+#include \"zlib.h\"\n+#include \"ares.h\"\n+\n+#include <fcntl.h>\n+#include <string.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+\n+#if !defined(_MSC_VER)\n+#include <strings.h>\n+#endif\n+\n+#ifdef _WIN32\n+#include <Windows.h>\n+#include <process.h>\n+#include <dbghelp.h>\n+#include <VersionHelpers.h>\n+#else\n+#include <sys/time.h>\n+#include <unistd.h>\n+#include <sys/resource.h>\n+#include <inttypes.h>\n+#include <cxxabi.h>\n+#include <dlfcn.h>\n+#include <execinfo.h>\n+#include <sys/utsname.h>\n+#endif\n+\n+#ifndef _WIN32\n+extern char **environ;\n+#endif\n+\n+namespace nodereport {\n+\n+using v8::HeapSpaceStatistics;\n+using v8::HeapStatistics;\n+using v8::Isolate;\n+using v8::Local;\n+using v8::Message;\n+using v8::StackFrame;\n+using v8::StackTrace;\n+using v8::String;\n+using v8::V8;\n+\n+// Internal/static function declarations\n+static void PrintVersionInformation(FILE *fp);\n+static void PrintJavaScriptStack(FILE *fp, Isolate* isolate, DumpEvent event, const char *location);\n+static void PrintStackFromStackTrace(FILE* fp, Isolate* isolate, DumpEvent event);\n+static void PrintStackFrame(FILE* fp, Isolate* isolate, Local<StackFrame> frame, int index, void *pc);\n+static void PrintNativeStack(FILE *fp);\n+#ifndef _WIN32\n+static void PrintResourceUsage(FILE *fp);\n+#endif\n+static void PrintGCStatistics(FILE *fp, Isolate* isolate);\n+static void PrintSystemInformation(FILE *fp, Isolate* isolate);\n+static void WriteInteger(FILE *fp, size_t value);\n+\n+// Global variables\n+static int seq = 0;  // sequence number for NodeReport filenames\n+const char* v8_states[] = {\"JS\", \"GC\", \"COMPILER\", \"OTHER\", \"EXTERNAL\", \"IDLE\"};\n+static bool report_active = false; // recursion protection\n+static char report_filename[NR_MAXNAME + 1] = \"\";\n+static char report_directory[NR_MAXPATH + 1] = \"\"; // defaults to current working directory\n+#ifdef _WIN32\n+static SYSTEMTIME loadtime_tm_struct; // module load time\n+#else  // UNIX, OSX\n+static struct tm loadtime_tm_struct; // module load time\n+#endif\n+\n+/*******************************************************************************\n+ * Functions to process nodereport configuration options:\n+ *   Trigger event selection\n+ *   Core dump yes/no switch\n+ *   Trigger signal selection\n+ *   NodeReport filename\n+ *   NodeReport directory\n+ *   Verbose mode\n+ ******************************************************************************/\n+unsigned int ProcessNodeReportEvents(const char *args) {\n+  // Parse the supplied event types\n+  unsigned int event_flags = 0;\n+  const char* cursor = args;\n+  while (*cursor != '\\0') {\n+    if (!strncmp(cursor, \"exception\", sizeof(\"exception\") - 1)) {\n+      event_flags |= NR_EXCEPTION;\n+      cursor += sizeof(\"exception\") - 1;\n+    } else if (!strncmp(cursor, \"fatalerror\", sizeof(\"fatalerror\") - 1)) {\n+       event_flags |= NR_FATALERROR;\n+       cursor += sizeof(\"fatalerror\") - 1;\n+    } else if (!strncmp(cursor, \"signal\", sizeof(\"signal\") - 1)) {\n+        event_flags |= NR_SIGNAL;\n+        cursor += sizeof(\"signal\") - 1;\n+    } else if (!strncmp(cursor, \"apicall\", sizeof(\"apicall\") - 1)) {\n+        event_flags |= NR_APICALL;\n+        cursor += sizeof(\"apicall\") - 1;\n+    } else {\n+      fprintf(stderr, \"Unrecognised argument for nodereport events option: %s\\n\", cursor);\n+       return 0;\n+    }\n+    if (*cursor == '+') {\n+      cursor++;  // Hop over the '+' separator\n+    }\n+  }\n+  return event_flags;\n+}\n+\n+unsigned int ProcessNodeReportCoreSwitch(const char *args) {\n+  if (strlen(args) == 0) {\n+    fprintf(stderr, \"Missing argument for nodereport core switch option\\n\");\n+  } else {\n+    // Parse the supplied switch\n+    if (!strncmp(args, \"yes\", sizeof(\"yes\") - 1) || !strncmp(args, \"true\", sizeof(\"true\") - 1)) {\n+      return 1;\n+    } else if (!strncmp(args, \"no\", sizeof(\"no\") - 1) || !strncmp(args, \"false\", sizeof(\"false\") - 1)) {\n+      return 0;\n+    } else {\n+      fprintf(stderr, \"Unrecognised argument for nodereport core switch option: %s\\n\", args);\n+    }\n+  }\n+  return 1;  // Default is to produce core dumps\n+}\n+\n+unsigned int ProcessNodeReportSignal(const char *args) {\n+#ifdef _WIN32\n+  return 0; // no-op on Windows\n+#else\n+  if (strlen(args) == 0) {\n+    fprintf(stderr, \"Missing argument for nodereport signal option\\n\");\n+  } else {\n+    // Parse the supplied switch\n+    if (!strncmp(args, \"SIGUSR2\", sizeof(\"SIGUSR2\") - 1)) {\n+      return SIGUSR2;\n+    } else if (!strncmp(args, \"SIGQUIT\", sizeof(\"SIGQUIT\") - 1)) {\n+      return SIGQUIT;\n+    } else {\n+      fprintf(stderr, \"Unrecognised argument for nodereport signal option: %s\\n\", args);\n+    }\n+  }\n+  return SIGUSR2;  // Default signal is SIGUSR2\n+#endif\n+}\n+\n+void ProcessNodeReportFileName(const char *args) {\n+  if (strlen(args) == 0) {\n+    fprintf(stderr, \"Missing argument for nodereport filename option\\n\");\n+    return;\n+  }\n+  if (strlen(args) > NR_MAXNAME) {\n+    fprintf(stderr, \"Supplied nodereport filename too long (max %d characters)\\n\", NR_MAXNAME);\n+    return;\n+  }\n+  snprintf(report_filename, sizeof(report_filename), \"%s\", args);\n+}\n+\n+void ProcessNodeReportDirectory(const char *args) {\n+  if (strlen(args) == 0) {\n+    fprintf(stderr, \"Missing argument for nodereport directory option\\n\");\n+    return;\n+  }\n+  if (strlen(args) > NR_MAXPATH) {\n+    fprintf(stderr, \"Supplied nodereport directory path too long (max %d characters)\\n\", NR_MAXPATH);\n+    return;\n+  }\n+  snprintf(report_directory, sizeof(report_directory), \"%s\", args);\n+}\n+\n+unsigned int ProcessNodeReportVerboseSwitch(const char *args) {\n+  if (strlen(args) == 0) {\n+    fprintf(stderr, \"Missing argument for nodereport verbose switch option\\n\");\n+    return 0;\n+  }\n+  // Parse the supplied switch\n+  if (!strncmp(args, \"yes\", sizeof(\"yes\") - 1) || !strncmp(args, \"true\", sizeof(\"true\") - 1)) {\n+    return 1;\n+  } else if (!strncmp(args, \"no\", sizeof(\"no\") - 1) || !strncmp(args, \"false\", sizeof(\"false\") - 1)) {\n+    return 0;\n+  } else {\n+    fprintf(stderr, \"Unrecognised argument for nodereport verbose switch option: %s\\n\", args);\n+  }\n+  return 0;  // Default is verbose mode off\n+}\n+\n+/*******************************************************************************\n+ * Function to save the nodereport module load time value\n+ *******************************************************************************/\n+void SetLoadTime() {\n+#ifdef _WIN32\n+  GetLocalTime(&loadtime_tm_struct);\n+#else  // UNIX, OSX\n+  struct timeval time_val;\n+  gettimeofday(&time_val, NULL);\n+  localtime_r(&time_val.tv_sec, &loadtime_tm_struct);\n+#endif\n+}\n+/*******************************************************************************\n+ * Main API function to write a NodeReport to file.\n+ *\n+ * Parameters:\n+ *   Isolate* isolate\n+ *   DumpEvent event\n+ *   const char *message\n+ *   const char *location\n+ *   char *name - in/out - returns the NodeReport filename\n+ ******************************************************************************/\n+void TriggerNodeReport(Isolate* isolate, DumpEvent event, const char *message, const char *location, char *name) {\n+  // Recursion check for NodeReport in progress, bail out\n+  if (report_active) return; \n+  report_active = true;\n+\n+  // Obtain the current time and the pid (platform dependent)\n+#ifdef _WIN32\n+  SYSTEMTIME tm_struct;\n+  GetLocalTime(&tm_struct);\n+  DWORD pid = GetCurrentProcessId();\n+#else  // UNIX, OSX\n+  struct timeval time_val;\n+  struct tm tm_struct;\n+  gettimeofday(&time_val, NULL);\n+  localtime_r(&time_val.tv_sec, &tm_struct);\n+  pid_t pid = getpid();\n+#endif\n+\n+  // Determine the required NodeReport filename. In order of priority:\n+  //   1) supplied on API 2) configured on startup 3) default generated\n+  char filename[NR_MAXNAME + 1] = \"\";\n+  if (name != NULL && strlen(name) > 0) {\n+    // Filename was specified as API parameter, use that\n+    snprintf(filename, sizeof(filename), \"%s\", name);\n+  } else if (strlen(report_filename) > 0) {\n+    // File name was supplied via start-up option, use that\n+    snprintf(filename, sizeof(filename), \"%s\", report_filename);\n+  } else {\n+    // Construct the NodeReport filename, with timestamp, pid and sequence number\n+    snprintf(filename, sizeof(filename), \"%s\", \"NodeReport\");\n+    seq++;\n+\n+#ifdef _WIN32\n+    snprintf(&filename[strlen(filename)], sizeof(filename) - strlen(filename),\n+             \".%4d%02d%02d.%02d%02d%02d.%d.%03d.txt\",\n+             tm_struct.wYear, tm_struct.wMonth, tm_struct.wDay,\n+             tm_struct.wHour, tm_struct.wMinute, tm_struct.wSecond,\n+            pid, seq);\n+#else  // UNIX, OSX\n+    snprintf(&filename[strlen(filename)], sizeof(filename) - strlen(filename),\n+             \".%4d%02d%02d.%02d%02d%02d.%d.%03d.txt\",\n+             tm_struct.tm_year+1900, tm_struct.tm_mon+1, tm_struct.tm_mday,\n+             tm_struct.tm_hour, tm_struct.tm_min, tm_struct.tm_sec,\n+             pid, seq);\n+#endif\n+  }\n+\n+  // Open the NodeReport file stream for writing. Supports stdout/err, user-specified or (default) generated name\n+  FILE *fp = NULL;\n+  if (!strncmp(filename, \"stdout\", sizeof(\"stdout\") - 1)) {\n+    fp = stdout;\n+  } else if (!strncmp(filename, \"stderr\", sizeof(\"stderr\") - 1)) {\n+    fp = stderr;\n+  } else {\n+    // Regular file. Append filename to directory path if one was specified\n+    if (strlen(report_directory) > 0) {\n+      char pathname[NR_MAXPATH + NR_MAXNAME + 1] = \"\";\n+      snprintf(pathname, sizeof(pathname), \"%s\", report_directory);\n+#ifdef _WIN32\n+      strcat(pathname, \"\\\\\");\n+#else\n+      strcat(pathname, \"/\");\n+#endif\n+      strncat(pathname, filename, NR_MAXNAME);\n+      fp = fopen(pathname, \"w\");\n+    } else {\n+      fp = fopen(filename, \"w\");\n+    }\n+    // Check for errors on the file open\n+    if (fp == NULL) {\n+      if (strlen(report_directory) > 0) {\n+        fprintf(stderr, \"\\nFailed to open Node.js report file: %s directory: %s (errno: %d)\\n\", filename, report_directory, errno);\n+      } else {\n+        fprintf(stderr, \"\\nFailed to open Node.js report file: %s (errno: %d)\\n\", filename, errno);\n+      }\n+      return;\n+    } else {\n+      fprintf(stderr, \"\\nWriting Node.js report to file: %s\\n\", filename);\n+    }\n+  }\n+\n+  // File stream opened OK, now start printing the NodeReport content, starting with the title\n+  // and header information (event, filename, timestamp and pid)\n+  fprintf(fp, \"================================================================================\\n\");\n+  fprintf(fp, \"==== NodeReport ================================================================\\n\");\n+  fprintf(fp, \"\\nEvent: %s, location: \\\"%s\\\"\\n\", message, location);\n+  fprintf(fp, \"Filename: %s\\n\", filename);\n+\n+  // Print dump event and module load date/time stamps\n+#ifdef _WIN32\n+  fprintf(fp, \"Dump event time:  %4d/%02d/%02d %02d:%02d:%02d\\n\",\n+          tm_struct.wYear, tm_struct.wMonth, tm_struct.wDay,\n+          tm_struct.wHour, tm_struct.wMinute, tm_struct.wSecond);\n+  fprintf(fp, \"Module load time: %4d/%02d/%02d %02d:%02d:%02d\\n\",\n+          loadtime_tm_struct.wYear, loadtime_tm_struct.wMonth, loadtime_tm_struct.wDay,\n+          loadtime_tm_struct.wHour, loadtime_tm_struct.wMinute, loadtime_tm_struct.wSecond);\n+#else  // UNIX, OSX\n+  fprintf(fp, \"Dump event time:  %4d/%02d/%02d %02d:%02d:%02d\\n\",\n+          tm_struct.tm_year+1900, tm_struct.tm_mon+1, tm_struct.tm_mday,\n+          tm_struct.tm_hour, tm_struct.tm_min, tm_struct.tm_sec);\n+  fprintf(fp, \"Module load time: %4d/%02d/%02d %02d:%02d:%02d\\n\",\n+          loadtime_tm_struct.tm_year+1900, loadtime_tm_struct.tm_mon+1, loadtime_tm_struct.tm_mday,\n+          loadtime_tm_struct.tm_hour, loadtime_tm_struct.tm_min, loadtime_tm_struct.tm_sec);\n+#endif\n+  // Print native process ID\n+  fprintf(fp, \"Process ID: %d\\n\", pid);\n+  fflush(fp);\n+\n+  // Print Node.js and OS version information\n+  PrintVersionInformation(fp);\n+  fflush(fp);\n+\n+// Print summary JavaScript stack backtrace\n+  PrintJavaScriptStack(fp, isolate, event, location);\n+  fflush(fp);\n+\n+  // Print native stack backtrace\n+  PrintNativeStack(fp);\n+  fflush(fp);\n+\n+  // Print V8 Heap and Garbage Collector information\n+  PrintGCStatistics(fp, isolate);\n+  fflush(fp);\n+\n+  // Print OS and current thread resource usage\n+#ifndef _WIN32\n+  PrintResourceUsage(fp);\n+  fflush(fp);\n+#endif\n+\n+  // Print libuv handle summary (TODO: investigate failure on Windows)\n+  // Note: documentation of the uv_print_all_handles() API says \"This function\n+  // is meant for ad hoc debugging, there is no API/ABI stability guarantee\"\n+  // http://docs.libuv.org/en/v1.x/misc.html\n+#ifndef _WIN32\n+  fprintf(fp, \"\\n================================================================================\");\n+  fprintf(fp, \"\\n==== Node.js libuv Handle Summary ==============================================\\n\");\n+  fprintf(fp,\"\\n(Flags: R=Ref, A=Active, I=Internal)\\n\");\n+  fprintf(fp,\"\\nFlags Type     Address\\n\");\n+  uv_print_all_handles(NULL, fp);\n+  fflush(fp);\n+#endif\n+\n+  // Print operating system information\n+  PrintSystemInformation(fp, isolate);\n+\n+  fprintf(fp, \"\\n================================================================================\\n\");\n+  fflush(fp);\n+  fclose(fp);\n+\n+  fprintf(stderr, \"Node.js report completed\\n\");\n+  if (name != NULL) {\n+    snprintf(name, NR_MAXNAME + 1, \"%s\", filename);  // return the NodeReport file name\n+  }\n+  report_active = false;\n+}\n+\n+/*******************************************************************************\n+ * Function to print Node.js version, OS version and machine information\n+ *\n+ ******************************************************************************/\n+static void PrintVersionInformation(FILE *fp) {\n+\n+  // Print Node.js and deps component versions\n+  fprintf(fp, \"\\nNode.js version: %s\\n\", NODE_VERSION);\n+  fprintf(fp, \"(v8: %s, libuv: %s, zlib: %s, ares: %s)\\n\",\n+          V8::GetVersion(), uv_version_string(), ZLIB_VERSION, ARES_VERSION_STR);\n+\n+  // Print operating system and machine information (Windows)\n+#ifdef _WIN32\n+  fprintf(fp,\"\\nOS version: Windows \");\n+#if defined(_MSC_VER) && (_MSC_VER >= 1900)\n+  if (IsWindows1OrGreater()) {\n+    fprintf(fp,\"10 \");","path":"src/node_report.cc","position":382,"original_position":382,"commit_id":"2b5e0a0108b830156d08dc9f6df6e46aa5e50390","original_commit_id":"2b5e0a0108b830156d08dc9f6df6e46aa5e50390","user":{"login":"bnoordhuis","id":275871,"avatar_url":"https://avatars.githubusercontent.com/u/275871?v=3","gravatar_id":"","url":"https://api.github.com/users/bnoordhuis","html_url":"https://github.com/bnoordhuis","followers_url":"https://api.github.com/users/bnoordhuis/followers","following_url":"https://api.github.com/users/bnoordhuis/following{/other_user}","gists_url":"https://api.github.com/users/bnoordhuis/gists{/gist_id}","starred_url":"https://api.github.com/users/bnoordhuis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bnoordhuis/subscriptions","organizations_url":"https://api.github.com/users/bnoordhuis/orgs","repos_url":"https://api.github.com/users/bnoordhuis/repos","events_url":"https://api.github.com/users/bnoordhuis/events{/privacy}","received_events_url":"https://api.github.com/users/bnoordhuis/received_events","type":"User","site_admin":false},"body":"Space after comma, here and elsewhere.","created_at":"2016-10-13T16:54:03Z","updated_at":"2016-10-13T16:59:53Z","html_url":"https://github.com/nodejs/nodereport/pull/2#discussion_r83261721","pull_request_url":"https://api.github.com/repos/nodejs/nodereport/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/nodejs/nodereport/pulls/comments/83261721"},"html":{"href":"https://github.com/nodejs/nodereport/pull/2#discussion_r83261721"},"pull_request":{"href":"https://api.github.com/repos/nodejs/nodereport/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/nodejs/nodereport/pulls/2","id":82746518,"html_url":"https://github.com/nodejs/nodereport/pull/2","diff_url":"https://github.com/nodejs/nodereport/pull/2.diff","patch_url":"https://github.com/nodejs/nodereport/pull/2.patch","issue_url":"https://api.github.com/repos/nodejs/nodereport/issues/2","number":2,"state":"open","locked":false,"title":"Initial drop of nodereport project for nodejs repo","user":{"login":"rnchamberlain","id":16722535,"avatar_url":"https://avatars.githubusercontent.com/u/16722535?v=3","gravatar_id":"","url":"https://api.github.com/users/rnchamberlain","html_url":"https://github.com/rnchamberlain","followers_url":"https://api.github.com/users/rnchamberlain/followers","following_url":"https://api.github.com/users/rnchamberlain/following{/other_user}","gists_url":"https://api.github.com/users/rnchamberlain/gists{/gist_id}","starred_url":"https://api.github.com/users/rnchamberlain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rnchamberlain/subscriptions","organizations_url":"https://api.github.com/users/rnchamberlain/orgs","repos_url":"https://api.github.com/users/rnchamberlain/repos","events_url":"https://api.github.com/users/rnchamberlain/events{/privacy}","received_events_url":"https://api.github.com/users/rnchamberlain/received_events","type":"User","site_admin":false},"body":"Implementation of native NPM module for diagnostic report triggered on exception and fatal error events, signals and JavaScript API. Supports Node v4 and v6, Linux, Mac and Windows. Includes testcases and demo samples.","created_at":"2016-08-25T15:56:15Z","updated_at":"2016-10-13T16:59:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9b05575304f0b4ee1fb3429b71f5b3c872276798","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/nodejs/nodereport/pulls/2/commits","review_comments_url":"https://api.github.com/repos/nodejs/nodereport/pulls/2/comments","review_comment_url":"https://api.github.com/repos/nodejs/nodereport/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nodejs/nodereport/issues/2/comments","statuses_url":"https://api.github.com/repos/nodejs/nodereport/statuses/2b5e0a0108b830156d08dc9f6df6e46aa5e50390","head":{"label":"rnchamberlain:initial-drop","ref":"initial-drop","sha":"2b5e0a0108b830156d08dc9f6df6e46aa5e50390","user":{"login":"rnchamberlain","id":16722535,"avatar_url":"https://avatars.githubusercontent.com/u/16722535?v=3","gravatar_id":"","url":"https://api.github.com/users/rnchamberlain","html_url":"https://github.com/rnchamberlain","followers_url":"https://api.github.com/users/rnchamberlain/followers","following_url":"https://api.github.com/users/rnchamberlain/following{/other_user}","gists_url":"https://api.github.com/users/rnchamberlain/gists{/gist_id}","starred_url":"https://api.github.com/users/rnchamberlain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rnchamberlain/subscriptions","organizations_url":"https://api.github.com/users/rnchamberlain/orgs","repos_url":"https://api.github.com/users/rnchamberlain/repos","events_url":"https://api.github.com/users/rnchamberlain/events{/privacy}","received_events_url":"https://api.github.com/users/rnchamberlain/received_events","type":"User","site_admin":false},"repo":{"id":66478117,"name":"nodereport-1","full_name":"rnchamberlain/nodereport-1","owner":{"login":"rnchamberlain","id":16722535,"avatar_url":"https://avatars.githubusercontent.com/u/16722535?v=3","gravatar_id":"","url":"https://api.github.com/users/rnchamberlain","html_url":"https://github.com/rnchamberlain","followers_url":"https://api.github.com/users/rnchamberlain/followers","following_url":"https://api.github.com/users/rnchamberlain/following{/other_user}","gists_url":"https://api.github.com/users/rnchamberlain/gists{/gist_id}","starred_url":"https://api.github.com/users/rnchamberlain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rnchamberlain/subscriptions","organizations_url":"https://api.github.com/users/rnchamberlain/orgs","repos_url":"https://api.github.com/users/rnchamberlain/repos","events_url":"https://api.github.com/users/rnchamberlain/events{/privacy}","received_events_url":"https://api.github.com/users/rnchamberlain/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rnchamberlain/nodereport-1","description":null,"fork":true,"url":"https://api.github.com/repos/rnchamberlain/nodereport-1","forks_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/forks","keys_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/teams","hooks_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/hooks","issue_events_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/issues/events{/number}","events_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/events","assignees_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/assignees{/user}","branches_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/branches{/branch}","tags_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/tags","blobs_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/statuses/{sha}","languages_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/languages","stargazers_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/stargazers","contributors_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/contributors","subscribers_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/subscribers","subscription_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/subscription","commits_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/contents/{+path}","compare_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/merges","archive_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/downloads","issues_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/issues{/number}","pulls_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/pulls{/number}","milestones_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/milestones{/number}","notifications_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/labels{/name}","releases_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/releases{/id}","deployments_url":"https://api.github.com/repos/rnchamberlain/nodereport-1/deployments","created_at":"2016-08-24T15:54:53Z","updated_at":"2016-08-25T15:29:17Z","pushed_at":"2016-10-12T15:17:24Z","git_url":"git://github.com/rnchamberlain/nodereport-1.git","ssh_url":"git@github.com:rnchamberlain/nodereport-1.git","clone_url":"https://github.com/rnchamberlain/nodereport-1.git","svn_url":"https://github.com/rnchamberlain/nodereport-1","homepage":null,"size":41,"stargazers_count":0,"watchers_count":0,"language":"C++","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":"nodejs:master","ref":"master","sha":"72bc4d697efc9781421d2f52725f374b9e98a59b","user":{"login":"nodejs","id":9950313,"avatar_url":"https://avatars.githubusercontent.com/u/9950313?v=3","gravatar_id":"","url":"https://api.github.com/users/nodejs","html_url":"https://github.com/nodejs","followers_url":"https://api.github.com/users/nodejs/followers","following_url":"https://api.github.com/users/nodejs/following{/other_user}","gists_url":"https://api.github.com/users/nodejs/gists{/gist_id}","starred_url":"https://api.github.com/users/nodejs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nodejs/subscriptions","organizations_url":"https://api.github.com/users/nodejs/orgs","repos_url":"https://api.github.com/users/nodejs/repos","events_url":"https://api.github.com/users/nodejs/events{/privacy}","received_events_url":"https://api.github.com/users/nodejs/received_events","type":"Organization","site_admin":false},"repo":{"id":65297067,"name":"nodereport","full_name":"nodejs/nodereport","owner":{"login":"nodejs","id":9950313,"avatar_url":"https://avatars.githubusercontent.com/u/9950313?v=3","gravatar_id":"","url":"https://api.github.com/users/nodejs","html_url":"https://github.com/nodejs","followers_url":"https://api.github.com/users/nodejs/followers","following_url":"https://api.github.com/users/nodejs/following{/other_user}","gists_url":"https://api.github.com/users/nodejs/gists{/gist_id}","starred_url":"https://api.github.com/users/nodejs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nodejs/subscriptions","organizations_url":"https://api.github.com/users/nodejs/orgs","repos_url":"https://api.github.com/users/nodejs/repos","events_url":"https://api.github.com/users/nodejs/events{/privacy}","received_events_url":"https://api.github.com/users/nodejs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nodejs/nodereport","description":null,"fork":false,"url":"https://api.github.com/repos/nodejs/nodereport","forks_url":"https://api.github.com/repos/nodejs/nodereport/forks","keys_url":"https://api.github.com/repos/nodejs/nodereport/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nodejs/nodereport/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nodejs/nodereport/teams","hooks_url":"https://api.github.com/repos/nodejs/nodereport/hooks","issue_events_url":"https://api.github.com/repos/nodejs/nodereport/issues/events{/number}","events_url":"https://api.github.com/repos/nodejs/nodereport/events","assignees_url":"https://api.github.com/repos/nodejs/nodereport/assignees{/user}","branches_url":"https://api.github.com/repos/nodejs/nodereport/branches{/branch}","tags_url":"https://api.github.com/repos/nodejs/nodereport/tags","blobs_url":"https://api.github.com/repos/nodejs/nodereport/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nodejs/nodereport/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nodejs/nodereport/git/refs{/sha}","trees_url":"https://api.github.com/repos/nodejs/nodereport/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nodejs/nodereport/statuses/{sha}","languages_url":"https://api.github.com/repos/nodejs/nodereport/languages","stargazers_url":"https://api.github.com/repos/nodejs/nodereport/stargazers","contributors_url":"https://api.github.com/repos/nodejs/nodereport/contributors","subscribers_url":"https://api.github.com/repos/nodejs/nodereport/subscribers","subscription_url":"https://api.github.com/repos/nodejs/nodereport/subscription","commits_url":"https://api.github.com/repos/nodejs/nodereport/commits{/sha}","git_commits_url":"https://api.github.com/repos/nodejs/nodereport/git/commits{/sha}","comments_url":"https://api.github.com/repos/nodejs/nodereport/comments{/number}","issue_comment_url":"https://api.github.com/repos/nodejs/nodereport/issues/comments{/number}","contents_url":"https://api.github.com/repos/nodejs/nodereport/contents/{+path}","compare_url":"https://api.github.com/repos/nodejs/nodereport/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nodejs/nodereport/merges","archive_url":"https://api.github.com/repos/nodejs/nodereport/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nodejs/nodereport/downloads","issues_url":"https://api.github.com/repos/nodejs/nodereport/issues{/number}","pulls_url":"https://api.github.com/repos/nodejs/nodereport/pulls{/number}","milestones_url":"https://api.github.com/repos/nodejs/nodereport/milestones{/number}","notifications_url":"https://api.github.com/repos/nodejs/nodereport/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nodejs/nodereport/labels{/name}","releases_url":"https://api.github.com/repos/nodejs/nodereport/releases{/id}","deployments_url":"https://api.github.com/repos/nodejs/nodereport/deployments","created_at":"2016-08-09T13:25:33Z","updated_at":"2016-10-06T08:03:56Z","pushed_at":"2016-10-12T15:17:25Z","git_url":"git://github.com/nodejs/nodereport.git","ssh_url":"git@github.com:nodejs/nodereport.git","clone_url":"https://github.com/nodejs/nodereport.git","svn_url":"https://github.com/nodejs/nodereport","homepage":null,"size":3,"stargazers_count":14,"watchers_count":14,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":14,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nodejs/nodereport/pulls/2"},"html":{"href":"https://github.com/nodejs/nodereport/pull/2"},"issue":{"href":"https://api.github.com/repos/nodejs/nodereport/issues/2"},"comments":{"href":"https://api.github.com/repos/nodejs/nodereport/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/nodejs/nodereport/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/nodejs/nodereport/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nodejs/nodereport/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/nodejs/nodereport/statuses/2b5e0a0108b830156d08dc9f6df6e46aa5e50390"}}}}
{"actor":{"display_login":"bnoordhuis"}}