diff --git a/file_entity_revisions.module b/file_entity_revisions.module index 05c5e5d..2b563d8 100644 --- a/file_entity_revisions.module +++ b/file_entity_revisions.module @@ -304,7 +304,7 @@ function file_entity_revisions_file_entity_form_submit($form, &$form_state) { if (!empty($form_state['values']['replace_upload'])) { $replacement = $form_state['values']['replace_upload']; // Move file from temp to permanent home. - if ($filename = file_unmanaged_copy($replacement->uri, $file->uri, FILE_EXISTS_RENAME)) { + if ($filename = _file_entity_revisions_replace_file($replacement, $file)) { $file->uri = $filename; file_delete($replacement); } @@ -315,6 +315,32 @@ function file_entity_revisions_file_entity_form_submit($form, &$form_state) { else { // If a replacement hasn't been uploaded, make a copy specifically for our new revision // so that a later attempt to replace it does not overwrite another revision's file. - $file->uri = file_unmanaged_copy($file->uri, $file->uri, FILE_EXISTS_RENAME); + $file->uri = _file_entity_revisions_replace_file($file, $file); } } +/** + * Helper function that moves old file so filename URI doesn't change + * when replacing a file. + * @param unknown $new + * @param unknown $old + */ +function _file_entity_revisions_replace_file($new, $old) { + // Rename current file. + $stashed = file_unmanaged_copy($old->uri, $old->uri, FILE_EXISTS_RENAME); + // Update file_managed_revisions where vid=VID. + if ($stashed) { + $vid = db_select('file_managed', 'f') + ->fields('f', array('vid')) + ->condition('f.fid', $old->fid, '=') + ->execute()->fetchField(); + if ($vid) { + $result = db_update('file_managed_revisions') + ->fields(array('uri' => $stashed)) + ->condition('vid', $vid, '=') + ->execute(); + } + } + // Copy new file in place. + return file_unmanaged_copy($new->uri, $old->uri, FILE_EXISTS_REPLACE); + // Return new file URI. +}