Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea13c51b7d | ||
|
|
3ed763b884 | ||
|
|
10e1e170b7 | ||
|
|
ffa62afc66 | ||
|
|
f794329913 | ||
|
|
f9a35c7661 | ||
|
|
ed496f3462 | ||
|
|
6accdae232 |
2
.github/workflows/test-config-creation.yml
vendored
2
.github/workflows/test-config-creation.yml
vendored
@@ -17,5 +17,5 @@ jobs:
|
|||||||
CONFIG_PATH=~/.config/topgrade.toml;
|
CONFIG_PATH=~/.config/topgrade.toml;
|
||||||
if [ -f "$CONFIG_PATH" ]; then rm $CONFIG_PATH; fi
|
if [ -f "$CONFIG_PATH" ]; then rm $CONFIG_PATH; fi
|
||||||
cargo build;
|
cargo build;
|
||||||
./target/debug/topgrade --dry-run --only system;
|
TOPGRADE_SKIP_BRKC_NOTIFY=true ./target/debug/topgrade --dry-run --only system;
|
||||||
stat $CONFIG_PATH;
|
stat $CONFIG_PATH;
|
||||||
|
|||||||
3
.github/workflows/update_homebrew.yml
vendored
3
.github/workflows/update_homebrew.yml
vendored
@@ -29,7 +29,8 @@ jobs:
|
|||||||
if: steps.cache.outputs.cache-hit != 'true'
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
run: brew install-bundler-gems
|
run: brew install-bundler-gems
|
||||||
- name: Bump formulae
|
- name: Bump formulae
|
||||||
uses: Homebrew/actions/bump-formulae@master
|
uses: Homebrew/actions/bump-packages@master
|
||||||
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
# Custom GitHub access token with only the 'public_repo' scope enabled
|
# Custom GitHub access token with only the 'public_repo' scope enabled
|
||||||
token: ${{secrets.HOMEBREW_ACCESS_TOKEN}}
|
token: ${{secrets.HOMEBREW_ACCESS_TOKEN}}
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ and have some basic documentations guiding user how to use these options.
|
|||||||
|
|
||||||
## Breaking changes
|
## Breaking changes
|
||||||
|
|
||||||
If your PR introduces a breaking change, document it in `BREAKINGCHANGE_dev.md`,
|
If your PR introduces a breaking change, document it in [`BREAKINGCHANGES_dev.md`][bc_dev],
|
||||||
it should be written in Markdown and wrapped in 80, for example:
|
it should be written in Markdown and wrapped in 80, for example:
|
||||||
|
|
||||||
```md
|
```md
|
||||||
@@ -114,6 +114,8 @@ it should be written in Markdown and wrapped in 80, for example:
|
|||||||
3. ...
|
3. ...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
[bc_dev]: https://github.com/topgrade-rs/topgrade/blob/main/BREAKINGCHANGES_dev.md
|
||||||
|
|
||||||
## Before you submit your PR
|
## Before you submit your PR
|
||||||
|
|
||||||
Make sure your patch passes the following tests on your host:
|
Make sure your patch passes the following tests on your host:
|
||||||
|
|||||||
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -2381,7 +2381,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "topgrade"
|
name = "topgrade"
|
||||||
version = "14.0.0"
|
version = "14.0.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ categories = ["os"]
|
|||||||
keywords = ["upgrade", "update"]
|
keywords = ["upgrade", "update"]
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
repository = "https://github.com/topgrade-rs/topgrade"
|
repository = "https://github.com/topgrade-rs/topgrade"
|
||||||
version = "14.0.0"
|
version = "14.0.1"
|
||||||
authors = ["Roey Darwish Dror <roey.ghost@gmail.com>", "Thomas Schönauer <t.schoenauer@hgs-wt.at>"]
|
authors = ["Roey Darwish Dror <roey.ghost@gmail.com>", "Thomas Schönauer <t.schoenauer@hgs-wt.at>"]
|
||||||
exclude = ["doc/screenshot.gif", "BREAKINGCHNAGES_dev.md"]
|
exclude = ["doc/screenshot.gif", "BREAKINGCHANGES_dev.md"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|||||||
64
RELEASE_PROCEDURE.md
Normal file
64
RELEASE_PROCEDURE.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
> This document lists the steps that lead to a successful release of Topgrade.
|
||||||
|
|
||||||
|
1. Open a PR that:
|
||||||
|
|
||||||
|
> Here is an [Example PR](https://github.com/topgrade-rs/topgrade/pull/652)
|
||||||
|
> that you can refer to.
|
||||||
|
|
||||||
|
1. bumps the version number.
|
||||||
|
|
||||||
|
> If there are breaking changes, the major version number should be increased.
|
||||||
|
|
||||||
|
2. Overwrite [`BREAKINGCHANGES`][breaking_changes] with
|
||||||
|
[`BREAKINGCHANGES_dev`][breaking_changes_dev], and create a new dev file:
|
||||||
|
|
||||||
|
```sh'
|
||||||
|
$ cd topgrade
|
||||||
|
$ cp BREAKINGCHANGES_dev.md BREAKINGCHANGES.md
|
||||||
|
$ touch BREAKINGCHANGES_dev.md
|
||||||
|
```
|
||||||
|
|
||||||
|
[breaking_changes_dev]: https://github.com/topgrade-rs/topgrade/blob/main/BREAKINGCHANGES_dev.md
|
||||||
|
[breaking_changes]: https://github.com/topgrade-rs/topgrade/blob/main/BREAKINGCHANGES.md
|
||||||
|
|
||||||
|
2. Check and merge that PR.
|
||||||
|
|
||||||
|
3. Go to the [release](https://github.com/topgrade-rs/topgrade/releases) page
|
||||||
|
and click the [Draft a new release button](https://github.com/topgrade-rs/topgrade/releases/new)
|
||||||
|
|
||||||
|
4. Write the release notes
|
||||||
|
|
||||||
|
We usually use GitHub's [Automatically generated release notes][auto_gen_release_notes]
|
||||||
|
functionality to generate release notes, but you write your own one instead.
|
||||||
|
|
||||||
|
[auto_gen_release_notes]: https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes
|
||||||
|
|
||||||
|
5. Attaching binaries
|
||||||
|
|
||||||
|
You don't need to do this as our CI will automatically do it for you,
|
||||||
|
binaries for Linux, macOS and Windows will be created and attached.
|
||||||
|
|
||||||
|
And the CI will publish the new binary to:
|
||||||
|
|
||||||
|
1. AUR
|
||||||
|
2. PyPi
|
||||||
|
3. Homebrew (seems that this is not working correctly)
|
||||||
|
|
||||||
|
6. Manually release it to Crates.io
|
||||||
|
|
||||||
|
> Yeah, this is unfortunate, our CI won't do this for us. We should probably add one.
|
||||||
|
|
||||||
|
1. `cd` to the Topgrade directory, make sure that it is the latest version
|
||||||
|
(i.e., including the PR that bumps the version number).
|
||||||
|
2. Set up your token with `cargo login`.
|
||||||
|
3. Dry-run the publish `cargo publish --dry-run`.
|
||||||
|
4. If step 3 works, then do the final release `cargo publish`.
|
||||||
|
|
||||||
|
> You can also take a look at the official tutorial [Publishing on crates.io][doc]
|
||||||
|
>
|
||||||
|
> [doc]: https://doc.rust-lang.org/cargo/reference/publishing.html
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -153,6 +153,7 @@
|
|||||||
|
|
||||||
|
|
||||||
[git]
|
[git]
|
||||||
|
# How many repos to pull at max in parallel
|
||||||
# max_concurrency = 5
|
# max_concurrency = 5
|
||||||
|
|
||||||
# Additional git repositories to pull
|
# Additional git repositories to pull
|
||||||
@@ -167,6 +168,7 @@
|
|||||||
# Arguments to pass Git when pulling Repositories
|
# Arguments to pass Git when pulling Repositories
|
||||||
# arguments = "--rebase --autostash"
|
# arguments = "--rebase --autostash"
|
||||||
|
|
||||||
|
|
||||||
[windows]
|
[windows]
|
||||||
# Manually select Windows updates
|
# Manually select Windows updates
|
||||||
# accept_all_updates = false
|
# accept_all_updates = false
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ use crate::XDG_DIRS;
|
|||||||
use color_eyre::eyre::Result;
|
use color_eyre::eyre::Result;
|
||||||
use etcetera::base_strategy::BaseStrategy;
|
use etcetera::base_strategy::BaseStrategy;
|
||||||
use std::{
|
use std::{
|
||||||
|
env::var,
|
||||||
fs::{read_to_string, OpenOptions},
|
fs::{read_to_string, OpenOptions},
|
||||||
io::Write,
|
io::Write,
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
@@ -89,6 +90,16 @@ fn keep_file_path() -> PathBuf {
|
|||||||
data_dir().join(keep_file)
|
data_dir().join(keep_file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If environment variable `TOPGRADE_SKIP_BRKC_NOTIFY` is set to `true`, then
|
||||||
|
/// we won't notify the user of the breaking changes.
|
||||||
|
pub(crate) fn should_skip() -> bool {
|
||||||
|
if let Ok(var) = var("TOPGRADE_SKIP_BRKC_NOTIFY") {
|
||||||
|
return var.as_str() == "true";
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/// True if this is the first execution of a major release.
|
/// True if this is the first execution of a major release.
|
||||||
pub(crate) fn first_run_of_major_release() -> Result<bool> {
|
pub(crate) fn first_run_of_major_release() -> Result<bool> {
|
||||||
let version = VERSION_STR.parse::<Version>().expect("should be a valid version");
|
let version = VERSION_STR.parse::<Version>().expect("should be a valid version");
|
||||||
|
|||||||
14
src/main.rs
14
src/main.rs
@@ -6,7 +6,7 @@ use std::path::PathBuf;
|
|||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use crate::breaking_changes::{first_run_of_major_release, print_breaking_changes, write_keep_file};
|
use crate::breaking_changes::{first_run_of_major_release, print_breaking_changes, should_skip, write_keep_file};
|
||||||
use clap::CommandFactory;
|
use clap::CommandFactory;
|
||||||
use clap::{crate_version, Parser};
|
use clap::{crate_version, Parser};
|
||||||
use color_eyre::eyre::Context;
|
use color_eyre::eyre::Context;
|
||||||
@@ -135,9 +135,13 @@ fn run() -> Result<()> {
|
|||||||
let ctx = execution_context::ExecutionContext::new(run_type, sudo, &git, &config);
|
let ctx = execution_context::ExecutionContext::new(run_type, sudo, &git, &config);
|
||||||
let mut runner = runner::Runner::new(&ctx);
|
let mut runner = runner::Runner::new(&ctx);
|
||||||
|
|
||||||
// If this is the first execution of a major release, inform user of breaking
|
// If
|
||||||
// changes
|
//
|
||||||
if first_run_of_major_release()? {
|
// 1. the breaking changes notification shouldnot be skipped
|
||||||
|
// 2. this is the first execution of a major release
|
||||||
|
//
|
||||||
|
// inform user of breaking changes
|
||||||
|
if !should_skip() && first_run_of_major_release()? {
|
||||||
print_breaking_changes();
|
print_breaking_changes();
|
||||||
|
|
||||||
if prompt_yesno("Confirmed?")? {
|
if prompt_yesno("Confirmed?")? {
|
||||||
@@ -349,7 +353,7 @@ fn run() -> Result<()> {
|
|||||||
runner.execute(Step::Vcpkg, "vcpkg", || generic::run_vcpkg_update(&ctx))?;
|
runner.execute(Step::Vcpkg, "vcpkg", || generic::run_vcpkg_update(&ctx))?;
|
||||||
runner.execute(Step::Pipx, "pipx", || generic::run_pipx_update(&ctx))?;
|
runner.execute(Step::Pipx, "pipx", || generic::run_pipx_update(&ctx))?;
|
||||||
runner.execute(Step::Vscode, "Visual Studio Code extensions", || {
|
runner.execute(Step::Vscode, "Visual Studio Code extensions", || {
|
||||||
generic::run_vscode_extensions_upgrade(&ctx)
|
generic::run_vscode_extensions_update(&ctx)
|
||||||
})?;
|
})?;
|
||||||
runner.execute(Step::Conda, "conda", || generic::run_conda_update(&ctx))?;
|
runner.execute(Step::Conda, "conda", || generic::run_conda_update(&ctx))?;
|
||||||
runner.execute(Step::Mamba, "mamba", || generic::run_mamba_update(&ctx))?;
|
runner.execute(Step::Mamba, "mamba", || generic::run_mamba_update(&ctx))?;
|
||||||
|
|||||||
@@ -24,6 +24,18 @@ use crate::{
|
|||||||
terminal::print_warning,
|
terminal::print_warning,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
pub fn is_wsl() -> Result<bool> {
|
||||||
|
let output = Command::new("uname").arg("-r").output_checked_utf8()?.stdout;
|
||||||
|
debug!("Uname output: {}", output);
|
||||||
|
Ok(output.contains("microsoft"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
|
pub fn is_wsl() -> Result<bool> {
|
||||||
|
Ok(false)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn run_cargo_update(ctx: &ExecutionContext) -> Result<()> {
|
pub fn run_cargo_update(ctx: &ExecutionContext) -> Result<()> {
|
||||||
let cargo_dir = env::var_os("CARGO_HOME")
|
let cargo_dir = env::var_os("CARGO_HOME")
|
||||||
.map(PathBuf::from)
|
.map(PathBuf::from)
|
||||||
@@ -325,28 +337,37 @@ pub fn run_vcpkg_update(ctx: &ExecutionContext) -> Result<()> {
|
|||||||
command.args(["upgrade", "--no-dry-run"]).status_checked()
|
command.args(["upgrade", "--no-dry-run"]).status_checked()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_vscode_extensions_upgrade(ctx: &ExecutionContext) -> Result<()> {
|
pub fn run_vscode_extensions_update(ctx: &ExecutionContext) -> Result<()> {
|
||||||
let vscode = require("code")?;
|
// Calling vscode in WSL may install a server instead of updating extensions (https://github.com/topgrade-rs/topgrade/issues/594#issuecomment-1782157367)
|
||||||
print_separator("Visual Studio Code extensions");
|
if is_wsl()? {
|
||||||
|
return Err(SkipStep(String::from("Should not run in WSL")).into());
|
||||||
// Vscode does not have CLI command to upgrade all extensions (see https://github.com/microsoft/vscode/issues/56578)
|
|
||||||
// Instead we get the list of installed extensions with `code --list-extensions` command (obtain a line-return separated list of installed extensions)
|
|
||||||
let extensions = Command::new(&vscode)
|
|
||||||
.arg("--list-extensions")
|
|
||||||
.output_checked_utf8()?
|
|
||||||
.stdout;
|
|
||||||
|
|
||||||
// Then we construct the upgrade command: `code --force --install-extension [ext0] --install-extension [ext1] ... --install-extension [extN]`
|
|
||||||
if !extensions.is_empty() {
|
|
||||||
let mut command_args = vec!["--force"];
|
|
||||||
for extension in extensions.split_whitespace() {
|
|
||||||
command_args.extend(["--install-extension", extension]);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.run_type().execute(&vscode).args(command_args).status_checked()?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
let vscode = require("code")?;
|
||||||
|
|
||||||
|
// Vscode has update command only since 1.86 version ("january 2024" update), disable the update for prior versions
|
||||||
|
// Use command `code --version` which returns 3 lines: version, git commit, instruction set. We parse only the first one
|
||||||
|
let version: Result<Version> = match Command::new("code")
|
||||||
|
.arg("--version")
|
||||||
|
.output_checked_utf8()?
|
||||||
|
.stdout
|
||||||
|
.lines()
|
||||||
|
.next()
|
||||||
|
{
|
||||||
|
Some(item) => Version::parse(item).map_err(|err| err.into()),
|
||||||
|
_ => return Err(SkipStep(String::from("Cannot find vscode version")).into()),
|
||||||
|
};
|
||||||
|
|
||||||
|
if !matches!(version, Ok(version) if version >= Version::new(1, 86, 0)) {
|
||||||
|
return Err(SkipStep(String::from("Too old vscode version to have update extensions command")).into());
|
||||||
|
}
|
||||||
|
|
||||||
|
print_separator("Visual Studio Code extensions");
|
||||||
|
|
||||||
|
ctx.run_type()
|
||||||
|
.execute(vscode)
|
||||||
|
.arg("--update-extensions")
|
||||||
|
.status_checked()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_pipx_update(ctx: &ExecutionContext) -> Result<()> {
|
pub fn run_pipx_update(ctx: &ExecutionContext) -> Result<()> {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use tracing::{debug, warn};
|
|||||||
use crate::command::CommandExt;
|
use crate::command::CommandExt;
|
||||||
use crate::error::{SkipStep, TopgradeError};
|
use crate::error::{SkipStep, TopgradeError};
|
||||||
use crate::execution_context::ExecutionContext;
|
use crate::execution_context::ExecutionContext;
|
||||||
|
use crate::steps::generic::is_wsl;
|
||||||
use crate::steps::os::archlinux;
|
use crate::steps::os::archlinux;
|
||||||
use crate::terminal::print_separator;
|
use crate::terminal::print_separator;
|
||||||
use crate::utils::{require, require_option, which, PathExt, REQUIRE_SUDO};
|
use crate::utils::{require, require_option, which, PathExt, REQUIRE_SUDO};
|
||||||
@@ -38,6 +39,7 @@ pub enum Distribution {
|
|||||||
Exherbo,
|
Exherbo,
|
||||||
NixOS,
|
NixOS,
|
||||||
KDENeon,
|
KDENeon,
|
||||||
|
Nobara,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Distribution {
|
impl Distribution {
|
||||||
@@ -52,7 +54,7 @@ impl Distribution {
|
|||||||
Some("alpine") => Distribution::Alpine,
|
Some("alpine") => Distribution::Alpine,
|
||||||
Some("centos") | Some("rhel") | Some("ol") => Distribution::CentOS,
|
Some("centos") | Some("rhel") | Some("ol") => Distribution::CentOS,
|
||||||
Some("clear-linux-os") => Distribution::ClearLinux,
|
Some("clear-linux-os") => Distribution::ClearLinux,
|
||||||
Some("fedora") | Some("nobara") => {
|
Some("fedora") => {
|
||||||
return if let Some(variant) = variant {
|
return if let Some(variant) = variant {
|
||||||
if variant.contains(&"Silverblue")
|
if variant.contains(&"Silverblue")
|
||||||
|| variant.contains(&"Kinoite")
|
|| variant.contains(&"Kinoite")
|
||||||
@@ -68,6 +70,7 @@ impl Distribution {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some("nobara") => Distribution::Nobara,
|
||||||
Some("void") => Distribution::Void,
|
Some("void") => Distribution::Void,
|
||||||
Some("debian") | Some("pureos") | Some("Deepin") => Distribution::Debian,
|
Some("debian") | Some("pureos") | Some("Deepin") => Distribution::Debian,
|
||||||
Some("arch") | Some("manjaro-arm") | Some("garuda") | Some("artix") => Distribution::Arch,
|
Some("arch") | Some("manjaro-arm") | Some("garuda") | Some("artix") => Distribution::Arch,
|
||||||
@@ -151,6 +154,7 @@ impl Distribution {
|
|||||||
Distribution::Bedrock => update_bedrock(ctx),
|
Distribution::Bedrock => update_bedrock(ctx),
|
||||||
Distribution::OpenMandriva => upgrade_openmandriva(ctx),
|
Distribution::OpenMandriva => upgrade_openmandriva(ctx),
|
||||||
Distribution::PCLinuxOS => upgrade_pclinuxos(ctx),
|
Distribution::PCLinuxOS => upgrade_pclinuxos(ctx),
|
||||||
|
Distribution::Nobara => upgrade_nobara(ctx),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,12 +193,6 @@ fn update_bedrock(ctx: &ExecutionContext) -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_wsl() -> Result<bool> {
|
|
||||||
let output = Command::new("uname").arg("-r").output_checked_utf8()?.stdout;
|
|
||||||
debug!("Uname output: {}", output);
|
|
||||||
Ok(output.contains("microsoft"))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn upgrade_alpine_linux(ctx: &ExecutionContext) -> Result<()> {
|
fn upgrade_alpine_linux(ctx: &ExecutionContext) -> Result<()> {
|
||||||
let apk = require("apk")?;
|
let apk = require("apk")?;
|
||||||
let sudo = require_option(ctx.sudo().as_ref(), REQUIRE_SUDO.to_string())?;
|
let sudo = require_option(ctx.sudo().as_ref(), REQUIRE_SUDO.to_string())?;
|
||||||
@@ -234,6 +232,40 @@ fn upgrade_redhat(ctx: &ExecutionContext) -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn upgrade_nobara(ctx: &ExecutionContext) -> Result<()> {
|
||||||
|
let sudo = require_option(ctx.sudo().as_ref(), REQUIRE_SUDO.to_string())?;
|
||||||
|
let pkg_manager = require("dnf")?;
|
||||||
|
|
||||||
|
let mut update_command = ctx.run_type().execute(sudo);
|
||||||
|
update_command.arg(&pkg_manager);
|
||||||
|
|
||||||
|
if ctx.config().yes(Step::System) {
|
||||||
|
update_command.arg("-y");
|
||||||
|
}
|
||||||
|
|
||||||
|
update_command.arg("update");
|
||||||
|
// See https://nobaraproject.org/docs/upgrade-troubleshooting/how-do-i-update-the-system/
|
||||||
|
update_command.args([
|
||||||
|
"rpmfusion-nonfree-release",
|
||||||
|
"rpmfusion-free-release",
|
||||||
|
"fedora-repos",
|
||||||
|
"nobara-repos",
|
||||||
|
]);
|
||||||
|
update_command.arg("--refresh").status_checked()?;
|
||||||
|
|
||||||
|
let mut upgrade_command = ctx.run_type().execute(sudo);
|
||||||
|
upgrade_command.arg(&pkg_manager);
|
||||||
|
|
||||||
|
if ctx.config().yes(Step::System) {
|
||||||
|
upgrade_command.arg("-y");
|
||||||
|
}
|
||||||
|
|
||||||
|
upgrade_command.arg("distro-sync");
|
||||||
|
|
||||||
|
upgrade_command.status_checked()?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn upgrade_fedora_immutable(ctx: &ExecutionContext) -> Result<()> {
|
fn upgrade_fedora_immutable(ctx: &ExecutionContext) -> Result<()> {
|
||||||
let ostree = require("rpm-ostree")?;
|
let ostree = require("rpm-ostree")?;
|
||||||
let mut command = ctx.run_type().execute(ostree);
|
let mut command = ctx.run_type().execute(ostree);
|
||||||
@@ -1120,4 +1152,9 @@ mod tests {
|
|||||||
fn test_solus() {
|
fn test_solus() {
|
||||||
test_template(include_str!("os_release/solus"), Distribution::Solus);
|
test_template(include_str!("os_release/solus"), Distribution::Solus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_nobara() {
|
||||||
|
test_template(include_str!("os_release/nobara"), Distribution::Nobara);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/steps/os/os_release/nobara
Normal file
23
src/steps/os/os_release/nobara
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
NAME="Nobara Linux"
|
||||||
|
VERSION="39 (GNOME Edition)"
|
||||||
|
ID=nobara
|
||||||
|
ID_LIKE="rhel centos fedora"
|
||||||
|
VERSION_ID=39
|
||||||
|
VERSION_CODENAME=""
|
||||||
|
PLATFORM_ID="platform:f39"
|
||||||
|
PRETTY_NAME="Nobara Linux 39 (GNOME Edition)"
|
||||||
|
ANSI_COLOR="0;38;2;60;110;180"
|
||||||
|
LOGO=nobara-logo-icon
|
||||||
|
CPE_NAME="cpe:/o:nobaraproject:nobara:39"
|
||||||
|
DEFAULT_HOSTNAME="nobara"
|
||||||
|
HOME_URL="https://nobaraproject.org/"
|
||||||
|
DOCUMENTATION_URL="https://www.nobaraproject.org/"
|
||||||
|
SUPPORT_URL="https://www.nobaraproject.org/"
|
||||||
|
BUG_REPORT_URL="https://gitlab.com/gloriouseggroll/nobara-images"
|
||||||
|
REDHAT_BUGZILLA_PRODUCT="Nobara"
|
||||||
|
REDHAT_BUGZILLA_PRODUCT_VERSION=39
|
||||||
|
REDHAT_SUPPORT_PRODUCT="Nobara"
|
||||||
|
REDHAT_SUPPORT_PRODUCT_VERSION=39
|
||||||
|
SUPPORT_END=2024-05-14
|
||||||
|
VARIANT="GNOME Edition"
|
||||||
|
VARIANT_ID=gnome
|
||||||
Reference in New Issue
Block a user