]> git.proxmox.com Git - rustc.git/blobdiff - src/librustc_incremental/persist/work_product.rs
New upstream version 1.47.0+dfsg1
[rustc.git] / src / librustc_incremental / persist / work_product.rs
index a9ebd27ce9928fc22eec587d5420de8cf38745b1..19d64bda56d6d66bc5a024971ed68d40d9339882 100644 (file)
@@ -1,63 +1,57 @@
-// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
 //! This module contains files for saving intermediate work-products.
 
-use persist::fs::*;
-use rustc::dep_graph::{WorkProduct, WorkProductId};
-use rustc::session::Session;
-use rustc::session::config::OutputType;
-use rustc::util::fs::link_or_copy;
+use crate::persist::fs::*;
+use rustc_fs_util::link_or_copy;
+use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
+use rustc_session::Session;
+use std::fs as std_fs;
 use std::path::PathBuf;
-use std::sync::Arc;
 
-pub fn save_trans_partition(sess: &Session,
-                            cgu_name: &str,
-                            partition_hash: u64,
-                            files: &[(OutputType, PathBuf)]) {
-    debug!("save_trans_partition({:?},{},{:?})",
-           cgu_name,
-           partition_hash,
-           files);
-    if sess.opts.incremental.is_none() {
-        return;
-    }
-    let work_product_id = Arc::new(WorkProductId(cgu_name.to_string()));
+pub fn copy_cgu_workproduct_to_incr_comp_cache_dir(
+    sess: &Session,
+    cgu_name: &str,
+    path: &Option<PathBuf>,
+) -> Option<(WorkProductId, WorkProduct)> {
+    debug!("copy_cgu_workproduct_to_incr_comp_cache_dir({:?},{:?})", cgu_name, path);
+    sess.opts.incremental.as_ref()?;
 
-    let saved_files: Option<Vec<_>> =
-        files.iter()
-             .map(|&(kind, ref path)| {
-                 let file_name = format!("cgu-{}.{}", cgu_name, kind.extension());
-                 let path_in_incr_dir = in_incr_comp_dir_sess(sess, &file_name);
-                 match link_or_copy(path, &path_in_incr_dir) {
-                     Ok(_) => Some((kind, file_name)),
-                     Err(err) => {
-                         sess.warn(&format!("error copying object file `{}` \
-                                             to incremental directory as `{}`: {}",
-                                            path.display(),
-                                            path_in_incr_dir.display(),
-                                            err));
-                         None
-                     }
-                 }
-             })
-             .collect();
-    let saved_files = match saved_files {
-        Some(v) => v,
-        None => return,
+    let saved_file = if let Some(path) = path {
+        let file_name = format!("{}.o", cgu_name);
+        let path_in_incr_dir = in_incr_comp_dir_sess(sess, &file_name);
+        match link_or_copy(path, &path_in_incr_dir) {
+            Ok(_) => Some(file_name),
+            Err(err) => {
+                sess.warn(&format!(
+                    "error copying object file `{}` to incremental directory as `{}`: {}",
+                    path.display(),
+                    path_in_incr_dir.display(),
+                    err
+                ));
+                return None;
+            }
+        }
+    } else {
+        None
     };
 
-    let work_product = WorkProduct {
-        input_hash: partition_hash,
-        saved_files: saved_files,
-    };
+    let work_product = WorkProduct { cgu_name: cgu_name.to_string(), saved_file };
 
-    sess.dep_graph.insert_work_product(&work_product_id, work_product);
+    let work_product_id = WorkProductId::from_cgu_name(cgu_name);
+    Some((work_product_id, work_product))
+}
+
+pub fn delete_workproduct_files(sess: &Session, work_product: &WorkProduct) {
+    if let Some(ref file_name) = work_product.saved_file {
+        let path = in_incr_comp_dir_sess(sess, file_name);
+        match std_fs::remove_file(&path) {
+            Ok(()) => {}
+            Err(err) => {
+                sess.warn(&format!(
+                    "file-system error deleting outdated file `{}`: {}",
+                    path.display(),
+                    err
+                ));
+            }
+        }
+    }
 }