1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

sort --merge --unique

This uses Itertools' dedup() rather than Vec::dedup(). There is probably
a cleaner, more polymorphic way to do this. Suggestions welcome.
This commit is contained in:
David Laban 2016-08-11 21:09:29 +01:00
parent e1af1520e7
commit 3531c46fb8
3 changed files with 30 additions and 6 deletions

View file

@ -11,6 +11,7 @@ path = "sort.rs"
getopts = "*" getopts = "*"
libc = "*" libc = "*"
semver = "*" semver = "*"
itertools = "*"
uucore = { path="../uucore" } uucore = { path="../uucore" }
[[bin]] [[bin]]

View file

@ -17,6 +17,8 @@ extern crate semver;
#[macro_use] #[macro_use]
extern crate uucore; extern crate uucore;
#[macro_use]
extern crate itertools;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::collections::BinaryHeap; use std::collections::BinaryHeap;
@ -26,6 +28,7 @@ use std::mem::replace;
use std::path::Path; use std::path::Path;
use uucore::fs::is_stdin_interactive; use uucore::fs::is_stdin_interactive;
use semver::Version; use semver::Version;
use itertools::Itertools; // for Iterator::dedup()
static NAME: &'static str = "sort"; static NAME: &'static str = "sort";
static VERSION: &'static str = env!("CARGO_PKG_VERSION"); static VERSION: &'static str = env!("CARGO_PKG_VERSION");
@ -261,10 +264,6 @@ fn exec(files: Vec<String>, settings: &Settings) -> i32 {
sort_by(&mut lines, &settings); sort_by(&mut lines, &settings);
if settings.unique {
lines.dedup()
}
if settings.check { if settings.check {
for (i, line) in lines.iter().enumerate() { for (i, line) in lines.iter().enumerate() {
if line != &original_lines[i] { if line != &original_lines[i] {
@ -274,10 +273,20 @@ fn exec(files: Vec<String>, settings: &Settings) -> i32 {
} }
} }
else if settings.merge { else if settings.merge {
print_sorted(file_merger, &settings.outfile) if settings.unique {
print_sorted(file_merger.dedup(), &settings.outfile)
}
else {
print_sorted(file_merger, &settings.outfile)
}
} }
else { else {
print_sorted(lines.iter(), &settings.outfile) if settings.unique {
print_sorted(lines.iter().dedup(), &settings.outfile)
}
else {
print_sorted(lines.iter(), &settings.outfile)
}
} }
0 0

View file

@ -80,6 +80,20 @@ fn test_merge_interleaved() {
.succeeds().stdout_is_fixture("merge_ints_interleaved.expected"); .succeeds().stdout_is_fixture("merge_ints_interleaved.expected");
} }
#[test]
fn test_merge_unique() {
new_ucmd()
.arg("-m")
.arg("--unique")
.arg("merge_ints_interleaved_1.txt")
.arg("merge_ints_interleaved_2.txt")
.arg("merge_ints_interleaved_3.txt")
.arg("merge_ints_interleaved_3.txt")
.arg("merge_ints_interleaved_2.txt")
.arg("merge_ints_interleaved_1.txt")
.succeeds().stdout_is_fixture("merge_ints_interleaved.expected");
}
#[test] #[test]
fn test_merge_reversed() { fn test_merge_reversed() {
new_ucmd() new_ucmd()