App-DistSync
view release on metacpan or search on metacpan
lib/App/DistSync.pm view on Meta::CPAN
my @skip_keys = @{(SKIPFILES)};
my $maniskip = maniread($self->{file_maniskip}, SKIPMODE); # MANIFEST.SKIP
push @skip_keys, keys %$maniskip if ref($maniskip) eq 'HASH';
for (@skip_keys) {$skips{$_} = qrreconstruct($_)}
debug("Found %d keys in the list of skipped files", scalar(keys %skips));
#debug(Data::Dumper::Dumper(\%skips)) && return 0;
}
# Deleting files listed in the MANIFEST.DEL file but not in the exclusion list
{
debug("Deleting files from list: %s", MANIDEL);
my $delfile = $self->{file_manidel}; # MANIFEST.DEL
my $deltime = $self->{mtime_manidel}; # Modify time in seconds
my $dellist = maniread($delfile) // {}; # { file => expire };
my $expire = 0;
foreach (values %$dellist) {
my $dt = _expire($_->[0] || 0);
$_ = [$dt];
$expire = $dt if $dt > $expire;
}
$expire = _expire(EXPIRE) unless $expire > 0;
debug("The file '$delfile' will expire on %s", scalar(localtime($deltime + $expire)))
if $deltime;
#debug(Data::Dumper::Dumper($dellist)) && return 0;
if ($deltime && (time - $deltime) > $expire) { # MANIFEST.DEL is expired!
# Delete files physically if they exist physically and are not on the exclusion list!
foreach my $k (keys %$dellist) {
if (_skipcheck(\%skips, $k)) { # The file is in the exclusion list.
debug("> [SKIPPED] %s", $k);
next;
}
my $f = File::Spec->canonpath(File::Spec->catfile($self->dir, $k));
if (-e $f) {
fdelete($f);
debug("> [DELETED] %s", $k);
} else {
debug("> [SKIPPED] %s (%s)", $k, $f);
}
}
# Deleting the MANIFEST.DEL file and immediately creating a new one
fdelete($delfile);
touch($delfile);
} else {
if ($deltime) {
debug("Skipped. Deletion is not required yet because the scheduled time has not arrived");
if ($self->verbose) {
debug(" File : %s", MANIDEL);
debug(" Created : %s", scalar(localtime($deltime)));
debug(" Expires : %s", scalar(localtime($deltime + $expire)));
}
} else {
debug("Skipped. File %s not exists", MANIDEL);
}
}
# Adding files listed in MANIFEST.DEL to the exclusion list
for (keys %$dellist) {$skips{$_} = qrreconstruct($_)}
}
# Reading the MIRRORS file and deciding whether to synchronize or not
debug("Synchronization");
my $mirrors_mani = maniread($self->{file_mirrors}) // {}; # MIRRORS
my @mirrors = sort {$a cmp $b} keys %$mirrors_mani;
if (scalar(@mirrors)) {
foreach my $url (@mirrors) {
debug("RESOURCE \"%s\"", $url);
# Downloading the MANIFEST.LOCK file, skipping the mirror resource if this
# file was successfully downloaded from the resource
{
debug("Fetching %s", MANILOCK);
my $fetch_lock = $self->fetch($url, MANILOCK, $self->{file_manitemp});
if ($fetch_lock->{status}) { # Ok
if ($self->_check_lockfile($self->{file_manitemp})) {
$self->{url} = $url;
debug("> [SKIPPED] Current resource SHOULD NOT update itself");
} else {
debug("> [SKIPPED] Remote resource is in a state of updating. Please wait");
}
next;
}
}
# Downloading the META file and analyzing the resource (checking the resource
# status and update date). If the check fails, the resource is skipped.
{
debug("Fetching %s", METAFILE);
my $fetch_meta = $self->fetch($url, METAFILE, $self->{file_manitemp});
if ($fetch_meta->{status}) { # Ok
my $remote_meta = read_yaml($self->{file_manitemp}) // '';
if (((ref($remote_meta) eq 'ARRAY') || ref($remote_meta) eq 'YAML::Tiny')) {
$remote_meta = $remote_meta->[0] || {};
}
unless ($remote_meta && ref($remote_meta) eq 'HASH') {
debug("> [SKIPPED] Remote resource is unreadable. Please contact the administrator of this resource");
next;
}
if ($remote_meta->{status}) {
my $remote_url = $remote_meta->{url} || $remote_meta->{uri} || '';
my $remote_date = $fetch_meta->{mtime} || 0;
my $remote_datef = $remote_date ? scalar(localtime($remote_date)) : 'UNKNOWN';
my $remote_ok = (time - $remote_date) > _expire(FREEZE) ? 0 : 1;
if ($self->verbose) {
debug("RESOURCE INFORMATION:");
debug(" Resource URL : %s", $remote_url);
debug(" Date : %s", $remote_meta->{date} // 'UNKNOWN');
debug(" Modified : %s", $remote_datef);
debug(" Hostname : %s", $remote_meta->{hostname} // '');
debug(" Directory : %s", $remote_meta->{directory} // '');
debug(" Project : %s v%s",
$remote_meta->{project} || ref($self), $remote_meta->{version} // '0.01');
debug(" Script : %s", $remote_meta->{script} // '');
debug(" Status : %s", $remote_ok ? "OK" : "EXPIRED");
debug(" Time : %d sec", $remote_meta->{'time'} || 0);
}
unless ($remote_ok) {
debug("> [SKIPPED] Remote resource is expired. Last updated: %s", $remote_datef);
next
}
} else {
( run in 1.458 second using v1.01-cache-2.11-cpan-39bf76dae61 )