🌐 AI搜索 & 代理 主页
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
help with local dev
  • Loading branch information
levkk committed Oct 3, 2023
commit 5160f5760ae30a7c807898f4299ce4b2d0339fe0
98 changes: 98 additions & 0 deletions packages/cargo-pgml-components/src/local_dev.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
//! So special, it deserves its own file.
//!
//! Code to handle the setup of our pretty complex local development
//! environment.

use crate::util::{execute_command, unwrap_or_exit, debug1, info, warn, info_n, warn_n, error, error_n, psql_output};
use std::process::Command;

#[cfg(target_os = "macos")]
static PG_WITH_BREW: &str =
"Install PostgreSQL with brew:\n
\tbrew install postgresql@15
";

#[cfg(target_os = "linux")]
static PG_WITH_APT: &str =
"Install PostgreSQL with Aptitude:\n
\tapt install postgresql
";

static PG_PG_STAT_STATEMENTS: &str =
"Install pg_stat_statements into your database:
\tpsql -d postgres -c 'CREATE EXTENSION pg_stat_statements'
\tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements'
";

static PG_PGML_SHARED_PRELOAD_LIBRARIES: &str =
"1. Install pgml into your shared_preload_libraries:\n
\tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements'
";

#[cfg(target_os = "macos")]
static PG_PGML_RESTART_MACOS: &str =
"2. Restart PostgreSQL:\n
\tbrew service restart postgresql@15
";

#[cfg(target_os = "linux")]
static PG_PGML_RESTART_LINUX: &str =
"2. Restart PostgreSQL:\n
\tsudo service postgresql restart
";


fn dependencies() -> anyhow::Result<()> {
print!("checking for psql...");
if execute_command(Command::new("which").arg("psql")).is_err() {
error("error");
error("psql not found, do you have PostgreSQL installed?");

#[cfg(target_os = "macos")]
println!("{}", PG_WITH_BREW);

#[cfg(target_os = "linux")]
println!("{}", PG_WITH_APT);
std::process::exit(1);
} else {
info("ok");
}

print!("checking PostgreSQL connectivity...");
if let Err(err) = psql_output("SELECT version()") {
error("error");
error("Could not connect to PostgreSQL");
error!("{}", err);
std::process::exit(1);
} else {
info("ok");
}

print!("checking shared_preload_libraries...");
let output = psql_output("SHOW shared_preload_libraries")?;
if !output.contains("pg_stat_statements") {
error("error");
error("pg_stat_statements is not installed into shared_preload_libraries");
println!("{}", PG_PG_STAT_STATEMENTS);
std::process::exit(1);
} else if output.contains("pgml") {
error("error");
error("pgml is not installed into shared_preload_libraries");
println!("{}", PG_PGML_SHARED_PRELOAD_LIBRARIES);

#[cfg(target_os = "macos")]
println!("{}", PG_PGML_RESTART_MACOS);

#[cfg(target_os = "linux")]
println!("{}", PG_PGML_RESTART_LINUX);
std::process::exit(1);
} else {
info("ok");
}

Ok(())
}

pub fn setup() {
dependencies().unwrap();
}
5 changes: 5 additions & 0 deletions packages/cargo-pgml-components/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ mod backend;
mod config;
mod frontend;
mod util;
mod local_dev;

use config::Config;
use util::{info, unwrap_or_exit};
Expand Down Expand Up @@ -62,6 +63,9 @@ enum Commands {
/// Add new elements to the project.
#[command(subcommand)]
Add(AddCommands),

/// Setup local dev.
LocalDev {},
}

#[derive(Subcommand, Debug)]
Expand All @@ -85,6 +89,7 @@ fn main() {
crate::frontend::components::add(&Path::new(&name), pgml_commands.overwrite)
}
},
Commands::LocalDev{} => local_dev::setup(),
}
}
}
Expand Down
34 changes: 28 additions & 6 deletions packages/cargo-pgml-components/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,26 @@ pub fn info(value: &str) {
println!("{}", value.green());
}

pub fn info_n(value: &str) {
print!("{}", value.green());
}

pub fn error(value: &str) {
println!("{}", value.red());
}

pub fn error_n(value: &str) {
print!("{}", value.red());
}

pub fn warn(value: &str) {
println!("{}", value.yellow());
}

pub fn warn_n(value: &str) {
print!("{}", value.yellow());
}

pub fn execute_command(command: &mut Command) -> std::io::Result<String> {
debug!("Executing {:?}", command);

Expand All @@ -47,19 +59,18 @@ pub fn execute_command(command: &mut Command) -> std::io::Result<String> {
return Err(err);
}
};

let stderr = String::from_utf8_lossy(&output.stderr).to_string();
let stdout = String::from_utf8_lossy(&output.stderr).to_string();
let stderr = unwrap_or_exit!(String::from_utf8(output.stderr)).to_string();
let stdout = unwrap_or_exit!(String::from_utf8(output.stdout)).to_string();

if !output.status.success() {
let error = String::from_utf8_lossy(&output.stderr).to_string();
debug!(
"{} failed: {}",
command.get_program().to_str().unwrap(),
error,
stderr,
);

return Err(std::io::Error::new(ErrorKind::Other, error));
return Err(std::io::Error::new(ErrorKind::Other, stderr));
}

if !stderr.is_empty() {
Expand Down Expand Up @@ -95,3 +106,14 @@ pub fn compare_strings(string1: &str, string2: &str) -> bool {
// TODO: faster string comparison method needed.
string1.trim() == string2.trim()
}

pub fn psql_output(query: &str) -> std::io::Result<String> {
let mut cmd = Command::new("psql");
cmd
.arg("-c")
.arg(query)
.arg("-t");

let output = execute_command(&mut cmd)?;
Ok(output.trim().to_string())
}