12 Commits

Author SHA1 Message Date
649e16c03a Switch ownership from mdaleo404 to guardutils in README and pyproject 2025-11-27 17:55:29 +00:00
Marco D'Aleo
fc02895965 Merge pull request #18 from mdaleo404/add_badges_to_readme
Add badges to README
2025-11-23 07:32:05 +00:00
feb0d313e8 Add badges to README 2025-11-23 07:29:54 +00:00
af6c7a0797 Fix README 2025-11-17 19:05:32 +00:00
ccaa2dcb25 Update README with new installation methods 2025-11-17 18:56:51 +00:00
Marco D'Aleo
5bb1437a49 Merge pull request #17 from mdaleo404/update_resrm_20251117
Rename workflow and make it trigger on pull requests
2025-11-17 15:10:09 +00:00
3c4bbcbc34 Fix typo in workflow's file name 2025-11-17 15:08:51 +00:00
ba29cc590d Rename workflow and make it trigger on pull requests 2025-11-17 15:06:57 +00:00
Marco D'Aleo
2fd6fbb2c2 Merge pull request #16 from mig5/mig/fix-args-force
Use args.force, not args.f
2025-11-17 14:56:00 +00:00
Miguel Jacq
96f7ebf4fc Use args.force, not args.f 2025-11-17 14:11:32 +11:00
7ba20632ab Change Python dependecies version. Remove Black target-version from pyproject.toml.Remove CI pull_request trigger. 2025-11-16 14:53:57 +00:00
f46e699420 Add more checks on pre-commit-config, add CI workflow 2025-11-16 07:04:13 +00:00
6 changed files with 80 additions and 12 deletions

29
.github/workflows/lint-and-security.yml vendored Normal file
View 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

View File

@@ -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

View File

@@ -1,3 +1,9 @@
[![License](https://img.shields.io/github/license/guardutils/resrm?style=flat)](LICENCE)
[![Language](https://img.shields.io/github/languages/top/guardutils/resrm.svg)](https://github.com/guardutils/resrm/)
![GitHub Release](https://img.shields.io/github/v/release/guardutils/resrm?display_name=release&logo=github)
![PyPI - Version](https://img.shields.io/pypi/v/resrm?logo=pypi)
[![PyPI downloads](https://img.shields.io/pypi/dm/resrm.svg)](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
View File

@@ -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"

View File

@@ -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"]

View File

@@ -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