update, add spec for link dependencies

master
Joey Hess 2009-10-04 20:35:26 -04:00
parent d797b9ab0e
commit bcad00b046
1 changed files with 31 additions and 12 deletions

View File

@ -105,11 +105,11 @@ unnecessary page rebuilds:
I propose the following. --[[Joey]] 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 * `add_depends` defaults to adding a regular ("full") dependency, as
before. (So nothing breaks.) before. (So nothing breaks.)
* `add_depends($page, $spec, content => 0)` adds an contentless dependency. * `add_depends($page, $spec, presence => 0)` adds an presence dependency.
* `refresh` only looks at added/removed pages when resolving contentless * `refresh` only looks at added/removed pages when resolving presence
dependencies. dependencies.
This seems straightforwardly doable. I'd like [[Will]]'s feedback on it, if 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: Then I found some problems:
* Something simple like pagecount, that seems like it could use a * 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()`. `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. 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 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 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?) 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`. 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 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 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 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 There is a lot to dislike about this method. Its parsing of the pagespec,
pagespec, as currently implemented, does not let plugins add new types of as currently implemented, does not let plugins add new types of pagespecs
pagespecs that are contentless. Its pagespec parsing is also subject to that only care about presence. Its pagespec parsing is also subject to
false negatives (though these should be somewhat rare, and no false false negatives (though these should be somewhat rare, and no false
positives). Still, it does work, and it makes things like simple maps and positives). Still, it does work, and it makes things like simple maps and
pagecounts much more efficient. 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?