Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add automatic update #183

Merged
merged 1 commit into from
Aug 26, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
568 changes: 382 additions & 186 deletions Cargo.lock

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@ version = "0.13.9"

[workspace.dependencies]
ansi_colours = "1.2.3"
axoupdater = "0.7.0"
anyhow = "1.0.86"
arboard = "3.4.0"
async-trait = "0.1.81"
@@ -34,12 +35,12 @@ duckdb = "1.0.0"
form_urlencoded = "1.2.1"
futures-util = "0.3.30"
indexmap = "2.3.0"
indoc = "2.0.5"
indicatif = "0.17.8"
indoc = "2.0.5"
inquire = "0.7.5"
libsql = "0.5.0"
mockall = "0.13.0"
num-format = "0.4.4"
octocrab = "0.39.0"
os_info = "3.8.2"
postgresql_embedded = "0.16.2"
quick-xml = "0.36.1"
3 changes: 2 additions & 1 deletion rsql_cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -27,11 +27,12 @@ winres = { version = "0.1" }

[dependencies]
anyhow = { workspace = true }
axoupdater = { workspace = true }
chrono = { workspace = true }
clap = { workspace = true, features = ["derive", "env"] }
colored = { workspace = true }
dotenvy = { workspace = true }
octocrab = { workspace = true }
inquire = { workspace = true }
os_info = { workspace = true }
rsql_core = { path = "../rsql_core", version = "0.13.9", features = ["all"] }
rust-i18n = { workspace = true }
196 changes: 149 additions & 47 deletions rsql_cli/locales/app.yml
Original file line number Diff line number Diff line change
@@ -53,50 +53,152 @@ banner_message:
yi: "טיפ '%{help_command}' פֿאַר הילף, '%{quit_command}' צו פֿאַרלאָזן."
zh: "输入 '%{help_command}' 获取帮助,输入 '%{quit_command}' 退出。"

