Thread: pgindent exit status if a file encounters an error

pgindent exit status if a file encounters an error

From
Ashutosh Bapat
Date:
Hi All,

If pgindent encounters an error while applying pg_bsd_indent on a file, it reports an error to stderr but does not exit with non-zero status.

$ src/tools/pgindent/pgindent .
Failure in ./src/backend/optimizer/util/relnode.c: Error@2412: Stuff missing from end of file

$ echo $?
0

A zero status usually indicates success [1]. In that sense pgindent shouldn't be returning 0 in this case. It has not been able to process file/s successfully. Not returning non-zero exit status in such cases means we can not rely on `set -e` or `git rebase` s automatic detection of command failures. I propose to add non-zero exit status in the above case.

In the attached patch I have used exit code 3 for file processing errors. The program exits only after reporting all such errors instead of exiting on the first instance. That way we get to know all the errors upfront. But I am ok if we want to exit on the first instance. That might simplify its interaction with other exit codes.

With this change, if I run pgident in `git rebase` it stops after those errors automatically like below
```
Executing: src/tools/pgindent/pgindent .
Failure in ./src/backend/optimizer/util/relnode.c: Error@2424: Stuff missing from end of file

Failure in ./src/backend/optimizer/util/appendinfo.c: Error@1028: Stuff missing from end of file

warning: execution failed: src/tools/pgindent/pgindent .
You can fix the problem, and then run

  git rebase --continue
```

I looked at pgindent README but it doesn't mention anything about exit codes. So I believe this change is acceptable as per documentation.

With --check option pgindent reports a non-zero exit code instead of making changes. So I feel the above change should happen at least if --check is provided. But certainly better if we do it even without --check.

In case --check is specified and both the following happen a. pg_bsd_indent exits with non-zero status while processing some file and b. changes are produced while processing some other file, the program will exit with status 2. It may be argued that instead it should exit with code 3. I am open to both.

--
Best Wishes,
Ashutosh Bapat
Attachment

Re: pgindent exit status if a file encounters an error

From
Andrew Dunstan
Date:


On 2024-06-26 We 6:37 AM, Ashutosh Bapat wrote:
Hi All,

If pgindent encounters an error while applying pg_bsd_indent on a file, it reports an error to stderr but does not exit with non-zero status.

$ src/tools/pgindent/pgindent .
Failure in ./src/backend/optimizer/util/relnode.c: Error@2412: Stuff missing from end of file

$ echo $?
0

A zero status usually indicates success [1]. In that sense pgindent shouldn't be returning 0 in this case. It has not been able to process file/s successfully. Not returning non-zero exit status in such cases means we can not rely on `set -e` or `git rebase` s automatic detection of command failures. I propose to add non-zero exit status in the above case.

In the attached patch I have used exit code 3 for file processing errors. The program exits only after reporting all such errors instead of exiting on the first instance. That way we get to know all the errors upfront. But I am ok if we want to exit on the first instance. That might simplify its interaction with other exit codes.

With this change, if I run pgident in `git rebase` it stops after those errors automatically like below
```
Executing: src/tools/pgindent/pgindent .
Failure in ./src/backend/optimizer/util/relnode.c: Error@2424: Stuff missing from end of file

Failure in ./src/backend/optimizer/util/appendinfo.c: Error@1028: Stuff missing from end of file

warning: execution failed: src/tools/pgindent/pgindent .
You can fix the problem, and then run

  git rebase --continue
```

I looked at pgindent README but it doesn't mention anything about exit codes. So I believe this change is acceptable as per documentation.

With --check option pgindent reports a non-zero exit code instead of making changes. So I feel the above change should happen at least if --check is provided. But certainly better if we do it even without --check.

In case --check is specified and both the following happen a. pg_bsd_indent exits with non-zero status while processing some file and b. changes are produced while processing some other file, the program will exit with status 2. It may be argued that instead it should exit with code 3. I am open to both.


Yeah, I think this is reasonable but we should adjust the status setting a few lines lower to


   $status ||= 2;


cheers


andrew


--
Andrew Dunstan
EDB: https://www.enterprisedb.com

Re: pgindent exit status if a file encounters an error

From
Ashutosh Bapat
Date:
Hi Andrew,
Thanks for the quick review.

On Wed, Jun 26, 2024 at 4:53 PM Andrew Dunstan <andrew@dunslane.net> wrote:

With --check option pgindent reports a non-zero exit code instead of making changes. So I feel the above change should happen at least if --check is provided. But certainly better if we do it even without --check.

In case --check is specified and both the following happen a. pg_bsd_indent exits with non-zero status while processing some file and b. changes are produced while processing some other file, the program will exit with status 2. It may be argued that instead it should exit with code 3. I am open to both.


Yeah, I think this is reasonable but we should adjust the status setting a few lines lower to


   $status ||= 2;


So you are suggesting that status 3 is preferred over status 2 when both are applicable. I am fine with that.

Here's what the behaviour looks like: (notice echo $? after running pgindent)

1. Running without --check, if pgindent encounters file processing errors, exit code is 3.
2. Running with --check, exit code depends upon whether pgindent encounters a file with processing error first or a file that undergoes a change.
   a. If it encounters a file that would undergo a change first, exit status is 2
   b. If it encounters a file with processing error first, exit status is 3
3. If --check is specified and no file undergoes a change, but there are file processing errors, it will exit with code 3.

The variation in the second case based on the order of files processed looks fine to me. What do you say?

The usage help mentions exit code 2 specifically while describing --check option but it doesn't mention exit code 1. Neither does the README. So I don't think we need to document exit code 3 anywhere. Please let me know if you think otherwise.

--
Best Wishes,
Ashutosh Bapat
Attachment

Re: pgindent exit status if a file encounters an error

From
Tom Lane
Date:
Ashutosh Bapat <ashutosh.bapat.oss@gmail.com> writes:
> The usage help mentions exit code 2 specifically while describing --check
> option but it doesn't mention exit code 1. Neither does the README. So I
> don't think we need to document exit code 3 anywhere. Please let me know if
> you think otherwise.

I think we should have at least a code comment summarizing the
possible exit codes, along the lines of

# Exit codes:
#   0 -- all OK
#   1 -- could not invoke pgindent, nothing done
#   2 -- --check mode and at least one file requires changes
#   3 -- pgindent failed on at least one file

            regards, tom lane



Re: pgindent exit status if a file encounters an error

From
Ashutosh Bapat
Date:


On Wed, Jun 26, 2024 at 8:54 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Ashutosh Bapat <ashutosh.bapat.oss@gmail.com> writes:
> The usage help mentions exit code 2 specifically while describing --check
> option but it doesn't mention exit code 1. Neither does the README. So I
> don't think we need to document exit code 3 anywhere. Please let me know if
> you think otherwise.

I think we should have at least a code comment summarizing the
possible exit codes, along the lines of

# Exit codes:
#   0 -- all OK
#   1 -- could not invoke pgindent, nothing done
#   2 -- --check mode and at least one file requires changes
#   3 -- pgindent failed on at least one file

Thanks. Here's a patch with these lines.
 
In an offline chat Andrew mentioned that he expects more changes in the patch and he would take care of those. Will review and test his patch.

--
Best Wishes,
Ashutosh Bapat
Attachment