safe => 0, # hooks into perl module internals
rebuild => 0,
},
+ useragent => {
+ type => "string",
+ default => undef,
+ example => "Wget/1.13.4 (linux-gnu)",
+ description => "set custom user agent string for outbound HTTP requests e.g. when fetching aggregated RSS feeds",
+ safe => 0,
+ rebuild => 0,
+ },
}
sub defaultconfig () {
}
my $log_open=0;
+my $log_failed=0;
sub log_message ($$) {
my $type=shift;
Sys::Syslog::openlog('ikiwiki', '', 'user');
$log_open=1;
}
- return eval {
- Sys::Syslog::syslog($type, "[$config{wikiname}] %s", join(" ", @_));
+ eval {
+ # keep a copy to avoid editing the original config repeatedly
+ my $wikiname = $config{wikiname};
+ utf8::encode($wikiname);
+ Sys::Syslog::syslog($type, "[$wikiname] %s", join(" ", @_));
};
+ if ($@) {
+ print STDERR "failed to syslog: $@" unless $log_failed;
+ $log_failed=1;
+ print STDERR "@_\n";
+ }
+ return $@;
}
elsif (! $config{cgi}) {
return print "@_\n";
push @params, $val, '';
}
}
- if ($preprocessing{$page}++ > 3) {
+ if ($preprocessing{$page}++ > 8) {
# Avoid loops of preprocessed pages preprocessing
# other pages that preprocess them, etc.
return "[[!$command <span class=\"error\">".
return LWP::UserAgent->new(
cookie_jar => $config{cookiejar},
env_proxy => 1, # respect proxy env vars
+ agent => $config{useragent},
);
}
my @pages;
foreach my $detail (@{ $ci->{'details'} }) {
my $file = $detail->{'file'};
- my $efile = uri_escape_utf8($file);
+ my $efile = join('/',
+ map { uri_escape_utf8($_) } split('/', $file)
+ );
my $diffurl = defined $config{'diffurl'} ? $config{'diffurl'} : "";
$diffurl =~ s/\[\[file\]\]/$efile/go;
my $ua;
eval q{use LWPx::ParanoidAgent};
if (! $@) {
- $ua=LWPx::ParanoidAgent->new;
+ $ua=LWPx::ParanoidAgent->new(agent => $config{useragent});
}
else {
$ua=useragent();
my $ua;
eval q{use LWPx::ParanoidAgent};
if (!$@) {
- $ua=LWPx::ParanoidAgent->new;
+ $ua=LWPx::ParanoidAgent->new(agent => $config{useragent});
}
else {
eval q{use LWP};
if ($template->query(name => "lang_code")) {
$template->param(lang_code => $lang_code);
}
+ if ($template->query(name => "html_lang_code")) {
+ $template->param(html_lang_code => htmllangcode($lang_code));
+ }
+ if ($template->query(name => "html_lang_dir")) {
+ $template->param(html_lang_dir => htmllangdir($lang_code));
+ }
if ($template->query(name => "lang_name")) {
$template->param(lang_name => languagename($lang_code));
}
return $master_language_code;
}
+sub htmllangcode ($) {
+ (my $lang = shift) =~ tr/_/-/;
+ return $lang;
+}
+
+sub htmllangdir ($) {
+ my $lang = shift;
+ if ($lang =~ /^(ar|fa|he)/) {
+ return 'rtl';
+ }
+ return 'ltr';
+}
+
sub islanguagecode ($) {
my $code=shift;
push @ret, {
url => urlto_with_orig_beautiful_urlpath(masterpage($page), $page),
code => $master_language_code,
+ html_code => htmllangcode($master_language_code),
+ html_dir => htmllangdir($master_language_code),
language => $master_language_name,
master => 1,
};
push @ret, {
url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
code => $lang,
+ html_code => htmllangcode($lang),
+ html_dir => htmllangdir($lang),
language => languagename($lang),
percent => percenttranslated($otherpage),
}
+ikiwiki (3.20140126) UNRELEASED; urgency=medium
+
+ * Added useragent config setting. Closes: #737121
+ Thanks, Tuomas Jormola
+ * po: Add html_lang_code and html_lang_dir template variables
+ for the language code and direction of text.
+ Thanks, Mesar Hameed
+ * Allow up to 8 levels of nested directives, rather than previous 3
+ in directive infinite loop guard.
+ * git diffurl: Do not escape / in paths to changed files, in order to
+ interoperate with cgit (gitweb works either way)
+ Thanks, intrigeri.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 01 Feb 2014 16:53:35 -0400
+
ikiwiki (3.20140125) unstable; urgency=medium
* inline: Allow overriding the title of the feed. Closes: #735123
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/git-push-origin-master
+ browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/git-push-origin-master"
+ author="[[smcv]]"]]
+[[!tag patch]]
+
+git's behaviour when doing "git push origin" is configurable, and the
+default is going to change in 2.0. In particular, if you've set
+push.default to "nothing" (the "explicit is better than implicit" option),
+the regression test will warn:
+
+ fatal: You didn't specify any refspecs to push, and push.default
+ is "nothing".
+ 'git push origin' failed: at .../lib/IkiWiki/Plugin/git.pm line 220.
+
+The solution is to do "git push origin master" instead (but with the
+configured remote and branch names). --[[smcv]]
> > I have a stupid [[patch]] in my git repo which just appends a semicolon to the `::magic()` output, but maybe this should be done in another way...
> >
> > --[[anarcat]]
+
+> > > If the regex match isn't necessary and it's just about deleting the
+> > > parameters, I think I'd prefer something like
+> > >
+> > > if (! defined $mimetype) {
+> > > ...
+> > > }
+> > > $mimetype =~ s/;.*//;
+> > >
+> > > but I'd be hesitant to do that without knowing why Joey implemented it
+> > > the way it is. If it's about catching a result from file(1) that
+> > > is not, in fact, a MIME type at all (empty string or error message
+> > > or something), maybe something more like this?
+> > >
+> > > if (! defined $mimetype || $mimetype !~ s{[-\w]+/[-\w]+(?:;.*)?}{})
+> > >
+> > > (or whatever the allowed characters in MIME types are). --[[smcv]]
> > > Right, I know that. The trick is to find the rabbit hole. :P
> > >
> > > And I found it. With my dev/proxy-utf8-fail, this doesn't fail anymore. Yay, a [[patch]] ready for commit! --[[anarcat]]
+
+> > > > I don't see that branch in your git repo, could you repost it please?
+> > > > (I'm trying to review some of the pending patches.) --[[smcv]]
--- /dev/null
+On this wiki, editing `templates/gitbranch.mdwn` causes a really slow
+refresh, orders of magnitude slower than a full rebuild: a large number of
+pages depend on that template, or link to a page that embeds that template,
+and so on.
+
+I suspect that, as with my optimization pass for `album`'s benefit, the
+costly thing is evaluating lots of pagespecs. I'm profiling it to see
+whether the problem is there are any low-hanging fruit.
+
+Easy to reproduce offline:
+
+* comment out the `exclude` option in `docwiki.setup`
+* `/usr/bin/perl -Iblib/lib ikiwiki.in -setup docwiki.setup -rebuild`
+* `touch templates/gitbranch.mdwn`
+* `/usr/bin/perl -Iblib/lib ikiwiki.in -setup docwiki.setup -refresh`
+
+--[[smcv]]
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/careful-eval author="[[smcv]]"
+ browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/careful-eval"]]
+[[!tag patch]]
+
+As noted in the [[!cpan Try::Tiny]] man page, eval/$@ can be quite
+awkward in corner cases, because $@ has the same properties and problems
+as C's errno. While writing a regression test for definetemplate
+in which it couldn't find an appropriate template, I received
+
+ <span class="error">Error: failed to process template
+ <span class="createlink">deftmpl</span> </span>
+
+instead of the intended
+
+ <span class="error">Error: failed to process template
+ <span class="createlink">deftmpl</span> template deftmpl not
+ found</span>
+
+which turned out to be because the "catch"-analogous block called
+gettext before it used $@, and gettext can call define_gettext,
+which uses eval.
+
+Fixed in my branch smcv/ready/careful-eval. Another possibility
+for fixing this would be to depend on something like Try::Tiny,
+which is already indirectly recommended by ikiwiki, because
+[[!cpan RPC::XML]], [[!cpan XML::Feed]], etc., depend on it.
+--[[smcv]]
> --[[smcv]]
> No follow-up or objection for a while, so considering this to
-> be [[working as designed|done]]. --[[smcv]]
+> be working as designed. --[[smcv]]
+
+> > Seems I'm a bit late to butt in, but would it be possible to have two
+> > further phases after the scan phase, the first running map and inline
+> > and the second orphan? Then map and inline could log or register their
+> > links (obviously somewhere were it won't change the result of the link function)
+> > and orphan could take them into account. This logging could be
+> > turned on by parameter to not waste time for users not needing this and
+> > make it tunable (i.e. so that the user can decide which map directives count and which don't)
+> >
+> > For someone using map and especially autoindex the output of the orphans directive
+> > is simply wrong/useless (at least it is for me). And there is no easy workaround like for listdirectives
+> > -- [[holger]]
+
+>>> Hmm. I think this can be done without introducing any "phases",
+>>> even, but it would require each plugin that generates links according
+>>> to a pagespec to have either a conditional call into the orphans plugin,
+>>> or a call to a new core function in ikiwiki that exists solely to
+>>> support the orphans plugin. Something like this, maybe:
+>>>
+>>> # in map.pm, inline.pm, pagestats.pm etc., at scan time
+>>> if (IkiWiki::Plugin::orphans->can("add_reachable")) {
+>>> IkiWiki::Plugin::orphans::add_reachable($page, $pagespec);
+>>> }
+>>>
+>>> # in orphans.pm (pseudocode; note that this does not *evaluate*
+>>> # $pagespec, only stores it, so it's OK to do this at scan time)
+>>> sub needsbuild ($pages)
+>>> for each page in $pages
+>>> clear $pagestate{location}{orphans}{reachable}
+>>> sub reachable ($location, $pagespec)
+>>> add $pagespec to @{$pagestate{location}{orphans}{reachable}}
+>>>
+>>> # in preprocess function in orphans.pm (pseudocode)
+>>> # executed at build time, not at scan time, so pagespecs work
+>>>
+>>> for each maybe_orphan with no links to it
+>>> for each location with a list of reachable pagespecs
+>>> make the page with the orphans directive depend on \
+>>> the page that is the location
+>>> for each of those pagespecs
+>>> if pagespec matches orphan
+>>> take orphan off the list
+>>> go to next orphan
+>>> output list of orphans
+>>>
+>>> (Maybe parentlinks should also annotate the parent/ancestors of
+>>> each page as reachable from that page.)
+>>>
+>>> Do other people (mainly Joey) think that'd be acceptable, or
+>>> too intrusive?
+>>>
+>>> Taking this off the list of resolved bugs again while we think about it.
+>>>
+>>> I suspect that in the presence of autoindex, what you really want might
+>>> be less "there's a link to it" and more "there's a path to it from
+>>> the root of the wiki", which is why I called the proposed function
+>>> "add_reachable". On the other hand, maybe that's too computationally
+>>> intensive to actually do; I haven't tried it.
+>>> --[[smcv]]
> I never noticed this bug, since it only happens if the htmlscrubber is
> disabled. --[[Joey]]
+
+>> My `templatebody` branch on [[template creation error]] fixes this.
+>> --[[smcv]]
</pre></code>
[[!tag patch]]
+
+> [[Seems reasonable|users/smcv/yesplease]] --smcv
+
+>> [[done]] --[[Joey]]
> I have improved a little the error handling in log_message() so that we see *something* when syslog fails, see the branch documented above. I can also confirm that reverting [[todo/syslog_should_show_wiki_name]] fixes the bug. Finally, I have a unit test that reproduces the problem in git, and a working [[!taglink patch]] for the bug, again in git.
>
> > One last note: I noticed that this problem also happens elsewhere in ikiwiki. For example, the [[plugins/notifyemail]] plugin will silently fail to send notifications if the pages contain unicode. The [[plugins/notifychanges]] plugin I am working on (in [[todo/option to send only the diff in notifyemail]]) seems to be working around the issue so far, but there's no telling which similar problem are out there.
+
+>> [[I'd merge it|/users/smcv/yesplease]]. --[[smcv]]
+
+>>> I've merged it, but I don't feel it fixes this bug. --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/template-syntax-test
+ browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/template-syntax-test"
+ author="[[smcv]]"]]
+[[!tag patch]]
+
+`t/template_syntax.t` looks as though it's meant to check the syntax of
+`doc/templates/*.mdwn` as well as `templates/*.tmpl`, but it doesn't.
+Patch in my git repository. --[[smcv]]
>
> --[[smcv]]
->> [[!template id=gitbranch author="[[smcv]]" branch=smcv/definetemplate]]
->> [[!tag patch]]
>> OK, here is a branch implementing what I said. It adds the `definetemplate`
>> directive to [[plugins/goodstuff]] as its last commit.
>>
>>>>> the right thing to do in this situation.
>>>>>
>>>>> --[[chrysn]]
+
+>>>>>> [[!template id=gitbranch author="[[smcv]]" branch=smcv/ready/templatebody
+ browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/templatebody]]
+>>>>>> [[!tag patch]]
+>>>>>> Branch and directive renamed to `ready/templatebody` as chrysn suggested.
+>>>>>> It's on-by-default now (or will be if that branch is merged).
+>>>>>> Joey, any chance you could review this?
+>>>>>>
+>>>>>> There is one known buglet: `template_syntax.t` asserts that the entire
+>>>>>> file is a valid HTML::Template, whereas it would ideally be doing the
+>>>>>> same logic as IkiWiki itself. I don't think that's serious. --[[smcv]]
-<span class="infobox">
+<div class="infobox">
Available in a [[!taglink /git]] repository [[!taglink branch|/branches]].<br />
-Branch: <TMPL_VAR branch><br />
-Author: <TMPL_VAR author><br />
-</span>
+Branch: <TMPL_IF browse><a href="<TMPL_VAR browse>"></TMPL_IF><TMPL_VAR branch><TMPL_IF browse></a></TMPL_IF><br />
+<TMPL_IF author>Author: <TMPL_VAR author><br /></TMPL_IF>
+</div>
<TMPL_UNLESS branch>
This template is used to create an infobox for a git branch. It uses
these parameters:
Regards,
-- [[Louis|spalax]]
+
+> Saved to my git repository as `contrib/spalax/pagestats-disp`.
+> I'd rather find a better name than `disp` for the parameter.
+> I think `display` would be an improvement, but that doesn't solve the
+> problem of "it's a synonym for show, and non-obvious which is which".
+> Maybe `linktext`?
+>
+> It's unfortunate that `map` and `pagestats` have different meanings for
+> the `show` parameter. I'm tempted to propose a patch that adds something
+> like `limit` (by analogy with SQL) or `max` as the canonical name for the
+> "number of things to match" parameter, at which point a non-numeric
+> `show` could mean this thing. --[[smcv]]
+[[!template id=gitbranch branch=anderbubble/edittemplate author="Jonathon Anderson"]]
[[!tag wishlist patch]]
I use a default template for all new pages:
Changes to the structure of `$pagestate{$registering_page}{edittemplate}{$pagespec}` mean that a `cgi` rebuild is necessary (for reasons I don't entirely understand); but I think that's preferable to creating an entirely separate `$pagestate` namespace for storing parameters. That said, I'm not really a perl programmer, so corrections are welcome.
> I like this patch. I hate seeing things I've already read get marked as unread in my rss feed. -- [[JoshBBall]]
+
+>> (I don't have commit access so take this with a pinch of salt -
+>> I'm just trying to help deal with the code-review backlog.)
+>>
+>> I mostly like the first and third patches in the branch (adding v4
+>> (random) UUIDs, and adding the timestamps). I'd be tempted to rename
+>> `time` and `formatted_time` to `iso_time` and `time`, but that's
+>> a matter of taste, and perhaps people with commit access have
+>> stronger opinions one way or another. I haven't researched
+>> whether there's precendent for any particular naming style
+>> elsewhere in ikiwiki.
+>>
+>> The UUID bit would require adding some reference to libuuid-tiny-perl
+>> to the Debian packaging - I think a `Recommends` is too strong
+>> but a `Suggests` seems OK.
+>>
+>> I don't like the second patch (adding URL-namespaced UUID support).
+>> I'm having a hard time thinking of any situation in which a v4 UUID
+>> would be unsuitable, which means it's unnecessary complexity.
+>> FYI, the reason that it makes a rebuild is necessary is that
+>> you've restructured `$pagestate`, which is carried over from one
+>> refresh to the next (that's its purpose), and you haven't
+>> built in any migration or backwards-compatibility code that will
+>> cope with it being in the old format. My inclination would be to
+>> drop that patch. If there's a really good reason to prefer
+>> v3/v5 UUIDs, please describe it and I'll try to suggest some
+>> better way based on that, maybe global configuration in `$config`.
+>> --[[smcv]]
2. Content can correctly be tagged with the language code, to enable screenreaders and other accessibility providers to render/speak the text in the correct language.
The [[patch]] is currently being used on http://addons.nvda-project.org and seems to work well. --[[mhameed]]
+
+> I don't have commit access, but it [[seems reasonable|/users/smcv/yesplease]].
+> --[[smcv]]
+
+>> [[done]]] --[[Joey]]
the ability to hierarchically organize blog posts and automatically generate
structural pages for year, month, or day. Please apply. --Ethan
+> This looks a lot like [[plugins/autoindex]], except limited to a subset
+> of pages, and with different templates according to the page it's used
+> on. Perhaps it could become several enhancements for autoindex? --[[smcv]]
+
+----
+
<pre>
Index: IkiWiki/Render.pm
===================================================================
>>>> Ping? --[[intrigeri]]
+>>>> Normally, my tendency towards pedantic preservation of existing APIs
+>>>> would make me implement a new token \[[file_less_escaped]] or
+>>>> something, analogous to `%s` vs. `%S` in [[shortcuts]]; but
+>>>> gitweb and cgit are both OK with `/` not being escaped, whereas
+>>>> only gitweb allows it to be escaped as `%2F`, so I think your
+>>>> solution is fine. Also, it would need a much better name than
+>>>> \[[file_less_escaped]], and I can't think of one.
+>>>>
+>>>> I don't have commit access to ikiwiki.info, but if I did,
+>>>> [[I'd merge this|/users/smcv/yesplease]]. --[[smcv]]
+
+>>>>> [[merged|done]] --[[Joey]]
+
[[wishlist]]
[[!tag patch]]
--- /dev/null
+I'm sysadmin at a german university.
+
+I'm using ikiwiki as personal wiki at work and at home.
* gitweb: http://git.pseudorandom.co.uk/smcv/ikiwiki.git
* anongit: git://git.pseudorandom.co.uk/git/smcv/ikiwiki.git
-Currently thinking about a [[users/smcv/gallery]] plugin.
+Recently tried to [[help with the review backlog|yesplease]].
--- /dev/null
+A tag for patches that I would merge if I had commit access to ikiwiki,
+in the hope that it's a useful shortlist for committers to look at.
+They're mirrored in my git repository under the `ready/*` namespace.
+
+[[!inline pages="(todo/* or bugs/*) and link(patch) and !link(bugs/done) and
+ !link(todo/done) and link(users/smcv/yesplease) and !*/Discussion"
+ archive="yes"]]
die $@;
}
}
-use Test::More tests => 18;
+use Test::More tests => 22;
BEGIN { use_ok("IkiWiki"); }
%config=IkiWiki::defaultconfig();
$config{rcs} = "git";
$config{srcdir} = "$dir/src";
+$config{diffurl} = '/nonexistent/cgit/plain/[[file]]';
IkiWiki::loadplugins();
IkiWiki::checkconfig();
IkiWiki::rcs_remove("newdir/test5.mdwn");
IkiWiki::rcs_commit_staged(message => "Remove the 5th page");
+# diffurl escaping
+ok(mkdir($config{srcdir}."/diffurl_dir"));
+my $test3 = readfile("t/test1.mdwn");
+writefile('test3.mdwn', $config{srcdir}."/diffurl_dir", $test3);
+IkiWiki::rcs_add("diffurl_dir/test3.mdwn");
+IkiWiki::rcs_commit(
+ file => "diffurl_dir/test3.mdwn",
+ message => "Added a page in diffurl_dir",
+ token => "moo",
+);
+
+@changes = IkiWiki::rcs_recentchanges(5);
+
+is($#changes, 4);
+is($changes[0]{pages}[0]{"page"}, "diffurl_dir/test3");
+
+unlike(
+ $changes[0]{pages}[0]{"diffurl"},
+ qr{%2F}m,
+ q{path separators are preserved when UTF-8scaping filename}
+);
+
system "rm -rf $dir";
--- /dev/null
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More tests => 5;
+use utf8;
+
+BEGIN { use_ok("IkiWiki"); }
+
+$IkiWiki::config{verbose} = 1;
+$IkiWiki::config{syslog} = 1;
+
+$IkiWiki::config{wikiname} = 'ASCII';
+is(debug('test'), '', 'plain ASCII syslog');
+$IkiWiki::config{wikiname} = 'not â’¶SCII';
+is(debug('test'), '', 'UTF8 syslog');
+my $orig = $IkiWiki::config{wikiname};
+is(debug('test'), '', 'check for idempotency');
+is($IkiWiki::config{wikiname}, $orig, 'unchanged config');