| 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(); |
| 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 | } |