From: Ian Jackson Date: Sat, 10 Oct 2020 01:03:09 +0000 (+0100) Subject: linkfarm options, not yet documented X-Git-Tag: nailing-cargo/1.0.0~52 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e19dd56fdc5fd0ad649f6b1a0e636c632088a295;p=nailing-cargo.git linkfarm options, not yet documented Signed-off-by: Ian Jackson --- diff --git a/nailing-cargo b/nailing-cargo index 1356a44..35feceb 100755 --- a/nailing-cargo +++ b/nailing-cargo @@ -97,6 +97,7 @@ our $oot_clean; our $do_nail=1; our $do_cargo_lock=1; our $do_lock=1; +our $linkfarm_depth; # our %subcmd_props = ( @@ -568,11 +569,14 @@ sub addargs () { $online //= 0; $cargo_lock_update //= subcmd_p('lock-update'); + $linkfarm_depth //= $cargo_lock_update ? 'shallow' : ''; our @add; if (!$cargo_lock_update) { push @add, qw(--locked) unless subcmd_p('!locked'); + } + if ($linkfarm_depth eq '') { if (defined($oot_dir) && !subcmd_p('!manifest-path')) { my $cargotoml = "${src_absdir}/Cargo.toml"; push @args_preface, "--manifest-path=$cargotoml" if $pass_options; @@ -608,24 +612,52 @@ sub oot_massage_cmdline () { my ($pre,$post) = ('',''); my @xargs; - if (!$cargo_lock_update) { + if ($linkfarm_depth eq '') { push @xargs, $build_absdir; ($pre, $post) = ('cd "$1"; shift; ', ''); } else { push @xargs, $oot_absdir, $subdir, $src_absdir; - $pre = <<'END'; + $pre = <<'END_BOTH'; cd "$1"; shift; - mkdir -p -- "$1"; cd "$1"; shift; - clean () { find -lname "$1/*" -print0 | xargs -0r rm --; }; clean; - find "$1" -maxdepth 1 \! -name Cargo.lock -print0 | xargs -0r -I_ ln -sf -- _ .; -END + mkdir -p -- "$1"; cd "$1"; shift; src="$1"; shift; +END_BOTH + if ($linkfarm_depth eq 'shallow') { + $pre.= <<'END_SHALLOW'; + clean () { find -lname "$src/*" -print0 | xargs -0r rm --; }; clean; + find "$src" -maxdepth 1 \! -name Cargo.lock -print0 | + xargs -0r sh -ec 'for f in "$@"; do + rm -rf "${f##*/}"; + ln -sf -- "$f" .; + done'; +END_SHALLOW + } else { + $pre .= <<'END_EITHER_DEEP_DIRS'; + clean () { find -follow -lname "$src/*" -print0 | xargs -0r rm --; }; + (set -e; cd "$src"; find . \! -name Cargo.lock \! \( -name .git -prune \) \! -path . \! -name .git -type d -print0) | + xargs -0r sh -ec 'for f in "$@"; do + rm -f "$f" 2>/dev/null ||:; + mkdir -p "$f"; + done' x; +END_EITHER_DEEP_DIRS + if ($linkfarm_depth eq 'git') { + $pre .= <<'END_FILES_GIT' + (set -e; cd "$src"; git ls-files --exclude-standard -co -z) | +END_FILES_GIT + } elsif ($linkfarm_depth eq 'full') { + $pre .= <<'END_FILES_FULL' + (set -e; cd "$src"; find . \! -name Cargo.lock \! \( -name .git -prune \) \! -type d -print0) | +END_FILES_FULL + } + $pre .= <<'END_DEEP'; + xargs -0r sh -ec 'src="$1"; shift; for f in "$@"; do + ln -sf -- "$src/${f#./}" "$f"; + done' x "$src"; +END_DEEP + } $pre .= <<'ENDLK' if $do_cargo_lock && stat_exists 'Cargo.lock', 'working cargo lockfile'; rm -f Cargo.lock; - cp -- "$1"/Cargo.lock .; + cp -- "$src"/Cargo.lock .; ENDLK - $pre .= <<'ENDPRE'; - shift; -ENDPRE $post = <<'ENDCLEAN' if $oot_clean && !$just_linkfarm; clean; ENDCLEAN @@ -947,9 +979,12 @@ sub parse_args () { $target = $_; } elsif (m{^--(on|off)line$}) { $online = $1 eq 'on'; - } elsif (m{^--just-linkfarm$}) { + } elsif (m{^--just-linkfarm(?:=(shallow|git|full))?$}) { $just_linkfarm = 1; - $cargo_lock_update= 1; + $linkfarm_depth = 1 if $1; + $cargo_lock_update= 1; # will set $linkfarm_detph to 1 by default + } elsif (m{^--linkfarm(?:=(no|shallow|git|full))?$}) { + $linkfarm_depth = $1 || 'git'; } elsif (m{^--just-run$}) { $do_nail = $do_cargo_lock = $do_lock = 0; } elsif (m{^--(clean|keep)-linkfarm$}) {