chiark / gitweb /
linkfarm options, not yet documented
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 10 Oct 2020 01:03:09 +0000 (02:03 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 10 Oct 2020 01:03:09 +0000 (02:03 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
nailing-cargo

index 1356a44cb2e5a218df271c48f3474770df11c4ca..35feceb4e9de02542e9cc5c7256ee34d4c4f0568 100755 (executable)
@@ -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$}) {