diff --git a/.github/workflows/aur.yml b/.github/workflows/aur.yml index 9cb54f0..898b719 100644 --- a/.github/workflows/aur.yml +++ b/.github/workflows/aur.yml @@ -56,6 +56,8 @@ jobs: build() { cd "\$srcdir/\$pkgname-\$pkgver" + export CARGO_PROFILE_RELEASE_LTO=false + export RUSTFLAGS="${RUSTFLAGS/-C link-arg=-fuse-ld=lld/}" cargo build --release --locked } @@ -76,10 +78,10 @@ jobs: arch = aarch64 license = MIT makedepends = cargo - options = !lto depends = gcc-libs optdepends = gcc: build C/C++ projects with GCC optdepends = clang: build C/C++ projects with Clang + options = !lto source = dcr-${PKGVER}.tar.gz::${SRC_URL} sha256sums = ${SHA256} diff --git a/README.md b/README.md index 82c3bf6..72e704c 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The current implementation is written in Rust. - Run the compiled binary - Clean build artifacts - Generate a minimal C project template -- Update the binary via `dcr --update` (GitHub Releases) +- Update the binary via `dcr --update` (GitHub Releases, not for pacman/AUR installs) ## Supported Platforms - Linux: `x86_64-unknown-linux-gnu` @@ -25,6 +25,13 @@ The current implementation is written in Rust. ## Installation +### Package Manager + +**Arch Linux** +```sh +yay -S dcr # or paru and other AUR package managers +``` + ### From Source ```sh @@ -57,6 +64,14 @@ Release assets: - `dcr-aarch64-apple-darwin` - `dcr-x86_64-pc-windows-msvc.exe` +## Update + +- If DCR was installed from GitHub release assets, `install.sh`, `install.ps1`, or built manually: + - use `dcr --update` +- If DCR is installed via `pacman/AUR`: + - update with your package manager: `paru/yay -Syu dcr` or `sudo pacman -Syu dcr` + - `dcr --update` detects package-managed installs and asks you to update via package manager + ## Quick Start Create a new project: diff --git a/docs/README_ru.md b/docs/README_ru.md index ecfd311..8b15dc4 100644 --- a/docs/README_ru.md +++ b/docs/README_ru.md @@ -15,7 +15,7 @@ DCR — это утилита для управления проектами н - Запуск собранного бинарника - Очистка результатов сборки - Генерация минимального шаблона C-проекта -- Обновление бинарника через `dcr --update` (GitHub Releases) +- Обновление бинарника через `dcr --update` (GitHub Releases, не для pacman-установок) ## Поддерживаемые платформы - Linux: `x86_64-unknown-linux-gnu` @@ -25,6 +25,13 @@ DCR — это утилита для управления проектами н ## Установка +### Пакетный менеджер + +**ArchLinux** +```sh +yay -S dcr # или paru и остальные менеджеры пакетов AUR +``` + ### Из исходников ```sh @@ -57,6 +64,14 @@ irm https://dcr.dexoron.su/install.ps1 | iex - `dcr-aarch64-apple-darwin` - `dcr-x86_64-pc-windows-msvc.exe` +## Обновление + +- Если DCR установлен из GitHub Releases, через `install.sh`, `install.ps1` или собран вручную: + - используйте `dcr --update` +- Если DCR установлен через `pacman/AUR`: + - обновляйте через пакетный менеджер: `paru/yay -Syu dcr` или `sudo pacman -Syu dcr` + - `dcr --update` определяет пакетную установку и подсказывает обновляться через пакетный менеджер + ## Быстрый старт Создать новый проект: diff --git a/packaging/aur/dcr/PKGBUILD b/packaging/aur/dcr/PKGBUILD index 1f75486..6595f83 100644 --- a/packaging/aur/dcr/PKGBUILD +++ b/packaging/aur/dcr/PKGBUILD @@ -1,6 +1,6 @@ pkgname=dcr pkgver=0.2.1 -pkgrel=2 +pkgrel=3 pkgdesc="Cargo-like utility to manage C/C++ projects" arch=('x86_64' 'aarch64') url="https://github.com/dexoron/dcr" @@ -17,6 +17,8 @@ sha256sums=('30e334fa98cd51073c0fa84c80a982584b00156b57084311ad53419441ce6235') build() { cd "$srcdir/$pkgname-$pkgver" + export CARGO_PROFILE_RELEASE_LTO=false + export RUSTFLAGS="${RUSTFLAGS/-C link-arg=-fuse-ld=lld/}" cargo build --release --locked } diff --git a/src/cli/flag_update.rs b/src/cli/flag_update.rs index eab88ec..d74e911 100644 --- a/src/cli/flag_update.rs +++ b/src/cli/flag_update.rs @@ -3,6 +3,7 @@ use reqwest::blocking::Client; use serde::Deserialize; use std::fs; use std::path::{Path, PathBuf}; +use std::process::Command; use std::time::{SystemTime, UNIX_EPOCH}; const LATEST_RELEASE_URL: &str = "https://api.github.com/repos/dexoron/dcr/releases/latest"; @@ -25,6 +26,22 @@ pub fn flag_update(args: &[String]) -> i32 { return 1; } + let current_exe = match std::env::current_exe() { + Ok(path) => path, + Err(_) => { + error("Failed to resolve current binary path"); + return 1; + } + }; + + if let Some(package_name) = pacman_owned_package(¤t_exe) { + warn("This dcr binary is managed by pacman/AUR"); + println!( + "Update via package manager: yay/paru -Syu {package_name} or sudo pacman -Syu {package_name}" + ); + return 0; + } + let current_version = env!("CARGO_PKG_VERSION"); let target = env!("DCR_TARGET"); let client = match Client::builder().user_agent("dcr-updater").build() { @@ -67,13 +84,6 @@ pub fn flag_update(args: &[String]) -> i32 { } }; - let current_exe = match std::env::current_exe() { - Ok(path) => path, - Err(_) => { - error("Failed to resolve current binary path"); - return 1; - } - }; let temp_path = temp_binary_path(¤t_exe); if fs::write(&temp_path, &bytes).is_err() { @@ -157,3 +167,23 @@ fn set_executable_permissions(path: &Path) { } } } + +#[cfg(target_os = "linux")] +fn pacman_owned_package(path: &Path) -> Option { + let output = Command::new("pacman").arg("-Qoq").arg(path).output().ok()?; + if !output.status.success() { + return None; + } + + let package_name = String::from_utf8_lossy(&output.stdout).trim().to_string(); + if package_name.is_empty() { + return None; + } + + Some(package_name) +} + +#[cfg(not(target_os = "linux"))] +fn pacman_owned_package(_path: &Path) -> Option { + None +}