newer_version:
en: "A newer version of rsql is available: %{version}"
ar: "الإصدار الأحدث من rsql متوفر: %{version}"
be: "Даступная новая версія rsql: %{version}"
bg: "Налична е по-нова версия на rsql: %{version}"
bn: "rsql এর নতুন সংস্করণ উপলব্ধ: %{version}"
cs: "Je k dispozici novější verze rsql: %{version}"
da: "En nyere version af rsql er tilgængelig: %{version}"
de: "Eine neuere Version von rsql ist verfügbar: %{version}"
el: "Μια νεότερη έκδοση του rsql είναι διαθέσιμη: %{version}"
es: "Hay disponible una versión más reciente de rsql: %{version}"
et: "rsql uus versioon on saadaval: %{version}"
fi: "Uudempi versio rsql:stä on saatavilla: %{version}"
fr: "Une version plus récente de rsql est disponible: %{version}"
ga: "Tá leagan níos nua de rsql ar fáil: %{version}"
he: "גרסה חדשה יותר של rsql זמינה: %{version}"
hi: "rsql का एक नया संस्करण उपलब्ध है: %{version}"
hr: "Dostupna je novija verzija rsql: %{version}"
hu: "Elérhető a rsql újabb verziója: %{version}"
is: "Nýrri útgáfa af rsql er tiltæk: %{version}"
it: "È disponibile una versione più recente di rsql: %{version}"
ja: "rsql の新しいバージョンが利用可能です: %{version}"
jv: "Versi terbaru rsql tersedia: %{version}"
ka: "rsql-ის ახალი ვერსია ხელმისაწვდომია: %{version}"
ko: "rsql의 새로운 버전이 있습니다: %{version}"
lt: "Yra naujesnė rsql versija: %{version}"
lv: "Ir pieejama jaunāka rsql versija: %{version}"
mk: "Постои нова верзија на rsql: %{version}"
ms: "Versi terkini rsql boleh didapati: %{version}"
mt: "Verżjoni ġdida ta 'rsql hija disponibbli: %{version}"
nl: "Een nieuwere versie van rsql is beschikbaar: %{version}"
no: "En nyere versjon av rsql er tilgjengelig: %{version}"
pl: "Dostępna jest nowsza wersja rsql: %{version}"
pt: "Uma versão mais recente do rsql está disponível: %{version}"
ro: "O versiune mai nouă a rsql este disponibilă: %{version}"
ru: "Доступна более новая версия rsql: %{version}"
sk: "Je k dispozícii novšia verzia rsql: %{version}"
sl: "Na voljo je novejša različica rsql: %{version}"
sq: "Një version më i ri i rsql është i disponueshëm: %{version}"
sr: "Доступна је новија верзија rsql: %{version}"
sv: "En nyare version av rsql är tillgänglig: %{version}"
th: "มีเวอร์ชันใหม่ของ rsql ให้ใช้: %{version}"
tr: "rsql'in daha yeni bir sürümü mevcut: %{version}"
uk: "Доступна новіша версія rsql: %{version}"
vi: "Một phiên bản mới của rsql đã có sẵn: %{version}"
yi: "א נייערע ווערסיע פון rsql איז פֿאַרפירן: %{version}"
zh: "rsql 的新版本可用: %{version}"
update_version_prompt:
en: "A newer version of rsql is available, do you want to update?"
ar: "هناك إصدار أحدث من rsql متاح، هل تريد التحديث؟"
be: "Даступная новая версія rsql, ці жадаеце абнавіць?"
bg: "Налична е по-нова версия на rsql, искате ли да актуализирате?"
bn: "rsql এর একটি নতুন সংস্করণ উপলব্ধ, আপনি কি আপডেট করতে চান?"
cs: "Je k dispozici novější verze rsql, chcete aktualizovat?"
da: "En nyere version af rsql er tilgængelig, vil du opdatere?"
de: "Eine neuere Version von rsql ist verfügbar, möchten Sie aktualisieren?"
el: "Μια νεότερη έκδοση του rsql είναι διαθέσιμη, θέλετε να ενημερώσετε;"
es: "Hay una versión más reciente de rsql disponible, ¿desea actualizar?"
et: "Uuem rsql versioon on saadaval, kas soovite seda uuendada?"
fi: "Uudempi versio rsql:stä on saatavilla, haluatko päivittää?"
fr: "Une version plus récente de rsql est disponible, voulez-vous mettre à jour?"
ga: "Tá leagan níos nua de rsql ar fáil, ar mhaith leat a nuashonrú?"
he: "גרסה חדשה יותר של rsql זמינה, האם ברצונך לעדכן?"
hi: "rsql का एक नया संस्करण उपलब्ध है, क्या आप अपडेट करना चाहते हैं?"
hr: "Dostupna je novija verzija rsql, želite li ažurirati?"
hu: "Elérhető egy újabb verzió a rsql-ből, szeretné frissíteni?"
is: "Nýrri útgáfa af rsql er tiltæk, viltu uppfæra?"
it: "È disponibile una versione più recente di rsql, vuoi aggiornare?"
ja: "rsql の新しいバージョンが利用可能です。更新しますか?"
jv: "Versi anyar saka rsql kasedhiya, apakah sampeyan pengin nganyari?"
ka: "rsql-ის ახალი ვერსია ხელმისაწვდომია, გსურთ განახლება?"
ko: "rsql의 새로운 버전이 있습니다. 업데이트하시겠습니까?"
lt: "Yra naujesnė rsql versija, ar norite atnaujinti?"
lv: "Ir pieejama jaunāka rsql versija, vai vēlaties atjaunināt?"
mk: "Постои нова верзија на rsql, дали сакате да ја ажурирате?"
ms: "Versi terkini rsql boleh didapati, adakah anda ingin mengemas kini?"
mt: "Verżjoni iktar riċenti ta 'rsql huwa disponibbli, tixtieq li t-aġġorna?"
nl: "Er is een nieuwere versie van rsql beschikbaar, wilt u bijwerken?"
no: "En nyere versjon av rsql er tilgjengelig, vil du oppdatere?"
pl: "Dostępna jest nowsza wersja rsql, chcesz zaktualizować?"
pt: "Uma versão mais recente do rsql está disponível, deseja atualizar?"
ro: "O versiune mai nouă a rsql este disponibilă, doriți să actualizați?"
ru: "Доступна более новая версия rsql, хотите обновить?"
sk: "Je k dispozícii novšia verzia rsql, chcete aktualizovať?"
sl: "Na voljo je novejša različica rsql, želite posodobiti?"
sq: "Një version më i ri i rsql është i disponueshëm, a dëshironi të përditësoni?"
sr: "Доступна је новија верзија rsql, желите ли да ажурирате?"
sv: "En nyare version av rsql är tillgänglig, vill du uppdatera?"
th: "มีเวอร์ชันใหม่ของ rsql ที่ใช้ได้ คุณต้องการอัปเดตหรือไม่?"
tr: "rsql'in daha yeni bir sürümü mevcut, güncellemek ister misiniz?"
uk: "Доступна новіша версія rsql, чи хочете оновити?"
vi: "Một phiên bản mới của rsql đã có sẵn, bạn có muốn cập nhật không?"
yi: "אַ נייערע ווערסיע פֿון rsql איז פֿאַרפֿירלעך, ווילן איר אַפּדייטן?"
zh: "rsql 有新版本可用,您要更新吗?"

