Skip to content

Commit

Permalink
bugfixes
Browse files Browse the repository at this point in the history
  • Loading branch information
TheAlan404 committed Jul 6, 2023
1 parent e4e2bf3 commit 3d0bed4
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 77 deletions.
4 changes: 2 additions & 2 deletions src/bootstrapper/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ fn bootstrap_entry(ctx: &BootstrapContext, entry: &DirEntry) -> Result<()> {
let output_path = ctx.get_output_path(path);

if let Some(parent) = output_path.parent() {
fs::create_dir_all(parent)
.context(format!("Creating parent directory of [{}]", output_path.to_string_lossy()))?;
std::fs::create_dir_all(parent)
.context(format!("Creating parent directory of [{}], dir = [{}]", output_path.to_string_lossy(), parent.to_string_lossy()))?;
}
// bootstrap contents of some types
if let Some(ext) = path.extension() {
Expand Down
175 changes: 105 additions & 70 deletions src/commands/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,16 @@ pub fn cli() -> Command {
.default_value("server")
.value_parser(value_parser!(PathBuf)),
)
.arg(
arg!(--skip [stages] "Skip some stages")
.value_delimiter(',')
.default_value("")
)
}

#[allow(clippy::if_not_else)]
pub async fn run(matches: &ArgMatches) -> Result<()> {
let mut server = Server::load().context("Failed to load server.toml")?;
let server = Server::load().context("Failed to load server.toml")?;
let http_client = reqwest::Client::builder()
.user_agent(APP_USER_AGENT)
.build()
Expand All @@ -46,12 +52,21 @@ pub async fn run(matches: &ArgMatches) -> Result<()> {

println!(" Building {}...", style(server.name.clone()).green().bold());

let skip_stages = matches
.get_many::<String>("skip")
.unwrap()
.collect::<Vec<&String>>();

let mut stage_index = 1;

let mut mark_stage = |stage_name| {
println!(" stage {stage_index}: {}", title.apply_to(stage_name));
stage_index += 1;
};

let mark_stage_skipped = |id| {
println!(" {}{id}", style("-> Skipping stage ").yellow().bold());
};

// stage 1: server jar
mark_stage("Server Jar");
Expand All @@ -61,88 +76,63 @@ pub async fn run(matches: &ArgMatches) -> Result<()> {
.context("Failed to download server jar")?;

// stage 2: plugins
if !server.plugins.is_empty() {
mark_stage("Plugins");
download_addons("plugins", &server, &http_client, output_dir)
.await
.context("Failed to download plugins")?;
}

// stage 3: mods
if !server.mods.is_empty() {
mark_stage("Mods");
download_addons("mods", &server, &http_client, output_dir)
.await
.context("Failed to download plugins")?;
if !skip_stages.contains(&&"addons".to_owned()) {
if !server.plugins.is_empty() {
mark_stage("Plugins");
download_addons("plugins", &server, &http_client, output_dir)
.await
.context("Failed to download plugins")?;
}

// stage 3: mods
if !server.mods.is_empty() {
mark_stage("Mods");
download_addons("mods", &server, &http_client, output_dir)
.await
.context("Failed to download plugins")?;
}
} else {
mark_stage_skipped("addons");
}

// stage 4: bootstrap

mark_stage("Configurations");

let mut vars = HashMap::new();
if !skip_stages.contains(&&"bootstrap".to_owned()) {
let mut vars = HashMap::new();

for (key, value) in &server.variables {
vars.insert(key.clone(), value.clone());
}
for (key, value) in &server.variables {
vars.insert(key.clone(), value.clone());
}

for (key, value) in env::vars() {
vars.insert(key.clone(), value.clone());
}
for (key, value) in env::vars() {
vars.insert(key.clone(), value.clone());
}

vars.insert("SERVER_NAME".to_owned(), server.name.clone());
vars.insert("SERVER_VERSION".to_owned(), server.mc_version.clone());
vars.insert("SERVER_NAME".to_owned(), server.name.clone());
vars.insert("SERVER_VERSION".to_owned(), server.mc_version.clone());

bootstrap(
&BootstrapContext {
vars,
output_dir: output_dir.clone(),
},
"config",
)?;
bootstrap(
&BootstrapContext {
vars,
output_dir: output_dir.clone(),
},
"config",
)?;

println!(" {}", style("Bootstrapping complete").dim());
println!(" {}", style("Bootstrapping complete").dim());
} else {
mark_stage_skipped("bootstrap");
}

// stage 5: launcher scripts
if !server.launcher.disable {
mark_stage("Scripts");

fs::write(
output_dir.join("start.bat"),
server
.launcher
.generate_script_win(&serverjar_name.clone(), &server.name),
)?;

let mut file;
#[cfg(target_family = "unix")]
{
use std::os::unix::prelude::OpenOptionsExt;
file = OpenOptions::new()
.create(true)
.write(true)
.mode(0o755)
.open(output_dir.join("start.sh"))?;
}
#[cfg(not(target_family = "unix"))]
{
file = OpenOptions::new()
.create(true)
.write(true)
.open(output_dir.join("start.sh"))?;
if !skip_stages.contains(&&"scripts".to_owned()) {
if !server.launcher.disable {
mark_stage("Scripts");
create_scripts(&server, &serverjar_name, output_dir)?;
}

file.write_all(
server
.launcher
.generate_script_linux(&serverjar_name, &server.name)
.as_bytes(),
)?;

println!(
" {}",
style("start.bat and start.sh created").dim()
);
} else {
mark_stage_skipped("scripts");
}

println!(
Expand Down Expand Up @@ -256,3 +246,48 @@ async fn download_addons(

Ok(())
}

fn create_scripts(
server: &Server,
serverjar_name: &str,
output_dir: &Path,
) -> Result<()> {
fs::write(
output_dir.join("start.bat"),
server
.launcher
.generate_script_win(serverjar_name, &server.name),
)?;

let mut file;
#[cfg(target_family = "unix")]
{
use std::os::unix::prelude::OpenOptionsExt;
file = OpenOptions::new()
.create(true)
.write(true)
.mode(0o755)
.open(output_dir.join("start.sh"))?;
}
#[cfg(not(target_family = "unix"))]
{
file = OpenOptions::new()
.create(true)
.write(true)
.open(output_dir.join("start.sh"))?;
}

file.write_all(
server
.launcher
.generate_script_linux(serverjar_name, &server.name)
.as_bytes(),
)?;

println!(
" {}",
style("start.bat and start.sh created").dim()
);

Ok(())
}
2 changes: 1 addition & 1 deletion src/downloadable/markdown.rs
Original file line number Diff line number Diff line change
Expand Up @@ -293,5 +293,5 @@ static SANITIZE_R1: &str = "<(?:\"[^\"]*\"['\"]*|'[^']*'['\"]*|[^'\">])+>";
fn sanitize(s: &str) -> Result<String> {
let re = Regex::new(SANITIZE_R1)?;

Ok(re.replace_all(&s.replace('\n', " "), "").to_string())
Ok(re.replace_all(&s.replace('\n', " ").replace('\r', "").replace("<br>", " "), "").to_string())
}
2 changes: 1 addition & 1 deletion src/downloadable/sources/github.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ pub async fn fetch_repo_description(client: &reqwest::Client, repo: &str) -> Res
.json::<serde_json::Value>()
.await?["description"]
.as_str()
.unwrap()
.unwrap_or_default()
.to_owned();

Ok(desc)
Expand Down
6 changes: 3 additions & 3 deletions src/model/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,21 @@ pub struct ServerLauncher {
}

impl ServerLauncher {
pub fn generate_script_linux(&mut self, jarname: &str, servername: &str) -> String {
pub fn generate_script_linux(&self, jarname: &str, servername: &str) -> String {
format!(
"#!/bin/sh\n# generated by mcman\n{}\n",
self.generate_script_java(jarname, servername)
)
}

pub fn generate_script_win(&mut self, jarname: &str, servername: &str) -> String {
pub fn generate_script_win(&self, jarname: &str, servername: &str) -> String {
format!(
"@echo off\r\n:: generated by mcman\r\ntitle {servername}\r\n{}\r\n",
self.generate_script_java(jarname, servername)
)
}

pub fn generate_script_java(&mut self, jarname: &str, _servername: &str) -> String {
pub fn generate_script_java(&self, jarname: &str, _servername: &str) -> String {
let mut script = String::new();

// TODO: custom java stuff from ~/.mcmanconfig or something idk
Expand Down

0 comments on commit 3d0bed4

Please sign in to comment.