projects
/
ikiwiki.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
web commit by joey
[ikiwiki.git]
/
ikiwiki
diff --git
a/ikiwiki
b/ikiwiki
index 40356f1d35426acd67e96d38a3fb69d9e65aa47c..db0056aa4dcad553704468fe90aac778534a647a 100755
(executable)
--- a/
ikiwiki
+++ b/
ikiwiki
@@
-420,6
+420,10
@@
sub lockwiki () { #{{{
}
} #}}}
}
} #}}}
+sub unlockwiki () { #{{{
+ close WIKILOCK;
+} #}}}
+
sub loadindex () { #{{{
open (IN, "$config{srcdir}/.ikiwiki/index") || return;
while (<IN>) {
sub loadindex () { #{{{
open (IN, "$config{srcdir}/.ikiwiki/index") || return;
while (<IN>) {
@@
-457,19
+461,34
@@
sub rcs_update () { #{{{
}
} #}}}
}
} #}}}
-sub rcs_commit ($) { #{{{
+sub rcs_commit ($$) { #{{{
+ # Tries to commit the page; returns undef on _success_ and
+ # a version of the page with the rcs's conflict markers on failure.
+ # The file is relative to the srcdir.
my $message=shift;
my $message=shift;
+ my $file=shift;
if (-d "$config{srcdir}/.svn") {
if (-d "$config{srcdir}/.svn") {
+ # svn up to let svn merge in other changes
+ if (system("svn", "update", "$config{srcdir}/$file") != 0) {
+ warn("svn update failed\n");
+ }
if (system("svn", "commit", "--quiet", "-m",
possibly_foolish_untaint($message),
if (system("svn", "commit", "--quiet", "-m",
possibly_foolish_untaint($message),
-
$config{srcdir}
) != 0) {
+
"$config{srcdir}/$file"
) != 0) {
warn("svn commit failed\n");
warn("svn commit failed\n");
+ my $conflict=readfile("$config{srcdir}/$file");
+ if (system("svn", "revert", "$config{srcdir}/$file") != 0) {
+ warn("svn revert failed\n");
+ }
+ return $conflict;
}
}
}
}
+ return undef # success
} #}}}
sub rcs_add ($) { #{{{
} #}}}
sub rcs_add ($) { #{{{
+ # filename is relative to the root of the srcdir
my $file=shift;
if (-d "$config{srcdir}/.svn") {
my $file=shift;
if (-d "$config{srcdir}/.svn") {
@@
-1012,6
+1031,7
@@
sub cgi_editpage ($$) { #{{{
table => 0,
template => "$config{templatedir}/editpage.tmpl"
);
table => 0,
template => "$config{templatedir}/editpage.tmpl"
);
+ my @buttons=("Save Page", "Preview", "Cancel");
my ($page)=$form->param('page')=~/$config{wiki_file_regexp}/;
if (! defined $page || ! length $page || $page ne $q->param('page') ||
my ($page)=$form->param('page')=~/$config{wiki_file_regexp}/;
if (! defined $page || ! length $page || $page ne $q->param('page') ||
@@
-1039,6
+1059,7
@@
sub cgi_editpage ($$) { #{{{
else {
$form->tmpl_param("page_preview", "");
}
else {
$form->tmpl_param("page_preview", "");
}
+ $form->tmpl_param("page_conflict", "");
if (! $form->submitted || $form->submitted eq "Preview" ||
! $form->validate) {
if (! $form->submitted || $form->submitted eq "Preview" ||
! $form->validate) {
@@
-1095,7
+1116,7
@@
sub cgi_editpage ($$) { #{{{
$form->tmpl_param("can_commit", $config{svn});
$form->tmpl_param("indexlink", indexlink());
$form->tmpl_param("can_commit", $config{svn});
$form->tmpl_param("indexlink", indexlink());
- print $form->render(submit =>
["Save Page", "Preview", "Cancel"]
);
+ print $form->render(submit =>
\@buttons
);
}
else {
# save page
}
else {
# save page
@@
-1127,9
+1148,19
@@
sub cgi_editpage ($$) { #{{{
if ($newfile) {
rcs_add($file);
}
if ($newfile) {
rcs_add($file);
}
+ # prevent deadlock with post-commit hook
+ unlockwiki();
# presumably the commit will trigger an update
# of the wiki
# presumably the commit will trigger an update
# of the wiki
- rcs_commit($message);
+ my $conflict=rcs_commit($file, $message);
+
+ if (defined $conflict) {
+ $form->tmpl_param("page_conflict", 1);
+ $form->field("content", $conflict);
+ $form->field("do", "edit)");
+ print $form->render(submit => \@buttons);
+ return;
+ }
}
else {
loadindex();
}
else {
loadindex();