Skip to content

Commit

Permalink
fix: GethDevProcess.disconnect() deleted the entire data folder on …
Browse files Browse the repository at this point in the history
…disconnect (#2492)
  • Loading branch information
antazoey authored Feb 5, 2025
1 parent 9c09527 commit 142d51b
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/ape_node/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,12 @@ def disconnect(self):

def _clean(self):
if self._data_dir.is_dir():
shutil.rmtree(self._data_dir, ignore_errors=True)
# In case data-dir is being used for something else,
# only delete geth-dev node related stuff.
(self._data_dir / "genesis.json").unlink(missing_ok=True)
shutil.rmtree((self._data_dir / "geth").as_posix(), ignore_errors=True)
shutil.rmtree((self._data_dir / "keystore").as_posix(), ignore_errors=True)
shutil.rmtree((self._data_dir / "subprocess_output").as_posix(), ignore_errors=True)

# dir must exist when initializing chain.
self._data_dir.mkdir(parents=True, exist_ok=True)
Expand Down
23 changes: 23 additions & 0 deletions tests/functional/geth/test_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
)
from ape.utils import to_int
from ape.utils._web3_compat import ExtraDataToPOAMiddleware
from ape.utils.os import create_tempdir
from ape_ethereum.ecosystem import Block
from ape_ethereum.provider import DEFAULT_SETTINGS, EthereumNodeProvider, Web3Provider
from ape_ethereum.trace import TraceApproach
Expand Down Expand Up @@ -947,3 +948,25 @@ def test_geth_dev_block_period(data_folder):
initialize_chain=False,
)
assert geth_dev.geth_kwargs["dev_period"] == "1"


def test_geth_dev_disconnect_does_not_delete_unrelated_files_in_given_data_dir():
"""
One time, I used a data-dir containing other files I didn't want to lose. GethDevProcess
deleted the entire folder during `.disconnect()`, and it was tragic. Ensure this does
not happen to anyone else.
"""
with create_tempdir() as temp_dir:
file = temp_dir / "dont_delete_me_plz.txt"
file.write_text("Please don't delete me.")

geth_dev = GethDevProcess.from_uri(
"path/to/geth.ipc",
temp_dir,
block_time=1,
generate_accounts=False,
initialize_chain=False,
)
geth_dev.disconnect()
assert file.is_file()
assert not (temp_dir / "genesis.json").is_file()

0 comments on commit 142d51b

Please sign in to comment.