{"action":"created","comment":{"url":"https://api.github.com/repos/mesonbuild/meson/pulls/comments/111673447","pull_request_review_id":32934651,"id":111673447,"diff_hunk":"@@ -0,0 +1,382 @@\n+# Copyright 2013-2017 The Meson development team\n+\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+\n+#     http://www.apache.org/licenses/LICENSE-2.0\n+\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+\n+# This file contains the detection logic for miscellaneous external dependencies.\n+\n+import glob\n+import os\n+import stat\n+import sysconfig\n+\n+from .. import mlog\n+from .. import mesonlib\n+from ..environment import detect_cpu_family\n+\n+from ._base import Dependency, DependencyException, DependencyMethods, PkgConfigDependency\n+\n+\n+class BoostDependency(Dependency):\n+    # Some boost libraries have different names for\n+    # their sources and libraries. This dict maps\n+    # between the two.\n+    name2lib = {'test': 'unit_test_framework'}\n+\n+    def __init__(self, environment, kwargs):\n+        Dependency.__init__(self, 'boost', kwargs)\n+        self.name = 'boost'\n+        self.environment = environment\n+        self.libdir = ''\n+        if 'native' in kwargs and environment.is_cross_build():\n+            self.want_cross = not kwargs['native']\n+        else:\n+            self.want_cross = environment.is_cross_build()\n+        try:\n+            self.boost_root = os.environ['BOOST_ROOT']\n+            if not os.path.isabs(self.boost_root):\n+                raise DependencyException('BOOST_ROOT must be an absolute path.')\n+        except KeyError:\n+            self.boost_root = None\n+        if self.boost_root is None:\n+            if self.want_cross:\n+                if 'BOOST_INCLUDEDIR' in os.environ:\n+                    self.incdir = os.environ['BOOST_INCLUDEDIR']\n+                else:\n+                    raise DependencyException('BOOST_ROOT or BOOST_INCLUDEDIR is needed while cross-compiling')\n+            if mesonlib.is_windows():\n+                self.boost_root = self.detect_win_root()\n+                self.incdir = self.boost_root\n+            else:\n+                if 'BOOST_INCLUDEDIR' in os.environ:\n+                    self.incdir = os.environ['BOOST_INCLUDEDIR']\n+                else:\n+                    self.incdir = '/usr/include'\n+        else:\n+            self.incdir = os.path.join(self.boost_root, 'include')\n+        self.boost_inc_subdir = os.path.join(self.incdir, 'boost')\n+        mlog.debug('Boost library root dir is', self.boost_root)\n+        self.src_modules = {}\n+        self.lib_modules = {}\n+        self.lib_modules_mt = {}\n+        self.detect_version()\n+        self.requested_modules = self.get_requested(kwargs)\n+        module_str = ', '.join(self.requested_modules)\n+        if self.version is not None:\n+            self.detect_src_modules()\n+            self.detect_lib_modules()\n+            self.validate_requested()\n+            if self.boost_root is not None:\n+                info = self.version + ', ' + self.boost_root\n+            else:\n+                info = self.version\n+            mlog.log('Dependency Boost (%s) found:' % module_str, mlog.green('YES'), info)\n+        else:\n+            mlog.log(\"Dependency Boost (%s) found:\" % module_str, mlog.red('NO'))\n+        if 'cpp' not in self.environment.coredata.compilers:\n+            raise DependencyException('Tried to use Boost but a C++ compiler is not defined.')\n+        self.cpp_compiler = self.environment.coredata.compilers['cpp']\n+\n+    def detect_win_root(self):\n+        globtext = 'c:\\\\local\\\\boost_*'\n+        files = glob.glob(globtext)\n+        if len(files) > 0:\n+            return files[0]\n+        return 'C:\\\\'\n+\n+    def get_compile_args(self):\n+        args = []\n+        include_dir = ''\n+        if self.boost_root is not None:\n+            if mesonlib.is_windows():\n+                include_dir = self.boost_root\n+            else:\n+                include_dir = os.path.join(self.boost_root, 'include')\n+        else:\n+            include_dir = self.incdir\n+\n+        # Use \"-isystem\" when including boost headers instead of \"-I\"\n+        # to avoid compiler warnings/failures when \"-Werror\" is used\n+\n+        # Careful not to use \"-isystem\" on default include dirs as it\n+        # breaks some of the headers for certain gcc versions\n+\n+        # For example, doing g++ -isystem /usr/include on a simple\n+        # \"int main()\" source results in the error:\n+        # \"/usr/include/c++/6.3.1/cstdlib:75:25: fatal error: stdlib.h: No such file or directory\"\n+\n+        # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70129\n+        # and http://stackoverflow.com/questions/37218953/isystem-on-a-system-include-directory-causes-errors\n+        # for more details\n+\n+        # TODO: The correct solution would probably be to ask the\n+        # compiler for it's default include paths (ie: \"gcc -xc++ -E\n+        # -v -\") and avoid including those with -isystem\n+\n+        # For now, use -isystem for all includes except for some\n+        # typical defaults (which don't need to be included at all\n+        # since they are in the default include paths)\n+        if include_dir != '/usr/include' and include_dir != '/usr/local/include':\n+            args.append(\"\".join(self.cpp_compiler.get_include_args(include_dir, True)))\n+        return args\n+\n+    def get_requested(self, kwargs):\n+        candidates = kwargs.get('modules', [])\n+        if isinstance(candidates, str):\n+            return [candidates]\n+        for c in candidates:\n+            if not isinstance(c, str):\n+                raise DependencyException('Boost module argument is not a string.')\n+        return candidates\n+\n+    def validate_requested(self):\n+        for m in self.requested_modules:\n+            if m not in self.src_modules:\n+                raise DependencyException('Requested Boost module \"%s\" not found.' % m)\n+\n+    def found(self):\n+        return self.version is not None\n+\n+    def get_version(self):\n+        return self.version\n+\n+    def detect_version(self):\n+        try:\n+            ifile = open(os.path.join(self.boost_inc_subdir, 'version.hpp'))\n+        except FileNotFoundError:\n+            self.version = None\n+            return\n+        with ifile:\n+            for line in ifile:\n+                if line.startswith(\"#define\") and 'BOOST_LIB_VERSION' in line:\n+                    ver = line.split()[-1]\n+                    ver = ver[1:-1]\n+                    self.version = ver.replace('_', '.')\n+                    return\n+        self.version = None\n+\n+    def detect_src_modules(self):\n+        for entry in os.listdir(self.boost_inc_subdir):\n+            entry = os.path.join(self.boost_inc_subdir, entry)\n+            if stat.S_ISDIR(os.stat(entry).st_mode):\n+                self.src_modules[os.path.split(entry)[-1]] = True\n+\n+    def detect_lib_modules(self):\n+        if mesonlib.is_windows():\n+            return self.detect_lib_modules_win()\n+        return self.detect_lib_modules_nix()\n+\n+    def detect_lib_modules_win(self):\n+        arch = detect_cpu_family(self.environment.coredata.compilers)\n+        # Guess the libdir\n+        if arch == 'x86':\n+            gl = 'lib32*'\n+        elif arch == 'x86_64':\n+            gl = 'lib64*'\n+        else:\n+            # Does anyone do Boost cross-compiling to other archs on Windows?\n+            gl = None\n+        # See if the libdir is valid\n+        if gl:\n+            libdir = glob.glob(os.path.join(self.boost_root, gl))\n+        else:\n+            libdir = []\n+        # Can't find libdir, bail\n+        if len(libdir) == 0:\n+            return\n+        libdir = libdir[0]\n+        self.libdir = libdir\n+        globber = 'boost_*-gd-*.lib' # FIXME\n+        for entry in glob.glob(os.path.join(libdir, globber)):\n+            (_, fname) = os.path.split(entry)\n+            base = fname.split('_', 1)[1]\n+            modname = base.split('-', 1)[0]\n+            self.lib_modules_mt[modname] = fname\n+\n+    def detect_lib_modules_nix(self):\n+        if mesonlib.is_osx():\n+            libsuffix = 'dylib'\n+        else:\n+            libsuffix = 'so'\n+\n+        globber = 'libboost_*.{}'.format(libsuffix)\n+        if 'BOOST_LIBRARYDIR' in os.environ:\n+            libdirs = [os.environ['BOOST_LIBRARYDIR']]\n+        elif self.boost_root is None:\n+            libdirs = mesonlib.get_library_dirs()\n+        else:\n+            libdirs = [os.path.join(self.boost_root, 'lib')]\n+        for libdir in libdirs:\n+            for entry in glob.glob(os.path.join(libdir, globber)):\n+                lib = os.path.basename(entry)\n+                name = lib.split('.')[0].split('_', 1)[-1]\n+                # I'm not 100% sure what to do here. Some distros\n+                # have modules such as thread only as -mt versions.\n+                if entry.endswith('-mt.so'):\n+                    self.lib_modules_mt[name] = True\n+                else:\n+                    self.lib_modules[name] = True\n+\n+    def get_win_link_args(self):\n+        args = []\n+        if self.boost_root:\n+            args.append('-L' + self.libdir)\n+        for module in self.requested_modules:\n+            module = BoostDependency.name2lib.get(module, module)\n+            if module in self.lib_modules_mt:\n+                args.append(self.lib_modules_mt[module])\n+        return args\n+\n+    def get_link_args(self):\n+        if mesonlib.is_windows():\n+            return self.get_win_link_args()\n+        args = []\n+        if self.boost_root:\n+            args.append('-L' + os.path.join(self.boost_root, 'lib'))\n+        elif 'BOOST_LIBRARYDIR' in os.environ:\n+            args.append('-L' + os.environ['BOOST_LIBRARYDIR'])\n+        for module in self.requested_modules:\n+            module = BoostDependency.name2lib.get(module, module)\n+            libname = 'boost_' + module\n+            # The compiler's library detector is the most reliable so use that first.\n+            default_detect = self.cpp_compiler.find_library(libname, self.environment, [])\n+            if default_detect is not None:\n+                if module == 'unit_testing_framework':\n+                    emon_args = self.cpp_compiler.find_library('boost_test_exec_monitor')\n+                else:\n+                    emon_args = None\n+                args += default_detect\n+                if emon_args is not None:\n+                    args += emon_args\n+            elif module in self.lib_modules or module in self.lib_modules_mt:\n+                linkcmd = '-l' + libname\n+                args.append(linkcmd)\n+                # FIXME a hack, but Boost's testing framework has a lot of\n+                # different options and it's hard to determine what to do\n+                # without feedback from actual users. Update this\n+                # as we get more bug reports.\n+                if module == 'unit_testing_framework':\n+                    args.append('-lboost_test_exec_monitor')\n+            elif module + '-mt' in self.lib_modules_mt:\n+                linkcmd = '-lboost_' + module + '-mt'\n+                args.append(linkcmd)\n+                if module == 'unit_testing_framework':\n+                    args.append('-lboost_test_exec_monitor-mt')\n+        return args\n+\n+    def get_sources(self):\n+        return []\n+\n+    def need_threads(self):\n+        return 'thread' in self.requested_modules\n+\n+\n+class ThreadDependency(Dependency):\n+    def __init__(self, environment, kwargs):\n+        super().__init__('threads', {})\n+        self.name = 'threads'\n+        self.is_found = True\n+        mlog.log('Dependency', mlog.bold(self.name), 'found:', mlog.green('YES'))\n+\n+    def need_threads(self):\n+        return True\n+\n+    def get_version(self):\n+        return 'unknown'\n+\n+\n+class Python3Dependency(Dependency):\n+    def __init__(self, environment, kwargs):\n+        super().__init__('python3', kwargs)\n+        self.name = 'python3'\n+        self.is_found = False\n+        # We can only be sure that it is Python 3 at this point\n+        self.version = '3'\n+        if DependencyMethods.PKGCONFIG in self.methods:\n+            try:\n+                pkgdep = PkgConfigDependency('python3', environment, kwargs)\n+                if pkgdep.found():\n+                    self.cargs = pkgdep.cargs\n+                    self.libs = pkgdep.libs\n+                    self.version = pkgdep.get_version()\n+                    self.is_found = True\n+                    return\n+            except Exception:\n+                pass\n+        if not self.is_found:\n+            if mesonlib.is_windows() and DependencyMethods.SYSCONFIG in self.methods:\n+                self._find_libpy3_windows(environment)\n+            elif mesonlib.is_osx() and DependencyMethods.EXTRAFRAMEWORK in self.methods:\n+                # In OSX the Python 3 framework does not have a version\n+                # number in its name.\n+                fw = ExtraFrameworkDependency('python', False, None, kwargs)","path":"mesonbuild/dependencies/_misc.py","position":321,"original_position":321,"commit_id":"10d8a17f0b8b2c762d7e5e86bd97fb4e365aa737","original_commit_id":"10d8a17f0b8b2c762d7e5e86bd97fb4e365aa737","user":{"login":"ignatenkobrain","id":2866862,"avatar_url":"https://avatars2.githubusercontent.com/u/2866862?v=3","gravatar_id":"","url":"https://api.github.com/users/ignatenkobrain","html_url":"https://github.com/ignatenkobrain","followers_url":"https://api.github.com/users/ignatenkobrain/followers","following_url":"https://api.github.com/users/ignatenkobrain/following{/other_user}","gists_url":"https://api.github.com/users/ignatenkobrain/gists{/gist_id}","starred_url":"https://api.github.com/users/ignatenkobrain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ignatenkobrain/subscriptions","organizations_url":"https://api.github.com/users/ignatenkobrain/orgs","repos_url":"https://api.github.com/users/ignatenkobrain/repos","events_url":"https://api.github.com/users/ignatenkobrain/events{/privacy}","received_events_url":"https://api.github.com/users/ignatenkobrain/received_events","type":"User","site_admin":false},"body":"__[flake8]__\n* [F821] undefined name 'ExtraFrameworkDependency'\n\n<!-- Comment by [SideCI](https://sideci.com) -->","created_at":"2017-04-15T21:23:39Z","updated_at":"2017-04-15T21:23:39Z","html_url":"https://github.com/mesonbuild/meson/pull/1631#discussion_r111673447","pull_request_url":"https://api.github.com/repos/mesonbuild/meson/pulls/1631","_links":{"self":{"href":"https://api.github.com/repos/mesonbuild/meson/pulls/comments/111673447"},"html":{"href":"https://github.com/mesonbuild/meson/pull/1631#discussion_r111673447"},"pull_request":{"href":"https://api.github.com/repos/mesonbuild/meson/pulls/1631"}}},"pull_request":{"url":"https://api.github.com/repos/mesonbuild/meson/pulls/1631","id":116039477,"html_url":"https://github.com/mesonbuild/meson/pull/1631","diff_url":"https://github.com/mesonbuild/meson/pull/1631.diff","patch_url":"https://github.com/mesonbuild/meson/pull/1631.patch","issue_url":"https://api.github.com/repos/mesonbuild/meson/issues/1631","number":1631,"state":"open","locked":false,"title":"Split dependencies.py into separate files","user":{"login":"QuLogic","id":302469,"avatar_url":"https://avatars1.githubusercontent.com/u/302469?v=3","gravatar_id":"","url":"https://api.github.com/users/QuLogic","html_url":"https://github.com/QuLogic","followers_url":"https://api.github.com/users/QuLogic/followers","following_url":"https://api.github.com/users/QuLogic/following{/other_user}","gists_url":"https://api.github.com/users/QuLogic/gists{/gist_id}","starred_url":"https://api.github.com/users/QuLogic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/QuLogic/subscriptions","organizations_url":"https://api.github.com/users/QuLogic/orgs","repos_url":"https://api.github.com/users/QuLogic/repos","events_url":"https://api.github.com/users/QuLogic/events{/privacy}","received_events_url":"https://api.github.com/users/QuLogic/received_events","type":"User","site_admin":false},"body":"it's starting to get a bit unwieldy and there's even a comment reminding us that it needs to be done.\r\n\r\nCurrent layout is as follows:\r\n* `_base`: All the basic stuff, `Dependency`, `InternalDependency`, `PkgConfigDependency`, etc.\r\n* `_dev`: Development related deps: `GMockDependency`, `GTestDependency`, `ValgrindDependency`\r\n* `_misc`: Miscellaneous deps: `BoostDependency`, `Python3Dependency`, `ThreadDependency`\r\n* `_platform`: Platform-specific deps: `AppleFrameworks`\r\n* `_ui`: UI-related deps: `GLDependency`, `GnuStepDependency`, `Qt4Dependency`, `Qt5Dependency`, `SDL2Dependency`, `WxDependency`\r\n\r\nSuggestions welcome (especially with misc.)\r\n","created_at":"2017-04-15T21:23:33Z","updated_at":"2017-04-15T21:23:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"65f5ddb6bb8ed5e4a5a11fa8f08956adac7f2d4a","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/mesonbuild/meson/pulls/1631/commits","review_comments_url":"https://api.github.com/repos/mesonbuild/meson/pulls/1631/comments","review_comment_url":"https://api.github.com/repos/mesonbuild/meson/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mesonbuild/meson/issues/1631/comments","statuses_url":"https://api.github.com/repos/mesonbuild/meson/statuses/10d8a17f0b8b2c762d7e5e86bd97fb4e365aa737","head":{"label":"QuLogic:split-dependencies","ref":"split-dependencies","sha":"10d8a17f0b8b2c762d7e5e86bd97fb4e365aa737","user":{"login":"QuLogic","id":302469,"avatar_url":"https://avatars1.githubusercontent.com/u/302469?v=3","gravatar_id":"","url":"https://api.github.com/users/QuLogic","html_url":"https://github.com/QuLogic","followers_url":"https://api.github.com/users/QuLogic/followers","following_url":"https://api.github.com/users/QuLogic/following{/other_user}","gists_url":"https://api.github.com/users/QuLogic/gists{/gist_id}","starred_url":"https://api.github.com/users/QuLogic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/QuLogic/subscriptions","organizations_url":"https://api.github.com/users/QuLogic/orgs","repos_url":"https://api.github.com/users/QuLogic/repos","events_url":"https://api.github.com/users/QuLogic/events{/privacy}","received_events_url":"https://api.github.com/users/QuLogic/received_events","type":"User","site_admin":false},"repo":{"id":66429687,"name":"meson","full_name":"QuLogic/meson","owner":{"login":"QuLogic","id":302469,"avatar_url":"https://avatars1.githubusercontent.com/u/302469?v=3","gravatar_id":"","url":"https://api.github.com/users/QuLogic","html_url":"https://github.com/QuLogic","followers_url":"https://api.github.com/users/QuLogic/followers","following_url":"https://api.github.com/users/QuLogic/following{/other_user}","gists_url":"https://api.github.com/users/QuLogic/gists{/gist_id}","starred_url":"https://api.github.com/users/QuLogic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/QuLogic/subscriptions","organizations_url":"https://api.github.com/users/QuLogic/orgs","repos_url":"https://api.github.com/users/QuLogic/repos","events_url":"https://api.github.com/users/QuLogic/events{/privacy}","received_events_url":"https://api.github.com/users/QuLogic/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/QuLogic/meson","description":"The Meson Build System","fork":true,"url":"https://api.github.com/repos/QuLogic/meson","forks_url":"https://api.github.com/repos/QuLogic/meson/forks","keys_url":"https://api.github.com/repos/QuLogic/meson/keys{/key_id}","collaborators_url":"https://api.github.com/repos/QuLogic/meson/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/QuLogic/meson/teams","hooks_url":"https://api.github.com/repos/QuLogic/meson/hooks","issue_events_url":"https://api.github.com/repos/QuLogic/meson/issues/events{/number}","events_url":"https://api.github.com/repos/QuLogic/meson/events","assignees_url":"https://api.github.com/repos/QuLogic/meson/assignees{/user}","branches_url":"https://api.github.com/repos/QuLogic/meson/branches{/branch}","tags_url":"https://api.github.com/repos/QuLogic/meson/tags","blobs_url":"https://api.github.com/repos/QuLogic/meson/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/QuLogic/meson/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/QuLogic/meson/git/refs{/sha}","trees_url":"https://api.github.com/repos/QuLogic/meson/git/trees{/sha}","statuses_url":"https://api.github.com/repos/QuLogic/meson/statuses/{sha}","languages_url":"https://api.github.com/repos/QuLogic/meson/languages","stargazers_url":"https://api.github.com/repos/QuLogic/meson/stargazers","contributors_url":"https://api.github.com/repos/QuLogic/meson/contributors","subscribers_url":"https://api.github.com/repos/QuLogic/meson/subscribers","subscription_url":"https://api.github.com/repos/QuLogic/meson/subscription","commits_url":"https://api.github.com/repos/QuLogic/meson/commits{/sha}","git_commits_url":"https://api.github.com/repos/QuLogic/meson/git/commits{/sha}","comments_url":"https://api.github.com/repos/QuLogic/meson/comments{/number}","issue_comment_url":"https://api.github.com/repos/QuLogic/meson/issues/comments{/number}","contents_url":"https://api.github.com/repos/QuLogic/meson/contents/{+path}","compare_url":"https://api.github.com/repos/QuLogic/meson/compare/{base}...{head}","merges_url":"https://api.github.com/repos/QuLogic/meson/merges","archive_url":"https://api.github.com/repos/QuLogic/meson/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/QuLogic/meson/downloads","issues_url":"https://api.github.com/repos/QuLogic/meson/issues{/number}","pulls_url":"https://api.github.com/repos/QuLogic/meson/pulls{/number}","milestones_url":"https://api.github.com/repos/QuLogic/meson/milestones{/number}","notifications_url":"https://api.github.com/repos/QuLogic/meson/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/QuLogic/meson/labels{/name}","releases_url":"https://api.github.com/repos/QuLogic/meson/releases{/id}","deployments_url":"https://api.github.com/repos/QuLogic/meson/deployments","created_at":"2016-08-24T04:27:17Z","updated_at":"2016-08-24T04:27:19Z","pushed_at":"2017-04-15T21:18:22Z","git_url":"git://github.com/QuLogic/meson.git","ssh_url":"git@github.com:QuLogic/meson.git","clone_url":"https://github.com/QuLogic/meson.git","svn_url":"https://github.com/QuLogic/meson","homepage":null,"size":6701,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"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":"mesonbuild:master","ref":"master","sha":"b0576e055aa60a32bcf38aac4526257a01d57b17","user":{"login":"mesonbuild","id":12551236,"avatar_url":"https://avatars3.githubusercontent.com/u/12551236?v=3","gravatar_id":"","url":"https://api.github.com/users/mesonbuild","html_url":"https://github.com/mesonbuild","followers_url":"https://api.github.com/users/mesonbuild/followers","following_url":"https://api.github.com/users/mesonbuild/following{/other_user}","gists_url":"https://api.github.com/users/mesonbuild/gists{/gist_id}","starred_url":"https://api.github.com/users/mesonbuild/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesonbuild/subscriptions","organizations_url":"https://api.github.com/users/mesonbuild/orgs","repos_url":"https://api.github.com/users/mesonbuild/repos","events_url":"https://api.github.com/users/mesonbuild/events{/privacy}","received_events_url":"https://api.github.com/users/mesonbuild/received_events","type":"Organization","site_admin":false},"repo":{"id":19784232,"name":"meson","full_name":"mesonbuild/meson","owner":{"login":"mesonbuild","id":12551236,"avatar_url":"https://avatars3.githubusercontent.com/u/12551236?v=3","gravatar_id":"","url":"https://api.github.com/users/mesonbuild","html_url":"https://github.com/mesonbuild","followers_url":"https://api.github.com/users/mesonbuild/followers","following_url":"https://api.github.com/users/mesonbuild/following{/other_user}","gists_url":"https://api.github.com/users/mesonbuild/gists{/gist_id}","starred_url":"https://api.github.com/users/mesonbuild/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesonbuild/subscriptions","organizations_url":"https://api.github.com/users/mesonbuild/orgs","repos_url":"https://api.github.com/users/mesonbuild/repos","events_url":"https://api.github.com/users/mesonbuild/events{/privacy}","received_events_url":"https://api.github.com/users/mesonbuild/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mesonbuild/meson","description":"The Meson Build System","fork":false,"url":"https://api.github.com/repos/mesonbuild/meson","forks_url":"https://api.github.com/repos/mesonbuild/meson/forks","keys_url":"https://api.github.com/repos/mesonbuild/meson/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mesonbuild/meson/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mesonbuild/meson/teams","hooks_url":"https://api.github.com/repos/mesonbuild/meson/hooks","issue_events_url":"https://api.github.com/repos/mesonbuild/meson/issues/events{/number}","events_url":"https://api.github.com/repos/mesonbuild/meson/events","assignees_url":"https://api.github.com/repos/mesonbuild/meson/assignees{/user}","branches_url":"https://api.github.com/repos/mesonbuild/meson/branches{/branch}","tags_url":"https://api.github.com/repos/mesonbuild/meson/tags","blobs_url":"https://api.github.com/repos/mesonbuild/meson/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mesonbuild/meson/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mesonbuild/meson/git/refs{/sha}","trees_url":"https://api.github.com/repos/mesonbuild/meson/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mesonbuild/meson/statuses/{sha}","languages_url":"https://api.github.com/repos/mesonbuild/meson/languages","stargazers_url":"https://api.github.com/repos/mesonbuild/meson/stargazers","contributors_url":"https://api.github.com/repos/mesonbuild/meson/contributors","subscribers_url":"https://api.github.com/repos/mesonbuild/meson/subscribers","subscription_url":"https://api.github.com/repos/mesonbuild/meson/subscription","commits_url":"https://api.github.com/repos/mesonbuild/meson/commits{/sha}","git_commits_url":"https://api.github.com/repos/mesonbuild/meson/git/commits{/sha}","comments_url":"https://api.github.com/repos/mesonbuild/meson/comments{/number}","issue_comment_url":"https://api.github.com/repos/mesonbuild/meson/issues/comments{/number}","contents_url":"https://api.github.com/repos/mesonbuild/meson/contents/{+path}","compare_url":"https://api.github.com/repos/mesonbuild/meson/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mesonbuild/meson/merges","archive_url":"https://api.github.com/repos/mesonbuild/meson/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mesonbuild/meson/downloads","issues_url":"https://api.github.com/repos/mesonbuild/meson/issues{/number}","pulls_url":"https://api.github.com/repos/mesonbuild/meson/pulls{/number}","milestones_url":"https://api.github.com/repos/mesonbuild/meson/milestones{/number}","notifications_url":"https://api.github.com/repos/mesonbuild/meson/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mesonbuild/meson/labels{/name}","releases_url":"https://api.github.com/repos/mesonbuild/meson/releases{/id}","deployments_url":"https://api.github.com/repos/mesonbuild/meson/deployments","created_at":"2014-05-14T15:08:16Z","updated_at":"2017-04-15T00:13:26Z","pushed_at":"2017-04-15T21:23:33Z","git_url":"git://github.com/mesonbuild/meson.git","ssh_url":"git@github.com:mesonbuild/meson.git","clone_url":"https://github.com/mesonbuild/meson.git","svn_url":"https://github.com/mesonbuild/meson","homepage":null,"size":6996,"stargazers_count":737,"watchers_count":737,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":136,"mirror_url":null,"open_issues_count":224,"forks":136,"open_issues":224,"watchers":737,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mesonbuild/meson/pulls/1631"},"html":{"href":"https://github.com/mesonbuild/meson/pull/1631"},"issue":{"href":"https://api.github.com/repos/mesonbuild/meson/issues/1631"},"comments":{"href":"https://api.github.com/repos/mesonbuild/meson/issues/1631/comments"},"review_comments":{"href":"https://api.github.com/repos/mesonbuild/meson/pulls/1631/comments"},"review_comment":{"href":"https://api.github.com/repos/mesonbuild/meson/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mesonbuild/meson/pulls/1631/commits"},"statuses":{"href":"https://api.github.com/repos/mesonbuild/meson/statuses/10d8a17f0b8b2c762d7e5e86bd97fb4e365aa737"}}}}
{"actor":{"display_login":"ignatenkobrain"}}