changeset 4712:f49fcbb325bc

Merge with mpm
author Brendan Cully <brendan@kublai.com>
date Mon, 25 Jun 2007 10:34:53 -0700
parents c71bf1d251ad (current diff) 1aba0b752847 (diff)
children c29ee52e0b68
files hgext/mq.py
diffstat 11 files changed, 148 insertions(+), 128 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ help:
 	@echo '  all          - build program and documentation'
 	@echo '  install      - install program and man pages to PREFIX ($(PREFIX))'
 	@echo '  install-home - install with setup.py install --home=HOME ($(HOME))'
-	@echo '  local        - build C extensions for inplace usage'
+	@echo '  local        - build for inplace usage'
 	@echo '  tests        - run all tests in the automatic test suite'
 	@echo '  test-foo     - run only specified tests (e.g. test-merge1)'
 	@echo '  dist         - run all tests and create a source tarball in dist/'
@@ -24,6 +24,8 @@ all: build doc
 
 local:
 	$(PYTHON) setup.py build_ext -i
+	$(PYTHON) setup.py build_py -c -d .
+	$(PYTHON) hg version
 
 build:
 	$(PYTHON) setup.py build
@@ -33,7 +35,7 @@ doc:
 
 clean:
 	-$(PYTHON) setup.py clean --all # ignore errors of this command
