our $do_nail=1;
our $do_cargo_lock=1;
our $do_lock=1;
+our $linkfarm_depth;
#
our %subcmd_props = (
$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;
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
$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$}) {