diff --git a/compute_tools/src/extension_server.rs b/compute_tools/src/extension_server.rs index e0d8d67af4..7a5c506b47 100644 --- a/compute_tools/src/extension_server.rs +++ b/compute_tools/src/extension_server.rs @@ -146,6 +146,7 @@ pub async fn download_extension( pgbin: &str, pg_version: &str, ) -> Result<()> { + info!("DOWNLOAD EXTENSION {:?}", ext_name); let ext_name_targz = ext_name.to_owned() + ".tar.gz"; let ext_path = RemotePath::new( &Path::new(pg_version) @@ -171,20 +172,30 @@ pub async fn download_extension( info!("Download {:?} completed successfully", &ext_path); info!("Unzipping extension {:?}", zip_name); - // TODO unzip and place files in appropriate locations + // TODO unzip and place files in appropriate locations using the library suggested by some ppl info!("unzip {zip_name:?}"); - std::process::Command::new("tar").arg("xvzf").arg(zip_name); + std::process::Command::new("tar") + .arg("xzvf") + .arg(zip_name) + .spawn()? + .wait()?; - info!("place extension files in {local_sharedir:?}"); - info!("place library files in {local_libdir:?}"); - let zip_sharedir = format!("extensions/{ext_name}/share"); + let zip_sharedir = format!("extensions/{ext_name}/share/extension"); + info!("mv {zip_sharedir:?}/* {local_sharedir:?}"); + for file in std::fs::read_dir(zip_sharedir)? { + let old_file = file?.path(); + let new_file = + Path::new(&local_sharedir).join(old_file.file_name().expect("error parsing file")); + std::fs::rename(old_file, new_file)?; + } let zip_libdir = format!("extensions/{ext_name}/lib"); - std::process::Command::new("mv") - .arg(local_sharedir) - .arg(zip_sharedir); - std::process::Command::new("mv") - .arg(local_libdir) - .arg(zip_libdir); + info!("mv {zip_libdir:?}/* {local_libdir:?}"); + for file in std::fs::read_dir(zip_libdir)? { + let old_file = file?.path(); + let new_file = + Path::new(&local_libdir).join(old_file.file_name().expect("error parsing file")); + std::fs::rename(old_file, new_file)?; + } Ok(()) } diff --git a/embedding.tar.gz b/embedding.tar.gz index ae8988df2e..4fa980ba13 100644 Binary files a/embedding.tar.gz and b/embedding.tar.gz differ diff --git a/test_runner/regress/data/extension_test/anon.tar.gz b/test_runner/regress/data/extension_test/anon.tar.gz index e1fb35cb52..8c4fc44967 100644 Binary files a/test_runner/regress/data/extension_test/anon.tar.gz and b/test_runner/regress/data/extension_test/anon.tar.gz differ diff --git a/test_runner/regress/data/extension_test/embedding.tar.gz b/test_runner/regress/data/extension_test/embedding.tar.gz index ae8988df2e..4fa980ba13 100644 Binary files a/test_runner/regress/data/extension_test/embedding.tar.gz and b/test_runner/regress/data/extension_test/embedding.tar.gz differ diff --git a/test_runner/regress/test_download_extensions.py b/test_runner/regress/test_download_extensions.py index ff27c5eb9e..91a9fdfdac 100644 --- a/test_runner/regress/test_download_extensions.py +++ b/test_runner/regress/test_download_extensions.py @@ -1,4 +1,3 @@ -import os from contextlib import closing import pytest @@ -93,12 +92,13 @@ def test_remote_extensions( # TODO: this will fail locally because we don't have the required dependencies cur.execute("CREATE EXTENSION anon") cur.execute("SELECT extname FROM pg_extension") - assert "embedding" in [x[0] for x in cur.fetchall()] + assert "anon" in [x[0] for x in cur.fetchall()] - # TODO: should we try libraries too? + # TODO: try to load libraries as well finally: cleanup_files = ["embedding.tar.gz", "anon.tar.gz"] + _cleanup_folders = ["extensions"] # for file in cleanup_files: # os.remove(file) - log.info("For now, please manually cleanup ", cleanup_files) + log.info(f"For now, please manually cleanup {cleanup_files}")