mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-06 21:12:55 +00:00
Fix pg_config version parsing (#5200)
## Problem Fix pg_config version parsing ## Summary of changes Use regex to capture major version of postgres #5146
This commit is contained in:
@@ -74,6 +74,7 @@ More specifically, here is an example ext_index.json
|
|||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use anyhow::{self, Result};
|
use anyhow::{self, Result};
|
||||||
use compute_api::spec::RemoteExtSpec;
|
use compute_api::spec::RemoteExtSpec;
|
||||||
|
use regex::Regex;
|
||||||
use remote_storage::*;
|
use remote_storage::*;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
@@ -108,14 +109,58 @@ pub fn get_pg_version(pgbin: &str) -> String {
|
|||||||
// pg_config --version returns a (platform specific) human readable string
|
// pg_config --version returns a (platform specific) human readable string
|
||||||
// such as "PostgreSQL 15.4". We parse this to v14/v15
|
// such as "PostgreSQL 15.4". We parse this to v14/v15
|
||||||
let human_version = get_pg_config("--version", pgbin);
|
let human_version = get_pg_config("--version", pgbin);
|
||||||
if human_version.contains("15") {
|
return parse_pg_version(&human_version).to_string();
|
||||||
return "v15".to_string();
|
}
|
||||||
} else if human_version.contains("14") {
|
|
||||||
return "v14".to_string();
|
fn parse_pg_version(human_version: &str) -> &str {
|
||||||
|
match Regex::new(r"(?<major>\d+)\.(?<minor>\d+)")
|
||||||
|
.unwrap()
|
||||||
|
.captures(human_version)
|
||||||
|
{
|
||||||
|
Some(captures) if captures.len() == 3 => match &captures["major"] {
|
||||||
|
"14" => return "v14",
|
||||||
|
"15" => return "v15",
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
panic!("Unsuported postgres version {human_version}");
|
panic!("Unsuported postgres version {human_version}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::parse_pg_version;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_pg_version() {
|
||||||
|
assert_eq!(parse_pg_version("PostgreSQL 15.4"), "v15");
|
||||||
|
assert_eq!(parse_pg_version("PostgreSQL 15.14"), "v15");
|
||||||
|
assert_eq!(
|
||||||
|
parse_pg_version("PostgreSQL 15.4 (Ubuntu 15.4-0ubuntu0.23.04.1)"),
|
||||||
|
"v15"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(parse_pg_version("PostgreSQL 14.15"), "v14");
|
||||||
|
assert_eq!(parse_pg_version("PostgreSQL 14.0"), "v14");
|
||||||
|
assert_eq!(
|
||||||
|
parse_pg_version("PostgreSQL 14.9 (Debian 14.9-1.pgdg120+1"),
|
||||||
|
"v14"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_parse_pg_unsupported_version() {
|
||||||
|
parse_pg_version("PostgreSQL 13.14");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_parse_pg_incorrect_version_format() {
|
||||||
|
parse_pg_version("PostgreSQL 14");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// download the archive for a given extension,
|
// download the archive for a given extension,
|
||||||
// unzip it, and place files in the appropriate locations (share/lib)
|
// unzip it, and place files in the appropriate locations (share/lib)
|
||||||
pub async fn download_extension(
|
pub async fn download_extension(
|
||||||
|
|||||||
Reference in New Issue
Block a user