diff --git a/mercurial/fileset.py b/mercurial/fileset.py --- a/mercurial/fileset.py +++ b/mercurial/fileset.py @@ -256,6 +256,16 @@ def hgignore(mctx, x): ignore = mctx.ctx.repo().dirstate._ignore return [f for f in mctx.subset if ignore(f)] +def portable(mctx, x): + """``portable()`` + File that has a portable name. (This doesn't include filenames with case + collisions.) + """ + # i18n: "portable" is a keyword + getargs(x, 0, 0, _("portable takes no arguments")) + checkwinfilename = util.checkwinfilename + return [f for f in mctx.subset if checkwinfilename(f) is None] + def grep(mctx, x): """``grep(regex)`` File contains the given regular expression. @@ -416,6 +426,7 @@ symbols = { 'ignored': ignored, 'hgignore': hgignore, 'modified': modified, + 'portable': portable, 'removed': removed, 'resolved': resolved, 'size': size, diff --git a/tests/test-fileset.t b/tests/test-fileset.t --- a/tests/test-fileset.t +++ b/tests/test-fileset.t @@ -111,6 +111,28 @@ Test files properties $ hg add b2link #endif +#if no-windows + $ echo foo > con.xml + $ echo bar > 'bar ' + $ echo baz > 'baz\' + $ ls + b1 + b2 + b2link + bar + baz\ + bin + c1 + c2 + c3 + con.xml + $ fileset 'not portable()' + bar + baz\ + con.xml + $ hg --config ui.portablefilenames=ignore add con.xml 'bar ' 'baz\' +#endif + >>> file('1k', 'wb').write(' '*1024) >>> file('2k', 'wb').write(' '*2048) $ hg add 1k 2k @@ -220,6 +242,13 @@ Test with a revision b2link #endif +#if no-windows + $ fileset -r1 'not portable()' + bar + baz\ + con.xml +#endif + $ fileset -r4 'subrepo("re:su.*")' sub $ fileset -r4 'subrepo("sub")' @@ -242,7 +271,10 @@ Test with a revision a1 b1 b2 + bar + baz\ c1 + con.xml mixed $ fileset 'eol(mac)' mac