1
0
Fork 0
mirror of https://codeberg.org/icewind/haze.git synced 2026-06-03 09:04:12 +02:00

default to max supported php version

This commit is contained in:
Robin Appelman 2025-08-26 13:32:18 +02:00
commit 86a68339b4
5 changed files with 122 additions and 49 deletions

View file

@ -1,4 +1,4 @@
use crate::config::{HazeConfig, HazeVolumeConfig, Preset};
use crate::config::{HazeConfig, HazeVolumeConfig};
use crate::database::Database;
use crate::exec::{exec, exec_io, exec_tty, ExitCode};
use crate::mapping::{default_mappings, Mapping};
@ -9,7 +9,7 @@ use bollard::container::{ListContainersOptions, RemoveContainerOptions, UpdateCo
use bollard::models::ContainerState;
use bollard::network::CreateNetworkOptions;
use bollard::Docker;
use camino::Utf8PathBuf;
use camino::{Utf8Path, Utf8PathBuf};
use flate2::read::GzDecoder;
use futures_util::future::try_join_all;
use miette::{IntoDiagnostic, Report, Result, WrapErr};
@ -18,6 +18,7 @@ use serde_json::Value;
use std::collections::HashMap;
use std::fmt::Display;
use std::fs;
use std::fs::read_to_string;
use std::io::{stdout, Cursor, Read, Stdout, Write};
use std::iter::Peekable;
use std::net::IpAddr;
@ -29,7 +30,26 @@ use tokio::fs::remove_dir_all;
use tokio::task::spawn;
use tokio::time::sleep;
#[derive(Clone, Default, Debug, Eq, PartialEq)]
fn get_max_php_version(base_path: &Utf8Path) -> Option<PhpVersion> {
let version_check_code = read_to_string(base_path.join("lib/versioncheck.php")).ok()?;
let start = version_check_code.find("PHP_VERSION_ID >= ")?;
let code_part = &version_check_code[start + "PHP_VERSION_ID >= ".len()..];
let end = code_part.find(")")?;
let version_code = &code_part[0..end];
let mut major: u8 = version_code.get(0..1)?.parse().ok()?;
let mut minor: u8 = version_code.get(1..3)?.parse().ok()?;
if minor > 0 {
minor -= 1;
} else {
major -= 1;
minor = PhpVersion::max_minor(major);
}
PhpVersion::from_number(major, minor)
}
#[derive(Clone, Debug, Eq, PartialEq, Default)]
pub struct CloudOptions {
pub name: Option<String>,
pub db: Database,
@ -39,7 +59,19 @@ pub struct CloudOptions {
}
impl CloudOptions {
pub fn parse<I, S>(presets: &[Preset], args: &mut Peekable<I>) -> Result<CloudOptions>
pub fn new(config: &HazeConfig) -> Self {
let php = get_max_php_version(&config.sources_root).unwrap_or_default();
CloudOptions {
name: None,
php,
db: Database::default(),
services: vec![],
app_packages: vec![],
}
}
pub fn parse<I, S>(config: &HazeConfig, args: &mut Peekable<I>) -> Result<CloudOptions>
where
S: AsRef<str> + Into<String> + Display,
I: Iterator<Item = S>,
@ -57,7 +89,7 @@ impl CloudOptions {
} else if let Ok(php_option) = PhpVersion::from_str(option.as_ref()) {
php = Some(php_option);
let _ = args.next();
} else if let Some(service) = Service::from_type(presets, option.as_ref()) {
} else if let Some(service) = Service::from_type(&config.preset, option.as_ref()) {
services.extend_from_slice(&service);
let _ = args.next();
} else if option.as_ref().ends_with(".tar.gz") {
@ -74,7 +106,9 @@ impl CloudOptions {
Ok(CloudOptions {
name,
db: db.unwrap_or_default(),
php: php.unwrap_or_default(),
php: php
.or_else(|| get_max_php_version(&config.sources_root))
.unwrap_or_default(),
services,
app_packages: app_package,
})
@ -87,14 +121,16 @@ fn test_option_parse() {
use crate::service::PresetService;
use crate::service::{Ldap, LdapAdmin};
let config = HazeConfig::default();
let mut args = vec![].into_iter().peekable();
assert_eq!(
CloudOptions::parse::<_, &str>(&[], &mut args).unwrap(),
CloudOptions::parse::<_, &str>(&config, &mut args).unwrap(),
CloudOptions::default()
);
let mut args = vec!["mariadb"].into_iter().peekable();
assert_eq!(
CloudOptions::parse(&[], &mut args).unwrap(),
CloudOptions::parse(&config, &mut args).unwrap(),
CloudOptions {
db: Database::MariaDB,
..Default::default()
@ -102,14 +138,14 @@ fn test_option_parse() {
);
let mut args = vec!["rest"].into_iter().peekable();
assert_eq!(
CloudOptions::parse(&[], &mut args).unwrap(),
CloudOptions::parse(&config, &mut args).unwrap(),
CloudOptions {
..Default::default()
}
);
let mut args = vec!["7"].into_iter().peekable();
assert_eq!(
CloudOptions::parse(&[], &mut args).unwrap(),
CloudOptions::parse(&config, &mut args).unwrap(),
CloudOptions {
php: PhpVersion::Php74,
..Default::default()
@ -117,7 +153,7 @@ fn test_option_parse() {
);
let mut args = vec!["7", "pgsql", "rest"].into_iter().peekable();
assert_eq!(
CloudOptions::parse(&[], &mut args).unwrap(),
CloudOptions::parse(&config, &mut args).unwrap(),
CloudOptions {
php: PhpVersion::Php74,
db: Database::Postgres,
@ -126,7 +162,7 @@ fn test_option_parse() {
);
let mut args = vec!["7", "ldap", "pgsql"].into_iter().peekable();
assert_eq!(
CloudOptions::parse(&[], &mut args).unwrap(),
CloudOptions::parse(&config, &mut args).unwrap(),
CloudOptions {
php: PhpVersion::Php74,
db: Database::Postgres,
@ -136,7 +172,7 @@ fn test_option_parse() {
);
let mut args = vec!["7", "pgsql", "ldap"].into_iter().peekable();
assert_eq!(
CloudOptions::parse(&[], &mut args).unwrap(),
CloudOptions::parse(&config, &mut args).unwrap(),
CloudOptions {
php: PhpVersion::Php74,
db: Database::Postgres,
@ -147,17 +183,19 @@ fn test_option_parse() {
let mut args = vec!["7", "pgsql", "ldap", "mypreset"]
.into_iter()
.peekable();
let config = HazeConfig {
preset: vec![Preset {
name: "mypreset".to_string(),
commands: Vec::new(),
apps: Vec::new(),
config: HashMap::default(),
}],
..HazeConfig::default()
};
assert_eq!(
CloudOptions::parse(
&[Preset {
name: "mypreset".to_string(),
commands: Vec::new(),
apps: Vec::new(),
config: HashMap::default(),
}],
&mut args
)
.unwrap(),
CloudOptions::parse(&config, &mut args).unwrap(),
CloudOptions {
php: PhpVersion::Php74,
db: Database::Postgres,