feat(package): early work in package resolvers
This commit is contained in:
parent
03f09e4de8
commit
e95fb441bd
14
Cargo.lock
generated
14
Cargo.lock
generated
|
@ -531,6 +531,7 @@ dependencies = [
|
||||||
"espanso-match",
|
"espanso-match",
|
||||||
"espanso-migrate",
|
"espanso-migrate",
|
||||||
"espanso-modulo",
|
"espanso-modulo",
|
||||||
|
"espanso-package",
|
||||||
"espanso-path",
|
"espanso-path",
|
||||||
"espanso-render",
|
"espanso-render",
|
||||||
"espanso-ui",
|
"espanso-ui",
|
||||||
|
@ -741,6 +742,19 @@ dependencies = [
|
||||||
"zip",
|
"zip",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "espanso-package"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
|
"log",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"serde_yaml",
|
||||||
|
"tempdir",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "espanso-path"
|
name = "espanso-path"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
|
@ -17,4 +17,5 @@ members = [
|
||||||
"espanso-mac-utils",
|
"espanso-mac-utils",
|
||||||
"espanso-kvs",
|
"espanso-kvs",
|
||||||
"espanso-engine",
|
"espanso-engine",
|
||||||
|
"espanso-package",
|
||||||
]
|
]
|
14
espanso-package/Cargo.toml
Normal file
14
espanso-package/Cargo.toml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[package]
|
||||||
|
name = "espanso-package"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Federico Terzi <federico-terzi@users.noreply.github.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
log = "0.4.14"
|
||||||
|
anyhow = "1.0.38"
|
||||||
|
thiserror = "1.0.23"
|
||||||
|
serde = { version = "1.0.123", features = ["derive"] }
|
||||||
|
serde_json = "1.0.62"
|
||||||
|
serde_yaml = "0.8.17"
|
||||||
|
tempdir = "0.3.7"
|
61
espanso-package/src/lib.rs
Normal file
61
espanso-package/src/lib.rs
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* This file is part of espanso.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2021 Federico Terzi
|
||||||
|
*
|
||||||
|
* espanso is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* espanso is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
mod resolver;
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct PackageSpecifier {
|
||||||
|
pub name: String,
|
||||||
|
pub version: Option<String>,
|
||||||
|
|
||||||
|
// Source information
|
||||||
|
pub git_repo_url: Option<String>,
|
||||||
|
pub git_branch: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Package {
|
||||||
|
// Metadata
|
||||||
|
fn name(&self) -> &str;
|
||||||
|
fn title(&self) -> &str;
|
||||||
|
fn description(&self) -> &str;
|
||||||
|
fn version(&self) -> &str;
|
||||||
|
fn author(&self) -> &str;
|
||||||
|
|
||||||
|
// Directory containing the package files
|
||||||
|
fn location(&self) -> &Path;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait PackageResolver {
|
||||||
|
fn download(&self, package: &PackageSpecifier) -> Result<Box<dyn Package>>;
|
||||||
|
// TODO: fn check update available?
|
||||||
|
// TODO: fn update
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: the git resolver should delete the .git directory
|
||||||
|
|
||||||
|
#[derive(Error, Debug)]
|
||||||
|
pub enum PackageResolutionError {
|
||||||
|
#[error("package not found")]
|
||||||
|
PackageNotFound,
|
||||||
|
}
|
78
espanso-package/src/resolver/git.rs
Normal file
78
espanso-package/src/resolver/git.rs
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* This file is part of espanso.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2021 Federico Terzi
|
||||||
|
*
|
||||||
|
* espanso is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* espanso is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use crate::{Package, PackageResolver, PackageSpecifier};
|
||||||
|
use anyhow::{bail, Result, Context};
|
||||||
|
use std::{path::Path, process::Command};
|
||||||
|
|
||||||
|
pub struct GitPackageResolver {}
|
||||||
|
|
||||||
|
impl GitPackageResolver {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_git_installed() -> bool {
|
||||||
|
if let Ok(output) = Command::new("git").arg("--version").output() {
|
||||||
|
if output.status.success() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clone_repo(dest_dir: &Path, repo_url: &str, repo_branch: Option<&str>) -> Result<()> {
|
||||||
|
let mut args = Vec::new();
|
||||||
|
|
||||||
|
args.push("clone");
|
||||||
|
|
||||||
|
if let Some(branch) = repo_branch {
|
||||||
|
args.push("-b");
|
||||||
|
args.push(branch);
|
||||||
|
}
|
||||||
|
|
||||||
|
args.push(repo_url);
|
||||||
|
|
||||||
|
let dest_dir_str = dest_dir.to_string_lossy().to_string();
|
||||||
|
args.push(&dest_dir_str);
|
||||||
|
|
||||||
|
let output = Command::new("git").args(&args).output().context("git command reported error")?;
|
||||||
|
|
||||||
|
if !output.status.success() {
|
||||||
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||||
|
bail!("git command exited with non-zero status: {}", stderr);
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PackageResolver for GitPackageResolver {
|
||||||
|
fn download(&self, package: &PackageSpecifier) -> Result<Box<dyn Package>> {
|
||||||
|
if !Self::is_git_installed() {
|
||||||
|
bail!("unable to invoke 'git' command, please make sure it is installed and visible in PATH");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: download repository in temp directory
|
||||||
|
// TODO: read metadata
|
||||||
|
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
20
espanso-package/src/resolver/mod.rs
Normal file
20
espanso-package/src/resolver/mod.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* This file is part of espanso.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2021 Federico Terzi
|
||||||
|
*
|
||||||
|
* espanso is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* espanso is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pub(crate) mod git;
|
Loading…
Reference in New Issue
Block a user