From 315157c2e0c52e9e7b8078ba5c8b79e0b1a3802e Mon Sep 17 00:00:00 2001
From: Eric Wong <e@80x24.org>
Date: Fri, 16 Apr 2021 16:10:31 -0700
Subject: [PATCH] test_common: handle '-C' (chdir) spawn option properly

We use it in t/lei-q-save.t, and were inadvertently writing
to the worktree.

v2: fix -C $DIR with TEST_RUN_MODE=0
---
 lib/PublicInbox/TestCommon.pm | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm
index d506e4b5..2627871a 100644
--- a/lib/PublicInbox/TestCommon.pm
+++ b/lib/PublicInbox/TestCommon.pm
@@ -290,6 +290,10 @@ sub run_script ($;$$) {
 		# spawn an independent new process, like real-world use cases:
 		require PublicInbox::Spawn;
 		my $cmd = [ key2script($key), @argv ];
+		if (my $d = $opt->{'-C'}) {
+			$cmd->[0] = File::Spec->rel2abs($cmd->[0]);
+			$spawn_opt->{'-C'} = $d;
+		}
 		my $pid = PublicInbox::Spawn::spawn($cmd, $env, $spawn_opt);
 		if (defined $pid) {
 			my $r = waitpid($pid, 0) // die "waitpid: $!";
@@ -302,8 +306,14 @@ sub run_script ($;$$) {
 		local %SIG = %SIG;
 		local $0 = join(' ', @$cmd);
 		my $orig_io = _prepare_redirects($fhref);
+		my $cwdfh;
+		if (my $d = $opt->{'-C'}) {
+			opendir $cwdfh, '.' or die "opendir .: $!";
+			chdir $d or die "chdir $d: $!";
+		}
 		_run_sub($sub, $key, \@argv);
 		eval { PublicInbox::Inbox::cleanup_task() };
+		die "chdir(restore): $!" if $cwdfh && !chdir($cwdfh);
 		_undo_redirects($orig_io);
 		select STDOUT;
 	}
-- 
2.50.0