mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
Merge branch 'master' into polish-gnu-tests
This commit is contained in:
@@ -154,6 +154,33 @@ jobs:
|
||||
env:
|
||||
RUSTFLAGS: '-Awarnings'
|
||||
|
||||
busybox_test:
|
||||
name: Busybox test suite
|
||||
runs-on: ${{ matrix.job.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
job:
|
||||
- { os: ubuntu-latest }
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Install `rust` toolchain
|
||||
uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: stable
|
||||
default: true
|
||||
profile: minimal # minimal component installation (ie, no documentation)
|
||||
- name: "prepare busytest"
|
||||
shell: bash
|
||||
run: |
|
||||
make prepare-busytest
|
||||
- name: "run busybox testsuite"
|
||||
shell: bash
|
||||
run: |
|
||||
bindir=$(pwd)/target/debug
|
||||
cd tmp/busybox-*/testsuite
|
||||
S=$(bindir=$bindir ./runtest) && printf "%s\n" "$S" || { printf "%s\n" "$S" | grep "FAIL:" | sed -e "s/FAIL: /::warning ::Test failure:/g" ; }
|
||||
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ${{ matrix.job.os }}
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ matrix:
|
||||
- rust: nightly
|
||||
fast_finish: true
|
||||
include:
|
||||
- rust: 1.32.0
|
||||
- rust: 1.33.0
|
||||
env: FEATURES=unix
|
||||
# - rust: stable
|
||||
# os: linux
|
||||
|
||||
Generated
+387
-454
File diff suppressed because it is too large
Load Diff
+98
-98
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "coreutils"
|
||||
version = "0.0.3" # "0.0.3.1"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "coreutils ~ GNU coreutils (updated); implemented as universal (cross-platform) utils, written in Rust"
|
||||
@@ -226,104 +226,104 @@ test = [ "uu_test" ]
|
||||
[dependencies]
|
||||
lazy_static = { version="1.3" }
|
||||
textwrap = { version="=0.11.0", features=["term_size"] } # !maint: [2020-05-10; rivy] unstable crate using undocumented features; pinned currently, will review
|
||||
uucore = { version=">=0.0.6", package="uucore", path="src/uucore" }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="src/uucore" }
|
||||
# * uutils
|
||||
uu_test = { optional=true, version="0.0.3", package="uu_test", path="src/uu/test" }
|
||||
uu_test = { optional=true, version="0.0.4", package="uu_test", path="src/uu/test" }
|
||||
#
|
||||
arch = { optional=true, version="0.0.3", package="uu_arch", path="src/uu/arch" }
|
||||
base32 = { optional=true, version="0.0.3", package="uu_base32", path="src/uu/base32" }
|
||||
base64 = { optional=true, version="0.0.3", package="uu_base64", path="src/uu/base64" }
|
||||
basename = { optional=true, version="0.0.3", package="uu_basename", path="src/uu/basename" }
|
||||
cat = { optional=true, version="0.0.3", package="uu_cat", path="src/uu/cat" }
|
||||
chgrp = { optional=true, version="0.0.3", package="uu_chgrp", path="src/uu/chgrp" }
|
||||
chmod = { optional=true, version="0.0.3", package="uu_chmod", path="src/uu/chmod" }
|
||||
chown = { optional=true, version="0.0.3", package="uu_chown", path="src/uu/chown" }
|
||||
chroot = { optional=true, version="0.0.3", package="uu_chroot", path="src/uu/chroot" }
|
||||
cksum = { optional=true, version="0.0.3", package="uu_cksum", path="src/uu/cksum" }
|
||||
comm = { optional=true, version="0.0.3", package="uu_comm", path="src/uu/comm" }
|
||||
cp = { optional=true, version="0.0.3", package="uu_cp", path="src/uu/cp" }
|
||||
csplit = { optional=true, version="0.0.3", package="uu_csplit", path="src/uu/csplit" }
|
||||
cut = { optional=true, version="0.0.3", package="uu_cut", path="src/uu/cut" }
|
||||
date = { optional=true, version="0.0.3", package="uu_date", path="src/uu/date" }
|
||||
df = { optional=true, version="0.0.3", package="uu_df", path="src/uu/df" }
|
||||
dircolors= { optional=true, version="0.0.3", package="uu_dircolors", path="src/uu/dircolors" }
|
||||
dirname = { optional=true, version="0.0.3", package="uu_dirname", path="src/uu/dirname" }
|
||||
du = { optional=true, version="0.0.3", package="uu_du", path="src/uu/du" }
|
||||
echo = { optional=true, version="0.0.3", package="uu_echo", path="src/uu/echo" }
|
||||
env = { optional=true, version="0.0.3", package="uu_env", path="src/uu/env" }
|
||||
expand = { optional=true, version="0.0.3", package="uu_expand", path="src/uu/expand" }
|
||||
expr = { optional=true, version="0.0.3", package="uu_expr", path="src/uu/expr" }
|
||||
factor = { optional=true, version="0.0.3", package="uu_factor", path="src/uu/factor" }
|
||||
false = { optional=true, version="0.0.3", package="uu_false", path="src/uu/false" }
|
||||
fmt = { optional=true, version="0.0.3", package="uu_fmt", path="src/uu/fmt" }
|
||||
fold = { optional=true, version="0.0.3", package="uu_fold", path="src/uu/fold" }
|
||||
groups = { optional=true, version="0.0.3", package="uu_groups", path="src/uu/groups" }
|
||||
hashsum = { optional=true, version="0.0.3", package="uu_hashsum", path="src/uu/hashsum" }
|
||||
head = { optional=true, version="0.0.3", package="uu_head", path="src/uu/head" }
|
||||
hostid = { optional=true, version="0.0.3", package="uu_hostid", path="src/uu/hostid" }
|
||||
hostname = { optional=true, version="0.0.3", package="uu_hostname", path="src/uu/hostname" }
|
||||
id = { optional=true, version="0.0.3", package="uu_id", path="src/uu/id" }
|
||||
install = { optional=true, version="0.0.3", package="uu_install", path="src/uu/install" }
|
||||
join = { optional=true, version="0.0.3", package="uu_join", path="src/uu/join" }
|
||||
kill = { optional=true, version="0.0.3", package="uu_kill", path="src/uu/kill" }
|
||||
link = { optional=true, version="0.0.3", package="uu_link", path="src/uu/link" }
|
||||
ln = { optional=true, version="0.0.3", package="uu_ln", path="src/uu/ln" }
|
||||
ls = { optional=true, version="0.0.3", package="uu_ls", path="src/uu/ls" }
|
||||
logname = { optional=true, version="0.0.3", package="uu_logname", path="src/uu/logname" }
|
||||
mkdir = { optional=true, version="0.0.3", package="uu_mkdir", path="src/uu/mkdir" }
|
||||
mkfifo = { optional=true, version="0.0.3", package="uu_mkfifo", path="src/uu/mkfifo" }
|
||||
mknod = { optional=true, version="0.0.3", package="uu_mknod", path="src/uu/mknod" }
|
||||
mktemp = { optional=true, version="0.0.3", package="uu_mktemp", path="src/uu/mktemp" }
|
||||
more = { optional=true, version="0.0.3", package="uu_more", path="src/uu/more" }
|
||||
mv = { optional=true, version="0.0.3", package="uu_mv", path="src/uu/mv" }
|
||||
nice = { optional=true, version="0.0.3", package="uu_nice", path="src/uu/nice" }
|
||||
nl = { optional=true, version="0.0.3", package="uu_nl", path="src/uu/nl" }
|
||||
nohup = { optional=true, version="0.0.3", package="uu_nohup", path="src/uu/nohup" }
|
||||
nproc = { optional=true, version="0.0.3", package="uu_nproc", path="src/uu/nproc" }
|
||||
numfmt = { optional=true, version="0.0.3", package="uu_numfmt", path="src/uu/numfmt" }
|
||||
od = { optional=true, version="0.0.3", package="uu_od", path="src/uu/od" }
|
||||
paste = { optional=true, version="0.0.3", package="uu_paste", path="src/uu/paste" }
|
||||
pathchk = { optional=true, version="0.0.3", package="uu_pathchk", path="src/uu/pathchk" }
|
||||
pinky = { optional=true, version="0.0.3", package="uu_pinky", path="src/uu/pinky" }
|
||||
printenv = { optional=true, version="0.0.3", package="uu_printenv", path="src/uu/printenv" }
|
||||
printf = { optional=true, version="0.0.3", package="uu_printf", path="src/uu/printf" }
|
||||
ptx = { optional=true, version="0.0.3", package="uu_ptx", path="src/uu/ptx" }
|
||||
pwd = { optional=true, version="0.0.3", package="uu_pwd", path="src/uu/pwd" }
|
||||
readlink = { optional=true, version="0.0.3", package="uu_readlink", path="src/uu/readlink" }
|
||||
realpath = { optional=true, version="0.0.3", package="uu_realpath", path="src/uu/realpath" }
|
||||
relpath = { optional=true, version="0.0.3", package="uu_relpath", path="src/uu/relpath" }
|
||||
rm = { optional=true, version="0.0.3", package="uu_rm", path="src/uu/rm" }
|
||||
rmdir = { optional=true, version="0.0.3", package="uu_rmdir", path="src/uu/rmdir" }
|
||||
seq = { optional=true, version="0.0.3", package="uu_seq", path="src/uu/seq" }
|
||||
shred = { optional=true, version="0.0.3", package="uu_shred", path="src/uu/shred" }
|
||||
shuf = { optional=true, version="0.0.3", package="uu_shuf", path="src/uu/shuf" }
|
||||
sleep = { optional=true, version="0.0.3", package="uu_sleep", path="src/uu/sleep" }
|
||||
sort = { optional=true, version="0.0.3", package="uu_sort", path="src/uu/sort" }
|
||||
split = { optional=true, version="0.0.3", package="uu_split", path="src/uu/split" }
|
||||
stat = { optional=true, version="0.0.3", package="uu_stat", path="src/uu/stat" }
|
||||
stdbuf = { optional=true, version="0.0.3", package="uu_stdbuf", path="src/uu/stdbuf" }
|
||||
sum = { optional=true, version="0.0.3", package="uu_sum", path="src/uu/sum" }
|
||||
sync = { optional=true, version="0.0.3", package="uu_sync", path="src/uu/sync" }
|
||||
tac = { optional=true, version="0.0.3", package="uu_tac", path="src/uu/tac" }
|
||||
tail = { optional=true, version="0.0.3", package="uu_tail", path="src/uu/tail" }
|
||||
tee = { optional=true, version="0.0.3", package="uu_tee", path="src/uu/tee" }
|
||||
timeout = { optional=true, version="0.0.3", package="uu_timeout", path="src/uu/timeout" }
|
||||
touch = { optional=true, version="0.0.3", package="uu_touch", path="src/uu/touch" }
|
||||
tr = { optional=true, version="0.0.3", package="uu_tr", path="src/uu/tr" }
|
||||
true = { optional=true, version="0.0.3", package="uu_true", path="src/uu/true" }
|
||||
truncate = { optional=true, version="0.0.3", package="uu_truncate", path="src/uu/truncate" }
|
||||
tsort = { optional=true, version="0.0.3", package="uu_tsort", path="src/uu/tsort" }
|
||||
tty = { optional=true, version="0.0.3", package="uu_tty", path="src/uu/tty" }
|
||||
uname = { optional=true, version="0.0.3", package="uu_uname", path="src/uu/uname" }
|
||||
unexpand = { optional=true, version="0.0.3", package="uu_unexpand", path="src/uu/unexpand" }
|
||||
uniq = { optional=true, version="0.0.3", package="uu_uniq", path="src/uu/uniq" }
|
||||
unlink = { optional=true, version="0.0.3", package="uu_unlink", path="src/uu/unlink" }
|
||||
uptime = { optional=true, version="0.0.3", package="uu_uptime", path="src/uu/uptime" }
|
||||
users = { optional=true, version="0.0.3", package="uu_users", path="src/uu/users" }
|
||||
wc = { optional=true, version="0.0.3", package="uu_wc", path="src/uu/wc" }
|
||||
who = { optional=true, version="0.0.3", package="uu_who", path="src/uu/who" }
|
||||
whoami = { optional=true, version="0.0.3", package="uu_whoami", path="src/uu/whoami" }
|
||||
yes = { optional=true, version="0.0.3", package="uu_yes", path="src/uu/yes" }
|
||||
arch = { optional=true, version="0.0.4", package="uu_arch", path="src/uu/arch" }
|
||||
base32 = { optional=true, version="0.0.4", package="uu_base32", path="src/uu/base32" }
|
||||
base64 = { optional=true, version="0.0.4", package="uu_base64", path="src/uu/base64" }
|
||||
basename = { optional=true, version="0.0.4", package="uu_basename", path="src/uu/basename" }
|
||||
cat = { optional=true, version="0.0.4", package="uu_cat", path="src/uu/cat" }
|
||||
chgrp = { optional=true, version="0.0.4", package="uu_chgrp", path="src/uu/chgrp" }
|
||||
chmod = { optional=true, version="0.0.4", package="uu_chmod", path="src/uu/chmod" }
|
||||
chown = { optional=true, version="0.0.4", package="uu_chown", path="src/uu/chown" }
|
||||
chroot = { optional=true, version="0.0.4", package="uu_chroot", path="src/uu/chroot" }
|
||||
cksum = { optional=true, version="0.0.4", package="uu_cksum", path="src/uu/cksum" }
|
||||
comm = { optional=true, version="0.0.4", package="uu_comm", path="src/uu/comm" }
|
||||
cp = { optional=true, version="0.0.4", package="uu_cp", path="src/uu/cp" }
|
||||
csplit = { optional=true, version="0.0.4", package="uu_csplit", path="src/uu/csplit" }
|
||||
cut = { optional=true, version="0.0.4", package="uu_cut", path="src/uu/cut" }
|
||||
date = { optional=true, version="0.0.4", package="uu_date", path="src/uu/date" }
|
||||
df = { optional=true, version="0.0.4", package="uu_df", path="src/uu/df" }
|
||||
dircolors= { optional=true, version="0.0.4", package="uu_dircolors", path="src/uu/dircolors" }
|
||||
dirname = { optional=true, version="0.0.4", package="uu_dirname", path="src/uu/dirname" }
|
||||
du = { optional=true, version="0.0.4", package="uu_du", path="src/uu/du" }
|
||||
echo = { optional=true, version="0.0.4", package="uu_echo", path="src/uu/echo" }
|
||||
env = { optional=true, version="0.0.4", package="uu_env", path="src/uu/env" }
|
||||
expand = { optional=true, version="0.0.4", package="uu_expand", path="src/uu/expand" }
|
||||
expr = { optional=true, version="0.0.4", package="uu_expr", path="src/uu/expr" }
|
||||
factor = { optional=true, version="0.0.4", package="uu_factor", path="src/uu/factor" }
|
||||
false = { optional=true, version="0.0.4", package="uu_false", path="src/uu/false" }
|
||||
fmt = { optional=true, version="0.0.4", package="uu_fmt", path="src/uu/fmt" }
|
||||
fold = { optional=true, version="0.0.4", package="uu_fold", path="src/uu/fold" }
|
||||
groups = { optional=true, version="0.0.4", package="uu_groups", path="src/uu/groups" }
|
||||
hashsum = { optional=true, version="0.0.4", package="uu_hashsum", path="src/uu/hashsum" }
|
||||
head = { optional=true, version="0.0.4", package="uu_head", path="src/uu/head" }
|
||||
hostid = { optional=true, version="0.0.4", package="uu_hostid", path="src/uu/hostid" }
|
||||
hostname = { optional=true, version="0.0.4", package="uu_hostname", path="src/uu/hostname" }
|
||||
id = { optional=true, version="0.0.4", package="uu_id", path="src/uu/id" }
|
||||
install = { optional=true, version="0.0.4", package="uu_install", path="src/uu/install" }
|
||||
join = { optional=true, version="0.0.4", package="uu_join", path="src/uu/join" }
|
||||
kill = { optional=true, version="0.0.4", package="uu_kill", path="src/uu/kill" }
|
||||
link = { optional=true, version="0.0.4", package="uu_link", path="src/uu/link" }
|
||||
ln = { optional=true, version="0.0.4", package="uu_ln", path="src/uu/ln" }
|
||||
ls = { optional=true, version="0.0.4", package="uu_ls", path="src/uu/ls" }
|
||||
logname = { optional=true, version="0.0.4", package="uu_logname", path="src/uu/logname" }
|
||||
mkdir = { optional=true, version="0.0.4", package="uu_mkdir", path="src/uu/mkdir" }
|
||||
mkfifo = { optional=true, version="0.0.4", package="uu_mkfifo", path="src/uu/mkfifo" }
|
||||
mknod = { optional=true, version="0.0.4", package="uu_mknod", path="src/uu/mknod" }
|
||||
mktemp = { optional=true, version="0.0.4", package="uu_mktemp", path="src/uu/mktemp" }
|
||||
more = { optional=true, version="0.0.4", package="uu_more", path="src/uu/more" }
|
||||
mv = { optional=true, version="0.0.4", package="uu_mv", path="src/uu/mv" }
|
||||
nice = { optional=true, version="0.0.4", package="uu_nice", path="src/uu/nice" }
|
||||
nl = { optional=true, version="0.0.4", package="uu_nl", path="src/uu/nl" }
|
||||
nohup = { optional=true, version="0.0.4", package="uu_nohup", path="src/uu/nohup" }
|
||||
nproc = { optional=true, version="0.0.4", package="uu_nproc", path="src/uu/nproc" }
|
||||
numfmt = { optional=true, version="0.0.4", package="uu_numfmt", path="src/uu/numfmt" }
|
||||
od = { optional=true, version="0.0.4", package="uu_od", path="src/uu/od" }
|
||||
paste = { optional=true, version="0.0.4", package="uu_paste", path="src/uu/paste" }
|
||||
pathchk = { optional=true, version="0.0.4", package="uu_pathchk", path="src/uu/pathchk" }
|
||||
pinky = { optional=true, version="0.0.4", package="uu_pinky", path="src/uu/pinky" }
|
||||
printenv = { optional=true, version="0.0.4", package="uu_printenv", path="src/uu/printenv" }
|
||||
printf = { optional=true, version="0.0.4", package="uu_printf", path="src/uu/printf" }
|
||||
ptx = { optional=true, version="0.0.4", package="uu_ptx", path="src/uu/ptx" }
|
||||
pwd = { optional=true, version="0.0.4", package="uu_pwd", path="src/uu/pwd" }
|
||||
readlink = { optional=true, version="0.0.4", package="uu_readlink", path="src/uu/readlink" }
|
||||
realpath = { optional=true, version="0.0.4", package="uu_realpath", path="src/uu/realpath" }
|
||||
relpath = { optional=true, version="0.0.4", package="uu_relpath", path="src/uu/relpath" }
|
||||
rm = { optional=true, version="0.0.4", package="uu_rm", path="src/uu/rm" }
|
||||
rmdir = { optional=true, version="0.0.4", package="uu_rmdir", path="src/uu/rmdir" }
|
||||
seq = { optional=true, version="0.0.4", package="uu_seq", path="src/uu/seq" }
|
||||
shred = { optional=true, version="0.0.4", package="uu_shred", path="src/uu/shred" }
|
||||
shuf = { optional=true, version="0.0.4", package="uu_shuf", path="src/uu/shuf" }
|
||||
sleep = { optional=true, version="0.0.4", package="uu_sleep", path="src/uu/sleep" }
|
||||
sort = { optional=true, version="0.0.4", package="uu_sort", path="src/uu/sort" }
|
||||
split = { optional=true, version="0.0.4", package="uu_split", path="src/uu/split" }
|
||||
stat = { optional=true, version="0.0.4", package="uu_stat", path="src/uu/stat" }
|
||||
stdbuf = { optional=true, version="0.0.4", package="uu_stdbuf", path="src/uu/stdbuf" }
|
||||
sum = { optional=true, version="0.0.4", package="uu_sum", path="src/uu/sum" }
|
||||
sync = { optional=true, version="0.0.4", package="uu_sync", path="src/uu/sync" }
|
||||
tac = { optional=true, version="0.0.4", package="uu_tac", path="src/uu/tac" }
|
||||
tail = { optional=true, version="0.0.4", package="uu_tail", path="src/uu/tail" }
|
||||
tee = { optional=true, version="0.0.4", package="uu_tee", path="src/uu/tee" }
|
||||
timeout = { optional=true, version="0.0.4", package="uu_timeout", path="src/uu/timeout" }
|
||||
touch = { optional=true, version="0.0.4", package="uu_touch", path="src/uu/touch" }
|
||||
tr = { optional=true, version="0.0.4", package="uu_tr", path="src/uu/tr" }
|
||||
true = { optional=true, version="0.0.4", package="uu_true", path="src/uu/true" }
|
||||
truncate = { optional=true, version="0.0.4", package="uu_truncate", path="src/uu/truncate" }
|
||||
tsort = { optional=true, version="0.0.4", package="uu_tsort", path="src/uu/tsort" }
|
||||
tty = { optional=true, version="0.0.4", package="uu_tty", path="src/uu/tty" }
|
||||
uname = { optional=true, version="0.0.4", package="uu_uname", path="src/uu/uname" }
|
||||
unexpand = { optional=true, version="0.0.4", package="uu_unexpand", path="src/uu/unexpand" }
|
||||
uniq = { optional=true, version="0.0.4", package="uu_uniq", path="src/uu/uniq" }
|
||||
unlink = { optional=true, version="0.0.4", package="uu_unlink", path="src/uu/unlink" }
|
||||
uptime = { optional=true, version="0.0.4", package="uu_uptime", path="src/uu/uptime" }
|
||||
users = { optional=true, version="0.0.4", package="uu_users", path="src/uu/users" }
|
||||
wc = { optional=true, version="0.0.4", package="uu_wc", path="src/uu/wc" }
|
||||
who = { optional=true, version="0.0.4", package="uu_who", path="src/uu/who" }
|
||||
whoami = { optional=true, version="0.0.4", package="uu_whoami", path="src/uu/whoami" }
|
||||
yes = { optional=true, version="0.0.4", package="uu_yes", path="src/uu/yes" }
|
||||
#
|
||||
# * pinned transitive dependencies
|
||||
pin_cc = { version="1.0.61, < 1.0.62", package="cc" } ## cc v1.0.62 has compiler errors for MinRustV v1.32.0, requires 1.34 (for `std::str::split_ascii_whitespace()`)
|
||||
@@ -346,7 +346,7 @@ sha1 = { version="0.6", features=["std"] }
|
||||
tempfile = "= 3.1.0"
|
||||
time = "0.1"
|
||||
unindent = "0.1"
|
||||
uucore = { version=">=0.0.6", package="uucore", path="src/uucore", features=["entries"] }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="src/uucore", features=["entries"] }
|
||||
|
||||
[target.'cfg(unix)'.dev-dependencies]
|
||||
rust-users = { version="0.10", package="users" }
|
||||
|
||||
+5
-3
@@ -41,7 +41,7 @@ PKG_BUILDDIR := $(BUILDDIR)/deps
|
||||
DOCSDIR := $(BASEDIR)/docs
|
||||
|
||||
BUSYBOX_ROOT := $(BASEDIR)/tmp
|
||||
BUSYBOX_VER := 1.24.1
|
||||
BUSYBOX_VER := 1.32.1
|
||||
BUSYBOX_SRC := $(BUSYBOX_ROOT)/busybox-$(BUSYBOX_VER)
|
||||
|
||||
# Possible programs
|
||||
@@ -228,7 +228,7 @@ endif
|
||||
|
||||
define TEST_BUSYBOX
|
||||
test_busybox_$(1):
|
||||
(cd $(BUSYBOX_SRC)/testsuite && bindir=$(BUILDDIR) ./runtest $(RUNTEST_ARGS) $(1) )
|
||||
-(cd $(BUSYBOX_SRC)/testsuite && bindir=$(BUILDDIR) ./runtest $(RUNTEST_ARGS) $(1))
|
||||
endef
|
||||
|
||||
# Output names
|
||||
@@ -276,9 +276,11 @@ $(BUILDDIR)/.config: $(BASEDIR)/.busybox-config
|
||||
|
||||
# Test under the busybox testsuite
|
||||
$(BUILDDIR)/busybox: busybox-src build-uutils $(BUILDDIR)/.config
|
||||
cp $(BUILDDIR)/uutils $(BUILDDIR)/busybox; \
|
||||
cp $(BUILDDIR)/coreutils $(BUILDDIR)/busybox; \
|
||||
chmod +x $@;
|
||||
|
||||
prepare-busytest: $(BUILDDIR)/busybox
|
||||
|
||||
ifeq ($(EXES),)
|
||||
busytest:
|
||||
else
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
uutils coreutils
|
||||
================
|
||||
|
||||
[](https://crates.io/crates/coreutils)
|
||||
[](https://discord.gg/wQVJbvJ)
|
||||
[](https://github.com/uutils/coreutils/blob/master/LICENSE)
|
||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fuutils%2Fcoreutils?ref=badge_shield)
|
||||
[](https://github.com/Aaronepower/tokei)
|
||||
[](https://deps.rs/repo/github/uutils/coreutils)
|
||||
|
||||
[](https://travis-ci.org/uutils/coreutils)
|
||||
[](https://ci.appveyor.com/project/Arcterus/coreutils)
|
||||
[](https://cirrus-ci.com/github/uutils/coreutils/master)
|
||||
[](https://codecov.io/gh/uutils/coreutils)
|
||||
|
||||
@@ -115,7 +114,7 @@ Installation Instructions
|
||||
|
||||
Likewise, installing can simply be done using:
|
||||
```bash
|
||||
$ cargo install
|
||||
$ cargo install --path .
|
||||
```
|
||||
|
||||
This command will install uutils into Cargo's *bin* folder (*e.g.* `$HOME/.cargo/bin`).
|
||||
@@ -380,4 +379,4 @@ License
|
||||
|
||||
uutils is licensed under the MIT License - see the `LICENSE` file for details
|
||||
|
||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fuutils%2Fcoreutils?ref=badge_large)
|
||||
GNU Coreutils is licensed under the GPL 3.0 or later.
|
||||
|
||||
@@ -19,7 +19,7 @@ include!(concat!(env!("OUT_DIR"), "/uutils_map.rs"));
|
||||
fn usage<T>(utils: &UtilityMap<T>, name: &str) {
|
||||
println!("{} {} (multi-call binary)\n", name, VERSION);
|
||||
println!("Usage: {} [function [arguments...]]\n", name);
|
||||
println!("Currently defined functions/utilities:\n");
|
||||
println!("Currently defined functions:\n");
|
||||
#[allow(clippy::map_clone)]
|
||||
let mut utils: Vec<&str> = utils.keys().map(|&s| s).collect();
|
||||
utils.sort_unstable();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_arch"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "arch ~ (uutils) display machine architecture"
|
||||
@@ -15,8 +15,8 @@ edition = "2018"
|
||||
path = "src/arch.rs"
|
||||
|
||||
[dependencies]
|
||||
platform-info = "0.0.1"
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore" }
|
||||
platform-info = "0.1"
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore" }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
[[bin]]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_base32"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "base32 ~ (uutils) decode/encode input (base32-encoding)"
|
||||
@@ -15,7 +15,7 @@ edition = "2018"
|
||||
path = "src/base32.rs"
|
||||
|
||||
[dependencies]
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore", features = ["encoding"] }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore", features = ["encoding"] }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
[[bin]]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_base64"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "base64 ~ (uutils) decode/encode input (base64-encoding)"
|
||||
@@ -15,7 +15,7 @@ edition = "2018"
|
||||
path = "src/base64.rs"
|
||||
|
||||
[dependencies]
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore", features = ["encoding"] }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore", features = ["encoding"] }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
[[bin]]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_basename"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "basename ~ (uutils) display PATHNAME with leading directory components removed"
|
||||
@@ -15,7 +15,7 @@ edition = "2018"
|
||||
path = "src/basename.rs"
|
||||
|
||||
[dependencies]
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore" }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore" }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
[[bin]]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_cat"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "cat ~ (uutils) concatenate and display input"
|
||||
@@ -16,7 +16,7 @@ path = "src/cat.rs"
|
||||
|
||||
[dependencies]
|
||||
quick-error = "1.2.3"
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore", features=["fs"] }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore", features=["fs"] }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
[target.'cfg(unix)'.dependencies]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_chgrp"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "chgrp ~ (uutils) change the group ownership of FILE"
|
||||
@@ -15,7 +15,7 @@ edition = "2018"
|
||||
path = "src/chgrp.rs"
|
||||
|
||||
[dependencies]
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore", features=["entries", "fs", "perms"] }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore", features=["entries", "fs", "perms"] }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
walkdir = "2.2"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_chmod"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "chmod ~ (uutils) change mode of FILE"
|
||||
@@ -16,7 +16,7 @@ path = "src/chmod.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "0.2.42"
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore", features=["fs", "mode"] }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore", features=["fs", "mode"] }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
walkdir = "2.2"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_chown"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "chown ~ (uutils) change the ownership of FILE"
|
||||
@@ -17,7 +17,7 @@ path = "src/chown.rs"
|
||||
[dependencies]
|
||||
clap = "2.33"
|
||||
glob = "0.3.0"
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore", features=["entries", "fs", "perms"] }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore", features=["entries", "fs", "perms"] }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
walkdir = "2.2"
|
||||
|
||||
|
||||
+65
-53
@@ -27,20 +27,30 @@ use std::path::Path;
|
||||
static ABOUT: &str = "change file owner and group";
|
||||
static VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||
|
||||
static OPT_CHANGES: &str = "changes";
|
||||
static OPT_DEREFERENCE: &str = "dereference";
|
||||
static OPT_NO_DEREFERENCE: &str = "no-dereference";
|
||||
static OPT_FROM: &str = "from";
|
||||
static OPT_PRESERVE_ROOT: &str = "preserve-root";
|
||||
static OPT_NO_PRESERVE_ROOT: &str = "no-preserve-root";
|
||||
static OPT_QUIET: &str = "quiet";
|
||||
static OPT_RECURSIVE: &str = "recursive";
|
||||
static OPT_REFERENCE: &str = "reference";
|
||||
static OPT_SILENT: &str = "silent";
|
||||
static OPT_TRAVERSE: &str = "H";
|
||||
static OPT_NO_TRAVERSE: &str = "P";
|
||||
static OPT_TRAVERSE_EVERY: &str = "L";
|
||||
static OPT_VERBOSE: &str = "verbose";
|
||||
pub mod options {
|
||||
pub mod verbosity {
|
||||
pub static CHANGES: &str = "changes";
|
||||
pub static QUIET: &str = "quiet";
|
||||
pub static SILENT: &str = "silent";
|
||||
pub static VERBOSE: &str = "verbose";
|
||||
}
|
||||
pub mod preserve_root {
|
||||
pub static PRESERVE: &str = "preserve-root";
|
||||
pub static NO_PRESERVE: &str = "no-preserve-root";
|
||||
}
|
||||
pub mod dereference {
|
||||
pub static DEREFERENCE: &str = "dereference";
|
||||
pub static NO_DEREFERENCE: &str = "no-dereference";
|
||||
}
|
||||
pub static FROM: &str = "from";
|
||||
pub static RECURSIVE: &str = "recursive";
|
||||
pub mod traverse {
|
||||
pub static TRAVERSE: &str = "H";
|
||||
pub static NO_TRAVERSE: &str = "P";
|
||||
pub static EVERY: &str = "L";
|
||||
}
|
||||
pub static REFERENCE: &str = "reference";
|
||||
}
|
||||
|
||||
static ARG_OWNER: &str = "owner";
|
||||
static ARG_FILES: &str = "files";
|
||||
@@ -66,80 +76,80 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||
.about(ABOUT)
|
||||
.usage(&usage[..])
|
||||
.arg(
|
||||
Arg::with_name(OPT_CHANGES)
|
||||
Arg::with_name(options::verbosity::CHANGES)
|
||||
.short("c")
|
||||
.long(OPT_CHANGES)
|
||||
.long(options::verbosity::CHANGES)
|
||||
.help("like verbose but report only when a change is made"),
|
||||
)
|
||||
.arg(Arg::with_name(OPT_DEREFERENCE).long(OPT_DEREFERENCE).help(
|
||||
.arg(Arg::with_name(options::dereference::DEREFERENCE).long(options::dereference::DEREFERENCE).help(
|
||||
"affect the referent of each symbolic link (this is the default), rather than the symbolic link itself",
|
||||
))
|
||||
.arg(
|
||||
Arg::with_name(OPT_NO_DEREFERENCE)
|
||||
Arg::with_name(options::dereference::NO_DEREFERENCE)
|
||||
.short("h")
|
||||
.long(OPT_NO_DEREFERENCE)
|
||||
.long(options::dereference::NO_DEREFERENCE)
|
||||
.help(
|
||||
"affect symbolic links instead of any referenced file (useful only on systems that can change the ownership of a symlink)",
|
||||
),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_FROM)
|
||||
.long(OPT_FROM)
|
||||
Arg::with_name(options::FROM)
|
||||
.long(options::FROM)
|
||||
.help(
|
||||
"change the owner and/or group of each file only if its current owner and/or group match those specified here. Either may be omitted, in which case a match is not required for the omitted attribute",
|
||||
)
|
||||
.value_name("CURRENT_OWNER:CURRENT_GROUP"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_PRESERVE_ROOT)
|
||||
.long(OPT_PRESERVE_ROOT)
|
||||
Arg::with_name(options::preserve_root::PRESERVE)
|
||||
.long(options::preserve_root::PRESERVE)
|
||||
.help("fail to operate recursively on '/'"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_NO_PRESERVE_ROOT)
|
||||
.long(OPT_NO_PRESERVE_ROOT)
|
||||
Arg::with_name(options::preserve_root::NO_PRESERVE)
|
||||
.long(options::preserve_root::NO_PRESERVE)
|
||||
.help("do not treat '/' specially (the default)"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_QUIET)
|
||||
.long(OPT_QUIET)
|
||||
Arg::with_name(options::verbosity::QUIET)
|
||||
.long(options::verbosity::QUIET)
|
||||
.help("suppress most error messages"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_RECURSIVE)
|
||||
Arg::with_name(options::RECURSIVE)
|
||||
.short("R")
|
||||
.long(OPT_RECURSIVE)
|
||||
.long(options::RECURSIVE)
|
||||
.help("operate on files and directories recursively"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_REFERENCE)
|
||||
.long(OPT_REFERENCE)
|
||||
Arg::with_name(options::REFERENCE)
|
||||
.long(options::REFERENCE)
|
||||
.help("use RFILE's owner and group rather than specifying OWNER:GROUP values")
|
||||
.value_name("RFILE")
|
||||
.min_values(1),
|
||||
)
|
||||
.arg(Arg::with_name(OPT_SILENT).short("f").long(OPT_SILENT))
|
||||
.arg(Arg::with_name(options::verbosity::SILENT).short("f").long(options::verbosity::SILENT))
|
||||
.arg(
|
||||
Arg::with_name(OPT_TRAVERSE)
|
||||
.short(OPT_TRAVERSE)
|
||||
Arg::with_name(options::traverse::TRAVERSE)
|
||||
.short(options::traverse::TRAVERSE)
|
||||
.help("if a command line argument is a symbolic link to a directory, traverse it")
|
||||
.overrides_with_all(&[OPT_TRAVERSE_EVERY, OPT_NO_TRAVERSE]),
|
||||
.overrides_with_all(&[options::traverse::EVERY, options::traverse::NO_TRAVERSE]),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_TRAVERSE_EVERY)
|
||||
.short(OPT_TRAVERSE_EVERY)
|
||||
Arg::with_name(options::traverse::EVERY)
|
||||
.short(options::traverse::EVERY)
|
||||
.help("traverse every symbolic link to a directory encountered")
|
||||
.overrides_with_all(&[OPT_TRAVERSE, OPT_NO_TRAVERSE]),
|
||||
.overrides_with_all(&[options::traverse::TRAVERSE, options::traverse::NO_TRAVERSE]),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_NO_TRAVERSE)
|
||||
.short(OPT_NO_TRAVERSE)
|
||||
Arg::with_name(options::traverse::NO_TRAVERSE)
|
||||
.short(options::traverse::NO_TRAVERSE)
|
||||
.help("do not traverse any symbolic links (default)")
|
||||
.overrides_with_all(&[OPT_TRAVERSE, OPT_TRAVERSE_EVERY]),
|
||||
.overrides_with_all(&[options::traverse::TRAVERSE, options::traverse::EVERY]),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(OPT_VERBOSE)
|
||||
.long(OPT_VERBOSE)
|
||||
Arg::with_name(options::verbosity::VERBOSE)
|
||||
.long(options::verbosity::VERBOSE)
|
||||
.help("output a diagnostic for every file processed"),
|
||||
)
|
||||
.arg(
|
||||
@@ -166,23 +176,23 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||
.map(|v| v.map(ToString::to_string).collect())
|
||||
.unwrap_or_default();
|
||||
|
||||
let preserve_root = matches.is_present(OPT_PRESERVE_ROOT);
|
||||
let preserve_root = matches.is_present(options::preserve_root::PRESERVE);
|
||||
|
||||
let mut derefer = if matches.is_present(OPT_NO_DEREFERENCE) {
|
||||
let mut derefer = if matches.is_present(options::dereference::NO_DEREFERENCE) {
|
||||
1
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
let mut bit_flag = if matches.is_present(OPT_TRAVERSE) {
|
||||
let mut bit_flag = if matches.is_present(options::traverse::TRAVERSE) {
|
||||
FTS_COMFOLLOW | FTS_PHYSICAL
|
||||
} else if matches.is_present(OPT_TRAVERSE_EVERY) {
|
||||
} else if matches.is_present(options::traverse::EVERY) {
|
||||
FTS_LOGICAL
|
||||
} else {
|
||||
FTS_PHYSICAL
|
||||
};
|
||||
|
||||
let recursive = matches.is_present(OPT_RECURSIVE);
|
||||
let recursive = matches.is_present(options::RECURSIVE);
|
||||
if recursive {
|
||||
if bit_flag == FTS_PHYSICAL {
|
||||
if derefer == 1 {
|
||||
@@ -195,17 +205,19 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||
bit_flag = FTS_PHYSICAL;
|
||||
}
|
||||
|
||||
let verbosity = if matches.is_present(OPT_CHANGES) {
|
||||
let verbosity = if matches.is_present(options::verbosity::CHANGES) {
|
||||
Verbosity::Changes
|
||||
} else if matches.is_present(OPT_SILENT) || matches.is_present(OPT_QUIET) {
|
||||
} else if matches.is_present(options::verbosity::SILENT)
|
||||
|| matches.is_present(options::verbosity::QUIET)
|
||||
{
|
||||
Verbosity::Silent
|
||||
} else if matches.is_present(OPT_VERBOSE) {
|
||||
} else if matches.is_present(options::verbosity::VERBOSE) {
|
||||
Verbosity::Verbose
|
||||
} else {
|
||||
Verbosity::Normal
|
||||
};
|
||||
|
||||
let filter = if let Some(spec) = matches.value_of(OPT_FROM) {
|
||||
let filter = if let Some(spec) = matches.value_of(options::FROM) {
|
||||
match parse_spec(&spec) {
|
||||
Ok((Some(uid), None)) => IfFrom::User(uid),
|
||||
Ok((None, Some(gid))) => IfFrom::Group(gid),
|
||||
@@ -222,7 +234,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||
|
||||
let dest_uid: Option<u32>;
|
||||
let dest_gid: Option<u32>;
|
||||
if let Some(file) = matches.value_of(OPT_REFERENCE) {
|
||||
if let Some(file) = matches.value_of(options::REFERENCE) {
|
||||
match fs::metadata(&file) {
|
||||
Ok(meta) => {
|
||||
dest_gid = Some(meta.gid());
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_chroot"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "chroot ~ (uutils) run COMMAND under a new root directory"
|
||||
@@ -16,7 +16,7 @@ path = "src/chroot.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "0.2.18"
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore", features=["entries"] }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore", features=["entries"] }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
[[bin]]
|
||||
|
||||
@@ -164,7 +164,7 @@ fn set_main_group(group: &str) {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(target_os = "macos", target_os = "freebsd"))]
|
||||
#[cfg(any(target_vendor = "apple", target_os = "freebsd"))]
|
||||
fn set_groups(groups: Vec<libc::gid_t>) -> libc::c_int {
|
||||
unsafe { setgroups(groups.len() as libc::c_int, groups.as_ptr()) }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_cksum"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "cksum ~ (uutils) display CRC and size of input"
|
||||
@@ -16,7 +16,7 @@ path = "src/cksum.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "0.2.42"
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore" }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore" }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
[[bin]]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "uu_comm"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = ["uutils developers"]
|
||||
license = "MIT"
|
||||
description = "comm ~ (uutils) compare sorted inputs"
|
||||
@@ -17,7 +17,7 @@ path = "src/comm.rs"
|
||||
[dependencies]
|
||||
getopts = "0.2.18"
|
||||
libc = "0.2.42"
|
||||
uucore = { version=">=0.0.6", package="uucore", path="../../uucore" }
|
||||
uucore = { version=">=0.0.7", package="uucore", path="../../uucore" }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
[[bin]]
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user