Merge branch 'master' into dependency-types
authorJoey Hess <joey@gnu.kitenet.net>
Mon, 5 Oct 2009 00:37:09 +0000 (20:37 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Mon, 5 Oct 2009 00:37:09 +0000 (20:37 -0400)
IkiWiki.pm
doc/bugs/transitive_dependencies.mdwn
doc/todo/dependency_types.mdwn

index c1d07531ee3488ba15f317ca84045adcd1c46d5d..9591a8160f5d24017f50fa5d968dabe2af1f3092 100644 (file)
@@ -1901,7 +1901,7 @@ sub pagespec_translate ($) {
                        [^\s()]+        # any other text
                )
                \s*             # ignore whitespace
-       }igx) {
+       }gx) {
                my $word=$1;
                if (lc $word eq 'and') {
                        $code.=' &&';
index 546f4f3aa1a752dc32bb6a53f087c9fb019e3ea9..9586bc9b02767a29ceaaa5050a034a6b0f0fff45 100644 (file)
@@ -1,5 +1,5 @@
 If a sidebar contains a map, or inline (etc), one would expect a
-change/add/remove of any of the mapped/inlined pages to cause a full wiki
+add/remove of any of the mapped/inlined pages to cause a full wiki
 rebuild. But this does not happen.
 
 If page A inlines page B, which inlines page C, a change to C will cause B
@@ -52,13 +52,17 @@ Downsides here:
   at least in my simple implementation, which re-runs the dependency
   resolution loop until no new pages are rebuilt.
   (I added an optimisation that gets it down to 1.5X as much work on
-  average, still 2x as much worst case.)
+  average, still 2x as much worst case. I suppose building a directed
+  graph and traversing it would be theoretically more efficient.)
 * Causes extra work for some transitive dependencies that we don't
-  actually care about. For example, changing index causes
+  actually care about. This is amelorated, but not solved by 
+  the current work on [[todo/dependency_types]].
+  For example, changing index causes
   plugins/brokenlinks to update in the first pass; if there's a second
-  pass, plugins/map is then updated, because it depends on plugins/brokenlinks.
+  pass, plugins/map is no longer updated (contentless dependencies FTW),
+  but plugins is, because it depends on plugins/brokenlinks.
   (Of course, this is just a special case of the issue that a real
-  modification to plugins/brokenlinks causes an unnecessary update of plugins/map,
-  because we have [[only_one_kind_of_dependency|todo/dependency_types]].)
+  modification to plugins/brokenlinks causes an unnecessary update of
+  plugins, and could be solved by adding more dependency types.)
 
 --[[Joey]] 
index 58b5ee955a2a0f05d47cd115031d1fccb6b9eda1..f13f1448eeded4732c356317b37471e90dd707db 100644 (file)
@@ -105,11 +105,11 @@ unnecessary page rebuilds:
 
 I propose the following. --[[Joey]] 
 
-* Add a second type of dependency, call it an "contentless dependency".
+* Add a second type of dependency, call it an "presence dependency".
 * `add_depends` defaults to adding a regular ("full") dependency, as
   before. (So nothing breaks.)
-* `add_depends($page, $spec, content => 0)` adds an contentless dependency.
-* `refresh` only looks at added/removed pages when resolving contentless
+* `add_depends($page, $spec, presence => 0)` adds an presence dependency.
+* `refresh` only looks at added/removed pages when resolving presence
   dependencies.
 
 This seems straightforwardly doable. I'd like [[Will]]'s feedback on it, if
@@ -129,28 +129,47 @@ I implemented the above in a branch.
 Then I found some problems:
 
 * Something simple like pagecount, that seems like it could use a
-  contentless dependency, can have a pagespec that uses metadata, like
+  presence dependency, can have a pagespec that uses metadata, like
   `author()` or `copyright()`.
-* pagestats, orphans and brokenlinks cannot use contentless dependencies
+* pagestats, orphans and brokenlinks cannot use presence dependencies
   because they need to update when links change.
 
-Now I'm thinking about having a contentless dependency look at page
+Now I'm thinking about having a special dependency look at page
 metadata, and fire if the metadata changes. And it seems links should
 either be included in that, or there should be a way to make a dependency
 that fires when a page's links change. (And what about backlinks?)
 
 It's easy to see when a page's links change, since there is `%oldlinks`.
 To see when metadata is changed is harder, since it's stored in the
-pagestate by the meta plugin.
+pagestate by the meta plugin. Also, there are many different types of
+metadata, that would need to be matched with the pagespecs somehow.
 
 Quick alternative: Make add_depends look at the pagespec. Ie, if it
-is a simple page name, or a glob, we know a contentless dependency
+is a simple page name, or a glob, we know a presence dependency
 can be valid. If's more complex, convert the dependency from
-contentless to full.
+presence to full.
 
-There is a lot to dislike about this method. Its parsing of the
-pagespec, as currently implemented, does not let plugins add new types of
-pagespecs that are contentless. Its pagespec parsing is also subject to
+There is a lot to dislike about this method. Its parsing of the pagespec,
+as currently implemented, does not let plugins add new types of pagespecs
+that only care about presence. Its pagespec parsing is also subject to
 false negatives (though these should be somewhat rare, and no false
 positives). Still, it does work, and it makes things like simple maps and
 pagecounts much more efficient.
+
+---- 
+
+Link dependencies:
+
+* `add_depends($page, $spec, links => 1, presence => 1)`
+  adds a links + presence dependency.
+* `refresh` only rebuilds a page with a links dependency if
+  pages matched by the pagespec gain or lose links. (What the link
+  actually points to may change independent of this, due to changes
+  elsewhere, without it firing.)
+* So, brokenlinks can fire whenever any links in any of the
+  pages it's tracking change, or when pages are added or
+  removed.
+
+TODO: How to determine if a pagespec is valid to be used with a links
+dependency? Use the same simple pagespecs that are valid for presence
+dependencies?