This repository has been archived by the owner on Jul 7, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCOPersistentRootController.m
104 lines (83 loc) · 2.88 KB
/
COPersistentRootController.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#import "COPersistentRootController.h"
#import <EtoileFoundation/Macros.h>
#import "COObjectGraphContext.h"
#import "COSQLiteStore.h"
@implementation COPersistentRootController
- (id) initWithStore: (COSQLiteStore *)aStore
persistentRootUUID: (ETUUID *)aUUID
{
SUPERINIT;
ASSIGN(store_, aStore);
ASSIGN(savedState_, [store_ persistentRootWithUUID: aUUID]);
editingContext_ = [[COObjectGraphContext alloc] init];
[self discardChanges];
return self;
}
- (ETUUID *) UUID
{
return [savedState_ UUID];
}
- (ETUUID *) editingBranchUUID
{
return [savedState_ currentBranchUUID];
}
/**
* Commits on change
*/
- (void) setEditingBranchUUID: (ETUUID*)aBranch
{
assert([store_ setCurrentBranch: aBranch
forPersistentRoot: [savedState_ UUID]]);
ASSIGN(savedState_, [store_ persistentRootWithUUID: [self UUID]]);
}
// commits immediately. discards any uncommitted edits.
// moves the current state pointer of the branch.
- (void) resetToRevisionID: (CORevisionID *)aState
{
BOOL ok = [store_ setCurrentRevision: aState
headRevision: nil
tailRevision: nil
forBranch: [savedState_ currentBranchUUID]
ofPersistentRoot: [savedState_ UUID]];
assert(ok);
ASSIGN(savedState_, [store_ persistentRootWithUUID: [self UUID]]);
[self discardChanges];
}
- (void) resetToRevisionIDNoCommit: (CORevisionID *)aState
{
CORevisionID *revid = [[savedState_ currentBranchInfo] currentRevisionID];
COItemGraph *tree = [store_ contentsForRevisionID: revid];
[editingContext_ setItemTree: tree];
}
/** @taskunit manipulation */
- (BOOL) commitChangesWithMetadata: (NSDictionary *)metadata
{
CORevisionID *revId = [store_ writeContents: editingContext_
withMetadata: metadata
parentRevisionID: [[savedState_ currentBranchInfo] currentRevisionID]
modifiedItems: [[editingContext_ insertedOrModifiedObjectUUIDs] allObjects]];
[editingContext_ clearChangeTracking];
BOOL ok = [store_ setCurrentRevision: revId
headRevision: revId
tailRevision: nil
forBranch: [savedState_ currentBranchUUID]
ofPersistentRoot: [savedState_ UUID]];
assert(ok);
ASSIGN(savedState_, [store_ persistentRootWithUUID: [self UUID]]);
return YES;
}
- (void) discardChanges
{
CORevisionID *revid = [[savedState_ currentBranchInfo] currentRevisionID];
[self resetToRevisionIDNoCommit: revid];
}
- (BOOL) hasChanges
{
return [[editingContext_ insertedObjectUUIDs] count] > 0
|| [[editingContext_ modifiedObjectUUIDs] count] > 0;
}
- (COObjectGraphContext *) editingContext
{
return editingContext_;
}
@end