Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
6f520271
Commit
6f520271
authored
Dec 27, 2012
by
Hynek Schlawack
Browse files
Options
Browse Files
Download
Plain Diff
#16618: Make glob.glob match consistently across strings and bytes
Fixes handling of leading dots. Patch by Serhiy Storchaka.
parents
b172697c
e26568f8
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
59 additions
and
30 deletions
+59
-30
Lib/glob.py
Lib/glob.py
+5
-2
Lib/test/test_glob.py
Lib/test/test_glob.py
+51
-28
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/glob.py
View file @
6f520271
...
...
@@ -58,8 +58,8 @@ def glob1(dirname, pattern):
names
=
os
.
listdir
(
dirname
)
except
os
.
error
:
return
[]
if
pattern
[
0
]
!=
'.'
:
names
=
[
x
for
x
in
names
if
x
[
0
]
!=
'.'
]
if
not
_ishidden
(
pattern
)
:
names
=
[
x
for
x
in
names
if
not
_ishidden
(
x
)
]
return
fnmatch
.
filter
(
names
,
pattern
)
def
glob0
(
dirname
,
basename
):
...
...
@@ -83,3 +83,6 @@ def has_magic(s):
else
:
match
=
magic_check
.
search
(
s
)
return
match
is
not
None
def
_ishidden
(
path
):
return
path
[
0
]
in
(
'.'
,
b'.'
[
0
])
Lib/test/test_glob.py
View file @
6f520271
import
unittest
from
test.support
import
(
run_unittest
,
TESTFN
,
skip_unless_symlink
,
can_symlink
,
create_empty_file
)
import
glob
import
os
import
shutil
import
sys
import
unittest
from
test.support
import
(
run_unittest
,
TESTFN
,
skip_unless_symlink
,
can_symlink
,
create_empty_file
)
class
GlobTests
(
unittest
.
TestCase
):
...
...
@@ -31,7 +32,8 @@ class GlobTests(unittest.TestCase):
self
.
mktemp
(
'a'
,
'bcd'
,
'efg'
,
'ha'
)
if
can_symlink
():
os
.
symlink
(
self
.
norm
(
'broken'
),
self
.
norm
(
'sym1'
))
os
.
symlink
(
self
.
norm
(
'broken'
),
self
.
norm
(
'sym2'
))
os
.
symlink
(
'broken'
,
self
.
norm
(
'sym2'
))
os
.
symlink
(
os
.
path
.
join
(
'a'
,
'bcd'
),
self
.
norm
(
'sym3'
))
def
tearDown
(
self
):
shutil
.
rmtree
(
self
.
tempdir
)
...
...
@@ -44,10 +46,16 @@ class GlobTests(unittest.TestCase):
p
=
os
.
path
.
join
(
self
.
tempdir
,
pattern
)
res
=
glob
.
glob
(
p
)
self
.
assertEqual
(
list
(
glob
.
iglob
(
p
)),
res
)
bres
=
[
os
.
fsencode
(
x
)
for
x
in
res
]
self
.
assertEqual
(
glob
.
glob
(
os
.
fsencode
(
p
)),
bres
)
self
.
assertEqual
(
list
(
glob
.
iglob
(
os
.
fsencode
(
p
))),
bres
)
return
res
def
assertSequencesEqual_noorder
(
self
,
l1
,
l2
):
l1
=
list
(
l1
)
l2
=
list
(
l2
)
self
.
assertEqual
(
set
(
l1
),
set
(
l2
))
self
.
assertEqual
(
sorted
(
l1
),
sorted
(
l2
))
def
test_glob_literal
(
self
):
eq
=
self
.
assertSequencesEqual_noorder
...
...
@@ -56,15 +64,15 @@ class GlobTests(unittest.TestCase):
eq
(
self
.
glob
(
'aab'
),
[
self
.
norm
(
'aab'
)])
eq
(
self
.
glob
(
'zymurgy'
),
[])
# test return types are unicode, but only if os.listdir
# returns unicode filenames
uniset
=
set
([
str
]
)
tmp
=
os
.
listdir
(
'.'
)
if
set
(
type
(
x
)
for
x
in
tmp
)
==
uniset
:
u1
=
glob
.
glob
(
'*'
)
u2
=
glob
.
glob
(
'./*'
)
self
.
assertEqual
(
set
(
type
(
r
)
for
r
in
u1
),
uniset
)
self
.
assertEqual
(
set
(
type
(
r
)
for
r
in
u2
),
uniset
)
res
=
glob
.
glob
(
'*'
)
self
.
assertEqual
({
type
(
r
)
for
r
in
res
},
{
str
})
res
=
glob
.
glob
(
os
.
path
.
join
(
os
.
curdir
,
'*'
)
)
self
.
assertEqual
({
type
(
r
)
for
r
in
res
},
{
str
}
)
res
=
glob
.
glob
(
b
'*'
)
self
.
assertEqual
({
type
(
r
)
for
r
in
res
},
{
bytes
}
)
res
=
glob
.
glob
(
os
.
path
.
join
(
os
.
fsencode
(
os
.
curdir
),
b'*'
)
)
self
.
assertEqual
({
type
(
r
)
for
r
in
res
},
{
bytes
}
)
def
test_glob_one_directory
(
self
):
eq
=
self
.
assertSequencesEqual_noorder
...
...
@@ -93,20 +101,20 @@ class GlobTests(unittest.TestCase):
eq
(
self
.
glob
(
'*'
,
'*a'
),
[])
eq
(
self
.
glob
(
'a'
,
'*'
,
'*'
,
'*a'
),
[
self
.
norm
(
'a'
,
'bcd'
,
'efg'
,
'ha'
)])
eq
(
self
.
glob
(
'?a?'
,
'*F'
),
map
(
self
.
norm
,
[
os
.
path
.
join
(
'aaa'
,
'zzzF'
),
os
.
path
.
join
(
'aab'
,
'F'
)])
)
eq
(
self
.
glob
(
'?a?'
,
'*F'
),
[
self
.
norm
(
'aaa'
,
'zzzF'
),
self
.
norm
(
'aab'
,
'F'
)]
)
def
test_glob_directory_with_trailing_slash
(
self
):
# Patterns ending with a slash shouldn't match non-dirs
res
=
glob
.
glob
(
os
.
path
.
join
(
self
.
tempdir
,
'Z*Z'
)
+
os
.
sep
)
res
=
glob
.
glob
(
self
.
norm
(
'Z*Z'
)
+
os
.
sep
)
self
.
assertEqual
(
res
,
[])
res
=
glob
.
glob
(
os
.
path
.
join
(
self
.
tempdir
,
'ZZZ'
)
+
os
.
sep
)
res
=
glob
.
glob
(
self
.
norm
(
'ZZZ'
)
+
os
.
sep
)
self
.
assertEqual
(
res
,
[])
# When there is wildcard pattern which ends with os.sep, glob()
# When there is
a
wildcard pattern which ends with os.sep, glob()
# doesn't blow up.
res
=
glob
.
glob
(
os
.
path
.
join
(
self
.
tempdir
,
'aa*'
)
+
os
.
sep
)
res
=
glob
.
glob
(
self
.
norm
(
'aa*'
)
+
os
.
sep
)
self
.
assertEqual
(
len
(
res
),
2
)
# either of these results
are
reasonable
# either of these results
is
reasonable
self
.
assertIn
(
set
(
res
),
[
{
self
.
norm
(
'aaa'
),
self
.
norm
(
'aab'
)},
{
self
.
norm
(
'aaa'
)
+
os
.
sep
,
self
.
norm
(
'aab'
)
+
os
.
sep
},
...
...
@@ -115,22 +123,37 @@ class GlobTests(unittest.TestCase):
def
test_glob_bytes_directory_with_trailing_slash
(
self
):
# Same as test_glob_directory_with_trailing_slash, but with a
# bytes argument.
res
=
glob
.
glob
(
os
.
fsencode
(
os
.
path
.
join
(
self
.
tempdir
,
'Z*Z'
)
+
os
.
sep
))
res
=
glob
.
glob
(
os
.
fsencode
(
self
.
norm
(
'Z*Z'
)
+
os
.
sep
))
self
.
assertEqual
(
res
,
[])
res
=
glob
.
glob
(
os
.
fsencode
(
os
.
path
.
join
(
self
.
tempdir
,
'ZZZ'
)
+
os
.
sep
))
res
=
glob
.
glob
(
os
.
fsencode
(
self
.
norm
(
'ZZZ'
)
+
os
.
sep
))
self
.
assertEqual
(
res
,
[])
res
=
glob
.
glob
(
os
.
fsencode
(
os
.
path
.
join
(
self
.
tempdir
,
'aa*'
)
+
os
.
sep
))
res
=
glob
.
glob
(
os
.
fsencode
(
self
.
norm
(
'aa*'
)
+
os
.
sep
))
self
.
assertEqual
(
len
(
res
),
2
)
# either of these results are reasonable
self
.
assertIn
({
os
.
fsdecode
(
x
)
for
x
in
res
},
[
{
self
.
norm
(
'aaa'
),
self
.
norm
(
'aab'
)},
{
self
.
norm
(
'aaa'
)
+
os
.
sep
,
self
.
norm
(
'aab'
)
+
os
.
sep
},
# either of these results is reasonable
self
.
assertIn
(
set
(
res
),
[
{
os
.
fsencode
(
self
.
norm
(
'aaa'
)),
os
.
fsencode
(
self
.
norm
(
'aab'
))},
{
os
.
fsencode
(
self
.
norm
(
'aaa'
)
+
os
.
sep
),
os
.
fsencode
(
self
.
norm
(
'aab'
)
+
os
.
sep
)},
])
@
skip_unless_symlink
def
test_glob_symlinks
(
self
):
eq
=
self
.
assertSequencesEqual_noorder
eq
(
self
.
glob
(
'sym3'
),
[
self
.
norm
(
'sym3'
)])
eq
(
self
.
glob
(
'sym3'
,
'*'
),
[
self
.
norm
(
'sym3'
,
'EF'
),
self
.
norm
(
'sym3'
,
'efg'
)])
self
.
assertIn
(
self
.
glob
(
'sym3'
+
os
.
sep
),
[[
self
.
norm
(
'sym3'
)],
[
self
.
norm
(
'sym3'
)
+
os
.
sep
]])
eq
(
self
.
glob
(
'*'
,
'*F'
),
[
self
.
norm
(
'aaa'
,
'zzzF'
),
self
.
norm
(
'aab'
,
'F'
),
self
.
norm
(
'sym3'
,
'EF'
)])
@
skip_unless_symlink
def
test_glob_broken_symlinks
(
self
):
eq
=
self
.
assertSequencesEqual_noorder
eq
(
self
.
glob
(
'sym*'
),
[
self
.
norm
(
'sym1'
),
self
.
norm
(
'sym2'
)])
eq
(
self
.
glob
(
'sym*'
),
[
self
.
norm
(
'sym1'
),
self
.
norm
(
'sym2'
),
self
.
norm
(
'sym3'
)])
eq
(
self
.
glob
(
'sym1'
),
[
self
.
norm
(
'sym1'
)])
eq
(
self
.
glob
(
'sym2'
),
[
self
.
norm
(
'sym2'
)])
...
...
Misc/NEWS
View file @
6f520271
...
...
@@ -114,6 +114,9 @@ Core and Builtins
Library
-------
- Issue #16618: Make glob.glob match consistently across strings and bytes
regarding leading dots. Patch by Serhiy Storchaka.
- Issue #16702: test_urllib2_localnet tests now correctly ignores proxies for
localhost tests.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment