{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla/sccache/pulls/comments/223107099","pull_request_review_id":162161672,"id":223107099,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMzEwNzA5OQ==","diff_hunk":"@@ -1184,6 +1427,239 @@ impl pkg::ToolchainPackager for RustToolchainPackager {\n     }\n }\n \n+#[cfg(feature = \"dist-client\")]\n+struct RustOutputsRewriter {\n+    dep_info: Option<PathBuf>,\n+}\n+\n+#[cfg(feature = \"dist-client\")]\n+impl OutputsRewriter for RustOutputsRewriter {\n+    fn handle_outputs(self: Box<Self>, path_transformer: &dist::PathTransformer, output_paths: Vec<(String, PathBuf)>)\n+                      -> Result<()> {\n+        use std::io::{Seek, Write};\n+\n+        // Outputs in dep files (the files at the beginning of lines) are untransformed - remap-path-prefix is documented\n+        // to only apply to 'inputs'.\n+        trace!(\"Pondering on rewriting dep file {:?}\", self.dep_info);\n+        if let Some(dep_info) = self.dep_info {\n+            for (_dep_info_dist_path, dep_info_local_path) in output_paths {\n+                trace!(\"Comparing with {}\", dep_info_local_path.display());\n+                if dep_info == dep_info_local_path {\n+                    error!(\"Replacing using the transformer {:?}\", path_transformer);\n+                    // Found the dep info file\n+                    let mut f = fs::OpenOptions::new()\n+                        .read(true)\n+                        .write(true)\n+                        .open(dep_info)?;\n+                    let mut deps = String::new();\n+                    f.read_to_string(&mut deps)?;\n+                    for (local_path, dist_path) in get_path_mappings(path_transformer) {\n+                        let re_str = format!(\"(?m)^{}\", regex::escape(&dist_path));\n+                        error!(\"RE replacing {} with {} in {}\", re_str, local_path.to_str().unwrap(), deps);\n+                        let re = regex::Regex::new(&re_str).expect(\"Invalid regex\");\n+                        deps = re.replace_all(&deps, local_path.to_str().unwrap()).into_owned();\n+                    }\n+                    f.seek(io::SeekFrom::Start(0))?;\n+                    f.write_all(deps.as_bytes())?;\n+                    f.set_len(deps.len() as u64)?;\n+                    return Ok(())\n+                }\n+            }\n+            // We expected there to be dep info, but none of the outputs matched\n+            bail!(\"No outputs matched dep info file {}\", dep_info.display());\n+        }\n+        Ok(())\n+    }\n+}\n+\n+\n+#[cfg(feature = \"dist-client\")]\n+#[derive(Debug)]\n+struct RlibDepsDetail {\n+    deps: Vec<String>,\n+    mtime: time::SystemTime,\n+}\n+\n+#[cfg(feature = \"dist-client\")]\n+struct DepsSize;\n+#[cfg(feature = \"dist-client\")]\n+impl lru_cache::Meter<PathBuf, RlibDepsDetail> for DepsSize {\n+    type Measure = usize;\n+    fn measure<Q: ?Sized>(&self, _k: &Q, v: &RlibDepsDetail) -> usize where PathBuf: Borrow<Q>\n+    {\n+        use std::mem;\n+\n+        // TODO: unfortunately there is exactly nothing you can do with the k given the\n+        // current trait bounds. Just use some kind of sane value;\n+        //let k_size = mem::size_of::<PathBuf>() + k.capacity();\n+        let k_size = 3*8 + 100;\n+\n+        let crate_names_size: usize = v.deps.iter().map(|s| s.capacity()).sum();\n+        let v_size: usize =\n+            mem::size_of::<RlibDepsDetail>() + // Systemtime and vec itself\n+            v.deps.capacity() * mem::size_of::<String>() + // Each string in the vec\n+            crate_names_size; // Contents of all strings\n+\n+        k_size + v_size\n+    }\n+}\n+\n+#[cfg(feature = \"dist-client\")]\n+#[derive(Debug)]\n+struct RlibDepReader {\n+    cache: Mutex<lru_cache::LruCache<PathBuf, RlibDepsDetail, RandomState, DepsSize>>,\n+    executable: PathBuf,\n+}\n+\n+#[cfg(feature = \"dist-client\")]\n+impl RlibDepReader {\n+    fn new_with_check(executable: PathBuf, env_vars: &[(OsString, OsString)]) -> Result<Self> {\n+        use tempfile;\n+\n+        let temp_dir = tempfile::tempdir()\n+            .chain_err(|| \"Could not create temporary file for rlib output\")?;\n+        let temp_rlib = temp_dir.path().join(\"x.rlib\");\n+\n+        let mut cmd = process::Command::new(&executable);\n+        cmd\n+            .arg(\"--crate-type=rlib\")\n+            .arg(\"-o\").arg(&temp_rlib)\n+            .arg(\"-\")\n+            .env_clear()\n+            .envs(ref_env(env_vars));\n+\n+        let process::Output { status, stdout, stderr } = cmd.output()?;\n+\n+        if !status.success() {\n+            bail!(\"Failed to compile a minimal rlib with {}\", executable.display())\n+        }\n+        if !stdout.is_empty() {\n+            bail!(\"rustc stdout non-empty when compiling a minimal rlib: {:?}\", String::from_utf8_lossy(&stdout))\n+        }\n+        if !stderr.is_empty() {\n+            bail!(\"rustc stderr non-empty when compiling a minimal rlib: {:?}\", String::from_utf8_lossy(&stderr))\n+        }\n+\n+        // The goal of this cache is to avoid repeated lookups when building a single project. Let's budget 3MB.\n+        // Allowing for a 100 byte path, 50 dependecies per rlib and 20 characters per crate name, this roughly\n+        // approximates to `path_size + path + vec_size + num_deps * (systemtime_size + string_size + crate_name_len)`\n+        //                 `   3*8    +  100 +   3*8    +    50    * (      8         +     3*8     +       20      )`\n+        //                 `2748` bytes per crate\n+        // Allowing for possible overhead of up to double (for unused space in allocated memory), this means we\n+        // can cache information from about 570 rlibs - easily enough for a single project.\n+        const CACHE_SIZE: u64 = 3*1024*1024;\n+        let cache = lru_cache::LruCache::with_meter(CACHE_SIZE, DepsSize);\n+\n+        let rlib_dep_reader = RlibDepReader { cache: Mutex::new(cache), executable };\n+        if let Err(e) = rlib_dep_reader.discover_rlib_deps(env_vars, &temp_rlib) {","path":"src/compiler/rust.rs","position":820,"original_position":820,"commit_id":"433782fb51d97359871f04d9f099c04e55acbd7d","original_commit_id":"433782fb51d97359871f04d9f099c04e55acbd7d","user":{"login":"luser","id":286001,"node_id":"MDQ6VXNlcjI4NjAwMQ==","avatar_url":"https://avatars1.githubusercontent.com/u/286001?v=4","gravatar_id":"","url":"https://api.github.com/users/luser","html_url":"https://github.com/luser","followers_url":"https://api.github.com/users/luser/followers","following_url":"https://api.github.com/users/luser/following{/other_user}","gists_url":"https://api.github.com/users/luser/gists{/gist_id}","starred_url":"https://api.github.com/users/luser/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luser/subscriptions","organizations_url":"https://api.github.com/users/luser/orgs","repos_url":"https://api.github.com/users/luser/repos","events_url":"https://api.github.com/users/luser/events{/privacy}","received_events_url":"https://api.github.com/users/luser/received_events","type":"User","site_admin":false},"body":"Is this just a sanity check to ensure that `-Z ls` works at all with the current rustc?","created_at":"2018-10-05T18:49:07Z","updated_at":"2018-10-05T18:49:08Z","html_url":"https://github.com/mozilla/sccache/pull/294#discussion_r223107099","pull_request_url":"https://api.github.com/repos/mozilla/sccache/pulls/294","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/mozilla/sccache/pulls/comments/223107099"},"html":{"href":"https://github.com/mozilla/sccache/pull/294#discussion_r223107099"},"pull_request":{"href":"https://api.github.com/repos/mozilla/sccache/pulls/294"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla/sccache/pulls/294","id":215153611,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE1MTUzNjEx","html_url":"https://github.com/mozilla/sccache/pull/294","diff_url":"https://github.com/mozilla/sccache/pull/294.diff","patch_url":"https://github.com/mozilla/sccache/pull/294.patch","issue_url":"https://api.github.com/repos/mozilla/sccache/issues/294","number":294,"state":"open","locked":false,"title":"Sccache support for building Rust on Windows","user":{"login":"aidanhs","id":1050652,"node_id":"MDQ6VXNlcjEwNTA2NTI=","avatar_url":"https://avatars1.githubusercontent.com/u/1050652?v=4","gravatar_id":"","url":"https://api.github.com/users/aidanhs","html_url":"https://github.com/aidanhs","followers_url":"https://api.github.com/users/aidanhs/followers","following_url":"https://api.github.com/users/aidanhs/following{/other_user}","gists_url":"https://api.github.com/users/aidanhs/gists{/gist_id}","starred_url":"https://api.github.com/users/aidanhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aidanhs/subscriptions","organizations_url":"https://api.github.com/users/aidanhs/orgs","repos_url":"https://api.github.com/users/aidanhs/repos","events_url":"https://api.github.com/users/aidanhs/events{/privacy}","received_events_url":"https://api.github.com/users/aidanhs/received_events","type":"User","site_admin":false},"body":"The RlibDepDecoder is the most important piece here - in short, you can't distribute dylibs cross-platform (without something like Wine), so we either need to be pessimistic (and disallow distributed compilation if there's every a dylib anywhere in the deps folder, which is almost certain after first compilation) or have some way of telling what is a dependency of a particular crate rlib (we know the direct rlib dependencies of the thing we're compiling as they're passed in explicitly, we're interested in going a step down). `-Z ls` does this.\r\n\r\nAs a nice side effect, it makes other compiles more efficient too as it reduces what you send over the wire.\r\n\r\nI did some informal measurements distributing over Wireless G from Windows 4core i3 non-SSD laptop to an 8core i7 SSD laptop: Firefox clobber build went from ~100mins to ~55mins. YMMV.\r\n\r\nUnfortunately, while I was playing I saw an oddity with generated `.d` files - it looks like remapping prefixes is perhaps not working in some situations. The firefox build works, so I need to look at the implications.","created_at":"2018-09-13T03:20:22Z","updated_at":"2018-10-05T18:49:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3a1a0190bcf366f44c0593f15666d43d78112d63","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/mozilla/sccache/pulls/294/commits","review_comments_url":"https://api.github.com/repos/mozilla/sccache/pulls/294/comments","review_comment_url":"https://api.github.com/repos/mozilla/sccache/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla/sccache/issues/294/comments","statuses_url":"https://api.github.com/repos/mozilla/sccache/statuses/433782fb51d97359871f04d9f099c04e55acbd7d","head":{"label":"aidanhs:aphs-dist-sccache-rust-windows","ref":"aphs-dist-sccache-rust-windows","sha":"433782fb51d97359871f04d9f099c04e55acbd7d","user":{"login":"aidanhs","id":1050652,"node_id":"MDQ6VXNlcjEwNTA2NTI=","avatar_url":"https://avatars1.githubusercontent.com/u/1050652?v=4","gravatar_id":"","url":"https://api.github.com/users/aidanhs","html_url":"https://github.com/aidanhs","followers_url":"https://api.github.com/users/aidanhs/followers","following_url":"https://api.github.com/users/aidanhs/following{/other_user}","gists_url":"https://api.github.com/users/aidanhs/gists{/gist_id}","starred_url":"https://api.github.com/users/aidanhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aidanhs/subscriptions","organizations_url":"https://api.github.com/users/aidanhs/orgs","repos_url":"https://api.github.com/users/aidanhs/repos","events_url":"https://api.github.com/users/aidanhs/events{/privacy}","received_events_url":"https://api.github.com/users/aidanhs/received_events","type":"User","site_admin":false},"repo":{"id":119587031,"node_id":"MDEwOlJlcG9zaXRvcnkxMTk1ODcwMzE=","name":"sccache","full_name":"aidanhs/sccache","private":false,"owner":{"login":"aidanhs","id":1050652,"node_id":"MDQ6VXNlcjEwNTA2NTI=","avatar_url":"https://avatars1.githubusercontent.com/u/1050652?v=4","gravatar_id":"","url":"https://api.github.com/users/aidanhs","html_url":"https://github.com/aidanhs","followers_url":"https://api.github.com/users/aidanhs/followers","following_url":"https://api.github.com/users/aidanhs/following{/other_user}","gists_url":"https://api.github.com/users/aidanhs/gists{/gist_id}","starred_url":"https://api.github.com/users/aidanhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aidanhs/subscriptions","organizations_url":"https://api.github.com/users/aidanhs/orgs","repos_url":"https://api.github.com/users/aidanhs/repos","events_url":"https://api.github.com/users/aidanhs/events{/privacy}","received_events_url":"https://api.github.com/users/aidanhs/received_events","type":"User","site_admin":false},"html_url":"https://github.com/aidanhs/sccache","description":"sccache is ccache with cloud storage","fork":true,"url":"https://api.github.com/repos/aidanhs/sccache","forks_url":"https://api.github.com/repos/aidanhs/sccache/forks","keys_url":"https://api.github.com/repos/aidanhs/sccache/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aidanhs/sccache/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aidanhs/sccache/teams","hooks_url":"https://api.github.com/repos/aidanhs/sccache/hooks","issue_events_url":"https://api.github.com/repos/aidanhs/sccache/issues/events{/number}","events_url":"https://api.github.com/repos/aidanhs/sccache/events","assignees_url":"https://api.github.com/repos/aidanhs/sccache/assignees{/user}","branches_url":"https://api.github.com/repos/aidanhs/sccache/branches{/branch}","tags_url":"https://api.github.com/repos/aidanhs/sccache/tags","blobs_url":"https://api.github.com/repos/aidanhs/sccache/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aidanhs/sccache/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aidanhs/sccache/git/refs{/sha}","trees_url":"https://api.github.com/repos/aidanhs/sccache/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aidanhs/sccache/statuses/{sha}","languages_url":"https://api.github.com/repos/aidanhs/sccache/languages","stargazers_url":"https://api.github.com/repos/aidanhs/sccache/stargazers","contributors_url":"https://api.github.com/repos/aidanhs/sccache/contributors","subscribers_url":"https://api.github.com/repos/aidanhs/sccache/subscribers","subscription_url":"https://api.github.com/repos/aidanhs/sccache/subscription","commits_url":"https://api.github.com/repos/aidanhs/sccache/commits{/sha}","git_commits_url":"https://api.github.com/repos/aidanhs/sccache/git/commits{/sha}","comments_url":"https://api.github.com/repos/aidanhs/sccache/comments{/number}","issue_comment_url":"https://api.github.com/repos/aidanhs/sccache/issues/comments{/number}","contents_url":"https://api.github.com/repos/aidanhs/sccache/contents/{+path}","compare_url":"https://api.github.com/repos/aidanhs/sccache/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aidanhs/sccache/merges","archive_url":"https://api.github.com/repos/aidanhs/sccache/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aidanhs/sccache/downloads","issues_url":"https://api.github.com/repos/aidanhs/sccache/issues{/number}","pulls_url":"https://api.github.com/repos/aidanhs/sccache/pulls{/number}","milestones_url":"https://api.github.com/repos/aidanhs/sccache/milestones{/number}","notifications_url":"https://api.github.com/repos/aidanhs/sccache/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aidanhs/sccache/labels{/name}","releases_url":"https://api.github.com/repos/aidanhs/sccache/releases{/id}","deployments_url":"https://api.github.com/repos/aidanhs/sccache/deployments","created_at":"2018-01-30T19:56:51Z","updated_at":"2018-01-30T19:56:53Z","pushed_at":"2018-09-21T00:59:16Z","git_url":"git://github.com/aidanhs/sccache.git","ssh_url":"git@github.com:aidanhs/sccache.git","clone_url":"https://github.com/aidanhs/sccache.git","svn_url":"https://github.com/aidanhs/sccache","homepage":"","size":1664,"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,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mozilla:master","ref":"master","sha":"dda88a658c0f48994527c201e15f736ad193da4f","user":{"login":"mozilla","id":131524,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMTUyNA==","avatar_url":"https://avatars2.githubusercontent.com/u/131524?v=4","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"repo":{"id":57160728,"node_id":"MDEwOlJlcG9zaXRvcnk1NzE2MDcyOA==","name":"sccache","full_name":"mozilla/sccache","private":false,"owner":{"login":"mozilla","id":131524,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMTUyNA==","avatar_url":"https://avatars2.githubusercontent.com/u/131524?v=4","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/mozilla/sccache","description":"sccache is ccache with cloud storage","fork":false,"url":"https://api.github.com/repos/mozilla/sccache","forks_url":"https://api.github.com/repos/mozilla/sccache/forks","keys_url":"https://api.github.com/repos/mozilla/sccache/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla/sccache/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla/sccache/teams","hooks_url":"https://api.github.com/repos/mozilla/sccache/hooks","issue_events_url":"https://api.github.com/repos/mozilla/sccache/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla/sccache/events","assignees_url":"https://api.github.com/repos/mozilla/sccache/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla/sccache/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla/sccache/tags","blobs_url":"https://api.github.com/repos/mozilla/sccache/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla/sccache/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla/sccache/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla/sccache/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla/sccache/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla/sccache/languages","stargazers_url":"https://api.github.com/repos/mozilla/sccache/stargazers","contributors_url":"https://api.github.com/repos/mozilla/sccache/contributors","subscribers_url":"https://api.github.com/repos/mozilla/sccache/subscribers","subscription_url":"https://api.github.com/repos/mozilla/sccache/subscription","commits_url":"https://api.github.com/repos/mozilla/sccache/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla/sccache/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla/sccache/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla/sccache/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla/sccache/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla/sccache/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla/sccache/merges","archive_url":"https://api.github.com/repos/mozilla/sccache/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla/sccache/downloads","issues_url":"https://api.github.com/repos/mozilla/sccache/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla/sccache/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla/sccache/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla/sccache/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla/sccache/labels{/name}","releases_url":"https://api.github.com/repos/mozilla/sccache/releases{/id}","deployments_url":"https://api.github.com/repos/mozilla/sccache/deployments","created_at":"2016-04-26T20:44:16Z","updated_at":"2018-10-05T17:54:44Z","pushed_at":"2018-10-05T16:13:30Z","git_url":"git://github.com/mozilla/sccache.git","ssh_url":"git@github.com:mozilla/sccache.git","clone_url":"https://github.com/mozilla/sccache.git","svn_url":"https://github.com/mozilla/sccache","homepage":"","size":1617,"stargazers_count":489,"watchers_count":489,"language":"Rust","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":78,"mirror_url":null,"archived":false,"open_issues_count":82,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":78,"open_issues":82,"watchers":489,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla/sccache/pulls/294"},"html":{"href":"https://github.com/mozilla/sccache/pull/294"},"issue":{"href":"https://api.github.com/repos/mozilla/sccache/issues/294"},"comments":{"href":"https://api.github.com/repos/mozilla/sccache/issues/294/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla/sccache/pulls/294/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla/sccache/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla/sccache/pulls/294/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla/sccache/statuses/433782fb51d97359871f04d9f099c04e55acbd7d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"luser"}}