Author: ericwa
Date: Thu Mar 27 20:30:21 2014
New Revision: 10655

URL: http://svn.gna.org/viewcvs/etoile?rev=10655&view=rev
Log:
Revert 'COUndoTrack: migrate -undoNode:,-redoNode: to use the new 
-addToStoreTransaction: method in COCommandGroup instead of -applyToContext:, 
and remove -applyToContext: because it is no longer used. This eliminates two 
parallel implementations of the complex logic in 
COCommandSetCurrentVersionForBranch.'. See comment inserted in -[TestUndo 
testSelectiveUndoOfCommands2]

Modified:
    trunk/Etoile/Frameworks/CoreObject/Tests/Undo/TestUndo.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.h
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeleteBranch.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeletePersistentRoot.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.h
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetBranchMetadata.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentBranch.m
    
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentVersionForBranch.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetPersistentRootMetadata.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeleteBranch.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeletePersistentRoot.m
    trunk/Etoile/Frameworks/CoreObject/Undo/COUndoTrack.m

Modified: trunk/Etoile/Frameworks/CoreObject/Tests/Undo/TestUndo.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Tests/Undo/TestUndo.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Tests/Undo/TestUndo.m    (original)
+++ trunk/Etoile/Frameworks/CoreObject/Tests/Undo/TestUndo.m    Thu Mar 27 
20:30:21 2014
@@ -651,7 +651,12 @@
        [self checkCommandIsEndOfTrack: _testTrack.nodes[0]];
        [self checkCommand: _testTrack.nodes[1] isSetVersionFrom: r0 to: r1];
        [self checkCommand: _testTrack.nodes[2] isSetVersionFrom: r1 to: r2];
-       [self checkCommand: _testTrack.nodes[3] isSetVersionFrom: r1 to: r0];
+       
+       // This is the undo track node generated by undoNode:.
+       // We've switched back and forth between recording the command as 
r2->r3 and
+       // r1->r0. Recording it as r2->r3 is safer because if the selective 
undo has
+       // undesirable results, you can undo it and be guarantee to be returned 
to r2.
+       [self checkCommand: _testTrack.nodes[3] isSetVersionFrom: r2 to: r3];
        
        // Check that the commit created by COUndoTrack has proper commit 
metadata
        // FIXME: This next line tests the undo track node metadata, not the 
