diff -r 8f2446858dd3 MoinMoin/macro/Include.py
--- a/MoinMoin/macro/Include.py	Mon Mar 01 00:23:21 2010 +0100
+++ b/MoinMoin/macro/Include.py	Wed Apr 28 10:23:32 2010 +0200
@@ -32,12 +32,13 @@
 _arg_to = r'(,\s*to=(?P<tquote>[\'"])(?P<to>.+?)(?P=tquote))?'
 _arg_sort = r'(,\s*sort=(?P<sort>(ascending|descending)))?'
 _arg_items = r'(,\s*items=(?P<items>\d+))?'
+_arg_depth = r'(,\s*depth=(?P<depth>\d+))?'
 _arg_skipitems = r'(,\s*skipitems=(?P<skipitems>\d+))?'
 _arg_titlesonly = r'(,\s*(?P<titlesonly>titlesonly))?'
 _arg_editlink = r'(,\s*(?P<editlink>editlink))?'
-_args_re_pattern = r'^(?P<name>[^,]+)(%s(%s)?%s%s%s%s%s%s%s)?$' % (
+_args_re_pattern = r'^(?P<name>[^,]+)(%s(%s)?%s%s%s%s%s%s%s%s)?$' % (
     _arg_heading, _arg_level, _arg_from, _arg_to, _arg_sort, _arg_items,
-    _arg_skipitems, _arg_titlesonly, _arg_editlink)
+    _arg_skipitems, _arg_titlesonly, _arg_editlink, _arg_depth)
 
 _title_re = r"^(?P<heading>\s*(?P<hmarker>=+)\s.*\s(?P=hmarker))$"
 
@@ -99,7 +100,13 @@
     titlesonly = args.group('titlesonly')
     editlink = args.group('editlink')
 
+    if args.group("depth"):
+        depth = int(args.group('depth'))
+    else:
+        depth = 9999
+
     # iterate over pages
+    levelstack = []
     for inc_name in pagelist:
         if not request.user.may.read(inc_name):
             continue
@@ -143,28 +150,29 @@
                 result.append(_sysmsg % ('warning', 'Include: ' + _('Nothing found for "%s"!')) % to_re)
 
         if titlesonly:
-            levelstack = []
+            #levelstack = []
             for title, level in extract_titles(body[from_pos:to_pos], title_re):
-                if levelstack:
-                    if level > levelstack[-1]:
+                if not depth or (depth and level <= depth):
+                    if levelstack:
+                        if level > levelstack[-1]:
+                            result.append(macro.formatter.bullet_list(1))
+                            levelstack.append(level)
+                        else:
+                            while levelstack and level < levelstack[-1]:
+                                result.append(macro.formatter.bullet_list(0))
+                                levelstack.pop()
+                            if not levelstack or level != levelstack[-1]:
+                                result.append(macro.formatter.bullet_list(1))
+                                levelstack.append(level)
+                    else:
                         result.append(macro.formatter.bullet_list(1))
                         levelstack.append(level)
-                    else:
-                        while levelstack and level < levelstack[-1]:
-                            result.append(macro.formatter.bullet_list(0))
-                            levelstack.pop()
-                        if not levelstack or level != levelstack[-1]:
-                            result.append(macro.formatter.bullet_list(1))
-                            levelstack.append(level)
-                else:
-                    result.append(macro.formatter.bullet_list(1))
-                    levelstack.append(level)
-                result.append(macro.formatter.listitem(1))
-                result.append(inc_page.link_to(request, title))
-                result.append(macro.formatter.listitem(0))
-            while levelstack:
-                result.append(macro.formatter.bullet_list(0))
-                levelstack.pop()
+                    result.append(macro.formatter.listitem(1))
+                    result.append(inc_page.link_to(request, title))
+                    result.append(macro.formatter.listitem(0))
+            #while levelstack:
+            #    result.append(macro.formatter.bullet_list(0))
+            #    levelstack.pop()
             continue
 
         if from_pos or to_pos != -1:
@@ -228,6 +236,10 @@
             ])
         # XXX page.link_to is wrong now, it escapes the edit_icon html as it escapes normal text
 
+    while levelstack:
+        result.append(macro.formatter.bullet_list(0))
+        levelstack.pop()
+
     # return include text
     return ''.join(result)
 
