[gparted] Replace open coded merge of format into create operation (#755214)



commit 3d21f0f192bd563b376473ba20a988aa36a70e32
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date:   Tue Sep 15 22:10:00 2015 +0100

    Replace open coded merge of format into create operation (#755214)
    
    For the case of formatting a new, not yet created partition,
    activate_format() open coded the merge operation.  This code has existed
    in GParted since before version 0.0.5 and the current code history in
    Git.
    
    Replace the necessary code so that an explicit merge_operations() call
    is used instead; along with the other case of formatting an existing
    partition.
    
    Bug 755214 - Refactor operation merging

 src/OperationCreate.cc |   13 +++++++++++-
 src/Win_GParted.cc     |   51 ++++++++++++++++-------------------------------
 2 files changed, 30 insertions(+), 34 deletions(-)
---
diff --git a/src/OperationCreate.cc b/src/OperationCreate.cc
index 2c3a648..39df030 100644
--- a/src/OperationCreate.cc
+++ b/src/OperationCreate.cc
@@ -94,7 +94,18 @@ void OperationCreate::create_description()
 
 bool OperationCreate::merge_operations( const Operation & candidate )
 {
-       return false;  // Never merge create operations
+       if ( candidate.type                      == OPERATION_FORMAT             &&
+            candidate.partition_original.status == STAT_NEW                     &&
+            partition_new                       == candidate.partition_original    )
+       {
+               // Merge a format operation on a not yet created partition with the
+               // earlier operation which will create it.
+               partition_new = candidate.partition_new;
+               create_description();
+               return true;
+       }
+
+       return false;
 }
 
 } //GParted
diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc
index ee2cb0e..defb782 100644
--- a/src/Win_GParted.cc
+++ b/src/Win_GParted.cc
@@ -2138,46 +2138,31 @@ void Win_GParted::activate_format( GParted::FILESYSTEM new_fs )
        part_temp.name = selected_partition_ptr->name;
        //Leave sector usage figures to new Partition object defaults of
        //  -1, -1, 0 (_used, _unused, _unallocated) representing unknown.
-        
-       part_temp .status = GParted::STAT_FORMATTED ;
        
+       part_temp .status = GParted::STAT_FORMATTED ;
+       // When formatting a partition which already exists on the disk all possible
+       // operations could be pending so only try merging with the previous operation.
+       MergeType mergetype = MERGE_LAST_WITH_PREV;
+
        // If selected partition is NEW we simply remove the NEW operation from the list and
        // add it again with the new file system
        if ( selected_partition_ptr->status == STAT_NEW )
        {
-               //remove operation which creates this partition
-               for ( unsigned int t = 0 ; t < operations .size() ; t++ )
-               {
-                       if ( operations[t]->partition_new == *selected_partition_ptr )
-                       {
-                               remove_operation( t ) ;
-                               
-                               //And insert the new partition at the old position in the operations list
-                               //(NOTE: in this case we set status to STAT_NEW)
-                               part_temp .status = STAT_NEW ;
-                               
-                               Operation * operation = new OperationCreate( devices[current_device],
-                                                                            *selected_partition_ptr,
-                                                                            part_temp );
-                               operation ->icon = render_icon( Gtk::Stock::NEW, Gtk::ICON_SIZE_MENU );
-
-                               Add_Operation( operation, t ) ;
-                                       
-                               break;
-                       }
-               }
+               part_temp.status = STAT_NEW;
+               // On a partition which is pending creation only resize/move and format
+               // operations are possible.  These operations are always mergeable with
+               // the pending operation which will create the partition.  Hence merge
+               // with any earlier operations to achieve this.
+               mergetype = MERGE_LAST_WITH_ANY;
        }
-       else//normal formatting of an existing partition
-       {
-               Operation * operation = new OperationFormat( devices[current_device],
-                                                            *selected_partition_ptr,
-                                                            part_temp );
-               operation ->icon = render_icon( Gtk::Stock::CONVERT, Gtk::ICON_SIZE_MENU );
 
-               Add_Operation( operation ) ;
-               // Try to merge this format operation with the previous operation only.
-               merge_operations( MERGE_LAST_WITH_PREV );
-       }
+       Operation * operation = new OperationFormat( devices[current_device],
+                                                    *selected_partition_ptr,
+                                                    part_temp );
+       operation->icon = render_icon( Gtk::Stock::CONVERT, Gtk::ICON_SIZE_MENU );
+
+       Add_Operation( operation );
+       merge_operations( mergetype );
 
        show_operationslist() ;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]