492a637
commit 492a637
23 files changed
+690 -7
Showing 23 changed files+690-6
.github/actions/ci-issue/action.yml.github/workflows/branch-protection.yml.github/workflows/ci-issue-handler.yml.github/workflows/ci.yml.github/workflows/pr-automation.yml.github/workflows/release.ymlCONTRIBUTING.mdREADME.mdaur/fetchx-git/.SRCINFOaur/fetchx-git/PKGBUILDaur/fetchx/.SRCINFOaur/fetchx/PKGBUILDbuild-deb.shdebian/changelogdebian/controldebian/copyrightdebian/fetchx.1debian/fetchx.bash-completiondebian/fetchx.desktopdebian/fetchx.zsh-completiondebian/rulesdebian/source/formatdebian/watch
▼.github/actions/ci-issue/action.yml
+19-0
| @@ -0,0 +1,19 @@ | ||
1 | +name: 'Create Issue on CI Failure' | |
2 | +description: 'Creates a GitHub issue when CI checks fail on a pull request' | |
3 | +author: 'FetchX' | |
4 | +inputs: | |
5 | + token: | |
6 | + description: 'GitHub token' | |
7 | + required: true | |
8 | +runs: | |
9 | + using: composite | |
10 | + steps: | |
11 | + - name: Create issue on failure | |
12 | + shell: bash | |
13 | + env: | |
14 | + GITHUB_TOKEN: ${{ inputs.token }} | |
15 | + run: | | |
16 | + echo "Checking CI status..." | |
17 | + | |
18 | + # This action is meant to be called from CI workflow | |
19 | + # See: .github/workflows/ci-issue-handler.yml | |
0 | 20 | |
▼.github/workflows/branch-protection.yml
+79-0
| @@ -0,0 +1,79 @@ | ||
1 | +name: Branch Protection Setup | |
2 | + | |
3 | +on: | |
4 | + workflow_dispatch: | |
5 | + inputs: | |
6 | + branch: | |
7 | + description: 'Branch to protect' | |
8 | + required: true | |
9 | + default: 'main' | |
10 | + type: string | |
11 | + | |
12 | +jobs: | |
13 | + setup-protection: | |
14 | + name: Setup Branch Protection | |
15 | + runs-on: ubuntu-latest | |
16 | + permissions: | |
17 | + contents: read | |
18 | + pull-requests: write | |
19 | + issues: write | |
20 | + steps: | |
21 | + - name: Checkout | |
22 | + uses: actions/checkout@v4 | |
23 | + | |
24 | + - name: Configure Branch Protection | |
25 | + env: | |
26 | + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
27 | + BRANCH: ${{ github.event.inputs.branch }} | |
28 | + run: | | |
29 | + # Set branch protection rules | |
30 | + echo "Setting up branch protection for: $BRANCH" | |
31 | + | |
32 | + # Enable required reviews | |
33 | + curl -X PUT "https://api.github.com/repos/${{ github.repository }}/branches/$BRANCH/protection" \ | |
34 | + -H "Authorization: token $GITHUB_TOKEN" \ | |
35 | + -H "Accept: application/vnd.github.v3+json" \ | |
36 | + -d '{ | |
37 | + "required_status_checks": { | |
38 | + "strict": true, | |
39 | + "contexts": ["ci/lint", "ci/test", "ci/coverage"] | |
40 | + }, | |
41 | + "enforce_admins": true, | |
42 | + "required_pull_request_reviews": { | |
43 | + "dismiss_stale_reviews": true, | |
44 | + "require_code_owner_reviews": true, | |
45 | + "required_reviewers": 1, | |
46 | + "dismiss_restrictions": [] | |
47 | + }, | |
48 | + "restrictions": null, | |
49 | + "allow_force_pushes": false, | |
50 | + "allow_deletions": false, | |
51 | + "require_linear_history": true, | |
52 | + "required_conversation_resolution": true | |
53 | + }' | |
54 | + | |
55 | + echo "Branch protection configured successfully!" | |
56 | + | |
57 | + - name: Enable branch protection for PRs | |
58 | + env: | |
59 | + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
60 | + run: | | |
61 | + # Require branches to be up to date before merging | |
62 | + curl -X PUT "https://api.github.com/repos/${{ github.repository }}/branches/main/protection/required_status_checks" \ | |
63 | + -H "Authorization: token $GITHUB_TOKEN" \ | |
64 | + -H "Accept: application/vnd.github.v3+json" \ | |
65 | + -d '{ | |
66 | + "strict": true, | |
67 | + "contexts": ["ci/lint", "ci/test", "ci/coverage"] | |
68 | + }' | |
69 | + | |
70 | + echo "Required status checks configured!" | |
71 | + | |
72 | + - name: Configure branch protection rules | |
73 | + env: | |
74 | + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
75 | + run: | | |
76 | + # Get current protection status | |
77 | + curl -s "https://api.github.com/repos/${{ github.repository }}/branches/main/protection" \ | |
78 | + -H "Authorization: token $GITHUB_TOKEN" \ | |
79 | + -H "Accept: application/vnd.github.v3+json" | jq '.' | |
0 | 80 | |
▼.github/workflows/ci-issue-handler.yml
+70-0
| @@ -0,0 +1,70 @@ | ||
1 | +name: CI Issue Handler | |
2 | + | |
3 | +on: | |
4 | + workflow_run: | |
5 | + workflows: [CI] | |
6 | + types: [completed] | |
7 | + | |
8 | +jobs: | |
9 | + handle-ci-failure: | |
10 | + name: Handle CI Failure | |
11 | + runs-on: ubuntu-latest | |
12 | + permissions: | |
13 | + contents: read | |
14 | + pull-requests: write | |
15 | + issues: write | |
16 | + if: ${{ github.event.workflow_run.conclusion == 'failure' }} | |
17 | + steps: | |
18 | + - name: Find related PR | |
19 | + id: find-pr | |
20 | + uses: actions/github-script@v7 | |
21 | + with: | |
22 | + github-token: ${{ secrets.GITHUB_TOKEN }} | |
23 | + result-variables: pr_number | |
24 | + script: | | |
25 | + const owner = context.repo.owner; | |
26 | + const repo = context.repo.repo; | |
27 | + const sha = context.payload.workflow_run.head_sha; | |
28 | + | |
29 | + const { data: prs } = await github.rest.search.issuesAndPullRequests({ | |
30 | + q: sha + ' is:pr repo:' + owner + '/' + repo | |
31 | + }); | |
32 | + | |
33 | + if (prs.items.length > 0) { | |
34 | + return prs.items[0].number; | |
35 | + } | |
36 | + return null; | |
37 | + | |
38 | + - name: Create issue | |
39 | + if: steps.find-pr.outputs.result != '' | |
40 | + uses: actions/github-script@v7 | |
41 | + with: | |
42 | + github-token: ${{ secrets.GITHUB_TOKEN }} | |
43 | + script: | | |
44 | + const owner = context.repo.owner; | |
45 | + const repo = context.repo.repo; | |
46 | + const prNumber = '${{ steps.find-pr.outputs.result }}'; | |
47 | + | |
48 | + const issueTitle = '[CI Failure] PR #' + prNumber + ' Failed'; | |
49 | + const issueBody = '## CI Failure Detected\n\n' + | |
50 | + '**Pull Request:** #' + prNumber + '\n' + | |
51 | + '**Workflow:** ' + context.payload.workflow_run.name + '\n' + | |
52 | + '**Commit:** `' + context.payload.workflow_run.head_sha.substring(0, 7) + '`\n\n' + | |
53 | + '### Action Required:\n' + | |
54 | + 'Please fix the failing checks and push the fixes to this PR.\n\n' + | |
55 | + '---\n*This issue was automatically created by the CI Issue Handler.*'; | |
56 | + | |
57 | + const { data: newIssue } = await github.rest.issues.create({ | |
58 | + owner, | |
59 | + repo, | |
60 | + title: issueTitle, | |
61 | + body: issueBody, | |
62 | + labels: ['ci-failure', 'automated'] | |
63 | + }); | |
64 | + | |
65 | + await github.rest.issues.createComment({ | |
66 | + owner, | |
67 | + repo, | |
68 | + issue_number: parseInt(prNumber), | |
69 | + body: '⚠️ **CI Failure Detected!**\n\nAn issue has been created: #' + newIssue.number | |
70 | + }); | |
0 | 71 | |
▼.github/workflows/ci.yml
+2-2
| @@ -13,7 +13,7 @@ env: | ||
13 | 13 | jobs: |
14 | 14 | # ── Lint ───────────────────── ──────────────────────────────────────────────── |
15 | 15 | lint: |
16 | - name: Lint & Format | |
16 | + name: Lint (fmt + clippy) | |
17 | 17 | runs-on: ubuntu-latest |
18 | 18 | steps: |
19 | 19 | - uses: actions/checkout@v4 |
| @@ -75,7 +75,7 @@ jobs: | ||
75 | 75 | |
76 | 76 | # ── Coverage ───────────────────────────────────────────────────────────────── |
77 | 77 | coverage: |
78 | - name: Code Coverage | |
78 | + name: Coverage | |
79 | 79 | runs-on: ubuntu-latest |
80 | 80 | steps: |
81 | 81 | - uses: actions/checkout@v4 |
82 | 82 | |
▼.github/workflows/pr-automation.yml
+28-0
| @@ -0,0 +1,28 @@ | ||
1 | +name: PR Review Automation | |
2 | + | |
3 | +on: | |
4 | + pull_request: | |
5 | + types: [opened, reopened, synchronize, closed] | |
6 | + | |
7 | +jobs: | |
8 | + pr-automation: | |
9 | + name: PR Automation | |
10 | + runs-on: ubuntu-latest | |
11 | + permissions: | |
12 | + contents: read | |
13 | + pull-requests: write | |
14 | + issues: write | |
15 | + steps: | |
16 | + - name: Run PR automation | |
17 | + env: | |
18 | + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
19 | + run: | | |
20 | + # This workflow handles: | |
21 | + # 1. Creates issues on CI failure | |
22 | + # 2. Closes issues when CI passes | |
23 | + # 3. Checks for required approvals | |
24 | + # 4. Adds labels based on changes | |
25 | + | |
26 | + echo "PR Number: ${{ github.event.pull_request.number }}" | |
27 | + echo "PR Action: ${{ github.event.action }}" | |
28 | + echo "Head SHA: ${{ github.event.pull_request.head.sha }}" | |
0 | 29 | |
▼.github/workflows/release.yml
+13-1
| @@ -30,6 +30,11 @@ jobs: | ||
30 | 30 | binary: fetchx |
31 | 31 | archive: fetchx-linux-aarch64.tar.gz |
32 | 32 | |
33 | + - os: ubuntu-latest | |
34 | + target: armv7-unknown-linux-gnueabihf | |
35 | + binary: fetchx | |
36 | + archive: fetchx-linux-armv7.tar.gz | |
37 | + | |
33 | 38 | - os: macos-latest |
34 | 39 | target: x86_64-apple-darwin |
35 | 40 | binary: fetchx |
| @@ -48,16 +53,23 @@ jobs: | ||
48 | 53 | with: |
49 | 54 | targets: ${{ matrix.target }} |
50 | 55 | |
51 | - - name: Install cross-compilation tools | |
56 | + - name: Install cross-compilation tools (aarch64) | |
52 | 57 | if: matrix.target == 'aarch64-unknown-linux-gnu' |
53 | 58 | run: | |
54 | 59 | sudo apt-get update |
55 | 60 | sudo apt-get install -y gcc-aarch64-linux-gnu |
56 | 61 | |
62 | + - name: Install cross-compilation tools (armv7) | |
63 | + if: matrix.target == 'armv7-unknown-linux-gnueabihf' | |
64 | + run: | | |
65 | + sudo apt-get update | |
66 | + sudo apt-get install -y gcc-arm-linux-gnueabihf | |
67 | + | |
57 | 68 | - name: Build release binary |
58 | 69 | run: cargo build --release --target ${{ matrix.target }} |
59 | 70 | env: |
60 | 71 | CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc |
72 | + CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: arm-linux-gnueabihf-gcc | |
61 | 73 | |
62 | 74 | - name: Package binary |
63 | 75 | run: | |
64 | 76 | |
▼CONTRIBUTING.md
+30-2
| @@ -241,6 +241,21 @@ cargo tarpaulin --all-features | ||
241 | 241 | |
242 | 242 | ## Pull Request Process |
243 | 243 | |
244 | +### Branch Protection Rules | |
245 | + | |
246 | +The `main` branch is protected with the following rules: | |
247 | + | |
248 | +| Rule | Description | | |
249 | +| ---- |-------------| | |
250 | +| **Require Reviews** | At least 1 approval required | | |
251 | +| **Require Code Owner Review** | Code owner must approve | | |
252 | +| **Require Status Checks** | CI must pass (lint, test, coverage) | | |
253 | +| **Require Up-to-date** | Branch must be rebased on main | | |
254 | +| **Require Linear History** | No merge commits allowed | | |
255 | +| **Require Conversation Resolution** | All comments must be resolved | | |
256 | + | |
257 | +### Workflow | |
258 | + | |
244 | 259 | 1. **Fork** the repository and create a feature branch from `main` |
245 | 260 | |
246 | 261 | 2. **Make your changes** — keep PRs focused on one thing |
| @@ -258,11 +273,24 @@ cargo tarpaulin --all-features | ||
258 | 273 | |
259 | 274 | 5. **Fill out the PR template** — describe changes, link issues, add screenshots |
260 | 275 | |
261 | -6. **Wait for CI** — all checks must pass (lint, test, build) | |
276 | +6. **Wait for CI** — all checks must pass: | |
277 | + - `ci/lint` - Format and Clippy | |
278 | + - `ci/test` - Unit tests | |
279 | + - `ci/coverage` - Code coverage | |
262 | 280 | |
263 | 281 | 7. **Address review feedback** — maintainers may request changes |
264 | 282 | |
265 | -8. **Merge!** — once approved, a maintainer will merge your PR | |
283 | +8. **Resolve all conversations** before requesting merge | |
284 | + | |
285 | +9. **Merge!** — once approved and all checks pass, maintainer will merge | |
286 | + | |
287 | +### CI Failure Handling | |
288 | + | |
289 | +If CI fails: | |
290 | +- An issue is automatically created tracking the failure | |
291 | +- The PR gets a comment with failure details | |
292 | +- Fix the issues and push new commits | |
293 | +- When CI passes, the issue is automatically closed | |
266 | 294 | |
267 | 295 | ### PR Tips |
268 | 296 | |
269 | 297 | |
▼README.md
+32-1
| @@ -15,6 +15,8 @@ | ||
15 | 15 | |
16 | 16 | <p align="center"> |
17 | 17 | <a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"></a> |
18 | + <a href="https://crates.io/crates/fetchx"><img src="https://img.shields.io/crates/v/fetchx.svg" alt="crates.io"></a> | |
19 | + <a href="https://aur.archlinux.org/packages/fetchx"><img src="https://img.shields.io/aur/version/fetchx" alt="AUR"></a> | |
18 | 20 | <a href="https://github.com/swadhinbiswas/fetchx/releases"><img src="https://img.shields.io/badge/version-0.2.0-green.svg" alt="Version 0.2.0"></a> |
19 | 21 | <a href="https://www.rust-lang.org/"><img src="https://img.shields.io/badge/rust-2021-orange.svg" alt="Rust 2021"></a> |
20 | 22 | <a href="https://github.com/swadhinbiswas/fetchx/actions"><img src="https://img.shields.io/badge/tests-45%20passing-brightgreen.svg" alt="45 Tests Passing"></a> |
| @@ -89,6 +91,7 @@ | ||
89 | 91 | - [With Make](#with-make) |
90 | 92 | - [From Cargo](#from-cargo) |
91 | 93 | - [Arch Linux / CachyOS / Manjaro (AUR)](#arch-linux--cachyos--manjaro-aur) |
94 | + - [Debian / Ubuntu / APT](#debian--ubuntu--apt) | |
92 | 95 | - [Shell Aliases (Replace neofetch)](#shell-aliases-replace-neofetch) |
93 | 96 | - [Configuration](#configuration) |
94 | 97 | - [Getting Started](#getting-started) |
| @@ -202,19 +205,46 @@ make PREFIX=~/.local install # Install to ~/.local/bin | ||
202 | 205 | ### From Cargo |
203 | 206 | |
204 | 207 | ```bash |
208 | +# Install from crates.io (recommended) | |
209 | +cargo install fetchx | |
210 | + | |
211 | +# Or install from git | |
205 | 212 | cargo install --git https://github.com/swadhinbiswas/fetchx.git |
206 | 213 | ``` |
207 | 214 | |
208 | 215 | ### Arch Linux / CachyOS / Manjaro (AUR) |
209 | 216 | |
217 | +<a href="https://aur.archlinux.org/packages/fetchx"><img src="https://img.shields.io/aur/version/fetchx" alt="AUR Stable"></a> | |
218 | +<a href="https://aur.archlinux.org/packages/fetchx-git"><img src="https://img.shields.io/aur/version/fetchx-git" alt="AUR Git"></a> | |
219 | + | |
210 | 220 | ```bash |
211 | -# If you have an AUR helper like yay or paru: | |
221 | +# Stable version (recommended) | |
222 | +yay -S fetchx | |
223 | + | |
224 | +# Or git version (latest features) | |
212 | 225 | yay -S fetchx-git |
226 | + | |
227 | +# With paru | |
228 | +paru -S fetchx | |
213 | 229 | # or |
214 | 230 | paru -S fetchx-git |
215 | 231 | ``` |
216 | 232 | |
233 | +### Debian / Ubuntu / APT | |
234 | + | |
235 | +```bash | |
236 | +# Download the .deb package from releases | |
237 | +# https://github.com/swadhinbiswas/fetchx/releases | |
238 | + | |
239 | +# Install with: | |
240 | +sudo dpkg -i fetchx_0.2.0_amd64.deb | |
241 | +sudo apt-get install -f # install dependencies | |
242 | + | |
243 | +# Or build from source: | |
244 | +./build-deb.sh--- | |
245 | +``` | |
246 | + | |
247 | + | |
217 | 248 | |
218 | 249 | ## Shell Aliases (Replace neofetch) |
219 | 250 | |
220 | 251 | |
▼aur/fetchx-git/.SRCINFO
+19-0
| @@ -0,0 +1,19 @@ | ||
1 | +pkgbase = fetchx-git | |
2 | + pkgdesc = A blazing-fast, feature-rich system information tool written in Rust - The modern neofetch replacement (git version) | |
3 | + pkgver = 0.2.0.r0.gabcdef0 | |
4 | + pkgrel = 1 | |
5 | + url = https://github.com/swadhinbiswas/fetchx | |
6 | + arch = x86_64 | |
7 | + arch = aarch64 | |
8 | + arch = armv7l | |
9 | + license = MIT | |
10 | + makedepends = cargo | |
11 | + makedepends = git | |
12 | + depends = gcc | |
13 | + depends = pkgconf | |
14 | + provides = fetchx | |
15 | + conflicts = fetchx | |
16 | + source = git+https://github.com/swadhinbiswas/fetchx.git | |
17 | + sha256sums = SKIP | |
18 | + | |
19 | + pkgname = fetchx-git | |
0 | 20 | |
▼aur/fetchx-git/PKGBUILD
+54-0
| @@ -0,0 +1,54 @@ | ||
1 | +# Maintainer: Swadhin Biswas <[email protected]> | |
2 | +# Contributor: Your Name <your@email> | |
3 | + | |
4 | +pkgname=fetchx-git | |
5 | +_pkgname=fetchx | |
6 | +pkgver=0.2.0.r0.gabcdef0 | |
7 | +pkgrel=1 | |
8 | +pkgdesc="A blazing-fast, feature-rich system information tool written in Rust - The modern neofetch replacement (git version)" | |
9 | +arch=('x86_64' 'aarch64' 'armv7l') | |
10 | +url="https://github.com/swadhinbiswas/fetchx" | |
11 | +license=('MIT') | |
12 | +makedepends=('cargo' 'git') | |
13 | +depends=('gcc' 'pkgconf') | |
14 | +provides=('fetchx') | |
15 | +conflicts=('fetchx') | |
16 | +source=("git+https://github.com/swadhinbiswas/fetchx.git") | |
17 | +sha256sums=('SKIP') | |
18 | + | |
19 | +pkgver() { | |
20 | + cd "$srcdir/$_pkgname" | |
21 | + git describe --long --tags | sed 's/^v//' | sed 's/\([^-]*-\)\(g\)/\1r\2/' | |
22 | +} | |
23 | + | |
24 | +build() { | |
25 | + cd "$srcdir/$_pkgname" | |
26 | + cargo build --release --locked | |
27 | +} | |
28 | + | |
29 | +package() { | |
30 | + cd "$srcdir/$_pkgname" | |
31 | + install -Dm755 target/release/fetchx -t "$pkgdir/usr/bin/" | |
32 | + | |
33 | + # Generate and install man page | |
34 | + cargo run --release --locked -- --help > /dev/null 2>&1 || true | |
35 | + if [ -f "target/release/fetchx" ]; then | |
36 | + # Basic man page content | |
37 | + mkdir -p "$pkgdir/usr/share/man/man1" | |
38 | + cat > "$pkgdir/usr/share/man/man1/fetchx.1" << 'EOF' | |
39 | +.TH FETCHX 1 "March 2026" "FetchX 0.2.0" | |
40 | +.SH NAME | |
41 | +fetchx \- A blazing-fast system information tool | |
42 | +.SH SYNOPSIS | |
43 | +\fBfetchx\fR [OPTIONS] | |
44 | +.SH DESCRIPTION | |
45 | +FetchX is a modern neofetch replacement written in Rust. | |
46 | +.SH OPTIONS | |
47 | +See \fBfetchx \-\-help\fR for full options. | |
48 | +.SH AUTHOR | |
49 | +Swadhin Biswas <[email protected]> | |
50 | +.SH LICENSE | |
51 | +MIT | |
52 | +EOF | |
53 | + fi | |
54 | +} | |
0 | 55 | |
▼aur/fetchx/.SRCINFO
+19-0
| @@ -0,0 +1,19 @@ | ||
1 | +pkgbase = fetchx | |
2 | + pkgdesc = A blazing-fast, feature-rich system information tool written in Rust - The modern neofetch replacement | |
3 | + pkgver = 0.2.0 | |
4 | + pkgrel = 1 | |
5 | + url = https://github.com/swadhinbiswas/fetchx | |
6 | + arch = x86_64 | |
7 | + arch = aarch64 | |
8 | + arch = armv7l | |
9 | + license = MIT | |
10 | + makedepends = cargo | |
11 | + depends = gcc | |
12 | + depends = pkgconf | |
13 | + source = fetchx-0.2.0.tar.gz::https://github.com/swadhinbiswas/fetchx/releases/download/v0.2.0/fetchx-0.2.0-x86_64-unknown-linux-gnu.tar.gz | |
14 | + source = fetchx-0.2.0-aarch64.tar.gz::https://github.com/swadhinbiswas/fetchx/releases/download/v0.2.0/fetchx-0.2.0-aarch64-unknown-linux-gnu.tar.gz | |
15 | + sha256sums = SKIP | |
16 | + sha256sums = SKIP | |
17 | + options = !strip | |
18 | + | |
19 | + pkgname = fetchx | |
0 | 20 | |
▼aur/fetchx/PKGBUILD
+38-0
| @@ -0,0 +1,38 @@ | ||
1 | +# Maintainer: Swadhin Biswas <[email protected]> | |
2 | +# Contributor: Your Name <your@email> | |
3 | + | |
4 | +pkgname=fetchx | |
5 | +pkgver=0.2.0 | |
6 | +pkgrel=1 | |
7 | +pkgdesc="A blazing-fast, feature-rich system information tool written in Rust - The modern neofetch replacement" | |
8 | +arch=('x86_64' 'aarch64' 'armv7l') | |
9 | +url="https://github.com/swadhinbiswas/fetchx" | |
10 | +license=('MIT') | |
11 | +makedepends=('cargo') | |
12 | +depends=('gcc' 'pkgconf') | |
13 | +source=("$pkgname-$pkgver.tar.gz::https://github.com/swadhinbiswas/fetchx/releases/download/v$pkgver/fetchx-$pkgver-x86_64-unknown-linux-gnu.tar.gz" | |
14 | + "$pkgname-$pkgver-aarch64.tar.gz::https://github.com/swadhinbiswas/fetchx/releases/download/v$pkgver/fetchx-$pkgver-aarch64-unknown-linux-gnu.tar.gz") | |
15 | +sha256sums=('SKIP' | |
16 | + 'SKIP') | |
17 | +options=('!strip') | |
18 | + | |
19 | +package() { | |
20 | + # x86_64 | |
21 | + install -Dm755 fetchx-$pkgver-x86_64-unknown-linux-gnu/fetchx -t "$pkgdir/usr/bin/" | |
22 | + | |
23 | + # aarch64 | |
24 | + if [ -d "fetchx-$pkgver-aarch64-unknown-linux-gnu" ]; then | |
25 | + install -Dm755 fetchx-$pkgver-aarch64-unknown-linux-gnu/fetchx -t "$pkgdir/usr/bin/" | |
26 | + fi | |
27 | + | |
28 | + # Install man page | |
29 | + install -Dm644 "$srcdir/$pkgname-$pkgver-x86_64-unknown-linux-gnu/$pkgname.1" "$pkgdir/usr/share/man/man1/$pkgname.1" || true | |
30 | + | |
31 | + # Install bash completion | |
32 | + install -Dm644 "$srcdir/$pkgname-$pkgver-x86_64-unknown-linux-gnu/completions/fetchx.bash" \ | |
33 | + "$pkgdir/usr/share/bash-completion/completions/fetchx" || true | |
34 | + | |
35 | + # Install zsh completion | |
36 | + install -Dm644 "$srcdir/$pkgname-$pkgver-x86_64-unknown-linux-gnu/completions/fetchx.zsh" \ | |
37 | + "$pkgdir/usr/share/zsh/site-functions/_fetchx" || true | |
38 | +} | |
0 | 39 | |
▼build-deb.sh
+42-0
| @@ -0,0 +1,42 @@ | ||
1 | +#!/bin/bash | |
2 | +# Build DEB package for fetchx | |
3 | + | |
4 | +set -e | |
5 | + | |
6 | +VERSION="0.2.0" | |
7 | +ARCH="amd64" | |
8 | +PACKAGE_NAME="fetchx_${VERSION}_${ARCH}" | |
9 | + | |
10 | +echo "Building fetchx DEB package..." | |
11 | + | |
12 | +# Build the binary | |
13 | +cargo build --release --locked | |
14 | + | |
15 | +# Create package directory structure | |
16 | +mkdir -p "$PACKAGE_NAME/usr/bin" | |
17 | +mkdir -p "$PACKAGE_NAME/usr/share/applications" | |
18 | +mkdir -p "$PACKAGE_NAME/usr/share/bash-completion/completions" | |
19 | +mkdir -p "$PACKAGE_NAME/usr/share/zsh/vendor-completions" | |
20 | +mkdir -p "$PACKAGE_NAME/usr/share/man/man1" | |
21 | + | |
22 | +# Install binary | |
23 | +install -Dm755 target/release/fetchx "$PACKAGE_NAME/usr/bin/fetchx" | |
24 | + | |
25 | +# Install desktop file | |
26 | +install -Dm644 debian/fetchx.desktop "$PACKAGE_NAME/usr/share/applications/fetchx.desktop" | |
27 | + | |
28 | +# Install completions | |
29 | +install -Dm644 debian/fetchx.bash-completion "$PACKAGE_NAME/usr/share/bash-completion/completions/fetchx" | |
30 | +install -Dm644 debian/fetchx.zsh-completion "$PACKAGE_NAME/usr/share/zsh/vendor-completions/_fetchx" | |
31 | + | |
32 | +# Install man page | |
33 | +install -Dm644 debian/fetchx.1 "$PACKAGE_NAME/usr/share/man/man1/fetchx.1" | |
34 | + | |
35 | +# Create DEB package | |
36 | +dpkg-deb --build "$PACKAGE_NAME" | |
37 | + | |
38 | +echo "Package created: $PACKAGE_NAME.deb" | |
39 | +echo "" | |
40 | +echo "To install:" | |
41 | +echo " sudo dpkg -i $PACKAGE_NAME.deb" | |
42 | +echo " sudo apt-get install -f # to install dependencies" | |
0 | 43 | |
▼debian/changelog
+12-0
| @@ -0,0 +1,12 @@ | ||
1 | +fetchx (0.2.0) stable; urgency=low | |
2 | + | |
3 | + * Initial release on crates.io | |
4 | + * Added 5 image backends (kitty, sixel, chafa, w3m, iterm2) | |
5 | + * Added smart image caching with random images | |
6 | + * Added 60+ distro logos | |
7 | + * Added Nerd Font icons support | |
8 | + * Added progress bars for memory and disk | |
9 | + * Added JSON output | |
10 | + * Added daemon mode for status bars | |
11 | + | |
12 | + -- Swadhin Biswas <[email protected]> Tue, 04 Mar 2026 00:00:00 +0000 | |
0 | 13 | |
▼debian/control
+25-0
| @@ -0,0 +1,25 @@ | ||
1 | +Source: fetchx | |
2 | +Section: utils | |
3 | +Priority: optional | |
4 | +Maintainer: Swadhin Biswas <[email protected]> | |
5 | +Build-Depends: cargo, rustc | |
6 | +Standards-Version: 4.6.2 | |
7 | +Homepage: https://github.com/swadhinbiswas/fetchx | |
8 | +Vcs-Git: https://github.com/swadhinbiswas/fetchx.git | |
9 | + | |
10 | +Package: fetchx | |
11 | +Architecture: any | |
12 | +Depends: ${shlibs:Depends}, ${misc:Depends} | |
13 | +Description: A blazing-fast, feature-rich system information tool | |
14 | + FetchX is a modern neofetch replacement written in Rust. It displays | |
15 | + system information with ASCII art or images in the terminal. | |
16 | + . | |
17 | + Features: | |
18 | + - Blazing fast (10-50ms vs neofetch's 200-500ms) | |
19 | + - 5 image backends (kitty, sixel, chafa, w3m, iterm2) | |
20 | + - Smart image caching with random images | |
21 | + - 60+ distro logos | |
22 | + - Nerd Font icons support | |
23 | + - Progress bars for memory and disk | |
24 | + - JSON output for scripting | |
25 | + - Daemon mode for status bars | |
0 | 26 | |
▼debian/copyright
+27-0
| @@ -0,0 +1,27 @@ | ||
1 | +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ | |
2 | +Upstream-Name: fetchx | |
3 | +Upstream-Contact: Swadhin Biswas <[email protected]> | |
4 | +Source: https://github.com/swadhinbiswas/fetchx | |
5 | + | |
6 | +Files: * | |
7 | +Copyright: 2024-2026 Swadhin Biswas | |
8 | +License: MIT | |
9 | + | |
10 | +License: MIT | |
11 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
12 | + of this software and associated documentation files (the "Software"), to deal | |
13 | + in the Software without restriction, including without limitation the rights | |
14 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
15 | + copies of the Software, and to permit persons to whom the Software is | |
16 | + furnished to do so, subject to the following conditions: | |
17 | + . | |
18 | + The above copyright notice and this permission notice shall be included in all | |
19 | + copies or substantial portions of the Software. | |
20 | + . | |
21 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
22 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
23 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
24 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
25 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
26 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
27 | + SOFTWARE. | |
0 | 28 | |
▼debian/fetchx.1
+83-0
| @@ -0,0 +1,83 @@ | ||
1 | +.TH FETCHX 1 "March 2026" "FetchX 0.2.0" "User Commands" | |
2 | +.SH NAME | |
3 | +fetchx \- A blazing-fast system information tool written in Rust | |
4 | +.SH SYNOPSIS | |
5 | +\fBfetchx\fR [OPTIONS] | |
6 | +.SH DESCRIPTION | |
7 | +FetchX is a modern neofetch replacement written in Rust. It displays system information with ASCII art or images in the terminal. | |
8 | +.SH OPTIONS | |
9 | +.TP | |
10 | +\fB\-b, --backend\fR <BACKEND> | |
11 | +Image backend: ascii, kitty, sixel, chafa, w3m, iterm2, off | |
12 | +.TP | |
13 | +\fB\-s, --source\fR <SOURCE> | |
14 | +Image source: auto, ascii, wallpaper | |
15 | +.TP | |
16 | +\fB--ascii-distro\fR <DISTRO> | |
17 | +Which distro's ASCII art to display | |
18 | +.TP | |
19 | +\fB\-\-emoji\fR | |
20 | +Use emoji mode | |
21 | +.TP | |
22 | +\fB\-\-nerd-font\fR | |
23 | +Use Nerd Font icons for labels | |
24 | +.TP | |
25 | +\fB\-c, --custom-image\fR <PATH> | |
26 | +Path to custom image | |
27 | +.TP | |
28 | +\fB\-l, --logo-only\fR | |
29 | +Only show the logo, no info | |
30 | +.TP | |
31 | +\fB--json\fR | |
32 | +Print output as JSON | |
33 | +.TP | |
34 | +\fB--no-color\fR | |
35 | +Disable colors in output | |
36 | +.TP | |
37 | +\fB--stdout\fR | |
38 | +Disable formatting (for piping) | |
39 | +.TP | |
40 | +\fB--create-config\fR | |
41 | +Create default config file | |
42 | +.TP | |
43 | +\fB--show-config\fR | |
44 | +Show config file path | |
45 | +.TP | |
46 | +\fB--print-config\fR | |
47 | +Print default config to stdout | |
48 | +.TP | |
49 | +\fB--select-image\fR | |
50 | +Interactive image selector | |
51 | +.TP | |
52 | +\fB--init-api-image\fR | |
53 | +Quick setup: enable kitty + API images | |
54 | +.TP | |
55 | +\fB--daemon\fR | |
56 | +Run as background daemon | |
57 | +.TP | |
58 | +\fB--tray-status\fR | |
59 | +Compact status for tray widgets | |
60 | +.TP | |
61 | +\fB\-h, --help\fR | |
62 | +Print help | |
63 | +.TP | |
64 | +\fB\-V, --version\fR | |
65 | +Print version | |
66 | +.SH CONFIGURATION | |
67 | +Config file is located at: ~/.config/fetchx/config.toml | |
68 | +.SH EXAMPLES | |
69 | +.TP | |
70 | +Basic usage: | |
71 | +$ fetchx | |
72 | +.TP | |
73 | +With kitty image: | |
74 | +$ fetchx --backend kitty | |
75 | +.TP | |
76 | +JSON output: | |
77 | +$ fetchx --json | |
78 | +.SH AUTHOR | |
79 | +Written by Swadhin Biswas <[email protected]> | |
80 | +.SH LICENSE | |
81 | +MIT License | |
82 | +.SH SEE ALSO | |
83 | +neofetch(1), fastfetch(1) | |
0 | 84 | |
▼debian/fetchx.bash-completion
+29-0
| @@ -0,0 +1,29 @@ | ||
1 | +# fetchx bash completion | |
2 | + | |
3 | +_fetchx() { | |
4 | + local cur prev opts | |
5 | + COMPREPLY=() | |
6 | + cur="${COMP_WORDS[COMP_CWORD]}" | |
7 | + prev="${COMP_WORDS[COMP_CWORD-1]}" | |
8 | + | |
9 | + opts="--help --version --json --logo-only --emoji --nerd-font --stdout --no-color | |
10 | + --bold --backend --source --ascii-distro --custom-image --gap --separator | |
11 | + --show-config --print-config --create-config --select-image --init-api-image | |
12 | + --daemon --tray-status --block-range-start --block-range-end --block-width" | |
13 | + | |
14 | + case "${prev}" in | |
15 | + --backend|-b) | |
16 | + COMPREPLY=($(compgen -W "ascii kitty sixel chafa w3m iterm2 off" -- ${cur})) | |
17 | + return 0 | |
18 | + ;; | |
19 | + --source|-s) | |
20 | + COMPREPLY=($(compgen -W "auto ascii wallpaper" -- ${cur})) | |
21 | + return 0 | |
22 | + ;; | |
23 | + esac | |
24 | + | |
25 | + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) | |
26 | + return 0 | |
27 | +} | |
28 | + | |
29 | +complete -F _fetchx fetchx | |
0 | 30 | |
▼debian/fetchx.desktop
+9-0
| @@ -0,0 +1,9 @@ | ||
1 | +[Desktop Entry] | |
2 | +Name=FetchX | |
3 | +Comment=A blazing-fast system information tool | |
4 | +Exec=fetchx | |
5 | +Icon=utilities-terminal | |
6 | +Terminal=true | |
7 | +Type=Application | |
8 | +Categories=Utility;System;Information; | |
9 | +Keywords=neofetch;fetch;system;info;terminal; | |
0 | 10 | |
▼debian/fetchx.zsh-completion
+41-0
| @@ -0,0 +1,41 @@ | ||
1 | +#fetchx zsh completion | |
2 | + | |
3 | +autoload -U compinit | |
4 | +compinit | |
5 | + | |
6 | +typeset -A opt_args | |
7 | +local context state line | |
8 | + | |
9 | +_fetchx() { | |
10 | + _arguments -C \ | |
11 | + '--help[Show help message]' \ | |
12 | + '--version[Show version information]' \ | |
13 | + '--json[Print output as JSON]' \ | |
14 | + '--logo-only[Only show the logo]' \ | |
15 | + '--emoji[Use emoji mode]' \ | |
16 | + '--nerd-font[Use Nerd Font icons]' \ | |
17 | + '--stdout[Disable formatting for piping]' \ | |
18 | + '--no-color[Disable colors]' \ | |
19 | + '--bold[Enable/disable bold text]' \ | |
20 | + '-b+[Image backend]:backend:(ascii kitty sixel chafa w3m iterm2 off)' \ | |
21 | + '--backend+[Image backend]:backend:(ascii kitty sixel chafa w3m iterm2 off)' \ | |
22 | + '-s+[Image source]:source:(auto ascii wallpaper)' \ | |
23 | + '--source+[Image source]:source:(auto ascii wallpaper)' \ | |
24 | + '--ascii-distro[Which distro ASCII art]:distro:' \ | |
25 | + '-c+[Custom image path]:path:_files' \ | |
26 | + '--custom-image+[Custom image path]:path:_files' \ | |
27 | + '--gap[Gap between logo and info]:number:' \ | |
28 | + '--separator[Separator between label and value]:sep:' \ | |
29 | + '--show-config[Show config file path]' \ | |
30 | + '--print-config[Print default config]' \ | |
31 | + '--create-config[Create default config]' \ | |
32 | + '--select-image[Interactive image picker]' \ | |
33 | + '--init-api-image[Setup API image fetching]' \ | |
34 | + '--daemon[Run as daemon]' \ | |
35 | + '--tray-status[Compact status for tray]' \ | |
36 | + '--block-range-start[Color block range start]:number:' \ | |
37 | + '--block-range-end[Color block range end]:number:' \ | |
38 | + '--block-width[Width of color blocks]:number:' | |
39 | +} | |
40 | + | |
41 | +_fetchx "$@" | |
0 | 42 | |
▼debian/rules
+14-0
| @@ -0,0 +1,14 @@ | ||
1 | +#!/usr/bin/make -f | |
2 | + | |
3 | +%: | |
4 | + dh $@ --with=systemd | |
5 | + | |
6 | +override_dh_auto_build: | |
7 | + cargo build --release --locked | |
8 | + | |
9 | +override_dh_auto_install: | |
10 | + install -Dm755 target/release/fetchx debian/fetchx/usr/bin/fetchx | |
11 | + install -Dm644 debian/fetchx.desktop debian/fetchx/usr/share/applications/fetchx.desktop | |
12 | + install -Dm644 debian/fetchx.bash-completion debian/fetchx/usr/share/bash-completion/completions/fetchx | |
13 | + install -Dm644 debian/fetchx.zsh-completion debian/fetchx/usr/share/zsh/vendor-completions/_fetchx | |
14 | + install -Dm644 debian/fetchx.1 debian/fetchx/usr/share/man/man1/fetchx.1 | |
0 | 15 | |
▼debian/source/format
+1-0
| @@ -0,0 +1 @@ | ||
1 | +3.0 (quilt) | |
0 | 2 | |
▼debian/watch
+4-0
| @@ -0,0 +1,4 @@ | ||
1 | +version=4 | |
2 | +opts=filenamemangle=s/.+\/v?(\d+\.\d+\.\d+)\.tar\.gz/fetchx-$1.tar.gz/ \ | |
3 | +https://github.com/swadhinbiswas/fetchx/tags \ | |
4 | +.*/v?(\d+\.\d+\.\d+)\.tar\.gz | |
0 | 5 | |