mirror of
https://github.com/dexoron/dcr.git
synced 2026-10-21 09:08:30 +00:00
refactor(updater): migrate from reqwest to ureq for lightweight builds
This commit is contained in:
32
CHANGELOG.md
32
CHANGELOG.md
@@ -1,5 +1,37 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.7.3] - 2026-06-13 "Оптимизация Зависимостей и VCS / Dependency Optimization & VCS"
|
||||||
|
|
||||||
|
### RU
|
||||||
|
|
||||||
|
**Добавлено:**
|
||||||
|
|
||||||
|
- **Параметр `--vcs` для команд `new` и `init`** — добавлена возможность явно указывать систему контроля версий через `--vcs <git|none>`.
|
||||||
|
- **Интеграция Git-информации в `--version`** — утилита теперь выводит текущий короткий хэш коммита и суффикс `-dirty`, если в репозитории DCR есть незакоммиченные изменения.
|
||||||
|
- **Автоматическая генерация `.gitignore`** — при инициализации Git-репозитория автоматически создается файл `.gitignore` с исключением директории `/target`.
|
||||||
|
- **Защита от вложенных репозиториев** — автоматическая инициализация Git теперь пропускается, если `dcr new` или `dcr init` запускаются внутри уже существующего Git-репозитория.
|
||||||
|
- **Тесты для верификации VCS** — добавлены интеграционные тесты `new_vcs_options_work` и `init_vcs_options_work` для проверки логики инициализации репозиториев.
|
||||||
|
|
||||||
|
**Изменено:**
|
||||||
|
|
||||||
|
- **Полный отказ от библиотеки `git2`** — работа с Git (клонирование зависимостей, инициализация VCS, проверка статуса) переведена на вызовы системного `git` через `Command`. Это облегчает сборку проекта и убирает необходимость в фичах `vendored` и `openssl`.
|
||||||
|
- **Миграция с `reqwest` на `ureq`** — в модуле обновления (`flag_update.rs`) тяжелый `reqwest` заменен на легковесный синхронный клиент `ureq 2.10`, что уменьшило оверхед и размер итогового бинарника.
|
||||||
|
|
||||||
|
### EN
|
||||||
|
|
||||||
|
**Added:**
|
||||||
|
|
||||||
|
- **`--vcs` option for `new` and `init` commands** — introduced explicit version control system selection via `--vcs <git|none>`.
|
||||||
|
- **Git metadata integration in `--version`** — the CLI now appends the current short commit hash and a `-dirty` suffix if there are uncommitted changes in the DCR repository.
|
||||||
|
- **Automatic `.gitignore` generation** — Git repository initialization now automatically writes a `.gitignore` file excluding the `/target` directory.
|
||||||
|
- **Nested repository prevention** — automatic Git initialization is now skipped if `dcr new` or `dcr init` is executed inside an already existing Git repository.
|
||||||
|
- **VCS verification tests** — added `new_vcs_options_work` and `init_vcs_options_work` integration tests to ensure reliable repository behavior.
|
||||||
|
|
||||||
|
**Changed:**
|
||||||
|
|
||||||
|
- **Complete removal of `git2` dependency** — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the system `git` executable via `Command`. This simplifies compilation and drops the need for `vendored` and `openssl` features.
|
||||||
|
- **Migrated from `reqwest` to `ureq`** — replaced the heavy `reqwest` crate in `flag_update.rs` with the lightweight synchronous `ureq 2.10` client, reducing overhead and the final binary size.
|
||||||
|
|
||||||
## [0.7.2] - 2026-06-07 "Исправление Таргетов и Линковки / Target & Linker Fixes"
|
## [0.7.2] - 2026-06-07 "Исправление Таргетов и Линковки / Target & Linker Fixes"
|
||||||
|
|
||||||
### RU
|
### RU
|
||||||
|
|||||||
898
Cargo.lock
generated
898
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -61,7 +61,7 @@ assets = [
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
glob = "0.3"
|
glob = "0.3"
|
||||||
reqwest = { version = "0.12", default-features = false, features = ["blocking", "json", "rustls-tls"] }
|
ureq = { version = "2.10", default-features = false, features = ["json", "native-certs"] }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
self-replace = "1"
|
self-replace = "1"
|
||||||
sha2 = "0.10"
|
sha2 = "0.10"
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
use crate::utils::log::{error, warn};
|
use crate::utils::log::{error, warn};
|
||||||
use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, printc};
|
use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, printc};
|
||||||
use reqwest::blocking::Client;
|
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
use std::io::Read;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
@@ -72,15 +72,8 @@ pub fn flag_update(args: &[String]) -> i32 {
|
|||||||
|
|
||||||
let current_version = env!("CARGO_PKG_VERSION");
|
let current_version = env!("CARGO_PKG_VERSION");
|
||||||
let target = env!("DCR_TARGET");
|
let target = env!("DCR_TARGET");
|
||||||
let client = match Client::builder().user_agent("dcr-updater").build() {
|
|
||||||
Ok(client) => client,
|
|
||||||
Err(_) => {
|
|
||||||
error("Failed to initialize HTTP client");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let release = match fetch_latest_release(&client) {
|
let release = match fetch_latest_release() {
|
||||||
Ok(release) => release,
|
Ok(release) => release,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
error(&format!("Failed to check for updates: {err}"));
|
error(&format!("Failed to check for updates: {err}"));
|
||||||
@@ -104,7 +97,7 @@ pub fn flag_update(args: &[String]) -> i32 {
|
|||||||
return 1;
|
return 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
let bytes = match download_asset(&client, &asset.browser_download_url) {
|
let bytes = match download_asset(&asset.browser_download_url) {
|
||||||
Ok(bytes) => bytes,
|
Ok(bytes) => bytes,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
error(&format!("Failed to download update: {err}"));
|
error(&format!("Failed to download update: {err}"));
|
||||||
@@ -131,35 +124,35 @@ pub fn flag_update(args: &[String]) -> i32 {
|
|||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fetch_latest_release(client: &Client) -> Result<Release, String> {
|
fn fetch_latest_release() -> Result<Release, String> {
|
||||||
let response = client
|
let response = ureq::get(LATEST_RELEASE_URL)
|
||||||
.get(LATEST_RELEASE_URL)
|
.set("User-Agent", "dcr-updater")
|
||||||
.send()
|
.call()
|
||||||
.map_err(|_| "GitHub API request failed".to_string())?;
|
.map_err(|e| match e {
|
||||||
|
ureq::Error::Status(code, _) => format!("GitHub API returned status {code}"),
|
||||||
if !response.status().is_success() {
|
ureq::Error::Transport(e) => format!("GitHub API request failed: {e}"),
|
||||||
return Err(format!("GitHub API returned status {}", response.status()));
|
})?;
|
||||||
}
|
|
||||||
|
|
||||||
response
|
response
|
||||||
.json::<Release>()
|
.into_json::<Release>()
|
||||||
.map_err(|_| "GitHub API response has an unexpected format".to_string())
|
.map_err(|_| "GitHub API response has an unexpected format".to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn download_asset(client: &Client, url: &str) -> Result<Vec<u8>, String> {
|
fn download_asset(url: &str) -> Result<Vec<u8>, String> {
|
||||||
let response = client
|
let response = ureq::get(url)
|
||||||
.get(url)
|
.set("User-Agent", "dcr-updater")
|
||||||
.send()
|
.call()
|
||||||
.map_err(|_| "Download request failed".to_string())?;
|
.map_err(|e| match e {
|
||||||
|
ureq::Error::Status(code, _) => format!("Download returned status {code}"),
|
||||||
|
ureq::Error::Transport(e) => format!("Download request failed: {e}"),
|
||||||
|
})?;
|
||||||
|
|
||||||
if !response.status().is_success() {
|
let mut reader = response.into_reader();
|
||||||
return Err(format!("Download returned status {}", response.status()));
|
let mut data = Vec::new();
|
||||||
}
|
reader
|
||||||
|
.read_to_end(&mut data)
|
||||||
response
|
.map_err(|_| "Failed to read downloaded data".to_string())?;
|
||||||
.bytes()
|
Ok(data)
|
||||||
.map(|bytes| bytes.to_vec())
|
|
||||||
.map_err(|_| "Failed to read downloaded data".to_string())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn asset_candidates(target: &str) -> Vec<String> {
|
fn asset_candidates(target: &str) -> Vec<String> {
|
||||||
|
|||||||
Reference in New Issue
Block a user