{"action":"created","comment":{"url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/comments/203855273","pull_request_review_id":138823930,"id":203855273,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMzg1NTI3Mw==","diff_hunk":"@@ -1339,87 +1339,159 @@ def _GetFirstNamespaceLevelReorderSpan(file_lines):\n   it then continues until it finds a forward-declare line, or a\n   non-namespace contentful line.  In the former case, it figures out\n   the reorder-span this forward-declare line is part of, while in the\n-  latter case it creates a new reorder-span.  It returns\n-  (enclosing_namespaces, reorder_span).\n+  latter case it creates a new reorder-span.  A list of these namespace\n+  reorder spans are returned so they can all be checked.  These elements\n+  are in the form (enclosing_namespace, reorder_span).\n \n   Arguments:\n     file_lines: an array of LineInfo objects with .type and\n-       .reorder_span filled in.\n+     .reorder_span filled in.\n \n   Returns:\n-    (None, None) if we could not find a first namespace-level\n-    reorder-span, or (enclosing_namespaces, reorder_span), where\n-    enclosing_namespaces is a string that looks like (for instance)\n+    [] if we could not find any namespace-level reorder-spans, or\n+    [(enclosing_namespace, reorder_span), ...], where enclosing_namespace\n+    is a string that looks like (for instance)\n     'namespace ns1 { namespace ns2 {', and reorder-span is a\n     [start_line, end_line) pair.\n   \"\"\"\n-  simple_namespace_re = re.compile(\n-    r'^\\s*namespace\\s+([^{\\s]+)\\s*\\{\\s*(//.*)?$')\n-  simple_allman_namespace_re = re.compile(\n-    r'^\\s*namespace\\s+([^{\\s]+)\\s*(//.*)?$')\n-  namespace_prefix = ''\n \n-  for line_number in range(len(file_lines)):\n-    line_info = file_lines[line_number]\n+  def _GetNamespaceNames(namespace_line):\n+    \"\"\"Returns a list of namespace names given a namespace line.  Anonymous\n+    namespaces will return an empty string\n+    \"\"\"\n+    namespace_re = re.compile(r'\\s*namespace\\b(.*)')\n+    namespaces = []\n+    namespace_line = namespace_line.split(\"/\")[0] # remove C++ comments\n+    namespace_line = namespace_line.split(\"{\") # extract all namespaces\n+    for namespace in namespace_line:\n+      m = namespace_re.match(namespace)\n+      if m:\n+        namespaces.append(m.group(1).strip())\n \n-    if line_info.deleted:\n-      continue\n+    return namespaces\n \n-    # If we're an empty line, just ignore us.  Likewise with #include\n-    # lines, which aren't 'contentful' for our purposes, and the\n-    # header guard, which is (by definition) the only kind of #ifdef\n-    # that we can be inside and still considered at the \"top level\".\n-    if line_info.type in (_COMMENT_LINE_RE, _BLANK_LINE_RE, _INCLUDE_RE,\n-                          _HEADER_GUARD_RE, _HEADER_GUARD_DEFINE_RE,\n-                          _PRAGMA_ONCE_LINE_RE):\n-      continue\n+  namespace_reorder_spans = {}\n+  try:\n+    namespace_prefixes = []\n+    namespace_prefix = ''\n+    ifdef_depth = 0\n+    namespace_depth = 0\n \n-    # If we're a 'contentful' line such as a (non-header-guard) #ifdef, bail.\n-    elif line_info.type in (_IF_RE, _NAMESPACE_END_RE, _ELSE_RE, _ENDIF_RE,\n-                            None):    # None is a 'normal' contentful line\n-      # TODO(csilvers): we could probably keep going if there are no\n-      # braces on the line.  We could also keep track of our #ifdef\n-      # depth instead of bailing on #else and #endif, and only accept\n-      # the fwd-decl-inside-namespace if it's at ifdef-depth 0.\n-      break\n+    for line_number in range(len(file_lines)):\n+      line_info = file_lines[line_number]\n \n-    elif line_info.type == _NAMESPACE_START_RE:\n-      # Only handle the simple case of 'namespace <foo> {'\n-      m = simple_namespace_re.match(line_info.line)\n-      if not m:\n-        break\n-      namespace_prefix += ('namespace %s { ' % m.group(1).strip())\n+      if line_info.deleted:\n+        continue\n \n-    elif line_info.type in (_NAMESPACE_START_ALLMAN_RE,\n-                            _NAMESPACE_START_MIXED_RE):\n-      # Trim any possible comments on namespace to properly build\n-      # the namespace level spans\n-      m = simple_allman_namespace_re.match(line_info.line)\n-      if not m:\n-        break\n-      namespace_prefix += ('namespace %s' % m.group(1).strip())\n+      # If we're an empty line, just ignore us.  Likewise with #include\n+      # lines, which aren't 'contentful' for our purposes, and the\n+      # header guard, which is (by definition) the only kind of #ifdef\n+      # that we can be inside and still considered at the \"top level\".\n+      if line_info.type in (_COMMENT_LINE_RE,\n+                            _BLANK_LINE_RE,\n+                            _INCLUDE_RE,\n+                            _HEADER_GUARD_RE,\n+                            _HEADER_GUARD_DEFINE_RE,\n+                            _PRAGMA_ONCE_LINE_RE):\n+        continue\n \n-    elif line_info.type == _NAMESPACE_CONTINUE_ALLMAN_MIXED_RE:\n-      # Append to the simplified Allman namespace\n-      namespace_prefix += ' { '\n+      # If we're a 'contentful' line such as a (non-header-guard) #ifdef, add\n+      # to the ifdef depth.  If we encounter #endif, reduce the ifdef depth.\n+      # Only keep track of namespaces when ifdef depth is 0\n+      elif line_info.type == _IF_RE:\n+        ifdef_depth += 1\n \n-    elif line_info.type == _FORWARD_DECLARE_RE:\n-      # If we're not in a namespace, keep going.  Otherwise, this is\n-      # just the situation we're looking for!\n-      if namespace_prefix:\n-        return (namespace_prefix, line_info.reorder_span)\n+      elif line_info.type == _ELSE_RE:\n+        continue\n \n-    else:\n-      # We should have handled all the cases above!\n-      assert False, ('unknown line-info type',\n-                     _LINE_TYPES.index(line_info.type))\n+      elif line_info.type == _ENDIF_RE:\n+        ifdef_depth -= 1\n \n-  # We stopped because we hit a contentful line (or, possibly, a\n-  # weird-looking namespace).  If we're inside the first-namespace,\n-  # return this position as a good place to insert forward-declares.\n-  if namespace_prefix:\n-    return (namespace_prefix, (line_number, line_number))\n-  return (None, None)\n+      elif ifdef_depth != 0:\n+        # skip lines until we're outside of an ifdef block\n+        continue\n+\n+      # Build the simplified namespace lists and namespace depths.  When\n+      # any new namespace is encountered, add the namespace to the list\n+      # using the next line to cover namespaces without forward declares.\n+      # When a forward declare is found, add the concatenated namespaces\n+      # to the list.  Once a contentful line (None) has been found, add\n+      # the final namespace if we're still inside one and stop searching.\n+      elif line_info.type == _NAMESPACE_START_RE:\n+        for namespace in _GetNamespaceNames(line_info.line):\n+          if not namespace:\n+            namespace_prefixes.append('namespace { ')\n+          else:\n+            namespace_prefixes.append('namespace %s { ' % namespace)\n+          namespace_depth += 1\n+        \n+        namespace_reorder_spans[''.join(namespace_prefixes)] = (\n+          line_number+1, line_number+1)\n+\n+      elif line_info.type == _NAMESPACE_START_ALLMAN_RE:\n+        for namespace in _GetNamespaceNames(line_info.line):\n+          if not namespace:\n+            namespace_prefix += 'namespace'\n+          else:\n+            namespace_prefix += 'namespace %s' % namespace\n+\n+      elif line_info.type == _NAMESPACE_START_MIXED_RE:\n+        # For mixed namespace styles, we need to append normalized prefixes\n+        # using regular and Allman style.  Treat the first elements as\n+        # normal and only treat the final element as Allman.  By the\n+        # nature of mixed namespaces, there will always be more than\n+        # one namespace so it is okay to assume that _GetNamespaceNames\n+        # will always return multiple records.\n+        namespaces = _GetNamespaceNames(line_info.line)\n+        for namespace in namespaces[:-1]:\n+          if not namespace:\n+            namespace_prefixes.append('namespace { ')\n+          else:\n+            namespace_prefixes.append('namespace %s { ' % namespace)\n+          namespace_depth += 1\n+        else:","path":"fix_includes.py","position":193,"original_position":193,"commit_id":"9df690cd45fa6ab4266e40e2be5a4c7a13bea894","original_commit_id":"9df690cd45fa6ab4266e40e2be5a4c7a13bea894","user":{"login":"kimgr","id":169074,"node_id":"MDQ6VXNlcjE2OTA3NA==","avatar_url":"https://avatars0.githubusercontent.com/u/169074?v=4","gravatar_id":"","url":"https://api.github.com/users/kimgr","html_url":"https://github.com/kimgr","followers_url":"https://api.github.com/users/kimgr/followers","following_url":"https://api.github.com/users/kimgr/following{/other_user}","gists_url":"https://api.github.com/users/kimgr/gists{/gist_id}","starred_url":"https://api.github.com/users/kimgr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kimgr/subscriptions","organizations_url":"https://api.github.com/users/kimgr/orgs","repos_url":"https://api.github.com/users/kimgr/repos","events_url":"https://api.github.com/users/kimgr/events{/privacy}","received_events_url":"https://api.github.com/users/kimgr/received_events","type":"User","site_admin":false},"body":"for/else always piques my interest...\r\n\r\nYou say in the comment above that there will \"always be more than one namespace\" -- you strip off the last one, which means there should be at least one left. You have no `break` in the loop body, so this `else` leg will never execute, right?","created_at":"2018-07-19T20:08:42Z","updated_at":"2018-07-19T20:30:23Z","html_url":"https://github.com/include-what-you-use/include-what-you-use/pull/571#discussion_r203855273","pull_request_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/571","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/comments/203855273"},"html":{"href":"https://github.com/include-what-you-use/include-what-you-use/pull/571#discussion_r203855273"},"pull_request":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/571"}}},"pull_request":{"url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/571","id":201428323,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAxNDI4MzIz","html_url":"https://github.com/include-what-you-use/include-what-you-use/pull/571","diff_url":"https://github.com/include-what-you-use/include-what-you-use/pull/571.diff","patch_url":"https://github.com/include-what-you-use/include-what-you-use/pull/571.patch","issue_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/issues/571","number":571,"state":"open","locked":false,"title":"Enhance fix_includes.py to understand multi-level namespaces","user":{"login":"chri7325","id":12401649,"node_id":"MDQ6VXNlcjEyNDAxNjQ5","avatar_url":"https://avatars3.githubusercontent.com/u/12401649?v=4","gravatar_id":"","url":"https://api.github.com/users/chri7325","html_url":"https://github.com/chri7325","followers_url":"https://api.github.com/users/chri7325/followers","following_url":"https://api.github.com/users/chri7325/following{/other_user}","gists_url":"https://api.github.com/users/chri7325/gists{/gist_id}","starred_url":"https://api.github.com/users/chri7325/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chri7325/subscriptions","organizations_url":"https://api.github.com/users/chri7325/orgs","repos_url":"https://api.github.com/users/chri7325/repos","events_url":"https://api.github.com/users/chri7325/events{/privacy}","received_events_url":"https://api.github.com/users/chri7325/received_events","type":"User","site_admin":false},"body":"The fix_includes.sh script has logic to append new forward declares at\r\nthe namespace level if possible.  This logic only tries on the first\r\nnamespace encountered, however, so projects with a lot of namespaces\r\nrequire a lot of manual tidying up.  Add multi-level detection so nested\r\nnamespaces have includes automatically inserted without creating new\r\nnamespace blocks when it is possible to do so cleanly.  If any issues\r\nare encountered when evaluating namespaces, new forward declares will\r\nbe added at the top level.  Ifdeffed code will also be ignored when\r\ntrying to evaluate namespaces as well.\r\n\r\nSigned-off-by: Christian Venegas <cvenegas@esri.com>\r\n\r\n@kimgr I've run IWYU on our codebase with these changes and the results\r\nwere very successful.  We have our entire codebase formatted with Allman\r\nnamespaces so it is very normalized.  I changed from Allman namespaces to\r\nnonAllman and had the same success.  I also tried nonAllman with compact\r\nnamespaces.  This covers the cases of\r\n```\r\n// Allman\r\nnamespace ns\r\n{\r\nnamspace ns1\r\n{\r\n} // namespace ns1\r\n} // namespace ns\r\n\r\n// NonAllman\r\nnamespace ns {\r\nnamspace ns1 {\r\n} // namespace ns1\r\n} // namespace ns\r\n```","created_at":"2018-07-14T01:09:45Z","updated_at":"2018-07-19T20:30:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3b5f52bcf8cfd9d20fe76fbbc809c9137a66c8d1","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/571/commits","review_comments_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/571/comments","review_comment_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/comments{/number}","comments_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/issues/571/comments","statuses_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/statuses/9df690cd45fa6ab4266e40e2be5a4c7a13bea894","head":{"label":"chri7325:chri7325/multi_level_namespace","ref":"chri7325/multi_level_namespace","sha":"9df690cd45fa6ab4266e40e2be5a4c7a13bea894","user":{"login":"chri7325","id":12401649,"node_id":"MDQ6VXNlcjEyNDAxNjQ5","avatar_url":"https://avatars3.githubusercontent.com/u/12401649?v=4","gravatar_id":"","url":"https://api.github.com/users/chri7325","html_url":"https://github.com/chri7325","followers_url":"https://api.github.com/users/chri7325/followers","following_url":"https://api.github.com/users/chri7325/following{/other_user}","gists_url":"https://api.github.com/users/chri7325/gists{/gist_id}","starred_url":"https://api.github.com/users/chri7325/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chri7325/subscriptions","organizations_url":"https://api.github.com/users/chri7325/orgs","repos_url":"https://api.github.com/users/chri7325/repos","events_url":"https://api.github.com/users/chri7325/events{/privacy}","received_events_url":"https://api.github.com/users/chri7325/received_events","type":"User","site_admin":false},"repo":{"id":136983637,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY5ODM2Mzc=","name":"include-what-you-use","full_name":"chri7325/include-what-you-use","owner":{"login":"chri7325","id":12401649,"node_id":"MDQ6VXNlcjEyNDAxNjQ5","avatar_url":"https://avatars3.githubusercontent.com/u/12401649?v=4","gravatar_id":"","url":"https://api.github.com/users/chri7325","html_url":"https://github.com/chri7325","followers_url":"https://api.github.com/users/chri7325/followers","following_url":"https://api.github.com/users/chri7325/following{/other_user}","gists_url":"https://api.github.com/users/chri7325/gists{/gist_id}","starred_url":"https://api.github.com/users/chri7325/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chri7325/subscriptions","organizations_url":"https://api.github.com/users/chri7325/orgs","repos_url":"https://api.github.com/users/chri7325/repos","events_url":"https://api.github.com/users/chri7325/events{/privacy}","received_events_url":"https://api.github.com/users/chri7325/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/chri7325/include-what-you-use","description":"A tool for use with clang to analyze #includes in C and C++ source files","fork":true,"url":"https://api.github.com/repos/chri7325/include-what-you-use","forks_url":"https://api.github.com/repos/chri7325/include-what-you-use/forks","keys_url":"https://api.github.com/repos/chri7325/include-what-you-use/keys{/key_id}","collaborators_url":"https://api.github.com/repos/chri7325/include-what-you-use/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/chri7325/include-what-you-use/teams","hooks_url":"https://api.github.com/repos/chri7325/include-what-you-use/hooks","issue_events_url":"https://api.github.com/repos/chri7325/include-what-you-use/issues/events{/number}","events_url":"https://api.github.com/repos/chri7325/include-what-you-use/events","assignees_url":"https://api.github.com/repos/chri7325/include-what-you-use/assignees{/user}","branches_url":"https://api.github.com/repos/chri7325/include-what-you-use/branches{/branch}","tags_url":"https://api.github.com/repos/chri7325/include-what-you-use/tags","blobs_url":"https://api.github.com/repos/chri7325/include-what-you-use/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/chri7325/include-what-you-use/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/chri7325/include-what-you-use/git/refs{/sha}","trees_url":"https://api.github.com/repos/chri7325/include-what-you-use/git/trees{/sha}","statuses_url":"https://api.github.com/repos/chri7325/include-what-you-use/statuses/{sha}","languages_url":"https://api.github.com/repos/chri7325/include-what-you-use/languages","stargazers_url":"https://api.github.com/repos/chri7325/include-what-you-use/stargazers","contributors_url":"https://api.github.com/repos/chri7325/include-what-you-use/contributors","subscribers_url":"https://api.github.com/repos/chri7325/include-what-you-use/subscribers","subscription_url":"https://api.github.com/repos/chri7325/include-what-you-use/subscription","commits_url":"https://api.github.com/repos/chri7325/include-what-you-use/commits{/sha}","git_commits_url":"https://api.github.com/repos/chri7325/include-what-you-use/git/commits{/sha}","comments_url":"https://api.github.com/repos/chri7325/include-what-you-use/comments{/number}","issue_comment_url":"https://api.github.com/repos/chri7325/include-what-you-use/issues/comments{/number}","contents_url":"https://api.github.com/repos/chri7325/include-what-you-use/contents/{+path}","compare_url":"https://api.github.com/repos/chri7325/include-what-you-use/compare/{base}...{head}","merges_url":"https://api.github.com/repos/chri7325/include-what-you-use/merges","archive_url":"https://api.github.com/repos/chri7325/include-what-you-use/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/chri7325/include-what-you-use/downloads","issues_url":"https://api.github.com/repos/chri7325/include-what-you-use/issues{/number}","pulls_url":"https://api.github.com/repos/chri7325/include-what-you-use/pulls{/number}","milestones_url":"https://api.github.com/repos/chri7325/include-what-you-use/milestones{/number}","notifications_url":"https://api.github.com/repos/chri7325/include-what-you-use/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/chri7325/include-what-you-use/labels{/name}","releases_url":"https://api.github.com/repos/chri7325/include-what-you-use/releases{/id}","deployments_url":"https://api.github.com/repos/chri7325/include-what-you-use/deployments","created_at":"2018-06-11T21:36:57Z","updated_at":"2018-06-11T21:36:59Z","pushed_at":"2018-07-14T01:24:48Z","git_url":"git://github.com/chri7325/include-what-you-use.git","ssh_url":"git@github.com:chri7325/include-what-you-use.git","clone_url":"https://github.com/chri7325/include-what-you-use.git","svn_url":"https://github.com/chri7325/include-what-you-use","homepage":"https://include-what-you-use.org","size":1772,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"include-what-you-use:master","ref":"master","sha":"0ac92dbbf3b88f3189d1608873a1feb96b9fbf5c","user":{"login":"include-what-you-use","id":11830272,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExODMwMjcy","avatar_url":"https://avatars3.githubusercontent.com/u/11830272?v=4","gravatar_id":"","url":"https://api.github.com/users/include-what-you-use","html_url":"https://github.com/include-what-you-use","followers_url":"https://api.github.com/users/include-what-you-use/followers","following_url":"https://api.github.com/users/include-what-you-use/following{/other_user}","gists_url":"https://api.github.com/users/include-what-you-use/gists{/gist_id}","starred_url":"https://api.github.com/users/include-what-you-use/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/include-what-you-use/subscriptions","organizations_url":"https://api.github.com/users/include-what-you-use/orgs","repos_url":"https://api.github.com/users/include-what-you-use/repos","events_url":"https://api.github.com/users/include-what-you-use/events{/privacy}","received_events_url":"https://api.github.com/users/include-what-you-use/received_events","type":"Organization","site_admin":false},"repo":{"id":37440338,"node_id":"MDEwOlJlcG9zaXRvcnkzNzQ0MDMzOA==","name":"include-what-you-use","full_name":"include-what-you-use/include-what-you-use","owner":{"login":"include-what-you-use","id":11830272,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExODMwMjcy","avatar_url":"https://avatars3.githubusercontent.com/u/11830272?v=4","gravatar_id":"","url":"https://api.github.com/users/include-what-you-use","html_url":"https://github.com/include-what-you-use","followers_url":"https://api.github.com/users/include-what-you-use/followers","following_url":"https://api.github.com/users/include-what-you-use/following{/other_user}","gists_url":"https://api.github.com/users/include-what-you-use/gists{/gist_id}","starred_url":"https://api.github.com/users/include-what-you-use/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/include-what-you-use/subscriptions","organizations_url":"https://api.github.com/users/include-what-you-use/orgs","repos_url":"https://api.github.com/users/include-what-you-use/repos","events_url":"https://api.github.com/users/include-what-you-use/events{/privacy}","received_events_url":"https://api.github.com/users/include-what-you-use/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/include-what-you-use/include-what-you-use","description":"A tool for use with clang to analyze #includes in C and C++ source files","fork":false,"url":"https://api.github.com/repos/include-what-you-use/include-what-you-use","forks_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/forks","keys_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/keys{/key_id}","collaborators_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/teams","hooks_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/hooks","issue_events_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/issues/events{/number}","events_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/events","assignees_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/assignees{/user}","branches_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/branches{/branch}","tags_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/tags","blobs_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/git/refs{/sha}","trees_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/git/trees{/sha}","statuses_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/statuses/{sha}","languages_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/languages","stargazers_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/stargazers","contributors_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/contributors","subscribers_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/subscribers","subscription_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/subscription","commits_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/commits{/sha}","git_commits_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/git/commits{/sha}","comments_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/comments{/number}","issue_comment_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/issues/comments{/number}","contents_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/contents/{+path}","compare_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/compare/{base}...{head}","merges_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/merges","archive_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/downloads","issues_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/issues{/number}","pulls_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls{/number}","milestones_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/milestones{/number}","notifications_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/labels{/name}","releases_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/releases{/id}","deployments_url":"https://api.github.com/repos/include-what-you-use/include-what-you-use/deployments","created_at":"2015-06-15T03:00:29Z","updated_at":"2018-07-19T13:14:52Z","pushed_at":"2018-07-14T01:25:47Z","git_url":"git://github.com/include-what-you-use/include-what-you-use.git","ssh_url":"git@github.com:include-what-you-use/include-what-you-use.git","clone_url":"https://github.com/include-what-you-use/include-what-you-use.git","svn_url":"https://github.com/include-what-you-use/include-what-you-use","homepage":"https://include-what-you-use.org","size":2109,"stargazers_count":1067,"watchers_count":1067,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":104,"mirror_url":null,"archived":false,"open_issues_count":139,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":104,"open_issues":139,"watchers":1067,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/571"},"html":{"href":"https://github.com/include-what-you-use/include-what-you-use/pull/571"},"issue":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/issues/571"},"comments":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/issues/571/comments"},"review_comments":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/571/comments"},"review_comment":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/pulls/571/commits"},"statuses":{"href":"https://api.github.com/repos/include-what-you-use/include-what-you-use/statuses/9df690cd45fa6ab4266e40e2be5a4c7a13bea894"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"kimgr"}}