Compare commits
12 Commits
v0.3.1
...
update_res
| Author | SHA1 | Date | |
|---|---|---|---|
|
649e16c03a
|
|||
|
|
fc02895965 | ||
| feb0d313e8 | |||
| af6c7a0797 | |||
| ccaa2dcb25 | |||
|
|
5bb1437a49 | ||
| 3c4bbcbc34 | |||
| ba29cc590d | |||
|
|
2fd6fbb2c2 | ||
|
|
96f7ebf4fc | ||
| 7ba20632ab | |||
| f46e699420 |
29
.github/workflows/lint-and-security.yml
vendored
Normal file
29
.github/workflows/lint-and-security.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: Lint & Security
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
precommit-and-security:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: "3.13"
|
||||||
|
|
||||||
|
- name: Install pre-commit
|
||||||
|
run: pip install pre-commit
|
||||||
|
|
||||||
|
- name: Run pre-commit hooks
|
||||||
|
uses: pre-commit/action@v3.0.1
|
||||||
|
|
||||||
|
- name: Install pip-audit
|
||||||
|
run: pip install pip-audit
|
||||||
|
|
||||||
|
- name: Run pip-audit
|
||||||
|
run: pip-audit
|
||||||
@@ -17,3 +17,5 @@ repos:
|
|||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
|
- id: check-yaml
|
||||||
|
- id: check-toml
|
||||||
|
|||||||
36
README.md
36
README.md
@@ -1,3 +1,9 @@
|
|||||||
|
[](LICENCE)
|
||||||
|
[](https://github.com/guardutils/resrm/)
|
||||||
|

|
||||||
|

|
||||||
|
[](https://pypi.org/project/resrm/)
|
||||||
|
|
||||||
# resrm
|
# resrm
|
||||||
|
|
||||||
**resrm** is a safe, drop-in replacement for the Linux `rm` command with **undo/restore support**.
|
**resrm** is a safe, drop-in replacement for the Linux `rm` command with **undo/restore support**.
|
||||||
@@ -13,7 +19,8 @@ It moves files to a per-user _trash_ instead of permanently deleting them, while
|
|||||||
- Supports `-r`, `-f`, `-i`, `--skip-trash` options
|
- Supports `-r`, `-f`, `-i`, `--skip-trash` options
|
||||||
- Works with `sudo` for root-owned files
|
- Works with `sudo` for root-owned files
|
||||||
- Automatically prunes Trash entries older than `$RESRM_TRASH_LIFE` days (default **7**, minimum **1**)
|
- Automatically prunes Trash entries older than `$RESRM_TRASH_LIFE` days (default **7**, minimum **1**)
|
||||||
> Note: if you need immediate deletion, use the regular `rm` command instead.
|
|
||||||
|
> Note: if you need immediate deletion, use the `--skip-trash` flag.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -29,26 +36,45 @@ export RESRM_TRASH_LIFE=10
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
### From package manager
|
||||||
|
|
||||||
|
This is the preferred method of installation.
|
||||||
|
|
||||||
|
**Ubuntu 22.04 and 24.04**
|
||||||
|
```
|
||||||
|
sudo add-apt-repository ppa:mdaleo/resrm
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install resrm
|
||||||
|
```
|
||||||
|
|
||||||
|
**Fedora 41, 42, 43**
|
||||||
|
```
|
||||||
|
sudo dnf copr enable mdaleo/resrm
|
||||||
|
sudo dnf install resrm
|
||||||
|
```
|
||||||
|
|
||||||
|
### From PyPI
|
||||||
|
|
||||||
**NOTE:** To use `resrm` with `sudo`, the path to `resrm` must be in the `$PATH` seen by `root`.\
|
**NOTE:** To use `resrm` with `sudo`, the path to `resrm` must be in the `$PATH` seen by `root`.\
|
||||||
Either:
|
Either:
|
||||||
|
|
||||||
* install `resrm` as `root` (_preferred_), or
|
* install `resrm` as `root`, or
|
||||||
* add the path to `resrm` to the `secure_path` parameter in `/etc/sudoers`. For example, where `/home/user/.local/bin` is where `resrm` is:
|
* add the path to `resrm` to the `secure_path` parameter in `/etc/sudoers`. For example, where `/home/user/.local/bin` is where `resrm` is:
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/.local/bin"
|
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/.local/bin"
|
||||||
```
|
```
|
||||||
|
|
||||||
Install via PyPI (_preferred_):
|
Install with:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install resrm
|
pip install resrm
|
||||||
```
|
```
|
||||||
|
|
||||||
Or clone the repo and install locally:
|
### From this repository
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/mdaleo404/resrm.git
|
git clone https://github.com/guardutils/resrm.git
|
||||||
cd resrm/
|
cd resrm/
|
||||||
poetry install
|
poetry install
|
||||||
```
|
```
|
||||||
|
|||||||
16
poetry.lock
generated
16
poetry.lock
generated
@@ -174,6 +174,17 @@ files = [
|
|||||||
{file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"},
|
{file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typing-extensions"
|
||||||
|
version = "4.15.0"
|
||||||
|
description = "Backported and Experimental Type Hints for Python 3.9+"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.9"
|
||||||
|
files = [
|
||||||
|
{file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"},
|
||||||
|
{file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "virtualenv"
|
name = "virtualenv"
|
||||||
version = "20.35.4"
|
version = "20.35.4"
|
||||||
@@ -189,6 +200,7 @@ files = [
|
|||||||
distlib = ">=0.3.7,<1"
|
distlib = ">=0.3.7,<1"
|
||||||
filelock = ">=3.12.2,<4"
|
filelock = ">=3.12.2,<4"
|
||||||
platformdirs = ">=3.9.1,<5"
|
platformdirs = ">=3.9.1,<5"
|
||||||
|
typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""}
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
|
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
|
||||||
@@ -196,5 +208,5 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess
|
|||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.13"
|
python-versions = ">=3.10,<4.0"
|
||||||
content-hash = "0863809e99ebce15ac434c3d43856decb487945ff712f83073c120ee4dc7b850"
|
content-hash = "140de3164bab6e634d9bd113a3ef763c3d9743a4065ff4fc6b57c17881faa858"
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ description = "drop-in replacement for rm with undo/restore built-in."
|
|||||||
authors = ["Marco D'Aleo <marco@marcodaleo.com>"]
|
authors = ["Marco D'Aleo <marco@marcodaleo.com>"]
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
homepage = "https://github.com/mdaleo404/resrm"
|
homepage = "https://github.com/guardutils/resrm"
|
||||||
repository = "https://github.com/mdaleo404/resrm"
|
repository = "https://github.com/guardutils/resrm"
|
||||||
packages = [{include = "resrm", from = "src"}]
|
packages = [{include = "resrm", from = "src"}]
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.13"
|
python = ">=3.10,<4.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
pre-commit = "^3.8"
|
pre-commit = "^3.8"
|
||||||
@@ -20,7 +20,6 @@ resrm = "resrm.cli:main"
|
|||||||
|
|
||||||
[tool.black]
|
[tool.black]
|
||||||
line-length = 79
|
line-length = 79
|
||||||
target-version = ["py313"]
|
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core"]
|
requires = ["poetry-core"]
|
||||||
|
|||||||
@@ -432,7 +432,7 @@ def main(argv: Optional[List[str]] = None):
|
|||||||
pth = Path(p)
|
pth = Path(p)
|
||||||
# simplistic recursive handling: if -r not given and it's a directory, mimic rm behavior: error unless -r
|
# simplistic recursive handling: if -r not given and it's a directory, mimic rm behavior: error unless -r
|
||||||
if pth.is_dir() and not args.r:
|
if pth.is_dir() and not args.r:
|
||||||
if args.f:
|
if args.force:
|
||||||
continue
|
continue
|
||||||
print(f"resrm: cannot remove '{pth}': Is a directory")
|
print(f"resrm: cannot remove '{pth}': Is a directory")
|
||||||
continue
|
continue
|
||||||
|
|||||||
Reference in New Issue
Block a user