{"action":"created","comment":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/comments/24397362","id":24397362,"diff_hunk":"@@ -0,0 +1,835 @@\n+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT\n+// file at the top-level directory of this distribution and at\n+// http://rust-lang.org/COPYRIGHT.\n+//\n+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n+// option. This file may not be copied, modified, or distributed\n+// except according to those terms.\n+\n+//! Working with processes.\n+\n+#![unstable(feature = \"process\", reason = \"recently added via RFC 579\")]\n+#![allow(non_upper_case_globals)]\n+\n+use core::prelude::*;\n+\n+use env;\n+use ffi::AsOsStr;\n+use fmt;\n+use old_io::{self, Reader, Writer};\n+use io::{Error, ErrorKind};\n+use io::Result as IoResult;\n+use path::AsPath;\n+use libc;\n+use sync::mpsc::{channel, Receiver};\n+use sys::fs::FileDesc;\n+use sys::process2::Process as ProcessImp;\n+use sys::process2::Command as CommandImp;\n+use sys;\n+use sys_common::{AsInner, AsInnerMut};\n+use thread::Thread;\n+use vec::Vec;\n+\n+/// Signal a process to exit immediately, forcibly killing it. Corresponds to\n+/// SIGKILL on unix platforms.\n+#[cfg(windows)] const MustDieSignal: int = 9;\n+/// Signal a process to exit immediately, forcibly killing it. Corresponds to\n+/// SIGKILL on unix platforms.\n+#[cfg(not(windows))] const MustDieSignal: int = libc::SIGKILL as int;\n+\n+/// Representation of a running or exited child process.\n+///\n+/// This structure is used to represent and manage child processes. A child\n+/// process is created via the `Command` struct, which configures the spawning\n+/// process and can itself be constructed using a builder-style interface.\n+///\n+/// # Example\n+///\n+/// ```should_fail\n+/// use std::old_io::Command;\n+///\n+/// let mut child = match Command::new(\"/bin/cat\").arg(\"file.txt\").spawn() {\n+///     Ok(child) => child,\n+///     Err(e) => panic!(\"failed to execute child: {}\", e),\n+/// };\n+///\n+/// let contents = child.stdout.as_mut().unwrap().read_to_end();\n+/// assert!(child.wait().unwrap().success());\n+/// ```\n+pub struct Child {\n+    handle: ProcessImp,\n+\n+    /// None until wait() is called.\n+    status: Option<ExitStatus>,\n+\n+    stdin: Option<ChildStdin>,\n+    stdout: Option<ChildStdout>,\n+    stderr: Option<ChildStderr>,\n+}\n+\n+/// A handle to a child procesess's stdin\n+pub struct ChildStdin {\n+    inner: FileDesc\n+}\n+\n+impl Writer for ChildStdin {\n+    fn write_all(&mut self, buf: &[u8]) -> old_io::IoResult<()> {\n+        self.inner.write(buf)\n+    }\n+}\n+\n+/// A handle to a child procesess's stdout\n+pub struct ChildStdout {\n+    inner: FileDesc\n+}\n+\n+impl Reader for ChildStdout {\n+    fn read(&mut self, buf: &mut [u8]) -> old_io::IoResult<uint> {\n+        self.inner.read(buf)\n+    }\n+}\n+\n+/// A handle to a child procesess's stderr\n+pub struct ChildStderr {\n+    inner: FileDesc\n+}\n+\n+impl Reader for ChildStderr {\n+    fn read(&mut self, buf: &mut [u8]) -> old_io::IoResult<uint> {\n+        self.inner.read(buf)\n+    }\n+}\n+\n+/// The `Command` type acts as a process builder, providing fine-grained control\n+/// over how a new process should be spawned. A default configuration can be\n+/// generated using `Command::new(program)`, where `program` gives a path to the\n+/// program to be executed. Additional builder methods allow the configuration\n+/// to be changed (for example, by adding arguments) prior to spawning:\n+///\n+/// ```\n+/// use std::old_io::Command;\n+///\n+/// let mut process = match Command::new(\"sh\").arg(\"-c\").arg(\"echo hello\").spawn() {\n+///   Ok(p) => p,\n+///   Err(e) => panic!(\"failed to execute process: {}\", e),\n+/// };\n+///\n+/// let output = process.stdout.as_mut().unwrap().read_to_end();\n+/// ```\n+#[derive(Clone)]\n+pub struct Command {\n+    inner: CommandImp,\n+\n+    // Details explained in the builder methods\n+    stdin: Option<Stdio>,\n+    stdout: Option<Stdio>,\n+    stderr: Option<Stdio>,\n+}\n+\n+impl Command {\n+    /// Constructs a new `Command` for launching the program at\n+    /// path `program`, with the following default configuration:\n+    ///\n+    /// * No arguments to the program\n+    /// * Inherit the current process's environment\n+    /// * Inherit the current process's working directory\n+    /// * Inherit stdin/stdout/stderr for `run` or `status`, but create pipes for `output`\n+    ///\n+    /// Builder methods are provided to change these defaults and\n+    /// otherwise configure the process.\n+    pub fn new<S: AsOsStr + ?Sized>(program: &S) -> Command {\n+        Command {\n+            inner: CommandImp::new(program.as_os_str()),\n+            stdin: None,\n+            stdout: None,\n+            stderr: None,\n+        }\n+    }\n+\n+    /// Add an argument to pass to the program.\n+    pub fn arg<S: AsOsStr + ?Sized>(&mut self, arg: &S) -> &mut Command {\n+        self.inner.arg(arg.as_os_str());\n+        self\n+    }\n+\n+    /// Add multiple arguments to pass to the program.\n+    pub fn args<S: AsOsStr>(&mut self, args: &[S]) -> &mut Command {\n+        self.inner.args(args.iter().map(AsOsStr::as_os_str));\n+        self\n+    }\n+\n+    /// Inserts or updates an environment variable mapping.\n+    ///\n+    /// Note that environment variable names are case-insensitive (but case-preserving) on Windows,\n+    /// and case-sensitive on all other platforms.\n+    pub fn env<S: ?Sized, T: ?Sized>(&mut self, key: &S, val: &T) -> &mut Command where\n+        S: AsOsStr, T: AsOsStr\n+    {\n+        self.inner.init_env_map(env::vars());\n+        self.inner.env(key.as_os_str(), val.as_os_str());\n+        self\n+    }\n+\n+    /// Removes an environment variable mapping.\n+    pub fn env_remove<S: ?Sized + AsOsStr>(&mut self, key: &S) -> &mut Command {\n+        self.inner.init_env_map(env::vars());\n+        self.inner.env_remove(key.as_os_str());\n+        self\n+    }\n+\n+    /// Clears the entire environment map for the child process.\n+    pub fn env_clear(&mut self) -> &mut Command {\n+        self.inner.env_clear();\n+        self\n+    }\n+\n+    /// Set the working directory for the child process.\n+    pub fn current_dir<P: AsPath + ?Sized>(&mut self, dir: &P) -> &mut Command {\n+        self.inner.cwd(dir.as_path().as_os_str());\n+        self\n+    }\n+\n+    /// Configuration for the child process's stdin handle (file descriptor 0).\n+    /// Defaults to `CreatePipe(true, false)` so the input can be written to.\n+    pub fn stdin(&mut self, cfg: Stdio) -> &mut Command {\n+        self.stdin = Some(cfg);\n+        self\n+    }\n+\n+    /// Configuration for the child process's stdout handle (file descriptor 1).\n+    /// Defaults to `CreatePipe(false, true)` so the output can be collected.\n+    pub fn stdout(&mut self, cfg: Stdio) -> &mut Command {\n+        self.stdout = Some(cfg);\n+        self\n+    }\n+\n+    /// Configuration for the child process's stderr handle (file descriptor 2).\n+    /// Defaults to `CreatePipe(false, true)` so the output can be collected.\n+    pub fn stderr(&mut self, cfg: Stdio) -> &mut Command {\n+        self.stderr = Some(cfg);\n+        self\n+    }\n+\n+    fn spawn_inner(&self, default_io: Stdio) -> IoResult<Child> {\n+        let (their_stdin, our_stdin) = try!(\n+            setup_io(self.stdin.as_ref().unwrap_or(&default_io), 0, true)\n+        );\n+        let (their_stdout, our_stdout) = try!(\n+            setup_io(self.stdout.as_ref().unwrap_or(&default_io), 1, false)\n+        );\n+        let (their_stderr, our_stderr) = try!(\n+            setup_io(self.stderr.as_ref().unwrap_or(&default_io), 2, false)\n+        );\n+\n+        match ProcessImp::spawn(&self.inner, their_stdin, their_stdout, their_stderr) {\n+            Err(e) => Err(e),\n+            Ok(handle) => Ok(Child {\n+                handle: handle,\n+                status: None,\n+                stdin: our_stdin.map(|fd| ChildStdin { inner: fd }),\n+                stdout: our_stdout.map(|fd| ChildStdout { inner: fd }),\n+                stderr: our_stderr.map(|fd| ChildStderr { inner: fd }),\n+            })\n+        }\n+    }\n+\n+    /// Executes the command as a child process, returning a handle to it.\n+    pub fn spawn(&self) -> IoResult<Child> {\n+        self.spawn_inner(Stdio::Inherit)\n+    }\n+\n+    /// Executes the command as a child process, waiting for it to finish and\n+    /// collecting all of its output.\n+    ///\n+    /// # Example\n+    ///\n+    /// ```\n+    /// use std::old_io::Command;\n+    ///\n+    /// let output = match Command::new(\"cat\").arg(\"foot.txt\").output() {\n+    ///     Ok(output) => output,\n+    ///     Err(e) => panic!(\"failed to execute process: {}\", e),\n+    /// };\n+    ///\n+    /// println!(\"status: {}\", output.status);\n+    /// println!(\"stdout: {}\", String::from_utf8_lossy(output.output.as_slice()));\n+    /// println!(\"stderr: {}\", String::from_utf8_lossy(output.error.as_slice()));\n+    /// ```\n+    pub fn output(&self) -> IoResult<Output> {\n+        self.spawn_inner(Stdio::Capture).and_then(|p| p.wait_with_output())\n+    }\n+\n+    /// Executes a command as a child process, waiting for it to finish and\n+    /// collecting its exit status.\n+    ///\n+    /// # Example\n+    ///\n+    /// ```\n+    /// use std::old_io::Command;\n+    ///\n+    /// let status = match Command::new(\"ls\").status() {\n+    ///     Ok(status) => status,\n+    ///     Err(e) => panic!(\"failed to execute process: {}\", e),\n+    /// };\n+    ///\n+    /// println!(\"process exited with: {}\", status);\n+    /// ```\n+    pub fn status(&self) -> IoResult<ExitStatus> {\n+        self.spawn().and_then(|mut p| p.wait())\n+    }\n+}\n+\n+#[stable(feature = \"rust1\", since = \"1.0.0\")]\n+impl fmt::Debug for Command {\n+    /// Format the program and arguments of a Command for display. Any\n+    /// non-utf8 data is lossily converted using the utf8 replacement\n+    /// character.\n+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n+        try!(write!(f, \"{:?}\", self.inner.program));\n+        for arg in &self.inner.args {\n+            try!(write!(f, \" '{:?}'\", arg));\n+        }\n+        Ok(())\n+    }\n+}\n+\n+impl AsInner<CommandImp> for Command {\n+    fn as_inner(&self) -> &CommandImp { &self.inner }\n+}\n+\n+impl AsInnerMut<CommandImp> for Command {\n+    fn as_inner_mut(&mut self) -> &mut CommandImp { &mut self.inner }\n+}\n+\n+fn setup_io(io: &Stdio, fd: libc::c_int, readable: bool)\n+            -> IoResult<(Option<FileDesc>, Option<FileDesc>)>\n+{\n+    use self::Stdio::*;\n+    Ok(match *io {\n+        Null => {\n+            (None, None)\n+        }\n+        Inherit => {\n+            (Some(FileDesc::new(fd, false)), None)\n+        }\n+        Capture => {\n+            let (reader, writer) = try!(unsafe { sys::os::pipe_shim() });\n+            if readable {\n+                (Some(reader), Some(writer))\n+            } else {\n+                (Some(writer), Some(reader))\n+            }\n+        }\n+    })\n+}\n+\n+/// The output of a finished process.\n+#[derive(PartialEq, Eq, Clone)]\n+pub struct Output {\n+    /// The status (exit code) of the process.\n+    pub status: ExitStatus,\n+    /// The data that the process wrote to stdout.\n+    pub output: Vec<u8>,\n+    /// The data that the process wrote to stderr.\n+    pub error: Vec<u8>,\n+}\n+\n+/// Describes what to do with a standard io stream for a child process.\n+// FIXME: should be an extensible enum\n+#[derive(Clone)]\n+pub enum Stdio {\n+    /// A new pipe should be arranged to connect the parent and child processes.\n+    Capture,\n+\n+    /// The child inherits from the corresponding parent descriptor.\n+    Inherit,\n+\n+    /// This stream will be ignored. This is the equivalent of attaching the\n+    /// stream to `/dev/null`\n+    Null,\n+}\n+\n+/// Describes the result of a process after it has terminated.\n+#[derive(PartialEq, Eq, Clone, Copy, Debug)]\n+pub enum ExitStatus {\n+    /// Normal termination with an exit code.\n+    Code(i32),\n+\n+    /// Termination by signal, with the signal number.\n+    ///\n+    /// Never generated on Windows.\n+    Signal(i32),\n+}\n+\n+impl ExitStatus {\n+    /// Was termination successful? Signal termination not considered a success,\n+    /// and success is defined as a zero exit status.\n+    pub fn success(&self) -> bool {\n+        return *self == ExitStatus::Code(0);\n+    }\n+}\n+\n+#[stable(feature = \"rust1\", since = \"1.0.0\")]\n+impl fmt::Display for ExitStatus {\n+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n+        match *self {\n+            ExitStatus::Code(code) =>  write!(f, \"exit code: {}\", code),\n+            ExitStatus::Signal(code) =>  write!(f, \"signal: {}\", code),\n+        }\n+    }\n+}\n+\n+impl Child {\n+    /// Sends a signal to this child forcing it to exit. This is equivalent to","path":"src/libstd/process.rs","position":385,"original_position":385,"commit_id":"f994b8f7705a2394e127549c27585894516ad360","original_commit_id":"f994b8f7705a2394e127549c27585894516ad360","user":{"login":"nagisa","id":679122,"avatar_url":"https://avatars.githubusercontent.com/u/679122?v=3","gravatar_id":"","url":"https://api.github.com/users/nagisa","html_url":"https://github.com/nagisa","followers_url":"https://api.github.com/users/nagisa/followers","following_url":"https://api.github.com/users/nagisa/following{/other_user}","gists_url":"https://api.github.com/users/nagisa/gists{/gist_id}","starred_url":"https://api.github.com/users/nagisa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nagisa/subscriptions","organizations_url":"https://api.github.com/users/nagisa/orgs","repos_url":"https://api.github.com/users/nagisa/repos","events_url":"https://api.github.com/users/nagisa/events{/privacy}","received_events_url":"https://api.github.com/users/nagisa/received_events","type":"User","site_admin":false},"body":"“Sends a signal” exposes a certain implementation detail which should not be exposed. Especially given there’s [TerminateProcess](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686714%28v=vs.85%29.aspx).","created_at":"2015-02-10T09:03:08Z","updated_at":"2015-02-10T09:03:08Z","html_url":"https://github.com/rust-lang/rust/pull/22119#discussion_r24397362","pull_request_url":"https://api.github.com/repos/rust-lang/rust/pulls/22119","_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments/24397362"},"html":{"href":"https://github.com/rust-lang/rust/pull/22119#discussion_r24397362"},"pull_request":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/22119"}}},"pull_request":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/22119","id":28948714,"html_url":"https://github.com/rust-lang/rust/pull/22119","diff_url":"https://github.com/rust-lang/rust/pull/22119.diff","patch_url":"https://github.com/rust-lang/rust/pull/22119.patch","issue_url":"https://api.github.com/repos/rust-lang/rust/issues/22119","number":22119,"state":"open","locked":false,"title":"[WIP] Add std::process","user":{"login":"aturon","id":709807,"avatar_url":"https://avatars.githubusercontent.com/u/709807?v=3","gravatar_id":"","url":"https://api.github.com/users/aturon","html_url":"https://github.com/aturon","followers_url":"https://api.github.com/users/aturon/followers","following_url":"https://api.github.com/users/aturon/following{/other_user}","gists_url":"https://api.github.com/users/aturon/gists{/gist_id}","starred_url":"https://api.github.com/users/aturon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aturon/subscriptions","organizations_url":"https://api.github.com/users/aturon/orgs","repos_url":"https://api.github.com/users/aturon/repos","events_url":"https://api.github.com/users/aturon/events{/privacy}","received_events_url":"https://api.github.com/users/aturon/received_events","type":"User","site_admin":false},"body":"Per [RFC 579](https://github.com/rust-lang/rfcs/pull/579), this commit\r\nadds a new `std::process` module. This module is largely based on the\r\nexisting `std::old_io::process` module, but refactors the API to use\r\n`OsStr` and other new standards set out by IO reform.\r\n\r\nThe existing module is not yet deprecated, to allow for the new API to\r\nget a bit of testing before a mass migration to it.","created_at":"2015-02-09T19:26:38Z","updated_at":"2015-02-10T09:03:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6daab38305532733dbb410329a8dbd832938a6a6","assignee":{"login":"alexcrichton","id":64996,"avatar_url":"https://avatars.githubusercontent.com/u/64996?v=3","gravatar_id":"","url":"https://api.github.com/users/alexcrichton","html_url":"https://github.com/alexcrichton","followers_url":"https://api.github.com/users/alexcrichton/followers","following_url":"https://api.github.com/users/alexcrichton/following{/other_user}","gists_url":"https://api.github.com/users/alexcrichton/gists{/gist_id}","starred_url":"https://api.github.com/users/alexcrichton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexcrichton/subscriptions","organizations_url":"https://api.github.com/users/alexcrichton/orgs","repos_url":"https://api.github.com/users/alexcrichton/repos","events_url":"https://api.github.com/users/alexcrichton/events{/privacy}","received_events_url":"https://api.github.com/users/alexcrichton/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/rust-lang/rust/pulls/22119/commits","review_comments_url":"https://api.github.com/repos/rust-lang/rust/pulls/22119/comments","review_comment_url":"https://api.github.com/repos/rust-lang/rust/pulls/comments/{number}","comments_url":"https://api.github.com/repos/rust-lang/rust/issues/22119/comments","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/f994b8f7705a2394e127549c27585894516ad360","head":{"label":"aturon:new-process","ref":"new-process","sha":"f994b8f7705a2394e127549c27585894516ad360","user":{"login":"aturon","id":709807,"avatar_url":"https://avatars.githubusercontent.com/u/709807?v=3","gravatar_id":"","url":"https://api.github.com/users/aturon","html_url":"https://github.com/aturon","followers_url":"https://api.github.com/users/aturon/followers","following_url":"https://api.github.com/users/aturon/following{/other_user}","gists_url":"https://api.github.com/users/aturon/gists{/gist_id}","starred_url":"https://api.github.com/users/aturon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aturon/subscriptions","organizations_url":"https://api.github.com/users/aturon/orgs","repos_url":"https://api.github.com/users/aturon/repos","events_url":"https://api.github.com/users/aturon/events{/privacy}","received_events_url":"https://api.github.com/users/aturon/received_events","type":"User","site_admin":false},"repo":{"id":19056749,"name":"rust","full_name":"aturon/rust","owner":{"login":"aturon","id":709807,"avatar_url":"https://avatars.githubusercontent.com/u/709807?v=3","gravatar_id":"","url":"https://api.github.com/users/aturon","html_url":"https://github.com/aturon","followers_url":"https://api.github.com/users/aturon/followers","following_url":"https://api.github.com/users/aturon/following{/other_user}","gists_url":"https://api.github.com/users/aturon/gists{/gist_id}","starred_url":"https://api.github.com/users/aturon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aturon/subscriptions","organizations_url":"https://api.github.com/users/aturon/orgs","repos_url":"https://api.github.com/users/aturon/repos","events_url":"https://api.github.com/users/aturon/events{/privacy}","received_events_url":"https://api.github.com/users/aturon/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/aturon/rust","description":"a safe, concurrent, practical language","fork":true,"url":"https://api.github.com/repos/aturon/rust","forks_url":"https://api.github.com/repos/aturon/rust/forks","keys_url":"https://api.github.com/repos/aturon/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aturon/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aturon/rust/teams","hooks_url":"https://api.github.com/repos/aturon/rust/hooks","issue_events_url":"https://api.github.com/repos/aturon/rust/issues/events{/number}","events_url":"https://api.github.com/repos/aturon/rust/events","assignees_url":"https://api.github.com/repos/aturon/rust/assignees{/user}","branches_url":"https://api.github.com/repos/aturon/rust/branches{/branch}","tags_url":"https://api.github.com/repos/aturon/rust/tags","blobs_url":"https://api.github.com/repos/aturon/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aturon/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aturon/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/aturon/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aturon/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/aturon/rust/languages","stargazers_url":"https://api.github.com/repos/aturon/rust/stargazers","contributors_url":"https://api.github.com/repos/aturon/rust/contributors","subscribers_url":"https://api.github.com/repos/aturon/rust/subscribers","subscription_url":"https://api.github.com/repos/aturon/rust/subscription","commits_url":"https://api.github.com/repos/aturon/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/aturon/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/aturon/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/aturon/rust/issues/comments/{number}","contents_url":"https://api.github.com/repos/aturon/rust/contents/{+path}","compare_url":"https://api.github.com/repos/aturon/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aturon/rust/merges","archive_url":"https://api.github.com/repos/aturon/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aturon/rust/downloads","issues_url":"https://api.github.com/repos/aturon/rust/issues{/number}","pulls_url":"https://api.github.com/repos/aturon/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/aturon/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/aturon/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aturon/rust/labels{/name}","releases_url":"https://api.github.com/repos/aturon/rust/releases{/id}","created_at":"2014-04-23T04:19:14Z","updated_at":"2014-06-21T05:46:22Z","pushed_at":"2015-02-10T04:48:31Z","git_url":"git://github.com/aturon/rust.git","ssh_url":"git@github.com:aturon/rust.git","clone_url":"https://github.com/aturon/rust.git","svn_url":"https://github.com/aturon/rust","homepage":"http://www.rust-lang.org","size":232754,"stargazers_count":0,"watchers_count":0,"language":"Rust","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"rust-lang:master","ref":"master","sha":"134e00be7751a9fdc820981962e4fd7ea97bfff6","user":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=3","gravatar_id":"","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"repo":{"id":724712,"name":"rust","full_name":"rust-lang/rust","owner":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=3","gravatar_id":"","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rust-lang/rust","description":"a safe, concurrent, practical language","fork":false,"url":"https://api.github.com/repos/rust-lang/rust","forks_url":"https://api.github.com/repos/rust-lang/rust/forks","keys_url":"https://api.github.com/repos/rust-lang/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rust-lang/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rust-lang/rust/teams","hooks_url":"https://api.github.com/repos/rust-lang/rust/hooks","issue_events_url":"https://api.github.com/repos/rust-lang/rust/issues/events{/number}","events_url":"https://api.github.com/repos/rust-lang/rust/events","assignees_url":"https://api.github.com/repos/rust-lang/rust/assignees{/user}","branches_url":"https://api.github.com/repos/rust-lang/rust/branches{/branch}","tags_url":"https://api.github.com/repos/rust-lang/rust/tags","blobs_url":"https://api.github.com/repos/rust-lang/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rust-lang/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rust-lang/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/rust-lang/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/rust-lang/rust/languages","stargazers_url":"https://api.github.com/repos/rust-lang/rust/stargazers","contributors_url":"https://api.github.com/repos/rust-lang/rust/contributors","subscribers_url":"https://api.github.com/repos/rust-lang/rust/subscribers","subscription_url":"https://api.github.com/repos/rust-lang/rust/subscription","commits_url":"https://api.github.com/repos/rust-lang/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/rust-lang/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/rust-lang/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/rust-lang/rust/issues/comments/{number}","contents_url":"https://api.github.com/repos/rust-lang/rust/contents/{+path}","compare_url":"https://api.github.com/repos/rust-lang/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rust-lang/rust/merges","archive_url":"https://api.github.com/repos/rust-lang/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rust-lang/rust/downloads","issues_url":"https://api.github.com/repos/rust-lang/rust/issues{/number}","pulls_url":"https://api.github.com/repos/rust-lang/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/rust-lang/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/rust-lang/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rust-lang/rust/labels{/name}","releases_url":"https://api.github.com/repos/rust-lang/rust/releases{/id}","created_at":"2010-06-16T20:39:03Z","updated_at":"2015-02-10T08:55:53Z","pushed_at":"2015-02-10T06:39:32Z","git_url":"git://github.com/rust-lang/rust.git","ssh_url":"git@github.com:rust-lang/rust.git","clone_url":"https://github.com/rust-lang/rust.git","svn_url":"https://github.com/rust-lang/rust","homepage":"http://www.rust-lang.org","size":471461,"stargazers_count":9287,"watchers_count":9287,"language":"Rust","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1778,"mirror_url":null,"open_issues_count":2044,"forks":1778,"open_issues":2044,"watchers":9287,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/22119"},"html":{"href":"https://github.com/rust-lang/rust/pull/22119"},"issue":{"href":"https://api.github.com/repos/rust-lang/rust/issues/22119"},"comments":{"href":"https://api.github.com/repos/rust-lang/rust/issues/22119/comments"},"review_comments":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/22119/comments"},"review_comment":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/22119/commits"},"statuses":{"href":"https://api.github.com/repos/rust-lang/rust/statuses/f994b8f7705a2394e127549c27585894516ad360"}}}}