--- a/Makefile Mon Jun 25 09:49:40 2007 -0700
+++ b/Makefile Mon Jun 25 10:34:53 2007 -0700
@@ -7,7 +7,7 @@
@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 @@
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 @@
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 Mon Jun 25 09:49:40 2007 -0700
+++ b/doc/hgrc.5.txt Mon Jun 25 10:34:53 2007 -0700
@@ -525,6 +525,8 @@
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 Mon Jun 25 09:49:40 2007 -0700
+++ b/hgext/mq.py Mon Jun 25 10:34:53 2007 -0700
@@ -30,7 +30,8 @@
'''
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 @@
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 @@
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 Mon Jun 25 09:49:40 2007 -0700
+++ b/mercurial/hgweb/hgwebdir_mod.py Mon Jun 25 10:34:53 2007 -0700
@@ -142,6 +142,9 @@
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("//", "/")) + '/'
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/repair.py Mon Jun 25 10:34:53 2007 -0700
@@ -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 Mon Jun 25 09:49:40 2007 -0700
+++ b/mercurial/util.py Mon Jun 25 10:34:53 2007 -0700
@@ -105,6 +105,7 @@
'%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 Mon Jun 25 09:49:40 2007 -0700
+++ b/templates/gitweb/map Mon Jun 25 10:34:53 2007 -0700
@@ -48,7 +48,7 @@
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> | <a href="{url}diff/#node|short#/#file|urlescape#{sessionvars%urlparameter}">diff</a> | <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 Mon Jun 25 09:49:40 2007 -0700
+++ b/templates/gitweb/summary.tmpl Mon Jun 25 10:34:53 2007 -0700
@@ -32,10 +32,10 @@
<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 Mon Jun 25 09:49:40 2007 -0700
+++ b/templates/map Mon Jun 25 10:34:53 2007 -0700
@@ -1,4 +1,4 @@
-default = 'changelog'
+default = 'shortlog'
header = header.tmpl
footer = footer.tmpl
search = search.tmpl
--- a/templates/shortlogentry.tmpl Mon Jun 25 09:49:40 2007 -0700
+++ b/templates/shortlogentry.tmpl Mon Jun 25 10:34:53 2007 -0700
@@ -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 Mon Jun 25 09:49:40 2007 -0700
+++ b/templates/static/style.css Mon Jun 25 10:34:53 2007 -0700
@@ -58,10 +58,10 @@
.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; }