diff mercurial/hgweb/webcommands.py @ 31670:5e6d44511317

hgweb: handle a "linerange" request parameter in filelog command We now handle a "linerange" URL query parameter to filter filelog using a logic similar to followlines() revset. The URL syntax is: log/<rev>/<file>?linerange=<fromline>:<toline> As a result, filelog entries only consists of revision changing specified line range. The linerange information is propagated to "more"/"less" navigation links but not to numeric navigation links as this would apparently require a dedicated "revnav" class. Only update the "paper" template in this patch.
author Denis Laxalde <denis.laxalde@logilab.fr>
date Thu, 19 Jan 2017 17:41:00 +0100
parents f36dc643ffdc
children e540846c67e0
line wrap: on
line diff
--- a/mercurial/hgweb/webcommands.py	Sun Mar 26 16:51:19 2017 -0700
+++ b/mercurial/hgweb/webcommands.py	Thu Jan 19 17:41:00 2017 +0100
@@ -28,6 +28,7 @@
 
 from .. import (
     archival,
+    context,
     encoding,
     error,
     graphmod,
@@ -968,6 +969,8 @@
         except ValueError:
             pass
 
+    lrange = webutil.linerange(req)
+
     lessvars = copy.copy(tmpl.defaults['sessionvars'])
     lessvars['revcount'] = max(revcount / 2, 1)
     morevars = copy.copy(tmpl.defaults['sessionvars'])
@@ -996,24 +999,49 @@
         path = fctx.path()
         return webutil.diffs(web, tmpl, ctx, basectx, [path], diffstyle)
 
-    for i in revs:
-        iterfctx = fctx.filectx(i)
-        diffs = None
-        if patch:
-            diffs = diff(iterfctx)
-        entries.append(dict(
-            parity=next(parity),
-            filerev=i,
-            file=f,
-            diff=diffs,
-            rename=webutil.renamelink(iterfctx),
-            **webutil.commonentry(repo, iterfctx)))
-    entries.reverse()
+    linerange = None
+    if lrange is not None:
+        linerange = webutil.formatlinerange(*lrange)
+        # deactivate numeric nav links when linerange is specified as this
+        # would required a dedicated "revnav" class
+        nav = None
+        ancestors = context.blockancestors(fctx, *lrange)
+        for i, (c, lr) in enumerate(ancestors, 1):
+            diffs = None
+            if patch:
+                diffs = diff(c)
+            # follow renames accross filtered (not in range) revisions
+            path = c.path()
+            entries.append(dict(
+                parity=next(parity),
+                filerev=c.rev(),
+                file=path,
+                diff=diffs,
+                linerange=webutil.formatlinerange(*lr),
+                **webutil.commonentry(repo, c)))
+            if i == revcount:
+                break
+        lessvars['linerange'] = webutil.formatlinerange(*lrange)
+        morevars['linerange'] = lessvars['linerange']
+    else:
+        for i in revs:
+            iterfctx = fctx.filectx(i)
+            diffs = None
+            if patch:
+                diffs = diff(iterfctx)
+            entries.append(dict(
+                parity=next(parity),
+                filerev=i,
+                file=f,
+                diff=diffs,
+                rename=webutil.renamelink(iterfctx),
+                **webutil.commonentry(repo, iterfctx)))
+        entries.reverse()
+        revnav = webutil.filerevnav(web.repo, fctx.path())
+        nav = revnav.gen(end - 1, revcount, count)
 
     latestentry = entries[:1]
 
-    revnav = webutil.filerevnav(web.repo, fctx.path())
-    nav = revnav.gen(end - 1, revcount, count)
     return tmpl("filelog",
                 file=f,
                 nav=nav,
@@ -1021,6 +1049,7 @@
                 entries=entries,
                 patch=patch,
                 latestentry=latestentry,
+                linerange=linerange,
                 revcount=revcount,
                 morevars=morevars,
                 lessvars=lessvars,