# HG changeset patch # User Jim Hague # Date 2010-12-17 12:05:45 # Node ID 684a977c2ae0f2e678e9e1c41524e7edd9f8d316 # Parent 592998ba34668af1ad2f6e5e2a45e01c1c954d9b opener: forbid paths ending with directory separator (issue2507) If Linux is asked to open a filename with a trailing directory separator, e.g. "foo/", the open fails with EISDIR. On AIX, the open succeeds, opening file "foo". This causes test-mq-qnew to fail on AIX. Fix by adding 'ends with directory separator' to the conditions checked by the path auditor. Change test to expect auditor fail message. diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -487,6 +487,7 @@ class path_auditor(object): '''ensure that a filesystem path contains no banned components. the following properties of a path are checked: + - ends with a directory separator - under top-level .hg - starts at the root of a windows drive - contains ".." @@ -504,6 +505,9 @@ class path_auditor(object): def __call__(self, path): if path in self.audited: return + # AIX ignores "/" at end of path, others raise EISDIR. + if endswithsep(path): + raise Abort(_("path ends in directory separator: %s") % path) normpath = os.path.normcase(path) parts = splitpath(normpath) if (os.path.splitdrive(path)[0] diff --git a/tests/test-mq-qnew.t b/tests/test-mq-qnew.t --- a/tests/test-mq-qnew.t +++ b/tests/test-mq-qnew.t @@ -107,7 +107,7 @@ plain headers abort: "foo#bar" cannot be used as the name of a patch abort: "foo:bar" cannot be used as the name of a patch % qnew with name containing slash - abort: cannot write patch "foo/": (Is a|No such file or) directory (re) + abort: path ends in directory separator: foo/ abort: "foo" already exists as a directory foo/bar.patch popping foo/bar.patch @@ -172,7 +172,7 @@ hg headers abort: "foo#bar" cannot be used as the name of a patch abort: "foo:bar" cannot be used as the name of a patch % qnew with name containing slash - abort: cannot write patch "foo/": (Is a|No such file or) directory (re) + abort: path ends in directory separator: foo/ abort: "foo" already exists as a directory foo/bar.patch popping foo/bar.patch