{"action":"created","comment":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/169836052","pull_request_review_id":98427280,"id":169836052,"diff_hunk":"@@ -0,0 +1,833 @@\n+#!/usr/bin/python3\n+#\n+# Copyright (c) 2008 Ben Rockwood <benr@cuddletech.com>,\n+# Copyright (c) 2010 Martin Matuska <mm@FreeBSD.org>,\n+# Copyright (c) 2010-2011 Jason J. Hellenthal <jhell@DataIX.net>,\n+# Copyright (c) 2017 Scot W. Stevenson <scot.stevenson@gmail.com>\n+# All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# 1. Redistributions of source code must retain the above copyright\n+#    notice, this list of conditions and the following disclaimer.\n+# 2. Redistributions in binary form must reproduce the above copyright\n+#    notice, this list of conditions and the following disclaimer in the\n+#    documentation and/or other materials provided with the distribution.\n+#\n+# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE\n+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n+# SUCH DAMAGE.\n+\"\"\"Print statistics on the ZFS ARC Cache and other information\n+\n+Provides basic information on the ARC, its efficiency, the L2ARC (if present),\n+the Data Management Unit (DMU), Virtual Devices (VDEVs), and tunables. See\n+the in-source documentation and code at\n+https://github.com/zfsonlinux/zfs/blob/master/module/zfs/arc.c for details.\n+The original introduction to arc_summary can be found at\n+http://cuddletech.com/?p=454\n+\"\"\"\n+\n+import argparse\n+import os\n+import subprocess\n+import sys\n+import time\n+\n+DECRIPTION = 'Print ARC and other statistics for ZFS on Linux'\n+INDENT = ' '*8\n+LINE_LENGTH = 72\n+PROC_PATH = '/proc/spl/kstat/zfs/'\n+SPL_PATH = '/sys/module/spl/parameters/'\n+TUNABLES_PATH = '/sys/module/zfs/parameters/'\n+DATE_FORMAT = '%a %b %d %H:%M:%S %Y'\n+TITLE = 'ZFS Subsystem Report'\n+\n+SECTIONS = 'arc archits dmu l2arc spl tunables vdev zil'.split()\n+SECTION_HELP = 'print info from one section ('+' '.join(SECTIONS)+')'\n+\n+# Tunables and SPL are handled separately because they come from\n+# different sources\n+SECTION_PATHS = {'arc': 'arcstats',\n+                 'dmu': 'dmu_tx',\n+                 'l2arc': 'arcstats',  # L2ARC stuff lives in arcstats\n+                 'vdev': 'vdev_cache_stats',\n+                 'xuio': 'xuio_stats',\n+                 'zfetch': 'zfetchstats',\n+                 'zil': 'zil'}\n+\n+parser = argparse.ArgumentParser(description=DECRIPTION)\n+parser.add_argument('-a', '--alternate', action='store_true', default=False,\n+                    help='use alternate formatting for tunables and SPL',\n+                    dest='alt')\n+parser.add_argument('-d', '--description', action='store_true', default=False,\n+                    help='print descriptions with tunables and SPL',\n+                    dest='desc')\n+parser.add_argument('-g', '--graph', action='store_true', default=False,\n+                    help='print graph on ARC use and exit', dest='graph')\n+parser.add_argument('-p', '--page', type=int, dest='page',\n+                    help='print page by number (DEPRECATED, use \"-s\")')\n+parser.add_argument('-r', '--raw', action='store_true', default=False,\n+                    help='dump all available data with minimal formatting',\n+                    dest='raw')\n+parser.add_argument('-s', '--section', dest='section', help=SECTION_HELP)\n+ARGS = parser.parse_args()\n+\n+\n+def cleanup_line(single_line):\n+    \"\"\"Format a raw line of data from /proc and isolate the name value\n+    part, returning a tuple with each. Currently, this gets rid of the\n+    middle '4'. For example \"arc_no_grow    4    0\" returns the tuple\n+    (\"arc_no_grow\", \"0\").\n+    \"\"\"\n+    name, _, value = single_line.split()\n+\n+    return name, value\n+\n+\n+def draw_graph(kstats_dict):\n+    \"\"\"Draw a primitive graph representing the basic information on the\n+    ARC -- its size and the proportion used by MFU and MRU -- and quit.\n+    We use max size of the ARC to calculate how full it is. This is a\n+    very rough representation.\n+    \"\"\"\n+\n+    arc_stats = isolate_section('arcstats', kstats_dict)\n+\n+    GRAPH_INDENT = ' '*4\n+    GRAPH_WIDTH = 60\n+    arc_size = f_bytes(arc_stats['size'])\n+    arc_perc = f_perc(arc_stats['size'], arc_stats['c_max'])\n+    mfu_size = f_bytes(arc_stats['mfu_size'])\n+    mru_size = f_bytes(arc_stats['mru_size'])\n+\n+    info_form = 'ARC: {0} ({1})  MFU: {2}  MRU: {3}'\n+    info_line = info_form.format(arc_size, arc_perc, mfu_size, mru_size)\n+    info_spc = ' '*int((GRAPH_WIDTH-len(info_line))/2)\n+    info_line = GRAPH_INDENT+info_spc+info_line\n+\n+    graph_line = GRAPH_INDENT+'+'+('-'*(GRAPH_WIDTH-2))+'+'\n+\n+    mfu_perc = float(int(arc_stats['mfu_size'])/int(arc_stats['c_max']))\n+    mru_perc = float(int(arc_stats['mru_size'])/int(arc_stats['c_max']))\n+    arc_perc = float(int(arc_stats['size'])/int(arc_stats['c_max']))\n+    total_ticks = float(arc_perc)*GRAPH_WIDTH\n+    mfu_ticks = mfu_perc*GRAPH_WIDTH\n+    mru_ticks = mru_perc*GRAPH_WIDTH\n+    other_ticks = total_ticks-(mfu_ticks+mru_ticks)\n+\n+    core_form = 'F'*int(mfu_ticks)+'R'*int(mru_ticks)+'O'*int(other_ticks)\n+    core_spc = ' '*(GRAPH_WIDTH-(2+len(core_form)))\n+    core_line = GRAPH_INDENT+'|'+core_form+core_spc+'|'\n+\n+    for line in ('', info_line, graph_line, core_line, graph_line, ''):\n+        print(line)\n+\n+\n+def f_bytes(byte_string):\n+    \"\"\"Return human-readable representation of a byte value in\n+    powers of 2 (eg \"KiB\" for \"kibibytes\", etc) to two decimal\n+    points. Values smaller than one KiB are returned without\n+    decimal points. Note \"bytes\" is a reserved keyword.\n+    \"\"\"\n+\n+    prefixes = ([2**80, \"YiB\"],   # yobibytes (yotta)\n+                [2**70, \"ZiB\"],   # zebibytes (zetta)\n+                [2**60, \"EiB\"],   # exbibytes (exa)\n+                [2**50, \"PiB\"],   # pebibytes (peta)\n+                [2**40, \"TiB\"],   # tebibytes (tera)\n+                [2**30, \"GiB\"],   # gibibytes (giga)\n+                [2**20, \"MiB\"],   # mebibytes (mega)\n+                [2**10, \"KiB\"])   # kibibytes (kilo)\n+\n+    bites = int(byte_string)\n+\n+    if bites >= 2**10:\n+        for limit, unit in prefixes:\n+\n+            if bites >= limit:\n+                value = bites / limit\n+                break\n+\n+        result = '{0:.1f} {1}'.format(value, unit)\n+    else:\n+        result = '{0} Bytes'.format(bites)\n+\n+    return result\n+\n+\n+def f_hits(hits_string):\n+    \"\"\"Create a human-readable representation of the number of hits.\n+    The single-letter symbols used are SI to avoid the confusion caused\n+    by the different \"short scale\" and \"long scale\" representations in\n+    English, which use the same words for different values. See\n+    https://en.wikipedia.org/wiki/Names_of_large_numbers and:\n+    https://physics.nist.gov/cuu/Units/prefixes.html\n+    \"\"\"\n+\n+    numbers = ([10**24, 'Y'],  # yotta (septillion)\n+               [10**21, 'Z'],  # zetta (sextillion)\n+               [10**18, 'E'],  # exa   (quintrillion)\n+               [10**15, 'P'],  # peta  (quadrillion)\n+               [10**12, 'T'],  # tera  (trillion)\n+               [10**9, 'G'],   # giga  (billion)\n+               [10**6, 'M'],   # mega  (million)\n+               [10**3, 'k'])   # kilo  (thousand)\n+\n+    hits = int(hits_string)\n+\n+    if hits >= 1000:\n+        for limit, symbol in numbers:\n+\n+            if hits >= limit:\n+                value = hits/limit\n+                break\n+\n+        result = \"%0.1f%s\" % (value, symbol)\n+    else:\n+        result = \"%d\" % hits\n+\n+    return result\n+\n+\n+def f_perc(value1, value2):\n+    \"\"\"Calculate percentage and return in human-readable form. If\n+    rounding produces the result '0.0' though the first number is\n+    not zero, include a 'less-than' symbol to avoid confusion.\n+    Division by zero is handled by returning 'n/a'; no error\n+    is called.\n+    \"\"\"\n+\n+    v1 = float(value1)\n+    v2 = float(value2)\n+\n+    try:\n+        perc = 100 * v1/v2\n+    except ZeroDivisionError:\n+        result = 'n/a'\n+    else:\n+        result = '{0:0.1f} %'.format(perc)\n+\n+    if result == '0.0 %' and v1 > 0:\n+        result = '< 0.1 %'\n+\n+    return result\n+\n+\n+def format_raw_line(name, value):\n+    \"\"\"For the --raw option for the tunable and SPL outputs, decide on the\n+    correct formatting based on the --alternate flag.\n+    \"\"\"\n+\n+    if ARGS.alt:\n+        result = '{0}{1}={2}'.format(INDENT, name, value)\n+    else:\n+        spc = LINE_LENGTH-(len(INDENT)+len(value))\n+        result = '{0}{1:<{spc}}{2}'.format(INDENT, name, value, spc=spc)\n+\n+    return result\n+\n+\n+def get_kstats():\n+    \"\"\"Collect information on the ZFS subsystem from the /proc Linux virtual\n+    file system. The step does not perform any further processing, giving us\n+    the option to only work on what is actually needed. The name \"kstat\" is a\n+    holdover from the Solaris utility of the same name.\n+    \"\"\"\n+\n+    result = {}\n+    secs = SECTION_PATHS.values()\n+\n+    for section in secs:\n+\n+        with open(PROC_PATH+section, 'r') as proc_location:\n+            lines = [line for line in proc_location]\n+\n+        del lines[0:2]  # Get rid of header\n+        result[section] = lines\n+\n+    return result\n+\n+\n+def get_spl_tunables(PATH):\n+    \"\"\"Collect information on the Solaris Porting Layer (SPL) or the\n+    tunables, depending on the PATH given. Does not check if PATH is\n+    legal.\n+    \"\"\"\n+\n+    result = {}\n+    parameters = os.listdir(PATH)\n+\n+    for name in parameters:\n+\n+        with open(PATH+name, 'r') as para_file:\n+            value = para_file.read()\n+            result[name] = value.strip()\n+\n+    return result\n+\n+\n+def get_descriptions(request):\n+    \"\"\"Get the decriptions of the Solaris Porting Layer (SPL) or the\n+    tunables, return with minimal formatting.\n+    \"\"\"\n+\n+    if request not in ('spl', 'zfs'):\n+        print('ERROR: description of \"{0}\" requested)'.format(request))\n+        sys.exit(1)\n+\n+    descs = {}\n+    target_prefix = 'parm:'\n+\n+    command = [\"/sbin/modinfo\", request, \"-0\"]\n+    info = subprocess.run(command, stdout=subprocess.PIPE,\n+                          universal_newlines=True)","path":"cmd/arc_summary/arc_summary3.py","position":293,"original_position":293,"commit_id":"68725725c5cd3afc0be4568d1238deb238897f97","original_commit_id":"68725725c5cd3afc0be4568d1238deb238897f97","user":{"login":"richardelling","id":867533,"avatar_url":"https://avatars1.githubusercontent.com/u/867533?v=4","gravatar_id":"","url":"https://api.github.com/users/richardelling","html_url":"https://github.com/richardelling","followers_url":"https://api.github.com/users/richardelling/followers","following_url":"https://api.github.com/users/richardelling/following{/other_user}","gists_url":"https://api.github.com/users/richardelling/gists{/gist_id}","starred_url":"https://api.github.com/users/richardelling/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/richardelling/subscriptions","organizations_url":"https://api.github.com/users/richardelling/orgs","repos_url":"https://api.github.com/users/richardelling/repos","events_url":"https://api.github.com/users/richardelling/events{/privacy}","received_events_url":"https://api.github.com/users/richardelling/received_events","type":"User","site_admin":false},"body":"personally, I don't see check_output going away anytime soon, but...\r\n\r\nthere no need to check versions, check to see if you can import run from subprocess thusly:\r\n```python\r\ninfo = ''\r\nif 'run' in dir(subprocess):\r\n  info = subprocess.run(...)\r\nelif 'check_output' in dir(subprocess):\r\n  info = subprocess.check_output(...)\r\n```","created_at":"2018-02-22T01:58:58Z","updated_at":"2018-02-22T01:58:59Z","html_url":"https://github.com/zfsonlinux/zfs/pull/6892#discussion_r169836052","pull_request_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/6892","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/169836052"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/6892#discussion_r169836052"},"pull_request":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/6892"}},"in_reply_to_id":167116873},"pull_request":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/6892","id":154152116,"html_url":"https://github.com/zfsonlinux/zfs/pull/6892","diff_url":"https://github.com/zfsonlinux/zfs/pull/6892.diff","patch_url":"https://github.com/zfsonlinux/zfs/pull/6892.patch","issue_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/6892","number":6892,"state":"open","locked":false,"title":"Add Python 3 rewrite of arc_summary.py (#6873)","user":{"login":"scotws","id":10404366,"avatar_url":"https://avatars3.githubusercontent.com/u/10404366?v=4","gravatar_id":"","url":"https://api.github.com/users/scotws","html_url":"https://github.com/scotws","followers_url":"https://api.github.com/users/scotws/followers","following_url":"https://api.github.com/users/scotws/following{/other_user}","gists_url":"https://api.github.com/users/scotws/gists{/gist_id}","starred_url":"https://api.github.com/users/scotws/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scotws/subscriptions","organizations_url":"https://api.github.com/users/scotws/orgs","repos_url":"https://api.github.com/users/scotws/repos","events_url":"https://api.github.com/users/scotws/events{/privacy}","received_events_url":"https://api.github.com/users/scotws/received_events","type":"User","site_admin":false},"body":"### Description\r\n\r\nAdd new Python 3 script `arc_summary3.py` as a complete rewrite of `arc_summary.py` to display basic information on the ARC status and various other parameters. This is provided in addition - not as a replacement - to the existing `arc_summary.py` tool. See #6873 for a discussion of the reasoning behind adding a new version of this tool while keeping a legacy version as well.\r\n\r\nNew options:\r\n\r\n        -g/--graph    - Display crude graphic representation of ARC status and quit\r\n        -r/--raw      - Print all available information as minimally formatted list and quit\r\n        -s/--section  - Print a single section. This supersedes -p/--page, which is kept for\r\n                        backwards use but marked as DEPRECIATED\r\n\r\nAdds new sections with information on the ZIL and SPL. \r\n\r\nWe now notify the user if sections L2ARC and VDEV are skipped instead of failing silently; note VDEV caching is currently disabled and slated for possible removal (see source code). Adds information on the ZFS and SPL versions to the header.\r\n\r\nThe **-s/--section** option is intended to replace the page number system, which required the user to remember which page number was of interest. The -p/--page options are still supported, but marked as DEPRECIATED. Current legal sections are `arc archits dmu l2arc spl tunables vdev zil`. It should be easier now to add and modify sections.\r\n\r\nThe **-r/--raw** option is intended to work with other tools such as `grep`. It respects the -a/-d options (alternate output format / descriptions included) where possible. \r\n\r\nThe output of the **-g/--graph** option is intended to give a quick, rough overview as a visual orientation. An example (Ubuntu 16.04 LTS x86_64 with 24 GB RAM, 8 GB ARC max, ZFS stock version 0.6.5.9-2 with `/home` as ZFS mirror pool immediately after starting _Civilization VI_ on Steam on otherwise quiet machine): \r\n```\r\n        ARC: 3.0 GiB (37.5 %)  MFU: 610.5 MiB  MRU: 2.3 GiB\r\n    +----------------------------------------------------------+\r\n    |FFFFRRRRRRRRRRRRRRRRR                                     |\r\n    +----------------------------------------------------------+\r\n```\r\n`F` is for MFU, `R` for MRU, and `O` is used for \"other\" if necessary (not present in this example). \r\n\r\n`arc_summary3.py` was developed for Python 3.5. This follows the version of Python currently installed in Ubuntu 16.04 LTS. Few systems will have Python 3.6 installed yet.\r\n\r\n### Known issues\r\n\r\nThe new script is based on the same internal logic as the original, so any error or issue present there will probably show up here as well. For instance, the number of anonymous hits can be negative the way it is calculated in both scripts; they both simply hide any negative value.\r\n\r\nThis script will probably make a bunch of test suites unhappy where Python 3 is not included. There is no experience with this script under extreme conditions (for example ARC throttling).\r\n\r\n### How Has This Been Tested?\r\n\r\nThere is a unittest script `test_arc_summary3.py` at https://gist.github.com/scotws/aaf5d9c9317081e249b664a371ec4907\r\nMost testing was done in-tree, comparing the output to that of the current `arc_summary.py` version.\r\n\r\nThe L2ARC section has **not seen any real-world use** because I do not have access to a L2ARC device on my machine.\r\n\r\n### Other \r\n\r\nSwitching to Python 3 results in a noticeably smaller file size despite the addition of several new features. Output of `wc` for both scripts:\r\n```\r\n    837    2586   28021 arc_summary3.py\r\n   1020    2593   35538 arc_summary.py\r\n```\r\n\r\n### Types of changes\r\n<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->\r\n- [ ] Bug fix (non-breaking change which fixes an issue)\r\n- [x] New feature (non-breaking change which adds functionality)\r\n- [x] Performance enhancement (non-breaking change which improves efficiency)\r\n- [ ] Code cleanup (non-breaking change which makes code smaller or more readable)\r\n- [ ] Breaking change (fix or feature that would cause existing functionality to change)\r\n- [ ] Documentation (a change to man pages or other documentation)\r\n\r\n### Checklist:\r\n<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->\r\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\r\n- [x] My code follows the ZFS on Linux code style requirements.\r\n- [ ] I have updated the documentation accordingly.\r\n- [ ] I have read the **CONTRIBUTING** document.\r\n- [x] I have added tests to cover my changes.\r\n- [ ] All new and existing tests passed.\r\n- [x] All commit messages are properly formatted and contain `Signed-off-by`.\r\n- [ ] Change has been approved by a ZFS on Linux member.\r\n","created_at":"2017-11-22T13:24:07Z","updated_at":"2018-02-22T01:58:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b603d1930da264d321c1983d1e24973a56a070b7","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":453022836,"url":"https://api.github.com/repos/zfsonlinux/zfs/labels/Work%20in%20Progress","name":"Work in Progress","color":"b60205","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/6892/commits","review_comments_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/6892/comments","review_comment_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/6892/comments","statuses_url":"https://api.github.com/repos/zfsonlinux/zfs/statuses/68725725c5cd3afc0be4568d1238deb238897f97","head":{"label":"scotws:python3","ref":"python3","sha":"68725725c5cd3afc0be4568d1238deb238897f97","user":{"login":"scotws","id":10404366,"avatar_url":"https://avatars3.githubusercontent.com/u/10404366?v=4","gravatar_id":"","url":"https://api.github.com/users/scotws","html_url":"https://github.com/scotws","followers_url":"https://api.github.com/users/scotws/followers","following_url":"https://api.github.com/users/scotws/following{/other_user}","gists_url":"https://api.github.com/users/scotws/gists{/gist_id}","starred_url":"https://api.github.com/users/scotws/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scotws/subscriptions","organizations_url":"https://api.github.com/users/scotws/orgs","repos_url":"https://api.github.com/users/scotws/repos","events_url":"https://api.github.com/users/scotws/events{/privacy}","received_events_url":"https://api.github.com/users/scotws/received_events","type":"User","site_admin":false},"repo":{"id":108225439,"name":"zfs","full_name":"scotws/zfs","owner":{"login":"scotws","id":10404366,"avatar_url":"https://avatars3.githubusercontent.com/u/10404366?v=4","gravatar_id":"","url":"https://api.github.com/users/scotws","html_url":"https://github.com/scotws","followers_url":"https://api.github.com/users/scotws/followers","following_url":"https://api.github.com/users/scotws/following{/other_user}","gists_url":"https://api.github.com/users/scotws/gists{/gist_id}","starred_url":"https://api.github.com/users/scotws/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scotws/subscriptions","organizations_url":"https://api.github.com/users/scotws/orgs","repos_url":"https://api.github.com/users/scotws/repos","events_url":"https://api.github.com/users/scotws/events{/privacy}","received_events_url":"https://api.github.com/users/scotws/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/scotws/zfs","description":"ZFS on Linux - the official OpenZFS implementation for Linux.","fork":true,"url":"https://api.github.com/repos/scotws/zfs","forks_url":"https://api.github.com/repos/scotws/zfs/forks","keys_url":"https://api.github.com/repos/scotws/zfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scotws/zfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scotws/zfs/teams","hooks_url":"https://api.github.com/repos/scotws/zfs/hooks","issue_events_url":"https://api.github.com/repos/scotws/zfs/issues/events{/number}","events_url":"https://api.github.com/repos/scotws/zfs/events","assignees_url":"https://api.github.com/repos/scotws/zfs/assignees{/user}","branches_url":"https://api.github.com/repos/scotws/zfs/branches{/branch}","tags_url":"https://api.github.com/repos/scotws/zfs/tags","blobs_url":"https://api.github.com/repos/scotws/zfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scotws/zfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scotws/zfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/scotws/zfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scotws/zfs/statuses/{sha}","languages_url":"https://api.github.com/repos/scotws/zfs/languages","stargazers_url":"https://api.github.com/repos/scotws/zfs/stargazers","contributors_url":"https://api.github.com/repos/scotws/zfs/contributors","subscribers_url":"https://api.github.com/repos/scotws/zfs/subscribers","subscription_url":"https://api.github.com/repos/scotws/zfs/subscription","commits_url":"https://api.github.com/repos/scotws/zfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/scotws/zfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/scotws/zfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/scotws/zfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/scotws/zfs/contents/{+path}","compare_url":"https://api.github.com/repos/scotws/zfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scotws/zfs/merges","archive_url":"https://api.github.com/repos/scotws/zfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scotws/zfs/downloads","issues_url":"https://api.github.com/repos/scotws/zfs/issues{/number}","pulls_url":"https://api.github.com/repos/scotws/zfs/pulls{/number}","milestones_url":"https://api.github.com/repos/scotws/zfs/milestones{/number}","notifications_url":"https://api.github.com/repos/scotws/zfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scotws/zfs/labels{/name}","releases_url":"https://api.github.com/repos/scotws/zfs/releases{/id}","deployments_url":"https://api.github.com/repos/scotws/zfs/deployments","created_at":"2017-10-25T05:49:04Z","updated_at":"2017-10-25T05:49:12Z","pushed_at":"2018-02-14T19:56:42Z","git_url":"git://github.com/scotws/zfs.git","ssh_url":"git@github.com:scotws/zfs.git","clone_url":"https://github.com/scotws/zfs.git","svn_url":"https://github.com/scotws/zfs","homepage":"http://zfsonlinux.org/","size":43645,"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},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"zfsonlinux:master","ref":"master","sha":"6f259b59cf16f3c859caa64ce5fe55aa39481bad","user":{"login":"zfsonlinux","id":575083,"avatar_url":"https://avatars3.githubusercontent.com/u/575083?v=4","gravatar_id":"","url":"https://api.github.com/users/zfsonlinux","html_url":"https://github.com/zfsonlinux","followers_url":"https://api.github.com/users/zfsonlinux/followers","following_url":"https://api.github.com/users/zfsonlinux/following{/other_user}","gists_url":"https://api.github.com/users/zfsonlinux/gists{/gist_id}","starred_url":"https://api.github.com/users/zfsonlinux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zfsonlinux/subscriptions","organizations_url":"https://api.github.com/users/zfsonlinux/orgs","repos_url":"https://api.github.com/users/zfsonlinux/repos","events_url":"https://api.github.com/users/zfsonlinux/events{/privacy}","received_events_url":"https://api.github.com/users/zfsonlinux/received_events","type":"Organization","site_admin":false},"repo":{"id":437011,"name":"zfs","full_name":"zfsonlinux/zfs","owner":{"login":"zfsonlinux","id":575083,"avatar_url":"https://avatars3.githubusercontent.com/u/575083?v=4","gravatar_id":"","url":"https://api.github.com/users/zfsonlinux","html_url":"https://github.com/zfsonlinux","followers_url":"https://api.github.com/users/zfsonlinux/followers","following_url":"https://api.github.com/users/zfsonlinux/following{/other_user}","gists_url":"https://api.github.com/users/zfsonlinux/gists{/gist_id}","starred_url":"https://api.github.com/users/zfsonlinux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zfsonlinux/subscriptions","organizations_url":"https://api.github.com/users/zfsonlinux/orgs","repos_url":"https://api.github.com/users/zfsonlinux/repos","events_url":"https://api.github.com/users/zfsonlinux/events{/privacy}","received_events_url":"https://api.github.com/users/zfsonlinux/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/zfsonlinux/zfs","description":"ZFS on Linux - the official OpenZFS implementation for Linux.","fork":false,"url":"https://api.github.com/repos/zfsonlinux/zfs","forks_url":"https://api.github.com/repos/zfsonlinux/zfs/forks","keys_url":"https://api.github.com/repos/zfsonlinux/zfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zfsonlinux/zfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zfsonlinux/zfs/teams","hooks_url":"https://api.github.com/repos/zfsonlinux/zfs/hooks","issue_events_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/events{/number}","events_url":"https://api.github.com/repos/zfsonlinux/zfs/events","assignees_url":"https://api.github.com/repos/zfsonlinux/zfs/assignees{/user}","branches_url":"https://api.github.com/repos/zfsonlinux/zfs/branches{/branch}","tags_url":"https://api.github.com/repos/zfsonlinux/zfs/tags","blobs_url":"https://api.github.com/repos/zfsonlinux/zfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zfsonlinux/zfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zfsonlinux/zfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/zfsonlinux/zfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zfsonlinux/zfs/statuses/{sha}","languages_url":"https://api.github.com/repos/zfsonlinux/zfs/languages","stargazers_url":"https://api.github.com/repos/zfsonlinux/zfs/stargazers","contributors_url":"https://api.github.com/repos/zfsonlinux/zfs/contributors","subscribers_url":"https://api.github.com/repos/zfsonlinux/zfs/subscribers","subscription_url":"https://api.github.com/repos/zfsonlinux/zfs/subscription","commits_url":"https://api.github.com/repos/zfsonlinux/zfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/zfsonlinux/zfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/zfsonlinux/zfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/zfsonlinux/zfs/contents/{+path}","compare_url":"https://api.github.com/repos/zfsonlinux/zfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zfsonlinux/zfs/merges","archive_url":"https://api.github.com/repos/zfsonlinux/zfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zfsonlinux/zfs/downloads","issues_url":"https://api.github.com/repos/zfsonlinux/zfs/issues{/number}","pulls_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls{/number}","milestones_url":"https://api.github.com/repos/zfsonlinux/zfs/milestones{/number}","notifications_url":"https://api.github.com/repos/zfsonlinux/zfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zfsonlinux/zfs/labels{/name}","releases_url":"https://api.github.com/repos/zfsonlinux/zfs/releases{/id}","deployments_url":"https://api.github.com/repos/zfsonlinux/zfs/deployments","created_at":"2009-12-14T20:20:34Z","updated_at":"2018-02-21T17:16:05Z","pushed_at":"2018-02-22T01:55:10Z","git_url":"git://github.com/zfsonlinux/zfs.git","ssh_url":"git@github.com:zfsonlinux/zfs.git","clone_url":"https://github.com/zfsonlinux/zfs.git","svn_url":"https://github.com/zfsonlinux/zfs","homepage":"http://zfsonlinux.org/","size":44162,"stargazers_count":3051,"watchers_count":3051,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":711,"mirror_url":null,"archived":false,"open_issues_count":928,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":711,"open_issues":928,"watchers":3051,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/6892"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/6892"},"issue":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/6892"},"comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/6892/comments"},"review_comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/6892/comments"},"review_comment":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/6892/commits"},"statuses":{"href":"https://api.github.com/repos/zfsonlinux/zfs/statuses/68725725c5cd3afc0be4568d1238deb238897f97"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"richardelling"}}