update_version_prompt_placeholder:
en: "%{yes}|%{no}"
ar: "%{no}|%{yes}"
he: "%{no}|%{yes}"
yi: "%{no}|%{yes}"

update_version_prompt_error:
en: "Reply with '%{yes}' or '%{no}'"
ar: "الرد بـ '%{yes}' أو '%{no}'"
be: "Адказваць '%{yes}' ці '%{no}'"
bg: "Отговорете с '%{yes}' или '%{no}'"
bn: "'%{yes}' বা '%{no}' দিয়ে উত্তর দিন"
cs: "Odpovězte '%{yes}' nebo '%{no}'"
da: "Svar med '%{yes}' eller '%{no}'"
de: "Antworte mit '%{yes}' oder '%{no}'"
el: "Απαντήστε με '%{yes}' ή '%{no}'"
es: "Responde con '%{yes}' o '%{no}'"
et: "Vastake '%{yes}' või '%{no}'"
fi: "Vastaa '%{yes}' tai '%{no}'"
fr: "Répondez avec '%{yes}' ou '%{no}'"
ga: "Freagairt le '%{yes}' nó '%{no}'"
he: "השב עם '%{yes}' או '%{no}'"
hi: "'%{yes}' या '%{no}' के साथ जवाब दें"
hr: "Odgovorite s '%{yes}' ili '%{no}'"
hu: "Válaszoljon a '%{yes}' vagy '%{no}'"
is: "Svara með '%{yes}' eða '%{no}'"
it: "Rispondi con '%{yes}' o '%{no}'"
ja: "'%{yes}' または '%{no}' で返信してください"
jv: "Jawab karo '%{yes}' utawa '%{no}'"
ka: "პასუხისთვის გამოიყენეთ '%{yes}' ან '%{no}'"
ko: "'%{yes}' 또는 '%{no}'로 답변하세요"
lt: "Atsakykite su '%{yes}' arba '%{no}'"
lv: "Atbildiet ar '%{yes}' vai '%{no}'"
mk: "Одговорете со '%{yes}' или '%{no}'"
ms: "Jawab dengan '%{yes}' atau '%{no}'"
mt: "Irrispondi '%{yes}' jew '%{no}'"
nl: "Antwoord met '%{yes}' of '%{no}'"
no: "Svar med '%{yes}' eller '%{no}'"
pl: "Odpowiedz '%{yes}' lub '%{no}'"
pt: "Responda com '%{yes}' ou '%{no}'"
ro: "Răspundeți cu '%{yes}' sau '%{no}'"
ru: "Ответьте с '%{yes}' или '%{no}'"
sk: "Odpovedajte s '%{yes}' alebo '%{no}'"
sl: "Odgovorite z '%{yes}' ali '%{no}'"
sq: "Përgjigjuni me '%{yes}' ose '%{no}'"
sr: "Одговорите са '%{yes}' или '%{no}'"
sv: "Svara med '%{yes}' eller '%{no}'"
th: "ตอบด้วย '%{yes}' หรือ '%{no}'"
tr: "'%{yes}' veya '%{no}' ile yanıtlayın"
uk: "Відповідь з '%{yes}' або '%{no}'"
vi: "Trả lời với '%{yes}' hoặc '%{no}'"
yi: "אַנטוואָרט מיט '%{yes}' אָדער '%{no}'"
zh: "回复 '%{yes}' 或 '%{no}'"

