mirror of
https://github.com/storytold/craft-launcher.git
synced 2026-11-02 18:07:04 +00:00
fix(linux): tighten arch package self-update check, streamline hint message, and test deterministically
This commit is contained in:
@@ -633,7 +633,7 @@ fn planned_asset(
|
||||
} else if custom_linux {
|
||||
vec![artcraft_launcher_core::PackageKind::AppImage]
|
||||
} else {
|
||||
install::choose_kinds(Some(app), existing, record, &options.kinds)
|
||||
install::choose_kinds(app, existing, record, &options.kinds)
|
||||
};
|
||||
pick_asset(release, &stems, platform, &kinds).map(|(a, k)| (a.clone(), k))
|
||||
}
|
||||
|
||||
@@ -253,9 +253,23 @@ fn record(version: &str, kind: PackageKind, path: PathBuf, files: Vec<PathBuf>,
|
||||
|
||||
/// The package format to install `app` with: the format of the copy that's there (an update
|
||||
/// stays a `.deb` update), else the user's choice, else the best this system supports.
|
||||
pub fn choose_kinds(app: Option<&CraftApp>, existing: Option<&Installed>, record: Option<&Record>, preferred: &[PackageKind]) -> Vec<PackageKind> {
|
||||
///
|
||||
/// Returns an empty `Vec` when `app` is already installed outside the launcher (such as an AUR
|
||||
/// or repository Arch package) and must not be updated or replaced by the launcher.
|
||||
pub fn choose_kinds(app: &CraftApp, existing: Option<&Installed>, record: Option<&Record>, preferred: &[PackageKind]) -> Vec<PackageKind> {
|
||||
let available = available_kinds();
|
||||
let can_pacman = which("pacman").is_some();
|
||||
let can_pacman = available.contains(&PackageKind::ArchPkg) || can_pacman();
|
||||
choose_kinds_with(app, existing, record, preferred, &available, can_pacman)
|
||||
}
|
||||
|
||||
pub(crate) fn choose_kinds_with(
|
||||
app: &CraftApp,
|
||||
existing: Option<&Installed>,
|
||||
record: Option<&Record>,
|
||||
preferred: &[PackageKind],
|
||||
available: &[PackageKind],
|
||||
can_pacman: bool,
|
||||
) -> Vec<PackageKind> {
|
||||
if let Some(inst) = existing {
|
||||
let kind = match inst.source {
|
||||
InstallSource::Launcher => record.map(|r| r.kind),
|
||||
@@ -276,25 +290,30 @@ pub fn choose_kinds(app: Option<&CraftApp>, existing: Option<&Installed>, record
|
||||
return vec![k];
|
||||
}
|
||||
}
|
||||
let mut kinds: Vec<PackageKind> = preferred.iter().copied().filter(|k| available.contains(k)).collect();
|
||||
let mut kinds: Vec<PackageKind> =
|
||||
preferred.iter().copied().filter(|k| available.contains(k) || (*k == PackageKind::ArchPkg && can_pacman)).collect();
|
||||
for k in available {
|
||||
if !kinds.contains(&k) {
|
||||
kinds.push(k);
|
||||
if !kinds.contains(k) {
|
||||
kinds.push(*k);
|
||||
}
|
||||
}
|
||||
kinds
|
||||
}
|
||||
|
||||
/// Whether this system has a working pacman installation and pacman database.
|
||||
fn can_pacman() -> bool {
|
||||
#[cfg(target_os = "linux")]
|
||||
return which("pacman").is_some() && crate::detect::linux::has_pacman_db();
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Whether a pacman install is the release's own Arch package rather than an AUR build. The
|
||||
/// release names it by the bundle id (`ai.storyteller.<app>`), which no AUR package uses
|
||||
/// (they are `<app>`, `<app>-bin` and `<app>-git`), so an AUR helper never mistakes it
|
||||
/// for one of its own and rebuilds it from source.
|
||||
pub fn is_release_arch_package(app: Option<&CraftApp>, installed: &Installed) -> bool {
|
||||
installed.source == InstallSource::Pacman
|
||||
&& installed.package.as_deref().is_some_and(|p| match app {
|
||||
Some(app) => p == app.bundle_id(),
|
||||
None => p.starts_with("ai.storyteller."),
|
||||
})
|
||||
pub fn is_release_arch_package(app: &CraftApp, installed: &Installed) -> bool {
|
||||
installed.source == InstallSource::Pacman && installed.package.as_deref() == Some(&app.bundle_id())
|
||||
}
|
||||
|
||||
/// Package formats this machine can install, best first.
|
||||
@@ -355,10 +374,14 @@ fn published_checksum(release: &Release, asset: &Asset, http: &Http) -> Result<O
|
||||
/// update for a repository package (Omarchy's, Chaotic-AUR, ...), the user's AUR helper (which
|
||||
/// builds as the user and can't run behind the password prompt) for anything else.
|
||||
pub fn managed_elsewhere(app: &CraftApp, installed: &Installed, uninstall: bool) -> Option<String> {
|
||||
managed_elsewhere_with(app, installed, uninstall, pacman_repo)
|
||||
}
|
||||
|
||||
fn managed_elsewhere_with(app: &CraftApp, installed: &Installed, uninstall: bool, repo_fn: impl Fn(&str) -> Option<String>) -> Option<String> {
|
||||
match installed.source {
|
||||
InstallSource::Pacman if !uninstall && !is_release_arch_package(Some(app), installed) => {
|
||||
InstallSource::Pacman if !uninstall && !is_release_arch_package(app, installed) => {
|
||||
let pkg = installed.package.clone().unwrap_or_else(|| app.id.to_string());
|
||||
Some(pacman_update_hint(app, &pkg, pacman_repo(&pkg).as_deref()))
|
||||
Some(pacman_update_hint(app, &pkg, repo_fn(&pkg).as_deref()))
|
||||
}
|
||||
InstallSource::Binary => Some(format!("{} was installed outside the launcher. Update or remove it the way it was installed.", app.name)),
|
||||
_ => None,
|
||||
@@ -368,14 +391,14 @@ pub fn managed_elsewhere(app: &CraftApp, installed: &Installed, uninstall: bool)
|
||||
/// How to update an Arch package the launcher doesn't own: `repo` is the sync repository it
|
||||
/// comes from, or `None` for a foreign (AUR) package.
|
||||
fn pacman_update_hint(app: &CraftApp, pkg: &str, repo: Option<&str>) -> String {
|
||||
if let Some(repo) = repo {
|
||||
return format!("{} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu", app.name);
|
||||
}
|
||||
let helper = ["paru", "yay"].into_iter().find(|h| which(h).is_some());
|
||||
let cmd = match helper {
|
||||
Some(h) => format!("{h} -S {pkg}"),
|
||||
None => format!("your AUR helper (for example: yay -S {pkg})"),
|
||||
};
|
||||
if let Some(repo) = repo {
|
||||
return format!("{} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu", app.name);
|
||||
}
|
||||
format!("{} was installed from the AUR ({pkg}). Update it with {cmd}", app.name)
|
||||
}
|
||||
|
||||
@@ -383,16 +406,13 @@ fn pacman_update_hint(app: &CraftApp, pkg: &str, repo: Option<&str>) -> String {
|
||||
/// `None` when no configured repository does (an AUR or locally built package) or pacman can't
|
||||
/// be asked.
|
||||
fn pacman_repo(pkg: &str) -> Option<String> {
|
||||
let pacman = which("pacman")?;
|
||||
let t = std::time::Duration::from_secs(10);
|
||||
// If the package is foreign (from the AUR or a local build), pacman -Qm succeeds:
|
||||
// don't look it up in sync repositories.
|
||||
let mut qm = process::command(&pacman);
|
||||
qm.args(["-Qm", "--", pkg]).env("LC_ALL", "C");
|
||||
if process::run_command(qm, "pacman", t).is_ok() {
|
||||
#[cfg(target_os = "linux")]
|
||||
if !crate::detect::linux::has_pacman_db() {
|
||||
return None;
|
||||
}
|
||||
// For native packages, ask pacman -Si which configured repository carries it.
|
||||
let pacman = which("pacman")?;
|
||||
let t = std::time::Duration::from_secs(5);
|
||||
// For packages carried by a configured sync repository, ask pacman -Si which repo carries it.
|
||||
// pacman translates its field names; the C locale keeps "Repository" parseable.
|
||||
let mut si = process::command(&pacman);
|
||||
si.args(["-Si", "--", pkg]).env("LC_ALL", "C");
|
||||
@@ -2130,16 +2150,17 @@ mod tests {
|
||||
#[test]
|
||||
fn updates_keep_the_installed_format() {
|
||||
let inst = |source| Installed { version: None, source, location: String::new(), package: None };
|
||||
let app = artcraft_launcher_core::CraftApp::by_id("photocraft").unwrap();
|
||||
let available = available_kinds();
|
||||
if let Some(first) = available.first() {
|
||||
assert_eq!(choose_kinds(None, None, None, &[]).first(), Some(first));
|
||||
assert_eq!(choose_kinds(app, None, None, &[]).first(), Some(first));
|
||||
}
|
||||
#[cfg(target_os = "macos")]
|
||||
assert_eq!(choose_kinds(None, Some(&inst(InstallSource::MacApp)), None, &[]), [PackageKind::Dmg]);
|
||||
assert_eq!(choose_kinds(app, Some(&inst(InstallSource::MacApp)), None, &[]), [PackageKind::Dmg]);
|
||||
#[cfg(windows)]
|
||||
assert_eq!(choose_kinds(None, Some(&inst(InstallSource::Msi)), None, &[]), [PackageKind::Msi]);
|
||||
assert_eq!(choose_kinds(app, Some(&inst(InstallSource::Msi)), None, &[]), [PackageKind::Msi]);
|
||||
#[cfg(target_os = "linux")]
|
||||
assert_eq!(choose_kinds(None, Some(&inst(InstallSource::AppImage)), None, &[]), [PackageKind::AppImage]);
|
||||
assert_eq!(choose_kinds(app, Some(&inst(InstallSource::AppImage)), None, &[]), [PackageKind::AppImage]);
|
||||
let _ = inst;
|
||||
}
|
||||
|
||||
@@ -2147,24 +2168,23 @@ mod tests {
|
||||
fn only_the_release_arch_package_is_updated_by_the_launcher() {
|
||||
let pacman = |name: &str| Installed { version: None, source: InstallSource::Pacman, location: String::new(), package: Some(name.into()) };
|
||||
let app = artcraft_launcher_core::CraftApp::by_id("wordcraft").unwrap();
|
||||
assert!(is_release_arch_package(Some(app), &pacman("ai.storyteller.wordcraft")));
|
||||
assert!(is_release_arch_package(None, &pacman("ai.storyteller.wordcraft")));
|
||||
assert!(is_release_arch_package(app, &pacman("ai.storyteller.wordcraft")));
|
||||
for aur in ["wordcraft", "wordcraft-bin", "wordcraft-git"] {
|
||||
assert!(!is_release_arch_package(Some(app), &pacman(aur)), "{aur}");
|
||||
assert!(!is_release_arch_package(None, &pacman(aur)), "{aur}");
|
||||
assert!(!is_release_arch_package(app, &pacman(aur)), "{aur}");
|
||||
}
|
||||
assert_eq!(managed_elsewhere(app, &pacman("ai.storyteller.wordcraft"), false), None);
|
||||
assert_eq!(managed_elsewhere(app, &pacman("wordcraft-bin"), true), None);
|
||||
assert_eq!(managed_elsewhere_with(app, &pacman("ai.storyteller.wordcraft"), false, |_| None), None);
|
||||
assert_eq!(managed_elsewhere_with(app, &pacman("wordcraft-bin"), true, |_| None), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arch_packages_from_a_repository_are_updated_with_the_system() {
|
||||
let app = artcraft_launcher_core::CraftApp::by_id("wordcraft").unwrap();
|
||||
assert_eq!(
|
||||
pacman_update_hint(app, "wordcraft-bin", Some("omarchy")),
|
||||
"WordCraft was installed from the omarchy repository (wordcraft-bin). Update it with sudo pacman -Syu"
|
||||
);
|
||||
assert!(pacman_update_hint(app, "wordcraft-bin", None).starts_with("WordCraft was installed from the AUR (wordcraft-bin)."));
|
||||
let hint = pacman_update_hint(app, "wordcraft-bin", Some("omarchy"));
|
||||
assert!(hint.starts_with("WordCraft was installed from the omarchy repository or the AUR (wordcraft-bin)."));
|
||||
assert!(hint.ends_with("or sudo pacman -Syu"));
|
||||
|
||||
let aur_hint = pacman_update_hint(app, "wordcraft-bin", None);
|
||||
assert!(aur_hint.starts_with("WordCraft was installed from the AUR (wordcraft-bin)."));
|
||||
|
||||
let si = "Repository : omarchy\nName : wordcraft-bin\nVersion : 0.6.1-1\n";
|
||||
assert_eq!(parse_pacman_repo(si).as_deref(), Some("omarchy"));
|
||||
@@ -2177,9 +2197,9 @@ mod tests {
|
||||
let pacman = |name: &str| Installed { version: None, source: InstallSource::Pacman, location: String::new(), package: Some(name.into()) };
|
||||
let app = artcraft_launcher_core::CraftApp::by_id("filmcraft").unwrap();
|
||||
let installed = pacman("filmcraft-bin");
|
||||
assert!(managed_elsewhere(app, &installed, false).is_some());
|
||||
assert_eq!(choose_kinds(Some(app), Some(&installed), None, &[]), Vec::<PackageKind>::new());
|
||||
assert_eq!(choose_kinds(Some(app), Some(&installed), None, &[PackageKind::ArchPkg]), Vec::<PackageKind>::new());
|
||||
assert!(managed_elsewhere_with(app, &installed, false, |_| None).is_some());
|
||||
assert_eq!(choose_kinds_with(app, Some(&installed), None, &[], &[], false), Vec::<PackageKind>::new());
|
||||
assert_eq!(choose_kinds_with(app, Some(&installed), None, &[PackageKind::ArchPkg], &[PackageKind::ArchPkg], true), Vec::<PackageKind>::new());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -2187,10 +2207,16 @@ mod tests {
|
||||
let pacman = |name: &str| Installed { version: None, source: InstallSource::Pacman, location: String::new(), package: Some(name.into()) };
|
||||
let app = artcraft_launcher_core::CraftApp::by_id("filmcraft").unwrap();
|
||||
let installed = pacman("ai.storyteller.filmcraft");
|
||||
assert_eq!(managed_elsewhere(app, &installed, false), None);
|
||||
if which("pacman").is_some() {
|
||||
assert_eq!(choose_kinds(Some(app), Some(&installed), None, &[]), vec![PackageKind::ArchPkg]);
|
||||
}
|
||||
assert_eq!(managed_elsewhere_with(app, &installed, false, |_| None), None);
|
||||
assert_eq!(choose_kinds_with(app, Some(&installed), None, &[], &[], true), vec![PackageKind::ArchPkg]);
|
||||
assert_eq!(choose_kinds_with(app, Some(&installed), None, &[], &[PackageKind::ArchPkg], false), vec![PackageKind::ArchPkg]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preferred_arch_package_honoured_when_can_pacman() {
|
||||
let app = artcraft_launcher_core::CraftApp::by_id("filmcraft").unwrap();
|
||||
assert_eq!(choose_kinds_with(app, None, None, &[PackageKind::ArchPkg], &[], true), vec![PackageKind::ArchPkg]);
|
||||
assert_eq!(choose_kinds_with(app, None, None, &[PackageKind::ArchPkg], &[], false), Vec::<PackageKind>::new());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -151,12 +151,10 @@ fn detect(exe: &Path) -> Option<Install> {
|
||||
if process::capture("rpm", &["-q", LAUNCHER.id], t).is_some() {
|
||||
return Some(Install::Package(PackageKind::Rpm, exe.to_path_buf()));
|
||||
}
|
||||
// A pacman install of the launcher. We detect the release's own Arch package (by bundle id
|
||||
// or short name). AUR builds (`artcraft-launcher-bin`, `artcraft-launcher-git`) are left to
|
||||
// A pacman install of the launcher. We detect the release's own Arch package (by bundle id).
|
||||
// AUR builds (`artcraft-launcher`, `artcraft-launcher-bin`, `artcraft-launcher-git`) are left to
|
||||
// pacman and the AUR helper.
|
||||
if crate::detect::linux::has_pacman_db()
|
||||
&& (process::capture("pacman", &["-Q", &LAUNCHER.bundle_id()], t).is_some() || process::capture("pacman", &["-Q", LAUNCHER.id], t).is_some())
|
||||
{
|
||||
if crate::detect::linux::has_pacman_db() && process::capture("pacman", &["-Q", &LAUNCHER.bundle_id()], t).is_some() {
|
||||
return Some(Install::Package(PackageKind::ArchPkg, exe.to_path_buf()));
|
||||
}
|
||||
None
|
||||
|
||||
@@ -266,10 +266,10 @@ filter Installed Nainstalováno
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) Aplikace {name} byla nainstalována ve verzi {version} (toto vydání neobsahuje kontrolní součet, ověřena byla pouze velikost)
|
||||
@msg {name} was removed Aplikace {name} byla odebrána
|
||||
@msg {name} is running. Quit it, then try again. Aplikace {name} je spuštěná. Ukončete ji a zkuste to znovu.
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu Aplikace {name} byla nainstalována z repozitáře {repo} ({pkg}). Aktualizujte ji příkazem sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu Aplikace {name} byla nainstalována z repozitáře {repo} nebo z AUR ({pkg}). Aktualizujte ji příkazem {cmd} nebo sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu Aplikace {name} byla nainstalována z repozitáře {repo} nebo z AUR ({pkg}). Aktualizujte ji pomocí pomocníka AUR (například: yay -S {pkg}) nebo příkazem sudo pacman -Syu
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} Aplikace {name} byla nainstalována z AUR ({pkg}). Aktualizujte ji příkazem {cmd}
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) Aplikace {name} byla nainstalována z AUR ({pkg}). Aktualizujte ji pomocí pomocníka AUR (například: yay -S {pkg})
|
||||
@msg your AUR helper (for example: yay -S {pkg}) pomocník AUR (například: yay -S {pkg})
|
||||
@id app.install Nainstalovat
|
||||
@id app.update Aktualizovat na {v}
|
||||
@id app.open Otevřít
|
||||
|
||||
|
@@ -280,10 +280,10 @@ filter Installed Installiert
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} installiert: {version} (diese Version veröffentlicht keine Prüfsumme, daher wurde nur die Größe geprüft)
|
||||
@msg {name} was removed {name} wurde entfernt
|
||||
@msg {name} is running. Quit it, then try again. {name} läuft. Beende die App und versuche es erneut.
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} wurde aus dem Repository {repo} installiert ({pkg}). Aktualisiere die App mit sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} wurde aus dem Repository {repo} oder dem AUR installiert ({pkg}). Aktualisiere die App mit {cmd} oder sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} wurde aus dem Repository {repo} oder dem AUR installiert ({pkg}). Aktualisiere die App mit deinem AUR-Hilfsprogramm (zum Beispiel: yay -S {pkg}) oder sudo pacman -Syu
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} wurde aus dem AUR installiert ({pkg}). Aktualisiere die App mit {cmd}
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} wurde aus dem AUR installiert ({pkg}). Aktualisiere die App mit deinem AUR-Hilfsprogramm (zum Beispiel: yay -S {pkg})
|
||||
@msg your AUR helper (for example: yay -S {pkg}) dein AUR-Hilfsprogramm (zum Beispiel: yay -S {pkg})
|
||||
|
||||
# Command IDs for menu items (@id)
|
||||
# Format: @id<TAB>command_id<TAB>translation
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 11 and column 16.
|
@@ -279,10 +279,10 @@ filter Installed Instaladas
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} instalada: {version} (esta versión no publica la suma de comprobación, así que solo se comprobó su tamaño)
|
||||
@msg {name} was removed Se quitó {name}
|
||||
@msg {name} is running. Quit it, then try again. {name} está abierta. Ciérrala y vuelve a intentarlo.
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} se instaló desde el repositorio {repo} ({pkg}). Actualízala con sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} se instaló desde el repositorio {repo} o AUR ({pkg}). Actualízala con {cmd} o con sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} se instaló desde el repositorio {repo} o AUR ({pkg}). Actualízala con tu asistente de AUR (por ejemplo: yay -S {pkg}) o con sudo pacman -Syu
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} se instaló desde AUR ({pkg}). Actualízala con {cmd}
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} se instaló desde AUR ({pkg}). Actualízala con tu asistente de AUR (por ejemplo: yay -S {pkg})
|
||||
@msg your AUR helper (for example: yay -S {pkg}) tu asistente de AUR (por ejemplo: yay -S {pkg})
|
||||
@id app.install Instalar
|
||||
@id app.update Actualizar a {v}
|
||||
@id app.open Abrir
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 48.
|
@@ -278,10 +278,10 @@ filter Installed Installées
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} installé : {version} (cette version ne publie pas de somme de contrôle : seule sa taille a été vérifiée)
|
||||
@msg {name} was removed {name} a été supprimé
|
||||
@msg {name} is running. Quit it, then try again. {name} est en cours d'exécution. Quittez-le, puis réessayez.
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} a été installé depuis le dépôt {repo} ({pkg}). Mettez-le à jour avec sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} a été installé depuis le dépôt {repo} ou l'AUR ({pkg}). Mettez-le à jour avec {cmd} ou avec sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} a été installé depuis le dépôt {repo} ou l'AUR ({pkg}). Mettez-le à jour avec votre assistant AUR (par exemple : yay -S {pkg}) ou avec sudo pacman -Syu
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} a été installé depuis l'AUR ({pkg}). Mettez-le à jour avec {cmd}
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} a été installé depuis l'AUR ({pkg}). Mettez-le à jour avec votre assistant AUR (par exemple : yay -S {pkg})
|
||||
@msg your AUR helper (for example: yay -S {pkg}) votre assistant AUR (par exemple : yay -S {pkg})
|
||||
|
||||
# Command IDs for menu items (@id)
|
||||
# Format: @id<TAB>command_id<TAB>translation
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 50.
|
@@ -294,10 +294,10 @@ filter Installed Telepítve
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} telepítve: {version} (ehhez a kiadáshoz nem adtak meg ellenőrzőösszeget, ezért csak a fájl méretét ellenőriztük)
|
||||
@msg {name} was removed {name} eltávolítva
|
||||
@msg {name} is running. Quit it, then try again. {name} fut. Zárd be, majd próbáld újra.
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} a(z) {repo} tárolóból lett telepítve ({pkg}). Frissítsd ezzel: sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} a(z) {repo} tárolóból vagy az AUR-ból lett telepítve ({pkg}). Frissítsd ezzel: {cmd} vagy sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} a(z) {repo} tárolóból vagy az AUR-ból lett telepítve ({pkg}). Frissítsd az AUR-segédeddel (például: yay -S {pkg}) vagy ezzel: sudo pacman -Syu
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} az AUR-ból lett telepítve ({pkg}). Frissítsd ezzel: {cmd}
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} az AUR-ból lett telepítve ({pkg}). Frissítsd az AUR-segédeddel (például: yay -S {pkg})
|
||||
@msg your AUR helper (for example: yay -S {pkg}) az AUR-segéded (például: yay -S {pkg})
|
||||
|
||||
# Command IDs for menu items (@id)
|
||||
# Format: @id<TAB>command_id<TAB>translation
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 11 and column 16.
|
@@ -296,10 +296,10 @@ filter Installed インストール済み
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} をインストールしました: {version}(このリリースはチェックサムを公開していないため、サイズのみ確認しました)
|
||||
@msg {name} was removed {name} をアンインストールしました
|
||||
@msg {name} is running. Quit it, then try again. {name} が実行中です。終了してから再試行してください。
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} は {repo} リポジトリからインストールされています ({pkg})。sudo pacman -Syu で更新してください。
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} は {repo} リポジトリまたは AUR からインストールされています ({pkg})。{cmd} または sudo pacman -Syu で更新してください。
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} は {repo} リポジトリまたは AUR からインストールされています ({pkg})。AUR ヘルパー (例: yay -S {pkg}) または sudo pacman -Syu で更新してください。
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} は AUR からインストールされています ({pkg})。{cmd} で更新してください。
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} は AUR からインストールされています ({pkg})。AUR ヘルパー (例: yay -S {pkg}) で更新してください。
|
||||
@msg your AUR helper (for example: yay -S {pkg}) AUR ヘルパー (例: yay -S {pkg})
|
||||
|
||||
# Command IDs for menu items (@id)
|
||||
# Format: @id<TAB>command_id<TAB>translation
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 14 and column 44.
|
@@ -295,10 +295,10 @@ filter Installed Zainstalowane
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) Zainstalowano {name} w wersji {version} (to wydanie nie zawiera sumy kontrolnej, więc sprawdzono tylko rozmiar)
|
||||
@msg {name} was removed Usunięto {name}
|
||||
@msg {name} is running. Quit it, then try again. {name} jest uruchomiona. Zamknij ją i spróbuj ponownie.
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} została zainstalowana z repozytorium {repo} ({pkg}). Zaktualizuj ją poleceniem sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} została zainstalowana z repozytorium {repo} lub AUR ({pkg}). Zaktualizuj ją poleceniem {cmd} lub sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} została zainstalowana z repozytorium {repo} lub AUR ({pkg}). Zaktualizuj ją za pomocą swojego pomocnika AUR (na przykład: yay -S {pkg}) lub poleceniem sudo pacman -Syu
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} została zainstalowana z AUR ({pkg}). Zaktualizuj ją poleceniem {cmd}
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} została zainstalowana z AUR ({pkg}). Zaktualizuj ją za pomocą swojego pomocnika AUR (na przykład: yay -S {pkg})
|
||||
@msg your AUR helper (for example: yay -S {pkg}) twój pomocnik AUR (na przykład: yay -S {pkg})
|
||||
|
||||
# Command IDs for menu items (@id)
|
||||
# Format: @id<TAB>command_id<TAB>translation
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 11 and column 15.
|
@@ -268,10 +268,10 @@ filter Installed Instalados
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} instalado: {version} (este lançamento não publica soma de verificação, então apenas o tamanho foi verificado)
|
||||
@msg {name} was removed {name} foi removido
|
||||
@msg {name} is running. Quit it, then try again. {name} está em execução. Feche-o e tente novamente.
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} foi instalado pelo repositório {repo} ({pkg}). Atualize-o com sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} foi instalado pelo repositório {repo} ou pelo AUR ({pkg}). Atualize-o com {cmd} ou com sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} foi instalado pelo repositório {repo} ou pelo AUR ({pkg}). Atualize-o com seu assistente do AUR (por exemplo: yay -S {pkg}) ou com sudo pacman -Syu
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} foi instalado pelo AUR ({pkg}). Atualize-o com {cmd}
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} foi instalado pelo AUR ({pkg}). Atualize-o com seu assistente do AUR (por exemplo: yay -S {pkg})
|
||||
@msg your AUR helper (for example: yay -S {pkg}) seu assistente do AUR (por exemplo: yay -S {pkg})
|
||||
|
||||
# Command IDs for menu items (@id)
|
||||
# Format: @id<TAB>command_id<TAB>translation
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 252 and column 66.
|
@@ -277,10 +277,10 @@ filter Installed Установлены
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) Приложение {name} установлено: {version} (в этом релизе нет контрольных сумм, поэтому проверен только размер)
|
||||
@msg {name} was removed Приложение {name} удалено
|
||||
@msg {name} is running. Quit it, then try again. Приложение {name} запущено. Закройте его и попробуйте снова.
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu Приложение {name} установлено из репозитория {repo} ({pkg}). Обновите его командой sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu Приложение {name} установлено из репозитория {repo} или из AUR ({pkg}). Обновите его командой {cmd} или sudo pacman -Syu
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu Приложение {name} установлено из репозитория {repo} или из AUR ({pkg}). Обновите его с помощью вашего помощника AUR (например: yay -S {pkg}) или командой sudo pacman -Syu
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} Приложение {name} установлено из AUR ({pkg}). Обновите его командой {cmd}
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) Приложение {name} установлено из AUR ({pkg}). Обновите его с помощью вашего помощника AUR (например: yay -S {pkg})
|
||||
@msg your AUR helper (for example: yay -S {pkg}) помощник AUR (например: yay -S {pkg})
|
||||
|
||||
# Command IDs for menu items (@id)
|
||||
# Format: @id<TAB>command_id<TAB>translation
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 13 and column 44.
|
@@ -314,10 +314,10 @@ figcraft Interface design and prototyping 界面设计与原型制作
|
||||
@msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} 已安装:{version}(此版本未发布校验和,因此只检查了文件大小)
|
||||
@msg {name} was removed {name} 已卸载
|
||||
@msg {name} is running. Quit it, then try again. {name} 正在运行。请先退出,然后重试。
|
||||
@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} 是从 {repo} 软件仓库安装的({pkg})。请使用 sudo pacman -Syu 更新。
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} 是从 {repo} 软件仓库或 AUR 安装的({pkg})。请使用 {cmd} 或 sudo pacman -Syu 更新。
|
||||
@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} 是从 {repo} 软件仓库或 AUR 安装的({pkg})。请使用您的 AUR 助手(例如:yay -S {pkg})或 sudo pacman -Syu 更新。
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} 是从 AUR 安装的({pkg})。请使用 {cmd} 更新。
|
||||
@msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} 是从 AUR 安装的({pkg})。请使用您的 AUR 助手(例如:yay -S {pkg})更新。
|
||||
@msg your AUR helper (for example: yay -S {pkg}) 您的 AUR 助手(例如:yay -S {pkg})
|
||||
Install folder 安装文件夹
|
||||
Default install folder 默认安装文件夹
|
||||
System default 系统默认
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 4 and column 3.
|
Reference in New Issue
Block a user