Config-Patch
view release on metacpan or search on metacpan
lib/Config/Patch.pm view on Meta::CPAN
content_pos_to => $end_pos - length($&),
as_string => substr( $self->{data}, $start_pos,
$end_pos - $start_pos + 1 ),
);
$patch_cb->($self, $patch_obj);
$patch_text = "";
}
# toggle flag
if($_ =~ $self->{patch_regex}) {
if($in_patch) {
# End line
} else {
# Start Line
$text_cb->($self, $text);
$start_pos = $pos - length $_;
$header = $_;
}
$text = "";
$in_patch = ($in_patch xor 1);
}
}
$text_cb->($self, $text) if length $text;
return 1;
}
###############################################
sub blurt {
###############################################
my($self, $data, $file) = @_;
open FILE, ">$file" or LOGDIE "Cannot open $file ($!)";
print FILE $data;
close FILE;
}
###############################################
sub slurp {
###############################################
my($self, $file) = @_;
local $/ = undef;
open FILE, "<$file" or LOGDIE "Cannot open $file ($!)";
my $data = <FILE>;
close FILE;
return $data;
}
###########################################
sub lock {
###########################################
my($self) = @_;
# Ignore if locking wasn't requested
return if ! $self->{flock};
# Already locked?
if($self->{locked}) {
$self->{locked}++;
return 1;
}
open my $fh, "+<$self->{file}" or
LOGDIE "Cannot open $self->{file} ($!)";
flock($fh, LOCK_EX);
$self->{fh} = $fh;
$self->{locked} = 1;
}
###########################################
sub unlock {
###########################################
my($self) = @_;
# Ignore if locking wasn't requested
return if ! $self->{flock};
if(! $self->{locked}) {
# Not locked?
return 1;
}
if($self->{locked} > 1) {
# Multiple lock released?
$self->{locked}--;
return 1;
}
# Release the last lock
flock($self->{fh}, LOCK_UN);
$self->{locked} = undef;
1;
}
# LEGACY METHODS
###########################################
sub patches {
###########################################
my($self) = @_;
# LEGACY METHOD, DON'T USE
my @patches = ();
my %patches = ();
$self->data_traverse(
sub { my($patcher, $patch) = @_;
push @patches,
[$patch->key(),
$patch->mode(),
$patch->text(),
$patch->pos_from(),
$patch->pos_to(),
$patch->header(),
$patch->content_pos_from(),
$patch->content_pos_to(),
];
$patches{ $patch->key() }++;
},
sub { },
);
return \@patches, \%patches;
}
###########################################
sub prepend {
###########################################
my($self, $text) = @_;
# LEGACY METHOD, DON'T USE
$self->lock();
$self->read() unless $self->{read};
$self->patch_by_stretch( $text, "prepend" );
$self->save();
$self->unlock();
return 1;
}
###########################################
sub append {
###########################################
my($self, $text) = @_;
# LEGACY METHOD, DON'T USE
$self->lock();
( run in 2.051 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )