Trim PR scope for review feedback

This commit is contained in:
Felix 2026-04-12 21:59:13 +02:00
parent 43ba5b50ae
commit 245f91a029
4 changed files with 52 additions and 105 deletions

View File

@ -1,9 +1,8 @@
use crate::{java::setup_java, protobufs::setup_protobufs, pumpkin::setup_pumpkin_build_info}; use crate::{java::setup_java, protobufs::setup_protobufs};
use std::{error::Error, path::PathBuf}; use std::{error::Error, path::PathBuf};
pub mod java; pub mod java;
pub mod protobufs; pub mod protobufs;
pub mod pumpkin;
fn main() -> Result<(), Box<dyn Error>> { fn main() -> Result<(), Box<dyn Error>> {
println!("cargo::rerun-if-changed=rust/src/build.rs"); println!("cargo::rerun-if-changed=rust/src/build.rs");
@ -12,7 +11,6 @@ fn main() -> Result<(), Box<dyn Error>> {
let base = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()); let base = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
setup_pumpkin_build_info(&base);
setup_protobufs(base.clone()); setup_protobufs(base.clone());
setup_java(base); setup_java(base);
Ok(()) Ok(())

View File

@ -1,64 +0,0 @@
use std::{fs, path::Path};
fn extract_git_revision(source: &str) -> Option<String> {
source.rsplit('#').next().and_then(|revision| {
let trimmed = revision.trim();
if trimmed.is_empty() {
None
} else {
Some(trimmed.to_string())
}
})
}
pub fn setup_pumpkin_build_info(base: &Path) {
let lock_path = base.join("Cargo.lock");
let lock_contents =
fs::read_to_string(&lock_path).expect("Failed to read Cargo.lock for Pumpkin build info");
let mut in_pumpkin_package = false;
let mut pumpkin_version: Option<String> = None;
let mut pumpkin_revision: Option<String> = None;
for line in lock_contents.lines() {
let trimmed = line.trim();
if trimmed == "[[package]]" {
if in_pumpkin_package {
break;
}
in_pumpkin_package = false;
pumpkin_version = None;
pumpkin_revision = None;
continue;
}
if trimmed == r#"name = "pumpkin""# {
in_pumpkin_package = true;
continue;
}
if !in_pumpkin_package {
continue;
}
if let Some(version) = trimmed.strip_prefix(r#"version = ""#) {
pumpkin_version = Some(version.trim_end_matches('"').to_string());
continue;
}
if let Some(source) = trimmed.strip_prefix(r#"source = ""#) {
let source = source.trim_end_matches('"');
pumpkin_revision = extract_git_revision(source);
}
}
let pumpkin_version = pumpkin_version.unwrap_or_else(|| "unknown".to_string());
let pumpkin_revision = pumpkin_revision.unwrap_or_else(|| "unknown".to_string());
let pumpkin_revision_short = pumpkin_revision.chars().take(7).collect::<String>();
println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_VERSION={pumpkin_version}");
println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_REVISION={pumpkin_revision}");
println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_REVISION_SHORT={pumpkin_revision_short}");
println!("cargo::rerun-if-changed={}", lock_path.display());
}

View File

@ -4,7 +4,10 @@ use anyhow::Result;
use j4rs::{Instance, InvocationArg, Jvm}; use j4rs::{Instance, InvocationArg, Jvm};
use pumpkin::{command::dispatcher::CommandError, plugin::Context}; use pumpkin::{command::dispatcher::CommandError, plugin::Context};
use pumpkin_protocol::java::client::play::CommandSuggestion; use pumpkin_protocol::java::client::play::CommandSuggestion;
use pumpkin_util::permission::{Permission, PermissionDefault}; use pumpkin_util::{
PermissionLvl,
permission::{Permission, PermissionDefault},
};
use tokio::sync::mpsc; use tokio::sync::mpsc;
use crate::{ use crate::{
@ -187,7 +190,7 @@ impl CommandManager {
cmd_data.description.clone().unwrap_or_default(), cmd_data.description.clone().unwrap_or_default(),
); );
let permission = build_permission_node(&plugin.name, &cmd_name); let (permission, permission_default) = build_permission_node(&cmd_name, cmd_data);
let registry = { let registry = {
let permission_manager = context.permission_manager.read().await; let permission_manager = context.permission_manager.read().await;
@ -200,7 +203,7 @@ impl CommandManager {
"Allows running the Bukkit command `{cmd_name}` from `{}`", "Allows running the Bukkit command `{cmd_name}` from `{}`",
plugin.name plugin.name
), ),
PermissionDefault::Allow, permission_default,
)) { )) {
if e.contains("already registered") { if e.contains("already registered") {
tracing::debug!( tracing::debug!(
@ -318,48 +321,66 @@ impl CommandManager {
} }
} }
fn build_permission_node(plugin_name: &str, cmd_name: &str) -> String { fn build_permission_node(
let plugin_segment = sanitize_permission_segment(plugin_name); cmd_name: &str,
let command_segment = sanitize_permission_segment(cmd_name); cmd_data: &config::spigot::Command,
format!("{PATCHBUKKIT_PERMISSION_NAMESPACE}:command.{plugin_segment}.{command_segment}") ) -> (String, PermissionDefault) {
} if let Some(permission) = &cmd_data.permission {
(
fn sanitize_permission_segment(value: &str) -> String { permission.clone(),
let sanitized: String = value PermissionDefault::Op(PermissionLvl::Two),
.chars() )
.map(|ch| {
if ch.is_ascii_alphanumeric() || matches!(ch, '.' | '_' | '-') {
ch.to_ascii_lowercase()
} else {
'_'
}
})
.collect();
if sanitized.is_empty() {
"unknown".to_string()
} else { } else {
sanitized (
format!("{PATCHBUKKIT_PERMISSION_NAMESPACE}:command.{cmd_name}"),
PermissionDefault::Allow,
)
} }
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use pumpkin_util::{PermissionLvl, permission::PermissionDefault};
use crate::config::spigot::Command;
use super::build_permission_node; use super::build_permission_node;
#[test] #[test]
fn permission_node_is_namespaced_and_stable() { fn permission_node_uses_explicit_plugin_permission() {
let command = Command {
description: None,
usage: None,
aliases: None,
permission: Some("simplespawn.spawn".to_string()),
permission_message: None,
};
assert_eq!( assert_eq!(
build_permission_node("SimpleSpawn", "spawn"), build_permission_node("spawn", &command),
"patchbukkit:command.simplespawn.spawn" (
"simplespawn.spawn".to_string(),
PermissionDefault::Op(PermissionLvl::Two)
)
); );
} }
#[test] #[test]
fn permission_node_sanitizes_unfriendly_characters() { fn permission_node_falls_back_to_patchbukkit_namespace() {
let command = Command {
description: None,
usage: None,
aliases: None,
permission: None,
permission_message: None,
};
assert_eq!( assert_eq!(
build_permission_node("Fancy Plugin", "Spawn-All"), build_permission_node("spawn", &command),
"patchbukkit:command.fancy_plugin.spawn-all" (
"patchbukkit:command.spawn".to_string(),
PermissionDefault::Allow
)
); );
} }
} }

View File

@ -30,17 +30,9 @@ use crate::{
}, },
}; };
const PATCHBUKKIT_PUMPKIN_VERSION: &str = env!("PATCHBUKKIT_PUMPKIN_VERSION");
const PATCHBUKKIT_PUMPKIN_REVISION: &str = env!("PATCHBUKKIT_PUMPKIN_REVISION");
const PATCHBUKKIT_PUMPKIN_REVISION_SHORT: &str = env!("PATCHBUKKIT_PUMPKIN_REVISION_SHORT");
async fn on_load_inner(plugin: &PatchBukkitPlugin, server: Arc<Context>) -> Result<(), String> { async fn on_load_inner(plugin: &PatchBukkitPlugin, server: Arc<Context>) -> Result<(), String> {
server.init_log(); server.init_log();
tracing::info!("Starting PatchBukkit"); tracing::info!("Starting PatchBukkit");
tracing::info!(
"Built against Pumpkin {PATCHBUKKIT_PUMPKIN_VERSION} ({PATCHBUKKIT_PUMPKIN_REVISION_SHORT})"
);
tracing::debug!("Full Pumpkin dependency revision: {PATCHBUKKIT_PUMPKIN_REVISION}");
// Setup directories // Setup directories
let dirs = setup_directories(&server)?; let dirs = setup_directories(&server)?;