--- /dev/null
+Index: coreutils/src/uu/install/Cargo.toml
+===================================================================
+--- coreutils.orig/src/uu/install/Cargo.toml
++++ coreutils/src/uu/install/Cargo.toml
+@@ -20,7 +20,6 @@ path = "src/install.rs"
+ [dependencies]
+ clap = "2.33"
+ filetime = "0.2"
+-file_diff = "1.0.0"
+ libc = ">= 0.2"
+ uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["mode", "perms", "entries"] }
+ uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
+Index: coreutils/src/uu/install/src/install.rs
+===================================================================
+--- coreutils.orig/src/uu/install/src/install.rs
++++ coreutils/src/uu/install/src/install.rs
+@@ -13,12 +13,10 @@ mod mode;
+ extern crate uucore;
+
+ use clap::{App, Arg, ArgMatches};
+-use file_diff::diff;
+ use filetime::{set_file_times, FileTime};
+ use uucore::entries::{grp2gid, usr2uid};
+ use uucore::perms::{wrap_chgrp, wrap_chown, Verbosity};
+
+-use libc::{getegid, geteuid};
+ use std::fs;
+ use std::fs::File;
+ use std::os::unix::fs::MetadataExt;
+@@ -36,7 +34,6 @@ pub struct Behavior {
+ group: String,
+ verbose: bool,
+ preserve_timestamps: bool,
+- compare: bool,
+ }
+
+ #[derive(Clone, Eq, PartialEq)]
+@@ -115,10 +112,11 @@ pub fn uumain(args: impl uucore::Args) -
+ .help("ignored")
+ )
+ .arg(
++ // TODO implement flag
+ Arg::with_name(OPT_COMPARE)
+ .short("C")
+ .long(OPT_COMPARE)
+- .help("compare each pair of source and destination files, and in some cases, do not modify the destination at all")
++ .help("(unimplemented) compare each pair of source and destination files, and in some cases, do not modify the destination at all")
+ )
+ .arg(
+ Arg::with_name(OPT_DIRECTORY)
+@@ -264,6 +262,8 @@ fn check_unimplemented<'a>(matches: &Arg
+ Err("--backup")
+ } else if matches.is_present(OPT_BACKUP_2) {
+ Err("-b")
++ } else if matches.is_present(OPT_COMPARE) {
++ Err("--compare, -C")
+ } else if matches.is_present(OPT_CREATED) {
+ Err("-D")
+ } else if matches.is_present(OPT_STRIP) {
+@@ -338,7 +338,6 @@ fn behavior(matches: &ArgMatches) -> Res
+ group: matches.value_of(OPT_GROUP).unwrap_or("").to_string(),
+ verbose: matches.is_present(OPT_VERBOSE),
+ preserve_timestamps: matches.is_present(OPT_PRESERVE_TIMESTAMPS),
+- compare: matches.is_present(OPT_COMPARE),
+ })
+ }
+
+@@ -507,13 +506,7 @@ fn copy(from: &PathBuf, to: &PathBuf, b:
+ );
+ return Err(());
+ }
+- }
+-
+- if b.compare && !need_copy(from, to, b) {
+- return Ok(());
+- }
+-
+- if let Err(err) = fs::copy(from, to) {
++ } else if let Err(err) = fs::copy(from, to) {
+ show_error!(
+ "cannot install '{}' to '{}': {}",
+ from.display(),
+@@ -596,81 +589,3 @@ fn copy(from: &PathBuf, to: &PathBuf, b:
+
+ Ok(())
+ }
+-
+-/// Return true if a file is necessary to copy. This is the case when:
+-/// - _from_ or _to_ is nonexistent;
+-/// - either file has a sticky bit or set[ug]id bit, or the user specified one;
+-/// - either file isn't a regular file;
+-/// - the sizes of _from_ and _to_ differ;
+-/// - _to_'s owner differs from intended; or
+-/// - the contents of _from_ and _to_ differ.
+-///
+-/// # Parameters
+-///
+-/// _from_ and _to_, if existent, must be non-directories.
+-///
+-/// # Errors
+-///
+-/// Crashes the program if a nonexistent owner or group is specified in _b_.
+-///
+-fn need_copy(from: &PathBuf, to: &PathBuf, b: &Behavior) -> bool {
+- let from_meta = match fs::metadata(from) {
+- Ok(meta) => meta,
+- Err(_) => return true,
+- };
+- let to_meta = match fs::metadata(to) {
+- Ok(meta) => meta,
+- Err(_) => return true,
+- };
+-
+- // setuid || setgid || sticky
+- let extra_mode: u32 = 0o7000;
+-
+- if b.specified_mode.unwrap_or(0) & extra_mode != 0
+- || from_meta.mode() & extra_mode != 0
+- || to_meta.mode() & extra_mode != 0
+- {
+- return true;
+- }
+-
+- if !from_meta.is_file() || !to_meta.is_file() {
+- return true;
+- }
+-
+- if from_meta.len() != to_meta.len() {
+- return true;
+- }
+-
+- // TODO: if -P (#1809) and from/to contexts mismatch, return true.
+-
+- if !b.owner.is_empty() {
+- let owner_id = match usr2uid(&b.owner) {
+- Ok(id) => id,
+- _ => crash!(1, "no such user: {}", b.owner),
+- };
+- if owner_id != to_meta.uid() {
+- return true;
+- }
+- } else if !b.group.is_empty() {
+- let group_id = match grp2gid(&b.group) {
+- Ok(id) => id,
+- _ => crash!(1, "no such group: {}", b.group),
+- };
+- if group_id != to_meta.gid() {
+- return true;
+- }
+- } else {
+- #[cfg(not(target_os = "windows"))]
+- unsafe {
+- if to_meta.uid() != geteuid() || to_meta.gid() != getegid() {
+- return true;
+- }
+- }
+- }
+-
+- if !diff(from.to_str().unwrap(), to.to_str().unwrap()) {
+- return true;
+- }
+-
+- false
+-}
+Index: coreutils/tests/by-util/test_install.rs
+===================================================================
+--- coreutils.orig/tests/by-util/test_install.rs
++++ coreutils/tests/by-util/test_install.rs
+@@ -1,5 +1,4 @@
+ use crate::common::util::*;
+-use filetime::FileTime;
+ use rust_users::*;
+ use std::os::unix::fs::PermissionsExt;
+ #[cfg(target_os = "linux")]
+@@ -481,6 +480,7 @@ fn test_install_failing_no_such_file() {
+ }
+
+ #[test]
++#[ignore]
+ fn test_install_copy_then_compare_file() {
+ let scene = TestScenario::new(util_name!());
+ let at = &scene.fixtures;
+@@ -515,6 +515,7 @@ fn test_install_copy_then_compare_file()
+
+ #[test]
+ #[cfg(target_os = "linux")]
++#[ignore]
+ fn test_install_copy_then_compare_file_with_extra_mode() {
+ let scene = TestScenario::new(util_name!());
+ let at = &scene.fixtures;