View: move creation of Operation to Transaction

This continues the work to make the `View` types be only about the
state of the current view and not about operations in general (which
has been moved out `OpStore` and qOpHeadsStore`).
This commit is contained in:
Martin von Zweigbergk 2021-03-13 21:23:30 -08:00
parent cf2baf58a7
commit c1de8b0f3a
4 changed files with 25 additions and 24 deletions

View file

@ -25,7 +25,7 @@ use std::path::PathBuf;
use std::sync::Arc;
use crate::repo::RepoLoader;
use crate::store::CommitId;
use crate::store::{CommitId, Timestamp};
use std::collections::HashSet;
use thiserror::Error;
@ -51,7 +51,7 @@ impl OpHeadsStore {
let mut root_view = op_store::View::new(checkout.clone());
root_view.head_ids.insert(checkout);
let root_view_id = op_store.write_view(&root_view).unwrap();
let operation_metadata = OperationMetadata::new("initialize repo".to_string());
let operation_metadata = OperationMetadata::new("initialize repo".to_string(), Timestamp::now());
let init_operation = op_store::Operation {
view_id: root_view_id,
parents: vec![],
@ -216,7 +216,7 @@ fn merge_op_heads(
}
let merged_index = index_store.write_index(index).unwrap();
let merged_view_id = op_store.write_view(&merged_view).unwrap();
let operation_metadata = OperationMetadata::new("resolve concurrent operations".to_string());
let operation_metadata = OperationMetadata::new("resolve concurrent operations".to_string(), Timestamp::now());
let op_parent_ids = op_heads.iter().map(|op| op.id().clone()).collect();
let merge_operation = op_store::Operation {
view_id: merged_view_id,

View file

@ -103,13 +103,13 @@ pub struct OperationMetadata {
}
impl OperationMetadata {
pub fn new(description: String) -> Self {
let timestamp = Timestamp::now();
pub fn new(description: String, start_time: Timestamp) -> Self {
let end_time = Timestamp::now();
let hostname = whoami::hostname();
let username = whoami::username();
OperationMetadata {
start_time: timestamp.clone(),
end_time: timestamp,
start_time,
end_time,
description,
hostname,
username,

View file

@ -25,6 +25,7 @@ use crate::store::{CommitId, Timestamp};
use crate::store_wrapper::StoreWrapper;
use crate::view::MutableView;
use std::sync::Arc;
use crate::op_store::OperationMetadata;
pub struct Transaction<'r> {
repo: Option<Arc<MutableRepo<'r>>>,
@ -132,11 +133,20 @@ impl<'r> Transaction<'r> {
pub fn write(mut self) -> UnpublishedOperation {
let mut_repo = Arc::try_unwrap(self.repo.take().unwrap()).ok().unwrap();
let base_repo = mut_repo.base_repo();
let index_store = base_repo.index_store();
let (mut_index, mut_view) = mut_repo.consume();
let index = index_store.write_index(mut_index).unwrap();
let operation = mut_view.save(self.description.clone(), self.start_time.clone());
index_store
let index = base_repo.index_store().write_index(mut_index).unwrap();
let view_id = base_repo.op_store().write_view(mut_view.store_view()).unwrap();
let operation_metadata = OperationMetadata::new(self.description.clone(),self.start_time.clone());
let store_operation = op_store::Operation {
view_id,
parents: vec![base_repo.view().op_id().clone()],
metadata: operation_metadata,
};
let new_op_id = base_repo.op_store().write_operation(&store_operation).unwrap();
let operation = Operation::new(base_repo.op_store().clone(), new_op_id, store_operation);
base_repo.index_store()
.associate_file_with_operation(&index, operation.id())
.unwrap();
self.closed = true;

View file

@ -18,9 +18,9 @@ use std::sync::Arc;
use crate::commit::Commit;
use crate::op_store;
use crate::op_store::{OpStore, OpStoreResult, OperationId, OperationMetadata};
use crate::op_store::{OpStore, OpStoreResult, OperationId};
use crate::operation::Operation;
use crate::store::{CommitId, Timestamp};
use crate::store::{CommitId};
use crate::store_wrapper::StoreWrapper;
pub enum ViewRef<'a> {
@ -319,16 +319,7 @@ impl MutableView {
enforce_invariants(&self.store, &mut self.data);
}
pub fn save(&self, description: String, operation_start_time: Timestamp) -> Operation {
let view_id = self.op_store.write_view(&self.data).unwrap();
let mut operation_metadata = OperationMetadata::new(description);
operation_metadata.start_time = operation_start_time;
let operation = op_store::Operation {
view_id,
parents: vec![self.base_op_id.clone()],
metadata: operation_metadata,
};
let new_op_id = self.op_store.write_operation(&operation).unwrap();
Operation::new(self.op_store.clone(), new_op_id, operation)
pub fn store_view(&self) -> &op_store::View {
&self.data
}
}