detect pagespecs that require content dependencies
authorJoey Hess <joey@gnu.kitenet.net>
Sun, 4 Oct 2009 19:34:42 +0000 (15:34 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Sun, 4 Oct 2009 19:42:24 +0000 (15:42 -0400)
When adding a contentless dependency, the pagespec also needs to be one
that does not look at any page content information.

As a first approximation of that, only allow glob-based pagespecs in
contentless dependencies. While there are probably a few other types of
pagespecs that can match contentless, this will work for most of them.

IkiWiki.pm

index 67149bc8bda67ba83a3225273236aceb0156607e..56e2d4e714466931c76c5a62cf8e591a86ec6a60 100644 (file)
@@ -1774,7 +1774,8 @@ sub add_depends ($$;@) {
        my $deptype=$DEPEND_CONTENT | $DEPEND_EXISTS;
        if (@_) {
                my %params=@_;
        my $deptype=$DEPEND_CONTENT | $DEPEND_EXISTS;
        if (@_) {
                my %params=@_;
-               if (defined $params{content} && $params{content} == 0) {
+               if (defined $params{content} && $params{content} == 0 &&
+                   pagespec_contentless($pagespec)) {
                        $deptype=$deptype & ~$DEPEND_CONTENT;
                }
        }
                        $deptype=$deptype & ~$DEPEND_CONTENT;
                }
        }
@@ -1974,6 +1975,20 @@ sub pagespec_valid ($) {
        return ! $@;
 }
 
        return ! $@;
 }
 
+sub pagespec_contentless ($) {
+       my $spec=shift;
+
+       while ($spec=~m{
+               (\w+)\([^\)]*\) # only match pagespec functions
+       }igx) {
+               # only glob and internal can be matched contentless
+               # (first approximation)
+               return 0 if $1 ne "glob" && $1 ne "internal";
+       }
+
+       return 1;
+}
+
 sub glob2re ($) {
        my $re=quotemeta(shift);
        $re=~s/\\\*/.*/g;
 sub glob2re ($) {
        my $re=quotemeta(shift);
        $re=~s/\\\*/.*/g;