Show
Ignore:
Timestamp:
06/25/08 02:04:48 (7 months ago)
Author:
ogawa
Message:

Now properly handle a single backup file.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • mt4-backup/trunk/backup

    r460 r461  
    8686    require File::Spec; 
    8787    use File::Copy; 
     88 
    8889    require MT::BackupRestore; 
    89  
    90     my @files; 
    91     my $filename = File::Spec->catfile( $temp_dir, $file . "-1.xml" ); 
    92     my $fh = gensym(); 
    93     open $fh, ">$filename"; 
    94     push @files, $file . "-1.xml"; 
    95  
    96     my $printer  = sub { my ($data) = @_; print $fh $data; return length($data); }; 
    97     my $splitter = sub { 
    98         my ($findex) = @_; 
    99         print $fh '</movabletype>'; 
    100         close $fh; 
    101         my $filename = 
    102             File::Spec->catfile( $temp_dir, $file . "-$findex.xml" ); 
    103         $fh = gensym(); 
     90    my $count_term = 
     91      $blog_ids && scalar( @$blog_ids ) 
     92      ? { class => '*', blog_id => $blog_ids } 
     93      : { class => '*' }; 
     94    my $num_assets = MT->model('asset')->count($count_term); 
     95    my $printer; 
     96    my $splitter; 
     97    my $finisher; 
     98    my $progress = sub { 
     99        my ($str, $id) = @_; 
     100        print STDERR "$str\n" if $verbose; 
     101    }; 
     102 
     103    if ( !( $size || $num_assets ) ) { 
     104        my $filename = File::Spec->catfile( $temp_dir, $file . ".xml" ); 
     105        my $fh = gensym(); 
    104106        open $fh, ">$filename"; 
    105         push @files, $file . "-$findex.xml"; 
    106         my $header .= 
    107             "<movabletype xmlns='" 
    108             . MT::BackupRestore::NS_MOVABLETYPE() . "'>\n"; 
    109         $header = "<?xml version='1.0' encoding='$enc'?>\n$header" 
    110             if $enc !~ m/utf-?8/i; 
    111         print $fh $header; 
    112     }; 
    113     my $finisher = sub { 
    114         my ($asset_files) = @_; 
    115         close $fh; 
    116         my $filename = File::Spec->catfile( $temp_dir, "$file.manifest" ); 
    117         $fh = gensym(); 
     107 
     108        $printer = 
     109          sub { my ($data) = @_; print $fh $data; return length($data); }; 
     110        $splitter = sub { }; 
     111        $finisher = sub { 
     112            my ($asset_files) = @_; 
     113            close $fh; 
     114            if ($archive) { 
     115                require MT::Util::Archive; 
     116                my $filepath = File::Spec->catfile( $temp_dir, "$file.$archive" ); 
     117                my $arc = MT::Util::Archive->new($archive, $filepath); 
     118                $arc->add_file( $temp_dir, "$file.xml" ); 
     119                $arc->add_string( 
     120                        "<manifest xmlns='" 
     121                      . MT::BackupRestore::NS_MOVABLETYPE() 
     122                      . "'><file type='backup' name='$file.xml' /></manifest>", 
     123                      "$file.manifest"); 
     124                $arc->close; 
     125                unlink $filename; 
     126            } 
     127        }; 
     128    } 
     129    else { 
     130        my @files; 
     131        my $filename = File::Spec->catfile( $temp_dir, $file . "-1.xml" ); 
     132        my $fh = gensym(); 
    118133        open $fh, ">$filename"; 
    119         print $fh "<manifest xmlns='" 
    120             . MT::BackupRestore::NS_MOVABLETYPE() . "'>\n"; 
    121         for my $name (@files) { 
    122             print $fh "<file type='backup' name='$name' />\n"; 
    123             print STDERR "Backup file '$name' is created\n" if $verbose; 
    124         } 
    125         for my $id ( keys %$asset_files ) { 
    126             my $name = $id . '-' . $asset_files->{$id}->[2]; 
    127             my $tmp = File::Spec->catfile( $temp_dir, $name ); 
    128             unless ( copy( $asset_files->{$id}->[1], $tmp ) ) { 
    129                 print STDERR "Copying file " 
    130                     . $asset_files->{$id}->[1] 
    131                     . " to " 
    132                     . $tmp 
    133                     . " failed: " 
    134                     . $! 
    135                     . "\n" 
    136                     if $verbose; 
    137                 next; 
    138             } 
    139             print $fh "<file type='asset' name='" 
    140                 . $asset_files->{$id}->[2] 
    141                 . "' asset_id='" 
    142                 . $id 
    143                 . "' />\n"; 
    144             push @files, $name; 
    145             print STDERR "Asset file '$name' (ID=$id) is created\n" if $verbose; 
    146         } 
    147         print $fh "</manifest>\n"; 
    148         close $fh; 
    149         push @files, "$file.manifest"; 
    150         print STDERR "Manifest file '$file.manfest' is created\n" if $verbose; 
    151  
    152         if ($archive) { 
    153             my ( $fh_arc, $filepath ) = 
    154                 File::Temp::tempfile( $archive . '.XXXXXXXX', DIR => $temp_dir ); 
    155             my ( $vol, $dir, $fname ) = File::Spec->splitpath($filepath); 
    156             require MT::Util::Archive; 
    157             close $fh_arc; 
    158             unlink $filepath; 
    159             my $arc = MT::Util::Archive->new($archive, $filepath); 
    160             for my $f (@files) { 
    161                 $arc->add_file( $temp_dir, $f ); 
    162             } 
    163             $arc->close; 
    164             print STDERR "Archive file '$fname' is created\n" if $verbose; 
    165             # for safery, don't unlink before closing $arc here. 
    166             for my $f (@files) { 
    167                 unlink File::Spec->catfile( $temp_dir, $f ); 
    168                 print STDERR "File '$f' is removed\n" if $verbose; 
    169             } 
    170             my $arc_filepath = File::Spec->catfile( $temp_dir, "$file.$archive" ); 
    171             rename $filepath, $arc_filepath; 
    172             print STDERR "'$fname' is renamed to '$file.$archive'\n" if $verbose; 
    173         } 
    174     }; 
    175     my $progress = sub { }; 
     134        push @files, $file . "-1.xml"; 
     135 
     136        $printer = 
     137          sub { my ($data) = @_; print $fh $data; return length($data); }; 
     138        $splitter = sub { 
     139            my ($findex) = @_; 
     140            print $fh '</movabletype>'; 
     141            close $fh; 
     142            my $filename = 
     143                File::Spec->catfile( $temp_dir, $file . "-$findex.xml" ); 
     144            $fh = gensym(); 
     145            open $fh, ">$filename"; 
     146            push @files, $file . "-$findex.xml"; 
     147            my $header .= 
     148              "<movabletype xmlns='" 
     149              . MT::BackupRestore::NS_MOVABLETYPE() . "'>\n"; 
     150            $header = "<?xml version='1.0' encoding='$enc'?>\n$header" 
     151              if $enc !~ m/utf-?8/i; 
     152            print $fh $header; 
     153        }; 
     154        $finisher = sub { 
     155            my ($asset_files) = @_; 
     156            close $fh; 
     157            my $filename = File::Spec->catfile( $temp_dir, "$file.manifest" ); 
     158            $fh = gensym(); 
     159            open $fh, ">$filename"; 
     160            print $fh "<manifest xmlns='" 
     161              . MT::BackupRestore::NS_MOVABLETYPE() . "'>\n"; 
     162            for my $name (@files) { 
     163                print $fh "<file type='backup' name='$name' />\n"; 
     164            } 
     165            for my $id ( keys %$asset_files ) { 
     166                my $name = $id . '-' . $asset_files->{$id}->[2]; 
     167                my $tmp = File::Spec->catfile( $temp_dir, $name ); 
     168                unless ( copy( $asset_files->{$id}->[1], $tmp ) ) { 
     169                    print STDERR "Copying file " 
     170                        . $asset_files->{$id}->[1] 
     171                        . " to " 
     172                        . $tmp 
     173                        . " failed: " 
     174                        . $! 
     175                        . "\n" 
     176                        if $verbose; 
     177                    next; 
     178                } 
     179                print $fh "<file type='asset' name='" 
     180                  . $asset_files->{$id}->[2] 
     181                  . "' asset_id='" 
     182                  . $id 
     183                  . "' />\n"; 
     184                push @files, $name; 
     185                print STDERR "Asset file '$name' (ID=$id) is created\n" if $verbose; 
     186            } 
     187            print $fh "</manifest>\n"; 
     188            close $fh; 
     189            push @files, "$file.manifest"; 
     190            print STDERR "Manifest file '$file.manfest' is created\n" if $verbose; 
     191 
     192            if ($archive) { 
     193                my $filepath = File::Spec->catfile( $temp_dir, "$file.$archive" ); 
     194                require MT::Util::Archive; 
     195                my $arc = MT::Util::Archive->new($archive, $filepath); 
     196                for my $f (@files) { 
     197                    $arc->add_file( $temp_dir, $f ); 
     198                } 
     199                $arc->close; 
     200                print STDERR "Archive file '$file.$archive' is created\n" if $verbose; 
     201                # for safery, don't unlink before closing $arc here. 
     202                for my $f (@files) { 
     203                    unlink File::Spec->catfile( $temp_dir, $f ); 
     204                    print STDERR "File '$f' is removed\n" if $verbose; 
     205                } 
     206            } 
     207        }; 
     208    } 
    176209 
    177210    my @tsnow    = gmtime(time);