From 9b10f5eab22be36cf3b3a217076c76a669b4aafa Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kodama.kitenet.net>
Date: Sat, 23 Aug 2008 13:10:49 -0400
Subject: [PATCH] map: The fix for #449285 was buggy and broke display of
 parents in certian circumstances.

The use of $dummy was not sufficient, because it only stuck around for the
first element after a dummy parent, and was then lost. Instead, use a
$addparent that contains the actual dummy parent, so it can be compared
with the new item to see if we're still under that parent or have moved to
another one.
---
 IkiWiki/Plugin/map.pm                         | 11 ++--
 debian/changelog                              |  2 +
 ...s_inconsistent_about_bare_directories.mdwn | 52 +++----------------
 3 files changed, 14 insertions(+), 51 deletions(-)

diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm
index 4c2a15b01..18c584a30 100644
--- a/IkiWiki/Plugin/map.pm
+++ b/IkiWiki/Plugin/map.pm
@@ -80,7 +80,7 @@ sub preprocess (@) { #{{{
 	my $parent="";
 	my $indent=0;
 	my $openli=0;
-	my $dummy=0;
+	my $addparent="";
 	my $map = "<div class='map'>\n<ul>\n";
 	foreach my $item (sort keys %mapitems) {
 		my @linktext = (length $mapitems{$item} ? (linktext => $mapitems{$item}) : ());
@@ -88,17 +88,16 @@ sub preprocess (@) { #{{{
 			if defined $common_prefix && length $common_prefix;
 		my $depth = ($item =~ tr/\//\//) + 1;
 		my $baseitem=IkiWiki::dirname($item);
-		print STDERR "!! parent: $parent baseitem: $baseitem\n";
 		while (length $parent && length $baseitem && $baseitem !~ /^\Q$parent\E(\/|$)/) {
 			$parent=IkiWiki::dirname($parent);
-			last if !$dummy && length $parent && $baseitem =~ /^\Q$parent\E(\/|$)/;
+			last if length $addparent && $baseitem =~ /^\Q$addparent\E(\/|$)/;
+			$addparent="";
 			$indent--;
 			$map .= "</li>\n";
 			if ($indent > 0) {
 				$map .= "</ul>\n";
 			}
 		}
-		$dummy=0;
 		while ($depth < $indent) {
 			$indent--;
 			$map .= "</li>\n";
@@ -116,14 +115,14 @@ sub preprocess (@) { #{{{
 			}
 			if ($depth > $indent) {
 				$p.="/".shift(@bits);
-				#$p=~s/^\///;
+				$addparent=$p;
+				$addparent=~s/^\///;
 				$map .= "<li>"
 					.htmllink($params{page}, $params{destpage},
 						 "/".$common_prefix.$p, class => "mapparent",
 						 noimageinline => 1)
 					."\n";
 				$openli=1;
-				$dummy=1;
 			}
 			else {
 				$openli=0;
diff --git a/debian/changelog b/debian/changelog
index 25beb28ea..460ddc27f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -5,6 +5,8 @@ ikiwiki (2.62) UNRELEASED; urgency=low
     instead, and prompt if it fails.
   * Fix bug in wikiname sanitisation in the setup automator.
   * ikiwiki-makerepo: Added support for monotone. (Thomas Keller)
+  * map: The fix for #449285 was buggy and broke display of parents in certian
+    circumstances.
 
  -- Joey Hess <joeyh@debian.org>  Thu, 21 Aug 2008 16:20:58 -0400
 
diff --git a/doc/bugs/map_is_inconsistent_about_bare_directories.mdwn b/doc/bugs/map_is_inconsistent_about_bare_directories.mdwn
index dc2479e73..431a9938a 100644
--- a/doc/bugs/map_is_inconsistent_about_bare_directories.mdwn
+++ b/doc/bugs/map_is_inconsistent_about_bare_directories.mdwn
@@ -76,49 +76,11 @@ One solution could also use the [[plugins/autoindex]] plugin to make sure that p
 
 Note: This patch adds items to a map while it is in a foreach loop over a sorted list of keys from that same map.  Changing a map while iterating through it is normally problematic.  I'm assuming the sort insulates the code from this - I do not need to iterate over any of the newly added elements.
 
-    diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm
-    index 5b6a843..16de45e 100644
-    --- a/IkiWiki/Plugin/map.pm
-    +++ b/IkiWiki/Plugin/map.pm
-    @@ -67,6 +67,39 @@ sub preprocess (@) { #{{{
-     	# are removed.
-     	add_depends($params{page}, join(" or ", keys %mapitems));
-     
-    +	# Include all the parent directories in the map
-    +	my $lastbase="";
-    +	my $commonbase = "";
-    +	$commonbase = $common_prefix if defined $common_prefix && length $common_prefix;
-    +	foreach my $item (sort keys %mapitems) {
-    +		$item=~s/^\Q$common_prefix\E\///
-    +			if defined $common_prefix && length $common_prefix;
-    +		my $itembase=IkiWiki::dirname($item);
-    +		if ($itembase ne $lastbase) {
-    +			# find the common dir
-    +			my @a=split(/\//, $itembase);
-    +			my @b=split(/\//, $lastbase);
-    +			my $common_dir=$commonbase;
-    +			while (@a && @b && $a[0] eq $b[0]) {
-    +				if (length $common_dir) {
-    +					$common_dir.="/";
-    +				}
-    +				$common_dir.=shift(@a);
-    +				shift @b;
-    +			}
-    +			# add all the dirs down to the current base
-    +			while (@a) {
-    +				if (length $common_dir) {
-    +					$common_dir.="/";
-    +				}
-    +				$common_dir.=shift(@a);
-    +				$mapitems{$common_dir}=''
-    +					unless defined $mapitems{$common_dir};
-    +			}
-    +			$lastbase = $itembase;
-    +		}
-    +	}
-    +
-     	# Create the map.
-     	my $parent="";
-     	my $indent=0;
-
 -- [[users/Will]]
+
+> The patch is subtly buggy and just papers over the actual bug with a
+> lot of extra code. Thanks for trying to come up with a patch for this
+> annyoingly complicated bug.. I think I've fixed the underlying bug now.
+> --[[Joey]]
+> 
+> [[tag done]]
-- 
2.39.5