...
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
use rhai::{Engine, EvalAltResult, Array, Dynamic, Map};
|
||||
use std::collections::HashMap;
|
||||
use crate::virt::buildah::{self, BuildahError, Image};
|
||||
use crate::virt::buildah::{self, BuildahError, Image, Builder};
|
||||
use crate::process::CommandResult;
|
||||
|
||||
/// Register Buildah module functions with the Rhai engine
|
||||
@@ -20,35 +20,42 @@ pub fn register_bah_module(engine: &mut Engine) -> Result<(), Box<EvalAltResult>
|
||||
// Register types
|
||||
register_bah_types(engine)?;
|
||||
|
||||
// Register container functions
|
||||
engine.register_fn("bah_from", bah_from);
|
||||
engine.register_fn("bah_run", bah_run);
|
||||
engine.register_fn("bah_run_with_isolation", bah_run_with_isolation);
|
||||
engine.register_fn("bah_copy", bah_copy);
|
||||
engine.register_fn("bah_add", bah_add);
|
||||
engine.register_fn("bah_commit", bah_commit);
|
||||
engine.register_fn("bah_remove", bah_remove);
|
||||
engine.register_fn("bah_list", bah_list);
|
||||
engine.register_fn("bah_build", bah_build_with_options);
|
||||
engine.register_fn("bah_new_build_options", new_build_options);
|
||||
// Register Builder constructor
|
||||
engine.register_fn("bah_new", bah_new);
|
||||
|
||||
// Register image functions
|
||||
engine.register_fn("bah_images", images);
|
||||
engine.register_fn("bah_image_remove", image_remove);
|
||||
engine.register_fn("bah_image_push", image_push);
|
||||
engine.register_fn("bah_image_tag", image_tag);
|
||||
engine.register_fn("bah_image_pull", image_pull);
|
||||
engine.register_fn("bah_image_commit", image_commit_with_options);
|
||||
engine.register_fn("bah_new_commit_options", new_commit_options);
|
||||
engine.register_fn("bah_config", config_with_options);
|
||||
engine.register_fn("bah_new_config_options", new_config_options);
|
||||
// Register Builder instance methods
|
||||
engine.register_fn("run", builder_run);
|
||||
engine.register_fn("run_with_isolation", builder_run_with_isolation);
|
||||
engine.register_fn("copy", builder_copy);
|
||||
engine.register_fn("add", builder_add);
|
||||
engine.register_fn("commit", builder_commit);
|
||||
// Remove the line that's causing the error
|
||||
engine.register_fn("remove", builder_remove);
|
||||
engine.register_fn("reset", builder_reset);
|
||||
engine.register_fn("config", builder_config);
|
||||
|
||||
// Register Builder static methods
|
||||
engine.register_fn("images", builder_images);
|
||||
engine.register_fn("image_remove", builder_image_remove);
|
||||
engine.register_fn("image_pull", builder_image_pull);
|
||||
engine.register_fn("image_push", builder_image_push);
|
||||
engine.register_fn("image_tag", builder_image_tag);
|
||||
engine.register_fn("build", builder_build);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Register Buildah module types with the Rhai engine
|
||||
fn register_bah_types(engine: &mut Engine) -> Result<(), Box<EvalAltResult>> {
|
||||
// Register Image type and methods
|
||||
// Register Builder type
|
||||
engine.register_type_with_name::<Builder>("BuildahBuilder");
|
||||
|
||||
// Register getters for Builder properties
|
||||
engine.register_get("container_id", get_builder_container_id);
|
||||
engine.register_get("name", get_builder_name);
|
||||
engine.register_get("image", get_builder_image);
|
||||
|
||||
// Register Image type and methods (same as before)
|
||||
engine.register_type_with_name::<Image>("BuildahImage");
|
||||
|
||||
// Register getters for Image properties
|
||||
@@ -84,312 +91,8 @@ fn bah_error_to_rhai_error<T>(result: Result<T, BuildahError>) -> Result<T, Box<
|
||||
})
|
||||
}
|
||||
|
||||
/// Create a new Map with default build options
|
||||
pub fn new_build_options() -> Map {
|
||||
let mut map = Map::new();
|
||||
map.insert("tag".into(), Dynamic::UNIT);
|
||||
map.insert("context_dir".into(), Dynamic::from("."));
|
||||
map.insert("file".into(), Dynamic::from("Dockerfile"));
|
||||
map.insert("isolation".into(), Dynamic::UNIT);
|
||||
map
|
||||
}
|
||||
|
||||
/// Create a new Map with default commit options
|
||||
pub fn new_commit_options() -> Map {
|
||||
let mut map = Map::new();
|
||||
map.insert("format".into(), Dynamic::UNIT);
|
||||
map.insert("squash".into(), Dynamic::from(false));
|
||||
map.insert("rm".into(), Dynamic::from(false));
|
||||
map
|
||||
}
|
||||
|
||||
/// Create a new Map for config options
|
||||
pub fn new_config_options() -> Map {
|
||||
Map::new()
|
||||
}
|
||||
|
||||
//
|
||||
// Container Function Wrappers
|
||||
//
|
||||
|
||||
/// Wrapper for buildah::from
|
||||
///
|
||||
/// Create a container from an image.
|
||||
pub fn bah_from(image: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
let result = bah_error_to_rhai_error(buildah::from(image))?;
|
||||
|
||||
// Create a new CommandResult with trimmed stdout
|
||||
let trimmed_result = CommandResult {
|
||||
stdout: result.stdout.trim().to_string(),
|
||||
stderr: result.stderr.trim().to_string(),
|
||||
success: result.success,
|
||||
code: result.code,
|
||||
};
|
||||
|
||||
Ok(trimmed_result)
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::run
|
||||
///
|
||||
/// Run a command in a container.
|
||||
pub fn bah_run(container: &str, command: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::run(container, command))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::run_with_isolation
|
||||
///
|
||||
/// Run a command in a container with specified isolation.
|
||||
pub fn bah_run_with_isolation(container: &str, command: &str, isolation: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::bah_run_with_isolation(container, command, isolation))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::copy
|
||||
///
|
||||
/// Copy files into a container.
|
||||
pub fn bah_copy(container: &str, source: &str, dest: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::bah_copy(container, source, dest))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::add
|
||||
///
|
||||
/// Add files into a container.
|
||||
pub fn bah_add(container: &str, source: &str, dest: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::bah_add(container, source, dest))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::commit
|
||||
///
|
||||
/// Commit a container to an image.
|
||||
pub fn bah_commit(container: &str, image_name: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::bah_commit(container, image_name))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::remove
|
||||
///
|
||||
/// Remove a container.
|
||||
pub fn bah_remove(container: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::bah_remove(container))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::list
|
||||
///
|
||||
/// List containers.
|
||||
pub fn bah_list() -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::bah_list())
|
||||
}
|
||||
|
||||
/// Build an image with options specified in a Map
|
||||
///
|
||||
/// This provides a builder-style interface for Rhai scripts.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```rhai
|
||||
/// let options = bah_new_build_options();
|
||||
/// options.tag = "my-image:latest";
|
||||
/// options.context_dir = ".";
|
||||
/// options.file = "Dockerfile";
|
||||
/// options.isolation = "chroot";
|
||||
/// let result = bah_build(options);
|
||||
/// ```
|
||||
pub fn bah_build_with_options(options: Map) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
// Extract options from the map
|
||||
let tag_option = match options.get("tag") {
|
||||
Some(tag) => {
|
||||
if tag.is_unit() {
|
||||
None
|
||||
} else if let Ok(tag_str) = tag.clone().into_string() {
|
||||
Some(tag_str)
|
||||
} else {
|
||||
return Err(Box::new(EvalAltResult::ErrorRuntime(
|
||||
"tag must be a string".into(),
|
||||
rhai::Position::NONE
|
||||
)));
|
||||
}
|
||||
},
|
||||
None => None
|
||||
};
|
||||
|
||||
let context_dir = match options.get("context_dir") {
|
||||
Some(dir) => {
|
||||
if let Ok(dir_str) = dir.clone().into_string() {
|
||||
dir_str
|
||||
} else {
|
||||
return Err(Box::new(EvalAltResult::ErrorRuntime(
|
||||
"context_dir must be a string".into(),
|
||||
rhai::Position::NONE
|
||||
)));
|
||||
}
|
||||
},
|
||||
None => String::from(".")
|
||||
};
|
||||
|
||||
let file = match options.get("file") {
|
||||
Some(file) => {
|
||||
if let Ok(file_str) = file.clone().into_string() {
|
||||
file_str
|
||||
} else {
|
||||
return Err(Box::new(EvalAltResult::ErrorRuntime(
|
||||
"file must be a string".into(),
|
||||
rhai::Position::NONE
|
||||
)));
|
||||
}
|
||||
},
|
||||
None => String::from("Dockerfile")
|
||||
};
|
||||
|
||||
let isolation_option = match options.get("isolation") {
|
||||
Some(isolation) => {
|
||||
if isolation.is_unit() {
|
||||
None
|
||||
} else if let Ok(isolation_str) = isolation.clone().into_string() {
|
||||
Some(isolation_str)
|
||||
} else {
|
||||
return Err(Box::new(EvalAltResult::ErrorRuntime(
|
||||
"isolation must be a string".into(),
|
||||
rhai::Position::NONE
|
||||
)));
|
||||
}
|
||||
},
|
||||
None => None
|
||||
};
|
||||
|
||||
// Convert String to &str for the function call
|
||||
let tag_ref = tag_option.as_deref();
|
||||
let isolation_ref = isolation_option.as_deref();
|
||||
|
||||
// Call the buildah build function
|
||||
bah_error_to_rhai_error(buildah::bah_build(tag_ref, &context_dir, &file, isolation_ref))
|
||||
}
|
||||
|
||||
//
|
||||
// Image Function Wrappers
|
||||
//
|
||||
|
||||
/// Wrapper for buildah::images
|
||||
///
|
||||
/// List images in local storage.
|
||||
pub fn images() -> Result<Array, Box<EvalAltResult>> {
|
||||
let images = bah_error_to_rhai_error(buildah::images())?;
|
||||
|
||||
// Convert Vec<Image> to Rhai Array
|
||||
let mut array = Array::new();
|
||||
for image in images {
|
||||
array.push(Dynamic::from(image));
|
||||
}
|
||||
|
||||
Ok(array)
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::image_remove
|
||||
///
|
||||
/// Remove one or more images.
|
||||
pub fn image_remove(image: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::image_remove(image))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::image_push
|
||||
///
|
||||
/// Push an image to a registry.
|
||||
pub fn image_push(image: &str, destination: &str, tls_verify: bool) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::image_push(image, destination, tls_verify))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::image_tag
|
||||
///
|
||||
/// Add an additional name to a local image.
|
||||
pub fn image_tag(image: &str, new_name: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::image_tag(image, new_name))
|
||||
}
|
||||
|
||||
/// Wrapper for buildah::image_pull
|
||||
///
|
||||
/// Pull an image from a registry.
|
||||
pub fn image_pull(image: &str, tls_verify: bool) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(buildah::image_pull(image, tls_verify))
|
||||
}
|
||||
|
||||
/// Commit a container to an image with options specified in a Map
|
||||
///
|
||||
/// This provides a builder-style interface for Rhai scripts.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```rhai
|
||||
/// let options = bah_new_commit_options();
|
||||
/// options.format = "docker";
|
||||
/// options.squash = true;
|
||||
/// options.rm = true;
|
||||
/// let result = bah_image_commit("my-container", "my-image:latest", options);
|
||||
/// ```
|
||||
pub fn image_commit_with_options(container: &str, image_name: &str, options: Map) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
// Extract options from the map
|
||||
let format_option = match options.get("format") {
|
||||
Some(format) => {
|
||||
if format.is_unit() {
|
||||
None
|
||||
} else if let Ok(format_str) = format.clone().into_string() {
|
||||
Some(format_str)
|
||||
} else {
|
||||
return Err(Box::new(EvalAltResult::ErrorRuntime(
|
||||
"format must be a string".into(),
|
||||
rhai::Position::NONE
|
||||
)));
|
||||
}
|
||||
},
|
||||
None => None
|
||||
};
|
||||
|
||||
let squash = match options.get("squash") {
|
||||
Some(squash) => {
|
||||
if let Ok(squash_val) = squash.clone().as_bool() {
|
||||
squash_val
|
||||
} else {
|
||||
return Err(Box::new(EvalAltResult::ErrorRuntime(
|
||||
"squash must be a boolean".into(),
|
||||
rhai::Position::NONE
|
||||
)));
|
||||
}
|
||||
},
|
||||
None => false
|
||||
};
|
||||
|
||||
let rm = match options.get("rm") {
|
||||
Some(rm) => {
|
||||
if let Ok(rm_val) = rm.clone().as_bool() {
|
||||
rm_val
|
||||
} else {
|
||||
return Err(Box::new(EvalAltResult::ErrorRuntime(
|
||||
"rm must be a boolean".into(),
|
||||
rhai::Position::NONE
|
||||
)));
|
||||
}
|
||||
},
|
||||
None => false
|
||||
};
|
||||
|
||||
// Convert String to &str for the function call
|
||||
let format_ref = format_option.as_deref();
|
||||
|
||||
// Call the buildah image_commit function
|
||||
bah_error_to_rhai_error(buildah::image_commit(container, image_name, format_ref, squash, rm))
|
||||
}
|
||||
|
||||
/// Configure a container with options specified in a Map
|
||||
///
|
||||
/// This provides a builder-style interface for Rhai scripts.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```rhai
|
||||
/// let options = bah_new_config_options();
|
||||
/// options.author = "John Doe";
|
||||
/// options.cmd = "echo Hello";
|
||||
/// options.entrypoint = "/bin/sh -c";
|
||||
/// let result = bah_config("my-container", options);
|
||||
/// ```
|
||||
pub fn config_with_options(container: &str, options: Map) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
// Convert Rhai Map to Rust HashMap
|
||||
// Helper function to convert Rhai Map to Rust HashMap
|
||||
fn convert_map_to_hashmap(options: Map) -> Result<HashMap<String, String>, Box<EvalAltResult>> {
|
||||
let mut config_options = HashMap::<String, String>::new();
|
||||
|
||||
for (key, value) in options.iter() {
|
||||
@@ -404,6 +107,96 @@ pub fn config_with_options(container: &str, options: Map) -> Result<CommandResul
|
||||
}
|
||||
}
|
||||
|
||||
// Call the buildah config function
|
||||
bah_error_to_rhai_error(buildah::bah_config(container, config_options))
|
||||
Ok(config_options)
|
||||
}
|
||||
|
||||
/// Create a new Builder
|
||||
pub fn bah_new(name: &str, image: &str) -> Result<Builder, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(Builder::new(name, image))
|
||||
}
|
||||
|
||||
// Builder instance methods
|
||||
pub fn builder_run(builder: &mut Builder, command: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(builder.run(command))
|
||||
}
|
||||
|
||||
pub fn builder_run_with_isolation(builder: &mut Builder, command: &str, isolation: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(builder.run_with_isolation(command, isolation))
|
||||
}
|
||||
|
||||
pub fn builder_copy(builder: &mut Builder, source: &str, dest: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(builder.copy(source, dest))
|
||||
}
|
||||
|
||||
pub fn builder_add(builder: &mut Builder, source: &str, dest: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(builder.add(source, dest))
|
||||
}
|
||||
|
||||
pub fn builder_commit(builder: &mut Builder, image_name: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(builder.commit(image_name))
|
||||
}
|
||||
|
||||
pub fn builder_remove(builder: &mut Builder) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(builder.remove())
|
||||
}
|
||||
|
||||
pub fn builder_config(builder: &mut Builder, options: Map) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
// Convert Rhai Map to Rust HashMap
|
||||
let config_options = convert_map_to_hashmap(options)?;
|
||||
bah_error_to_rhai_error(builder.config(config_options))
|
||||
}
|
||||
|
||||
// Builder static methods
|
||||
pub fn builder_images(_builder: &mut Builder) -> Result<Array, Box<EvalAltResult>> {
|
||||
let images = bah_error_to_rhai_error(Builder::images())?;
|
||||
|
||||
// Convert Vec<Image> to Rhai Array
|
||||
let mut array = Array::new();
|
||||
for image in images {
|
||||
array.push(Dynamic::from(image));
|
||||
}
|
||||
|
||||
Ok(array)
|
||||
}
|
||||
|
||||
pub fn builder_image_remove(_builder: &mut Builder, image: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(Builder::image_remove(image))
|
||||
}
|
||||
|
||||
pub fn builder_image_pull(_builder: &mut Builder, image: &str, tls_verify: bool) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(Builder::image_pull(image, tls_verify))
|
||||
}
|
||||
|
||||
pub fn builder_image_push(_builder: &mut Builder, image: &str, destination: &str, tls_verify: bool) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(Builder::image_push(image, destination, tls_verify))
|
||||
}
|
||||
|
||||
pub fn builder_image_tag(_builder: &mut Builder, image: &str, new_name: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(Builder::image_tag(image, new_name))
|
||||
}
|
||||
|
||||
// Getter functions for Builder properties
|
||||
pub fn get_builder_container_id(builder: &mut Builder) -> String {
|
||||
match builder.container_id() {
|
||||
Some(id) => id.clone(),
|
||||
None => "".to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_builder_name(builder: &mut Builder) -> String {
|
||||
builder.name().to_string()
|
||||
}
|
||||
|
||||
pub fn get_builder_image(builder: &mut Builder) -> String {
|
||||
builder.image().to_string()
|
||||
}
|
||||
|
||||
// Reset function for Builder
|
||||
pub fn builder_reset(builder: &mut Builder) -> Result<(), Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(builder.reset())
|
||||
}
|
||||
|
||||
// Build function for Builder
|
||||
pub fn builder_build(_builder: &mut Builder, tag: &str, context_dir: &str, file: &str, isolation: &str) -> Result<CommandResult, Box<EvalAltResult>> {
|
||||
bah_error_to_rhai_error(Builder::build(Some(tag), context_dir, file, Some(isolation)))
|
||||
}
|
122
src/rhai/git.rs
122
src/rhai/git.rs
@@ -3,7 +3,7 @@
|
||||
//! This module provides Rhai wrappers for the functions in the Git module.
|
||||
|
||||
use rhai::{Engine, EvalAltResult, Array, Dynamic};
|
||||
use crate::git::{self, GitError};
|
||||
use crate::git::{GitTree, GitRepo, GitError};
|
||||
|
||||
/// Register Git module functions with the Rhai engine
|
||||
///
|
||||
@@ -15,15 +15,21 @@ use crate::git::{self, GitError};
|
||||
///
|
||||
/// * `Result<(), Box<EvalAltResult>>` - Ok if registration was successful, Err otherwise
|
||||
pub fn register_git_module(engine: &mut Engine) -> Result<(), Box<EvalAltResult>> {
|
||||
// Register basic git functions
|
||||
engine.register_fn("git_clone", git_clone);
|
||||
engine.register_fn("git_list", git_list);
|
||||
engine.register_fn("git_update", git_update);
|
||||
engine.register_fn("git_update_force", git_update_force);
|
||||
engine.register_fn("git_update_commit", git_update_commit);
|
||||
engine.register_fn("git_update_commit_push", git_update_commit_push);
|
||||
engine.register_fn("git_has_changes", has_git_changes);
|
||||
engine.register_fn("git_find_repos", find_matching_repos);
|
||||
// Register GitTree constructor
|
||||
engine.register_fn("gittree_new", git_tree_new);
|
||||
|
||||
// Register GitTree methods
|
||||
engine.register_fn("list", git_tree_list);
|
||||
engine.register_fn("find", git_tree_find);
|
||||
engine.register_fn("get", git_tree_get);
|
||||
|
||||
// Register GitRepo methods
|
||||
engine.register_fn("path", git_repo_path);
|
||||
engine.register_fn("has_changes", git_repo_has_changes);
|
||||
engine.register_fn("pull", git_repo_pull);
|
||||
engine.register_fn("reset", git_repo_reset);
|
||||
engine.register_fn("commit", git_repo_commit);
|
||||
engine.register_fn("push", git_repo_push);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -39,21 +45,21 @@ fn git_error_to_rhai_error<T>(result: Result<T, GitError>) -> Result<T, Box<Eval
|
||||
}
|
||||
|
||||
//
|
||||
// Git Function Wrappers
|
||||
// GitTree Function Wrappers
|
||||
//
|
||||
|
||||
/// Wrapper for git::git_clone
|
||||
/// Wrapper for GitTree::new
|
||||
///
|
||||
/// Clones a git repository to a standardized location in the user's home directory.
|
||||
pub fn git_clone(url: &str) -> Result<String, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git::git_clone(url))
|
||||
/// Creates a new GitTree with the specified base path.
|
||||
pub fn git_tree_new(base_path: &str) -> Result<GitTree, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(GitTree::new(base_path))
|
||||
}
|
||||
|
||||
/// Wrapper for git::git_list
|
||||
/// Wrapper for GitTree::list
|
||||
///
|
||||
/// Lists all git repositories found in the user's ~/code directory.
|
||||
pub fn git_list() -> Result<Array, Box<EvalAltResult>> {
|
||||
let repos = git_error_to_rhai_error(git::git_list())?;
|
||||
/// Lists all git repositories under the base path.
|
||||
pub fn git_tree_list(git_tree: &mut GitTree) -> Result<Array, Box<EvalAltResult>> {
|
||||
let repos = git_error_to_rhai_error(git_tree.list())?;
|
||||
|
||||
// Convert Vec<String> to Rhai Array
|
||||
let mut array = Array::new();
|
||||
@@ -64,18 +70,11 @@ pub fn git_list() -> Result<Array, Box<EvalAltResult>> {
|
||||
Ok(array)
|
||||
}
|
||||
|
||||
/// Wrapper for git::has_git_changes
|
||||
///
|
||||
/// Checks if a git repository has uncommitted changes.
|
||||
pub fn has_git_changes(repo_path: &str) -> Result<bool, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git::has_git_changes(repo_path))
|
||||
}
|
||||
|
||||
/// Wrapper for git::find_matching_repos
|
||||
/// Wrapper for GitTree::find
|
||||
///
|
||||
/// Finds repositories matching a pattern or partial path.
|
||||
pub fn find_matching_repos(pattern: &str) -> Result<Array, Box<EvalAltResult>> {
|
||||
let repos = git_error_to_rhai_error(git::find_matching_repos(pattern))?;
|
||||
pub fn git_tree_find(git_tree: &mut GitTree, pattern: &str) -> Result<Array, Box<EvalAltResult>> {
|
||||
let repos = git_error_to_rhai_error(git_tree.find(pattern))?;
|
||||
|
||||
// Convert Vec<String> to Rhai Array
|
||||
let mut array = Array::new();
|
||||
@@ -86,30 +85,63 @@ pub fn find_matching_repos(pattern: &str) -> Result<Array, Box<EvalAltResult>> {
|
||||
Ok(array)
|
||||
}
|
||||
|
||||
/// Wrapper for git::git_update
|
||||
/// Wrapper for GitTree::get
|
||||
///
|
||||
/// Updates a git repository by pulling the latest changes.
|
||||
pub fn git_update(repo_path: &str) -> Result<String, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git::git_update(repo_path))
|
||||
/// Gets one or more GitRepo objects based on a path pattern or URL.
|
||||
pub fn git_tree_get(git_tree: &mut GitTree, path_or_url: &str) -> Result<Array, Box<EvalAltResult>> {
|
||||
let repos = git_error_to_rhai_error(git_tree.get(path_or_url))?;
|
||||
|
||||
// Convert Vec<GitRepo> to Rhai Array
|
||||
let mut array = Array::new();
|
||||
for repo in repos {
|
||||
array.push(Dynamic::from(repo));
|
||||
}
|
||||
|
||||
Ok(array)
|
||||
}
|
||||
|
||||
/// Wrapper for git::git_update_force
|
||||
//
|
||||
// GitRepo Function Wrappers
|
||||
//
|
||||
|
||||
/// Wrapper for GitRepo::path
|
||||
///
|
||||
/// Force updates a git repository by discarding local changes and pulling the latest changes.
|
||||
pub fn git_update_force(repo_path: &str) -> Result<String, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git::git_update_force(repo_path))
|
||||
/// Gets the path of the repository.
|
||||
pub fn git_repo_path(git_repo: &mut GitRepo) -> String {
|
||||
git_repo.path().to_string()
|
||||
}
|
||||
|
||||
/// Wrapper for git::git_update_commit
|
||||
/// Wrapper for GitRepo::has_changes
|
||||
///
|
||||
/// Commits changes in a git repository and then updates it by pulling the latest changes.
|
||||
pub fn git_update_commit(repo_path: &str, message: &str) -> Result<String, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git::git_update_commit(repo_path, message))
|
||||
/// Checks if the repository has uncommitted changes.
|
||||
pub fn git_repo_has_changes(git_repo: &mut GitRepo) -> Result<bool, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git_repo.has_changes())
|
||||
}
|
||||
|
||||
/// Wrapper for git::git_update_commit_push
|
||||
/// Wrapper for GitRepo::pull
|
||||
///
|
||||
/// Commits changes in a git repository and pushes them to the remote.
|
||||
pub fn git_update_commit_push(repo_path: &str, message: &str) -> Result<String, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git::git_update_commit_push(repo_path, message))
|
||||
/// Pulls the latest changes from the remote repository.
|
||||
pub fn git_repo_pull(git_repo: &mut GitRepo) -> Result<GitRepo, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git_repo.pull())
|
||||
}
|
||||
|
||||
/// Wrapper for GitRepo::reset
|
||||
///
|
||||
/// Resets any local changes in the repository.
|
||||
pub fn git_repo_reset(git_repo: &mut GitRepo) -> Result<GitRepo, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git_repo.reset())
|
||||
}
|
||||
|
||||
/// Wrapper for GitRepo::commit
|
||||
///
|
||||
/// Commits changes in the repository.
|
||||
pub fn git_repo_commit(git_repo: &mut GitRepo, message: &str) -> Result<GitRepo, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git_repo.commit(message))
|
||||
}
|
||||
|
||||
/// Wrapper for GitRepo::push
|
||||
///
|
||||
/// Pushes changes to the remote repository.
|
||||
pub fn git_repo_push(git_repo: &mut GitRepo) -> Result<GitRepo, Box<EvalAltResult>> {
|
||||
git_error_to_rhai_error(git_repo.push())
|
||||
}
|
@@ -39,25 +39,22 @@ pub use process::{
|
||||
|
||||
// Re-export buildah functions
|
||||
pub use buildah::register_bah_module;
|
||||
pub use buildah::{
|
||||
bah_from, bah_run, bah_run_with_isolation, bah_copy, bah_add, bah_commit,
|
||||
bah_remove, bah_list, bah_build_with_options,
|
||||
new_commit_options, new_config_options, image_commit_with_options, config_with_options
|
||||
};
|
||||
pub use buildah::bah_new;
|
||||
|
||||
// Re-export nerdctl functions
|
||||
pub use nerdctl::register_nerdctl_module;
|
||||
pub use nerdctl::{
|
||||
nerdctl_run, nerdctl_exec,
|
||||
nerdctl_copy, nerdctl_stop, nerdctl_remove, nerdctl_list
|
||||
// Container functions
|
||||
nerdctl_run, nerdctl_run_with_name, nerdctl_run_with_port,
|
||||
nerdctl_exec, nerdctl_copy, nerdctl_stop, nerdctl_remove, nerdctl_list,
|
||||
// Image functions
|
||||
nerdctl_images, nerdctl_image_remove, nerdctl_image_push, nerdctl_image_tag,
|
||||
nerdctl_image_pull, nerdctl_image_commit, nerdctl_image_build
|
||||
};
|
||||
|
||||
// Re-export git functions
|
||||
// Re-export git module
|
||||
pub use git::register_git_module;
|
||||
pub use git::{
|
||||
git_clone, git_list, git_update, git_update_force, git_update_commit,
|
||||
git_update_commit_push, has_git_changes, find_matching_repos
|
||||
};
|
||||
pub use crate::git::{GitTree, GitRepo};
|
||||
|
||||
// Rename copy functions to avoid conflicts
|
||||
pub use os::copy as os_copy;
|
||||
|
@@ -4,38 +4,28 @@
|
||||
import "os" as os;
|
||||
import "process" as process;
|
||||
|
||||
// Test git_clone function
|
||||
fn test_git_clone() {
|
||||
// Use a public repository for testing
|
||||
let repo_url = "https://github.com/rhaiscript/rhai.git";
|
||||
// Test GitTree creation
|
||||
fn test_git_tree_creation() {
|
||||
// Get home directory
|
||||
let home_dir = env("HOME");
|
||||
let code_dir = `${home_dir}/code`;
|
||||
|
||||
// Clone the repository
|
||||
print("Testing git_clone...");
|
||||
let result = git_clone(repo_url);
|
||||
print("Testing GitTree creation...");
|
||||
let git_tree = gittree_new(code_dir);
|
||||
|
||||
// Print the result
|
||||
print(`Clone result: ${result}`);
|
||||
|
||||
// Verify the repository exists
|
||||
if result.contains("already exists") {
|
||||
print("Repository already exists, test passed");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check if the path exists
|
||||
if exist(result) {
|
||||
print("Repository cloned successfully, test passed");
|
||||
return true;
|
||||
}
|
||||
|
||||
print("Repository clone failed");
|
||||
return false;
|
||||
print(`Created GitTree with base path: ${code_dir}`);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Test git_list function
|
||||
fn test_git_list() {
|
||||
print("Testing git_list...");
|
||||
let repos = git_list();
|
||||
// Test GitTree list method
|
||||
fn test_git_tree_list() {
|
||||
// Get home directory
|
||||
let home_dir = env("HOME");
|
||||
let code_dir = `${home_dir}/code`;
|
||||
|
||||
print("Testing GitTree list method...");
|
||||
let git_tree = gittree_new(code_dir);
|
||||
let repos = git_tree.list();
|
||||
|
||||
print(`Found ${repos.len()} repositories`);
|
||||
|
||||
@@ -45,44 +35,32 @@ fn test_git_list() {
|
||||
print(` - ${repos[i]}`);
|
||||
}
|
||||
|
||||
return repos.len() > 0;
|
||||
return repos.len() >= 0; // Success even if no repos found
|
||||
}
|
||||
|
||||
// Test git_has_changes function
|
||||
fn test_git_has_changes() {
|
||||
print("Testing git_has_changes...");
|
||||
// Test GitTree find method
|
||||
fn test_git_tree_find() {
|
||||
// Get home directory
|
||||
let home_dir = env("HOME");
|
||||
let code_dir = `${home_dir}/code`;
|
||||
|
||||
print("Testing GitTree find method...");
|
||||
let git_tree = gittree_new(code_dir);
|
||||
let repos = git_tree.list();
|
||||
|
||||
// Get a repository from the list
|
||||
let repos = git_list();
|
||||
if repos.len() == 0 {
|
||||
print("No repositories found, skipping test");
|
||||
return true;
|
||||
}
|
||||
|
||||
let repo = repos[0];
|
||||
let has_changes = git_has_changes(repo);
|
||||
|
||||
print(`Repository ${repo} has changes: ${has_changes}`);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Test find_matching_repos function
|
||||
fn test_find_matching_repos() {
|
||||
print("Testing find_matching_repos...");
|
||||
|
||||
// Get all repositories with wildcard
|
||||
let all_repos = git_list();
|
||||
if all_repos.len() == 0 {
|
||||
print("No repositories found, skipping test");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Extract a part of the first repo name to search for
|
||||
let repo_name = all_repos[0].split("/").last();
|
||||
let search_pattern = repo_name.substring(0, 3) + "*";
|
||||
let repo_path = repos[0];
|
||||
let parts = repo_path.split("/");
|
||||
let repo_name = parts[parts.len() - 1];
|
||||
let search_pattern = repo_name + "*";
|
||||
|
||||
print(`Searching for repositories matching pattern: ${search_pattern}`);
|
||||
let matching = find_matching_repos(search_pattern);
|
||||
let matching = git_tree.find(search_pattern);
|
||||
|
||||
print(`Found ${matching.len()} matching repositories`);
|
||||
for repo in matching {
|
||||
@@ -92,13 +70,74 @@ fn test_find_matching_repos() {
|
||||
return matching.len() > 0;
|
||||
}
|
||||
|
||||
// Test GitTree get method
|
||||
fn test_git_tree_get() {
|
||||
// Get home directory
|
||||
let home_dir = env("HOME");
|
||||
let code_dir = `${home_dir}/code`;
|
||||
|
||||
print("Testing GitTree get method...");
|
||||
let git_tree = gittree_new(code_dir);
|
||||
let repos = git_tree.list();
|
||||
|
||||
if repos.len() == 0 {
|
||||
print("No repositories found, skipping test");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Extract a part of the first repo name to search for
|
||||
let repo_path = repos[0];
|
||||
let parts = repo_path.split("/");
|
||||
let repo_name = parts[parts.len() - 1];
|
||||
|
||||
print(`Getting GitRepo objects for: ${repo_name}`);
|
||||
let git_repos = git_tree.get(repo_name);
|
||||
|
||||
print(`Found ${git_repos.len()} GitRepo objects`);
|
||||
for repo in git_repos {
|
||||
print(` - ${repo.path()}`);
|
||||
}
|
||||
|
||||
return git_repos.len() > 0;
|
||||
}
|
||||
|
||||
// Test GitRepo has_changes method
|
||||
fn test_git_repo_has_changes() {
|
||||
// Get home directory
|
||||
let home_dir = env("HOME");
|
||||
let code_dir = `${home_dir}/code`;
|
||||
|
||||
print("Testing GitRepo has_changes method...");
|
||||
let git_tree = gittree_new(code_dir);
|
||||
let repos = git_tree.list();
|
||||
|
||||
if repos.len() == 0 {
|
||||
print("No repositories found, skipping test");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Get the first repo
|
||||
let git_repos = git_tree.get(repos[0]);
|
||||
if git_repos.len() == 0 {
|
||||
print("Failed to get GitRepo object, skipping test");
|
||||
return true;
|
||||
}
|
||||
|
||||
let git_repo = git_repos[0];
|
||||
let has_changes = git_repo.has_changes();
|
||||
|
||||
print(`Repository ${git_repo.path()} has changes: ${has_changes}`);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Run the tests
|
||||
fn run_tests() {
|
||||
let tests = [
|
||||
#{ name: "git_clone", fn: test_git_clone },
|
||||
#{ name: "git_list", fn: test_git_list },
|
||||
#{ name: "git_has_changes", fn: test_git_has_changes },
|
||||
#{ name: "find_matching_repos", fn: test_find_matching_repos }
|
||||
#{ name: "git_tree_creation", fn: test_git_tree_creation },
|
||||
#{ name: "git_tree_list", fn: test_git_tree_list },
|
||||
#{ name: "git_tree_find", fn: test_git_tree_find },
|
||||
#{ name: "git_tree_get", fn: test_git_tree_get },
|
||||
#{ name: "git_repo_has_changes", fn: test_git_repo_has_changes }
|
||||
];
|
||||
|
||||
let passed = 0;
|
||||
|
Reference in New Issue
Block a user