diff --git a/Cargo.lock b/Cargo.lock index 5a47d7c..9241ab1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -184,6 +184,28 @@ dependencies = [ "typenum", ] +[[package]] +name = "diff-struct" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79aac083112b31f7cb768b24b893dc0c34c296a4b06b250c407bfd495e42075c" +dependencies = [ + "diff_derive", + "num", + "serde", +] + +[[package]] +name = "diff_derive" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe165e7ead196bbbf44c7ce11a7a21157b5c002ce46d7098ff9c556784a4912d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.9.0" @@ -603,6 +625,7 @@ name = "libips" version = "0.1.2" dependencies = [ "anyhow", + "diff-struct", "maplit 0.1.6", "object", "pest", @@ -694,6 +717,79 @@ dependencies = [ "tempfile", ] +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.15.0" @@ -854,6 +950,14 @@ version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +[[package]] +name = "pkg6" +version = "0.1.0" +dependencies = [ + "diff-struct", + "libips", +] + [[package]] name = "pkg6depotd" version = "0.0.1-placeholder" diff --git a/Cargo.toml b/Cargo.toml index 3c18226..3b668f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ members = [ "userland", "specfile", "ports", + "crates/*", ] resolver = "2" \ No newline at end of file diff --git a/crates/pkg6/Cargo.toml b/crates/pkg6/Cargo.toml new file mode 100644 index 0000000..ac65c2c --- /dev/null +++ b/crates/pkg6/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "pkg6" +version = "0.1.0" +edition = "2021" + +[dependencies] +libips = { version = "0.1.2", path = "../../libips" } +diff-struct = "0.5.3" diff --git a/crates/pkg6/src/main.rs b/crates/pkg6/src/main.rs new file mode 100644 index 0000000..2a778e4 --- /dev/null +++ b/crates/pkg6/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + +} diff --git a/libips/Cargo.toml b/libips/Cargo.toml index f33b045..4e997be 100644 --- a/libips/Cargo.toml +++ b/libips/Cargo.toml @@ -28,3 +28,4 @@ pest_derive = "2.1.0" strum = { version = "0.24.1", features = ["derive"] } serde = { version = "1.0.207", features = ["derive"] } serde_json = "1.0.124" +diff-struct = "0.5.3" diff --git a/libips/src/actions/mod.rs b/libips/src/actions/mod.rs index def438b..3646990 100644 --- a/libips/src/actions/mod.rs +++ b/libips/src/actions/mod.rs @@ -15,6 +15,7 @@ use std::fs::read_to_string; use std::path::Path; use std::result::Result as StdResult; use std::str::FromStr; +use diff::Diff; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -77,7 +78,10 @@ impl FacetedAction for Action { } } -#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Dir { pub path: String, pub group: String, @@ -128,7 +132,10 @@ impl FacetedAction for Dir { } } -#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct File { pub payload: Option, pub path: String, @@ -255,7 +262,10 @@ pub enum FileError { } //TODO implement multiple FMRI for require-any -#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Dependency { pub fmri: String, //TODO make FMRI pub dependency_type: String, //TODO make enum @@ -305,7 +315,10 @@ impl FacetedAction for Dependency { } } -#[derive(Hash, Eq, PartialEq, Debug, Default, Clone, Deserialize, Serialize)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Facet { pub name: String, pub value: String, @@ -320,7 +333,10 @@ impl Facet { } } -#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Attr { pub key: String, pub values: Vec, @@ -357,7 +373,10 @@ impl From for Attr { } } -#[derive(Eq, PartialEq, Debug, Default, Clone, Deserialize, Serialize)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct License { pub payload: String, pub properties: HashMap, @@ -385,7 +404,10 @@ impl From for License { } } -#[derive(Eq, PartialEq, Debug, Default, Clone, Deserialize, Serialize)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Link { pub path: String, pub target: String, @@ -422,13 +444,19 @@ impl From for Link { } } -#[derive(Hash, Eq, PartialEq, Debug, Default, Clone, Deserialize, Serialize)] +#[derive(Hash, Eq, PartialEq, Debug, Default, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Property { pub key: String, pub value: String, } -#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Manifest { pub attributes: Vec, pub directories: Vec, diff --git a/libips/src/digest/mod.rs b/libips/src/digest/mod.rs index f94daf4..402fc93 100644 --- a/libips/src/digest/mod.rs +++ b/libips/src/digest/mod.rs @@ -9,6 +9,8 @@ use sha3::Digest as Sha3Digest; use std::fmt::Display; use std::str::FromStr; use std::{convert::TryInto, result::Result as StdResult}; +use diff::Diff; +use serde::{Deserialize, Serialize}; use strum::{Display as StrumDisplay, EnumString}; use thiserror::Error; @@ -17,7 +19,10 @@ type Result = StdResult; #[allow(dead_code)] static DEFAULT_ALGORITHM: DigestAlgorithm = DigestAlgorithm::SHA512; -#[derive(Debug, PartialEq, Clone, StrumDisplay, EnumString, Default)] +#[derive(Debug, PartialEq, Clone, StrumDisplay, EnumString, Default, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub enum DigestAlgorithm { #[default] #[strum(serialize = "sha1")] @@ -36,7 +41,10 @@ pub enum DigestAlgorithm { SHA3512, // Sha3 version of sha512t } -#[derive(Debug, PartialEq, Clone, StrumDisplay, EnumString, Default)] +#[derive(Debug, PartialEq, Clone, StrumDisplay, EnumString, Default, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub enum DigestSource { #[strum(serialize = "gzip")] GzipCompressed, @@ -52,7 +60,10 @@ pub enum DigestSource { PrimaryPayloadHash, } -#[derive(Debug, Default, PartialEq, Clone)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Digest { pub hash: String, pub algorithm: DigestAlgorithm, diff --git a/libips/src/payload/mod.rs b/libips/src/payload/mod.rs index d690c25..a9ee7a4 100644 --- a/libips/src/payload/mod.rs +++ b/libips/src/payload/mod.rs @@ -8,6 +8,8 @@ use object::Object; use std::io::Error as IOError; use std::path::Path; use std::result::Result as StdResult; +use diff::Diff; +use serde::{Deserialize, Serialize}; use thiserror::Error; type Result = StdResult; @@ -20,14 +22,20 @@ pub enum PayloadError { DigestError(#[from] DigestError), } -#[derive(Debug, PartialEq, Clone, Default)] +#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub enum PayloadCompressionAlgorithm { Gzip, #[default] LZ4, } -#[derive(Debug, PartialEq, Clone, Default)] +#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub enum PayloadBits { #[default] Independent, @@ -35,7 +43,10 @@ pub enum PayloadBits { Bits64, } -#[derive(Debug, PartialEq, Clone, Default)] +#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub enum PayloadArchitecture { #[default] NOARCH, @@ -45,7 +56,10 @@ pub enum PayloadArchitecture { RISCV, } -#[derive(Debug, Default, PartialEq, Clone)] +#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, Diff)] +#[diff(attr( + #[derive(Debug, PartialEq)] +))] pub struct Payload { pub primary_identifier: Digest, pub additional_identifiers: Vec,