-	find . -name '*.py[co]' -exec rm -f '{}' ';'
+	find . -name '*.py[cdo]' -exec rm -f '{}' ';'
 	rm -f MANIFEST mercurial/__version__.py mercurial/*.so tests/*.err
 	$(MAKE) -C doc clean
 
--- a/doc/hgrc.5.txt
+++ b/doc/hgrc.5.txt
@@ -525,6 +525,8 @@ web::
     Default is "unknown".
   errorlog;;
     Where to output the error log. Default is stderr.
+  hidden;;
+    Whether to hide the repository in the hgwebdir index. Default is false.
   ipv6;;
     Whether to use IPv6. Default is false.
   name;;
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -30,7 +30,8 @@ refresh contents of top applied patch   
 '''
 
 from mercurial.i18n import _
-from mercurial import commands, cmdutil, hg, patch, revlog, util, changegroup
+from mercurial import commands, cmdutil, hg, patch, revlog, util
+from mercurial import repair
 import os, sys, re, errno
 
 commands.norepo += " qclone qversion"
@@ -629,71 +630,9 @@ class queue:
         self.removeundo(repo)
 
     def strip(self, repo, rev, update=True, backup="all", wlock=None):
-        def limitheads(chlog, stop):
-            """return the list of all nodes that have no children"""
-            p = {}
-            h = []
-            stoprev = 0
-            if stop in chlog.nodemap:
-                stoprev = chlog.rev(stop)
-
-            for r in xrange(chlog.count() - 1, -1, -1):
-                n = chlog.node(r)
-                if n not in p:
-                    h.append(n)
-                if n == stop:
-                    break
-                if r < stoprev:
-                    break
-                for pn in chlog.parents(n):
-                    p[pn] = 1
-            return h
-
-        def bundle(cg):
-            backupdir = repo.join("strip-backup")
-            if not os.path.isdir(backupdir):
-                os.mkdir(backupdir)
-            name = os.path.join(backupdir, "%s" % revlog.short(rev))
-            name = savename(name)
-            self.ui.warn("saving bundle to %s\n" % name)
-            return changegroup.writebundle(cg, name, "HG10BZ")
-
-        def stripall(revnum):
-            mm = repo.changectx(rev).manifest()
-            seen = {}
-
-            for x in xrange(revnum, repo.changelog.count()):
-                for f in repo.changectx(x).files():
-                    if f in seen:
-                        continue
-                    seen[f] = 1
-                    if f in mm:
-                        filerev = mm[f]
-                    else:
-                        filerev = 0
-                    seen[f] = filerev
-            # we go in two steps here so the strip loop happens in a
-            # sensible order.  When stripping many files, this helps keep
-            # our disk access patterns under control.
-            seen_list = seen.keys()
-            seen_list.sort()
-            for f in seen_list:
-                ff = repo.file(f)
-                filerev = seen[f]
-                if filerev != 0:
-                    if filerev in ff.nodemap:
-                        filerev = ff.rev(filerev)
-                    else:
-                        filerev = 0
-                ff.strip(filerev, revnum)
-
         if not wlock:
             wlock = repo.wlock()
         lock = repo.lock()
-        chlog = repo.changelog
-        # TODO delete the undo files, and handle undo of merge sets
-        pp = chlog.parents(rev)
-        revnum = chlog.rev(rev)
 
         if update:
             self.check_localchanges(repo, refresh=False)
@@ -701,62 +640,8 @@ class queue:
             hg.clean(repo, urev, wlock=wlock)
             repo.dirstate.write()
 
-        # save is a list of all the branches we are truncating away
-        # that we actually want to keep.  changegroup will be used
-        # to preserve them and add them back after the truncate
-        saveheads = []
-        savebases = {}
-
-        heads = limitheads(chlog, rev)
-        seen = {}
-
-        # search through all the heads, finding those where the revision
-        # we want to strip away is an ancestor.  Also look for merges
-        # that might be turned into new heads by the strip.
-        while heads:
-            h = heads.pop()
-            n = h
-            while True:
-                seen[n] = 1
-                pp = chlog.parents(n)
-                if pp[1] != revlog.nullid:
-                    for p in pp:
-                        if chlog.rev(p) > revnum and p not in seen:
-                            heads.append(p)
-                if pp[0] == revlog.nullid:
-                    break
-                if chlog.rev(pp[0]) < revnum:
-                    break
-                n = pp[0]
-                if n == rev:
-                    break
-            r = chlog.reachable(h, rev)
-            if rev not in r:
-                saveheads.append(h)
-                for x in r:
-                    if chlog.rev(x) > revnum:
-                        savebases[x] = 1
-
-        # create a changegroup for all the branches we need to keep
-        if backup == "all":
-            backupch = repo.changegroupsubset([rev], chlog.heads(), 'strip')
-            bundle(backupch)
-        if saveheads:
-            backupch = repo.changegroupsubset(savebases.keys(), saveheads, 'strip')
-            chgrpfile = bundle(backupch)
-
-        stripall(revnum)
-
-        change = chlog.read(rev)
-        chlog.strip(revnum, revnum)
-        repo.manifest.strip(repo.manifest.rev(change[0]), revnum)
         self.removeundo(repo)
-        if saveheads:
-            self.ui.status("adding branch\n")
-            commands.unbundle(self.ui, repo, "file:%s" % chgrpfile,
-                              update=False)
-            if backup != "strip":
-                os.unlink(chgrpfile)
+        repair.strip(self.ui, repo, rev, backup)
 
     def isapplied(self, patch):
         """returns (index, rev, patch)"""
--- a/mercurial/hgweb/hgwebdir_mod.py
+++ b/mercurial/hgweb/hgwebdir_mod.py
@@ -142,6 +142,9 @@ class hgwebdir(object):
                 def get(section, name, default=None):
                     return u.config(section, name, default, untrusted=True)
 
+                if u.configbool("web", "hidden", untrusted=True):
+                    continue
+
                 url = ('/'.join([req.env["REQUEST_URI"].split('?')[0], name])
                        .replace("//", "/")) + '/'
 
new file mode 100644
--- /dev/null
+++ b/mercurial/repair.py
@@ -0,0 +1,127 @@
+# repair.py - functions for repository repair for mercurial
+#
+# Copyright 2005, 2006 Chris Mason <mason@suse.com>
+# Copyright 2007 Matt Mackall
+#
+# This software may be used and distributed according to the terms
+# of the GNU General Public License, incorporated herein by reference.
+
+import changegroup, revlog, os, commands
+
+def strip(ui, repo, rev, backup="all"):
+    def limitheads(chlog, stop):
+        """return the list of all nodes that have no children"""
+        p = {}
+        h = []
+        stoprev = 0
+        if stop in chlog.nodemap:
+            stoprev = chlog.rev(stop)
+
+        for r in xrange(chlog.count() - 1, -1, -1):
+            n = chlog.node(r)
+            if n not in p:
+                h.append(n)
+            if n == stop:
+                break
+            if r < stoprev:
+                break
+            for pn in chlog.parents(n):
+                p[pn] = 1
+        return h
+
+    def bundle(repo, bases, heads, rev, suffix):
+        cg = repo.changegroupsubset(bases, heads, 'strip')
+        backupdir = repo.join("strip-backup")
+        if not os.path.isdir(backupdir):
+            os.mkdir(backupdir)
+        name = os.path.join(backupdir, "%s-%s" % (revlog.short(rev), suffix))
+        ui.warn("saving bundle to %s\n" % name)
+        return changegroup.writebundle(cg, name, "HG10BZ")
+
+    def stripall(revnum):
+        mm = repo.changectx(rev).manifest()
+        seen = {}
+
+        for x in xrange(revnum, repo.changelog.count()):
+            for f in repo.changectx(x).files():
+                if f in seen:
+                    continue
+                seen[f] = 1
+                if f in mm:
+                    filerev = mm[f]
+                else:
+                    filerev = 0
+                seen[f] = filerev
+        # we go in two steps here so the strip loop happens in a
+        # sensible order.  When stripping many files, this helps keep
+        # our disk access patterns under control.
+        seen_list = seen.keys()
+        seen_list.sort()
+        for f in seen_list:
+            ff = repo.file(f)
+            filerev = seen[f]
+            if filerev != 0:
+                if filerev in ff.nodemap:
+                    filerev = ff.rev(filerev)
+                else:
+                    filerev = 0
+            ff.strip(filerev, revnum)
+
+    chlog = repo.changelog
+    # TODO delete the undo files, and handle undo of merge sets
+    pp = chlog.parents(rev)
+    revnum = chlog.rev(rev)
+
+    # save is a list of all the branches we are truncating away
+    # that we actually want to keep.  changegroup will be used
+    # to preserve them and add them back after the truncate
+    saveheads = []
+    savebases = {}
+
+    heads = limitheads(chlog, rev)
+    seen = {}
+
+    # search through all the heads, finding those where the revision
+    # we want to strip away is an ancestor.  Also look for merges
+    # that might be turned into new heads by the strip.
+    while heads:
+        h = heads.pop()
+        n = h
+        while True:
+            seen[n] = 1
+            pp = chlog.parents(n)
+            if pp[1] != revlog.nullid:
+                for p in pp:
+                    if chlog.rev(p) > revnum and p not in seen:
+                        heads.append(p)
+            if pp[0] == revlog.nullid:
+                break
+            if chlog.rev(pp[0]) < revnum:
+                break
+            n = pp[0]
+            if n == rev:
+                break
+        r = chlog.reachable(h, rev)
+        if rev not in r:
+            saveheads.append(h)
+            for x in r:
+                if chlog.rev(x) > revnum:
+                    savebases[x] = 1
+
+    # create a changegroup for all the branches we need to keep
+    if backup == "all":
+        bundle(repo, [rev], chlog.heads(), rev, 'backup')
+    if saveheads:
+        chgrpfile = bundle(repo, savebases.keys(), saveheads, rev, 'temp')
+
+    stripall(revnum)
+
+    change = chlog.read(rev)
+    chlog.strip(revnum, revnum)
+    repo.manifest.strip(repo.manifest.rev(change[0]), revnum)
+    if saveheads:
+        ui.status("adding branch\n")
+        commands.unbundle(ui, repo, "file:%s" % chgrpfile, update=False)
+        if backup != "strip":
+            os.unlink(chgrpfile)
+
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -105,6 +105,7 @@ defaultdateformats = (
     '%m/%d/%Y',
     '%a %b %d %H:%M:%S %Y',
     '%a %b %d %I:%M:%S%p %Y',
+    '%a, %d %b %Y %H:%M:%S',        #  GNU coreutils "/bin/date --rfc-2822"
     '%b %d %H:%M:%S %Y',
     '%b %d %I:%M:%S%p %Y',
     '%b %d %H:%M:%S',
--- a/templates/gitweb/map
+++ b/templates/gitweb/map
@@ -48,7 +48,7 @@ filelogchild = '<tr><td align="right">ch
 shortlog = shortlog.tmpl
 tagtag = '<span class="tagtag" title="{name}">{name}</span> '
 branchtag = '<span class="branchtag" title="{name}">{name}</span> '
-shortlogentry = '<tr class="parity#parity#"><td class="age"><i>#date|age# ago</i></td><td><i>#author#</i></td><td><a class="list" href="{url}rev/#node|short#{sessionvars%urlparameter}"><b>#desc|strip|firstline|escape#</b> <span class="logtags">{branches%branchtag}{tags%tagtag}</span></a></td><td class="link" nowrap><a href="{url}rev/#node|short#{sessionvars%urlparameter}">changeset</a> | <a href="{url}file/#node|short#{sessionvars%urlparameter}">manifest</a></td></tr>'
+shortlogentry = '<tr class="parity#parity#"><td class="age"><i>#date|age# ago</i></td><td><i>#author|person#</i></td><td><a class="list" href="{url}rev/#node|short#{sessionvars%urlparameter}"><b>#desc|strip|firstline|escape#</b> <span class="logtags">{branches%branchtag}{tags%tagtag}</span></a></td><td class="link" nowrap><a href="{url}rev/#node|short#{sessionvars%urlparameter}">changeset</a> | <a href="{url}file/#node|short#{sessionvars%urlparameter}">manifest</a></td></tr>'
 filelogentry = '<tr class="parity#parity#"><td class="age"><i>#date|age# ago</i></td><td><a class="list" href="{url}rev/#node|short#{sessionvars%urlparameter}"><b>#desc|strip|firstline|escape#</b></a></td><td class="link"><a href="{url}file/#node|short#/#file|urlescape#{sessionvars%urlparameter}">file</a>&nbsp;|&nbsp;<a href="{url}diff/#node|short#/#file|urlescape#{sessionvars%urlparameter}">diff</a>&nbsp;|&nbsp;<a href="{url}annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}">annotate</a> #rename%filelogrename#</td></tr>'
 archiveentry = ' | <a href="{url}archive/{node|short}{extension}">#type|escape#</a> '
 indexentry = '<tr class="parity#parity#"><td><a class="list" href="#url#{sessionvars%urlparameter}"><b>#name|escape#</b></a></td><td>#description#</td><td>#contact|obfuscate#</td><td class="age">#lastchange|age# ago</td><td class="indexlinks"><a class="rss_logo" href="#url#rss-log">RSS</a> #archives%archiveentry#</td></tr>'
--- a/templates/gitweb/summary.tmpl
+++ b/templates/gitweb/summary.tmpl
@@ -32,10 +32,10 @@ summary |
 <tr><td>last change</td><td>#lastchange|rfc822date#</td></tr>
 </table>
 
-<div><a  class="title" href="{url}log{sessionvars%urlparameter}">changes</a></div>
+<div><a  class="title" href="{url}shortlog{sessionvars%urlparameter}">changes</a></div>
 <table cellspacing="0">
 #shortlog#
-<tr class="light"><td colspan="4"><a class="list" href="{url}log{sessionvars%urlparameter}">...</a></td></tr>
+<tr class="light"><td colspan="4"><a class="list" href="{url}shortlog{sessionvars%urlparameter}">...</a></td></tr>
 </table>
 
 <div><a class="title" href="{url}tags{sessionvars%urlparameter}">tags</a></div>
--- a/templates/map
+++ b/templates/map
@@ -1,4 +1,4 @@
-default = 'changelog'
+default = 'shortlog'
 header = header.tmpl
 footer = footer.tmpl
 search = search.tmpl
--- a/templates/shortlogentry.tmpl
+++ b/templates/shortlogentry.tmpl
@@ -1,7 +1,7 @@
 <table class="slogEntry parity#parity#">
  <tr>
   <td class="age">#date|age#</td>
-  <td class="author">#author|obfuscate#</td>
+  <td class="author">#author|person#</td>
   <td class="node"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#desc|strip|firstline|escape#</a></td>
  </tr>
 </table>
--- a/templates/static/style.css
+++ b/templates/static/style.css
@@ -58,10 +58,10 @@ pre { margin: 0; }
 .logEntry th.firstline { text-align: left; width: inherit; }
 
 /* Shortlog entries */
-.slogEntry { width: 100%; font-size: smaller; }
-.slogEntry .age { width: 7%; }
+.slogEntry { width: 100%; }
+.slogEntry .age { width: 8em; }
 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
-.slogEntry td.author { width: 35%; }
+.slogEntry td.author { width: 15em; }
 
 /* Tag entries */
 #tagEntries { list-style: none; margin: 0; padding: 0; }