^) restructured resize_move() to be more robust. This will hopefully
* happy 24th birthday Johannes! :^) * include/GParted_Core.h, src/GParted_Core.cc: restructured resize_move() to be more robust. This will hopefully tackle a couple of issues which came up during the public testing.
This commit is contained in:
parent
38847349a8
commit
d23ca9d8ea
10
ChangeLog
10
ChangeLog
|
@ -1,4 +1,12 @@
|
||||||
2006-08-24 Bart Hakvoort <hakvoort@cvs.gnome.org>
|
2006-08-27 Bart Hakvoort <hakvoort@cvs.gnome.org>
|
||||||
|
|
||||||
|
* happy 24th birthday Johannes! :^)
|
||||||
|
* include/GParted_Core.h,
|
||||||
|
src/GParted_Core.cc: restructured resize_move() to be more robust.
|
||||||
|
This will hopefully tackle a couple of issues which came up during
|
||||||
|
the public testing.
|
||||||
|
|
||||||
|
2006-08-25 Bart Hakvoort <hakvoort@cvs.gnome.org>
|
||||||
|
|
||||||
* include/GParted_Core.h,
|
* include/GParted_Core.h,
|
||||||
src/GParted_Core.cc: improvements to probe and copy stuff.
|
src/GParted_Core.cc: improvements to probe and copy stuff.
|
||||||
|
|
|
@ -151,8 +151,7 @@ private:
|
||||||
Glib::ustring & error_message ) ;
|
Glib::ustring & error_message ) ;
|
||||||
bool calculate_exact_geom( const Partition & partition_old,
|
bool calculate_exact_geom( const Partition & partition_old,
|
||||||
Partition & partition_new,
|
Partition & partition_new,
|
||||||
OperationDetail & operationdetail,
|
OperationDetail & operationdetail ) ;
|
||||||
Sector min_size = -1 ) ;
|
|
||||||
bool set_proper_filesystem( const FILESYSTEM & filesystem ) ;
|
bool set_proper_filesystem( const FILESYSTEM & filesystem ) ;
|
||||||
bool wait_for_node( const Glib::ustring & node ) ;
|
bool wait_for_node( const Glib::ustring & node ) ;
|
||||||
bool erase_filesystem_signatures( const Partition & partition ) ;
|
bool erase_filesystem_signatures( const Partition & partition ) ;
|
||||||
|
|
|
@ -1074,40 +1074,37 @@ bool GParted_Core::resize_move( const Device & device,
|
||||||
Partition & partition_new,
|
Partition & partition_new,
|
||||||
OperationDetail & operationdetail )
|
OperationDetail & operationdetail )
|
||||||
{
|
{
|
||||||
if ( calculate_exact_geom( partition_old, partition_new, operationdetail ) )
|
if ( partition_new .strict || calculate_exact_geom( partition_old, partition_new, operationdetail ) )
|
||||||
{
|
{
|
||||||
//extended is a special case..
|
if ( partition_old .type == TYPE_EXTENDED )
|
||||||
if ( partition_old .type == GParted::TYPE_EXTENDED )
|
|
||||||
return resize_move_partition( partition_old, partition_new, operationdetail ) ;
|
return resize_move_partition( partition_old, partition_new, operationdetail ) ;
|
||||||
|
|
||||||
//see if we need move or resize..
|
|
||||||
if ( partition_new .sector_start == partition_old .sector_start )
|
if ( partition_new .sector_start == partition_old .sector_start )
|
||||||
return resize( partition_old, partition_new, operationdetail ) ;
|
return resize( partition_old, partition_new, operationdetail ) ;
|
||||||
else if ( partition_new .get_length() > partition_old .get_length() )
|
|
||||||
|
if ( partition_new .get_length() == partition_old .get_length() )
|
||||||
|
return move( device, partition_old, partition_new, operationdetail ) ;
|
||||||
|
|
||||||
|
Partition temp ;
|
||||||
|
if ( partition_new .get_length() > partition_old .get_length() )
|
||||||
{
|
{
|
||||||
//first move, then grow...
|
//first move, then grow. Since old.length < new.length and new.start is valid, temp is valid.
|
||||||
Partition temp = partition_new ;
|
temp = partition_new ;
|
||||||
temp .sector_end = temp .sector_start + partition_old .get_length() -1 ;
|
temp .sector_end = temp .sector_start + partition_old .get_length() -1 ;
|
||||||
|
|
||||||
return calculate_exact_geom( partition_old, temp, operationdetail, temp .get_length() ) &&
|
|
||||||
move( device, partition_old, temp, operationdetail ) &&
|
|
||||||
resize( temp, partition_new, operationdetail ) ;
|
|
||||||
}
|
}
|
||||||
else if ( partition_new .get_length() < partition_old .get_length() )
|
|
||||||
|
if ( partition_new .get_length() < partition_old .get_length() )
|
||||||
{
|
{
|
||||||
//first shrink, then move..
|
//first shrink, then move. Since new.length < old.length and old.start is valid, temp is valid.
|
||||||
Partition temp = partition_old ;
|
temp = partition_old ;
|
||||||
temp .sector_end = partition_old .sector_start + partition_new .get_length() -1 ;
|
temp .sector_end = partition_old .sector_start + partition_new .get_length() -1 ;
|
||||||
|
|
||||||
return calculate_exact_geom( partition_old, temp, operationdetail ) &&
|
|
||||||
resize( partition_old, temp, operationdetail ) &&
|
|
||||||
calculate_exact_geom( temp, partition_new, operationdetail, temp .get_length() ) &&
|
|
||||||
move( device, temp, partition_new, operationdetail ) ;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return calculate_exact_geom(
|
temp .strict = true ;
|
||||||
partition_old, partition_new, operationdetail, partition_old .get_length() ) &&
|
bool succes = resize_move( device, partition_old, temp, operationdetail ) ;
|
||||||
move( device, partition_old, partition_new, operationdetail ) ;
|
temp .strict = false ;
|
||||||
|
|
||||||
|
return succes && resize_move( device, temp, partition_new, operationdetail ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false ;
|
return false ;
|
||||||
|
@ -1118,6 +1115,14 @@ bool GParted_Core::move( const Device & device,
|
||||||
const Partition & partition_new,
|
const Partition & partition_new,
|
||||||
OperationDetail & operationdetail )
|
OperationDetail & operationdetail )
|
||||||
{
|
{
|
||||||
|
if ( partition_old .get_length() != partition_new .get_length() )
|
||||||
|
{
|
||||||
|
operationdetail .add_child( OperationDetail(
|
||||||
|
_("moving requires old and new length to be the same"), STATUS_ERROR, FONT_ITALIC ) ) ;
|
||||||
|
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
return check_repair_filesystem( partition_old, operationdetail ) &&
|
return check_repair_filesystem( partition_old, operationdetail ) &&
|
||||||
move_filesystem( partition_old, partition_new, operationdetail ) &&
|
move_filesystem( partition_old, partition_new, operationdetail ) &&
|
||||||
resize_move_partition( partition_old, partition_new, operationdetail ) &&
|
resize_move_partition( partition_old, partition_new, operationdetail ) &&
|
||||||
|
@ -1230,6 +1235,14 @@ bool GParted_Core::resize( const Partition & partition_old,
|
||||||
const Partition & partition_new,
|
const Partition & partition_new,
|
||||||
OperationDetail & operationdetail )
|
OperationDetail & operationdetail )
|
||||||
{
|
{
|
||||||
|
if ( partition_old .sector_start != partition_new .sector_start )
|
||||||
|
{
|
||||||
|
operationdetail .add_child( OperationDetail(
|
||||||
|
_("resizing requires old and new start to be the same"), STATUS_ERROR, FONT_ITALIC ) ) ;
|
||||||
|
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
bool succes = false ;
|
bool succes = false ;
|
||||||
if ( check_repair_filesystem( partition_new, operationdetail ) )
|
if ( check_repair_filesystem( partition_new, operationdetail ) )
|
||||||
{
|
{
|
||||||
|
@ -1401,7 +1414,7 @@ bool GParted_Core::resize_move_partition( const Partition & partition_old,
|
||||||
FONT_ITALIC ) ) ;
|
FONT_ITALIC ) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
operationdetail .get_last_child() .set_status( return_value ? STATUS_SUCCES : STATUS_ERROR ) ;
|
operationdetail .get_last_child() .set_status( return_value ? STATUS_SUCCES : STATUS_ERROR ) ;
|
||||||
|
|
||||||
return return_value ;
|
return return_value ;
|
||||||
}
|
}
|
||||||
|
@ -1454,7 +1467,7 @@ bool GParted_Core::resize_filesystem( const Partition & partition_old,
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
|
operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
|
||||||
return succes ;
|
return succes ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1519,7 +1532,7 @@ bool GParted_Core::copy( const Partition & partition_src,
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
|
operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
|
||||||
|
|
||||||
return ( succes &&
|
return ( succes &&
|
||||||
check_repair_filesystem( partition_dest, operationdetail ) &&
|
check_repair_filesystem( partition_dest, operationdetail ) &&
|
||||||
|
@ -1864,16 +1877,11 @@ bool GParted_Core::copy_block( PedDevice * lp_device_src,
|
||||||
|
|
||||||
bool GParted_Core::calculate_exact_geom( const Partition & partition_old,
|
bool GParted_Core::calculate_exact_geom( const Partition & partition_old,
|
||||||
Partition & partition_new,
|
Partition & partition_new,
|
||||||
OperationDetail & operationdetail,
|
OperationDetail & operationdetail )
|
||||||
Sector min_size )
|
|
||||||
{
|
{
|
||||||
operationdetail .add_child( OperationDetail(
|
operationdetail .add_child( OperationDetail(
|
||||||
String::ucompose( _("calculate new size and position of %1"), partition_new .get_path() ) ) ) ;
|
String::ucompose( _("calculate new size and position of %1"), partition_new .get_path() ) ) ) ;
|
||||||
|
|
||||||
if ( min_size >= 0 )
|
|
||||||
operationdetail .get_last_child() .add_child(
|
|
||||||
OperationDetail( String::ucompose( _("minimum size: %1"), min_size ), STATUS_NONE ) ) ;
|
|
||||||
|
|
||||||
operationdetail .get_last_child() .add_child(
|
operationdetail .get_last_child() .add_child(
|
||||||
OperationDetail(
|
OperationDetail(
|
||||||
String::ucompose( _("requested start: %1"), partition_new .sector_start ) + "\n" +
|
String::ucompose( _("requested start: %1"), partition_new .sector_start ) + "\n" +
|
||||||
|
@ -1901,9 +1909,6 @@ bool GParted_Core::calculate_exact_geom( const Partition & partition_old,
|
||||||
|
|
||||||
if ( constraint )
|
if ( constraint )
|
||||||
{
|
{
|
||||||
if ( min_size >= 0 )
|
|
||||||
constraint ->min_size = min_size ;
|
|
||||||
|
|
||||||
//FIXME: if we insert a weird partitionnew geom here (e.g. start > end)
|
//FIXME: if we insert a weird partitionnew geom here (e.g. start > end)
|
||||||
//ped_disk_set_partition_geom() will still return true (althoug an lp exception is written
|
//ped_disk_set_partition_geom() will still return true (althoug an lp exception is written
|
||||||
//to stdout.. see if this also affect create_partition and resize_move_partition
|
//to stdout.. see if this also affect create_partition and resize_move_partition
|
||||||
|
|
Loading…
Reference in New Issue