Merge pull request #1530 from @rivy (create publishable coreutils)

Change ~ create a publishable version of `coreutils`
This commit is contained in:
Roy Ivy III
2020-06-01 18:26:37 -05:00
committed by GitHub
445 changed files with 4461 additions and 3496 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
# spell-checker:words POSIX SDK SDKs repo toolchain toolchains
# spell-checker:ignore ABI ARCH BACKTRACE BINDIR COMNTOOLS MINGW MINGWDIR MSVC MSYS USERPROFILE cl dllcrt findstr maint mkdir rustc rustlib rustup targetting uutils vcvarsall
# spell-checker:ignore ABI ARCH BACKTRACE BINDIR COMNTOOLS MINGW MINGWDIR MSVC MSYS USERPROFILE cl dllcrt findstr maint mkdir rustc rustlib rustup uutils vcvarsall
version: "{build} ~ {branch}"
+71 -27
View File
@@ -4,13 +4,12 @@ name: CICD
# spell-checker:ignore (env/flags) Ccodegen Coverflow RUSTFLAGS
# spell-checker:ignore (jargon) SHAs deps softprops toolchain
# spell-checker:ignore (names) CodeCOV MacOS MinGW Peltoche rivy
# spell-checker:ignore (shell/tools) choco clippy dmake esac fakeroot gmake grcov halium lcov libssl mkdir popd printf pushd rustc rustfmt rustup shopt xargs
# spell-checker:ignore (misc) alnum gnueabihf issuecomment maint nullglob onexitbegin onexitend uutils
# spell-checker:ignore (shell/tools) choco clippy dmake dpkg esac fakeroot gmake grcov halium lcov libssl mkdir popd printf pushd rustc rustfmt rustup shopt xargs
# spell-checker:ignore (misc) aarch alnum armhf coreutils gnueabihf issuecomment maint nullglob onexitbegin onexitend uutils
env:
PROJECT_NAME: uutils
PROJECT_DESC: "'Universal' (cross-platform) CLI utilities"
PROJECT_NAME: coreutils
PROJECT_DESC: "Core universal (cross-platform) utilities"
PROJECT_AUTH: "uutils"
RUST_MIN_SRV: "1.31.0" ## v1.31.0 == "Rust 2018" (2018-12-06)
RUST_COV_SRV: "2020-04-29" ## (~v1.45.0) supported rust version for code coverage; (date required/used by 'coverage') ## !maint: refactor when code coverage support is included in the stable channel
@@ -35,11 +34,6 @@ jobs:
shell: bash
run: |
## VARs setup
# #maint: [rivy; 2020-02-08] 'windows-latest' `cargo fmt` is bugged for this project (see reasons @ GH:rust-lang/rustfmt #3324, #3590, #3688 ; waiting for repair)
JOB_DO_FORMAT_TESTING="true"
case '${{ matrix.job.os }}' in windows-latest) unset JOB_DO_FORMAT_TESTING ;; esac;
echo set-output name=JOB_DO_FORMAT_TESTING::${JOB_DO_FORMAT_TESTING:-<empty>/false}
echo ::set-output name=JOB_DO_FORMAT_TESTING::${JOB_DO_FORMAT_TESTING}
# target-specific options
# * CARGO_FEATURES_OPTION
CARGO_FEATURES_OPTION='' ;
@@ -54,14 +48,12 @@ jobs:
profile: minimal # minimal component installation (ie, no documentation)
components: rustfmt, clippy
- name: "`fmt` testing"
if: steps.vars.outputs.JOB_DO_FORMAT_TESTING
shell: bash
run: |
# `fmt` testing
# * convert any warnings to GHA UI annotations; ref: <https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message>
S=$(cargo fmt -- --check) && printf "%s\n" "$S" || { printf "%s\n" "$S" | sed -E -n -e "s/^Diff[[:space:]]+in[[:space:]]+${PWD//\//\\/}\/(.*)[[:space:]]+at[[:space:]]+[^0-9]+([0-9]+).*$/::warning file=\1,line=\2::WARNING: \`cargo fmt\`: style violation/p" ; }
- name: "`fmt` testing of tests"
if: steps.vars.outputs.JOB_DO_FORMAT_TESTING
shell: bash
run: |
# `fmt` testing of tests
@@ -130,7 +122,10 @@ jobs:
job:
# { os, target, cargo-options, features, use-cross, toolchain }
- { os: ubuntu-latest , target: arm-unknown-linux-gnueabihf , features: feat_os_unix_gnueabihf , use-cross: use-cross }
- { os: ubuntu-latest , target: aarch64-unknown-linux-gnu , features: feat_os_unix_gnueabihf , use-cross: use-cross }
- { os: ubuntu-16.04 , target: x86_64-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross }
# - { os: ubuntu-18.04 , target: i586-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross } ## note: older windows platform; not required, dev-FYI only
# - { os: ubuntu-18.04 , target: i586-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross } ## note: older windows platform; not required, dev-FYI only
- { os: ubuntu-18.04 , target: i686-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross }
- { os: ubuntu-18.04 , target: i686-unknown-linux-musl , features: feat_os_unix_musl , use-cross: use-cross }
- { os: ubuntu-18.04 , target: x86_64-unknown-linux-gnu , features: feat_os_unix , use-cross: use-cross }
@@ -148,6 +143,7 @@ jobs:
## install/setup prerequisites
case '${{ matrix.job.target }}' in
arm-unknown-linux-gnueabihf) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
esac
- name: Initialize workflow variables
id: vars
@@ -186,7 +182,14 @@ jobs:
echo ::set-output name=REF_TAG::${REF_TAG}
echo ::set-output name=REF_SHAS::${REF_SHAS}
# parse target
unset TARGET_ARCH ; case '${{ matrix.job.target }}' in arm-unknown-linux-gnueabihf) TARGET_ARCH=arm ;; i686-*) TARGET_ARCH=i686 ;; x86_64-*) TARGET_ARCH=x86_64 ;; esac;
unset TARGET_ARCH
case '${{ matrix.job.target }}' in
aarch64-*) TARGET_ARCH=arm64 ;;
arm-*-*hf) TARGET_ARCH=armhf ;;
i586-*) TARGET_ARCH=i586 ;;
i686-*) TARGET_ARCH=i686 ;;
x86_64-*) TARGET_ARCH=x86_64 ;;
esac;
echo set-output name=TARGET_ARCH::${TARGET_ARCH}
echo ::set-output name=TARGET_ARCH::${TARGET_ARCH}
unset TARGET_OS ; case '${{ matrix.job.target }}' in *-linux-*) TARGET_OS=linux ;; *-apple-*) TARGET_OS=macos ;; *-windows-*) TARGET_OS=windows ;; esac;
@@ -203,9 +206,34 @@ jobs:
echo ::set-output name=PKG_BASENAME::${PKG_BASENAME}
echo ::set-output name=PKG_NAME::${PKG_NAME}
# deployable tag? (ie, leading "vM" or "M"; M == version number)
unset DEPLOYABLE ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DEPLOYABLE='true' ; fi
echo set-output name=DEPLOYABLE::${DEPLOYABLE:-<empty>/false}
echo ::set-output name=DEPLOYABLE::${DEPLOYABLE}
unset DEPLOY ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DEPLOY='true' ; fi
echo set-output name=DEPLOY::${DEPLOY:-<empty>/false}
echo ::set-output name=DEPLOY::${DEPLOY}
# DPKG architecture?
unset DPKG_ARCH
case ${{ matrix.job.target }} in
x86_64-*-linux-*) DPKG_ARCH=amd64 ;;
*-linux-*) DPKG_ARCH=${TARGET_ARCH} ;;
esac
echo set-output name=DPKG_ARCH::${DPKG_ARCH}
echo ::set-output name=DPKG_ARCH::${DPKG_ARCH}
# DPKG version?
unset DPKG_VERSION ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DPKG_VERSION=${REF_TAG/#[vV]/} ; fi
echo set-output name=DPKG_VERSION::${DPKG_VERSION}
echo ::set-output name=DPKG_VERSION::${DPKG_VERSION}
# DPKG base name/conflicts?
DPKG_BASENAME=${PROJECT_NAME}
DPKG_CONFLICTS=${PROJECT_NAME}-musl
case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${PROJECT_NAME}-musl ; DPKG_CONFLICTS=${PROJECT_NAME} ;; esac;
echo set-output name=DPKG_BASENAME::${DPKG_BASENAME}
echo set-output name=DPKG_CONFLICTS::${DPKG_CONFLICTS}
echo ::set-output name=DPKG_BASENAME::${DPKG_BASENAME}
echo ::set-output name=DPKG_CONFLICTS::${DPKG_CONFLICTS}
# DPKG name
unset DPKG_NAME;
if [[ -n $DPKG_ARCH && -n $DPKG_VERSION ]]; then DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb" ; fi
echo set-output name=DPKG_NAME::${DPKG_NAME}
echo ::set-output name=DPKG_NAME::${DPKG_NAME}
# target-specific options
# * CARGO_FEATURES_OPTION
CARGO_FEATURES_OPTION='' ;
@@ -216,18 +244,17 @@ jobs:
CARGO_USE_CROSS='true' ; case '${{ matrix.job.use-cross }}' in ''|0|f|false|n|no) unset CARGO_USE_CROSS ;; esac;
echo set-output name=CARGO_USE_CROSS::${CARGO_USE_CROSS:-<empty>/false}
echo ::set-output name=CARGO_USE_CROSS::${CARGO_USE_CROSS}
# # * `arm` cannot be tested on ubuntu-* hosts (b/c testing is currently primarily done via comparison of target outputs with built-in outputs and the `arm` target is not executable on the host)
JOB_DO_TESTING="true"
case '${{ matrix.job.target }}' in arm-*) unset JOB_DO_TESTING ;; esac;
echo set-output name=JOB_DO_TESTING::${JOB_DO_TESTING:-<empty>/false}
echo ::set-output name=JOB_DO_TESTING::${JOB_DO_TESTING}
# # * test only binary for arm-type targets
unset CARGO_TEST_OPTIONS
unset CARGO_TEST_OPTIONS ; case '${{ matrix.job.target }}' in arm-*) CARGO_TEST_OPTIONS="--bin ${PROJECT_NAME}" ;; esac;
# * test only library and/or binaries for arm-type targets
unset CARGO_TEST_OPTIONS ; case '${{ matrix.job.target }}' in aarch64-* | arm-*) CARGO_TEST_OPTIONS="--bins" ;; esac;
echo set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
# * strip executable?
STRIP="strip" ; case '${{ matrix.job.target }}' in arm-unknown-linux-gnueabihf) STRIP="arm-linux-gnueabihf-strip" ;; *-pc-windows-msvc) STRIP="" ;; esac;
# * executable for `strip`?
STRIP="strip"
case ${{ matrix.job.target }} in
aarch64-*-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;;
arm-*-linux-gnueabihf) STRIP="arm-linux-gnueabihf-strip" ;;
*-pc-windows-msvc) STRIP="" ;;
esac;
echo set-output name=STRIP::${STRIP:-<empty>/false}
echo ::set-output name=STRIP::${STRIP}
- name: Create all needed build/work directories
@@ -236,6 +263,7 @@ jobs:
## create build/work space
mkdir -p '${{ steps.vars.outputs.STAGING }}'
mkdir -p '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}'
mkdir -p '${{ steps.vars.outputs.STAGING }}/dpkg'
- name: rust toolchain ~ install
uses: actions-rs/toolchain@v1
with:
@@ -307,12 +335,28 @@ jobs:
*) tar czf '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* ;;
esac
popd >/dev/null
# dpkg
if [ -n "${{ steps.vars.outputs.DPKG_NAME }}" ]; then
DPKG_DIR="${{ steps.vars.outputs.STAGING }}/dpkg"
# binary
install -Dm755 'target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}"
if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}" ; fi
# README and LICENSE
(shopt -s nullglob; for f in [R]"EADME"{,.*}; do install -Dm644 "$f" "${DPKG_DIR}/usr/share/doc/${{ env.PROJECT_NAME }}/$f" ; done)
(shopt -s nullglob; for f in [L]"ICENSE"{-*,}{,.*}; do install -Dm644 "$f" "${DPKG_DIR}/usr/share/doc/${{ env.PROJECT_NAME }}/$f" ; done)
# control file
mkdir -p "${DPKG_DIR}/DEBIAN"
printf "Package: ${{ steps.vars.outputs.DPKG_BASENAME }}\nVersion: ${{ steps.vars.outputs.DPKG_VERSION }}\nSection: utils\nPriority: optional\nMaintainer: ${{ env.PROJECT_AUTH }}\nArchitecture: ${{ steps.vars.outputs.DPKG_ARCH }}\nProvides: ${{ env.PROJECT_NAME }}\nConflicts: ${{ steps.vars.outputs.DPKG_CONFLICTS }}\nDescription: ${{ env.PROJECT_DESC }}\n" > "${DPKG_DIR}/DEBIAN/control"
# build dpkg
fakeroot dpkg-deb --build "${DPKG_DIR}" "${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.DPKG_NAME }}"
fi
- name: Publish
uses: softprops/action-gh-release@v1
if: steps.vars.outputs.DEPLOYABLE
if: steps.vars.outputs.DEPLOY
with:
files: |
${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.DPKG_NAME }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+296
View File
@@ -0,0 +1,296 @@
// `cspell` settings
{
"version": "0.1", // Version of the setting file. Always 0.1
"language": "en", // language - current active spelling language
// ignoreWords
"ignoreWords": [
// abbrev/acronyms
"Cygwin",
"FreeBSD",
"Gmail",
"Irix",
"MacOS",
"MinGW",
"Minix",
"MS-DOS",
"MSDOS",
"NetBSD",
"Novell",
"OpenBSD",
"POSIX",
"SELinux",
"Solaris",
"Xenix",
"flac",
"lzma",
// crates
"byteorder",
"chrono",
"filetime",
"formatteriteminfo",
"getopts",
"itertools",
"multifilereader",
"onig",
"peekreader",
"termion",
"termios",
"termsize",
"termwidth",
"textwrap",
"walkdir",
"winapi",
"xattr",
// jargon
"AST", // abstract syntax tree
"CPU",
"CPUs",
"FIFO",
"FIFOs",
"FQDN", // fully qualified domain name
"GID", // group ID
"GIDs",
"POSIXLY",
"RNG", // random number generator
"RNGs",
"UID", // user ID
"UIDs",
"UUID", // universally unique identifier
"arity",
"bitmask",
"canonicalization",
"canonicalize",
"colorizable",
"colorize",
"consts",
"dedup",
"deque",
"dequeue",
"enqueue",
"executable",
"executables",
"gibibytes",
"hardlink",
"hardlinks",
"hashsums",
"kibibytes",
"mebibytes",
"mergeable",
"multibyte",
"nonportable",
"peekable",
"precompiled",
"precompute",
"preload",
"prepend",
"prepended",
"primality",
"pseudoprime",
"pseudoprimes",
"readonly",
"seedable",
"semver",
"symlink",
"symlinks",
"syscall",
"toekenize",
"unbuffered",
"unportable",
"whitespace",
// names
"Akira Hayakawa", "Akira", "Hayakawa",
"Alan Andrade", "Alan", "Andrade",
"Alex Lyon", "Alex", "Lyon",
"Alexander Batischev", "Alexander", "Batischev",
"Aleksander Bielawski", "Aleksander", "Bielawski",
"Alexander Fomin", "Alexander", "Fomin",
"Anthony Deschamps", "Anthony", "Deschamps",
"Ben Eills", "Ben", "Eills",
"Ben Hirsch", "Ben", "Hirsch",
"Benoit Benedetti", "Benoit", "Benedetti",
"Boden Garman", "Boden", "Garman",
"Chirag B Jadwani", "Chirag", "Jadwani",
"Derek Chiang", "Derek", "Chiang",
"Dorota Kapturkiewicz", "Dorota", "Kapturkiewicz",
"Evgeniy Klyuchikov", "Evgeniy", "Klyuchikov",
"Fangxu Hu", "Fangxu", "Hu",
"Gil Cottle", "Gil", "Cottle",
"Haitao Li", "Haitao", "Li",
"Inokentiy Babushkin", "Inokentiy", "Babushkin",
"Joao Oliveira", "Joao", "Oliveira",
"Jeremiah Peschka", "Jeremiah", "Peschka",
"Jian Zeng", "Jian", "Zeng",
"Jimmy Lu", "Jimmy", "Lu",
"Jordi Boggiano", "Jordi", "Boggiano",
"Jordy Dickinson", "Jordy", "Dickinson",
"Joseph Crail", "Joseph", "Crail",
"Joshua S Miller", "Joshua", "Miller",
"KokaKiwi",
"Konstantin Pospelov", "Konstantin", "Pospelov",
"Mahkoh",
"Maciej Dziardziel", "Maciej", "Dziardziel",
"Michael Gehring", "Michael", "Gehring",
"Martin Kysel", "Martin", "Kysel",
"Morten Olsen Lysgaard", "Morten", "Olsen", "Lysgaard",
"Nicholas Juszczak", "Nicholas", "Juszczak",
"Nick Platt", "Nick", "Platt",
"Orvar Segerström", "Orvar", "Segerström",
"Peter Atashian", "Peter", "Atashian",
"Rolf Morel", "Rolf", "Morel",
"Roman Gafiyatullin", "Roman", "Gafiyatullin",
"Roy Ivy III", "Roy", "Ivy", "III",
"Sergey 'Shnatsel' Davidoff", "Sergey", "Shnatsel", "Davidoff",
"Sokovikov Evgeniy", "Sokovikov", "Evgeniy",
"Sunrin SHIMURA", "Sunrin", "SHIMURA",
"Smigle00", "Smigle",
"Sylvestre Ledru", "Sylvestre", "Ledru",
"Tobias Bohumir Schottdorf", "Tobias", "Bohumir", "Schottdorf",
"Virgile Andreani", "Virgile", "Andreani",
"Vsevolod Velichko", "Vsevolod", "Velichko",
"Wiktor Kuropatwa", "Wiktor", "Kuropatwa",
"Yury Krivopalov", "Yury", "Krivopalov",
"anonymousknight",
"kwantam",
// rust
"clippy",
"concat",
"powi",
"repr",
"rfind",
"rustc",
"rustfmt",
"substr",
"splitn",
// shell
"passwd",
"tcsh",
// tags
"Maint",
// uutils
"chgrp",
"chmod",
"chown",
"chroot",
"cksum",
"dircolors",
"hashsum",
"hostid",
"logname",
"mkdir",
"mkfifo",
"mknod",
"mktemp",
"nohup",
"nproc",
"numfmt",
"pathchk",
"printenv",
"printf",
"readlink",
"realpath",
"relpath",
"rmdir",
"shuf",
"stdbuf",
"tsort",
"uname",
"unexpand",
"whoami",
// vars/libc
"FILENO",
"HOSTSIZE",
"IDSIZE",
"IRGRP",
"IROTH",
"IRUSR",
"ISGID",
"ISUID",
"ISVTX",
"IWGRP",
"IWOTH",
"IWUSR",
"IXGRP",
"IXOTH",
"IXUSR",
"LINESIZE",
"NAMESIZE",
"USERSIZE",
"addrinfo",
"addrlen",
"canonname",
"chroot",
"freeaddrinfo",
"getaddrinfo",
"getegid",
"geteuid",
"getgid",
"getgrgid",
"getgrnam",
"getgrouplist",
"getgroups",
"getpwnam",
"getpwuid",
"getuid",
"inode",
"isatty",
"lchown",
"setgid",
"setgroups",
"setuid",
"socktype",
"umask",
"waitpid",
// vars/signals
"SIGPIPE",
// vars/sync
"Condvar",
// vars/time
"Timespec",
"nsec",
"nsecs",
"strftime",
"usec",
"usecs",
// vars/utmpx
"endutxent",
"getutxent",
"getutxid",
"getutxline",
"pututxline",
"setutxent",
"utmp",
"utmpx",
"utmpxname",
// vars/winapi
"errhandlingapi",
"fileapi",
"handleapi",
"minwindef",
"processthreadsapi",
"synchapi",
"winbase",
"winerror",
"winnt",
"winsock",
"DWORD",
"LPWSTR",
"WCHAR",
// uucore
"optflag",
"optflagmulti",
"optflagopt",
"optmulti",
"optopt",
// uutils
"coreopts",
"coreutils",
"libc",
"musl",
"utmpx",
"uucore",
"uumain",
"uutils"
],
// words - list of words to be always considered correct
"words": []
}
Generated
+1321 -1389
View File
File diff suppressed because it is too large Load Diff
+119 -107
View File
@@ -1,13 +1,20 @@
# uutils / coreutils
# coreutils (uutils)
# * see the repository LICENSE, README, and CONTRIBUTING files for more information
[package]
name = "uutils"
description = "uutils ~ universal (as in cross-platform) CLI utils, written in Rust"
name = "coreutils"
version = "0.0.1" # "0.0.1.1"
authors = ["uutils developers"]
license = "MIT"
description = "coreutils ~ GNU coreutils (updated); implemented as universal (cross-platform) utils, written in Rust"
homepage = "https://github.com/uutils/coreutils"
repository = "https://github.com/uutils/coreutils"
version = "0.0.1"
authors = []
readme = "README.md"
keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"]
categories = ["command-line-utilities"]
edition = "2018"
build = "build.rs"
autotests = false
@@ -210,111 +217,118 @@ feat_os_windows_legacy = [
"touch",
"whoami",
]
##
# * bypass/override ~ translate 'test' feature name to avoid dependency collision with rust core 'test' crate (o/w surfaces as compiler errors during testing)
test = [ "uu_test" ]
[workspace]
[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.2" }
uucore = { version="0.0.4", package="uucore", git="https://github.com/uutils/uucore.git", branch="master" }
# * uutils
arch = { optional=true, path="src/uu/arch" }
base32 = { optional=true, path="src/uu/base32" }
base64 = { optional=true, path="src/uu/base64" }
basename = { optional=true, path="src/uu/basename" }
cat = { optional=true, path="src/uu/cat" }
chgrp = { optional=true, path="src/uu/chgrp" }
chmod = { optional=true, path="src/uu/chmod" }
chown = { optional=true, path="src/uu/chown" }
chroot = { optional=true, path="src/uu/chroot" }
cksum = { optional=true, path="src/uu/cksum" }
comm = { optional=true, path="src/uu/comm" }
cp = { optional=true, path="src/uu/cp" }
cut = { optional=true, path="src/uu/cut" }
date = { optional=true, path="src/uu/date" }
df = { optional=true, path="src/uu/df" }
dircolors= { optional=true, path="src/uu/dircolors" }
dirname = { optional=true, path="src/uu/dirname" }
du = { optional=true, path="src/uu/du" }
echo = { optional=true, path="src/uu/echo" }
env = { optional=true, path="src/uu/env" }
expand = { optional=true, path="src/uu/expand" }
expr = { optional=true, path="src/uu/expr" }
factor = { optional=true, path="src/uu/factor" }
false = { optional=true, path="src/uu/false" }
fmt = { optional=true, path="src/uu/fmt" }
fold = { optional=true, path="src/uu/fold" }
groups = { optional=true, path="src/uu/groups" }
hashsum = { optional=true, path="src/uu/hashsum" }
head = { optional=true, path="src/uu/head" }
hostid = { optional=true, path="src/uu/hostid" }
hostname = { optional=true, path="src/uu/hostname" }
id = { optional=true, path="src/uu/id" }
install = { optional=true, path="src/uu/install" }
join = { optional=true, path="src/uu/join" }
kill = { optional=true, path="src/uu/kill" }
link = { optional=true, path="src/uu/link" }
ln = { optional=true, path="src/uu/ln" }
ls = { optional=true, path="src/uu/ls" }
logname = { optional=true, path="src/uu/logname" }
mkdir = { optional=true, path="src/uu/mkdir" }
mkfifo = { optional=true, path="src/uu/mkfifo" }
mknod = { optional=true, path="src/uu/mknod" }
mktemp = { optional=true, path="src/uu/mktemp" }
more = { optional=true, path="src/uu/more" }
mv = { optional=true, path="src/uu/mv" }
nice = { optional=true, path="src/uu/nice" }
nl = { optional=true, path="src/uu/nl" }
nohup = { optional=true, path="src/uu/nohup" }
nproc = { optional=true, path="src/uu/nproc" }
numfmt = { optional=true, path="src/uu/numfmt" }
od = { optional=true, path="src/uu/od" }
paste = { optional=true, path="src/uu/paste" }
pathchk = { optional=true, path="src/uu/pathchk" }
pinky = { optional=true, path="src/uu/pinky" }
printenv = { optional=true, path="src/uu/printenv" }
printf = { optional=true, path="src/uu/printf" }
ptx = { optional=true, path="src/uu/ptx" }
pwd = { optional=true, path="src/uu/pwd" }
readlink = { optional=true, path="src/uu/readlink" }
realpath = { optional=true, path="src/uu/realpath" }
relpath = { optional=true, path="src/uu/relpath" }
rm = { optional=true, path="src/uu/rm" }
rmdir = { optional=true, path="src/uu/rmdir" }
seq = { optional=true, path="src/uu/seq" }
shred = { optional=true, path="src/uu/shred" }
shuf = { optional=true, path="src/uu/shuf" }
sleep = { optional=true, path="src/uu/sleep" }
sort = { optional=true, path="src/uu/sort" }
split = { optional=true, path="src/uu/split" }
stat = { optional=true, path="src/uu/stat" }
stdbuf = { optional=true, path="src/uu/stdbuf" }
sum = { optional=true, path="src/uu/sum" }
sync = { optional=true, path="src/uu/sync" }
tac = { optional=true, path="src/uu/tac" }
tail = { optional=true, path="src/uu/tail" }
tee = { optional=true, path="src/uu/tee" }
test = { optional=true, path="src/uu/test" }
timeout = { optional=true, path="src/uu/timeout" }
touch = { optional=true, path="src/uu/touch" }
tr = { optional=true, path="src/uu/tr" }
true = { optional=true, path="src/uu/true" }
truncate = { optional=true, path="src/uu/truncate" }
tsort = { optional=true, path="src/uu/tsort" }
tty = { optional=true, path="src/uu/tty" }
uname = { optional=true, path="src/uu/uname" }
unexpand = { optional=true, path="src/uu/unexpand" }
uniq = { optional=true, path="src/uu/uniq" }
unlink = { optional=true, path="src/uu/unlink" }
uptime = { optional=true, path="src/uu/uptime" }
users = { optional=true, path="src/uu/users" }
wc = { optional=true, path="src/uu/wc" }
who = { optional=true, path="src/uu/who" }
whoami = { optional=true, path="src/uu/whoami" }
yes = { optional=true, path="src/uu/yes" }
uu_test = { optional=true, version="0.0.1", package="uu_test", path="src/uu/test" }
#
# * transitive dependency via 'failure'; pin to <= v0.3.30 to avoid increasing MinSRV to v1.33.0
_backtrace = { version=">= 0.3.3, <= 0.3.30", package="backtrace" }
arch = { optional=true, version="0.0.1", package="uu_arch", path="src/uu/arch" }
base32 = { optional=true, version="0.0.1", package="uu_base32", path="src/uu/base32" }
base64 = { optional=true, version="0.0.1", package="uu_base64", path="src/uu/base64" }
basename = { optional=true, version="0.0.1", package="uu_basename", path="src/uu/basename" }
cat = { optional=true, version="0.0.1", package="uu_cat", path="src/uu/cat" }
chgrp = { optional=true, version="0.0.1", package="uu_chgrp", path="src/uu/chgrp" }
chmod = { optional=true, version="0.0.1", package="uu_chmod", path="src/uu/chmod" }
chown = { optional=true, version="0.0.1", package="uu_chown", path="src/uu/chown" }
chroot = { optional=true, version="0.0.1", package="uu_chroot", path="src/uu/chroot" }
cksum = { optional=true, version="0.0.1", package="uu_cksum", path="src/uu/cksum" }
comm = { optional=true, version="0.0.1", package="uu_comm", path="src/uu/comm" }
cp = { optional=true, version="0.0.1", package="uu_cp", path="src/uu/cp" }
cut = { optional=true, version="0.0.1", package="uu_cut", path="src/uu/cut" }
date = { optional=true, version="0.0.1", package="uu_date", path="src/uu/date" }
df = { optional=true, version="0.0.1", package="uu_df", path="src/uu/df" }
dircolors= { optional=true, version="0.0.1", package="uu_dircolors", path="src/uu/dircolors" }
dirname = { optional=true, version="0.0.1", package="uu_dirname", path="src/uu/dirname" }
du = { optional=true, version="0.0.1", package="uu_du", path="src/uu/du" }
echo = { optional=true, version="0.0.1", package="uu_echo", path="src/uu/echo" }
env = { optional=true, version="0.0.1", package="uu_env", path="src/uu/env" }
expand = { optional=true, version="0.0.1", package="uu_expand", path="src/uu/expand" }
expr = { optional=true, version="0.0.1", package="uu_expr", path="src/uu/expr" }
factor = { optional=true, version="0.0.1", package="uu_factor", path="src/uu/factor" }
false = { optional=true, version="0.0.1", package="uu_false", path="src/uu/false" }
fmt = { optional=true, version="0.0.1", package="uu_fmt", path="src/uu/fmt" }
fold = { optional=true, version="0.0.1", package="uu_fold", path="src/uu/fold" }
groups = { optional=true, version="0.0.1", package="uu_groups", path="src/uu/groups" }
hashsum = { optional=true, version="0.0.1", package="uu_hashsum", path="src/uu/hashsum" }
head = { optional=true, version="0.0.1", package="uu_head", path="src/uu/head" }
hostid = { optional=true, version="0.0.1", package="uu_hostid", path="src/uu/hostid" }
hostname = { optional=true, version="0.0.1", package="uu_hostname", path="src/uu/hostname" }
id = { optional=true, version="0.0.1", package="uu_id", path="src/uu/id" }
install = { optional=true, version="0.0.1", package="uu_install", path="src/uu/install" }
join = { optional=true, version="0.0.1", package="uu_join", path="src/uu/join" }
kill = { optional=true, version="0.0.1", package="uu_kill", path="src/uu/kill" }
link = { optional=true, version="0.0.1", package="uu_link", path="src/uu/link" }
ln = { optional=true, version="0.0.1", package="uu_ln", path="src/uu/ln" }
ls = { optional=true, version="0.0.1", package="uu_ls", path="src/uu/ls" }
logname = { optional=true, version="0.0.1", package="uu_logname", path="src/uu/logname" }
mkdir = { optional=true, version="0.0.1", package="uu_mkdir", path="src/uu/mkdir" }
mkfifo = { optional=true, version="0.0.1", package="uu_mkfifo", path="src/uu/mkfifo" }
mknod = { optional=true, version="0.0.1", package="uu_mknod", path="src/uu/mknod" }
mktemp = { optional=true, version="0.0.1", package="uu_mktemp", path="src/uu/mktemp" }
more = { optional=true, version="0.0.1", package="uu_more", path="src/uu/more" }
mv = { optional=true, version="0.0.1", package="uu_mv", path="src/uu/mv" }
nice = { optional=true, version="0.0.1", package="uu_nice", path="src/uu/nice" }
nl = { optional=true, version="0.0.1", package="uu_nl", path="src/uu/nl" }
nohup = { optional=true, version="0.0.1", package="uu_nohup", path="src/uu/nohup" }
nproc = { optional=true, version="0.0.1", package="uu_nproc", path="src/uu/nproc" }
numfmt = { optional=true, version="0.0.1", package="uu_numfmt", path="src/uu/numfmt" }
od = { optional=true, version="0.0.1", package="uu_od", path="src/uu/od" }
paste = { optional=true, version="0.0.1", package="uu_paste", path="src/uu/paste" }
pathchk = { optional=true, version="0.0.1", package="uu_pathchk", path="src/uu/pathchk" }
pinky = { optional=true, version="0.0.1", package="uu_pinky", path="src/uu/pinky" }
printenv = { optional=true, version="0.0.1", package="uu_printenv", path="src/uu/printenv" }
printf = { optional=true, version="0.0.1", package="uu_printf", path="src/uu/printf" }
ptx = { optional=true, version="0.0.1", package="uu_ptx", path="src/uu/ptx" }
pwd = { optional=true, version="0.0.1", package="uu_pwd", path="src/uu/pwd" }
readlink = { optional=true, version="0.0.1", package="uu_readlink", path="src/uu/readlink" }
realpath = { optional=true, version="0.0.1", package="uu_realpath", path="src/uu/realpath" }
relpath = { optional=true, version="0.0.1", package="uu_relpath", path="src/uu/relpath" }
rm = { optional=true, version="0.0.1", package="uu_rm", path="src/uu/rm" }
rmdir = { optional=true, version="0.0.1", package="uu_rmdir", path="src/uu/rmdir" }
seq = { optional=true, version="0.0.1", package="uu_seq", path="src/uu/seq" }
shred = { optional=true, version="0.0.1", package="uu_shred", path="src/uu/shred" }
shuf = { optional=true, version="0.0.1", package="uu_shuf", path="src/uu/shuf" }
sleep = { optional=true, version="0.0.1", package="uu_sleep", path="src/uu/sleep" }
sort = { optional=true, version="0.0.1", package="uu_sort", path="src/uu/sort" }
split = { optional=true, version="0.0.1", package="uu_split", path="src/uu/split" }
stat = { optional=true, version="0.0.1", package="uu_stat", path="src/uu/stat" }
stdbuf = { optional=true, version="0.0.1", package="uu_stdbuf", path="src/uu/stdbuf" }
sum = { optional=true, version="0.0.1", package="uu_sum", path="src/uu/sum" }
sync = { optional=true, version="0.0.1", package="uu_sync", path="src/uu/sync" }
tac = { optional=true, version="0.0.1", package="uu_tac", path="src/uu/tac" }
tail = { optional=true, version="0.0.1", package="uu_tail", path="src/uu/tail" }
tee = { optional=true, version="0.0.1", package="uu_tee", path="src/uu/tee" }
timeout = { optional=true, version="0.0.1", package="uu_timeout", path="src/uu/timeout" }
touch = { optional=true, version="0.0.1", package="uu_touch", path="src/uu/touch" }
tr = { optional=true, version="0.0.1", package="uu_tr", path="src/uu/tr" }
true = { optional=true, version="0.0.1", package="uu_true", path="src/uu/true" }
truncate = { optional=true, version="0.0.1", package="uu_truncate", path="src/uu/truncate" }
tsort = { optional=true, version="0.0.1", package="uu_tsort", path="src/uu/tsort" }
tty = { optional=true, version="0.0.1", package="uu_tty", path="src/uu/tty" }
uname = { optional=true, version="0.0.1", package="uu_uname", path="src/uu/uname" }
unexpand = { optional=true, version="0.0.1", package="uu_unexpand", path="src/uu/unexpand" }
uniq = { optional=true, version="0.0.1", package="uu_uniq", path="src/uu/uniq" }
unlink = { optional=true, version="0.0.1", package="uu_unlink", path="src/uu/unlink" }
uptime = { optional=true, version="0.0.1", package="uu_uptime", path="src/uu/uptime" }
users = { optional=true, version="0.0.1", package="uu_users", path="src/uu/users" }
wc = { optional=true, version="0.0.1", package="uu_wc", path="src/uu/wc" }
who = { optional=true, version="0.0.1", package="uu_who", path="src/uu/who" }
whoami = { optional=true, version="0.0.1", package="uu_whoami", path="src/uu/whoami" }
yes = { optional=true, version="0.0.1", package="uu_yes", path="src/uu/yes" }
#
# * pinned transitive dependencies
pin_backtrace = { version=">= 0.3.3, <= 0.3.30", package="backtrace" } ## via 'failure'; pin to <= v0.3.30 to avoid increasing MinSRV to v1.33.0
pin_half = { version="1.1.0, < 1.4.0", package="half" } ## half v1.4.0 has compiler errors for MinSRV v1.31.0
pin_same-file = { version="1.0.4, < 1.0.6", package="same-file" } ## same-file v1.0.6 has compiler errors for MinSRV v1.31.0
pin_winapi-util = { version="0.1.2, < 0.1.3", package="winapi-util" } ## winapi-util v0.1.3 has compiler errors for MinSRV v1.31.0
[dev-dependencies]
filetime = "0.2"
@@ -324,17 +338,15 @@ regex = "1.0"
tempdir = "0.3"
time = "0.1"
unindent = "0.1"
uucore = { version="0.0.4", package="uucore", git="https://github.com/uutils/uucore.git", branch="master", features=["entries"] }
[target.'cfg(unix)'.dev-dependencies]
rust-users = { version="0.10", package="users" }
unix_socket = "0.5.0"
[[bin]]
name = "uutils"
path = "src/bin/uutils.rs"
name = "coreutils"
path = "src/bin/coreutils.rs"
[[test]]
name = "tests"
[patch.crates-io]
uucore = { git = "https://github.com/uutils/uucore/", tag = "0.0.2" }
+60 -23
View File
@@ -1,6 +1,4 @@
# spell-checker:ignore (cargo-make) duckscript macos
# spell-checker:ignore (rust) clippy
# spell-checker:ignore (uutils) uutil uutils
# spell-checker:ignore (cargo-make) duckscript
[config]
min_version = "0.26.2"
@@ -81,10 +79,16 @@ if is_empty "${args_examples}"
end_if
set_env CARGO_MAKE_TASK_BUILD_EXAMPLES_ARGS "${args_examples}"
# * rebuild for 'utils' target
args_utils = replace ${args} ";" " -p"
if not is_empty "${args_utils}"
args_utils = set "-p${args_utils}"
end_if
args_utils_list = split "${args}" ";"
for arg in "${args_utils_list}"
if not is_empty "${arg}"
if not starts_with "${arg}" "uu_"
arg = set "uu_${arg}"
end_if
args_utils = set "${args_utils} -p${arg}"
end_if
end
args_utils = trim "${args_utils}"
set_env CARGO_MAKE_TASK_BUILD_UTILS_ARGS "${args_utils}"
'''
]
@@ -118,7 +122,7 @@ dependencies = [
]
[tasks.build-examples]
description = "## Build (release-mode) project example(s); usage: `cargo make (build-examples | examples | example) [EXAMPLE]...`"
description = "## Build (release-mode) project example(s); usage: `cargo make (build-examples | examples) [EXAMPLE]...`"
category = "[project]"
dependencies = [
"core::pre-build",
@@ -135,11 +139,18 @@ dependencies = [
"core::post-build",
]
[tasks.build-release]
alias = "build"
[tasks.debug]
alias = "build-debug"
[tasks.example]
alias = "build-examples"
description = "hidden singular-form alias for 'examples'"
category = "[project]"
dependencies = [
"examples",
]
[tasks.examples]
alias = "build-examples"
@@ -148,11 +159,10 @@ alias = "build-examples"
alias = "build-features"
[tasks.format]
description = "## Format code files (with `cargo fmt`)"
description = "## Format code files (with `cargo fmt`; includes tests)"
category = "[project]"
dependencies = [
"action-format",
"action-determine-tests",
"action-format-tests",
]
@@ -205,10 +215,7 @@ command = "cargo"
args = ["uninstall"]
[tasks.util]
alias = "utils"
[tasks.utils]
description = "## Build (individual; release-mode) utilities; usage: `cargo make (util | utils | uutil | uutils) [UTIL_NAME...]`"
description = "## Build (individual; release-mode) utilities; usage: `cargo make (util | uutil) [UTIL_NAME...]`"
category = "[project]"
dependencies = [
"core::pre-build",
@@ -217,11 +224,22 @@ dependencies = [
"core::post-build",
]
[tasks.utils]
description = "hidden plural-form alias for 'util'"
category = "[project]"
dependencies = [
"util",
]
[tasks.uutil]
alias = "utils"
[tasks.uutils]
alias = "utils"
description = "hidden plural-form alias for 'util'"
category = "[project]"
dependencies = [
"util",
]
### actions
@@ -247,6 +265,9 @@ args = ["build", "--release", "--no-default-features", "--features", "${CARGO_MA
[tasks.action-build-utils]
description = "Build individual utilities"
dependencies = [
"action-determine-utils",
]
command = "cargo"
# args = ["build", "@@remove-empty(CARGO_MAKE_TASK_BUILD_UTILS_ARGS)" ]
args = ["build", "--release", "@@split(CARGO_MAKE_TASK_BUILD_UTILS_ARGS, )" ]
@@ -263,11 +284,21 @@ script = [
package_options = get_env CARGO_MAKE_TASK_BUILD_UTILS_ARGS
if is_empty "${package_options}"
show_utils = get_env CARGO_MAKE_VAR_SHOW_UTILS
result = exec "${show_utils}"
features = get_env CARGO_MAKE_VAR_BUILD_TEST_FEATURES
if not is_empty "${features}"
result = exec "${show_utils}" --features "${features}"
else
result = exec "${show_utils}"
endif
set_env CARGO_MAKE_VAR_UTILS ${result.stdout}
utils = array %{result.stdout}
for util in ${utils}
package_options = set "${package_options} -p${util}"
if not is_empty "${util}"
if not starts_with "${util}" "uu_"
util = set "uu_${util}"
end_if
package_options = set "${package_options} -p${util}"
end_if
end
package_options = trim "${package_options}"
end_if
@@ -281,10 +312,13 @@ script = [
'''
test_files = glob_array tests/**/*.rs
for file in ${test_files}
if is_empty "${tests}"
tests = set "${file}"
else
tests = set "${tests} ${file}"
file = replace "${file}" "\\" "/"
if not is_empty ${file}
if is_empty "${tests}"
tests = set "${file}"
else
tests = set "${tests} ${file}"
end_if
end_if
end
set_env CARGO_MAKE_VAR_TESTS "${tests}"
@@ -298,6 +332,9 @@ args = ["fmt"]
[tasks.action-format-tests]
description = "`cargo fmt` tests"
dependencies = [
"action-determine-tests",
]
command = "cargo"
args = ["fmt", "--", "@@split(CARGO_MAKE_VAR_TESTS, )"]
@@ -342,7 +379,7 @@ script = [
target = array_pop ${line_segments}
target = trim ${target}
l = length ${target}
r = range 0 20
r = range 0 18
spacing = set ""
for i in ${r}
if greater_than ${i} ${l}
+61 -37
View File
@@ -1,3 +1,5 @@
// spell-checker:ignore (vars) krate
use std::env;
use std::fs::File;
use std::io::Write;
@@ -8,66 +10,89 @@ pub fn main() {
println!("cargo:rustc-cfg=build={:?}", profile);
}
let feature_prefix = "CARGO_FEATURE_";
let env_feature_prefix: &str = "CARGO_FEATURE_";
let feature_prefix: &str = "feat_";
let override_prefix: &str = "uu_";
let out_dir = env::var("OUT_DIR").unwrap();
let mut crates = Vec::new();
for (key, val) in env::vars() {
if val == "1" && key.starts_with(feature_prefix) {
let krate = key[feature_prefix.len()..].to_lowercase();
if val == "1" && key.starts_with(env_feature_prefix) {
let krate = key[env_feature_prefix.len()..].to_lowercase();
match krate.as_ref() {
"default" | "macos" | "unix" | "windows" => continue,
"nightly" | "test_unimplemented" => continue,
s if s.starts_with("feat_") => continue,
_ => {}
"default" | "macos" | "unix" | "windows" => continue, // common/standard feature names
"nightly" | "test_unimplemented" => continue, // crate-local custom features
"test" => continue, // over-ridden with 'uu_test' to avoid collision with rust core crate 'test'
s if s.starts_with(feature_prefix) => continue, // crate feature sets
_ => {} // util feature name
}
crates.push(krate.to_string());
}
}
crates.sort();
let mut cf = File::create(Path::new(&out_dir).join("uutils_crates.rs")).unwrap();
let mut mf = File::create(Path::new(&out_dir).join("uutils_map.rs")).unwrap();
mf.write_all(
"type UtilityMap = HashMap<&'static str, fn(Vec<String>) -> i32>;\n\
\n\
fn util_map() -> UtilityMap {\n\
\tlet mut map: UtilityMap = HashMap::new();\n\
"
type UtilityMap = HashMap<&'static str, fn(Vec<String>) -> i32>;
fn util_map() -> UtilityMap {
let mut map: UtilityMap = HashMap::new();\n"
.as_bytes(),
.as_bytes(),
)
.unwrap();
for krate in crates {
cf.write_all(format!("extern crate uu_{krate};\n", krate = krate).as_bytes())
.unwrap();
match krate.as_ref() {
"hashsum" => {
mf.write_all(
"map.insert(\"hashsum\", uu_hashsum::uumain);
map.insert(\"md5sum\", uu_hashsum::uumain);
map.insert(\"sha1sum\", uu_hashsum::uumain);
map.insert(\"sha224sum\", uu_hashsum::uumain);
map.insert(\"sha256sum\", uu_hashsum::uumain);
map.insert(\"sha384sum\", uu_hashsum::uumain);
map.insert(\"sha512sum\", uu_hashsum::uumain);
map.insert(\"sha3sum\", uu_hashsum::uumain);
map.insert(\"sha3-224sum\", uu_hashsum::uumain);
map.insert(\"sha3-256sum\", uu_hashsum::uumain);
map.insert(\"sha3-384sum\", uu_hashsum::uumain);
map.insert(\"sha3-512sum\", uu_hashsum::uumain);
map.insert(\"shake128sum\", uu_hashsum::uumain);
map.insert(\"shake256sum\", uu_hashsum::uumain);\n"
.as_bytes(),
k if k.starts_with(override_prefix) => mf
.write_all(
format!(
"\tmap.insert(\"{k}\", {krate}::uumain);\n",
k = krate[override_prefix.len()..].to_string(),
krate = krate
)
.as_bytes(),
)
.unwrap();
}
.unwrap(),
"false" | "true" => mf
.write_all(
format!(
"\tmap.insert(\"{krate}\", r#{krate}::uumain);\n",
krate = krate
)
.as_bytes(),
)
.unwrap(),
"hashsum" => mf
.write_all(
format!(
"\
\tmap.insert(\"{krate}\", {krate}::uumain);\n\
\t\tmap.insert(\"md5sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha1sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha224sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha256sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha384sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha512sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha3sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha3-224sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha3-256sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha3-384sum\", {krate}::uumain);\n\
\t\tmap.insert(\"sha3-512sum\", {krate}::uumain);\n\
\t\tmap.insert(\"shake128sum\", {krate}::uumain);\n\
\t\tmap.insert(\"shake256sum\", {krate}::uumain);\n\
",
krate = krate
)
.as_bytes(),
)
.unwrap(),
_ => mf
.write_all(
format!(
"map.insert(\"{krate}\", uu_{krate}::uumain);\n",
"\tmap.insert(\"{krate}\", {krate}::uumain);\n",
krate = krate
)
.as_bytes(),
@@ -78,6 +103,5 @@ pub fn main() {
mf.write_all(b"map\n}\n").unwrap();
cf.flush().unwrap();
mf.flush().unwrap();
}
+1
View File
@@ -0,0 +1 @@
include!("../src/bin/coreutils.rs");
-1
View File
@@ -1 +0,0 @@
include!("../src/bin/uutils.rs");
-1
View File
@@ -1 +0,0 @@
include!("../src/bin/uutils.rs");
+1
View File
@@ -0,0 +1 @@
include!("../src/bin/coreutils.rs");
+7 -16
View File
@@ -1,18 +1,9 @@
/*
* This file is part of the uutils coreutils package.
*
* (c) Michael Gehring <mg@ebfe.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
// spell-checker:ignore (acronyms/names) Gehring
// spell-checker:ignore (rustlang/crates) clippy concat rustlang termwidth textwrap
// spell-checker:ignore (uutils) coreutils sigpipe uucore uumain uutils
// spell-checker:ignore (shell) busybox symlinks
include!(concat!(env!("OUT_DIR"), "/uutils_crates.rs"));
// This file is part of the uutils coreutils package.
//
// (c) Michael Gehring <mg@ebfe.org>
//
// For the full copyright and license information, please view the LICENSE
// file that was distributed with this source code.
extern crate lazy_static;
extern crate textwrap;
@@ -53,7 +44,7 @@ fn usage(utils: &UtilityMap) {
}
fn main() {
uucore::panic::install_sigpipe_hook();
uucore::panic::mute_sigpipe_panic();
let utils = util_map();
let mut args: Vec<String> = uucore::args().collect();
-36
View File
@@ -1,36 +0,0 @@
use std::env;
use std::fs::File;
use std::io::Write;
use std::path::Path;
static TEMPLATE: &str = "\
extern crate uu_@UTIL_CRATE@;
extern crate uucore;
use std::io::Write;
use uu_@UTIL_CRATE@::uumain;
fn main() {
uucore::panic::install_sigpipe_hook();
let code = uumain(uucore::args().collect());
// Since stdout is line-buffered by default, we need to ensure any pending
// writes are flushed before exiting. Ideally, this should be enforced by
// each utility.
//
// See: https://github.com/rust-lang/rust/issues/23818
//
std::io::stdout().flush().expect(\"could not flush stdout\");
std::process::exit(code);
}
";
pub fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
let pkgname = env::var("CARGO_PKG_NAME").unwrap();
let main = TEMPLATE.replace("@UTIL_CRATE@", &pkgname);
let mut file = File::create(&Path::new(&out_dir).join("main.rs")).unwrap();
write!(file, "{}", main).unwrap();
}
-1
View File
@@ -1 +0,0 @@
include!(concat!(env!("OUT_DIR"), "/main.rs"));
+12 -6
View File
@@ -1,18 +1,24 @@
[package]
name = "arch"
name = "uu_arch"
version = "0.0.1"
authors = []
authors = ["uutils developers"]
license = "MIT"
build = "../../common/mkmain.rs"
description = "arch ~ (uutils) display machine architecture"
homepage = "https://github.com/uutils/coreutils"
repository = "https://github.com/uutils/coreutils/tree/master/src/uu/arch"
keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"]
categories = ["command-line-utilities"]
edition = "2018"
[lib]
name = "uu_arch"
path = "src/arch.rs"
[dependencies]
platform-info = "0.0.1"
uucore = "0.0.2"
uucore = { version="0.0.4", package="uucore", git="https://github.com/uutils/uucore.git", branch="canary" }
uucore_procs = { version="0.0.4", package="uucore_procs", git="https://github.com/uutils/uucore.git", branch="canary" }
[[bin]]
name = "arch"
path = "../../common/uumain.rs"
path = "src/main.rs"
+1 -4
View File
@@ -1,5 +1,3 @@
#![crate_name = "uu_arch"]
// This file is part of the uutils coreutils package.
//
// (c) Smigle00 <smigle00@gmail.com>
@@ -7,7 +5,6 @@
//
// For the full copyright and license information, please view the LICENSE
// file that was distributed with this source code.
//
extern crate platform_info;
#[macro_use]
@@ -20,7 +17,7 @@ static SUMMARY: &str = "Determine architecture name for current machine.";
static LONG_HELP: &str = "";
pub fn uumain(args: Vec<String>) -> i32 {
new_coreopts!(SYNTAX, SUMMARY, LONG_HELP).parse(args);
app!(SYNTAX, SUMMARY, LONG_HELP).parse(args);
let uts = return_if_err!(1, PlatformInfo::new());
println!("{}", uts.machine().trim());
0
+1
View File
@@ -0,0 +1 @@
uucore_procs::main!(uu_arch); // spell-checker:ignore procs uucore
+12 -8
View File
@@ -1,19 +1,23 @@
[package]
name = "base32"
name = "uu_base32"
version = "0.0.1"
authors = []
authors = ["uutils developers"]
license = "MIT"
build = "../../common/mkmain.rs"
description = "base32 ~ (uutils) decode/encode input (base32-encoding)"
homepage = "https://github.com/uutils/coreutils"
repository = "https://github.com/uutils/coreutils/tree/master/src/uu/base32"
keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"]
categories = ["command-line-utilities"]
edition = "2018"
[lib]
name = "uu_base32"
path = "src/base32.rs"
[dependencies]
uucore = { version = "0.0.2", features = ["encoding"] }
## optional
clippy = { version = "0.0.212", optional = true }
uucore = { version="0.0.4", package="uucore", git="https://github.com/uutils/uucore.git", branch="canary", features = ["encoding"] }
uucore_procs = { version="0.0.4", package="uucore_procs", git="https://github.com/uutils/uucore.git", branch="canary" }
[[bin]]
name = "base32"
path = "../../common/uumain.rs"
path = "src/main.rs"
-4
View File
@@ -4,15 +4,11 @@
//
// For the full copyright and license information, please view the LICENSE file
// that was distributed with this source code.
//
#![crate_name = "uu_base32"]
#[macro_use]
extern crate uucore;
use uucore::encoding::Format;
#[path = "../../base64/src/base_common.rs"]
mod base_common;
static SYNTAX: &str = "[OPTION]... [FILE]";
+92
View File
@@ -0,0 +1,92 @@
// This file is part of the uutils coreutils package.
//
// (c) Jordy Dickinson <jordy.dickinson@gmail.com>
// (c) Jian Zeng <anonymousknight96@gmail.com>
// (c) Alex Lyon <arcterus@mail.com>
//
// For the full copyright and license information, please view the LICENSE file
// that was distributed with this source code.
use std::fs::File;
use std::io::{stdin, BufReader, Read};
use std::path::Path;
use uucore::encoding::{wrap_print, Data, Format};
pub fn execute(
args: Vec<String>,
syntax: &str,
summary: &str,
long_help: &str,
format: Format,
) -> i32 {
let matches = app!(syntax, summary, long_help)
.optflag("d", "decode", "decode data")
.optflag(
"i",
"ignore-garbage",
"when decoding, ignore non-alphabetic characters",
)
.optopt(
"w",
"wrap",
"wrap encoded lines after COLS character (default 76, 0 to disable wrapping)",
"COLS",
)
.parse(args);
let line_wrap = matches.opt_str("wrap").map(|s| match s.parse() {
Ok(n) => n,
Err(e) => {
crash!(1, "invalid wrap size: {}: {}", s, e);
}
});
let ignore_garbage = matches.opt_present("ignore-garbage");
let decode = matches.opt_present("decode");
if matches.free.len() > 1 {
show_usage_error!("extra operand {}", matches.free[0]);
return 1;
}
if matches.free.is_empty() || &matches.free[0][..] == "-" {
let stdin_raw = stdin();
handle_input(
&mut stdin_raw.lock(),
format,
line_wrap,
ignore_garbage,
decode,
);
} else {
let path = Path::new(matches.free[0].as_str());
let file_buf = safe_unwrap!(File::open(&path));
let mut input = BufReader::new(file_buf);
handle_input(&mut input, format, line_wrap, ignore_garbage, decode);
};
0
}
fn handle_input<R: Read>(
input: &mut R,
format: Format,
line_wrap: Option<usize>,
ignore_garbage: bool,
decode: bool,
) {
let mut data = Data::new(input, format).ignore_garbage(ignore_garbage);
if let Some(wrap) = line_wrap {
data = data.line_wrap(wrap);
}
if !decode {
let encoded = data.encode();
wrap_print(&data, encoded);
} else {
match data.decode() {
Ok(s) => print!("{}", String::from_utf8(s).unwrap()),
Err(_) => crash!(1, "invalid input"),
}
}
}

Some files were not shown because too many files have changed in this diff Show More