updated_version:
en: "Updated to version %{version}"
ar: "تم التحديث إلى الإصدار %{version}"
be: "Абноўлены да версіі %{version}"
bg: "Актуализиран до версия %{version}"
bn: "সংস্করণ %{version} এ আপডেট করা হয়েছে"
cs: "Aktualizováno na verzi %{version}"
da: "Opdateret til version %{version}"
de: "Aktualisiert auf Version %{version}"
el: "Ενημερώθηκε στην έκδοση %{version}"
es: "Actualizado a la versión %{version}"
et: "Uuendatud versioonile %{version}"
fi: "Päivitetty versioon %{version}"
fr: "Mise à jour vers la version %{version}"
ga: "Nuashonraithe go leagan %{version}"
he: "עודכן לגרסה %{version}"
hi: "संस्करण %{version} में अपडेट किया गया"
hr: "Ažurirano na verziju %{version}"
hu: "Frissítve a(z) %{version} verzióra"
is: "Uppfært í útgáfu %{version}"
it: "Aggiornato alla versione %{version}"
ja: "バージョン %{version} に更新されました"
jv: "Dianyari menyang versi %{version}"
ka: "განახლებულია %{version} ვერსიაზე"
ko: "버전 %{version}로 업데이트되었습니다"
lt: "Atnaujinta iki versijos %{version}"
lv: "Atjaunināts līdz versijai %{version}"
mk: "Ажурирано на верзија %{version}"
ms: "Dikemaskini ke versi %{version}"
mt: "Aġġornat għal-verżjoni %{version}"
nl: "Bijgewerkt naar versie %{version}"
no: "Oppdatert til versjon %{version}"
pl: "Zaktualizowano do wersji %{version}"
pt: "Atualizado para a versão %{version}"
ro: "Actualizat la versiunea %{version}"
ru: "Обновлено до версии %{version}"
sk: "Aktualizované na verziu %{version}"
sl: "Posodobljeno na različico %{version}"
sq: "I përditësuar në versionin %{version}"
sr: "Ажурирано на верзију %{version}"
sv: "Uppdaterad till version %{version}"
th: "อัพเดทเป็นเวอร์ชัน %{version}"
tr: "Sürüm %{version} olarak güncellendi"
uk: "Оновлено до версії %{version}"
vi: "Đã cập nhật lên phiên bản %{version}"
yi: "אַפּדייטעד צו ווערסיע %{version}"
zh: "已更新到版本 %{version}"
77 changes: 55 additions & 22 deletions rsql_cli/src/update.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
use anyhow::Result;
use axoupdater::AxoUpdater;
use chrono::{DateTime, Duration, Utc};
use inquire::ui::RenderConfig;
use inquire::Confirm;
use rsql_core::configuration::Configuration;
use semver::Version;
use std::fs::{create_dir_all, File};
use std::io::{Read, Write};
use tracing::debug;

const UPDATE_CHECK_FILE: &str = "last_update_check";

@@ -44,30 +45,62 @@ pub async fn check_for_newer_version(
return Ok(());
}

let current = Version::parse(&configuration.version)?;
let release = match octocrab::instance()
.repos("theseus-rs", "rsql")
.releases()
.get_latest()
.await
{
Ok(release) => release,
Err(error) => {
debug!("Failed to get latest release: {error:?}");
return Ok(());
}
};
let latest = Version::parse(release.tag_name.trim_start_matches('v'))?;

if latest > current {
let mut updater = AxoUpdater::new_for("rsql_cli");
updater.disable_installer_output();
let receipt = updater.load_receipt()?;
if receipt.is_update_needed().await? {
let locale = configuration.locale.as_str();
let newer_version = t!(
"newer_version",
let no = t!("no", locale = locale).to_lowercase();
let yes = t!("yes", locale = locale).to_string();
let update_version_prompt = t!("update_version_prompt", locale = locale);
let update_version_prompt_placeholder = t!(
"update_version_prompt_placeholder",
locale = locale,
yes = yes,
no = no,
);
let update_version_prompt_error = t!(
"update_version_prompt_error",
locale = locale,
version = latest.to_string()
yes = yes,
no = no,
);

writeln!(output, "{newer_version}")?;
let confirm = Confirm {
message: &update_version_prompt,
starting_input: None,
default: Some(true),
placeholder: Some(&*update_version_prompt_placeholder),
help_message: None,
formatter: &|answer| {
if answer {
yes.to_string()
} else {
no.to_string()
}
},
parser: &|answer| Ok(answer == yes),
error_message: update_version_prompt_error.to_string(),
default_value_formatter: &|default| {
if default {
yes.to_string()
} else {
no.to_string()
}
},
render_config: RenderConfig::default(),
};

if !confirm.prompt()? {
return Ok(());
}

let update_result = receipt.run().await?;
if let Some(result) = update_result {
let version = result.new_version;
let updated_version = t!("updated_version", locale = locale, version = version,);
writeln!(output, "{updated_version}")?;
}
}

Ok(())