X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FBase.pm;fp=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FBase.pm;h=0e3c5551c8a42152f0234ac18bf340aab74983b9;hb=bac32da1dfa1d3cf12ba439a210421f722ce43dd;hp=3b146228af2ae2b20bcaf4b97dbff4bca6c9634c;hpb=c2ecce69c18f38fd94402e3ad235fbc25a0a8a00;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 3b14622..0e3c555 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -158,6 +158,9 @@ of relationships. Skip loading of other classes in @INC. The default is to merge all other classes with the same name found in @INC into the schema file we are creating. +Even if this is not set, code generated by this module and not +subsequently modified is never included. + =head2 naming Static schemas (ones dumped to disk) will, by default, use the new-style @@ -1561,24 +1564,34 @@ sub _load_external { my $code = $self->_rewrite_old_classnames(slurp_file $real_inc_path); - if ($self->dynamic) { # load the class too - eval_package_without_redefine_warnings($class, $code); + if (my ($gen, $real_md5, $ver, $ts, $custom) = try { + local $self->{overwrite_modifications} = 0; + $self->_parse_generated_code($real_inc_path, $code); + }) { + # Ignore unmodified generated code. + $code = $custom eq $self->_default_custom_content ? '' : $custom; } - $self->_ext_stmt($class, - qq|# These lines were loaded from '$real_inc_path' found in \@INC.\n| - .qq|# They are now part of the custom portion of this file\n| - .qq|# for you to hand-edit. If you do not either delete\n| - .qq|# this section or remove that file from \@INC, this section\n| - .qq|# will be repeated redundantly when you re-create this\n| - .qq|# file again via Loader! See skip_load_external to disable\n| - .qq|# this feature.\n| - ); - chomp $code; - $self->_ext_stmt($class, $code); - $self->_ext_stmt($class, - qq|# End of lines loaded from '$real_inc_path'| - ); + if ($code) { + if ($self->dynamic) { # load the class too + eval_package_without_redefine_warnings($class, $code); + } + + $self->_ext_stmt($class, + qq|# These lines were loaded from '$real_inc_path' found in \@INC.\n| + .qq|# They are now part of the custom portion of this file\n| + .qq|# for you to hand-edit. If you do not either delete\n| + .qq|# this section or remove that file from \@INC, this section\n| + .qq|# will be repeated redundantly when you re-create this\n| + .qq|# file again via Loader! See skip_load_external to disable\n| + .qq|# this feature.\n| + ); + chomp $code; + $self->_ext_stmt($class, $code); + $self->_ext_stmt($class, + qq|# End of lines loaded from '$real_inc_path'| + ); + } } if ($old_real_inc_path) { @@ -2228,43 +2241,33 @@ sub _parse_generated_file { return unless -f $fn; - open(my $fh, '<:encoding(UTF-8)', $fn) - or croak "Cannot open '$fn' for reading: $!"; - - my $mark_re = - qr{^(# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:)([A-Za-z0-9/+]{22})\r?\n}; - - my ($real_md5, $ts, $ver, $gen); - local $_; - while(<$fh>) { - if(/$mark_re/) { - my $pre_md5 = $1; - my $mark_md5 = $2; - - # Pull out the version and timestamp from the line above - ($ver, $ts) = $gen =~ m/^# Created by DBIx::Class::Schema::Loader( v[\d.]+)?( @ [\d-]+ [\d:]+)?\r?\Z/m; - $ver =~ s/^ v// if $ver; - $ts =~ s/^ @ // if $ts; - - $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; - - last; - } - else { - $gen .= $_; - } - } - - my $custom = do { local $/; <$fh> } - if $real_md5; - - $custom ||= ''; - $custom =~ s/$CRLF|$LF/\n/g; - - close $fh; + return $self->_parse_generated_code($fn, slurp_file $fn); +} + +sub _parse_generated_code { + my ($self, $fn, $code) = @_; + + my ($gen, $ver, $ts, $mark_md5, $custom) = ( + $code =~ m{ + \A + ( + .* # generated code + ^\# \Q Created by DBIx::Class::Schema::Loader\E + (\ v [\d.]+ )? (\ @\ [\d-]+\ [\d:]+)?\r?\n # verison/time stamp + ^\# \Q DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:\E + ) + ([A-Za-z0-9/+]{22})\r?\n # checksum + (.*) # custom code + \z + }xms + ) or return; + + $ver =~ s/^ v// if $ver; + $ts =~ s/^ @ // if $ts; + + my $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; return ($gen, $real_md5, $ver, $ts, $custom); }