Skip to content

Commit

Permalink
Always exit unsuccessfully with sys.exit (dbcli#1481)
Browse files Browse the repository at this point in the history
`exit` is undefined when the `site` module isn't loaded (i.e. when
Python is executed with the `-S` option), and `exit` isn't explicitly
defined as a function or imported from elsewhere in `main.py`, so
reaching any code path that attempts to execute `exit(1)` in this
environment results in a `NameError` being raised:

```
Traceback (most recent call last):
    File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
    File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
    File "[...]/__main__.py", line 415, in <module>
    File "[...]/__main__.py", line 399, in run
    File "[...]/__main__.py", line 389, in main
    File "/usr/lib/python3.10/runpy.py", line 220, in run_module
    mod_name, mod_spec, code = _get_module_details(mod_name)
    File "/usr/lib/python3.10/runpy.py", line 157, in _get_module_details
    code = loader.get_code(mod_name)
    File "[...]/__main__.py", line 264, in get_code
    File "[...]/__main__.py", line 204, in load_module
    File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
    File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
    File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
    File "<frozen importlib._bootstrap_external>", line 883, in exec_module
    File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
    File "third_party/python3/__pgcli_main__.py", line 3, in <module>
    File "[...]/click/core.py", line 1157, in __call__
    File "[...]/click/core.py", line 1078, in main
    File "[...]/click/core.py", line 1434, in invoke
    File "[...]/click/core.py", line 783, in invoke
    File "[...]/pgcli/main.py", line 1617, in cli
    File "[...]/pgcli/main.py", line 766, in connect
NameError: name 'exit' is not defined. Did you mean: 'atexit'?
```

When exiting unsuccessfully, do so with `sys.exit(1)` - this is already
used in several other places in `main.py`, and is always used (with exit
code 0) when exiting successfully.
  • Loading branch information
chrisnovakovic authored Oct 5, 2024
1 parent 0fa81ef commit 9b6925e
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 7 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ Contributors:
* Andrew M. MacFie (amacfie)
* saucoide
* Chris Rose (offbyone/offby1)
* Chris Novakovic

Creator:
--------
Expand Down
4 changes: 4 additions & 0 deletions changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ Features
--------
* Add a `--ping` command line option; allows pgcli to replace `pg_isready`

Bug fixes:
----------
* Avoid raising `NameError` when exiting unsuccessfully in some cases

4.1.0 (2024-03-09)
==================

Expand Down
14 changes: 7 additions & 7 deletions pgcli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -610,7 +610,7 @@ def connect_service(self, service, user):
click.secho(
f"service '{service}' was not found in {file}", err=True, fg="red"
)
exit(1)
sys.exit(1)
self.connect(
database=service_config.get("dbname"),
host=service_config.get("host"),
Expand Down Expand Up @@ -710,7 +710,7 @@ def should_ask_for_password(exc):
self.logger.handlers = logger_handlers
self.logger.error("traceback: %r", traceback.format_exc())
click.secho(str(e), err=True, fg="red")
exit(1)
sys.exit(1)
self.logger.handlers = logger_handlers

atexit.register(self.ssh_tunnel.stop)
Expand Down Expand Up @@ -763,7 +763,7 @@ def should_ask_for_password(exc):
self.logger.debug("Database connection failed: %r.", e)
self.logger.error("traceback: %r", traceback.format_exc())
click.secho(str(e), err=True, fg="red")
exit(1)
sys.exit(1)

self.pgexecute = pgexecute

Expand Down Expand Up @@ -1551,7 +1551,7 @@ def cli(
err=True,
fg="red",
)
exit(1)
sys.exit(1)

if ssh_tunnel and not SSH_TUNNEL_SUPPORT:
click.secho(
Expand All @@ -1560,7 +1560,7 @@ def cli(
err=True,
fg="red",
)
exit(1)
sys.exit(1)

pgcli = PGCli(
prompt_passwd,
Expand Down Expand Up @@ -1604,15 +1604,15 @@ def cli(
err=True,
fg="red",
)
exit(1)
sys.exit(1)
except Exception:
click.secho(
"Invalid DSNs found in the config file. "
'Please check the "[alias_dsn]" section in pgclirc.',
err=True,
fg="red",
)
exit(1)
sys.exit(1)
pgcli.connect_uri(dsn_config)
pgcli.dsn_alias = dsn
elif "://" in database:
Expand Down

0 comments on commit 9b6925e

Please sign in to comment.