Merge remote-tracking branch 'origin/return-objects'

This commit is contained in:
Alex Schroeder
2015-09-06 08:10:46 +02:00
20 changed files with 182 additions and 173 deletions

View File

@@ -36,8 +36,7 @@ sub WrapperGetHeader {
*PrintFooter = \&WrapperPrintFooter;
sub WrapperPrintFooter {
my ($id, $rev, $comment) = @_;
print $q->start_div({-class=>'wrapper close'});
print $q->end_div(), $q->end_div();
OldPrintFooter($id, $rev, $comment);
OldPrintFooter(@_);
}

View File

@@ -126,8 +126,8 @@ sub DoAggregate {
}
}
foreach my $id (@pages) {
my %data = ParseData(ReadFileOrDie(GetPageFile(FreeToNormal($id))));
my $page = $data{text};
my $data = ParseData(ReadFileOrDie(GetPageFile(FreeToNormal($id))));
my $page = $data->{text};
my $size = length($page);
my $i = index($page, "\n=");
my $j = index($page, "\n----");
@@ -136,13 +136,13 @@ sub DoAggregate {
$page =~ s/^=.*\n//; # if it starts with a header
my $name = $id;
$name =~ s/_/ /g;
my $date = TimeToRFC822($data{ts});
my $host = $data{host};
my $username = $data{username};
my $date = TimeToRFC822($data->{ts});
my $host = $data->{host};
my $username = $data->{username};
$username = QuoteHtml($username);
$username = $host unless $username;
my $minor = $data{minor};
my $revision = $data{revision};
my $minor = $data->{minor};
my $revision = $data->{revision};
my $cluster = GetCluster($page);
my $description = ToString(sub { ApplyRules(QuoteHtml($page), 1, 0, undef, 'p') });
$description .= $q->p(GetPageLink($id, T('Learn more...')))

View File

@@ -124,7 +124,7 @@ sub NewBanContributorsWriteRcLog {
and $OpenPageName eq $id and UserIsAdmin()) {
# we currently have the clean page loaded, so we need to reload
# the spammed revision (there is a possible race condition here)
my ($old) = GetTextRevision($Page{revision}-1, 1);
my $old = GetTextRevision($Page{revision} - 1, 1)->{text};
my %urls = map {$_ => 1 } $old =~ /$UrlPattern/g;
# we open the file again to force a load of the despammed page
foreach my $url ($Page{text} =~ /$UrlPattern/g) {

View File

@@ -133,14 +133,14 @@ sub DespamPage {
# from DoHistory()
my @revisions = sort {$b <=> $a} map { m|/([0-9]+).kp$|; $1; } GetKeepFiles($OpenPageName);
foreach my $revision (@revisions) {
my ($text, $rev) = GetTextRevision($revision, 1); # quiet
my ($revisionPage, $rev) = GetTextRevision($revision, 1); # quiet
if (not $rev) {
print ': ' . Ts('Cannot find revision %s.', $revision);
return;
} elsif (not DespamBannedContent($text)) {
} elsif (not DespamBannedContent($revisionPage->{text})) {
my $summary = Tss('Revert to revision %1: %2', $revision, $rule);
print ': ' . $summary;
Save($OpenPageName, $text, $summary) unless GetParam('debug', 0);
Save($OpenPageName, $revisionPage->{text}, $summary) unless GetParam('debug', 0);
return;
}
}

View File

@@ -48,10 +48,10 @@ sub DoDraft {
SetParam('msg', T('Draft saved')); # invalidate cache
print GetHttpHeader('', T('Draft saved'), '204 NO CONTENT');
} elsif (-f $draft) {
my %data = ParseData(ReadFileOrDie($draft));
my $data = ParseData(ReadFileOrDie($draft));
unlink ($draft);
$Message .= $q->p(T('Draft recovered'));
DoEdit($data{id}, $data{text}, 1);
DoEdit($data->{id}, $data->{text}, 1);
} else {
ReportError(T('No draft available to recover'), '404 NOT FOUND');
}

View File

@@ -56,8 +56,8 @@ sub NewEnclosureRssItem {
my $id = shift;
my $rss = OldEnclosureRssItem($id, @_);
require MIME::Base64;
my %data = ParseData(ReadFileOrDie(GetPageFile($id)));
my @enclosures = split(' ', $data{enclosures});
my $data = ParseData(ReadFileOrDie(GetPageFile($id)));
my @enclosures = split(' ', $data->{enclosures});
my $enclosures = '';
foreach my $enclosure (@enclosures) {
# Don't add the enclosure if the page has been deleted in the mean

View File

@@ -240,9 +240,9 @@ sub GdSecurityImageCheck {
if ($answer ne '' && GdSecurityImageIsValidId($id)) {
my ($status, $data) = ReadFile(GdSecurityImageGetTicketFile($id));
if ($status) {
my %page = ParseData($data);
if ($page{generation_time} + $GdSecurityImageDuration > $Now) {
if ($answer eq $page{string}) {
my $page = ParseData($data);
if ($page->{generation_time} + $GdSecurityImageDuration > $Now) {
if ($answer eq $page->{string}) {
$GdSecurityImageId = '';
if (!$GdSecurityImageRememberAnswer) {
SetParam('gd_security_image_id', '');

View File

@@ -174,18 +174,17 @@ sub JoinerCreateAccount {
}
my ($email_status, $email_data) = ReadFile(JoinerGetEmailFile($email));
my %email_page = ();
if ($email_status) {
%email_page = ParseData($email_data);
if ($email_page{confirmed}) {
my $email_page = ParseData($email_data);
if ($email_page->{confirmed}) {
return Ts('The email address %s has already been used.', $email);
}
if ($email_page{registration_time} + $JoinerWait > $Now) {
my $min = 1 + int(($email_page{registration_time} + $JoinerWait - $Now) / 60);
if ($email_page->{registration_time} + $JoinerWait > $Now) {
my $min = 1 + int(($email_page->{registration_time} + $JoinerWait - $Now) / 60);
return Ts('Wait %s minutes before try again.', $min);
}
}
%email_page = ();
my %email_page = ();
$email_page{username} = $username;
$email_page{email} = $email;
$email_page{confirmed} = 0;
@@ -468,37 +467,37 @@ sub JoinerDoConfirmRegistration {
JoinerShowRegistrationConfirmationFailed();
return;
}
my %page = ParseData($data);
my $page = ParseData($data);
if ($key ne $page{key}) {
if ($key ne $page->{key}) {
$JoinerMessage = T('Invalid key.');
JoinerShowRegistrationConfirmationFailed();
return;
}
if ($page{registration_time} + $JoinerWait < $Now) {
if ($page->{registration_time} + $JoinerWait < $Now) {
$JoinerMessage = T('The key expired.');
JoinerShowRegistrationConfirmationFailed();
return;
}
$page{key} = '';
$page{confirmed} = 1;
$page->{key} = '';
$page->{confirmed} = 1;
JoinerRequestLockOrError('joiner');
CreateDir($JoinerDir);
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%page));
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%$page));
ReleaseLockDir('joiner');
my $email = $page{email};
my $email = $page->{email};
JoinerRequestLockOrError('joiner');
my ($email_status, $email_data) = ReadFile(JoinerGetEmailFile($email));
ReleaseLockDir('joiner');
if ($email_status) {
my %email_page = ParseData($email_data);
$email_page{confirmed} = 1;
my $email_page = ParseData($email_data);
$email_page->{confirmed} = 1;
JoinerRequestLockOrError('joiner');
CreateDir($JoinerEmailDir);
WriteStringToFile(JoinerGetEmailFile($email), EncodePage(%email_page));
WriteStringToFile(JoinerGetEmailFile($email), EncodePage(%$email_page));
ReleaseLockDir('joiner');
}
@@ -570,41 +569,41 @@ sub JoinerDoProcessLogin {
JoinerDoLogin();
return;
}
my %page = ParseData($data);
my $page = ParseData($data);
my $hash = JoinerGetPasswordHash($password);
if ($hash eq $page{password}) {
$page{recover} = 0;
if ($hash eq $page->{password}) {
$page->{recover} = 0;
SetParam('joiner_recover', 0);
} elsif ($key ne '' && $key eq $page{recover_key}) {
if ($page{recover_time} + $JoinerWait < $Now) {
} elsif ($key ne '' && $key eq $page->{recover_key}) {
if ($page->{recover_time} + $JoinerWait < $Now) {
$JoinerMessage = T('The key expired.');
JoinerDoLogin();
return;
}
$page{recover} = 1;
$page->{recover} = 1;
SetParam('joiner_recover', 1);
} else {
$JoinerMessage = T('Login failed.');
JoinerDoLogin();
return;
}
if ($page{banned}) {
if ($page->{banned}) {
$JoinerMessage = T('You are banned.');
JoinerDoLogin();
return;
}
if (!$page{confirmed}) {
if (!$page->{confirmed}) {
$JoinerMessage = T('You must confirm email address.');
JoinerDoLogin();
return;
}
my $session = Digest::MD5::md5_hex(rand());
$page{session} = $session;
$page->{session} = $session;
JoinerRequestLockOrError('joiner');
CreateDir($JoinerDir);
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%page));
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%$page));
ReleaseLockDir('joiner');
SetParam('username', $username);
@@ -617,7 +616,7 @@ sub JoinerDoProcessLogin {
print Ts('%s has logged in.', $username);
print $q->end_p();
if ($page{recover}) {
if ($page->{recover}) {
print $q->start_p();
print T('You should set new password immediately.');
print $q->end_p();
@@ -735,9 +734,9 @@ sub JoinerDoProcessChangePassword {
JoinerDoChangePassword();
return;
}
my %page = ParseData($data);
my $page = ParseData($data);
my $hash = JoinerGetPasswordHash($current_password);
if (!$page{recover} && $hash ne $page{password}) {
if (!$page->{recover} && $hash ne $page->{password}) {
$JoinerMessage = T('Current Password:') . ' ' . T('Password is wrong.');
JoinerDoChangePassword();
return;
@@ -754,12 +753,12 @@ sub JoinerDoProcessChangePassword {
return;
}
$page{password} = JoinerGetPasswordHash($new_password);
$page{key} = '';
$page{recover} = '';
$page->{password} = JoinerGetPasswordHash($new_password);
$page->{key} = '';
$page->{recover} = '';
JoinerRequestLockOrError('joiner');
CreateDir($JoinerDir);
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%page));
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%$page));
ReleaseLockDir('joiner');
SetParam('joiner_recover', 0);
@@ -823,9 +822,9 @@ sub JoinerDoProcessForgotPassword {
JoinerDoForgotPassword();
return;
}
my %email_page = ParseData($email_data);
my $email_page = ParseData($email_data);
my $username = $email_page{username};
my $username = $email_page->{username};
JoinerRequestLockOrError('joiner');
my ($status, $data) = ReadFile(JoinerGetAccountFile($username));
ReleaseLockDir('joiner');
@@ -834,27 +833,27 @@ sub JoinerDoProcessForgotPassword {
JoinerDoForgotPassword();
return;
}
my %page = ParseData($data);
my $page = ParseData($data);
if ($email ne $page{email}) {
if ($email ne $page->{email}) {
$JoinerMessage = T('The mail address is not valid anymore.');
JoinerDoForgotPassword();
return;
}
if ($page{recover_time} + $JoinerWait > $Now) {
my $min = 1 + int(($page{recover_time} + $JoinerWait - $Now) / 60);
if ($page->{recover_time} + $JoinerWait > $Now) {
my $min = 1 + int(($page->{recover_time} + $JoinerWait - $Now) / 60);
$JoinerMessage = Ts('Wait %s minutes before try again.', $min);
JoinerDoForgotPassword();
return;
}
my $key = Digest::MD5::md5_hex($JoinerGeneratorSalt . rand());
$page{recover_time} = $Now;
$page{recover_key} = $key;
$page->{recover_time} = $Now;
$page->{recover_key} = $key;
JoinerRequestLockOrError('joiner');
CreateDir($JoinerDir);
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%page));
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%$page));
ReleaseLockDir('joiner');
JoinerSendRecoverAccountEmail($email, $username, $key);
@@ -922,8 +921,8 @@ sub JoinerDoProcessChangeEmail {
my ($email_status, $email_data) = ReadFile(JoinerGetEmailFile($email));
ReleaseLockDir('joiner');
if ($email_status) {
my %email_page = ParseData($email_data);
if ($email_page{confirmed} && $email_page{username} ne $username) {
my $email_page = ParseData($email_data);
if ($email_page->{confirmed} && $email_page->{username} ne $username) {
$JoinerMessage = T('Email:') . ' ' .
Ts('The email address %s has already been used.', $email);
JoinerDoChangeEmail();
@@ -939,29 +938,29 @@ sub JoinerDoProcessChangeEmail {
JoinerDoChangeEmail();
return;
}
my %page = ParseData($data);
my $page = ParseData($data);
if ($page{change_email_time} + $JoinerWait > $Now) {
my $min = 1 + int(($page{change_email_time} + $JoinerWait - $Now) / 60);
if ($page->{change_email_time} + $JoinerWait > $Now) {
my $min = 1 + int(($page->{change_email_time} + $JoinerWait - $Now) / 60);
$JoinerMessage = Ts('Wait %s minutes before try again.', $min);
JoinerDoChangeEmail();
return;
}
my $hash = JoinerGetPasswordHash($password);
if ($hash ne $page{password}) {
if ($hash ne $page->{password}) {
$JoinerMessage = T('Password:') . ' ' . T('Password is wrong.');
JoinerDoChangeEmail();
return;
}
my $key = Digest::MD5::md5_hex(rand());
$page{change_email} = $email;
$page{change_email_key} = $key;
$page{change_email_time} = $Now;
$page->{change_email} = $email;
$page->{change_email_key} = $key;
$page->{change_email_time} = $Now;
JoinerRequestLockOrError('joiner');
CreateDir($JoinerDir);
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%page));
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%$page));
ReleaseLockDir('joiner');
JoinerSendChangeEmailEmail($email, $username, $key);
@@ -1012,22 +1011,22 @@ sub JoinerDoConfirmEmail {
JoinerShowConfirmEmailFailed();
return;
}
my %page = ParseData($data);
my $page = ParseData($data);
if ($key ne $page{change_email_key}) {
if ($key ne $page->{change_email_key}) {
$JoinerMessage = T('Invalid key.');
JoinerShowConfirmEmailFailed();
return;
}
my $new_email = $page{change_email};
$page{email} = $new_email;
$page{change_email} = '';
$page{change_email_key} = '';
$page{change_email_time} = '';
my $new_email = $page->{change_email};
$page->{email} = $new_email;
$page->{change_email} = '';
$page->{change_email_key} = '';
$page->{change_email_time} = '';
JoinerRequestLockOrError('joiner');
CreateDir($JoinerDir);
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%page));
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%$page));
ReleaseLockDir('joiner');
my %email_page = ();
@@ -1128,30 +1127,30 @@ sub JoinerDoProcessBan {
JoinerDoBan();
return;
}
my %page = ParseData($data);
my $page = ParseData($data);
if ($ban) {
if ($page{banned}) {
if ($page->{banned}) {
$JoinerMessage = Ts('%s is already banned.', $username);
JoinerDoBan();
return;
}
$page{banned} = 1;
$page{session} = '';
$page->{banned} = 1;
$page->{session} = '';
$JoinerMessage = Ts('%s has been banned.', $username);
} else {
if (!$page{banned}) {
if (!$page->{banned}) {
$JoinerMessage = Ts('%s is not banned.', $username);
JoinerDoBan();
return;
}
$page{banned} = 0;
$page->{banned} = 0;
$JoinerMessage = Ts('%s has been unbanned.', $username);
}
JoinerRequestLockOrError('joiner');
CreateDir($JoinerDir);
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%page));
WriteStringToFile(JoinerGetAccountFile($username), EncodePage(%$page));
ReleaseLockDir('joiner');
JoinerDoBan();
@@ -1178,16 +1177,16 @@ sub JoinerIsLoggedIn {
$JoinerLoggedIn = 0;
return $JoinerLoggedIn;
}
my %page = ParseData($data);
if (!$page{confirmed}) {
my $page = ParseData($data);
if (!$page->{confirmed}) {
$JoinerLoggedIn = 0;
return $JoinerLoggedIn;
}
if ($session ne $page{session}) {
if ($session ne $page->{session}) {
$JoinerLoggedIn = 0;
return $JoinerLoggedIn;
}
if ($page{banned}) {
if ($page->{banned}) {
$JoinerLoggedIn = 0;
return $JoinerLoggedIn;
}

View File

@@ -35,12 +35,12 @@ sub LiveTemplateRule {
Dirty($str);
my $oldpos = pos;
my $old_ = $_;
my %hash = ParseData($2);
my $hash = ParseData($2);
my $text = GetPageContent($template);
return $q->p($q->strong(Ts('The template %s is either empty or does not exist.',
$template))) . AddHtmlEnvironment('p') unless $text;
foreach my $key (keys %hash) {
$text =~ s/\$$key\$/$hash{$key}/g;
foreach my $key (keys %$hash) {
$text =~ s/\$$key\$/$hash->{$key}/g;
}
print "<div class=\"template $template\">";
ApplyRules(QuoteHtml($text), 1, 1, undef, 'p');

View File

@@ -381,7 +381,8 @@ sub NewNamespaceBrowsePage {
#REDIRECT into different namespaces
my ($id, $raw, $comment, $status) = @_;
OpenPage($id);
my ($text, $revision) = GetTextRevision(GetParam('revision', ''), 1);
my ($revisionPage, $revision) = GetTextRevision(GetParam('revision', ''), 1);
my $text = $revisionPage->{text};
my $oldId = GetParam('oldid', '');
if (not $oldId and not $revision and (substr($text, 0, 10) eq '#REDIRECT ')
and (($WikiLinks and $text =~ /^\#REDIRECT\s+(($InterSitePattern:)?$InterLinkPattern)/)

View File

@@ -271,11 +271,11 @@ sub SearchNearPages {
my @entries = split(/\n\n+/, $data);
shift @entries; # skip head
foreach my $entry (@entries) {
my %entry = ParseData($entry); # need to pass reference
my $name = $entry{title};
my $entryPage = ParseData($entry); # need to pass reference
my $name = $entryPage->{title};
next if $found{$name}; # do not duplicate local pages
$found{$name} = 1;
PrintSearchResultEntry(\%entry, $regex); # with context and full search!
PrintSearchResultEntry($entryPage, $regex); # with context and full search!
}
}
}

View File

@@ -99,9 +99,9 @@ sub LocalMapWorkHorse {
my $retval_children = '';
if ($depth > 0) {
my %data = ParseData(ReadFileOrDie(GetPageFile($id)));
my @flags = split(/$FS/, $data{'flags'});
my @blocks = split(/$FS/, $data{'blocks'});
my $data = ParseData(ReadFileOrDie(GetPageFile($id)));
my @flags = split(/$FS/, $data->{'flags'});
my @blocks = split(/$FS/, $data->{'blocks'});
my @subpages;
# Iterate over blocks, operate only on "dirty" ones

View File

@@ -69,8 +69,8 @@ sub NewPrivatePagesUserCanEdit {
my $result = OldPrivatePagesUserCanEdit($id, $editing, @rest);
# bypass OpenPage and GetPageContent (these are redefined below)
if ($result > 0 and $editing and $IndexHash{$id}) {
my %data = ParseData(ReadFileOrDie(GetPageFile($id)));
if (PrivatePageLocked($data{text})) {
my $data = ParseData(ReadFileOrDie(GetPageFile($id)));
if (PrivatePageLocked($data->{text})) {
return 0;
}
}
@@ -128,11 +128,11 @@ sub NewPrivatePagesGetPageContent {
*GetTextRevision = \&NewPrivatePagesGetTextRevision;
sub NewPrivatePagesGetTextRevision {
my ($text, $revision) = OldPrivatePagesGetTextRevision(@_);
if (PrivatePageLocked($text)) {
return (NewPrivatePageNewText(), $revision);
my ($page, $revision) = OldPrivatePagesGetTextRevision(@_);
if (PrivatePageLocked($page->{text})) {
return ({text => NewPrivatePageNewText()}, $revision); # XXX faking a page object like this is not good
}
return ($text, $revision);
return wantarray ? ($page, $revision) : $page;
}
# hide #PASSWORD

View File

@@ -117,9 +117,9 @@ sub StaticFileName {
my ($status, $data) = ReadFile(GetPageFile(UrlDecode($id)));
# If the link points to a wanted page, we cannot make this static.
return $id unless $status;
my %hash = ParseData($data);
my $hash = ParseData($data);
my $ext = '.html';
if ($hash{text} =~ /^\#FILE ([^ \n]+ ?[^ \n]*)\n(.*)/s) {
if ($hash->{text} =~ /^\#FILE ([^ \n]+ ?[^ \n]*)\n(.*)/s) {
%StaticMimeTypes = StaticMimeTypes() unless %StaticMimeTypes;
$ext = $StaticMimeTypes{"$1"};
$ext = '.' . $ext if $ext;

View File

@@ -113,9 +113,9 @@ sub StaticFileName {
return $StaticFiles{$id} if $StaticFiles{$id}; # cache filenames
my ($status, $data) = ReadFile(GetPageFile(StaticUrlDecode($id)));
print "cannot read " . GetPageFile(StaticUrlDecode($id)) . $q->br() unless $status;
my %hash = ParseData($data);
my $hash = ParseData($data);
my $ext = '.html';
if ($hash{text} =~ /^\#FILE ([^ \n]+)\n(.*)/s) {
if ($hash->{text} =~ /^\#FILE ([^ \n]+)\n(.*)/s) {
$ext = $StaticMimeTypes{$1};
$ext = '.' . $ext if $ext;
}
@@ -445,15 +445,15 @@ sub StaticNewDespamPage {
# from DoHistory()
my @revisions = sort {$b <=> $a} map { m|/([0-9]+).kp$|; $1; } GetKeepFiles($OpenPageName);
foreach my $revision (@revisions) {
my ($text, $rev) = GetTextRevision($revision, 1); # quiet
my ($revisionPage, $rev) = GetTextRevision($revision, 1); # quiet
if (not $rev) {
print ': ' . Ts('Cannot find revision %s.', $revision);
return;
} elsif (not DespamBannedContent($text)) {
} elsif (not DespamBannedContent($revisionPage->{text})) {
my $summary = Tss('Revert to revision %1: %2', $revision, $rule);
print ': ' . $summary;
Save($OpenPageName, $text, $summary) unless GetParam('debug', 0);
StaticDeleteFile($OpenPageName);
Save($OpenPageName, $revisionPage->{text}, $summary) unless GetParam('debug', 0);
StaticDeleteFile($OpenPageName);
return;
}
}
@@ -461,7 +461,7 @@ sub StaticNewDespamPage {
my $summary = Ts($rule). ' ' . Ts('Marked as %s.', $DeletedPage);
print ': ' . $summary;
Save($OpenPageName, $DeletedPage, $summary) unless GetParam('debug', 0);
StaticDeleteFile($OpenPageName);
StaticDeleteFile($OpenPageName);
} else {
print ': ' . T('Cannot find unspammed revision.');
}

View File

@@ -42,7 +42,7 @@ sub NewSvgGetDownloadLink {
local (%Page, $OpenPageName);
OpenPage($name);
if ($revision) {
($data) = GetTextRevision($revision); # ignore revision reset
$data = GetTextRevision($revision)->{text}; # ignore revision reset
} else {
$data = $Page{text};
}

View File

@@ -190,7 +190,7 @@ sub GenerateThumbNail {
# Check MIME type supported
# Check is a file
my ($text, $revision) = GetTextRevision(GetParam('revision', '')); # maybe revision reset!
my $text = GetTextRevision(GetParam('revision', ''))->{text}; # maybe revision reset!
my ($type) = TextIsFile($text); # MIME type if an uploaded file
my $data = substr($text, index($text, "\n") + 1);

View File

@@ -37,8 +37,7 @@ sub TranslationRule {
sub GetCurrentPageRevision {
my $id = shift;
my %page = ParseData(ReadFileOrDie(GetPageFile($id)));
return $page{revision};
return ParseData(ReadFileOrDie(GetPageFile($id)))->{revision};
}
sub GetTranslationLink {

View File

@@ -18,12 +18,14 @@
require 't/test.pl';
package OddMuse;
use Test::More tests => 16;
use Test::More tests => 17;
## Test revision and diff stuff
update_page('KeptRevisions', 'first');
update_page('KeptRevisions', 'second');
#sleep 120; # TODO implement fake time!
update_page('KeptRevisions', 'second', '', 0, 0, 'username=BestContributorEver');
#sleep 120; # TODO implement fake time!
update_page('KeptRevisions', 'third');
update_page('KeptRevisions', 'fourth', '', 1);
update_page('KeptRevisions', 'fifth', '', 1);
@@ -50,6 +52,10 @@ test_page(get_page('action=browse revision=9 id=KeptRevisions'),
'Revision 9 not available \(showing current revision instead\)',
'fifth');
my ($ts2) = get_page('action=browse revision=2 id=KeptRevisions') =~ /edited (.*?) diff/ix;
my ($ts3) = get_page('action=browse revision=3 id=KeptRevisions') =~ /edited (.*?) diff/ix;
ok($ts2 ne $ts3, 'Revision timestamp or author is different');
# Disable cache and request the correct last major diff
test_page(get_page('action=browse diff=1 id=KeptRevisions cache=0'),
'Difference between revision 2 and revision 3',

107
wiki.pl
View File

@@ -231,8 +231,8 @@ sub InitConfig {
}
if ($ConfigPage) { # $FS and $MaxPost must be set in config file!
my ($status, $data) = ReadFile(GetPageFile(FreeToNormal($ConfigPage)));
my %data = ParseData($data); # before InitVariables so GetPageContent won't work
eval $data{text} if $data{text}; # perlcritic dislikes the use of eval here but we really mean it
my $page = ParseData($data); # before InitVariables so GetPageContent won't work
eval $page->{text} if $page->{text}; # perlcritic dislikes the use of eval here but we really mean it
$Message .= CGI::p("$ConfigPage: $@") if $@;
}
}
@@ -1384,7 +1384,8 @@ sub NewText {
sub BrowsePage {
my ($id, $raw, $comment, $status) = @_;
OpenPage($id);
my ($text, $revision, $summary) = GetTextRevision(GetParam('revision', ''));
my ($revisionPage, $revision) = GetTextRevision(GetParam('revision', ''));
my $text = $revisionPage->{text};
$text = NewText($id) unless $revision or $Page{revision}; # new text for new pages
# handle a single-level redirect
my $oldId = GetParam('oldid', '');
@@ -1414,13 +1415,13 @@ sub BrowsePage {
print GetHeader($id, NormalToFree($id), $oldId, undef, $status);
my $showDiff = GetParam('diff', 0);
if ($UseDiff and $showDiff) {
PrintHtmlDiff($showDiff, GetParam('diffrevision', $revision), $revision, $text, $summary);
PrintHtmlDiff($showDiff, GetParam('diffrevision', $revision), $revision, $text, $revisionPage->{summary});
print $q->hr();
}
PrintPageContent($text, $revision, $comment);
SetParam('rcclusteronly', $id) if FreeToNormal(GetCluster($text)) eq $id; # automatically filter by cluster
PrintRcHtml($id);
PrintFooter($id, $revision, $comment);
PrintFooter($id, $revision, $comment, $revisionPage);
}
sub ReBrowsePage {
@@ -1963,10 +1964,10 @@ sub DoRawHistory {
RcTextRevision($id, $Page{ts}, $Page{host}, $Page{username}, $Page{summary},
$Page{minor}, $Page{revision}, \@languages, undef, 1);
foreach my $revision (GetKeepRevisions($OpenPageName)) {
my %keep = GetKeptRevision($revision);
@languages = split(/,/, $keep{languages});
RcTextRevision($id, $keep{ts}, $keep{host}, $keep{username},
$keep{summary}, $keep{minor}, $keep{revision}, \@languages);
my $keep = GetKeptRevision($revision);
@languages = split(/,/, $keep->{languages});
RcTextRevision($id, $keep->{ts}, $keep->{host}, $keep->{username},
$keep->{summary}, $keep->{minor}, $keep->{revision}, \@languages);
}
}
@@ -1979,9 +1980,9 @@ sub DoHtmlHistory {
my $date = CalcDay($Page{ts});
my @html = (GetHistoryLine($id, \%Page, $row++, $rollback, $date, 1));
foreach my $revision (GetKeepRevisions($OpenPageName)) {
my %keep = GetKeptRevision($revision);
my $new = CalcDay($keep{ts});
push(@html, GetHistoryLine($id, \%keep, $row++, $rollback,
my $keep = GetKeptRevision($revision);
my $new = CalcDay($keep->{ts});
push(@html, GetHistoryLine($id, $keep, $row++, $rollback,
$new, $new ne $date));
$date = $new;
}
@@ -2383,7 +2384,7 @@ sub PrintPageContent {
}
sub PrintFooter {
my ($id, $rev, $comment) = @_;
my ($id, $rev, $comment, $page) = @_;
if (GetParam('embed', $EmbedWiki)) {
print $q->end_html, "\n";
return;
@@ -2400,11 +2401,11 @@ sub WrapperEnd { # called via @MyFooters
}
sub DefaultFooter { # called via @MyFooters
my ($id, $rev, $comment) = @_;
my ($id, $rev, $comment, $page) = @_;
my $html = $q->start_div({-class=>'footer'}) . $q->hr();
$html .= GetGotoBar($id) if GetParam('toplinkbar', $TopLinkBar) != 1;
$html .= GetFooterLinks($id, $rev);
$html .= GetFooterTimestamp($id, $rev);
$html .= GetFooterTimestamp($id, $rev, $page);
$html .= GetSearchForm() if GetParam('topsearchform', $TopSearchForm) != 1;
if ($DataDir =~ m|/tmp/|) {
$html .= $q->p($q->strong(T('Warning') . ': ')
@@ -2417,11 +2418,12 @@ sub DefaultFooter { # called via @MyFooters
}
sub GetFooterTimestamp {
my ($id, $rev) = @_;
if ($id and $rev ne 'history' and $rev ne 'edit' and $Page{revision}) {
my @elements = (($rev eq '' ? T('Last edited') : T('Edited')), TimeToText($Page{ts}),
Ts('by %s', GetAuthorLink($Page{host}, $Page{username})));
push(@elements, ScriptLinkDiff(2, $id, T('(diff)'), $rev)) if $UseDiff and $Page{revision} > 1;
my ($id, $rev, $page) = @_;
$page //= \%Page;
if ($id and $rev ne 'history' and $rev ne 'edit' and $page->{revision}) {
my @elements = (($rev eq '' ? T('Last edited') : T('Edited')), TimeToText($page->{ts}),
Ts('by %s', GetAuthorLink($page->{host}, $page->{username})));
push(@elements, ScriptLinkDiff(2, $id, T('(diff)'), $rev)) if $UseDiff and $page->{revision} > 1;
return $q->div({-class=>'time'}, @elements);
}
return '';
@@ -2536,8 +2538,12 @@ sub PrintHtmlDiff {
if (not $old and (not $diff or GetParam('cache', $UseCache) < 1)) {
if ($type == 1) {
$old = $Page{lastmajor} - 1;
($text, $new, $summary) = GetTextRevision($Page{lastmajor}, 1)
unless $new or $Page{lastmajor} == $Page{revision};
if (not $new and $Page{lastmajor} != $Page{revision}) {
my $revisionPage;
($revisionPage, $new) = GetTextRevision($Page{lastmajor}, 1);
$text = $revisionPage->{text};
$summary = $revisionPage->{summary};
}
} elsif ($new) {
$old = $new - 1;
} else {
@@ -2549,8 +2555,7 @@ sub PrintHtmlDiff {
$intro = Tss('Difference between revision %1 and %2', $old,
$new ? Ts('revision %s', $new) : T('current revision'));
} elsif ($type == 1 and $Page{lastmajor} and $Page{lastmajor} != $Page{revision}) {
my %keep = GetKeptRevision($Page{lastmajor});
$summary = $keep{summary};
$summary = GetKeptRevision($Page{lastmajor})->{summary};
$intro = Ts('Last major edit (%s)', ScriptLinkDiff(1, $OpenPageName, T('later minor edits'),
undef, $Page{lastmajor} || 1));
}
@@ -2571,10 +2576,10 @@ sub GetCacheDiff {
sub GetKeptDiff {
my ($new, $revision) = @_;
$revision ||= 1;
my ($old, $rev) = GetTextRevision($revision, 1);
my ($revisionPage, $rev) = GetTextRevision($revision, 1);
return '' unless $rev;
return T("The two revisions are the same.") if $old eq $new;
return GetDiff($old, $new, $rev);
return T("The two revisions are the same.") if $revisionPage->{text} eq $new;
return GetDiff($revisionPage->{text}, $new, $rev);
}
sub DoDiff { # Actualy call the diff program
@@ -2687,14 +2692,15 @@ sub ParseData {
$value =~ s/\n\t/\n/g;
$result{$key} = $value;
}
return %result;
# return unless %result; # undef instead of empty hash # TODO should we do that?
return wantarray ? %result : \%result; # return list sometimes for compatibility
}
sub OpenPage { # Sets global variables
my $id = shift;
return if $OpenPageName eq $id;
if ($IndexHash{$id}) {
%Page = ParseData(ReadFileOrDie(GetPageFile($id)));
%Page = %{ParseData(ReadFileOrDie(GetPageFile($id)))};
} else {
%Page = ();
$Page{ts} = $Now;
@@ -2709,42 +2715,40 @@ sub GetTextAtTime { # call with opened page, return $minor if all pages between
my $minor = $Page{minor};
return ($Page{text}, $minor, 0) if $Page{ts} <= $ts; # current page is old enough
return ($DeletedPage, $minor, 0) if $Page{revision} == 1 and $Page{ts} > $ts; # created after $ts
my %keep = (); # info may be needed after the loop
my $keep = {}; # info may be needed after the loop
foreach my $revision (GetKeepRevisions($OpenPageName)) {
%keep = GetKeptRevision($revision);
$minor = 0 if not $keep{minor} and $keep{ts} >= $ts; # ignore keep{minor} if keep{ts} is too old
return ($keep{text}, $minor, 0) if $keep{ts} <= $ts;
$keep = GetKeptRevision($revision);
# $minor = 0 unless defined $keep; # TODO?
$minor = 0 if not $keep->{minor} and $keep->{ts} >= $ts; # ignore keep{minor} if keep{ts} is too old
return ($keep->{text}, $minor, 0) if $keep->{ts} <= $ts;
}
return ($DeletedPage, $minor, 0) if $keep{revision} == 1; # then the page was created after $ts!
return ($keep{text}, $minor, $keep{ts}); # the oldest revision available is not old enough
return ($DeletedPage, $minor, 0) if $keep->{revision} == 1; # then the page was created after $ts!
return ($keep->{text}, $minor, $keep->{ts}); # the oldest revision available is not old enough
}
sub GetTextRevision {
my ($revision, $quiet) = @_;
$revision =~ s/\D//g; # Remove non-numeric chars
return ($Page{text}, $revision, $Page{summary}) unless $revision and $revision ne $Page{revision};
my %keep = GetKeptRevision($revision);
if (not %keep) {
return wantarray ? (\%Page, $revision) : \%Page unless $revision and $revision ne $Page{revision};
my $keep = GetKeptRevision($revision);
if (not defined $keep) {
$Message .= $q->p(Ts('Revision %s not available', $revision)
. ' (' . T('showing current revision instead') . ')') unless $quiet;
return ($Page{text}, '', '');
return wantarray ? (\%Page, '') : \%Page;
}
$Message .= $q->p(Ts('Showing revision %s', $revision)) unless $quiet;
return ($keep{text}, $revision, $keep{summary});
return wantarray ? ($keep, $revision) : $keep;
}
sub GetPageContent {
my $id = shift;
if ($IndexHash{$id}) {
my %data = ParseData(ReadFileOrDie(GetPageFile($id)));
return $data{text};
}
return ParseData(ReadFileOrDie(GetPageFile($id)))->{text} if $IndexHash{$id};
return '';
}
sub GetKeptRevision { # Call after OpenPage
my ($status, $data) = ReadFile(GetKeepFile($OpenPageName, (shift)));
return () unless $status;
return unless $status;
return ParseData($data);
}
@@ -2822,9 +2826,9 @@ sub ExpireKeepFiles { # call with opened page
return unless $KeepDays;
my $expirets = $Now - ($KeepDays * 86400); # 24*60*60
foreach my $revision (GetKeepRevisions($OpenPageName)) {
my %keep = GetKeptRevision($revision);
next if $keep{'keep-ts'} >= $expirets;
next if $KeepMajor and $keep{revision} == $Page{lastmajor};
my $keep = GetKeptRevision($revision);
next if $keep->{'keep-ts'} >= $expirets;
next if $KeepMajor and $keep->{revision} == $Page{lastmajor};
unlink GetKeepFile($OpenPageName, $revision);
}
}
@@ -3031,8 +3035,8 @@ sub DoEdit {
ReportError(T('Only administrators can upload files.'), '403 FORBIDDEN');
}
OpenPage($id);
my ($text, $revision) = GetTextRevision(GetParam('revision', ''), 1); # maybe revision reset!
my $oldText = $preview ? $newText : $text;
my ($revisionPage, $revision) = GetTextRevision(GetParam('revision', ''), 1); # maybe revision reset!
my $oldText = $preview ? $newText : $revisionPage->{text};
my $isFile = TextIsFile($oldText);
$upload //= $isFile;
if ($upload and not $UploadAllowed and not UserIsAdmin()) {
@@ -3110,7 +3114,8 @@ sub DoDownload {
my $id = shift;
OpenPage($id) if ValidIdOrDie($id);
print $q->header(-status=>'304 NOT MODIFIED') and return if FileFresh(); # FileFresh needs an OpenPage!
my ($text, $revision) = GetTextRevision(GetParam('revision', '')); # maybe revision reset!
my ($revisionPage, $revision) = GetTextRevision(GetParam('revision', '')); # maybe revision reset!
my $text = $revisionPage->{text};
if (my ($type, $encoding) = TextIsFile($text)) {
my ($data) = $text =~ /^[^\n]*\n(.*)/s;
my %allowed = map {$_ => 1} @UploadTypes;