Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/class-tiny-compress.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public function get_status() {
/**
* Compresses a single file
*
* @param [type] $file
* @param string $file path to file
* @param array $resize_opts
* @param array $preserve_opts
* @param array{ string } conversion options
Expand Down
41 changes: 39 additions & 2 deletions src/class-tiny-image.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,9 @@ public function compress() {
if ( ! $size->is_duplicate() ) {
$size->add_tiny_meta_start();
$this->update_tiny_post_meta();
$resize = $this->settings->get_resize_options( $size_name );
$preserve = $this->settings->get_preserve_options( $size_name );
$backup_created = $this->create_backup( $size_name, $size->filename );
$resize = $this->settings->get_resize_options( $size_name );
$preserve = $this->settings->get_preserve_options( $size_name );
Tiny_Logger::debug(
'compress size',
array(
Expand All @@ -238,6 +239,7 @@ public function compress() {
'has_been_compressed' => $size->has_been_compressed(),
'filesize' => $size->filesize(),
'mimetype' => $size->mimetype(),
'backup' => $backup_created,
)
);
try {
Expand Down Expand Up @@ -605,4 +607,39 @@ public function mark_as_compressed() {

$this->update_tiny_post_meta();
}

/**
* creates a backup of the image as <originalfile>.bak.<extension>
*
* @param string $size_name name of the size
* @param string $filepath path to file that needs backup
* @return bool true when backup is created
*/
private function create_backup( $size_name, $filepath ) {
if ( ! $this->needs_backup( $size_name ) ) {
return false;
}

$fileinfo = pathinfo( $filepath );
$backup_file = sprintf(
'%s%s.bak.%s',
trailingslashit( $fileinfo['dirname'] ),
$fileinfo['filename'],
$fileinfo['extension']
);

return copy( $filepath, $backup_file );
}

/**
* @param string $size_name name of the size
* @return bool true when backup needs to be created
*/
private function needs_backup( $size_name ) {
if ( ! self::is_original( $size_name ) ) {
return false;
}

return $this->settings->get_backup_enabled();
}
}
19 changes: 19 additions & 0 deletions src/class-tiny-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ public function admin_init() {
$field = self::get_prefixed_name( 'resize_original' );
register_setting( 'tinify', $field );

$field = self::get_prefixed_name( 'backup' );
register_setting( 'tinify', $field );

$field = self::get_prefixed_name( 'preserve_data' );
register_setting( 'tinify', $field );

Expand Down Expand Up @@ -305,6 +308,16 @@ public function new_plugin_install() {
return ! $compression_timing;
}

public function get_backup_enabled() {
$sizes = $this->get_sizes();
if ( ! $sizes[ Tiny_Image::ORIGINAL ]['tinify'] ) {
return false;
}

$setting = get_option( self::get_prefixed_name( 'backup' ) );
return isset( $setting['enabled'] ) && 'on' === $setting['enabled'];
}

public function get_resize_enabled() {
/* This only applies if the original is being resized. */
$sizes = $this->get_sizes();
Expand Down Expand Up @@ -343,6 +356,12 @@ public function get_preserve_enabled( $name ) {
return isset( $setting[ $name ] ) && 'on' === $setting[ $name ];
}

/**
* Retrieves the preserve options for the original image
*
* @param string - size name
* @return false|array<string> false if size is not original, otherwise array of preserved keys
*/
public function get_preserve_options( $size_name ) {
if ( ! Tiny_Image::is_original( $size_name ) ) {
return false;
Expand Down
22 changes: 22 additions & 0 deletions src/views/settings-original-image.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,28 @@
</div>
</div>

<p class="tiny-preserve">
<?php
$backup_enabled_id = self::get_prefixed_name( 'backup' );
$backup_enabled_name = self::get_prefixed_name( 'backup[enabled]' );
$backup_enabled = $this->get_backup_enabled();
?>
<input
type="checkbox"
id="<?php echo esc_attr( $backup_enabled_id ); ?>"
name="<?php echo esc_attr( $backup_enabled_name ); ?>"
value="on"
<?php checked( $backup_enabled ); ?> />
<label for="<?php echo esc_attr( $backup_enabled_id ); ?>">
<?php
esc_html_e(
'Create a backup of the uncompressed image',
'tiny-compress-images'
);
?>
</label>
</p>

<?php
$this->render_preserve_input(
'creation',
Expand Down
15 changes: 15 additions & 0 deletions test/helpers/wordpress.php
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,14 @@ public function createImage($file_size, $path, $name)
->at($dir);
}

/**
* Creates images on the virtual disk for testing
* @param null|array $sizes Array of size => bytes to create, file will be named $name-$size.png
* @param int $original_size Bytes of image
* @param string $path Path to image
* @param string $name Name of the image
* @return void
*/
public function createImages($sizes = null, $original_size = 12345, $path = '14/01', $name = 'test')
{
vfsStream::newDirectory(self::UPLOAD_DIR . "/$path")->at($this->vfs);
Expand Down Expand Up @@ -309,6 +317,13 @@ public function createImagesFromJSON($virtual_images)
}
}

/**
* creates image meta data for testing
*
* @param string $path directory of the file in UPLOAD_DIR
* @param string $name name of the file without extension
* @return array object containing metadata
*/
public function getTestMetadata($path = '14/01', $name = 'test')
{
$metadata = array(
Expand Down
90 changes: 90 additions & 0 deletions test/unit/TinyImageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -306,4 +306,94 @@ public function test_conversion_same_mimetype()
// second call should be only with image/webp because first call was a image/webp
$this->assertEquals(array('image/webp'), $compress_calls[1]['convert_to']);
}

public function test_creates_backup_of_original_image() {
$this->wp->addOption('tinypng_backup', array(
'enabled' => 'on',
));
$this->wp->addOption('tinypng_sizes', array(
Tiny_Image::ORIGINAL => 'on',
));
$this->wp->stub('get_post_mime_type', function () {
return 'image/png';
});

$input_dir = '26/03';
$input_name = 'testforbackup';
$this->wp->createImages(array(), 1000, $input_dir, $input_name);

$settings = new Tiny_Settings();
$mock_compressor = $this->createMock(Tiny_Compress::class);
$settings->set_compressor($mock_compressor);

$metadata = $this->wp->getTestMetadata($input_dir, $input_name);
$tinyimg = new Tiny_Image($settings, 999, $metadata);
$tinyimg->compress();

$this->assertTrue(
file_exists( $this->vfs->url() . '/wp-content/uploads/' . $input_dir . '/' . $input_name . '.bak.png' ) ,
'backup of file should be created');
}

public function test_will_not_backup_other_sizes() {
$this->wp->addOption('tinypng_backup', array(
'enabled' => 'on',
));
$this->wp->addOption('tinypng_sizes', array(
'thumbnail' => 'on',
));
$this->wp->stub('get_post_mime_type', function () {
return 'image/png';
});

$input_dir = '26/03';
$input_name = 'testforbackup';
$this->wp->createImages(array(
'thumbnail' => 1000,
), 1000, $input_dir, $input_name);

$settings = new Tiny_Settings();
$mock_compressor = $this->createMock(Tiny_Compress::class);
$settings->set_compressor($mock_compressor);

$metadata = $this->wp->getTestMetadata($input_dir, $input_name);
$tinyimg = new Tiny_Image($settings, 999, $metadata);
$tinyimg->compress();

$this->assertFalse(
file_exists( $this->vfs->url() . '/wp-content/uploads/' . $input_dir . '/' . $input_name . '.bak.png' ) ,
'backup of original should not exist');

$this->assertFalse(
file_exists( $this->vfs->url() . '/wp-content/uploads/' . $input_dir . '/' . $input_name . '-thumbnail.bak.png' ) ,
'backup of thumbnail should not exist');
}

public function test_will_not_backup_when_disabled() {
$this->wp->addOption('tinypng_backup', array(
'enabled' => false,
));
$this->wp->addOption('tinypng_sizes', array(
Tiny_Image::ORIGINAL => 'on',
));
$this->wp->stub('get_post_mime_type', function () {
return 'image/png';
});

$input_dir = '26/03';
$input_name = 'testforbackup';
$this->wp->createImages(array(), 1000, $input_dir, $input_name);

$settings = new Tiny_Settings();
$mock_compressor = $this->createMock(Tiny_Compress::class);
$settings->set_compressor($mock_compressor);

$metadata = $this->wp->getTestMetadata($input_dir, $input_name);
$tinyimg = new Tiny_Image($settings, 999, $metadata);
$tinyimg->compress();

$this->assertFalse(
file_exists( $this->vfs->url() . '/wp-content/uploads/' . $input_dir . '/' . $input_name . '.bak.png' ) ,
'backup of original should not exist');
}
}
5 changes: 5 additions & 0 deletions test/unit/TinyTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ public static function client_supported() {
}

abstract class Tiny_TestCase extends TestCase {
/**
* WordPress stubs
*
* @var \WordPressStubs
*/
protected $wp;
protected $vfs;

Expand Down
Loading