changeset 3443:d96429ddc8e2

Merge with crew
author Matt Mackall <mpm@selenic.com>
date Tue, 17 Oct 2006 19:04:13 -0500
parents 357b5589dc62 (current diff) f29989e9746e (diff)
children b17f9d3eda74
files
diffstat 28 files changed, 717 insertions(+), 50 deletions(-) [+]
line wrap: on
line diff
--- a/MANIFEST.in	Tue Oct 17 18:54:37 2006 -0500
+++ b/MANIFEST.in	Tue Oct 17 19:04:13 2006 -0500
@@ -2,7 +2,7 @@
 recursive-include mercurial *.py
 include hgweb.cgi hgwebdir.cgi
 include hgeditor rewrite-log
-include tests/README tests/*.py tests/test-*[a-z0-9] tests/*.out
+include tests/README tests/*.py tests/test-*[a-z0-9] tests/*.out tests/*.bin
 prune tests/*.err
 include *.txt
 include doc/README doc/Makefile doc/gendoc.py doc/*.txt doc/*.html doc/*.[0-9]
--- a/contrib/macosx/Readme.html	Tue Oct 17 18:54:37 2006 -0500
+++ b/contrib/macosx/Readme.html	Tue Oct 17 19:04:13 2006 -0500
@@ -25,7 +25,7 @@
 <p class="p2"><br></p>
 <p class="p1"><b>After you install</b></p>
 <p class="p2"><br></p>
-<p class="p3">This package installs the <span class="s2">hg</span> executable in <span class="s2">/usr/local/bin</span>. This directory may not be in your shell's search path. Don't forget to check.</p>
+<p class="p3">This package installs the <span class="s2">hg</span> executable in <span class="s2">/Library/Frameworks/Python.framework/Versions/Current/bin</span>. This directory may not be in your shell's search path. The MacPython installer will have created an entry in <span class="s2">.profile</span> for it but if your shell doesn't use <span class="s2">.profile</span> you'll need configure it yourself or create a symlink from a directory already in your path.</p>
 <p class="p2"><br></p>
 <p class="p1"><b>Reporting problems</b></p>
 <p class="p2"><br></p>
--- a/contrib/win32/ReadMe.html	Tue Oct 17 18:54:37 2006 -0500
+++ b/contrib/win32/ReadMe.html	Tue Oct 17 19:04:13 2006 -0500
@@ -46,7 +46,7 @@
       other Mercurial commands should work fine for you.</p>
 
     <h1>Configuration notes</h1>
-    <p>The default editor for commit messages is 'vi'. You can set the EDITOR
+    <p>The default editor for commit messages is 'notepad'. You can set the EDITOR
     (or HGEDITOR) environment variable to specify your preference or set it in
     mercurial.ini:</p>
     <pre>
--- a/contrib/win32/mercurial.ini	Tue Oct 17 18:54:37 2006 -0500
+++ b/contrib/win32/mercurial.ini	Tue Oct 17 19:04:13 2006 -0500
@@ -3,6 +3,9 @@
 ; USERNAME is your Windows user name:
 ;   C:\Documents and Settings\USERNAME\Mercurial.ini
 
+[ui] 
+editor = notepad
+
 ; By default, we try to encode and decode all files that do not
 ; contain ASCII NUL characters.  What this means is that we try to set
 ; line endings to Windows style on update, and to Unix style on
--- a/hgext/acl.py	Tue Oct 17 18:54:37 2006 -0500
+++ b/hgext/acl.py	Tue Oct 17 19:04:13 2006 -0500
@@ -80,7 +80,7 @@
         self.user = getpass.getuser()
         cfg = self.ui.config('acl', 'config')
         if cfg:
-            self.ui.readconfig(cfg)
+            self.ui.readsections(cfg, 'acl.allow', 'acl.deny')
         self.allow, self.allowable = self.buildmatch('acl.allow')
         self.deny, self.deniable = self.buildmatch('acl.deny')
 
--- a/hgext/bugzilla.py	Tue Oct 17 18:54:37 2006 -0500
+++ b/hgext/bugzilla.py	Tue Oct 17 19:04:13 2006 -0500
@@ -74,7 +74,7 @@
         timeout = int(self.ui.config('bugzilla', 'timeout', 5))
         usermap = self.ui.config('bugzilla', 'usermap')
         if usermap:
-            self.ui.readconfig(usermap)
+            self.ui.readsections(usermap, 'usermap')
         self.ui.note(_('connecting to %s:%s as %s, password %s\n') %
                      (host, db, user, '*' * len(passwd)))
         self.conn = MySQLdb.connect(host=host, user=user, passwd=passwd,
--- a/hgext/notify.py	Tue Oct 17 18:54:37 2006 -0500
+++ b/hgext/notify.py	Tue Oct 17 19:04:13 2006 -0500
@@ -102,7 +102,7 @@
         self.ui = ui
         cfg = self.ui.config('notify', 'config')
         if cfg:
-            self.ui.readconfig(cfg)
+            self.ui.readsections(cfg, 'usersubs', 'reposubs')
         self.repo = repo
         self.stripcount = int(self.ui.config('notify', 'strip', 0))
         self.root = self.strip(self.repo.root)
--- a/mercurial/bundlerepo.py	Tue Oct 17 18:54:37 2006 -0500
+++ b/mercurial/bundlerepo.py	Tue Oct 17 19:04:13 2006 -0500
@@ -233,10 +233,12 @@
         self.bundlefile.close()
 
     def __del__(self):
-        if not self.bundlefile.closed:
-            self.bundlefile.close()
-        if self.tempfile is not None:
-            os.unlink(self.tempfile)
+        bundlefile = getattr(self, 'bundlefile', None)
+        if bundlefile and not bundlefile.closed:
+            bundlefile.close()
+        tempfile = getattr(self, 'tempfile', None)
+        if tempfile is not None:
+            os.unlink(tempfile)
 
 def instance(ui, path, create):
     if create:
--- a/mercurial/hgweb/hgweb_mod.py	Tue Oct 17 18:54:37 2006 -0500
+++ b/mercurial/hgweb/hgweb_mod.py	Tue Oct 17 19:04:13 2006 -0500
@@ -28,7 +28,7 @@
         return "/"
     return up + "/"
 
-def revnavgen(pos, pagelen, limit):
+def revnavgen(pos, pagelen, limit, nodefunc):
     def seq(factor, limit=None):
         if limit:
             yield limit
@@ -50,16 +50,19 @@
                 break
             last = f
             if pos + f < limit:
-                l.append(("+%d" % f, pos + f))
+                l.append(("+%d" % f, hex(nodefunc(pos + f).node())))
             if pos - f >= 0:
-                l.insert(0, ("-%d" % f, pos - f))
+                l.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node())))
+
+        try:
+            yield {"label": "(0)", "node": hex(nodefunc('0').node())}
 
-        yield {"label": "(0)", "rev": 0}
+            for label, node in l:
+                yield {"label": label, "node": node}
 
-        for label, rev in l:
-            yield {"label": label, "rev": rev}
-
-        yield {"label": "tip", "rev": "tip"}
+            yield {"label": "tip", "node": "tip"}
+        except hg.RepoError:
+            pass
 
     return nav
 
@@ -215,7 +218,7 @@
         end = min(count, start + maxchanges)
         pos = end - 1
 
-        changenav = revnavgen(pos, maxchanges, count)
+        changenav = revnavgen(pos, maxchanges, count, self.repo.changectx)
 
         yield self.t(shortlog and 'shortlog' or 'changelog',
                      changenav=changenav,
@@ -338,7 +341,8 @@
             for e in l:
                 yield e
 
-        nav = revnavgen(pos, pagelen, count)
+        nodefunc = lambda x: fctx.filectx(fileid=x)
+        nav = revnavgen(pos, pagelen, count, nodefunc)
         yield self.t("filelog", file=f, node=hex(fctx.node()), nav=nav,
                      entries=entries)
 
@@ -743,13 +747,9 @@
             style = req.form['style'][0]
         mapfile = style_map(self.templatepath, style)
 
-        if not req.url:
-            port = req.env["SERVER_PORT"]
-            port = port != "80" and (":" + port) or ""
-            uri = req.env["REQUEST_URI"]
-            if "?" in uri:
-                uri = uri.split("?")[0]
-            req.url = "http://%s%s%s" % (req.env["SERVER_NAME"], port, uri)
+        port = req.env["SERVER_PORT"]
+        port = port != "80" and (":" + port) or ""
+        urlbase = 'http://%s%s' % (req.env['SERVER_NAME'], port)
 
         if not self.reponame:
             self.reponame = (self.repo.ui.config("web", "name")
@@ -758,6 +758,7 @@
 
         self.t = templater.templater(mapfile, templater.common_filters,
                                      defaults={"url": req.url,
+                                               "urlbase": urlbase,
                                                "repo": self.reponame,
                                                "header": header,
                                                "footer": footer,
--- a/mercurial/hgweb/hgwebdir_mod.py	Tue Oct 17 18:54:37 2006 -0500
+++ b/mercurial/hgweb/hgwebdir_mod.py	Tue Oct 17 19:04:13 2006 -0500
@@ -8,7 +8,7 @@
 
 import os
 from mercurial.demandload import demandload
-demandload(globals(), "ConfigParser mimetools cStringIO")
+demandload(globals(), "mimetools cStringIO")
 demandload(globals(), "mercurial:ui,hg,util,templater")
 demandload(globals(), "mercurial.hgweb.hgweb_mod:hgweb")
 demandload(globals(), "mercurial.hgweb.common:get_mtime,staticfile,style_map")
@@ -30,7 +30,7 @@
             self.repos = cleannames(config.items())
             self.repos.sort()
         else:
-            cp = ConfigParser.SafeConfigParser()
+            cp = util.configparser()
             cp.read(config)
             self.repos = []
             if cp.has_section('web'):
--- a/mercurial/ui.py	Tue Oct 17 18:54:37 2006 -0500
+++ b/mercurial/ui.py	Tue Oct 17 19:04:13 2006 -0500
@@ -11,12 +11,14 @@
 demandload(globals(), "ConfigParser traceback util")
 
 def dupconfig(orig):
-    new = ConfigParser.SafeConfigParser(orig.defaults())
+    new = util.configparser(orig.defaults())
     updateconfig(orig, new)
     return new
 
-def updateconfig(source, dest):
-    for section in source.sections():
+def updateconfig(source, dest, sections=None):
+    if not sections:
+        sections = source.sections()
+    for section in sections:
         if not dest.has_section(section):
             dest.add_section(section)
         for name, value in source.items(section, raw=True):
@@ -37,7 +39,7 @@
             self.debugflag = debug
             self.interactive = interactive
             self.traceback = traceback
-            self.cdata = ConfigParser.SafeConfigParser()
+            self.cdata = util.configparser()
             self.readconfig(util.rcpath())
             self.updateopts(verbose, debug, quiet, interactive)
         else:
@@ -100,6 +102,23 @@
     def addreadhook(self, hook):
         self.readhooks.append(hook)
 
+    def readsections(self, filename, *sections):
+        "read filename and add only the specified sections to the config data"
+        if not sections:
+            return
+
+        cdata = util.configparser()
+        try:
+            cdata.read(filename)
+        except ConfigParser.ParsingError, inst:
+            raise util.Abort(_("failed to parse %s\n%s") % (f, inst))
+
+        for section in sections:
+            if not cdata.has_section(section):
+                cdata.add_section(section)
+
+        updateconfig(cdata, self.cdata, sections)
+
     def fixconfig(self, section=None, name=None, value=None, root=None):
         # translate paths relative to root (or home) into absolute paths
         if section is None or section == 'paths':
@@ -126,7 +145,7 @@
 
     def setconfig(self, section, name, value):
         if not self.overlay:
-            self.overlay = ConfigParser.SafeConfigParser()
+            self.overlay = util.configparser()
         for cdata in (self.overlay, self.cdata):
             if not cdata.has_section(section):
                 cdata.add_section(section)
--- a/mercurial/util.py	Tue Oct 17 18:54:37 2006 -0500
+++ b/mercurial/util.py	Tue Oct 17 19:04:13 2006 -0500
@@ -15,7 +15,7 @@
 from i18n import gettext as _
 from demandload import *
 demandload(globals(), "cStringIO errno getpass popen2 re shutil sys tempfile")
-demandload(globals(), "os threading time calendar")
+demandload(globals(), "os threading time calendar ConfigParser")
 
 # used by parsedate
 defaultdateformats = ('%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M',
@@ -24,6 +24,11 @@
 class SignalInterrupt(Exception):
     """Exception raised on SIGTERM and SIGHUP."""
 
+# like SafeConfigParser but with case-sensitive keys
+class configparser(ConfigParser.SafeConfigParser):
+    def optionxform(self, optionstr):
+        return optionstr
+
 def cachefunc(func):
     '''cache the result of function calls'''
     # XXX doesn't handle keywords args
--- a/templates/gitweb/map	Tue Oct 17 18:54:37 2006 -0500
+++ b/templates/gitweb/map	Tue Oct 17 19:04:13 2006 -0500
@@ -5,9 +5,9 @@
 changelog = changelog.tmpl
 summary = summary.tmpl
 error = error.tmpl
-naventry = '<a href="#url#log/#rev#{sessionvars%urlparameter}">#label|escape#</a> '
-navshortentry = '<a href="#url#shortlog/#rev#{sessionvars%urlparameter}">#label|escape#</a> '
-filenaventry = '<a href="{url}log/{rev}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
 filedifflink = '<a href="#url#diff/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#file|escape#</a> '
 filenodelink = '<tr class="parity#parity#"><td><a class="list" href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">#file|escape#</a></td><td></td><td class="link"><a href="#url#file/#node|short#/#file|urlescape#{sessionvars%urlparameter}">file</a> | <a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}">annotate</a> | <a href="#url#diff/#node|short#/#file|urlescape#{sessionvars%urlparameter}">diff</a> | <a href="#url#log/#node|short#/#file|urlescape#{sessionvars%urlparameter}">revisions</a></td></tr>'
 fileellipses = '...'
--- a/templates/map	Tue Oct 17 18:54:37 2006 -0500
+++ b/templates/map	Tue Oct 17 19:04:13 2006 -0500
@@ -5,9 +5,9 @@
 changelog = changelog.tmpl
 shortlog = shortlog.tmpl
 shortlogentry = shortlogentry.tmpl
-naventry = '<a href="#url#log/#rev#{sessionvars%urlparameter}">#label|escape#</a> '
-navshortentry = '<a href="#url#shortlog/#rev#{sessionvars%urlparameter}">#label|escape#</a> '
-filenaventry = '<a href="{url}log/{rev}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
 filedifflink = '<a href="#url#diff/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#file|escape#</a> '
 filenodelink = '<a href="#url#file/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#file|escape#</a> '
 fileellipses = '...'
--- a/templates/old/map	Tue Oct 17 18:54:37 2006 -0500
+++ b/templates/old/map	Tue Oct 17 19:04:13 2006 -0500
@@ -5,8 +5,8 @@
 changelog = changelog.tmpl
 shortlog = shortlog.tmpl
 shortlogentry = shortlogentry.tmpl
-naventry = '<a href="?cl=#rev#">#label|escape#</a> '
-navshortentry = '<a href="?sl=#rev#">#label|escape#</a> '
+naventry = '<a href="?cl={node|short}">{label|escape}</a> '
+navshortentry = '<a href="?sl={node|short}">{label|escape}</a> '
 filedifflink = '<a href="?fd=#node|short#;file=#file|urlescape#">#file|escape#</a> '
 filenodelink = '<a href="?f=#node|short#;file=#file|urlescape#">#file|escape#</a> '
 fileellipses = '...'
--- a/templates/rss/changelogentry.tmpl	Tue Oct 17 18:54:37 2006 -0500
+++ b/templates/rss/changelogentry.tmpl	Tue Oct 17 19:04:13 2006 -0500
@@ -1,6 +1,6 @@
 <item>
     <title>#desc|strip|firstline|strip|escape#</title>
-    <link>#url#?cs=#node|short#</link>
+    <link>{urlbase}{url}rev/{node|short}</link>
     <description><![CDATA[#desc|strip|escape|addbreaks#]]></description>
     <author>#author|obfuscate#</author>
     <pubDate>#date|rfc822date#</pubDate>
--- a/templates/rss/filelogentry.tmpl	Tue Oct 17 18:54:37 2006 -0500
+++ b/templates/rss/filelogentry.tmpl	Tue Oct 17 19:04:13 2006 -0500
@@ -1,6 +1,6 @@
 <item>
     <title>#desc|strip|firstline|strip|escape#</title>
-    <link>#url#?f=#node|short#;file=#file|urlescape#</link>
+    <link>{urlbase}{url}log{#node|short#}/{file|urlescape}</link>
     <description><![CDATA[#desc|strip|escape|addbreaks#]]></description>
     <author>#author|obfuscate#</author>
     <pubDate>#date|rfc822date#</pubDate>
--- a/templates/rss/header.tmpl	Tue Oct 17 18:54:37 2006 -0500
+++ b/templates/rss/header.tmpl	Tue Oct 17 19:04:13 2006 -0500
@@ -2,5 +2,5 @@
 
 <rss version="2.0">
   <channel>
-    <link>#url#</link>
+    <link>{urlbase}{url}</link>
     <language>en-us</language>
--- a/templates/rss/tagentry.tmpl	Tue Oct 17 18:54:37 2006 -0500
+++ b/templates/rss/tagentry.tmpl	Tue Oct 17 19:04:13 2006 -0500
@@ -1,6 +1,6 @@
 <item>
     <title>#tag|escape#</title>
-    <link>#url#?cs=#node|short#</link>
+    <link>{urlbase}{url}rev/{node|short}</link>
     <description><![CDATA[#tag|strip|escape|addbreaks#]]></description>
     <pubDate>#date|rfc822date#</pubDate>
 </item>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-acl	Tue Oct 17 19:04:13 2006 -0500
@@ -0,0 +1,109 @@
+#!/bin/sh
+
+do_push()
+{
+    user=$1
+    shift
+
+    echo "Pushing as user $user"
+    echo 'hgrc = """'
+    sed -e 1,2d b/.hg/hgrc
+    echo '"""'
+    if [ -e acl.config ]; then
+	echo 'acl.config = """'
+	cat acl.config
+	echo '"""'
+    fi
+    LOGNAME=$user hg --cwd a --debug push ../b
+    hg --cwd b rollback
+    hg --cwd b --quiet tip
+    echo
+}
+
+hg init a
+cd a
+mkdir foo foo/Bar quux
+echo 'in foo' > foo/file.txt
+echo 'in foo/Bar' > foo/Bar/file.txt
+echo 'in quux' > quux/file.py
+hg add
+hg ci -m 'add files' -d '1000000 0'
+echo >> foo/file.txt
+hg ci -m 'change foo/file' -d '1000001 0'
+echo >> foo/Bar/file.txt
+hg ci -m 'change foo/Bar/file' -d '1000002 0'
+echo >> quux/file.py
+hg ci -m 'change quux/file' -d '1000003 0'
+hg tip --quiet
+
+cd ..
+hg clone -r 0 a b
+
+echo '[extensions]' >> $HGRCPATH
+echo 'hgext.acl =' >> $HGRCPATH
+
+config=b/.hg/hgrc
+
+echo
+
+echo 'Extension disabled for lack of a hook'
+do_push fred
+
+echo '[hooks]' >> $config
+echo 'pretxnchangegroup.acl = python:hgext.acl.hook' >> $config
+
+echo 'Extension disabled for lack of acl.sources'
+do_push fred
+
+echo 'No [acl.allow]/[acl.deny]'
+echo '[acl]' >> $config
+echo 'sources = push' >> $config
+do_push fred
+
+echo 'Empty [acl.allow]'
+echo '[acl.allow]' >> $config
+do_push fred
+
+echo 'fred is allowed inside foo/'
+echo 'foo/** = fred' >> $config
+do_push fred
+
+echo 'Empty [acl.deny]'
+echo '[acl.deny]' >> $config
+do_push barney
+
+echo 'fred is allowed inside foo/, but not foo/bar/ (case matters)'
+echo 'foo/bar/** = fred' >> $config
+do_push fred
+
+echo 'fred is allowed inside foo/, but not foo/Bar/'
+echo 'foo/Bar/** = fred' >> $config
+do_push fred
+
+echo 'barney is not mentioned => not allowed anywhere'
+do_push barney
+
+echo 'barney is allowed everywhere'
+echo '[acl.allow]' >> $config
+echo '** = barney' >> $config
+do_push barney
+
+echo 'wilma can change files with a .txt extension'
+echo '**/*.txt = wilma' >> $config
+do_push wilma
+
+echo 'file specified by acl.config does not exist'
+echo '[acl]' >> $config
+echo 'config = ../acl.config' >> $config
+do_push barney
+
+echo 'betty is allowed inside foo/ by a acl.config file'
+echo '[acl.allow]' >> acl.config
+echo 'foo/** = betty' >> acl.config
+do_push betty
+
+echo 'acl.config can set only [acl.allow]/[acl.deny]'
+echo '[hooks]' >> acl.config
+echo 'changegroup.acl = false' >> acl.config
+do_push barney
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-acl.out	Tue Oct 17 19:04:13 2006 -0500
@@ -0,0 +1,517 @@
+adding foo/Bar/file.txt
+adding foo/file.txt
+adding quux/file.py
+3:911600dab2ae
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 3 changes to 3 files
+3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Extension disabled for lack of a hook
+Pushing as user fred
+hgrc = """
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+rolling back last transaction
+0:6675d58eff77
+
+Extension disabled for lack of acl.sources
+Pushing as user fred
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow not enabled
+acl: acl.deny not enabled
+acl: changes have source "push" - skipping
+rolling back last transaction
+0:6675d58eff77
+
+No [acl.allow]/[acl.deny]
+Pushing as user fred
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow not enabled
+acl: acl.deny not enabled
+acl: allowing changeset ef1ea85a6374
+acl: allowing changeset f9cafe1212c8
+acl: allowing changeset 911600dab2ae
+rolling back last transaction
+0:6675d58eff77
+
+Empty [acl.allow]
+Pushing as user fred
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 0 entries for user fred
+acl: acl.deny not enabled
+acl: user fred not allowed on foo/file.txt
+error: pretxnchangegroup.acl hook failed: acl: access denied for changeset ef1ea85a6374
+abort: acl: access denied for changeset ef1ea85a6374
+transaction abort!
+rollback completed
+no rollback information available
+0:6675d58eff77
+
+fred is allowed inside foo/
+Pushing as user fred
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 1 entries for user fred
+acl: acl.deny not enabled
+acl: allowing changeset ef1ea85a6374
+acl: allowing changeset f9cafe1212c8
+acl: user fred not allowed on quux/file.py
+error: pretxnchangegroup.acl hook failed: acl: access denied for changeset 911600dab2ae
+abort: acl: access denied for changeset 911600dab2ae
+transaction abort!
+rollback completed
+no rollback information available
+0:6675d58eff77
+
+Empty [acl.deny]
+Pushing as user barney
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 0 entries for user barney
+acl: acl.deny enabled, 0 entries for user barney
+acl: user barney not allowed on foo/file.txt
+error: pretxnchangegroup.acl hook failed: acl: access denied for changeset ef1ea85a6374
+abort: acl: access denied for changeset ef1ea85a6374
+transaction abort!
+rollback completed
+no rollback information available
+0:6675d58eff77
+
+fred is allowed inside foo/, but not foo/bar/ (case matters)
+Pushing as user fred
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+foo/bar/** = fred
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 1 entries for user fred
+acl: acl.deny enabled, 1 entries for user fred
+acl: allowing changeset ef1ea85a6374
+acl: allowing changeset f9cafe1212c8
+acl: user fred not allowed on quux/file.py
+error: pretxnchangegroup.acl hook failed: acl: access denied for changeset 911600dab2ae
+abort: acl: access denied for changeset 911600dab2ae
+transaction abort!
+rollback completed
+no rollback information available
+0:6675d58eff77
+
+fred is allowed inside foo/, but not foo/Bar/
+Pushing as user fred
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+foo/bar/** = fred
+foo/Bar/** = fred
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 1 entries for user fred
+acl: acl.deny enabled, 2 entries for user fred
+acl: allowing changeset ef1ea85a6374
+acl: user fred denied on foo/Bar/file.txt
+error: pretxnchangegroup.acl hook failed: acl: access denied for changeset f9cafe1212c8
+abort: acl: access denied for changeset f9cafe1212c8
+transaction abort!
+rollback completed
+no rollback information available
+0:6675d58eff77
+
+barney is not mentioned => not allowed anywhere
+Pushing as user barney
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+foo/bar/** = fred
+foo/Bar/** = fred
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 0 entries for user barney
+acl: acl.deny enabled, 0 entries for user barney
+acl: user barney not allowed on foo/file.txt
+error: pretxnchangegroup.acl hook failed: acl: access denied for changeset ef1ea85a6374
+abort: acl: access denied for changeset ef1ea85a6374
+transaction abort!
+rollback completed
+no rollback information available
+0:6675d58eff77
+
+barney is allowed everywhere
+Pushing as user barney
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+foo/bar/** = fred
+foo/Bar/** = fred
+[acl.allow]
+** = barney
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 1 entries for user barney
+acl: acl.deny enabled, 0 entries for user barney
+acl: allowing changeset ef1ea85a6374
+acl: allowing changeset f9cafe1212c8
+acl: allowing changeset 911600dab2ae
+rolling back last transaction
+0:6675d58eff77
+
+wilma can change files with a .txt extension
+Pushing as user wilma
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+foo/bar/** = fred
+foo/Bar/** = fred
+[acl.allow]
+** = barney
+**/*.txt = wilma
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 1 entries for user wilma
+acl: acl.deny enabled, 0 entries for user wilma
+acl: allowing changeset ef1ea85a6374
+acl: allowing changeset f9cafe1212c8
+acl: user wilma not allowed on quux/file.py
+error: pretxnchangegroup.acl hook failed: acl: access denied for changeset 911600dab2ae
+abort: acl: access denied for changeset 911600dab2ae
+transaction abort!
+rollback completed
+no rollback information available
+0:6675d58eff77
+
+file specified by acl.config does not exist
+Pushing as user barney
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+foo/bar/** = fred
+foo/Bar/** = fred
+[acl.allow]
+** = barney
+**/*.txt = wilma
+[acl]
+config = ../acl.config
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 1 entries for user barney
+acl: acl.deny enabled, 0 entries for user barney
+acl: allowing changeset ef1ea85a6374
+acl: allowing changeset f9cafe1212c8
+acl: allowing changeset 911600dab2ae
+rolling back last transaction
+0:6675d58eff77
+
+betty is allowed inside foo/ by a acl.config file
+Pushing as user betty
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+foo/bar/** = fred
+foo/Bar/** = fred
+[acl.allow]
+** = barney
+**/*.txt = wilma
+[acl]
+config = ../acl.config
+"""
+acl.config = """
+[acl.allow]
+foo/** = betty
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 1 entries for user betty
+acl: acl.deny enabled, 0 entries for user betty
+acl: allowing changeset ef1ea85a6374
+acl: allowing changeset f9cafe1212c8
+acl: user betty not allowed on quux/file.py
+error: pretxnchangegroup.acl hook failed: acl: access denied for changeset 911600dab2ae
+abort: acl: access denied for changeset 911600dab2ae
+transaction abort!
+rollback completed
+no rollback information available
+0:6675d58eff77
+
+acl.config can set only [acl.allow]/[acl.deny]
+Pushing as user barney
+hgrc = """
+[hooks]
+pretxnchangegroup.acl = python:hgext.acl.hook
+[acl]
+sources = push
+[acl.allow]
+foo/** = fred
+[acl.deny]
+foo/bar/** = fred
+foo/Bar/** = fred
+[acl.allow]
+** = barney
+**/*.txt = wilma
+[acl]
+config = ../acl.config
+"""
+acl.config = """
+[acl.allow]
+foo/** = betty
+[hooks]
+changegroup.acl = false
+"""
+pushing to ../b
+searching for changes
+common changesets up to 6675d58eff77
+adding changesets
+add changeset ef1ea85a6374
+add changeset f9cafe1212c8
+add changeset 911600dab2ae
+adding manifests
+adding file changes
+adding foo/Bar/file.txt revisions
+adding foo/file.txt revisions
+adding quux/file.py revisions
+added 3 changesets with 3 changes to 3 files
+calling hook pretxnchangegroup.acl: hgext.acl.hook
+acl: acl.allow enabled, 1 entries for user barney
+acl: acl.deny enabled, 0 entries for user barney
+acl: allowing changeset ef1ea85a6374
+acl: allowing changeset f9cafe1212c8
+acl: allowing changeset 911600dab2ae
+rolling back last transaction
+0:6675d58eff77
+
--- a/tests/test-bad-pull	Tue Oct 17 18:54:37 2006 -0500
+++ b/tests/test-bad-pull	Tue Oct 17 19:04:13 2006 -0500
@@ -2,7 +2,7 @@
 
 hg clone http://localhost:20059/ copy
 echo $?
-ls copy 2>/dev/null || echo copy: No such file or directory
+test -e copy || echo copy: No such file or directory
 
 cat > dumb.py <<EOF
 import BaseHTTPServer, SimpleHTTPServer, signal
--- a/tests/test-bundle	Tue Oct 17 18:54:37 2006 -0500
+++ b/tests/test-bundle	Tue Oct 17 19:04:13 2006 -0500
@@ -57,4 +57,5 @@
 hg -R bundle://../full.hg log
 hg incoming bundle://../full.hg
 hg -R bundle://../full.hg outgoing ../partial2
+hg -R bundle://../does-not-exist.hg outgoing ../partial2
 cd ..
--- a/tests/test-bundle.out	Tue Oct 17 18:54:37 2006 -0500
+++ b/tests/test-bundle.out	Tue Oct 17 19:04:13 2006 -0500
@@ -208,3 +208,4 @@
 date:        Mon Jan 12 13:46:40 1970 +0000
 summary:     0.3m
 
+abort: No such file or directory: ../does-not-exist.hg
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-config-case	Tue Oct 17 19:04:13 2006 -0500
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+echo '[Section]' >> $HGRCPATH
+echo 'KeY = Case Sensitive' >> $HGRCPATH
+echo 'key = lower case' >> $HGRCPATH
+
+hg showconfig
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-config-case.out	Tue Oct 17 19:04:13 2006 -0500
@@ -0,0 +1,2 @@
+Section.KeY=Case Sensitive
+Section.key=lower case
--- a/tests/test-empty-dir	Tue Oct 17 18:54:37 2006 -0500
+++ b/tests/test-empty-dir	Tue Oct 17 19:04:13 2006 -0500
@@ -11,6 +11,6 @@
 cat sub/b
 hg co 0
 cat sub/b 2>/dev/null || echo "sub/b not present"
-ls sub 2>/dev/null || echo "sub not present"
+test -e sub || echo "sub not present"
 
 true
--- a/tests/test-static-http	Tue Oct 17 18:54:37 2006 -0500
+++ b/tests/test-static-http	Tue Oct 17 19:04:13 2006 -0500
@@ -2,7 +2,7 @@
 
 http_proxy= hg clone static-http://localhost:20059/ copy
 echo $?
-ls copy 2>/dev/null || echo copy: No such file or directory
+test -e copy || echo copy: No such file or directory
 
 # This server doesn't do range requests so it's basically only good for
 # one pull