{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla/socorro/pulls/comments/42801892","id":42801892,"diff_hunk":"@@ -1,6 +1,531 @@\n-#! /bin/bash -e\n+#!/bin/bash\n \n-# run socorro integration test\n-echo \"Running integration test...\"\n-./scripts/rabbitmq-integration-test.sh --destroy\n-./scripts/rabbitmq-integration-test-2015.sh --destroy\n+# integration test for Socorro, using rabbitmq\n+#\n+# bring up components, submit test crash, ensure that it shows up in\n+# reports tables.\n+#\n+# This uses the same setup as http://socorro.readthedocs.org/en/latest/installation.html\n+\n+echo this is integration-test.sh\n+\n+export PATH=$PATH:${VIRTUAL_ENV:-\"socorro-virtualenv\"}/bin:$PWD/scripts\n+export PYTHONPATH=.\n+\n+source scripts/defaults\n+\n+if [ \"$#\" != \"1\" ] || [ \"$1\" != \"--destroy\" ]\n+then\n+  echo \"WARNING - this script will destroy the local socorro install.\"\n+  echo \"The default database and config files will be overwritten.\"\n+  echo \"You must pass the --destroy flag to continue.\"\n+  exit 1\n+fi\n+\n+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n+#  support functions section\n+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n+\n+#------------------------------------------------------------------------------\n+# send in an error code and a message.\n+# If the error is 0, do nothing\n+# If the error is anything else, send the message to stdout and then\n+# exit using the error code\n+#------------------------------------------------------------------------------\n+function fatal() {\n+  exit_code=$1\n+  message=$2\n+\n+  if [ $exit_code != 0 ]\n+  then\n+    echo \"ERROR: $message\"\n+    cleanup\n+    exit $exit_code\n+  fi\n+}\n+\n+#------------------------------------------------------------------------------\n+# send in an error code, the basename of a log file, and a message\n+# if the error code is 0, do nothing\n+# if the error code is anything else, send the message to stdout, cat the log\n+# file associated with the basename, then send the error code on to the 'fatal'\n+# function\n+#------------------------------------------------------------------------------\n+function cat_log_on_error() {\n+  error_code=$1\n+  log_base_name=$2\n+  message=$3\n+  if [ $error_code != 0 ]\n+  then\n+    echo \"$log_base_name failed, $message\"\n+    cat $log_base_name.log\n+    fatal $error_code \"$log_base_name failure terminated this test with error code $error_code\"\n+  fi\n+}\n+\n+#------------------------------------------------------------------------------\n+# send in the basename of a log file\n+# if the words ERROR or CRIT are in the log file, send a message about it to\n+# stdout, cat the log file, then pass the error along with a message to the\n+# 'fatal' function\n+#------------------------------------------------------------------------------\n+function cat_log_on_log_error() {\n+  log_base_name=$1\n+  for err_type in ERROR CRIT\n+  do\n+    grep $err_type $log_base_name.log > /dev/null\n+    err_found=$?\n+    if [ $err_found = 0 ]\n+    then\n+      echo \"$log_base_name.log contanins $err_type\"\n+      cat $log_base_name.log\n+      fatal $err_found \"$log_base_name $err_type terminated this test\"\n+    fi\n+  done\n+}\n+\n+#------------------------------------------------------------------------------\n+# send in an error code and the base name of a log file.\n+# offer these to the error code test function 'cat_log_on_log_error' and the\n+# the log file test function 'cat_log_on_error'\n+#------------------------------------------------------------------------------\n+function check_for_logged_fatal_errors() {\n+  error_code=$1\n+  log_base_name=$2\n+  cat_log_on_log_error $log_base_name\n+  cat_log_on_error $error_code $log_base_name \"much to your displeasure\"\n+}\n+\n+#------------------------------------------------------------------------------\n+# iterate through the names of the RabbitMQ queues clearing them out using the\n+# 'test_rabbitmq.py' Socorro app. Send the result to the error reporting\n+# function 'check_for_logged_fatal_errors'\n+#------------------------------------------------------------------------------\n+function cleanup_rabbitmq() {\n+  for queue_name in $rmq_normal_queue_name $rmq_priority_queue_name $rmq_reprocessing_queue_name\n+  do\n+    echo \"INFO: Purging rabbitmq queue\" $queue_name\n+    socorro socorro.external.rabbitmq.test_rabbitmq.TestRabbitMQApp \\\n+        --test_rabbitmq.purge=$queue_name \\\n+        --test_rabbitmq.rabbitmq_host=$rmq_host \\\n+        --test_rabbitmq.rabbitmq_user=$rmq_user \\\n+        --test_rabbitmq.rabbitmq_password=$rmq_password \\\n+        --test_rabbitmq.rabbitmq_vhost=$rmq_virtual_host \\\n+        > $queue_name.log 2>&1\n+    check_for_logged_fatal_errors $? $queue_name\n+  done\n+}\n+\n+#------------------------------------------------------------------------------\n+# empty the rabbit queues, clean the local filesystem, kill any apps that this\n+# shell script may have started\n+#------------------------------------------------------------------------------\n+function cleanup() {\n+  cleanup_rabbitmq\n+\n+  echo \"INFO: cleaning up crash storage directories\"\n+  rm -rf ./primaryCrashStore/ ./processedCrashStore/\n+  rm -rf ./crashes/\n+  rm -rf ./submissions\n+\n+  echo \"INFO: Terminating background jobs\"\n+  echo \"  any kill usage errors below may be ignored\"\n+\n+  for p in collector processor middleware\n+  do\n+    # destroy any running processes started by this shell\n+    kill $(jobs -p) > /dev/null 2>&1\n+    # destroy anything trying to write to the log files too\n+    fuser -k ${p}.log > /dev/null 2>&1\n+  done\n+\n+}\n+# associate this function with the signals so that on receipt of one of these\n+# symbols, the 'cleanup' function is invoked\n+trap 'cleanup' SIGINT SIGTERM SIGHUP\n+\n+#------------------------------------------------------------------------------\n+# send in a basename of log file and a command to run\n+# repeatedly run the command until it has been run 30 times or the command\n+# succeeds.  If it times out, cat the associated log file.  if the command\n+# succeeds, send any error code to the 'cat_log_on_log_error' function\n+#------------------------------------------------------------------------------\n+function retry_command() {\n+  name=$1\n+  command_str=$2\n+  count=0\n+  while true\n+  do\n+    $command_str >/dev/null\n+    if [ $? != 0 ]\n+    then\n+      echo \"INFO: waiting for $name...\"\n+      if [ $count == 30 ]\n+      then\n+        cat $name.log\n+        fatal 1 \"$name timeout\"\n+      fi\n+      sleep 5\n+      count=$((count+1))\n+    else\n+      cat_log_on_log_error $name\n+      echo \"INFO: $name app is without errors\"\n+      break\n+    fi\n+  done\n+}\n+\n+#------------------------------------------------------------------------------\n+# send in a basename of a log file and a search term.\n+# grep for the search term in the log file.\n+#------------------------------------------------------------------------------\n+function retry() {\n+  name=$1\n+  search=$2\n+  count=0\n+  while true\n+  do\n+    grep -q \"$search\" $name.log\n+    if [ $? != 0 ]\n+    then\n+      echo \"INFO: waiting for $name...\"\n+      if [ $count == 30 ]\n+      then\n+        cat $name.log\n+        fatal 1 \"$name timeout\"\n+      fi\n+      sleep 5\n+      count=$((count+1))\n+    else\n+      cat_log_on_log_error $name\n+      echo \"INFO: $name app is without errors\"\n+      break\n+    fi\n+  done\n+}\n+\n+#------------------------------------------------------------------------------\n+# setup and run the collector, processor and middleware\n+# The collector should be configured using the 2015 method of having the\n+# ability to collect multiple crash types using different end points.\n+#    breakpad crashes on /submit\n+#    pellet stove data on /pellet/submit\n+#----------------------------------------------------------------------------\n+function start_2015_socorro_apps() {\n+  echo \"INFO: starting up *** start_2015_socorro_apps *** \"\n+  echo \"      * in this test we're using a collector2015 capable of accepting 2 types of crashes\"\n+  echo \"      * the collector writes to both the filesystem using FSPermanentStorage & to RabbitMQ using the $rmq_normal_queue_name queue\"\n+  echo \"      * the processor used Processor2015 with the MozillaProcessorAlgorithm2015\"\n+  socorro collector2015 \\\n+      --services.services_controller='[{\"name\": \"collector\", \"uri\": \"/submit\", \"service_implementation_class\": \"socorro.collector.wsgi_breakpad_collector.BreakpadCollector2015\"}, {\"name\": \"pellet_stove\", \"uri\": \"/pellet/submit\", \"service_implementation_class\": \"socorro.collector.wsgi_generic_collector.GenericCollector\"}]' \\\n+      --services.collector.storage.crashstorage_class=socorro.external.crashstorage_base.PolyCrashStorage \\\n+      --services.collector.storage.storage_classes='socorro.external.fs.crashstorage.FSPermanentStorage, socorro.external.rabbitmq.crashstorage.RabbitMQCrashStorage' \\\n+      --services.collector.storage.storage0.crashstorage_class=socorro.external.fs.crashstorage.FSPermanentStorage \\\n+      --services.collector.storage.storage1.crashstorage_class=socorro.external.rabbitmq.crashstorage.RabbitMQCrashStorage \\","path":"scripts/integration-test.sh","position":229,"original_position":229,"commit_id":"b8750c4c3c975195564d423a2d0d7082e310980d","original_commit_id":"b8750c4c3c975195564d423a2d0d7082e310980d","user":{"login":"twobraids","id":581227,"avatar_url":"https://avatars.githubusercontent.com/u/581227?v=3","gravatar_id":"","url":"https://api.github.com/users/twobraids","html_url":"https://github.com/twobraids","followers_url":"https://api.github.com/users/twobraids/followers","following_url":"https://api.github.com/users/twobraids/following{/other_user}","gists_url":"https://api.github.com/users/twobraids/gists{/gist_id}","starred_url":"https://api.github.com/users/twobraids/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twobraids/subscriptions","organizations_url":"https://api.github.com/users/twobraids/orgs","repos_url":"https://api.github.com/users/twobraids/repos","events_url":"https://api.github.com/users/twobraids/events{/privacy}","received_events_url":"https://api.github.com/users/twobraids/received_events","type":"User","site_admin":false},"body":"that's consistent with what we do everywhere that we work with the PolyCrashStore.  It ensures that the environment (read consulate) doesn't change the implementation out from under us. \r\n","created_at":"2015-10-22T20:30:56Z","updated_at":"2015-10-22T20:30:56Z","html_url":"https://github.com/mozilla/socorro/pull/3057#discussion_r42801892","pull_request_url":"https://api.github.com/repos/mozilla/socorro/pulls/3057","_links":{"self":{"href":"https://api.github.com/repos/mozilla/socorro/pulls/comments/42801892"},"html":{"href":"https://github.com/mozilla/socorro/pull/3057#discussion_r42801892"},"pull_request":{"href":"https://api.github.com/repos/mozilla/socorro/pulls/3057"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla/socorro/pulls/3057","id":48504018,"html_url":"https://github.com/mozilla/socorro/pull/3057","diff_url":"https://github.com/mozilla/socorro/pull/3057.diff","patch_url":"https://github.com/mozilla/socorro/pull/3057.patch","issue_url":"https://api.github.com/repos/mozilla/socorro/issues/3057","number":3057,"state":"open","locked":false,"title":"fixes Bug 1217264 - integration tests: more coverage, more consistent, more readable","user":{"login":"twobraids","id":581227,"avatar_url":"https://avatars.githubusercontent.com/u/581227?v=3","gravatar_id":"","url":"https://api.github.com/users/twobraids","html_url":"https://github.com/twobraids","followers_url":"https://api.github.com/users/twobraids/followers","following_url":"https://api.github.com/users/twobraids/following{/other_user}","gists_url":"https://api.github.com/users/twobraids/gists{/gist_id}","starred_url":"https://api.github.com/users/twobraids/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twobraids/subscriptions","organizations_url":"https://api.github.com/users/twobraids/orgs","repos_url":"https://api.github.com/users/twobraids/repos","events_url":"https://api.github.com/users/twobraids/events{/privacy}","received_events_url":"https://api.github.com/users/twobraids/received_events","type":"User","site_admin":false},"body":"tired of not being able to run  the integration tests on my own machine & then discovering how outdated they were & distressed about how little they resembled real world uses of Socorro, I refactored them half way to the moon.\r\n\r\nthe integration tests that I'm talking about are the one's formerly in the file ```rabbit_integration_test.sh```.  \r\nI did this:\r\n* consolidated into ```./scripts/integration_tests.sh```\r\n* reorganized the file into a functions and tests section\r\n* commented the thing to explain what's going on\r\n* created 3 functions that setup various combinations of collector/processor/middleware\r\n* set up a looping structure so more combinations can be added\r\n* gave integration tests their own rabbit queue to avoid interference with other apps & tests\r\n","created_at":"2015-10-22T19:51:16Z","updated_at":"2015-10-22T20:30:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1895152502f458c90bad9d815ad6286d7e5a46b2","assignee":{"login":"peterbe","id":26739,"avatar_url":"https://avatars.githubusercontent.com/u/26739?v=3","gravatar_id":"","url":"https://api.github.com/users/peterbe","html_url":"https://github.com/peterbe","followers_url":"https://api.github.com/users/peterbe/followers","following_url":"https://api.github.com/users/peterbe/following{/other_user}","gists_url":"https://api.github.com/users/peterbe/gists{/gist_id}","starred_url":"https://api.github.com/users/peterbe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/peterbe/subscriptions","organizations_url":"https://api.github.com/users/peterbe/orgs","repos_url":"https://api.github.com/users/peterbe/repos","events_url":"https://api.github.com/users/peterbe/events{/privacy}","received_events_url":"https://api.github.com/users/peterbe/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/mozilla/socorro/pulls/3057/commits","review_comments_url":"https://api.github.com/repos/mozilla/socorro/pulls/3057/comments","review_comment_url":"https://api.github.com/repos/mozilla/socorro/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla/socorro/issues/3057/comments","statuses_url":"https://api.github.com/repos/mozilla/socorro/statuses/b8750c4c3c975195564d423a2d0d7082e310980d","head":{"label":"twobraids:bug1217264-always-use-the-same-rabbit-hole","ref":"bug1217264-always-use-the-same-rabbit-hole","sha":"b8750c4c3c975195564d423a2d0d7082e310980d","user":{"login":"twobraids","id":581227,"avatar_url":"https://avatars.githubusercontent.com/u/581227?v=3","gravatar_id":"","url":"https://api.github.com/users/twobraids","html_url":"https://github.com/twobraids","followers_url":"https://api.github.com/users/twobraids/followers","following_url":"https://api.github.com/users/twobraids/following{/other_user}","gists_url":"https://api.github.com/users/twobraids/gists{/gist_id}","starred_url":"https://api.github.com/users/twobraids/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twobraids/subscriptions","organizations_url":"https://api.github.com/users/twobraids/orgs","repos_url":"https://api.github.com/users/twobraids/repos","events_url":"https://api.github.com/users/twobraids/events{/privacy}","received_events_url":"https://api.github.com/users/twobraids/received_events","type":"User","site_admin":false},"repo":{"id":2617288,"name":"socorro","full_name":"twobraids/socorro","owner":{"login":"twobraids","id":581227,"avatar_url":"https://avatars.githubusercontent.com/u/581227?v=3","gravatar_id":"","url":"https://api.github.com/users/twobraids","html_url":"https://github.com/twobraids","followers_url":"https://api.github.com/users/twobraids/followers","following_url":"https://api.github.com/users/twobraids/following{/other_user}","gists_url":"https://api.github.com/users/twobraids/gists{/gist_id}","starred_url":"https://api.github.com/users/twobraids/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twobraids/subscriptions","organizations_url":"https://api.github.com/users/twobraids/orgs","repos_url":"https://api.github.com/users/twobraids/repos","events_url":"https://api.github.com/users/twobraids/events{/privacy}","received_events_url":"https://api.github.com/users/twobraids/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/twobraids/socorro","description":"Socorro is a server to accept and process Breakpad crash reports. ","fork":true,"url":"https://api.github.com/repos/twobraids/socorro","forks_url":"https://api.github.com/repos/twobraids/socorro/forks","keys_url":"https://api.github.com/repos/twobraids/socorro/keys{/key_id}","collaborators_url":"https://api.github.com/repos/twobraids/socorro/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/twobraids/socorro/teams","hooks_url":"https://api.github.com/repos/twobraids/socorro/hooks","issue_events_url":"https://api.github.com/repos/twobraids/socorro/issues/events{/number}","events_url":"https://api.github.com/repos/twobraids/socorro/events","assignees_url":"https://api.github.com/repos/twobraids/socorro/assignees{/user}","branches_url":"https://api.github.com/repos/twobraids/socorro/branches{/branch}","tags_url":"https://api.github.com/repos/twobraids/socorro/tags","blobs_url":"https://api.github.com/repos/twobraids/socorro/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/twobraids/socorro/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/twobraids/socorro/git/refs{/sha}","trees_url":"https://api.github.com/repos/twobraids/socorro/git/trees{/sha}","statuses_url":"https://api.github.com/repos/twobraids/socorro/statuses/{sha}","languages_url":"https://api.github.com/repos/twobraids/socorro/languages","stargazers_url":"https://api.github.com/repos/twobraids/socorro/stargazers","contributors_url":"https://api.github.com/repos/twobraids/socorro/contributors","subscribers_url":"https://api.github.com/repos/twobraids/socorro/subscribers","subscription_url":"https://api.github.com/repos/twobraids/socorro/subscription","commits_url":"https://api.github.com/repos/twobraids/socorro/commits{/sha}","git_commits_url":"https://api.github.com/repos/twobraids/socorro/git/commits{/sha}","comments_url":"https://api.github.com/repos/twobraids/socorro/comments{/number}","issue_comment_url":"https://api.github.com/repos/twobraids/socorro/issues/comments{/number}","contents_url":"https://api.github.com/repos/twobraids/socorro/contents/{+path}","compare_url":"https://api.github.com/repos/twobraids/socorro/compare/{base}...{head}","merges_url":"https://api.github.com/repos/twobraids/socorro/merges","archive_url":"https://api.github.com/repos/twobraids/socorro/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/twobraids/socorro/downloads","issues_url":"https://api.github.com/repos/twobraids/socorro/issues{/number}","pulls_url":"https://api.github.com/repos/twobraids/socorro/pulls{/number}","milestones_url":"https://api.github.com/repos/twobraids/socorro/milestones{/number}","notifications_url":"https://api.github.com/repos/twobraids/socorro/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/twobraids/socorro/labels{/name}","releases_url":"https://api.github.com/repos/twobraids/socorro/releases{/id}","created_at":"2011-10-21T00:42:48Z","updated_at":"2014-09-29T17:41:39Z","pushed_at":"2015-10-22T19:41:49Z","git_url":"git://github.com/twobraids/socorro.git","ssh_url":"git@github.com:twobraids/socorro.git","clone_url":"https://github.com/twobraids/socorro.git","svn_url":"https://github.com/twobraids/socorro","homepage":"https://wiki.mozilla.org/Socorro","size":166096,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"mozilla:master","ref":"master","sha":"aea9ad481c5b2d30c7b55ea9f64271af9d2a73e6","user":{"login":"mozilla","id":131524,"avatar_url":"https://avatars.githubusercontent.com/u/131524?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"repo":{"id":2263742,"name":"socorro","full_name":"mozilla/socorro","owner":{"login":"mozilla","id":131524,"avatar_url":"https://avatars.githubusercontent.com/u/131524?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla/socorro","description":"Socorro is a server to accept and process Breakpad crash reports. ","fork":false,"url":"https://api.github.com/repos/mozilla/socorro","forks_url":"https://api.github.com/repos/mozilla/socorro/forks","keys_url":"https://api.github.com/repos/mozilla/socorro/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla/socorro/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla/socorro/teams","hooks_url":"https://api.github.com/repos/mozilla/socorro/hooks","issue_events_url":"https://api.github.com/repos/mozilla/socorro/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla/socorro/events","assignees_url":"https://api.github.com/repos/mozilla/socorro/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla/socorro/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla/socorro/tags","blobs_url":"https://api.github.com/repos/mozilla/socorro/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla/socorro/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla/socorro/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla/socorro/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla/socorro/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla/socorro/languages","stargazers_url":"https://api.github.com/repos/mozilla/socorro/stargazers","contributors_url":"https://api.github.com/repos/mozilla/socorro/contributors","subscribers_url":"https://api.github.com/repos/mozilla/socorro/subscribers","subscription_url":"https://api.github.com/repos/mozilla/socorro/subscription","commits_url":"https://api.github.com/repos/mozilla/socorro/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla/socorro/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla/socorro/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla/socorro/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla/socorro/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla/socorro/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla/socorro/merges","archive_url":"https://api.github.com/repos/mozilla/socorro/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla/socorro/downloads","issues_url":"https://api.github.com/repos/mozilla/socorro/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla/socorro/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla/socorro/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla/socorro/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla/socorro/labels{/name}","releases_url":"https://api.github.com/repos/mozilla/socorro/releases{/id}","created_at":"2011-08-24T19:21:49Z","updated_at":"2015-10-13T05:53:08Z","pushed_at":"2015-10-22T19:51:16Z","git_url":"git://github.com/mozilla/socorro.git","ssh_url":"git@github.com:mozilla/socorro.git","clone_url":"https://github.com/mozilla/socorro.git","svn_url":"https://github.com/mozilla/socorro","homepage":"https://wiki.mozilla.org/Socorro","size":193260,"stargazers_count":246,"watchers_count":246,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":131,"mirror_url":null,"open_issues_count":9,"forks":131,"open_issues":9,"watchers":246,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla/socorro/pulls/3057"},"html":{"href":"https://github.com/mozilla/socorro/pull/3057"},"issue":{"href":"https://api.github.com/repos/mozilla/socorro/issues/3057"},"comments":{"href":"https://api.github.com/repos/mozilla/socorro/issues/3057/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla/socorro/pulls/3057/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla/socorro/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla/socorro/pulls/3057/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla/socorro/statuses/b8750c4c3c975195564d423a2d0d7082e310980d"}}}}