Skip to content

Commit

Permalink
Merge pull request #4009 from andrewbaptist/fix_eof_linebytes
Browse files Browse the repository at this point in the history
Match GNU semantics for missing EOF
  • Loading branch information
sylvestre authored Oct 17, 2022
2 parents 480f36f + 4922d34 commit 969f821
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 5 deletions.
30 changes: 25 additions & 5 deletions src/uu/split/src/split.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ static OPT_HEX_SUFFIXES: &str = "hex-suffixes";
static OPT_SUFFIX_LENGTH: &str = "suffix-length";
static OPT_DEFAULT_SUFFIX_LENGTH: &str = "0";
static OPT_VERBOSE: &str = "verbose";
//The ---io-blksize parameter is consumed and ignored.
//The ---io and ---io-blksize parameters are consumed and ignored.
//The parameter is included to make GNU coreutils tests pass.
static OPT_IO: &str = "-io";
static OPT_IO_BLKSIZE: &str = "-io-blksize";
static OPT_ELIDE_EMPTY_FILES: &str = "elide-empty-files";

Expand Down Expand Up @@ -154,6 +155,13 @@ pub fn uu_app() -> Command {
.help("print a diagnostic just before each output file is opened")
.action(ArgAction::SetTrue),
)
.arg(
Arg::new(OPT_IO)
.long(OPT_IO)
.alias(OPT_IO)
.takes_value(true)
.hide(true),
)
.arg(
Arg::new(OPT_IO_BLKSIZE)
.long("io-blksize")
Expand Down Expand Up @@ -912,10 +920,22 @@ impl<'a> Write for LineBytesChunkWriter<'a> {
// then move on to the next chunk if necessary.
None => {
let end = self.num_bytes_remaining_in_current_chunk;
let num_bytes_written = self.inner.write(&buf[..end.min(buf.len())])?;
self.num_bytes_remaining_in_current_chunk -= num_bytes_written;
total_bytes_written += num_bytes_written;
buf = &buf[num_bytes_written..];

// This is ugly but here to match GNU behavior. If the input
// doesn't end with a \n, pretend that it does for handling
// the second to last segment chunk. See `line-bytes.sh`.
if end == buf.len()
&& self.num_bytes_remaining_in_current_chunk
< self.chunk_size.try_into().unwrap()
&& buf[buf.len() - 1] != b'\n'
{
self.num_bytes_remaining_in_current_chunk = 0;
} else {
let num_bytes_written = self.inner.write(&buf[..end.min(buf.len())])?;
self.num_bytes_remaining_in_current_chunk -= num_bytes_written;
total_bytes_written += num_bytes_written;
buf = &buf[num_bytes_written..];
}
}

// If there is a newline character and the line
Expand Down
16 changes: 16 additions & 0 deletions tests/by-util/test_split.rs
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,22 @@ fn test_line_bytes_no_empty_file() {
assert!(!at.plus("xak").exists());
}

#[test]
fn test_line_bytes_no_eof() {
let (at, mut ucmd) = at_and_ucmd!();
ucmd.args(&["-C", "3"])
.pipe_in("1\n2222\n3\n4")
.succeeds()
.no_stdout()
.no_stderr();
assert_eq!(at.read("xaa"), "1\n");
assert_eq!(at.read("xab"), "222");
assert_eq!(at.read("xac"), "2\n");
assert_eq!(at.read("xad"), "3\n");
assert_eq!(at.read("xae"), "4");
assert!(!at.plus("xaf").exists());
}

#[test]
fn test_guard_input() {
let ts = TestScenario::new(util_name!());
Expand Down
4 changes: 4 additions & 0 deletions tests/fixtures/split/noeof.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
1
2222
3
4

0 comments on commit 969f821

Please sign in to comment.