# HG changeset patch # User Matt Mackall # Date 1161129277 18000 # Node ID 357b5589dc62a0037e8460d46456f531768c1c51 # Parent 2576b6731524789435d590df4868498cde24048c# Parent 5207cf649abe173239db83cabf68ea8dedddfd77 Merge with crew diff --git a/mercurial/commands.py b/mercurial/commands.py diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -256,10 +256,16 @@ class filectx(object): return [ getctx(p, n) for p, n in pl if n != -1 ] + # use linkrev to find the first changeset where self appeared + if self.rev() != self._filelog.linkrev(self._filenode): + base = self.filectx(self.filerev()) + else: + base = self + # find all ancestors - needed = {self: 1} - visit = [self] - files = [self._path] + needed = {base: 1} + visit = [base] + files = [base._path] while visit: f = visit.pop(0) for p in parents(f): diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py --- a/mercurial/hgweb/hgweb_mod.py +++ b/mercurial/hgweb/hgweb_mod.py @@ -28,6 +28,41 @@ def _up(p): return "/" return up + "/" +def revnavgen(pos, pagelen, limit): + def seq(factor, limit=None): + if limit: + yield limit + if limit >= 20 and limit <= 40: + yield 50 + else: + yield 1 * factor + yield 3 * factor + for f in seq(factor * 10): + yield f + + def nav(**map): + l = [] + last = 0 + for f in seq(1, pagelen): + if f < pagelen or f <= last: + continue + if f > limit: + break + last = f + if pos + f < limit: + l.append(("+%d" % f, pos + f)) + if pos - f >= 0: + l.insert(0, ("-%d" % f, pos - f)) + + yield {"label": "(0)", "rev": 0} + + for label, rev in l: + yield {"label": label, "rev": rev} + + yield {"label": "tip", "rev": "tip"} + + return nav + class hgweb(object): def __init__(self, repo, name=None): if type(repo) == type(""): @@ -149,41 +184,6 @@ class hgweb(object): opts=diffopts), f, tn) def changelog(self, ctx, shortlog=False): - pos = ctx.rev() - def changenav(**map): - def seq(factor, maxchanges=None): - if maxchanges: - yield maxchanges - if maxchanges >= 20 and maxchanges <= 40: - yield 50 - else: - yield 1 * factor - yield 3 * factor - for f in seq(factor * 10): - yield f - - l = [] - last = 0 - maxchanges = shortlog and self.maxshortchanges or self.maxchanges - for f in seq(1, maxchanges): - if f < maxchanges or f <= last: - continue - if f > count: - break - last = f - r = "%d" % f - if pos + f < count: - l.append(("+" + r, pos + f)) - if pos - f >= 0: - l.insert(0, ("-" + r, pos - f)) - - yield {"rev": 0, "label": "(0)"} - - for label, rev in l: - yield {"label": label, "rev": rev} - - yield {"label": "tip", "rev": "tip"} - def changelist(**map): parity = (start - end) & 1 cl = self.repo.changelog @@ -210,10 +210,13 @@ class hgweb(object): maxchanges = shortlog and self.maxshortchanges or self.maxchanges cl = self.repo.changelog count = cl.count() + pos = ctx.rev() start = max(0, pos - maxchanges + 1) end = min(count, start + maxchanges) pos = end - 1 + changenav = revnavgen(pos, maxchanges, count) + yield self.t(shortlog and 'shortlog' or 'changelog', changenav=changenav, node=hex(cl.tip()), @@ -306,12 +309,17 @@ class hgweb(object): f = fctx.path() fl = fctx.filelog() count = fl.count() + pagelen = self.maxshortchanges + pos = fctx.filerev() + start = max(0, pos - pagelen + 1) + end = min(count, start + pagelen) + pos = end - 1 def entries(**map): l = [] parity = (count - 1) & 1 - for i in range(count): + for i in range(start, end): ctx = fctx.filectx(i) n = fl.node(i) @@ -330,7 +338,9 @@ class hgweb(object): for e in l: yield e - yield self.t("filelog", file=f, node=hex(fctx.node()), entries=entries) + nav = revnavgen(pos, pagelen, count) + yield self.t("filelog", file=f, node=hex(fctx.node()), nav=nav, + entries=entries) def filerevision(self, fctx): f = fctx.path() @@ -553,8 +563,8 @@ class hgweb(object): def filediff(self, fctx): n = fctx.node() path = fctx.path() - parents = fctx.changectx().parents() - p1 = parents[0].node() + parents = fctx.parents() + p1 = parents and parents[0].node() or nullid def diff(**map): yield self.diff(p1, n, [path]) diff --git a/templates/filelog.tmpl b/templates/filelog.tmpl --- a/templates/filelog.tmpl +++ b/templates/filelog.tmpl @@ -17,6 +17,8 @@

