Skip to content

Commit c9455db

Browse files
committed
feat(cb) - preserve index content if no partial diff
1 parent f6d8650 commit c9455db

File tree

7 files changed

+52
-15
lines changed

7 files changed

+52
-15
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

chumbucket/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "chumbucket"
3-
version = "0.2.0"
3+
version = "0.3.0"
44
description = "Chums through manifest, include, and index files"
55
authors = ["rumblefrog <contact@rumblefrog>"]
66
edition = "2018"

chumbucket/src/commands/index.rs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,24 @@ use anyhow::Result;
33
use clap::ArgMatches;
44
use schema::{
55
bundle::Bundle,
6-
index::{Index, Indices},
6+
index::{Index, IndexMap},
77
};
88

99
pub async fn index_command(matches: &ArgMatches) -> Result<()> {
1010
let dir = std::fs::read_dir(matches.value_of("directory").unwrap())?;
1111

1212
let fs_out = matches.value_of("output").unwrap();
1313

14+
let mut index_map = IndexMap::new();
15+
16+
if matches.is_present("index") {
17+
let index_io = std::fs::read(matches.value_of("index").unwrap())?;
18+
19+
let parsed_indices: IndexMap = serde_json::from_slice(&index_io)?;
20+
21+
index_map = parsed_indices;
22+
}
23+
1424
let entries = dir
1525
.filter(|i| i.is_ok())
1626
.map(|i| i.unwrap())
@@ -19,20 +29,38 @@ pub async fn index_command(matches: &ArgMatches) -> Result<()> {
1929
.map(|i| i.path())
2030
.collect::<Vec<_>>();
2131

22-
let mut indices = Indices::new();
32+
let mut diffs = 0u64;
2333

2434
for entry in &entries {
2535
let content = std::fs::read(entry)?;
2636

2737
let bundle: Bundle = serde_json::from_slice(&content)?;
2838

29-
indices.push(Index {
30-
meta: bundle.meta,
31-
source: bundle.source,
32-
});
39+
match index_map.get(&bundle.meta.name) {
40+
Some(v) => {
41+
if v.meta != bundle.meta || v.source != bundle.source {
42+
diffs += 1;
43+
44+
index_map.insert(bundle.meta.name.clone(), Index {
45+
meta: bundle.meta,
46+
source: bundle.source,
47+
});
48+
}
49+
}
50+
None => {
51+
diffs += 1;
52+
53+
index_map.insert(bundle.meta.name.clone(), Index {
54+
meta: bundle.meta,
55+
source: bundle.source,
56+
});
57+
}
58+
}
3359
}
3460

35-
write_to_disk(fs_out, indices)?;
61+
if diffs > 0 {
62+
write_to_disk(fs_out, index_map)?;
63+
}
3664

3765
Ok(())
3866
}

chumbucket/src/main.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ async fn main() -> Result<()> {
2323
.takes_value(true)
2424
.required(true)
2525
)
26+
.arg(
27+
Arg::new("index")
28+
.about("Existing index file for partial check")
29+
.short('i')
30+
.takes_value(true)
31+
.required(false)
32+
)
2633
.arg(
2734
Arg::new("directory")
2835
.about("Bundle directory")

libschema/src/index.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
use serde::Serialize;
1+
use std::collections::HashMap;
2+
3+
use serde::{Deserialize, Serialize};
24

35
use super::meta::Meta;
46
use super::manifest::Source;
57

6-
pub type Indices = Vec<Index>;
8+
pub type IndexMap = HashMap<String, Index>;
79

8-
#[derive(Serialize)]
10+
#[derive(Deserialize, Serialize, PartialEq)]
911
pub struct Index {
1012
/// Meta descriptor of manifest content
1113
pub meta: Meta,

libschema/src/manifest.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub struct Manifest {
1111
pub source: Source,
1212
}
1313

14-
#[derive(Deserialize, Serialize)]
14+
#[derive(Deserialize, Serialize, PartialEq)]
1515
#[serde(rename_all = "lowercase")]
1616
pub enum SourceType {
1717
/// Git SSH URL schema
@@ -23,7 +23,7 @@ pub enum SourceType {
2323
Direct,
2424
}
2525

26-
#[derive(Deserialize, Serialize)]
26+
#[derive(Deserialize, Serialize, PartialEq)]
2727
pub struct Source {
2828
/// Type of source or method of access
2929
pub r#type: SourceType,

libschema/src/meta.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use serde::{Deserialize, Serialize};
22

3-
#[derive(Deserialize, Serialize, Debug)]
3+
#[derive(Deserialize, Serialize, PartialEq, Debug)]
44
pub struct Meta {
55
/// Name of this manifest/bundle
66
pub name: String,

0 commit comments

Comments
 (0)