Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Overwrite if the md5sum in a file is wrong but the content has not changed #8

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions Changes
Expand Up @@ -2,6 +2,9 @@ Revision history for Perl extension DBIx::Class::Schema::Loader

- Introspect view definitions for PostgreSQL, MySQL, Oracle,
Firebird, and InterBase.
- When a file's md5sum was wrong but no other content in the file had
changed, it would not be rewritten even when overwrite_modifications
was true. Fixed by Dave Rolsky. GH #8.

0.07045 2016-01-22
- Regenerate tarball without author-mode test dependencies
Expand Down
13 changes: 10 additions & 3 deletions lib/DBIx/Class/Schema/Loader/Base.pm
Expand Up @@ -2252,9 +2252,16 @@ sub _parse_generated_file {

$gen .= $pre_md5;
$real_md5 = Digest::MD5::md5_base64(encode 'UTF-8', $gen);
croak "Checksum mismatch in '$fn', the auto-generated part of the file has been modified outside of this loader. Aborting.\nIf you want to overwrite these modifications, set the 'overwrite_modifications' loader option.\n"
if !$self->overwrite_modifications && $real_md5 ne $mark_md5;

if ($real_md5 ne $mark_md5) {
if ($self->overwrite_modifications) {
# Setting this to something that is not a valid MD5 forces
# the file to be rewritten.
$real_md5 = 'not an MD5';
}
else {
croak "Checksum mismatch in '$fn', the auto-generated part of the file has been modified outside of this loader. Aborting.\nIf you want to overwrite these modifications, set the 'overwrite_modifications' loader option.\n";
}
}
last;
}
else {
Expand Down
60 changes: 48 additions & 12 deletions t/40overwrite_modifications.t
Expand Up @@ -22,16 +22,7 @@ dump_schema();
ok( -f $foopm, 'looks like it dumped' );

# now modify one of the files
{
open my $in, '<', $foopm or die "$! reading $foopm";
my ($tfh,$temp) = tempfile( UNLINK => 1);
while(<$in>) {
s/"bars"/"somethingelse"/;
print $tfh $_;
}
close $tfh;
copy( $temp, $foopm );
}
rewrite_foopm($foopm, qr{"bars"}, q{"somethingelse"});

# and dump again without overwrites
throws_ok {
Expand All @@ -43,8 +34,37 @@ lives_ok {
dump_schema( overwrite_modifications => 1 );
} 'does not throw when dumping with overwrite_modifications';

# Replace the md5 with a bad MD5 in Foo.pm
my $foopm_content = slurp_file($foopm);
my ($md5) = $foopm_content =~/md5sum:(.+)$/m;
# This cannot be just any arbitrary value, it has to actually look like an MD5
# value or DBICSL doesn't even see it as an MD5 at all (which makes sense).
my $bad_md5 = reverse $md5;
rewrite_foopm($foopm, qr{md5sum:.+$}, "md5sum:$bad_md5");

unlike slurp_file $foopm, qr/"somethingelse"/, "Modifications actually overwritten";
# and dump again without overwrites
throws_ok {
dump_schema();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you intend to remove this test?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably not. I'll have to take a closer look once I'm back home.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having had a closer look this morning, it's clear that that test should still be there, so I've reinstated it.

} qr/mismatch/, 'throws error dumping without overwrite_modifications';

$foopm_content = slurp_file($foopm);
like(
$foopm_content,
qr/\Q$bad_md5/,
'bad MD5 is not rewritten when overwrite_modifications is false'
);

# and then dump with overwrite
lives_ok {
dump_schema( overwrite_modifications => 1 );
} 'does not throw when dumping with overwrite_modifications';

$foopm_content = slurp_file($foopm);
unlike(
$foopm_content,
qr/\Q$bad_md5/,
'bad MD5 is rewritten when overwrite_modifications is true'
);

sub dump_schema {

Expand All @@ -60,7 +80,23 @@ sub dump_schema {
{ dump_directory => $tempdir, @$args },
[ $make_dbictest_db::dsn ],
);
} [qr/^Dumping manual schema/, qr/^Schema dump completed/ ];
} [qr/^Dumping manual schema/, qr/^Schema dump completed/ ],
'schema was dumped with expected warnings';
}

sub rewrite_foopm {
my $foopm = shift;
my $match = shift;
my $replace = shift;

open my $in, '<', $foopm or die "$! reading $foopm";
my ($tfh, $temp) = tempfile( UNLINK => 1);
while(<$in>) {
s/$match/$replace/;
print $tfh $_;
}
close $tfh;
copy( $temp, $foopm );
}

done_testing();