#file|escape# revision history

+

navigate: {nav%filenaventry}

+ #entries%filelogentry# #footer# diff --git a/templates/gitweb/filelog.tmpl b/templates/gitweb/filelog.tmpl --- a/templates/gitweb/filelog.tmpl +++ b/templates/gitweb/filelog.tmpl @@ -19,6 +19,9 @@ revisions | annotate | diff | rss
+ +
+{nav%filenaventry}
#file|urlescape#
diff --git a/templates/gitweb/map b/templates/gitweb/map --- a/templates/gitweb/map +++ b/templates/gitweb/map @@ -7,6 +7,7 @@ summary = summary.tmpl error = error.tmpl naventry = '#label|escape# ' navshortentry = '#label|escape# ' +filenaventry = '{label|escape} ' filedifflink = '#file|escape# ' filenodelink = '#file|escape#file | annotate | diff | revisions' fileellipses = '...' @@ -41,9 +42,9 @@ tagentry = '< diffblock = '
#lines#
' changelogtag = 'tag:#tag|escape#' changesettag = 'tag#tag|escape#' -filediffparent = 'parent #rev#:#node|short#' +filediffparent = 'parent {rev}:{node|short}' filelogparent = 'parent #rev#: #node|short#' -filediffchild = 'child #rev#:#node|short#' +filediffchild = 'child {rev}:{node|short}' filelogchild = 'child #rev#: #node|short#' shortlog = shortlog.tmpl shortlogentry = '#date|age# ago#author##desc|strip|firstline|escape#changeset | manifest' diff --git a/templates/map b/templates/map --- a/templates/map +++ b/templates/map @@ -7,6 +7,7 @@ shortlog = shortlog.tmpl shortlogentry = shortlogentry.tmpl naventry = '#label|escape# ' navshortentry = '#label|escape# ' +filenaventry = '{label|escape} ' filedifflink = '#file|escape# ' filenodelink = '#file|escape# ' fileellipses = '...' diff --git a/templates/footer.tmpl b/templates/old/footer.tmpl copy from templates/footer.tmpl copy to templates/old/footer.tmpl diff --git a/templates/rss/filelogentry.tmpl b/templates/rss/filelogentry.tmpl --- a/templates/rss/filelogentry.tmpl +++ b/templates/rss/filelogentry.tmpl @@ -3,5 +3,5 @@ #url#?f=#node|short#;file=#file|urlescape# #author|obfuscate# - #date|rfc822date#> + #date|rfc822date# diff --git a/tests/test-annotate b/tests/test-annotate --- a/tests/test-annotate +++ b/tests/test-annotate @@ -71,3 +71,6 @@ echo d >> b hg ci -mmerge2 -d '4 0' echo % annotate after rename merge hg annotate -nf b + +echo % linkrev vs rev +hg annotate -r tip a diff --git a/tests/test-annotate.out b/tests/test-annotate.out --- a/tests/test-annotate.out +++ b/tests/test-annotate.out @@ -48,3 +48,7 @@ 3 b: b 4 b: c 3 b: b 7 b: d +% linkrev vs rev +0: a +1: a +1: a