Merge branch 'odin' of git.hitchhiker-linux.org:jeang3nie/hpk-package into odin
This commit is contained in:
commit
e6f392bd7a
@ -5,13 +5,20 @@ use {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
/// Specifies a dependency requirement
|
||||||
pub struct Dependency {
|
pub struct Dependency {
|
||||||
|
/// The name of the dependency. All packages must have a unique name.
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
/// The version requirements for this dependency. If the low
|
||||||
|
/// version is `Some`, then the version must be equal to or
|
||||||
|
/// greater than this version. If the high version is `Some`,
|
||||||
|
/// then the version must be less than this version.
|
||||||
pub version: (Option<Version>, Option<Version>),
|
pub version: (Option<Version>, Option<Version>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Dependency {
|
impl Dependency {
|
||||||
#[allow(clippy::must_use_candidate)]
|
#[allow(clippy::must_use_candidate)]
|
||||||
|
/// Checks whether a package satisfies a given dependency
|
||||||
pub fn satisfied(&self, package: &Package) -> bool {
|
pub fn satisfied(&self, package: &Package) -> bool {
|
||||||
if self.name.as_str() == package.name.as_str() {
|
if self.name.as_str() == package.name.as_str() {
|
||||||
match &self.version {
|
match &self.version {
|
||||||
|
@ -45,10 +45,6 @@ pub struct Package {
|
|||||||
pub description: String,
|
pub description: String,
|
||||||
/// a more verbose description of the package
|
/// a more verbose description of the package
|
||||||
pub long_description: String,
|
pub long_description: String,
|
||||||
/// an optional link to an
|
|
||||||
/// [AppStream](https://www.freedesktop.org/wiki/Distributions/AppStream/)
|
|
||||||
/// metadata file
|
|
||||||
pub appstream_data: Option<String>,
|
|
||||||
/// a listing of all files, directories and symlinks which are a part of
|
/// a listing of all files, directories and symlinks which are a part of
|
||||||
/// this package
|
/// this package
|
||||||
pub plist: Plist,
|
pub plist: Plist,
|
||||||
@ -72,7 +68,6 @@ impl From<Specs> for Package {
|
|||||||
release: value.release,
|
release: value.release,
|
||||||
description: value.description,
|
description: value.description,
|
||||||
long_description: value.long_description,
|
long_description: value.long_description,
|
||||||
appstream_data: value.appstream_data,
|
|
||||||
dependencies: value.dependencies,
|
dependencies: value.dependencies,
|
||||||
users: value.users,
|
users: value.users,
|
||||||
groups: value.groups,
|
groups: value.groups,
|
||||||
|
@ -16,10 +16,6 @@ pub struct Specs {
|
|||||||
pub description: String,
|
pub description: String,
|
||||||
/// a more verbose description of the package
|
/// a more verbose description of the package
|
||||||
pub long_description: String,
|
pub long_description: String,
|
||||||
/// an optional link to an
|
|
||||||
/// [AppStream](https://www.freedesktop.org/wiki/Distributions/AppStream/)
|
|
||||||
/// metadata file
|
|
||||||
pub appstream_data: Option<String>,
|
|
||||||
/// all of this package's runtime dependencies
|
/// all of this package's runtime dependencies
|
||||||
pub dependencies: Vec<Dependency>,
|
pub dependencies: Vec<Dependency>,
|
||||||
/// an optional list of users to be created upon installation
|
/// an optional list of users to be created upon installation
|
||||||
|
@ -4,7 +4,7 @@ use std::{
|
|||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
};
|
};
|
||||||
|
|
||||||
use rayon::prelude::{IntoParallelRefIterator, ParallelIterator};
|
use rayon::prelude::{IntoParallelRefIterator, ParallelIterator, IndexedParallelIterator};
|
||||||
|
|
||||||
mod error;
|
mod error;
|
||||||
mod header;
|
mod header;
|
||||||
@ -143,7 +143,7 @@ impl Archive {
|
|||||||
pub fn remove(&mut self, filename: &str) -> Result<bool, Error> {
|
pub fn remove(&mut self, filename: &str) -> Result<bool, Error> {
|
||||||
let mut name = [0u8; 100];
|
let mut name = [0u8; 100];
|
||||||
name[..filename.len()].copy_from_slice(filename.as_bytes());
|
name[..filename.len()].copy_from_slice(filename.as_bytes());
|
||||||
if let Some(i) = &self.nodes.iter().position(|x| x.header.fname == name) {
|
if let Some(i) = &self.nodes.par_iter().position_any(|x| x.header.fname == name) {
|
||||||
self.nodes.remove(*i);
|
self.nodes.remove(*i);
|
||||||
return Ok(true);
|
return Ok(true);
|
||||||
}
|
}
|
||||||
@ -166,6 +166,17 @@ impl Archive {
|
|||||||
x.header.file_path() == Ok(PathBuf::from(filename))
|
x.header.file_path() == Ok(PathBuf::from(filename))
|
||||||
}).cloned()
|
}).cloned()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn pop(&mut self, filename: &str) -> Option<Node> {
|
||||||
|
if let Some(i) = self.nodes.par_iter().position_any(|x| {
|
||||||
|
x.header.file_path() == Ok(PathBuf::from(filename))
|
||||||
|
}) {
|
||||||
|
let node = self.nodes.get(i).cloned();
|
||||||
|
self.nodes.remove(i);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -6,6 +6,7 @@ use {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
|
||||||
|
/// Represents a Git revision
|
||||||
pub struct GitRev {
|
pub struct GitRev {
|
||||||
/// the short revision hash
|
/// the short revision hash
|
||||||
pub hash: String,
|
pub hash: String,
|
||||||
@ -77,3 +78,24 @@ impl TryFrom<Version> for GitRev {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use std::{thread, time::Duration};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ord() {
|
||||||
|
let a = GitRev {
|
||||||
|
hash: "aaab".to_string(),
|
||||||
|
datetime: Utc::now(),
|
||||||
|
};
|
||||||
|
thread::sleep(Duration::from_millis(10));
|
||||||
|
let b = GitRev {
|
||||||
|
hash: "aaaa".to_string(),
|
||||||
|
datetime: Utc::now(),
|
||||||
|
};
|
||||||
|
assert!(a < b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -9,11 +9,25 @@ mod semver;
|
|||||||
|
|
||||||
pub use {gitrev::GitRev, rapid::Rapid, semver::SemVer};
|
pub use {gitrev::GitRev, rapid::Rapid, semver::SemVer};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
|
/// An enum representing the most common versioning schemes.
|
||||||
|
/// Each scheme must implement Eq and Ord with itself, and
|
||||||
|
/// may optionally implement PartialEq and PartialOrd with
|
||||||
|
/// other schemes. Number, Rapid, and SemVer do this, while
|
||||||
|
/// Git can only compare with itself.
|
||||||
pub enum Version {
|
pub enum Version {
|
||||||
|
/// A single replease number, as in Firefox 102
|
||||||
Number(u32),
|
Number(u32),
|
||||||
|
/// Rapid versioning consists of two numbers separated by
|
||||||
|
/// a dot (.) character, and is used notably by Gnome
|
||||||
Rapid(Rapid),
|
Rapid(Rapid),
|
||||||
|
/// SemVer is the most common versioning scheme and consists
|
||||||
|
/// of three dot (.) separated numbers. The numbers are major,
|
||||||
|
/// minor, and patch respctively.
|
||||||
SemVer(SemVer),
|
SemVer(SemVer),
|
||||||
|
/// A git revision. Use of this scheme is to be avoided in
|
||||||
|
/// official packaging as it cannot be readily compared with
|
||||||
|
/// other versioning schemes for dependency resolution.
|
||||||
Git(GitRev),
|
Git(GitRev),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,6 +95,25 @@ impl PartialOrd for Version {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for Version {
|
||||||
|
#[allow(clippy::many_single_char_names)]
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
match (self, other) {
|
||||||
|
(Self::Number(s), Self::Number(o)) => s.eq(o),
|
||||||
|
(Self::Number(s), Self::Rapid(o)) => s.eq(o),
|
||||||
|
(Self::Number(s), Self::SemVer(o)) => s.eq(o),
|
||||||
|
(Self::Rapid(s), Self::Number(o)) => s.eq(o),
|
||||||
|
(Self::Rapid(s), Self::Rapid(o)) => s.eq(o),
|
||||||
|
(Self::Rapid(s), Self::SemVer(o)) => s.eq(o),
|
||||||
|
(Self::SemVer(s), Self::Number(o)) => s.eq(o),
|
||||||
|
(Self::SemVer(s), Self::Rapid(o)) => s.eq(o),
|
||||||
|
(Self::SemVer(s), Self::SemVer(o)) => s.eq(o),
|
||||||
|
(Self::Git(s), Self::Git(o)) => s.eq(o),
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ParseVersionError;
|
pub struct ParseVersionError;
|
||||||
|
|
||||||
@ -127,4 +160,18 @@ mod test {
|
|||||||
let rpd = "1.42".parse::<Rapid>().unwrap();
|
let rpd = "1.42".parse::<Rapid>().unwrap();
|
||||||
assert!(sem == rpd);
|
assert!(sem == rpd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cmp_semver_num_gt() {
|
||||||
|
let sem = Version::SemVer("42.69.0".parse().unwrap());
|
||||||
|
let num = Version::Number(42);
|
||||||
|
assert!(sem > num);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cmp_semver_num_eq() {
|
||||||
|
let sem = Version::SemVer("42.0.0".parse().unwrap());
|
||||||
|
let num = Version::Number(42);
|
||||||
|
assert_eq!(sem, num);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,4 +188,18 @@ mod test {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cmp_semver_num_gt() {
|
||||||
|
let sem = "42.69.0".parse::<SemVer>().unwrap();
|
||||||
|
let num = 42;
|
||||||
|
assert!(sem > num);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cmp_semver_num_eq() {
|
||||||
|
let sem = "42.0.0".parse::<SemVer>().unwrap();
|
||||||
|
let num = 42;
|
||||||
|
assert_eq!(sem, num);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
BIN
test/2.tar
BIN
test/2.tar
Binary file not shown.
Loading…
Reference in New Issue
Block a user