{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx-tools/pulls/comments/43292082","id":43292082,"diff_hunk":"@@ -0,0 +1,560 @@\n+#!/bin/bash \n+\n+#############################################################################################################\n+# .NET Performance Data Collection Script\n+#############################################################################################################\n+\n+#############################################################################################################\n+#\n+# ***** HOW TO USE THIS SCRIPT *****\n+#\n+# This script can be used to collect and view performance data collected with perf_event on Linux.\n+# It's job is to make it simple to collect performance traces.\n+#\n+# How to collect a performance trace:\n+# 1. Prior to starting the .NET process, set the environment variable COMPlus_PerfMapEnabled=1.\n+#    This tells the runtime to emit information that enables perf_event to resolve JIT-compiled code symbols.\n+# 2. Setup your system to reproduce the performance issue you'd like to capture.  Data collection can be\n+#    started on already running processes.\n+# 2. Run this script: sudo ./perfcollect collect samplePerfTrace\n+#    This will start data collection.\n+# 3. Let the repro run as long as you need to capture the performance problem.\n+# 4. Hit CTRL+C to stop collection.\n+#    When collection is stopped, the script will create a trace.tgz file matching the name specified on the\n+#    command line.  This file will contain the trace, JIT-compiled symbol information, and all debugging\n+#    symbols for binaries referenced by this trace that were available on the machine at collection time.\n+#\n+# How to view a performance trace:\n+# 1. Run this script: ./perfcollect view samplePerfTrace.trace.tgz\n+#    This will extract the trace, place and register all symbol files and JIT-compiled symbol information\n+#    and start the perf_event viewer.  By default, you be looking at a callee view - stacks are ordered\n+#    top down.  For a caller or bottom up view, specify '-graphtype caller'. \n+#############################################################################################################\n+\n+\n+######################################\n+## FOR DEBUGGING ONLY\n+######################################\n+# set -x\n+\n+######################################\n+## Configuration\n+######################################\n+\n+# The location of the perf executable.\n+perfcmd=/usr/bin/perf\n+\n+######################################\n+## Collection Options\n+## NOTE: These values represent the collection defaults.\n+######################################\n+\n+# Set when we parse command line arguments to determine if we should enable specific collection options.\n+collect_cpu=1\n+collect_threadTime=0\n+\n+# Declare an array of events to collect.\n+declare -a eventsToCollect\n+\n+######################################\n+## Helper Functions\n+######################################\n+\n+##\n+# Console text color modification helpers.\n+##\n+RedText()\n+{\n+\ttput setaf 1\n+}\n+\n+GreenText()\n+{\n+\ttput setaf 2\n+}\n+\n+ResetText()\n+{\n+\ttput sgr0\n+}\n+\n+# $1 == Status message\n+WriteStatus()\n+{\n+\tGreenText\n+\techo $1\n+\tResetText\n+}\n+\n+# $1 == Message.\n+FatalError()\n+{\n+\tRedText\n+\techo \"ERROR: $1\"\n+\tResetText\n+\tPrintUsage\n+\texit 1\n+}\n+\n+######################################\n+# Prerequisite Installation\n+######################################\n+IsUbuntu()\n+{\n+\tlocal ubuntu=0\n+\tif [ -f /etc/lsb-release ]\n+\tthen\n+\t\tlocal flavor=`cat /etc/lsb-release | grep DISTRIB_ID`\n+\t\tif [ \"$flavor\" == \"DISTRIB_ID=Ubuntu\" ]\n+\t\tthen\n+\t\t\tubuntu=1\n+\t\tfi\n+\tfi\n+        \n+\techo $ubuntu\n+}\n+\n+InstallPerf_Ubuntu()\n+{\n+\t# Disallow non-root users.\n+\tif [ `whoami` != \"root\" ]\n+\tthen\n+\t\tRedText\n+\t\techo \"This script must be run as root.\"\n+\t\tResetText\n+\t\texit 1\n+\tfi\n+\n+\t# Install packages.\n+\tGreenText\n+\techo \"Installing perf_event packages.\"\n+\tResetText\n+\tapt-get install linux-tools-common linux-tools-`uname -r` linux-cloud-tools-`uname -r`\n+}\n+\n+InstallPerf()\n+{\n+\tif [ \"$(IsUbuntu)\" == \"1\" ]\n+\tthen\n+\t\tInstallPerf_Ubuntu\n+\telse\n+\t\tFatalError \"Auto install unsupported for this distribution.  Install linux-tools-common package manually to continue.\"\n+\tfi\n+}\n+\n+SupportsAutoInstall()\n+{\n+\tlocal supportsAutoInstall=0\n+\tif [ \"$(IsUbuntu)\" == \"1\" ]\n+\tthen\n+\t\tsupportsAutoInstall=1\n+\tfi\n+\t\n+\techo $supportsAutoInstall\n+}\n+\n+######################################\n+# Argument Processing\n+######################################\n+action=''\n+inputTraceName=''\n+collectionPid=''\n+processFilter=''\n+graphType=''\n+perfOpt=''\n+\n+ProcessArguments()\n+{\n+\t# No arguments\n+\tif [ \"$#\" == \"0\" ]\n+\tthen\n+\t\tPrintUsage\n+\t\texit 0\n+\tfi\n+\t\n+\t# Not enough arguments.\n+\tif [ \"$#\" -le \"1\" ]\n+\tthen\n+\t\tFatalError \"Not enough arguments have been specified.\"\n+\tfi\n+\n+\t# Set the action\n+\taction=$1\n+\tif [ \"$action\" != \"collect\" ] && [ \"$action\" != \"view\" ]\n+\tthen\n+\t\tFatalError \"Invalid action specified.\"\n+\tfi\n+\n+\t# Set the data file.\n+\tinputTraceName=$2\n+\tif [ \"$inputTraceName\" == \"\" ]\n+\tthen\n+\t\tFatalError \"Invalid trace name specified.\"\n+\tfi\n+\n+\t# Process remaining arguments.\n+\t# First copy the args into an array so that we can walk the array.\n+\targs=( \"$@\" )\n+\tfor (( i=2; i<${#args[@]}; i++ ))\n+\tdo\n+\t\t# Get the arg.\n+\t\targ=${args[$i]}\n+\n+\t\t# Convert the arg to lower case.\n+\t\targ=`echo $arg | tr '[:upper:]' '[:lower:]'`\n+\n+\t\t# Match the arg to a known value.\n+\t\tif [ \"-pid\" == \"$arg\" ]\n+\t\tthen\n+\t\t\tcollectionPid=${args[$i+1]}\n+\t\t\ti=$i+1\n+\t\telif [ \"-processfilter\" == \"$arg\" ]\n+\t\tthen\n+\t\t\tprocessFilter=${args[$i+1]}\n+\t\t\ti=$i+1\n+\t\telif [ \"-graphtype\" == \"$arg\" ]\n+\t\tthen\n+\t\t\tgraphType=${args[$i+1]}\n+\t\t\ti=$i+1\n+\t\telif [ \"-threadtime\" == \"$arg\" ]\n+\t\tthen\n+\t\t\tcollect_threadTime=1\n+\t\telif [ \"-perfopt\" == \"$arg\" ]\n+\t\tthen\n+\t\t\tperfOpt=${args[$i+1]}\n+\t\t\ti=$i+1\n+\t\tfi\n+\tdone\n+\t\n+}\n+\n+\n+##\n+# Helper that processes collected data.\n+# This helper is called when the CTRL+C signal is handled.\n+##\n+ProcessCollectedData()\n+{\n+\tWriteStatus \"START: Archive collected data.\"\n+\t\n+\t# Make a new target directory.\n+\tlocal traceSuffix=\".trace\"\n+\tlocal traceName=$inputTraceName\n+\tlocal directoryName=$traceName$traceSuffix\n+\tmkdir $directoryName\n+\n+\t# Get any perf-$pid.map files that were used by the\n+\t# trace and store them alongside the trace.\n+\tWriteStatus \"START: Save perf.map files.\"\n+\tlocal mapFiles=`perf buildid-list --with-hits | grep /tmp/perf- | cut -d ' ' -f 2`\n+\tfor mapFile in $mapFiles\n+\tdo\n+\t\tif [ -f $mapFile ]\n+\t\tthen\n+\t\t\techo \"Saving $mapFile\"\n+\t\t\tcp $mapFile .\n+\t\telse\n+\t\t\tRedText\n+\t\t\techo \"Skipping $mapFile.  Some managed symbols may not be resolvable, but trace is still valid.\"\n+\t\t\tResetText\n+\t\tfi\n+\tdone\n+\tWriteStatus \"END: Save perf.map files.\"\n+\n+\t# Create debuginfo files (separate symbols) for all modules in the trace.\n+\tWriteStatus \"START: Save Symbols\"\n+\n+\t# Get the list of DSOs with hits in the trace file (those that are actually used).\n+\t# Filter out /tmp/perf-$pid.map files as these are handled separately.\n+\tlocal dsosWithHits=`perf buildid-list --with-hits | grep -v /tmp/perf-`\n+\tfor dso in $dsosWithHits\n+\tdo\n+\t\t# Build up tuples of buildid and binary path.\n+\t\tlocal processEntry=0\n+\t\tif [ -f $dso ]\n+\t\tthen\n+\t\t\tlocal pathToBinary=$dso\n+\t\t\tprocessEntry=1\n+\t\telse\n+\t\t\tlocal buildid=$dso\n+\t\t\tpathToBinary=''\n+\t\tfi\n+\n+\t\t# Once we have a tuple for a binary path that exists, process it.\n+\t\tif [ \"$processEntry\" == \"1\" ]\n+\t\tthen\n+\t\t\t# Get the binary name without path.\n+\t\t\tlocal binaryName=`basename $pathToBinary`\n+\t\n+\t\t\t# Build the debuginfo file name.\n+\t\t\tlocal destFileName=$binaryName.debuginfo\n+\n+\t\t\t# Build the destination directory for the debuginfo file.\n+\t\t\tlocal currentDir=`pwd`\n+\t\t\tlocal destDir=$currentDir/debuginfo/$buildid\n+\n+\t\t\t# Build the full path to the debuginfo file.\n+\t\t\tlocal destPath=$destDir/$destFileName\n+\n+\t\t\t# Check to see if the DSO contains symbols, and if so, build the debuginfo file.\n+\t\t\tlocal noSymbols=`objdump -t $pathToBinary | grep \"no symbols\" -c`\n+\t\t\tif [ \"$noSymbols\" == \"0\" ]\n+\t\t\tthen\n+\t\t\t\techo \"Generating debuginfo for $binaryName with buildid=$buildid\"\n+\t\t\t\tmkdir -p $destDir\n+\t\t\t\tobjcopy --only-keep-debug $pathToBinary $destPath\n+\t\t\telse\n+\t\t\t\techo \"Skipping $binaryName with buildid=$buildid.  No symbol information.\"\n+\t\t\tfi\n+\t\tfi\n+\tdone\n+\n+\tWriteStatus \"END: Save Symbols\"\n+\t\n+\tWriteStatus \"START: Compress data.\"\n+\t\n+\t# Move all collected files to the new directory.\n+\tmv * $directoryName > /dev/null 2>&1\n+\n+\t# Compress the data.\n+\tlocal archiveSuffix=\".tgz\"\n+\tlocal archiveName=$directoryName$archiveSuffix\n+\ttar -czvf $archiveName $directoryName \n+\t#-C $tempDir $directoryName\n+\n+\t# Move back to the original directory.\n+\tpopd\n+\n+\t# Move the archive.\n+\tmv $tempDir/$archiveName .\n+\t\n+\tWriteStatus \"END: Compress data.\"\n+\n+\t# Delete the temp directory.\n+\trm -rf $tempDir\t\n+\n+\tWriteStatus \"END: Archive collected data.\"\n+}\n+\n+##\n+# Handle the CTRL+C signal.\n+##\n+CTRLC_Handler()\n+{\n+\t# The user must CTRL+C to stop collection in perf_event.\n+\t# When this happens, we catch the signal and finish our work.\n+\tProcessCollectedData\n+}\n+\n+##\n+# Print usage information.\n+##\n+PrintUsage()\n+{\n+\techo \"This script uses perf_event to collect and view performance traces.\"\n+\techo \"For detailed collection and viewing steps, view this script in a text editor or viewer.\"\n+\techo \"\"\n+\techo \"./perfcollect <action> <tracename>\"\n+\techo \"Valid Actions: collect view installperf\"\n+\techo \"\"\n+\techo \"collect options:\"\n+\techo \"By default, collection includes CPU samples collected every ms.\"\n+\techo \"\t-pid\t\t  : Only collect data from the specified process id.\"\n+\techo \"\t-threadtime       : Collect context switch events.\"\n+\techo \"\"\n+\techo \"view options:\"\n+\techo \"\t-processfilter\t  : Filter data by the specified process name.\"\n+\techo \"\t-graphtype\t  : Specify the type of graph.  Valid values are 'caller' and 'callee'.\"\n+\techo \"\"\n+\techo \"installperf options:\"\n+\techo \"\tNo required or optional args.  Useful for first-time setup or after kernel upgrade.\"\n+\techo \"\"\n+}\n+\n+##\n+# Validate and set arguments.\n+##\n+\n+BuildPerfRecordArgs()\n+{\n+\t# Start with default collection arguments that record all CPUs (-a) and collect call stacks (-g)\n+\tcollectionArgs=\"record -g\"\n+\n+\t# Filter to a single process if desired\n+\tif [ \"$collectionPid\" != \"\" ]\n+\tthen\n+\t\tcollectionArgs=\"$collectionArgs --pid=$collectionPid\"\n+\telse\n+\t\tcollectionArgs=\"$collectionArgs -a\"\n+\tfi\n+\n+\t# Enable CPU Collection\n+\tif [ $collect_cpu -eq 1 ]\n+\tthen\n+\t\tcollectionArgs=\"$collectionArgs -F 999\"\n+\t\teventsToCollect=( \"${eventsToCollect[@]}\" \"cpu-clock\" )\n+\tfi\n+\n+\t# Enable context switches.\n+\tif [ $collect_threadTime -eq 1 ]\n+\tthen\n+\t\teventsToCollect=( \"${eventsToCollect[@]}\" \"context-switches\" )\n+\tfi\n+\n+\t# Build up the set of events.\n+\tlocal eventString=\"\"\n+\tlocal comma=\",\"\n+\tfor (( i=0; i<${#eventsToCollect[@]}; i++ ))\n+\tdo\n+\t\t# Get the arg.\n+\t\teventName=${eventsToCollect[$i]}\n+\n+\t\t# Build up the comma separated list.\n+\t\tif [ \"$eventString\" == \"\" ]\n+\t\tthen\n+\t\t\teventString=$eventName\n+\t\telse\n+\t\t\teventString=\"$eventString$comma$eventName\"\n+\t\tfi\n+\n+\tdone\n+\n+\t# Add the events onto the collection command line args.\t\n+\tcollectionArgs=\"$collectionArgs -e $eventString\"\n+}\n+\n+DoCollect()\n+{\n+\t# Warn non-root users.\n+\tif [ `whoami` != \"root\" ]","path":"src/performance/perfcollect/perfcollect","position":429,"original_position":429,"commit_id":"4bbff9803575ad524825e5e9537c2e8284fe66c7","original_commit_id":"4bbff9803575ad524825e5e9537c2e8284fe66c7","user":{"login":"karelz","id":5776068,"avatar_url":"https://avatars.githubusercontent.com/u/5776068?v=3","gravatar_id":"","url":"https://api.github.com/users/karelz","html_url":"https://github.com/karelz","followers_url":"https://api.github.com/users/karelz/followers","following_url":"https://api.github.com/users/karelz/following{/other_user}","gists_url":"https://api.github.com/users/karelz/gists{/gist_id}","starred_url":"https://api.github.com/users/karelz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/karelz/subscriptions","organizations_url":"https://api.github.com/users/karelz/orgs","repos_url":"https://api.github.com/users/karelz/repos","events_url":"https://api.github.com/users/karelz/events{/privacy}","received_events_url":"https://api.github.com/users/karelz/received_events","type":"User","site_admin":false},"body":"Make it a function? (Used twice - also in InstallPerf)","created_at":"2015-10-28T17:46:37Z","updated_at":"2015-10-28T17:46:37Z","html_url":"https://github.com/dotnet/corefx-tools/pull/1#discussion_r43292082","pull_request_url":"https://api.github.com/repos/dotnet/corefx-tools/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx-tools/pulls/comments/43292082"},"html":{"href":"https://github.com/dotnet/corefx-tools/pull/1#discussion_r43292082"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx-tools/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx-tools/pulls/1","id":48632661,"html_url":"https://github.com/dotnet/corefx-tools/pull/1","diff_url":"https://github.com/dotnet/corefx-tools/pull/1.diff","patch_url":"https://github.com/dotnet/corefx-tools/pull/1.patch","issue_url":"https://api.github.com/repos/dotnet/corefx-tools/issues/1","number":1,"state":"open","locked":false,"title":"Initial commit of perfcollect script","user":{"login":"brianrob","id":6210322,"avatar_url":"https://avatars.githubusercontent.com/u/6210322?v=3","gravatar_id":"","url":"https://api.github.com/users/brianrob","html_url":"https://github.com/brianrob","followers_url":"https://api.github.com/users/brianrob/followers","following_url":"https://api.github.com/users/brianrob/following{/other_user}","gists_url":"https://api.github.com/users/brianrob/gists{/gist_id}","starred_url":"https://api.github.com/users/brianrob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brianrob/subscriptions","organizations_url":"https://api.github.com/users/brianrob/orgs","repos_url":"https://api.github.com/users/brianrob/repos","events_url":"https://api.github.com/users/brianrob/events{/privacy}","received_events_url":"https://api.github.com/users/brianrob/received_events","type":"User","site_admin":false},"body":"Contains the initial commit for the perfcollect script, which is aimed at making .NET performance data and collection with perf_event easier.","created_at":"2015-10-23T21:32:52Z","updated_at":"2015-10-28T17:46:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6fa135262e3254e199c1895697894da8a776ab1e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/corefx-tools/pulls/1/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx-tools/pulls/1/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx-tools/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx-tools/issues/1/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx-tools/statuses/4bbff9803575ad524825e5e9537c2e8284fe66c7","head":{"label":"brianrob:perfcollect","ref":"perfcollect","sha":"4bbff9803575ad524825e5e9537c2e8284fe66c7","user":{"login":"brianrob","id":6210322,"avatar_url":"https://avatars.githubusercontent.com/u/6210322?v=3","gravatar_id":"","url":"https://api.github.com/users/brianrob","html_url":"https://github.com/brianrob","followers_url":"https://api.github.com/users/brianrob/followers","following_url":"https://api.github.com/users/brianrob/following{/other_user}","gists_url":"https://api.github.com/users/brianrob/gists{/gist_id}","starred_url":"https://api.github.com/users/brianrob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brianrob/subscriptions","organizations_url":"https://api.github.com/users/brianrob/orgs","repos_url":"https://api.github.com/users/brianrob/repos","events_url":"https://api.github.com/users/brianrob/events{/privacy}","received_events_url":"https://api.github.com/users/brianrob/received_events","type":"User","site_admin":false},"repo":{"id":44142705,"name":"corefx-tools","full_name":"brianrob/corefx-tools","owner":{"login":"brianrob","id":6210322,"avatar_url":"https://avatars.githubusercontent.com/u/6210322?v=3","gravatar_id":"","url":"https://api.github.com/users/brianrob","html_url":"https://github.com/brianrob","followers_url":"https://api.github.com/users/brianrob/followers","following_url":"https://api.github.com/users/brianrob/following{/other_user}","gists_url":"https://api.github.com/users/brianrob/gists{/gist_id}","starred_url":"https://api.github.com/users/brianrob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brianrob/subscriptions","organizations_url":"https://api.github.com/users/brianrob/orgs","repos_url":"https://api.github.com/users/brianrob/repos","events_url":"https://api.github.com/users/brianrob/events{/privacy}","received_events_url":"https://api.github.com/users/brianrob/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/brianrob/corefx-tools","description":"Place to include various misc tools for .NET and .NET Core. ","fork":true,"url":"https://api.github.com/repos/brianrob/corefx-tools","forks_url":"https://api.github.com/repos/brianrob/corefx-tools/forks","keys_url":"https://api.github.com/repos/brianrob/corefx-tools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/brianrob/corefx-tools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/brianrob/corefx-tools/teams","hooks_url":"https://api.github.com/repos/brianrob/corefx-tools/hooks","issue_events_url":"https://api.github.com/repos/brianrob/corefx-tools/issues/events{/number}","events_url":"https://api.github.com/repos/brianrob/corefx-tools/events","assignees_url":"https://api.github.com/repos/brianrob/corefx-tools/assignees{/user}","branches_url":"https://api.github.com/repos/brianrob/corefx-tools/branches{/branch}","tags_url":"https://api.github.com/repos/brianrob/corefx-tools/tags","blobs_url":"https://api.github.com/repos/brianrob/corefx-tools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/brianrob/corefx-tools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/brianrob/corefx-tools/git/refs{/sha}","trees_url":"https://api.github.com/repos/brianrob/corefx-tools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/brianrob/corefx-tools/statuses/{sha}","languages_url":"https://api.github.com/repos/brianrob/corefx-tools/languages","stargazers_url":"https://api.github.com/repos/brianrob/corefx-tools/stargazers","contributors_url":"https://api.github.com/repos/brianrob/corefx-tools/contributors","subscribers_url":"https://api.github.com/repos/brianrob/corefx-tools/subscribers","subscription_url":"https://api.github.com/repos/brianrob/corefx-tools/subscription","commits_url":"https://api.github.com/repos/brianrob/corefx-tools/commits{/sha}","git_commits_url":"https://api.github.com/repos/brianrob/corefx-tools/git/commits{/sha}","comments_url":"https://api.github.com/repos/brianrob/corefx-tools/comments{/number}","issue_comment_url":"https://api.github.com/repos/brianrob/corefx-tools/issues/comments{/number}","contents_url":"https://api.github.com/repos/brianrob/corefx-tools/contents/{+path}","compare_url":"https://api.github.com/repos/brianrob/corefx-tools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/brianrob/corefx-tools/merges","archive_url":"https://api.github.com/repos/brianrob/corefx-tools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/brianrob/corefx-tools/downloads","issues_url":"https://api.github.com/repos/brianrob/corefx-tools/issues{/number}","pulls_url":"https://api.github.com/repos/brianrob/corefx-tools/pulls{/number}","milestones_url":"https://api.github.com/repos/brianrob/corefx-tools/milestones{/number}","notifications_url":"https://api.github.com/repos/brianrob/corefx-tools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/brianrob/corefx-tools/labels{/name}","releases_url":"https://api.github.com/repos/brianrob/corefx-tools/releases{/id}","created_at":"2015-10-13T00:53:40Z","updated_at":"2015-10-13T00:53:41Z","pushed_at":"2015-10-23T21:31:34Z","git_url":"git://github.com/brianrob/corefx-tools.git","ssh_url":"git@github.com:brianrob/corefx-tools.git","clone_url":"https://github.com/brianrob/corefx-tools.git","svn_url":"https://github.com/brianrob/corefx-tools","homepage":null,"size":93,"stargazers_count":0,"watchers_count":0,"language":"Batchfile","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":"dotnet:master","ref":"master","sha":"2ba78413c73f2767cd77c853d5a5bdbd71d2d2a0","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":43313931,"name":"corefx-tools","full_name":"dotnet/corefx-tools","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/corefx-tools","description":"Place to include various misc tools for .NET and .NET Core. ","fork":false,"url":"https://api.github.com/repos/dotnet/corefx-tools","forks_url":"https://api.github.com/repos/dotnet/corefx-tools/forks","keys_url":"https://api.github.com/repos/dotnet/corefx-tools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx-tools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx-tools/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx-tools/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx-tools/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx-tools/events","assignees_url":"https://api.github.com/repos/dotnet/corefx-tools/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx-tools/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx-tools/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx-tools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx-tools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx-tools/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx-tools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx-tools/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx-tools/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx-tools/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx-tools/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx-tools/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx-tools/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx-tools/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx-tools/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx-tools/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx-tools/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx-tools/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx-tools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx-tools/merges","archive_url":"https://api.github.com/repos/dotnet/corefx-tools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx-tools/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx-tools/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx-tools/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx-tools/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx-tools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx-tools/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx-tools/releases{/id}","created_at":"2015-09-28T16:52:22Z","updated_at":"2015-10-27T23:03:09Z","pushed_at":"2015-10-27T23:03:08Z","git_url":"git://github.com/dotnet/corefx-tools.git","ssh_url":"git@github.com:dotnet/corefx-tools.git","clone_url":"https://github.com/dotnet/corefx-tools.git","svn_url":"https://github.com/dotnet/corefx-tools","homepage":null,"size":180,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":1,"forks":3,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx-tools/pulls/1"},"html":{"href":"https://github.com/dotnet/corefx-tools/pull/1"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx-tools/issues/1"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx-tools/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx-tools/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx-tools/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx-tools/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx-tools/statuses/4bbff9803575ad524825e5e9537c2e8284fe66c7"}}}}