tensorfs 0.3.7__tar.gz → 0.3.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tensorfs-0.3.7 → tensorfs-0.3.9}/Cargo.lock +2 -2
- {tensorfs-0.3.7 → tensorfs-0.3.9}/Cargo.toml +1 -1
- {tensorfs-0.3.7 → tensorfs-0.3.9}/PKG-INFO +1 -1
- tensorfs-0.3.9/crates/tensorfs-core/src/derived/roots.rs +196 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/derived.rs +357 -26
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/durability.rs +125 -7
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/gc.rs +21 -4
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/journal.rs +33 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/source.rs +112 -16
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/src/store.rs +36 -1
- {tensorfs-0.3.7 → tensorfs-0.3.9}/pyproject.toml +1 -1
- {tensorfs-0.3.7 → tensorfs-0.3.9}/python/tensorfs/_ext.pyi +5 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/Cargo.toml +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/b64.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/canon.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/capability.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/catalog.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/cbor.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/checkpoint.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/corpus.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/dtype.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/err.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/fetch.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/fill.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/fit.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/header.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/home.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ids.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/jcs.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/lib.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/limits.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/machine.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/manifest.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/meta.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/project.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/providers.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/read.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/receipt.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/reclaim.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/registry.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/relation.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/repo_cache.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/repository.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/sha256.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/spec.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/staging.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/storage.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/store.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/api.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/http.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/hub.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/mod.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/policy.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/pull.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/push.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/tests.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/vectors.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fit.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/home.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/liveness.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/reclaim.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/repo_store.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/source_plan.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/staging.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/version.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/write_through.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/Cargo.toml +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/src/docs.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/src/errors.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/src/lib.rs +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/python/tensorfs/__init__.py +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/python/tensorfs/errors.py +0 -0
- {tensorfs-0.3.7 → tensorfs-0.3.9}/python/tensorfs/py.typed +0 -0
|
@@ -392,7 +392,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
|
392
392
|
|
|
393
393
|
[[package]]
|
|
394
394
|
name = "tensorfs-core"
|
|
395
|
-
version = "0.3.
|
|
395
|
+
version = "0.3.9"
|
|
396
396
|
dependencies = [
|
|
397
397
|
"fs2",
|
|
398
398
|
"minicbor",
|
|
@@ -404,7 +404,7 @@ dependencies = [
|
|
|
404
404
|
|
|
405
405
|
[[package]]
|
|
406
406
|
name = "tensorfs-py"
|
|
407
|
-
version = "0.3.
|
|
407
|
+
version = "0.3.9"
|
|
408
408
|
dependencies = [
|
|
409
409
|
"pyo3",
|
|
410
410
|
"tensorfs-core",
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
//! Private derived roots are filesystem facts, just like repository roots. Transaction
|
|
2
|
+
//! metadata journals lifecycle; GC never needs that database to discover retained bytes.
|
|
3
|
+
|
|
4
|
+
use std::fs::{self, File, OpenOptions};
|
|
5
|
+
use std::io::{Read, Write};
|
|
6
|
+
use std::path::PathBuf;
|
|
7
|
+
|
|
8
|
+
use crate::canon::{Fields, Value};
|
|
9
|
+
use crate::err::{refuse, Code, Refusal, Result};
|
|
10
|
+
use crate::ids::{ObjectRef, Plain};
|
|
11
|
+
use crate::store::Store;
|
|
12
|
+
|
|
13
|
+
#[derive(Clone, Debug, PartialEq, Eq)]
|
|
14
|
+
pub(super) struct Root {
|
|
15
|
+
pub transaction: String,
|
|
16
|
+
pub manifest: ObjectRef,
|
|
17
|
+
pub name: Option<String>,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
impl Plain for Root {
|
|
21
|
+
const MAX_BYTES: usize = 16 * 1024;
|
|
22
|
+
fn from_value(value: &Value) -> Result<Self> {
|
|
23
|
+
let mut fields = Fields::new("PrivateDerivedRoot", value)?;
|
|
24
|
+
let transaction = super::transaction_id(fields.req_str("transaction_id")?)?;
|
|
25
|
+
let manifest = ObjectRef::from_value("private root manifest", fields.req("manifest")?)?;
|
|
26
|
+
let name = fields
|
|
27
|
+
.opt("scratch_root_id")
|
|
28
|
+
.map(|value| {
|
|
29
|
+
let name = crate::canon::as_str("PrivateDerivedRoot", "scratch_root_id", value)?;
|
|
30
|
+
super::name("private scratch root", name)?;
|
|
31
|
+
Ok(name.to_string())
|
|
32
|
+
})
|
|
33
|
+
.transpose()?;
|
|
34
|
+
fields.done()?;
|
|
35
|
+
Ok(Self {
|
|
36
|
+
transaction,
|
|
37
|
+
manifest,
|
|
38
|
+
name,
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
fn to_value(&self) -> Value {
|
|
42
|
+
let mut fields = vec![
|
|
43
|
+
("transaction_id", Value::str(self.transaction.clone())),
|
|
44
|
+
("manifest", self.manifest.to_value()),
|
|
45
|
+
];
|
|
46
|
+
if let Some(name) = &self.name {
|
|
47
|
+
fields.push(("scratch_root_id", Value::str(name.clone())));
|
|
48
|
+
}
|
|
49
|
+
Value::obj(fields)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
fn io(error: std::io::Error) -> Refusal {
|
|
54
|
+
Refusal {
|
|
55
|
+
code: Code::IO_FAILED,
|
|
56
|
+
detail: format!("private derived root: {error}"),
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
fn directory(store: &Store) -> PathBuf {
|
|
60
|
+
store.root().join("roots/derived")
|
|
61
|
+
}
|
|
62
|
+
fn path(store: &Store, transaction: &str) -> Result<PathBuf> {
|
|
63
|
+
let transaction = super::transaction_id(transaction)?;
|
|
64
|
+
Ok(directory(store).join(format!(
|
|
65
|
+
"{}.json",
|
|
66
|
+
transaction.trim_start_matches("sha256:")
|
|
67
|
+
)))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
pub(super) fn read(store: &Store, transaction: &str) -> Result<Option<Root>> {
|
|
71
|
+
let path = path(store, transaction)?;
|
|
72
|
+
let file = match File::open(&path) {
|
|
73
|
+
Ok(file) => file,
|
|
74
|
+
Err(error) if error.kind() == std::io::ErrorKind::NotFound => return Ok(None),
|
|
75
|
+
Err(error) => return Err(io(error)),
|
|
76
|
+
};
|
|
77
|
+
let mut bytes = Vec::new();
|
|
78
|
+
file.take(Root::MAX_BYTES as u64 + 1)
|
|
79
|
+
.read_to_end(&mut bytes)
|
|
80
|
+
.map_err(io)?;
|
|
81
|
+
let root = Root::parse(&bytes)?;
|
|
82
|
+
if root.transaction != transaction {
|
|
83
|
+
return refuse(
|
|
84
|
+
Code::CROSS_SUBJECT_REPLAY,
|
|
85
|
+
"private root path names another transaction",
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
Ok(Some(root))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
pub(super) fn all(store: &Store) -> Result<Vec<Root>> {
|
|
92
|
+
let entries = match fs::read_dir(directory(store)) {
|
|
93
|
+
Ok(entries) => entries,
|
|
94
|
+
Err(error) if error.kind() == std::io::ErrorKind::NotFound => return Ok(Vec::new()),
|
|
95
|
+
Err(error) => return Err(io(error)),
|
|
96
|
+
};
|
|
97
|
+
let mut roots = Vec::new();
|
|
98
|
+
for entry in entries {
|
|
99
|
+
let entry = entry.map_err(io)?;
|
|
100
|
+
let name = entry.file_name();
|
|
101
|
+
let name = name.to_string_lossy();
|
|
102
|
+
let Some(hex) = name.strip_suffix(".json") else {
|
|
103
|
+
continue;
|
|
104
|
+
};
|
|
105
|
+
let transaction = format!("sha256:{hex}");
|
|
106
|
+
if let Some(root) = read(store, &transaction)? {
|
|
107
|
+
roots.push(root);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
Ok(roots)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
pub(super) fn write(store: &Store, root: &Root) -> Result<()> {
|
|
114
|
+
let path = path(store, &root.transaction)?;
|
|
115
|
+
fs::create_dir_all(directory(store)).map_err(io)?;
|
|
116
|
+
let temporary = path.with_extension(format!("tmp-{}", crate::meta::now_nanos_unique()));
|
|
117
|
+
let mut file = OpenOptions::new()
|
|
118
|
+
.write(true)
|
|
119
|
+
.create_new(true)
|
|
120
|
+
.open(&temporary)
|
|
121
|
+
.map_err(io)?;
|
|
122
|
+
file.write_all(&root.canonical_bytes())
|
|
123
|
+
.and_then(|()| file.sync_all())
|
|
124
|
+
.map_err(io)?;
|
|
125
|
+
fs::rename(&temporary, &path).map_err(io)?;
|
|
126
|
+
for directory in [
|
|
127
|
+
directory(store),
|
|
128
|
+
store.root().join("roots"),
|
|
129
|
+
store.root().to_path_buf(),
|
|
130
|
+
] {
|
|
131
|
+
File::open(directory)
|
|
132
|
+
.and_then(|file| file.sync_all())
|
|
133
|
+
.map_err(io)?;
|
|
134
|
+
}
|
|
135
|
+
Ok(())
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
pub(super) fn pending(store: &Store, transaction: &str, manifest: &ObjectRef) -> Result<()> {
|
|
139
|
+
if read(store, transaction)?.is_some_and(|root| root.name.is_some()) {
|
|
140
|
+
return refuse(
|
|
141
|
+
Code::DISPOSITION_CONFLICT,
|
|
142
|
+
"a named private root cannot become a pending candidate",
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
write(
|
|
146
|
+
store,
|
|
147
|
+
&Root {
|
|
148
|
+
transaction: transaction.into(),
|
|
149
|
+
manifest: manifest.clone(),
|
|
150
|
+
name: None,
|
|
151
|
+
},
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
pub(super) fn adopt(
|
|
156
|
+
store: &Store,
|
|
157
|
+
transaction: &str,
|
|
158
|
+
manifest: &ObjectRef,
|
|
159
|
+
name: &str,
|
|
160
|
+
) -> Result<()> {
|
|
161
|
+
if let Some(root) = read(store, transaction)? {
|
|
162
|
+
if root.manifest != *manifest || root.name.as_ref().is_some_and(|old| old != name) {
|
|
163
|
+
return refuse(
|
|
164
|
+
Code::DISPOSITION_CONFLICT,
|
|
165
|
+
"private root already binds different output or name",
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if all(store)?
|
|
170
|
+
.iter()
|
|
171
|
+
.any(|root| root.transaction != transaction && root.name.as_deref() == Some(name))
|
|
172
|
+
{
|
|
173
|
+
return refuse(
|
|
174
|
+
Code::DISPOSITION_CONFLICT,
|
|
175
|
+
"private scratch root already names another transaction",
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
write(
|
|
179
|
+
store,
|
|
180
|
+
&Root {
|
|
181
|
+
transaction: transaction.into(),
|
|
182
|
+
manifest: manifest.clone(),
|
|
183
|
+
name: Some(name.into()),
|
|
184
|
+
},
|
|
185
|
+
)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
pub(super) fn remove(store: &Store, transaction: &str) -> Result<()> {
|
|
189
|
+
match fs::remove_file(path(store, transaction)?) {
|
|
190
|
+
Ok(()) => File::open(directory(store))
|
|
191
|
+
.and_then(|file| file.sync_all())
|
|
192
|
+
.map_err(io),
|
|
193
|
+
Err(error) if error.kind() == std::io::ErrorKind::NotFound => Ok(()),
|
|
194
|
+
Err(error) => Err(io(error)),
|
|
195
|
+
}
|
|
196
|
+
}
|