diff options
-rw-r--r-- | includes/registry.inc | 27 | ||||
-rw-r--r-- | modules/simpletest/tests/registry.test | 15 | ||||
-rw-r--r-- | modules/system/system.install | 19 |
3 files changed, 38 insertions, 23 deletions
diff --git a/includes/registry.inc b/includes/registry.inc index 8efaf0f98..76c503a87 100644 --- a/includes/registry.inc +++ b/includes/registry.inc @@ -71,9 +71,11 @@ function _registry_rebuild() { // or modify attributes of a file. drupal_alter('registry_files', $files, $modules); foreach (registry_get_parsed_files() as $filename => $file) { - // Add the md5 to those files we've already parsed. + // Add the file creation and modification dates to those files we have + // already parsed. if (isset($files[$filename])) { - $files[$filename]['md5'] = $file['md5']; + $files[$filename]['filectime'] = $file['filectime']; + $files[$filename]['filemtime'] = $file['filemtime']; } else { // Flush the registry of resources in files that are no longer on disc @@ -131,18 +133,23 @@ function registry_get_parsed_files() { function _registry_parse_files($files) { $parsed_files = array(); foreach ($files as $filename => $file) { - $contents = file_get_contents($filename); - $md5 = md5($contents); - $new_file = !isset($file['md5']); - if ($new_file || $md5 != $file['md5']) { + $filectime = filectime($filename); + $filemtime = filemtime($filename); + $modified_file = !isset($file['filectime']) || !isset($file['filemtime']) + || $filectime != $file['filectime'] || $filemtime != $file['filemtime']; + if ($modified_file) { + $contents = file_get_contents($filename); $parsed_files[] = $filename; - // We update the md5 after we've saved the files resources rather than here, so if we - // don't make it through this rebuild, the next run will reparse the file. + // We update the filectime/filemtime after we've saved the files resources + // rather than here, so if we don't make it through this rebuild, the next + // run will reparse the file. _registry_parse_file($filename, $contents, $file['module'], $file['weight']); - $file['md5'] = $md5; db_merge('registry_file') ->key(array('filename' => $filename)) - ->fields(array('md5' => $md5)) + ->fields(array( + 'filectime' => $filectime, + 'filemtime' => $filemtime, + )) ->execute(); } } diff --git a/modules/simpletest/tests/registry.test b/modules/simpletest/tests/registry.test index 3592ed13b..53ee3127f 100644 --- a/modules/simpletest/tests/registry.test +++ b/modules/simpletest/tests/registry.test @@ -73,11 +73,10 @@ class RegistryParseFilesTestCase extends DrupalWebTestCase { file_save_data($this->$fileType->contents, $this->$fileType->fileName); if ($fileType == 'existing_changed') { - // Insert a record with a dodgy md5. - $this->$fileType->fakeMD5 = md5($this->$fileType->contents . rand()); db_insert('registry_file') ->fields(array( - 'md5' => $this->$fileType->fakeMD5, + 'filectime' => rand(1, 1000000), + 'filemtime' => rand(1, 1000000), 'filename' => $this->$fileType->fileName, )) ->execute(); @@ -107,9 +106,10 @@ class RegistryParseFilesTestCase extends DrupalWebTestCase { $foundName = db_query('SELECT name FROM {registry} WHERE name = :name', array(':name' => $this->$fileType->$resource))->fetchField(); $this->assertTrue($this->$fileType->$resource == $foundName, t('Resource "@resource" found.', array('@resource' => $this->$fileType->$resource))); } - // Test that we have the right md5. - $md5 = db_query('SELECT md5 FROM {registry_file} WHERE filename = :filename', array(':filename' => $this->$fileType->fileName))->fetchField(); - $this->assertTrue(md5($this->$fileType->contents) == $md5, t('MD5 for "@filename" matched.' . $fileType . $md5, array('@filename' => $this->$fileType->fileName))); + // Test that we have the right file creation and modification dates. + $dates = db_query('SELECT filectime, filemtime FROM {registry_file} WHERE filename = :filename', array(':filename' => $this->$fileType->fileName))->fetchObject(); + $this->assertEqual($dates->filectime, filectime($this->$fileType->fileName), t('File creation date matches for %filename.', array('%filename' => $this->$fileType->fileName))); + $this->assertEqual($dates->filemtime, filemtime($this->$fileType->fileName), t('File modification date matches for %filename.', array('%filename' => $this->$fileType->fileName))); } } @@ -121,7 +121,8 @@ class RegistryParseFilesTestCase extends DrupalWebTestCase { foreach ($this->fileTypes as $fileType) { $files[$this->$fileType->fileName] = array('module' => '', 'weight' => 0); if ($fileType == 'existing_changed') { - $files[$this->$fileType->fileName]['md5'] = $this->$fileType->fakeMD5; + $files[$this->$fileType->fileName]['filectime'] = rand(1, 1000000); + $files[$this->$fileType->fileName]['filemtime'] = rand(1, 1000000); } } return $files; diff --git a/modules/system/system.install b/modules/system/system.install index 6e2465fca..5c5b19eab 100644 --- a/modules/system/system.install +++ b/modules/system/system.install @@ -1289,11 +1289,17 @@ function system_schema() { 'length' => 255, 'not null' => TRUE, ), - 'md5' => array( - 'description' => "Md5 hash of the file's contents when last parsed.", - 'type' => 'varchar', - 'length' => 32, + 'filectime' => array( + 'description' => "The creation time of the file when last parsed.", + 'type' => 'int', 'not null' => TRUE, + 'default' => 0, + ), + 'filemtime' => array( + 'description' => "The modification time of the file when last parsed.", + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, ), ), 'primary key' => array('filename'), @@ -1717,8 +1723,9 @@ function system_update_7006() { ); $schema['registry_file'] = array( 'fields' => array( - 'filename' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''), - 'md5' => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => ''), + 'filename' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE), + 'filectime' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), + 'filemtime' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), ), 'primary key' => array('filename'), ); |