diff --git a/hgext/censor.py b/hgext/censor.py --- a/hgext/censor.py +++ b/hgext/censor.py @@ -47,6 +47,12 @@ def censor(ui, repo, path, rev='', tombs if not rev: raise util.Abort(_('must specify revision to censor')) + wctx = repo[None] + + m = scmutil.match(wctx, (path,)) + if m.anypats() or len(m.files()) != 1: + raise util.Abort(_('can only specify an explicit filename')) + path = m.files()[0] flog = repo.file(path) if not len(flog): raise util.Abort(_('cannot censor file with no history')) @@ -70,7 +76,6 @@ def censor(ui, repo, path, rev='', tombs raise util.Abort(_('cannot censor file in heads (%s)') % headlist, hint=_('clean/delete and commit first')) - wctx = repo[None] wp = wctx.parents() if ctx.node() in [p.node() for p in wp]: raise util.Abort(_('cannot censor working directory'), diff --git a/tests/test-censor.t b/tests/test-censor.t --- a/tests/test-censor.t +++ b/tests/test-censor.t @@ -72,7 +72,10 @@ Try to censor revision with too large of Censor revision with 2 offenses - $ hg censor -r $C2 -t "remove password" target +(this also tests file pattern matching: path relative to cwd case) + + $ mkdir -p foo/bar/baz + $ hg --cwd foo/bar/baz censor -r $C2 -t "remove password" ../../../target $ hg cat -r $H1 target Tainted file is now sanitized $ hg cat -r $H2 target @@ -89,7 +92,9 @@ Censor revision with 2 offenses Censor revision with 1 offense - $ hg censor -r $C1 target +(this also tests file pattern matching: with 'path:' scheme) + + $ hg --cwd foo/bar/baz censor -r $C1 path:target $ hg cat -r $H1 target Tainted file is now sanitized $ hg cat -r $H2 target