--- old/usr/src/pkg/manifests/developer-build-onbld.mf	Tue Jan 22 19:17:32 2013
+++ new/usr/src/pkg/manifests/developer-build-onbld.mf	Tue Jan 22 19:17:32 2013
@@ -171,6 +171,8 @@
 file path=opt/onbld/lib/python2.6/onbld/Checks/__init__.pyc mode=0444
 file path=opt/onbld/lib/python2.6/onbld/Scm/Backup.py mode=0444
 file path=opt/onbld/lib/python2.6/onbld/Scm/Backup.pyc mode=0444
+file path=opt/onbld/lib/python2.6/onbld/Scm/Ignore.py mode=0444
+file path=opt/onbld/lib/python2.6/onbld/Scm/Ignore.pyc mode=0444
 file path=opt/onbld/lib/python2.6/onbld/Scm/Version.py mode=0444
 file path=opt/onbld/lib/python2.6/onbld/Scm/Version.pyc mode=0444
 file path=opt/onbld/lib/python2.6/onbld/Scm/WorkSpace.py mode=0444
--- /dev/null	Tue Jan 22 19:17:32 2013
+++ new/usr/src/tools/onbld/Scm/Ignore.py	Tue Jan 22 19:17:32 2013
@@ -0,0 +1,92 @@
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE
+#
+# Copyright (c) 2013, Joyent Inc. All rights reserved.
+#
+
+'''
+Process our ignore/exception_list file format.
+
+The format is broadly similar, if not identical, to .gitignore and .hgignore
+files.
+'''
+
+import re
+import fnmatch
+
+#
+# It is important that this module not rely on Mercurial
+#
+
+def _read_ignore_file(ignorefile):
+    '''Read an ignore file and return an array of regular expressions
+    to match ignored paths.'''
+
+    syntax = 'regex'
+    ignore_list = []
+    lc = 0
+
+    f = open(ignorefile, 'r')
+    for l in f:
+        lc += 1
+        # Remove comments and blank lines
+        l = re.sub(r'#.*', '', l).strip()
+        if l == '':
+            continue
+        # Process "syntax:" lines
+        m = re.match(r'^syntax:\s*(.*)\s*$', l)
+        if m:
+            syntax = m.group(1)
+            continue
+        # All other lines are considered patterns
+        if (syntax == 'glob'):
+            ignore_list.append(re.compile('.*' + fnmatch.translate(l)))
+        elif (syntax == 'regex'):
+            ignore_list.append(re.compile(l))
+        else:
+            raise Exception('%s:%d: syntax "%s" is not supported' %
+                (ignorefile, lc, syntax))
+    f.close()
+    return ignore_list
+
+
+def ignore(root, ignorefiles):
+    # If we aren't provided any ignore files, we'll never ignore
+    # any paths:
+    if (len(ignorefiles) < 1):
+        return lambda x: False
+
+    ignore_list = []
+    for ignorefile in ignorefiles:
+        ignore_list += _read_ignore_file(ignorefile)
+
+    # If the ignore files contained no patterns, we'll never ignore
+    # any paths:
+    if (len(ignore_list) < 1):
+        return lambda x: False
+
+    def _ignore_func(path):
+        for regex in ignore_list:
+            if (regex.match(path)):
+                return True
+        return False
+
+    return _ignore_func
+
+# vim: set expandtab sw=4 ts=4:
--- old/usr/src/tools/onbld/Scm/Makefile	Tue Jan 22 19:17:33 2013
+++ new/usr/src/tools/onbld/Scm/Makefile	Tue Jan 22 19:17:33 2013
@@ -21,6 +21,7 @@
 
 #
 # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013, Joyent Inc. All rights reserved.
 #
 
 include $(SRC)/Makefile.master
@@ -29,6 +30,7 @@
 PYSRCS = \
 	__init__.py	\
 	Backup.py	\
+	Ignore.py	\
 	Version.py	\
 	WorkSpace.py
 
--- old/usr/src/tools/onbld/hgext/cdm.py	Tue Jan 22 19:17:33 2013
+++ new/usr/src/tools/onbld/hgext/cdm.py	Tue Jan 22 19:17:33 2013
@@ -16,6 +16,7 @@
 #
 # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
 # Copyright 2008, 2011 Richard Lowe
+# Copyright (c) 2013, Joyent Inc. All rights reserved.
 #
 
 '''OpenSolaris extensions to Mercurial
@@ -92,6 +93,7 @@
 sys.path.insert(2, os.path.join(os.path.dirname(__file__), "..", ".."))
 
 from onbld.Scm import Version
+from onbld.Scm import Ignore
 from mercurial import util
 
 try:
@@ -99,7 +101,7 @@
 except Version.VersionMismatch, badversion:
     raise util.Abort("Version Mismatch:\n %s\n" % badversion)
 
-from mercurial import cmdutil, ignore, node, patch
+from mercurial import cmdutil, node, patch
 
 from onbld.Scm.WorkSpace import WorkSpace, WorkList
 from onbld.Scm.Backup import CdmBackup
@@ -167,7 +169,7 @@
             ignorefiles.append(f)
 
     if ignorefiles:
-        ign = ignore.ignore(repo.root, ignorefiles, repo.ui.warn)
+        ign = Ignore.ignore(repo.root, ignorefiles)
         return canonified_check(ign)
     else:
         return util.never
--- old/usr/src/tools/scripts/git-pbchk.py	Tue Jan 22 19:17:33 2013
+++ new/usr/src/tools/scripts/git-pbchk.py	Tue Jan 22 19:17:33 2013
@@ -17,6 +17,7 @@
 #
 # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
 # Copyright 2008, 2012 Richard Lowe
+# Copyright (c) 2013, Joyent Inc. All rights reserved.
 #
 
 import getopt
@@ -28,10 +29,6 @@
 
 from cStringIO import StringIO
 
-# This is necessary because, in a fit of pique, we used hg-format ignore lists
-# for NOT files.
-from mercurial import ignore
-
 #
 # Adjust the load path based on our location and the version of python into
 # which it is being loaded.  This assumes the normal onbld directory
@@ -47,6 +44,7 @@
 #
 sys.path.insert(2, os.path.join(os.path.dirname(__file__), ".."))
 
+from onbld.Scm import Ignore
 from onbld.Checks import Comments, Copyright, CStyle, HdrChk
 from onbld.Checks import JStyle, Keywords, Mapfile
 
@@ -177,10 +175,7 @@
     ignorefiles = filter(os.path.exists,
                          [os.path.join(root, ".git", "%s.NOT" % cmd),
                           os.path.join(root, "exception_lists", cmd)])
-    if len(ignorefiles) > 0:
-        return ignore.ignore(root, ignorefiles, sys.stderr.write)
-    else:
-        return lambda x: False
+    return Ignore.ignore(root, ignorefiles)
 
 
 def gen_files(root, parent, paths, exclude):
