{"action":"created","comment":{"url":"https://api.github.com/repos/nix-rust/nix/pulls/comments/127134572","pull_request_review_id":49686017,"id":127134572,"diff_hunk":"@@ -24,79 +22,119 @@\n //!   to the CDROM device.\n //! * Do whatever else the device driver creator thought made most sense.\n //!\n-//! `ioctl`s are synchronous system calls and are similar to read and\n-//! write calls in that regard.\n+//! `ioctl`s are synchronous system calls and are similar to read and write calls in that regard.\n+//! They operate on file descriptors and have an identifier that specifies what the ioctl is.\n+//! Additionally they may read or write data and therefore need to pass along a data pointer.\n+//! Besides the semantics of the ioctls being confusing, the generation of this identifer can also\n+//! be difficult.\n //!\n-//! What does this module support?\n-//! ===============================\n+//! Historically `ioctl` numbers were arbitrary hard-coded values. This changed to a more-ordered\n+//! system where the ioctl numbers had various subcomponents:\n+//!   * Number: The actual ioctl ID\n+//!   * Type: A grouping of ioctls for a common purpose or driver\n+//!   * Size: The size in bytes of the data that will be transferred\n+//!   * Direction: Whether there is any data and if it's read, write, or both\n+//!\n+//! Newer drivers should not generate complete integer identifiers for their `ioctl`s instead\n+//! preferring to use the 4 components above to generate the final ioctl identifier. Because of\n+//! how old `ioctl`s are, however, there are many hard-coded `ioctl` identifiers. These are\n+//! commonly referred to as \"bad\" in `ioctl` documentation.\n+//!\n+//! Defining ioctls\n+//! ===============\n+//!\n+//! This library provides the `ioctl!` macro, for binding `ioctl`s. This macro generates unsafe\n+//! functions that can then be used for calling the ioctl. This macro has a few different ways it\n+//! can be used depending on the specific ioctl you're working with.\n //!\n-//! This library provides the `ioctl!` macro, for binding `ioctl`s.\n-//! Here's a few examples of how that can work for SPI under Linux\n-//! from [rust-spidev](https://github.com/posborne/rust-spidev).\n+//! A simple `ioctl` is `SPI_IOC_RD_MODE`. This ioctl works with the SPI interface on Linux. This\n+//! specific `ioctl` reads the mode of the SPI mode (one of 4 values, so 2 bits each) as a `u8`.\n+//! It's declared in `/include/uapi/linux/spi/spidev.h` as `_IOR(SPI_IOC_MAGIC, 1, __u8)`. We can\n+//! therefore generate a function to call this `ioctl` using the `ioctl!` macro in nix like:\n //!\n //! ```\n-//! #[allow(non_camel_case_types)]\n-//! pub struct spi_ioc_transfer {\n-//!     pub tx_buf: u64,\n-//!     pub rx_buf: u64,\n-//!     pub len: u32,\n-//!\n-//!     // optional overrides\n-//!     pub speed_hz: u32,\n-//!     pub delay_usecs: u16,\n-//!     pub bits_per_word: u8,\n-//!     pub cs_change: u8,\n-//!     pub pad: u32,\n-//! }\n+//! # #[macro_use] extern crate nix;\n+//! # const SPI_IOC_MAGIC: nix::libc::c_int = 'k' as nix::libc::c_int;\n+//! ioctl!(read spi_read_mode with SPI_IOC_MAGIC, 1; u8);\n+//! # fn main() {}\n+//! ```\n //!\n-//! #[cfg(linux)]\n-//! mod ioctl {\n-//!     use super::*;\n-//!\n-//!     const SPI_IOC_MAGIC: u8 = 'k' as u8;\n-//!     const SPI_IOC_NR_TRANSFER: u8 = 0;\n-//!     const SPI_IOC_NR_MODE: u8 = 1;\n-//!     const SPI_IOC_NR_LSB_FIRST: u8 = 2;\n-//!     const SPI_IOC_NR_BITS_PER_WORD: u8 = 3;\n-//!     const SPI_IOC_NR_MAX_SPEED_HZ: u8 = 4;\n-//!     const SPI_IOC_NR_MODE32: u8 = 5;\n-//!\n-//!     ioctl!(read  get_mode_u8 with SPI_IOC_MAGIC, SPI_IOC_NR_MODE; u8);\n-//!     ioctl!(read  get_mode_u32 with SPI_IOC_MAGIC, SPI_IOC_NR_MODE; u32);\n-//!     ioctl!(write set_mode_u8 with SPI_IOC_MAGIC, SPI_IOC_NR_MODE; u8);\n-//!     ioctl!(write set_mode_u32 with SPI_IOC_MAGIC, SPI_IOC_NR_MODE32; u32);\n-//!     ioctl!(read  get_lsb_first with SPI_IOC_MAGIC, SPI_IOC_NR_LSB_FIRST; u8);\n-//!     ioctl!(write set_lsb_first with SPI_IOC_MAGIC, SPI_IOC_NR_LSB_FIRST; u8);\n-//!     ioctl!(read  get_bits_per_word with SPI_IOC_MAGIC, SPI_IOC_NR_BITS_PER_WORD; u8);\n-//!     ioctl!(write set_bits_per_word with SPI_IOC_MAGIC, SPI_IOC_NR_BITS_PER_WORD; u8);\n-//!     ioctl!(read  get_max_speed_hz with SPI_IOC_MAGIC, SPI_IOC_NR_MAX_SPEED_HZ; u32);\n-//!     ioctl!(write set_max_speed_hz with SPI_IOC_MAGIC, SPI_IOC_NR_MAX_SPEED_HZ; u32);\n-//!     ioctl!(write spidev_transfer with SPI_IOC_MAGIC, SPI_IOC_NR_TRANSFER; spi_ioc_transfer);\n-//!     ioctl!(write buf spidev_transfer_buf with SPI_IOC_MAGIC, SPI_IOC_NR_TRANSFER; spi_ioc_transfer);\n+//! This generates a function like:\n+//!\n+//! ```\n+//! # #[macro_use] extern crate nix;\n+//! # use nix::libc::c_int as c_int;\n+//! # use nix::libc::c_ulong as c_ulong;\n+//! # use std::mem;\n+//! # use nix::{Errno, libc, Result};\n+//! # const SPI_IOC_MAGIC: u8 = 'k' as u8;\n+//! pub unsafe fn spi_read_mode(fd: c_int, val: *mut u8) -> Result<c_int> {\n+//!     let res = libc::ioctl(fd, ior!(SPI_IOC_MAGIC, 1, mem::size_of::<u8>()), val);\n+//!     Errno::result(res)\n //! }\n+//! # fn main() {}\n+//! ```\n+//!\n+//! The return value for `ioctl` functions generated by the `ioctl!` macro are assumed to return -1\n+//! on error and everything else is a valid return value. If the return value needs to be changed,\n+//! you can use `Result::map` on the return value in a helper function.\n+//!\n+//! There are equivalent forms for `write`, `none` (no data in or out), and `readwrite`. The mode\n+//! for a given `ioctl` should be clear from the documentation if it has good documentation.\n+//! Otherwise it will be clear based on the macro used to generate the `ioctl` number where\n+//! `_IOC`, _IOR`, `_IOW`, and `_IORW` map to \"none\", \"read\", \"write\", and \"readwrite\"\n+//! respectively.\n+//!\n+//! Some `ioctl`s can operate on arrays of objects, so there are `read buf`, `write buf`, and\n+//! `readwrite buf` forms as well. These generate functions that include a `len` argument to\n+//! specify the length of the array:\n+//!\n+//! ```text\n+//! pub unsafe fn $NAME(fd: c_int, val: *mut u8, len: usize) -> Result<c_int>;\n+//! ```\n+//!\n+//! As mentioned earlier, there are many old `ioctl`s that do not use the newer method of\n+//! generating `ioctl` numbers and instead use hardcoded values. These can be used with the `bad`\n+//! form of the `ioctl!` macro (there is no data transfer direction used with `bad`). The naming of\n+//! this comes from the Linux kernel which refers to these `ioctl`s as \"bad\".\n+//!\n+//! For example the `TCGETS` `ioctl` reads a `termios` data structure for a given file descriptor.\n+//! It can be implemented as:\n //!\n-//! // doctest workaround\n-//! fn main() {}\n //! ```\n+//! # #[macro_use] extern crate nix;\n+//! # #[cfg(any(target_os = \"android\", target_os = \"linux\"))]\n+//! # use nix::libc::TCGETS as TCGETS;\n+//! # #[cfg(any(target_os = \"android\", target_os = \"linux\"))]\n+//! ioctl!(bad tcgets with TCGETS);\n+//! # fn main() {}\n+//! ```\n+//!\n+//! The generated function has the same form as that generated by `read`:\n //!\n-//! Spidev uses the `_IOC` macros that are encouraged (as far as\n-//! `ioctl` can be encouraged at all) for newer drivers.  Many\n-//! drivers, however, just use magic numbers with no attached\n-//! semantics.  For those, the `ioctl!(bad ...)` variant should be\n-//! used (the \"bad\" terminology is from the Linux kernel).\n+//! ```text\n+//! pub unsafe fn tcgets(fd: c_int, val: *mut u8) -> Result<c_int>;\n+//! ```\n+//!\n+//! There is also a `bad none` form for use with hard-coded `ioctl`s that do not transfer data.\n+//! The `TIOCEXCL` `ioctl` that's part of the termios API can be implemented as:\n+//!\n+//! ```\n+//! # #[macro_use] extern crate nix;\n+//! # use nix::libc::TIOCEXCL as TIOCEXCL;\n+//! ioctl!(bad none tiocexcl with TIOCEXCL);\n+//! # fn main() {}\n+//! ```\n+//!\n+//! More examples on using `ioctl!` can be found in the [rust-spidev crate](https://github.com/posborne/rust-spidev).","path":"src/sys/ioctl/mod.rs","position":167,"original_position":167,"commit_id":"ae0b5e9d12bfc98b7064df5b650834b79b0070dc","original_commit_id":"ae0b5e9d12bfc98b7064df5b650834b79b0070dc","user":{"login":"posborne","id":41714,"avatar_url":"https://avatars0.githubusercontent.com/u/41714?v=3","gravatar_id":"","url":"https://api.github.com/users/posborne","html_url":"https://github.com/posborne","followers_url":"https://api.github.com/users/posborne/followers","following_url":"https://api.github.com/users/posborne/following{/other_user}","gists_url":"https://api.github.com/users/posborne/gists{/gist_id}","starred_url":"https://api.github.com/users/posborne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/posborne/subscriptions","organizations_url":"https://api.github.com/users/posborne/orgs","repos_url":"https://api.github.com/users/posborne/repos","events_url":"https://api.github.com/users/posborne/events{/privacy}","received_events_url":"https://api.github.com/users/posborne/received_events","type":"User","site_admin":false},"body":"Minor, this has moved over to https://github.com/rust-embedded/rust-spidev","created_at":"2017-07-13T06:05:01Z","updated_at":"2017-07-13T06:05:01Z","html_url":"https://github.com/nix-rust/nix/pull/670#discussion_r127134572","pull_request_url":"https://api.github.com/repos/nix-rust/nix/pulls/670","_links":{"self":{"href":"https://api.github.com/repos/nix-rust/nix/pulls/comments/127134572"},"html":{"href":"https://github.com/nix-rust/nix/pull/670#discussion_r127134572"},"pull_request":{"href":"https://api.github.com/repos/nix-rust/nix/pulls/670"}}},"pull_request":{"url":"https://api.github.com/repos/nix-rust/nix/pulls/670","id":129981682,"html_url":"https://github.com/nix-rust/nix/pull/670","diff_url":"https://github.com/nix-rust/nix/pull/670.diff","patch_url":"https://github.com/nix-rust/nix/pull/670.patch","issue_url":"https://api.github.com/repos/nix-rust/nix/issues/670","number":670,"state":"open","locked":false,"title":"Improve ioctl docs","user":{"login":"Susurrus","id":206363,"avatar_url":"https://avatars2.githubusercontent.com/u/206363?v=3","gravatar_id":"","url":"https://api.github.com/users/Susurrus","html_url":"https://github.com/Susurrus","followers_url":"https://api.github.com/users/Susurrus/followers","following_url":"https://api.github.com/users/Susurrus/following{/other_user}","gists_url":"https://api.github.com/users/Susurrus/gists{/gist_id}","starred_url":"https://api.github.com/users/Susurrus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Susurrus/subscriptions","organizations_url":"https://api.github.com/users/Susurrus/orgs","repos_url":"https://api.github.com/users/Susurrus/repos","events_url":"https://api.github.com/users/Susurrus/events{/privacy}","received_events_url":"https://api.github.com/users/Susurrus/received_events","type":"User","site_admin":false},"body":"Integrates suggestions and comments made in #641. Basically we hid a lot of the internal workings of things and also revised the docs to make it more clear the exact API that `nix` is exposing.\r\n\r\nThere is a small amount of code cleanup I did in the macros. I also fixed the `bad` version of the `ioctl!` macro and also added a `bad none` version for use with no-data, hardcoded-number `ioctl`s.\r\n\r\nWould appreciate any and all feedback. Please especially fetch this code locally and generate the pretty docs for it (`cargo doc --no-deps --open`) so you can see what our users will see.\r\n\r\ncc @cmr @roblabla","created_at":"2017-07-11T19:00:17Z","updated_at":"2017-07-13T06:05:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fb525c9193bbe942beffab3056a2e2b13fa44534","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/nix-rust/nix/pulls/670/commits","review_comments_url":"https://api.github.com/repos/nix-rust/nix/pulls/670/comments","review_comment_url":"https://api.github.com/repos/nix-rust/nix/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nix-rust/nix/issues/670/comments","statuses_url":"https://api.github.com/repos/nix-rust/nix/statuses/ae0b5e9d12bfc98b7064df5b650834b79b0070dc","head":{"label":"Susurrus:ioctl_docs","ref":"ioctl_docs","sha":"ae0b5e9d12bfc98b7064df5b650834b79b0070dc","user":{"login":"Susurrus","id":206363,"avatar_url":"https://avatars2.githubusercontent.com/u/206363?v=3","gravatar_id":"","url":"https://api.github.com/users/Susurrus","html_url":"https://github.com/Susurrus","followers_url":"https://api.github.com/users/Susurrus/followers","following_url":"https://api.github.com/users/Susurrus/following{/other_user}","gists_url":"https://api.github.com/users/Susurrus/gists{/gist_id}","starred_url":"https://api.github.com/users/Susurrus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Susurrus/subscriptions","organizations_url":"https://api.github.com/users/Susurrus/orgs","repos_url":"https://api.github.com/users/Susurrus/repos","events_url":"https://api.github.com/users/Susurrus/events{/privacy}","received_events_url":"https://api.github.com/users/Susurrus/received_events","type":"User","site_admin":false},"repo":{"id":82981290,"name":"nix","full_name":"Susurrus/nix","owner":{"login":"Susurrus","id":206363,"avatar_url":"https://avatars2.githubusercontent.com/u/206363?v=3","gravatar_id":"","url":"https://api.github.com/users/Susurrus","html_url":"https://github.com/Susurrus","followers_url":"https://api.github.com/users/Susurrus/followers","following_url":"https://api.github.com/users/Susurrus/following{/other_user}","gists_url":"https://api.github.com/users/Susurrus/gists{/gist_id}","starred_url":"https://api.github.com/users/Susurrus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Susurrus/subscriptions","organizations_url":"https://api.github.com/users/Susurrus/orgs","repos_url":"https://api.github.com/users/Susurrus/repos","events_url":"https://api.github.com/users/Susurrus/events{/privacy}","received_events_url":"https://api.github.com/users/Susurrus/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Susurrus/nix","description":"Rust friendly bindings to *nix APIs","fork":true,"url":"https://api.github.com/repos/Susurrus/nix","forks_url":"https://api.github.com/repos/Susurrus/nix/forks","keys_url":"https://api.github.com/repos/Susurrus/nix/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Susurrus/nix/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Susurrus/nix/teams","hooks_url":"https://api.github.com/repos/Susurrus/nix/hooks","issue_events_url":"https://api.github.com/repos/Susurrus/nix/issues/events{/number}","events_url":"https://api.github.com/repos/Susurrus/nix/events","assignees_url":"https://api.github.com/repos/Susurrus/nix/assignees{/user}","branches_url":"https://api.github.com/repos/Susurrus/nix/branches{/branch}","tags_url":"https://api.github.com/repos/Susurrus/nix/tags","blobs_url":"https://api.github.com/repos/Susurrus/nix/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Susurrus/nix/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Susurrus/nix/git/refs{/sha}","trees_url":"https://api.github.com/repos/Susurrus/nix/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Susurrus/nix/statuses/{sha}","languages_url":"https://api.github.com/repos/Susurrus/nix/languages","stargazers_url":"https://api.github.com/repos/Susurrus/nix/stargazers","contributors_url":"https://api.github.com/repos/Susurrus/nix/contributors","subscribers_url":"https://api.github.com/repos/Susurrus/nix/subscribers","subscription_url":"https://api.github.com/repos/Susurrus/nix/subscription","commits_url":"https://api.github.com/repos/Susurrus/nix/commits{/sha}","git_commits_url":"https://api.github.com/repos/Susurrus/nix/git/commits{/sha}","comments_url":"https://api.github.com/repos/Susurrus/nix/comments{/number}","issue_comment_url":"https://api.github.com/repos/Susurrus/nix/issues/comments{/number}","contents_url":"https://api.github.com/repos/Susurrus/nix/contents/{+path}","compare_url":"https://api.github.com/repos/Susurrus/nix/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Susurrus/nix/merges","archive_url":"https://api.github.com/repos/Susurrus/nix/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Susurrus/nix/downloads","issues_url":"https://api.github.com/repos/Susurrus/nix/issues{/number}","pulls_url":"https://api.github.com/repos/Susurrus/nix/pulls{/number}","milestones_url":"https://api.github.com/repos/Susurrus/nix/milestones{/number}","notifications_url":"https://api.github.com/repos/Susurrus/nix/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Susurrus/nix/labels{/name}","releases_url":"https://api.github.com/repos/Susurrus/nix/releases{/id}","deployments_url":"https://api.github.com/repos/Susurrus/nix/deployments","created_at":"2017-02-23T23:26:26Z","updated_at":"2017-02-23T23:26:28Z","pushed_at":"2017-07-12T05:48:21Z","git_url":"git://github.com/Susurrus/nix.git","ssh_url":"git@github.com:Susurrus/nix.git","clone_url":"https://github.com/Susurrus/nix.git","svn_url":"https://github.com/Susurrus/nix","homepage":"","size":4277,"stargazers_count":0,"watchers_count":0,"language":"Rust","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":"nix-rust:master","ref":"master","sha":"17f87d49618bcfe282f294c318591181f686dec9","user":{"login":"nix-rust","id":17190941,"avatar_url":"https://avatars3.githubusercontent.com/u/17190941?v=3","gravatar_id":"","url":"https://api.github.com/users/nix-rust","html_url":"https://github.com/nix-rust","followers_url":"https://api.github.com/users/nix-rust/followers","following_url":"https://api.github.com/users/nix-rust/following{/other_user}","gists_url":"https://api.github.com/users/nix-rust/gists{/gist_id}","starred_url":"https://api.github.com/users/nix-rust/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nix-rust/subscriptions","organizations_url":"https://api.github.com/users/nix-rust/orgs","repos_url":"https://api.github.com/users/nix-rust/repos","events_url":"https://api.github.com/users/nix-rust/events{/privacy}","received_events_url":"https://api.github.com/users/nix-rust/received_events","type":"Organization","site_admin":false},"repo":{"id":22734848,"name":"nix","full_name":"nix-rust/nix","owner":{"login":"nix-rust","id":17190941,"avatar_url":"https://avatars3.githubusercontent.com/u/17190941?v=3","gravatar_id":"","url":"https://api.github.com/users/nix-rust","html_url":"https://github.com/nix-rust","followers_url":"https://api.github.com/users/nix-rust/followers","following_url":"https://api.github.com/users/nix-rust/following{/other_user}","gists_url":"https://api.github.com/users/nix-rust/gists{/gist_id}","starred_url":"https://api.github.com/users/nix-rust/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nix-rust/subscriptions","organizations_url":"https://api.github.com/users/nix-rust/orgs","repos_url":"https://api.github.com/users/nix-rust/repos","events_url":"https://api.github.com/users/nix-rust/events{/privacy}","received_events_url":"https://api.github.com/users/nix-rust/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nix-rust/nix","description":"Rust friendly bindings to *nix APIs","fork":false,"url":"https://api.github.com/repos/nix-rust/nix","forks_url":"https://api.github.com/repos/nix-rust/nix/forks","keys_url":"https://api.github.com/repos/nix-rust/nix/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nix-rust/nix/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nix-rust/nix/teams","hooks_url":"https://api.github.com/repos/nix-rust/nix/hooks","issue_events_url":"https://api.github.com/repos/nix-rust/nix/issues/events{/number}","events_url":"https://api.github.com/repos/nix-rust/nix/events","assignees_url":"https://api.github.com/repos/nix-rust/nix/assignees{/user}","branches_url":"https://api.github.com/repos/nix-rust/nix/branches{/branch}","tags_url":"https://api.github.com/repos/nix-rust/nix/tags","blobs_url":"https://api.github.com/repos/nix-rust/nix/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nix-rust/nix/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nix-rust/nix/git/refs{/sha}","trees_url":"https://api.github.com/repos/nix-rust/nix/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nix-rust/nix/statuses/{sha}","languages_url":"https://api.github.com/repos/nix-rust/nix/languages","stargazers_url":"https://api.github.com/repos/nix-rust/nix/stargazers","contributors_url":"https://api.github.com/repos/nix-rust/nix/contributors","subscribers_url":"https://api.github.com/repos/nix-rust/nix/subscribers","subscription_url":"https://api.github.com/repos/nix-rust/nix/subscription","commits_url":"https://api.github.com/repos/nix-rust/nix/commits{/sha}","git_commits_url":"https://api.github.com/repos/nix-rust/nix/git/commits{/sha}","comments_url":"https://api.github.com/repos/nix-rust/nix/comments{/number}","issue_comment_url":"https://api.github.com/repos/nix-rust/nix/issues/comments{/number}","contents_url":"https://api.github.com/repos/nix-rust/nix/contents/{+path}","compare_url":"https://api.github.com/repos/nix-rust/nix/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nix-rust/nix/merges","archive_url":"https://api.github.com/repos/nix-rust/nix/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nix-rust/nix/downloads","issues_url":"https://api.github.com/repos/nix-rust/nix/issues{/number}","pulls_url":"https://api.github.com/repos/nix-rust/nix/pulls{/number}","milestones_url":"https://api.github.com/repos/nix-rust/nix/milestones{/number}","notifications_url":"https://api.github.com/repos/nix-rust/nix/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nix-rust/nix/labels{/name}","releases_url":"https://api.github.com/repos/nix-rust/nix/releases{/id}","deployments_url":"https://api.github.com/repos/nix-rust/nix/deployments","created_at":"2014-08-07T20:03:36Z","updated_at":"2017-07-12T01:00:13Z","pushed_at":"2017-07-13T00:57:57Z","git_url":"git://github.com/nix-rust/nix.git","ssh_url":"git@github.com:nix-rust/nix.git","clone_url":"https://github.com/nix-rust/nix.git","svn_url":"https://github.com/nix-rust/nix","homepage":"","size":4584,"stargazers_count":503,"watchers_count":503,"language":"Rust","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":178,"mirror_url":null,"open_issues_count":109,"forks":178,"open_issues":109,"watchers":503,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nix-rust/nix/pulls/670"},"html":{"href":"https://github.com/nix-rust/nix/pull/670"},"issue":{"href":"https://api.github.com/repos/nix-rust/nix/issues/670"},"comments":{"href":"https://api.github.com/repos/nix-rust/nix/issues/670/comments"},"review_comments":{"href":"https://api.github.com/repos/nix-rust/nix/pulls/670/comments"},"review_comment":{"href":"https://api.github.com/repos/nix-rust/nix/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nix-rust/nix/pulls/670/commits"},"statuses":{"href":"https://api.github.com/repos/nix-rust/nix/statuses/ae0b5e9d12bfc98b7064df5b650834b79b0070dc"}}}}
{"actor":{"display_login":"posborne"}}