Re: [PATCH v2 1/1] t1450: use mv -f when overwriting a read only file
- From
Torsten Bögershausen <tboegi@web.de>
- Date
- Oct 25, 2026, 09:02 UTC
- Message-ID
- <20261025090242.GA25750@tb-raspi4>
- In-Reply-To
- <20261025070641.GW33j%taahol@utu.fi>
On Sun, Oct 25, 2026 at 09:06:41AM +0200, Tuomas Ahola wrote:
Show 75 quoted lines
> tboegi@web.de wrote:
>
> > From: Torsten Bögershausen <tboegi@web.de>
> >
> > test case 38 in t/t1450-fsck.sh replaces a loose blob, "$tmp" below,
> > with a trucated version "obj.tmp" using
> >
>
> s/trucated/truncated/
>
> > mv obj.tmp "$obj"
> >
> > This fails on some sytems, like older MacOS.
>
> s/sytems/systems
>
> FWIW, it seems that the glitch was fixed in macOS 12.3 (file_cmds-353.100.22).
>
> > `man mv`
> > includes this information:
> > The following options are available:
> > -f Do not prompt for confirmation before overwriting the destination
> > path. (The -f option overrides any previous -i or -n options.)
> > and further down:
> > If the destination path does not have a mode which permits writing, mv
> > prompts the user for confirmation as specified for the -i option.
> >
> > Running the test case in debug and verbose mode `./t1450-fsck.sh -d -v`
> > shows this lines (which I have shortened to fit into 72 characters)
> >
> > override r--r--r-- user/staff for .git/objects/fc/a75a5be3823dc0560da5?
> > (y/n [n]) not overwritten
> > fca75a5be3823dc0560da57ade678f212aeb33f6
> >
> > POSIX mentions that the observed
> > "prompt to standard error and read a line from standard input"
> > should not be done if "standard input is a terminal".
>
> This replaced "when" with "if" but the meaning didn't change. The observed
> behavior shouldn't happen if the stdin is _not_ a terminal.
>
> > So we may blame the "standard input is a terminal" logic to fail.
>
> Well, macOS versions older than 12.3 just don't have that logic in mv(1).
> Can nonexisting logic fail? (If somebody is interested, the actual change
> in 12.3 was
>
> @@ -265,12 +290,12 @@ do_move(const char *from, const char *to)
> } else if (iflg) {
> (void)fprintf(stderr, "overwrite %s? %s", to, YESNO);
> ask = 1;
> - } else if (access(to, W_OK) && !stat(to, &sb)) {
> + } else if (access(to, W_OK) && !stat(to, &sb) && isatty(STDIN_FILENO)) {
> strmode(sb.st_mode, modep);
> (void)fprintf(stderr, "override %s%s%s/%s for %s? %s",
> modep + 1, modep[9] == ' ' ? "" : " ",
>
> rather simple indeed.)
>
> >
> > Side note: Answering with 'y' to the question of `mv` like this
> > (echo y | mv obj.tmp "$obj")
> > makes the test case pass.
> >
> > To make things not too complicated use the most portable form
> > mv -f obj.tmp "$obj"
> >
> > Signed-off-by: Torsten Bögershausen <tboegi@web.de>
> > ---
> >
> > Thanks to all reviewers.
> > Changes since V1:
> > "should not be done when" -> "should not be done if"
> > Fix "mv -v": it must be "mv -f"
> > []
> Thanks. >
Thanks as well from my side - I will wait a little while before sending out v3