revision metadata.

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.h
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.h?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.h (original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.h Thu Mar 27 20:30:21 2014
@@ -92,6 +92,11 @@
 - (BOOL) canApplyToContext: (COEditingContext *)aContext;
 /**
  * <override-subclass />
+ * Applies the receiver changes to the editing context.
+ */
+- (void) applyToContext: (COEditingContext *)aContext;
+/**
+ * <override-subclass />
  * Applies the receiver changes directly to a store transaction.
  */
 - (void) addToStoreTransaction: (COStoreTransaction *)txn

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.m (original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommand.m Thu Mar 27 20:30:21 2014
@@ -118,6 +118,11 @@
     return NO;
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+    [NSException raise: NSInvalidArgumentException format: @"override"];
+}
+
 - (void) addToStoreTransaction: (COStoreTransaction *)txn 
withRevisionMetadata: (NSDictionary *)metadata assumingEditingContextState: 
(COEditingContext *)ctx
 {
     [NSException raise: NSInvalidArgumentException format: @"override"];

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeleteBranch.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeleteBranch.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeleteBranch.m     
(original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeleteBranch.m     Thu Mar 
27 20:30:21 2014
@@ -54,6 +54,17 @@
        [txn deleteBranch: _branchUUID ofPersistentRoot: _persistentRootUUID];
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+
+    COPersistentRoot *proot = [aContext persistentRootForUUID: 
_persistentRootUUID];
+    COBranch *branch = [proot branchForUUID: _branchUUID];
+       ETAssert(branch != nil);
+
+    [branch setDeleted: YES];
+}
+
 - (NSString *)kind
 {
        return _(@"Branch Deletion");

Modified: 
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeletePersistentRoot.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeletePersistentRoot.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeletePersistentRoot.m     
(original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommandDeletePersistentRoot.m     
Thu Mar 27 20:30:21 2014
@@ -82,6 +82,12 @@
        [txn deletePersistentRoot: _persistentRootUUID];
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+    [[aContext persistentRootForUUID: _persistentRootUUID] setDeleted: YES];
+}
+
 - (NSString *)kind
 {
        return _(@"Persistent Root Deletion");

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.h
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.h?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.h    (original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.h    Thu Mar 27 
20:30:21 2014
@@ -119,6 +119,10 @@
  */
 - (BOOL) canApplyToContext: (COEditingContext *)aContext;
 /**
+ * Applies the receiver changes to the editing context.
+ */
+- (void) applyToContext: (COEditingContext *)aContext;
+/**
  * Applies the receiver changes directly to a store transaction.
  */
 - (void) addToStoreTransaction: (COStoreTransaction *)txn

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.m    (original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommandGroup.m    Thu Mar 27 
20:30:21 2014
@@ -162,6 +162,16 @@
     return YES;
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+
+    for (COCommand *command in _contents)
+    {
+        [command applyToContext: aContext];
+    }
+}
+
 - (void) addToStoreTransaction: (COStoreTransaction *)txn 
withRevisionMetadata: (NSDictionary *)metadata assumingEditingContextState: 
(COEditingContext *)ctx
 {
        NILARG_EXCEPTION_TEST(ctx);

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetBranchMetadata.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetBranchMetadata.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetBranchMetadata.m        
(original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetBranchMetadata.m        
Thu Mar 27 20:30:21 2014
@@ -69,6 +69,17 @@
        [txn setMetadata: _newMetadata forBranch: _branchUUID ofPersistentRoot: 
_persistentRootUUID];
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+
+    COPersistentRoot *proot = [aContext persistentRootForUUID: 
_persistentRootUUID];
+    COBranch *branch = [proot branchForUUID: _branchUUID];
+       ETAssert(branch != nil);
+
+    [branch setMetadata: _newMetadata];
+}
+
 - (NSString *)kind
 {
        return _(@"Branch Metadata Update");

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentBranch.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentBranch.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentBranch.m 
(original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentBranch.m Thu Mar 
27 20:30:21 2014
@@ -59,6 +59,17 @@
        [txn setCurrentBranch: _newBranchUUID forPersistentRoot: 
_persistentRootUUID];
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+       
+    COPersistentRoot *proot = [aContext persistentRootForUUID: 
_persistentRootUUID];
+    COBranch *branch = [proot branchForUUID: _newBranchUUID];
+    ETAssert(branch != nil);
+       
+    [proot setCurrentBranch: branch];
+}
+
 - (NSString *)kind
 {
        return _(@"Branch Switch");

Modified: 
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentVersionForBranch.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentVersionForBranch.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- 
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentVersionForBranch.m   
    (original)
+++ 
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetCurrentVersionForBranch.m   
    Thu Mar 27 20:30:21 2014
@@ -128,6 +128,61 @@
 //    }
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+
+    COPersistentRoot *proot = [aContext persistentRootForUUID: 
_persistentRootUUID];
+    COBranch *branch = [proot branchForUUID: _branchUUID];
+       ETAssert(branch != nil);
+
+    if ([[[branch currentRevision] UUID] isEqual: _oldRevisionUUID]
+               && branch.supportsRevert)
+    {
+        [branch setCurrentRevision:
+            [aContext revisionForRevisionUUID: _newRevisionUUID 
persistentRootUUID: _persistentRootUUID]];
+       
+               if (![aContext isRevision: _newHeadRevisionUUID
+               equalToOrParentOfRevision: _oldHeadRevisionUUID
+                                  persistentRoot: _persistentRootUUID])
+               {
+                       [branch setHeadRevision:
+                               [aContext revisionForRevisionUUID: 
_newHeadRevisionUUID persistentRootUUID: _persistentRootUUID]];
+               }
+    }
+    else
+    {
+               _currentRevisionBeforeSelectiveApply = [[branch 
currentRevision] UUID];
+               
+        CODiffManager *merged = [self 
diffToSelectivelyApplyToBranchCurrentRevision: 
_currentRevisionBeforeSelectiveApply
+                                                                               
                                         assumingEditingContext: aContext];
+        COItemGraph *oldGraph = [[proot store] itemGraphForRevisionUUID: 
_oldRevisionUUID persistentRoot: _persistentRootUUID];
+        
+        id<COItemGraph> result = [[COItemGraph alloc] initWithItemGraph: 
oldGraph];
+               [merged applyTo: result];
+        
+        // FIXME: Works, but an ugly API mismatch when setting object graph 
context contents
+        NSMutableArray *items = [NSMutableArray array];
+        for (ETUUID *uuid in [result itemUUIDs])
+        {
+                       COItem *replacementItem = [result itemForUUID: uuid];
+                       COItem *existingItem = [[branch objectGraphContext] 
itemForUUID: uuid];
+                       if (existingItem == nil
+                               || ![existingItem isEqual: replacementItem])
+                       {
+                               [items addObject: replacementItem];
+                       }
+        }
+        
+               // FIXME: Handle cross-persistent root relationship constraint 
violations,
+               // if we introduce those
+        [[branch objectGraphContext] insertOrUpdateItems: items];
+               
+               // N.B. newHeadRevisionID is intentionally ignored here, it 
only applies
+               // if we were able to do a non-selective undo.
+    }
+}
+
 + (ETUUID *) currentRevisionUUIDForBranch: (COBranch *)branch 
withChangesInStoreTransaction: (COStoreTransaction *)txn
 {
        NILARG_EXCEPTION_TEST(branch);

Modified: 
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetPersistentRootMetadata.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetPersistentRootMetadata.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- 
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetPersistentRootMetadata.m    
    (original)
+++ 
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandSetPersistentRootMetadata.m    
    Thu Mar 27 20:30:21 2014
@@ -64,6 +64,16 @@
        [txn setMetadata: _newMetadata forPersistentRoot: _persistentRootUUID];
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+       
+    COPersistentRoot *proot = [aContext persistentRootForUUID: 
_persistentRootUUID];
+       ETAssert(proot != nil);
+       
+    [proot setMetadata: _newMetadata];
+}
+
 - (NSString *)kind
 {
        return _(@"Persistent Root Metadata Update");

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeleteBranch.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeleteBranch.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeleteBranch.m   
(original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeleteBranch.m   Thu Mar 
27 20:30:21 2014
@@ -54,6 +54,17 @@
        [txn undeleteBranch: _branchUUID ofPersistentRoot: _persistentRootUUID];
 }
 
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+
+    COPersistentRoot *proot = [aContext persistentRootForUUID: 
_persistentRootUUID];
+    COBranch *branch = [proot branchForUUID: _branchUUID];
+       ETAssert(branch != nil);
+    
+    [branch setDeleted: NO];
+}
+
 - (NSString *)kind
 {
        return _(@"Branch Undeletion");

Modified: 
trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeletePersistentRoot.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeletePersistentRoot.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeletePersistentRoot.m   
(original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COCommandUndeletePersistentRoot.m   
Thu Mar 27 20:30:21 2014
@@ -35,6 +35,12 @@
         return NO;
     }
     return YES;
+}
+
+- (void) applyToContext: (COEditingContext *)aContext
+{
+       NILARG_EXCEPTION_TEST(aContext);
+    [[aContext persistentRootForUUID: _persistentRootUUID] setDeleted: NO];
 }
 
 - (void) addToStoreTransaction: (COStoreTransaction *)txn 
withRevisionMetadata: (NSDictionary *)metadata assumingEditingContextState: 
(COEditingContext *)ctx

Modified: trunk/Etoile/Frameworks/CoreObject/Undo/COUndoTrack.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Undo/COUndoTrack.m?rev=10655&r1=10654&r2=10655&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Undo/COUndoTrack.m       (original)
+++ trunk/Etoile/Frameworks/CoreObject/Undo/COUndoTrack.m       Thu Mar 27 
20:30:21 2014
@@ -276,27 +276,23 @@
        COUndoTrack *track = [COUndoTrack trackForName: ((COCommandGroup 
*)aNode).trackName withEditingContext: _editingContext];
        ETAssert(track != nil);
        
-       COCommandGroup *command = [(COCommandGroup *)aNode inverse];
+       COCommand *command = [(COCommand *)aNode inverse];
+       [command applyToContext: _editingContext];
        
        NSString *commitShortDescription = [aNode localizedShortDescription];
        if (commitShortDescription == nil)
                commitShortDescription = @"";
        
-       NSMutableDictionary *md = [@{kCOCommitMetadataIdentifier : 
@"org.etoile.CoreObject.selective-undo",
-                                                                
kCOCommitMetadataShortDescriptionArguments : @[commitShortDescription]} 
mutableCopy];
-               
+       NSMutableDictionary *md = [@{kCOCommitMetadataShortDescriptionArguments 
: @[commitShortDescription]} mutableCopy];
        if (self.customRevisionMetadata != nil)
        {
                [md addEntriesFromDictionary: self.customRevisionMetadata];
        }
        
-       command.metadata = md;
-       
-       COStoreTransaction *txn = [[COStoreTransaction alloc] init];
-       [command addToStoreTransaction: txn withRevisionMetadata: md 
assumingEditingContextState: _editingContext];
-       [self commitStoreTransaction: txn];
-       
-       [self recordCommand: command];
+       [_editingContext commitWithIdentifier: 
@"org.etoile.CoreObject.selective-undo"
+                                                                metadata: md
+                                                               undoTrack: track
+                                                                       error: 
NULL];
 }
 
 - (void)redoNode: (id <COTrackNode>)aNode
@@ -304,27 +300,23 @@
        COUndoTrack *track = [COUndoTrack trackForName: ((COCommandGroup 
*)aNode).trackName withEditingContext: _editingContext];
        ETAssert(track != nil);
        
-       COCommandGroup *command = [(COCommandGroup *)aNode copy];
+       COCommand *command = (COCommand *)aNode;
+       [command applyToContext: _editingContext];
        
        NSString *commitShortDescription = [aNode localizedShortDescription];
        if (commitShortDescription == nil)
                commitShortDescription = @"";
        
-       NSMutableDictionary *md = [@{kCOCommitMetadataIdentifier : 
@"org.etoile.CoreObject.selective-redo",
-                                                                
kCOCommitMetadataShortDescriptionArguments : @[commitShortDescription]} 
mutableCopy];
-       
+       NSMutableDictionary *md = [@{kCOCommitMetadataShortDescriptionArguments 
: @[commitShortDescription]} mutableCopy];
        if (self.customRevisionMetadata != nil)
        {
                [md addEntriesFromDictionary: self.customRevisionMetadata];
        }
-
-       command.metadata = md;
-       
-       COStoreTransaction *txn = [[COStoreTransaction alloc] init];
-       [command addToStoreTransaction: txn withRevisionMetadata: md 
assumingEditingContextState: _editingContext];
-       [self commitStoreTransaction: txn];
-       
-       [self recordCommand: command];
+       
+       [_editingContext commitWithIdentifier: 
@"org.etoile.CoreObject.selective-redo"
+                                                                metadata: md
+                                                               undoTrack: track
+                                                                       error: 
NULL];
 }
 
 #pragma mark - COUndoTrack - Other Public Methods


_______________________________________________
Etoile-cvs mailing list
Etoile-cvs@gna.org
https://mail.gna.org/listinfo/etoile-cvs

Reply via email to