1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-09-15 11:36:16 +00:00

Merge branch 'uutils:main' into more_implement_print_over_and_clean_print

This commit is contained in:
Ideflop 2023-05-17 22:47:07 +02:00 committed by GitHub
commit 1ce52903b0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
92 changed files with 1026 additions and 274 deletions

View file

@ -1,7 +1,11 @@
// spell-checker:ignore (words) asdf
// spell-checker:ignore (words) asdf algo algos
use crate::common::util::TestScenario;
const ALGOS: [&str; 11] = [
"sysv", "bsd", "crc", "md5", "sha1", "sha224", "sha256", "sha384", "sha512", "blake2b", "sm3",
];
#[test]
fn test_invalid_arg() {
new_ucmd!().arg("--definitely-invalid").fails().code_is(1);
@ -12,7 +16,7 @@ fn test_single_file() {
new_ucmd!()
.arg("lorem_ipsum.txt")
.succeeds()
.stdout_is_fixture("single_file.expected");
.stdout_is_fixture("crc_single_file.expected");
}
#[test]
@ -21,7 +25,7 @@ fn test_multiple_files() {
.arg("lorem_ipsum.txt")
.arg("alice_in_wonderland.txt")
.succeeds()
.stdout_is_fixture("multiple_files.expected");
.stdout_is_fixture("crc_multiple_files.expected");
}
#[test]
@ -29,11 +33,11 @@ fn test_stdin() {
new_ucmd!()
.pipe_in_fixture("lorem_ipsum.txt")
.succeeds()
.stdout_is_fixture("stdin.expected");
.stdout_is_fixture("crc_stdin.expected");
}
#[test]
fn test_empty() {
fn test_empty_file() {
let (at, mut ucmd) = at_and_ucmd!();
at.touch("a");
@ -62,25 +66,26 @@ fn test_arg_overrides_stdin() {
}
#[test]
fn test_invalid_file() {
let ts = TestScenario::new(util_name!());
let at = ts.fixtures.clone();
fn test_nonexisting_file() {
let file_name = "asdf";
let folder_name = "asdf";
// First check when file doesn't exist
ts.ucmd()
.arg(folder_name)
new_ucmd!()
.arg(file_name)
.fails()
.no_stdout()
.stderr_contains("cksum: asdf: No such file or directory");
.stderr_contains(format!("cksum: {file_name}: No such file or directory"));
}
// Then check when the file is of an invalid type
#[test]
fn test_folder() {
let (at, mut ucmd) = at_and_ucmd!();
let folder_name = "a_folder";
at.mkdir(folder_name);
ts.ucmd()
.arg(folder_name)
ucmd.arg(folder_name)
.succeeds()
.stdout_only("4294967295 0 asdf\n");
.stdout_only(format!("4294967295 0 {folder_name}\n"));
}
// Make sure crc is correct for files larger than 32 bytes
@ -116,77 +121,106 @@ fn test_stdin_larger_than_128_bytes() {
}
#[test]
fn test_sha1_single_file() {
new_ucmd!()
.arg("-a=sha1")
.arg("lorem_ipsum.txt")
.succeeds()
.stdout_is("ab1dd0bae1d8883a3d18a66de6afbd28252cfbef 772 lorem_ipsum.txt\n");
fn test_algorithm_single_file() {
for algo in ALGOS {
for option in ["-a", "--algorithm"] {
new_ucmd!()
.arg(format!("{option}={algo}"))
.arg("lorem_ipsum.txt")
.succeeds()
.stdout_is_fixture(format!("{algo}_single_file.expected"));
}
}
}
#[test]
fn test_sm3_single_file() {
new_ucmd!()
.arg("-a=sm3")
.arg("lorem_ipsum.txt")
.succeeds()
.stdout_is(
"6d296b805d060bfed22808df308dbb9b4317794dd4ed6740a10770a782699bc2 772 lorem_ipsum.txt\n",
);
fn test_algorithm_multiple_files() {
for algo in ALGOS {
for option in ["-a", "--algorithm"] {
new_ucmd!()
.arg(format!("{option}={algo}"))
.arg("lorem_ipsum.txt")
.arg("alice_in_wonderland.txt")
.succeeds()
.stdout_is_fixture(format!("{algo}_multiple_files.expected"));
}
}
}
#[test]
fn test_bsd_single_file() {
new_ucmd!()
.arg("-a=bsd")
.arg("lorem_ipsum.txt")
.succeeds()
.stdout_only_fixture("bsd_single_file.expected");
fn test_algorithm_stdin() {
for algo in ALGOS {
for option in ["-a", "--algorithm"] {
new_ucmd!()
.arg(format!("{option}={algo}"))
.pipe_in_fixture("lorem_ipsum.txt")
.succeeds()
.stdout_is_fixture(format!("{algo}_stdin.expected"));
}
}
}
#[test]
fn test_bsd_multiple_files() {
fn test_untagged_single_file() {
new_ucmd!()
.arg("-a=bsd")
.arg("--untagged")
.arg("lorem_ipsum.txt")
.succeeds()
.stdout_is_fixture("untagged/crc_single_file.expected");
}
#[test]
fn test_untagged_multiple_files() {
new_ucmd!()
.arg("--untagged")
.arg("lorem_ipsum.txt")
.arg("alice_in_wonderland.txt")
.succeeds()
.stdout_only_fixture("bsd_multiple_files.expected");
.stdout_is_fixture("untagged/crc_multiple_files.expected");
}
#[test]
fn test_bsd_stdin() {
fn test_untagged_stdin() {
new_ucmd!()
.arg("-a=bsd")
.arg("--untagged")
.pipe_in_fixture("lorem_ipsum.txt")
.succeeds()
.stdout_only_fixture("bsd_stdin.expected");
.stdout_is_fixture("untagged/crc_stdin.expected");
}
#[test]
fn test_sysv_single_file() {
new_ucmd!()
.arg("-a=sysv")
.arg("lorem_ipsum.txt")
.succeeds()
.stdout_only_fixture("sysv_single_file.expected");
fn test_untagged_algorithm_single_file() {
for algo in ALGOS {
new_ucmd!()
.arg("--untagged")
.arg(format!("--algorithm={algo}"))
.arg("lorem_ipsum.txt")
.succeeds()
.stdout_is_fixture(format!("untagged/{algo}_single_file.expected"));
}
}
#[test]
fn test_sysv_multiple_files() {
new_ucmd!()
.arg("-a=sysv")
.arg("lorem_ipsum.txt")
.arg("alice_in_wonderland.txt")
.succeeds()
.stdout_only_fixture("sysv_multiple_files.expected");
fn test_untagged_algorithm_multiple_files() {
for algo in ALGOS {
new_ucmd!()
.arg("--untagged")
.arg(format!("--algorithm={algo}"))
.arg("lorem_ipsum.txt")
.arg("alice_in_wonderland.txt")
.succeeds()
.stdout_is_fixture(format!("untagged/{algo}_multiple_files.expected"));
}
}
#[test]
fn test_sysv_stdin() {
new_ucmd!()
.arg("-a=sysv")
.pipe_in_fixture("lorem_ipsum.txt")
.succeeds()
.stdout_only_fixture("sysv_stdin.expected");
fn test_untagged_algorithm_stdin() {
for algo in ALGOS {
new_ucmd!()
.arg("--untagged")
.arg(format!("--algorithm={algo}"))
.pipe_in_fixture("lorem_ipsum.txt")
.succeeds()
.stdout_is_fixture(format!("untagged/{algo}_stdin.expected"));
}
}

View file

@ -1075,6 +1075,88 @@ fn test_cp_parents_dest_not_directory() {
.stderr_contains("with --parents, the destination must be a directory");
}
#[test]
fn test_cp_parents_with_permissions_copy_file() {
let (at, mut ucmd) = at_and_ucmd!();
let dir = "dir";
let file = "p1/p2/file";
at.mkdir(dir);
at.mkdir_all("p1/p2");
at.touch(file);
let p1_mode = 0o0777;
let p2_mode = 0o0711;
let file_mode = 0o0702;
#[cfg(unix)]
{
at.set_mode("p1", p1_mode);
at.set_mode("p1/p2", p2_mode);
at.set_mode(file, file_mode);
}
ucmd.arg("-p")
.arg("--parents")
.arg(file)
.arg(dir)
.succeeds();
#[cfg(all(unix, not(target_os = "freebsd")))]
{
let p1_metadata = at.metadata("p1");
let p2_metadata = at.metadata("p1/p2");
let file_metadata = at.metadata(file);
assert_metadata_eq!(p1_metadata, at.metadata("dir/p1"));
assert_metadata_eq!(p2_metadata, at.metadata("dir/p1/p2"));
assert_metadata_eq!(file_metadata, at.metadata("dir/p1/p2/file"));
}
}
#[test]
fn test_cp_parents_with_permissions_copy_dir() {
let (at, mut ucmd) = at_and_ucmd!();
let dir1 = "dir";
let dir2 = "p1/p2";
let file = "p1/p2/file";
at.mkdir(dir1);
at.mkdir_all(dir2);
at.touch(file);
let p1_mode = 0o0777;
let p2_mode = 0o0711;
let file_mode = 0o0702;
#[cfg(unix)]
{
at.set_mode("p1", p1_mode);
at.set_mode("p1/p2", p2_mode);
at.set_mode(file, file_mode);
}
ucmd.arg("-p")
.arg("--parents")
.arg("-r")
.arg(dir2)
.arg(dir1)
.succeeds();
#[cfg(all(unix, not(target_os = "freebsd")))]
{
let p1_metadata = at.metadata("p1");
let p2_metadata = at.metadata("p1/p2");
let file_metadata = at.metadata(file);
assert_metadata_eq!(p1_metadata, at.metadata("dir/p1"));
assert_metadata_eq!(p2_metadata, at.metadata("dir/p1/p2"));
assert_metadata_eq!(file_metadata, at.metadata("dir/p1/p2/file"));
}
}
#[test]
#[cfg(unix)]
fn test_cp_writable_special_file_permissions() {
@ -1581,13 +1663,13 @@ fn test_cp_one_file_system() {
use walkdir::WalkDir;
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
// Test must be run as root (or with `sudo -E`)
if scene.cmd("whoami").run().stdout_str() != "root\n" {
return;
}
let at = scene.fixtures.clone();
let at_src = AtPath::new(&at.plus(TEST_MOUNT_COPY_FROM_FOLDER));
let at_dst = AtPath::new(&at.plus(TEST_COPY_TO_FOLDER_NEW));

View file

@ -282,6 +282,27 @@ fn test_date_for_invalid_file() {
}
#[test]
#[cfg(unix)]
fn test_date_for_no_permission_file() {
let (at, mut ucmd) = at_and_ucmd!();
const FILE: &str = "file-no-perm-1";
use std::os::unix::fs::PermissionsExt;
let file = std::fs::OpenOptions::new()
.create(true)
.write(true)
.open(at.plus(FILE))
.unwrap();
file.set_permissions(std::fs::Permissions::from_mode(0o222))
.unwrap();
let result = ucmd.arg("--file").arg(FILE).fails();
result.no_stdout();
assert_eq!(
result.stderr_str().trim(),
format!("date: {FILE}: Permission denied")
);
}
fn test_date_for_dir_as_file() {
let result = new_ucmd!().arg("--file").arg("/").fails();
result.no_stdout();

View file

@ -1536,3 +1536,29 @@ fn test_multiple_processes_reading_stdin() {
.succeeds()
.stdout_only("def\n");
}
/// Test that discarding system file cache fails for stdin.
#[test]
#[cfg(target_os = "linux")]
fn test_nocache_stdin_error() {
#[cfg(not(target_env = "musl"))]
let detail = "Illegal seek";
#[cfg(target_env = "musl")]
let detail = "Invalid seek";
new_ucmd!()
.args(&["iflag=nocache", "count=0", "status=noxfer"])
.fails()
.code_is(1)
.stderr_only(format!("dd: failed to discard cache for: 'standard input': {detail}\n0+0 records in\n0+0 records out\n"));
}
/// Test for discarding system file cache.
#[test]
#[cfg(target_os = "linux")]
fn test_nocache_file() {
let (at, mut ucmd) = at_and_ucmd!();
at.write_bytes("f", b"a".repeat(1 << 20).as_slice());
ucmd.args(&["if=f", "of=/dev/null", "iflag=nocache", "status=noxfer"])
.succeeds()
.stderr_only("2048+0 records in\n2048+0 records out\n");
}

View file

@ -7,6 +7,10 @@ use crate::common::util::TestScenario;
use nix::unistd::{close, dup};
use regex::Regex;
use std::collections::HashMap;
#[cfg(target_os = "linux")]
use std::ffi::OsStr;
#[cfg(target_os = "linux")]
use std::os::unix::ffi::OsStrExt;
#[cfg(all(unix, feature = "chmod"))]
use std::os::unix::io::IntoRawFd;
use std::path::Path;
@ -1239,7 +1243,7 @@ fn test_ls_long_total_size() {
("long_si", "total 8.2k"),
]
.iter()
.cloned()
.copied()
.collect()
} else {
[
@ -1248,7 +1252,7 @@ fn test_ls_long_total_size() {
("long_si", "total 2"),
]
.iter()
.cloned()
.copied()
.collect()
};
@ -3393,3 +3397,54 @@ fn test_tabsize_formatting() {
.succeeds()
.stdout_is("aaaaaaaa bbbb\ncccc dddddddd");
}
#[cfg(any(
target_os = "linux",
target_os = "macos",
target_os = "ios",
target_os = "freebsd",
target_os = "dragonfly",
target_os = "netbsd",
target_os = "openbsd",
target_os = "illumos",
target_os = "solaris"
))]
#[test]
fn test_device_number() {
use std::fs::{metadata, read_dir};
use std::os::unix::fs::{FileTypeExt, MetadataExt};
use uucore::libc::{dev_t, major, minor};
let dev_dir = read_dir("/dev").unwrap();
// let's use the first device for test
let blk_dev = dev_dir
.map(|res_entry| res_entry.unwrap())
.find(|entry| {
entry.file_type().unwrap().is_block_device()
|| entry.file_type().unwrap().is_char_device()
})
.expect("Expect a block/char device");
let blk_dev_path = blk_dev.path();
let blk_dev_meta = metadata(blk_dev_path.as_path()).unwrap();
let blk_dev_number = blk_dev_meta.rdev() as dev_t;
let (major, minor) = unsafe { (major(blk_dev_number), minor(blk_dev_number)) };
let major_minor_str = format!("{}, {}", major, minor);
let scene = TestScenario::new(util_name!());
scene
.ucmd()
.arg("-l")
.arg(blk_dev_path.to_str().expect("should be UTF-8 encoded"))
.succeeds()
.stdout_contains(major_minor_str);
}
#[test]
#[cfg(target_os = "linux")]
fn test_invalid_utf8() {
let (at, mut ucmd) = at_and_ucmd!();
let filename = OsStr::from_bytes(b"-\xE0-foo");
at.touch(filename);
ucmd.succeeds();
}

View file

@ -27,7 +27,7 @@ fn test_deleted_dir() {
use std::process::Command;
let ts = TestScenario::new(util_name!());
let at = ts.fixtures.clone();
let at = ts.fixtures;
let output = Command::new("sh")
.arg("-c")
.arg(format!(

View file

@ -118,9 +118,10 @@ mod linux_only {
use std::os::unix::io::FromRawFd;
let mut fds: [c_int; 2] = [0, 0];
if unsafe { libc::pipe(&mut fds as *mut c_int) } != 0 {
panic!("Failed to create pipe");
}
assert!(
(unsafe { libc::pipe(&mut fds as *mut c_int) } == 0),
"Failed to create pipe"
);
// Drop the read end of the pipe
let _ = unsafe { File::from_raw_fd(fds[0]) };

View file

@ -1,3 +1,4 @@
use std::ffi::OsStr;
use std::process::{ExitStatus, Stdio};
#[cfg(unix)]
@ -6,24 +7,26 @@ use std::os::unix::process::ExitStatusExt;
use crate::common::util::TestScenario;
#[cfg(unix)]
fn check_termination(result: &ExitStatus) {
fn check_termination(result: ExitStatus) {
assert_eq!(result.signal(), Some(libc::SIGPIPE));
}
#[cfg(not(unix))]
fn check_termination(result: &ExitStatus) {
fn check_termination(result: ExitStatus) {
assert!(result.success(), "yes did not exit successfully");
}
const NO_ARGS: &[&str] = &[];
/// Run `yes`, capture some of the output, close the pipe, and verify it.
fn run(args: &[&str], expected: &[u8]) {
fn run(args: &[impl AsRef<OsStr>], expected: &[u8]) {
let mut cmd = new_ucmd!();
let mut child = cmd.args(args).set_stdout(Stdio::piped()).run_no_wait();
let buf = child.stdout_exact_bytes(expected.len());
child.close_stdout();
#[allow(deprecated)]
check_termination(&child.wait_with_output().unwrap().status);
check_termination(child.wait_with_output().unwrap().status);
assert_eq!(buf.as_slice(), expected);
}
@ -34,7 +37,7 @@ fn test_invalid_arg() {
#[test]
fn test_simple() {
run(&[], b"y\ny\ny\ny\n");
run(NO_ARGS, b"y\ny\ny\ny\n");
}
#[test]
@ -44,7 +47,7 @@ fn test_args() {
#[test]
fn test_long_output() {
run(&[], "y\n".repeat(512 * 1024).as_bytes());
run(NO_ARGS, "y\n".repeat(512 * 1024).as_bytes());
}
/// Test with an output that seems likely to get mangled in case of incomplete writes.
@ -88,3 +91,20 @@ fn test_piped_to_dev_full() {
}
}
}
#[test]
#[cfg(any(unix, target_os = "wasi"))]
fn test_non_utf8() {
#[cfg(unix)]
use std::os::unix::ffi::OsStrExt;
#[cfg(target_os = "wasi")]
use std::os::wasi::ffi::OsStrExt;
run(
&[
OsStr::from_bytes(b"\xbf\xff\xee"),
OsStr::from_bytes(b"bar"),
],
&b"\xbf\xff\xee bar\n".repeat(5000),
);
}

View file

@ -2016,7 +2016,7 @@ impl UChild {
/// Read, consume and return the output as [`String`] from [`Child`]'s stdout.
///
/// See also [`UChild::stdout_bytes] for side effects.
/// See also [`UChild::stdout_bytes`] for side effects.
pub fn stdout(&mut self) -> String {
String::from_utf8(self.stdout_bytes()).unwrap()
}

View file

@ -0,0 +1,2 @@
BLAKE2b (lorem_ipsum.txt) = 0e97a09189e560c3789c0bff1f020166861ef857d1fbfe4574de1842e3c06cabb9575e4af6309a166158c2b408d3c038c1b49d828b35158142cdc0396d1195c3
BLAKE2b (alice_in_wonderland.txt) = 91b8b0f0868e905ad18b8ac35e4a1dacd289857b19258ab5d1e071761af758b0134ec152d4f011fe1825ca889c80c2e072ca70eb50548c25fc49a98937515af4

View file

@ -0,0 +1 @@
BLAKE2b (lorem_ipsum.txt) = 0e97a09189e560c3789c0bff1f020166861ef857d1fbfe4574de1842e3c06cabb9575e4af6309a166158c2b408d3c038c1b49d828b35158142cdc0396d1195c3

View file

@ -0,0 +1 @@
BLAKE2b (-) = 0e97a09189e560c3789c0bff1f020166861ef857d1fbfe4574de1842e3c06cabb9575e4af6309a166158c2b408d3c038c1b49d828b35158142cdc0396d1195c3

View file

@ -0,0 +1,2 @@
MD5 (lorem_ipsum.txt) = cd724690f7dc61775dfac400a71f2caa
MD5 (alice_in_wonderland.txt) = f6fa7033e16166a9589aa1c0388ffd58

View file

@ -0,0 +1 @@
MD5 (lorem_ipsum.txt) = cd724690f7dc61775dfac400a71f2caa

View file

@ -0,0 +1 @@
MD5 (-) = cd724690f7dc61775dfac400a71f2caa

View file

@ -0,0 +1,2 @@
SHA1 (lorem_ipsum.txt) = ab1dd0bae1d8883a3d18a66de6afbd28252cfbef
SHA1 (alice_in_wonderland.txt) = 22b54b2520e8b4fa59eb10719028a4e587c12d1e

View file

@ -0,0 +1 @@
SHA1 (lorem_ipsum.txt) = ab1dd0bae1d8883a3d18a66de6afbd28252cfbef

View file

@ -0,0 +1 @@
SHA1 (-) = ab1dd0bae1d8883a3d18a66de6afbd28252cfbef

View file

@ -0,0 +1,2 @@
SHA224 (lorem_ipsum.txt) = 3de66fbcad106e1b40ab391be56c51d2007eb1f9c655d0f4e29bfc01
SHA224 (alice_in_wonderland.txt) = 54c9c7d78458886418ce0845111fc49fe1c628ffd4bf3da14226ffd9

View file

@ -0,0 +1 @@
SHA224 (lorem_ipsum.txt) = 3de66fbcad106e1b40ab391be56c51d2007eb1f9c655d0f4e29bfc01

View file

@ -0,0 +1 @@
SHA224 (-) = 3de66fbcad106e1b40ab391be56c51d2007eb1f9c655d0f4e29bfc01

View file

@ -0,0 +1,2 @@
SHA256 (lorem_ipsum.txt) = f7c420501c50e00b309250100d67ea5e910981536b4582fe9c435bd92b3f1f02
SHA256 (alice_in_wonderland.txt) = 14ab7e5a0aa3a670222744714bc96961d51012cb216225d965db71824a46e5fe

View file

@ -0,0 +1 @@
SHA256 (lorem_ipsum.txt) = f7c420501c50e00b309250100d67ea5e910981536b4582fe9c435bd92b3f1f02

View file

@ -0,0 +1 @@
SHA256 (-) = f7c420501c50e00b309250100d67ea5e910981536b4582fe9c435bd92b3f1f02

View file

@ -0,0 +1,2 @@
SHA384 (lorem_ipsum.txt) = 4be4b90a0d0d32966992921019f24abc824dcfb8b1c408102f1f6788fb80ba9a9a4c5a7b575a3353a90a8ee719481dcb
SHA384 (alice_in_wonderland.txt) = b7966c97ef84ab5858db2e0cdd33fbaf4fa8346d84de65aba001e738c242598a43272854d0073ad1099404eaa1d93766

View file

@ -0,0 +1 @@
SHA384 (lorem_ipsum.txt) = 4be4b90a0d0d32966992921019f24abc824dcfb8b1c408102f1f6788fb80ba9a9a4c5a7b575a3353a90a8ee719481dcb

View file

@ -0,0 +1 @@
SHA384 (-) = 4be4b90a0d0d32966992921019f24abc824dcfb8b1c408102f1f6788fb80ba9a9a4c5a7b575a3353a90a8ee719481dcb

View file

@ -0,0 +1,2 @@
SHA512 (lorem_ipsum.txt) = 965464ab2556aad58ebc73d89ad221e559797529ecafc0f466c11795cff6d6e2c60f96a07c542cfd1f426e5e4fe0a48aa15667ba44096b213d0813cd038dfa05
SHA512 (alice_in_wonderland.txt) = 251646d5a7eb481e0f3aced7839d78dd5e97153f822dc55938e17059c485990d85d602e2881b528b565ab6262584a69c97b068b26bda81acc9356c53c7c1c96d

View file

@ -0,0 +1 @@
SHA512 (lorem_ipsum.txt) = 965464ab2556aad58ebc73d89ad221e559797529ecafc0f466c11795cff6d6e2c60f96a07c542cfd1f426e5e4fe0a48aa15667ba44096b213d0813cd038dfa05

View file

@ -0,0 +1 @@
SHA512 (-) = 965464ab2556aad58ebc73d89ad221e559797529ecafc0f466c11795cff6d6e2c60f96a07c542cfd1f426e5e4fe0a48aa15667ba44096b213d0813cd038dfa05

View file

@ -0,0 +1,2 @@
SM3 (lorem_ipsum.txt) = 6d296b805d060bfed22808df308dbb9b4317794dd4ed6740a10770a782699bc2
SM3 (alice_in_wonderland.txt) = d66617ae3c4e87828298dcd836f79efbab488c53b84e09c3e8e83a16c902418d

View file

@ -0,0 +1 @@
SM3 (lorem_ipsum.txt) = 6d296b805d060bfed22808df308dbb9b4317794dd4ed6740a10770a782699bc2

View file

@ -0,0 +1 @@
SM3 (-) = 6d296b805d060bfed22808df308dbb9b4317794dd4ed6740a10770a782699bc2

View file

@ -0,0 +1,2 @@
0e97a09189e560c3789c0bff1f020166861ef857d1fbfe4574de1842e3c06cabb9575e4af6309a166158c2b408d3c038c1b49d828b35158142cdc0396d1195c3 lorem_ipsum.txt
91b8b0f0868e905ad18b8ac35e4a1dacd289857b19258ab5d1e071761af758b0134ec152d4f011fe1825ca889c80c2e072ca70eb50548c25fc49a98937515af4 alice_in_wonderland.txt

View file

@ -0,0 +1 @@
0e97a09189e560c3789c0bff1f020166861ef857d1fbfe4574de1842e3c06cabb9575e4af6309a166158c2b408d3c038c1b49d828b35158142cdc0396d1195c3 lorem_ipsum.txt

View file

@ -0,0 +1 @@
0e97a09189e560c3789c0bff1f020166861ef857d1fbfe4574de1842e3c06cabb9575e4af6309a166158c2b408d3c038c1b49d828b35158142cdc0396d1195c3 -

View file

@ -0,0 +1,2 @@
08109 1 lorem_ipsum.txt
01814 1 alice_in_wonderland.txt

View file

@ -0,0 +1 @@
08109 1 lorem_ipsum.txt

View file

@ -0,0 +1 @@
08109 1

View file

@ -0,0 +1,2 @@
378294376 772 lorem_ipsum.txt
3805907707 302 alice_in_wonderland.txt

View file

@ -0,0 +1 @@
378294376 772 lorem_ipsum.txt

View file

@ -0,0 +1 @@
378294376 772

View file

@ -0,0 +1,2 @@
cd724690f7dc61775dfac400a71f2caa lorem_ipsum.txt
f6fa7033e16166a9589aa1c0388ffd58 alice_in_wonderland.txt

View file

@ -0,0 +1 @@
cd724690f7dc61775dfac400a71f2caa lorem_ipsum.txt

View file

@ -0,0 +1 @@
cd724690f7dc61775dfac400a71f2caa -

View file

@ -0,0 +1,2 @@
ab1dd0bae1d8883a3d18a66de6afbd28252cfbef lorem_ipsum.txt
22b54b2520e8b4fa59eb10719028a4e587c12d1e alice_in_wonderland.txt

View file

@ -0,0 +1 @@
ab1dd0bae1d8883a3d18a66de6afbd28252cfbef lorem_ipsum.txt

View file

@ -0,0 +1 @@
ab1dd0bae1d8883a3d18a66de6afbd28252cfbef -

View file

@ -0,0 +1,2 @@
3de66fbcad106e1b40ab391be56c51d2007eb1f9c655d0f4e29bfc01 lorem_ipsum.txt
54c9c7d78458886418ce0845111fc49fe1c628ffd4bf3da14226ffd9 alice_in_wonderland.txt

View file

@ -0,0 +1 @@
3de66fbcad106e1b40ab391be56c51d2007eb1f9c655d0f4e29bfc01 lorem_ipsum.txt

View file

@ -0,0 +1 @@
3de66fbcad106e1b40ab391be56c51d2007eb1f9c655d0f4e29bfc01 -

View file

@ -0,0 +1,2 @@
f7c420501c50e00b309250100d67ea5e910981536b4582fe9c435bd92b3f1f02 lorem_ipsum.txt
14ab7e5a0aa3a670222744714bc96961d51012cb216225d965db71824a46e5fe alice_in_wonderland.txt

View file

@ -0,0 +1 @@
f7c420501c50e00b309250100d67ea5e910981536b4582fe9c435bd92b3f1f02 lorem_ipsum.txt

View file

@ -0,0 +1 @@
f7c420501c50e00b309250100d67ea5e910981536b4582fe9c435bd92b3f1f02 -

View file

@ -0,0 +1,2 @@
4be4b90a0d0d32966992921019f24abc824dcfb8b1c408102f1f6788fb80ba9a9a4c5a7b575a3353a90a8ee719481dcb lorem_ipsum.txt
b7966c97ef84ab5858db2e0cdd33fbaf4fa8346d84de65aba001e738c242598a43272854d0073ad1099404eaa1d93766 alice_in_wonderland.txt

View file

@ -0,0 +1 @@
4be4b90a0d0d32966992921019f24abc824dcfb8b1c408102f1f6788fb80ba9a9a4c5a7b575a3353a90a8ee719481dcb lorem_ipsum.txt

View file

@ -0,0 +1 @@
4be4b90a0d0d32966992921019f24abc824dcfb8b1c408102f1f6788fb80ba9a9a4c5a7b575a3353a90a8ee719481dcb -

View file

@ -0,0 +1,2 @@
965464ab2556aad58ebc73d89ad221e559797529ecafc0f466c11795cff6d6e2c60f96a07c542cfd1f426e5e4fe0a48aa15667ba44096b213d0813cd038dfa05 lorem_ipsum.txt
251646d5a7eb481e0f3aced7839d78dd5e97153f822dc55938e17059c485990d85d602e2881b528b565ab6262584a69c97b068b26bda81acc9356c53c7c1c96d alice_in_wonderland.txt

View file

@ -0,0 +1 @@
965464ab2556aad58ebc73d89ad221e559797529ecafc0f466c11795cff6d6e2c60f96a07c542cfd1f426e5e4fe0a48aa15667ba44096b213d0813cd038dfa05 lorem_ipsum.txt

View file

@ -0,0 +1 @@
965464ab2556aad58ebc73d89ad221e559797529ecafc0f466c11795cff6d6e2c60f96a07c542cfd1f426e5e4fe0a48aa15667ba44096b213d0813cd038dfa05 -

View file

@ -0,0 +1,2 @@
6d296b805d060bfed22808df308dbb9b4317794dd4ed6740a10770a782699bc2 lorem_ipsum.txt
d66617ae3c4e87828298dcd836f79efbab488c53b84e09c3e8e83a16c902418d alice_in_wonderland.txt

View file

@ -0,0 +1 @@
6d296b805d060bfed22808df308dbb9b4317794dd4ed6740a10770a782699bc2 lorem_ipsum.txt

View file

@ -0,0 +1 @@
6d296b805d060bfed22808df308dbb9b4317794dd4ed6740a10770a782699bc2 -

View file

@ -0,0 +1,2 @@
6985 2 lorem_ipsum.txt
27441 1 alice_in_wonderland.txt

View file

@ -0,0 +1 @@
6985 2 lorem_ipsum.txt

View file

@ -0,0 +1 @@
6985 2