Skip to content

Commit 04da940

Browse files
committed
(backport) yield_sequences_in_list: use unique key for single files with no frame to prevent name collision with same basename using frames (refs #135)
1 parent 584ee22 commit 04da940

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

src/fileseq/filesequence.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,8 @@ def yield_sequences_in_list(
814814
:obj:`FileSequence`:
815815
"""
816816
seqs = {}
817+
variant_seq = 0
818+
variant_single = 1
817819
if allow_subframes:
818820
_check = cls.DISK_SUB_RE.match
819821
else:
@@ -839,7 +841,7 @@ def yield_sequences_in_list(
839841
except decimal.DecimalException:
840842
continue
841843
_, _, subframe = frame.partition(".")
842-
key = (dirname, basename, ext, len(subframe))
844+
key = (dirname, basename, ext, len(subframe), variant_seq)
843845
seqs.setdefault(key, frames).add(frame)
844846

845847
else:
@@ -849,9 +851,9 @@ def yield_sequences_in_list(
849851
continue
850852
if frame:
851853
_, _, subframe = frame.partition(".")
852-
key = (dirname, basename, ext, len(subframe))
854+
key = (dirname, basename, ext, len(subframe), variant_seq)
853855
else:
854-
key = (dirname, basename, ext, 0)
856+
key = (dirname, basename, ext, 0, variant_single)
855857
seqs.setdefault(key, set())
856858
if frame:
857859
seqs[key].add(frame)
@@ -896,7 +898,8 @@ def frames_to_seq(frames, pad_length, decimal_places):
896898
finish_new_seq(seq)
897899
return seq
898900

899-
for (dirname, basename, ext, decimal_places), frames in iteritems(seqs):
901+
for parts, frames in iteritems(seqs):
902+
(dirname, basename, ext, decimal_places) = parts[:4]
900903
# Short-circuit logic if we do not have multiple frames, since we
901904
# only need to build and return a single simple sequence
902905
if not frames:

test/test_unit.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,22 @@ def test_yield_sequences_in_list_pad_style(self):
13611361
self.assertEqual(fileseq.PAD_STYLE_HASH1, actual.padStyle())
13621362
self.assertEqual(4, actual.zfill())
13631363

1364+
def test_yield_sequences_in_list_frame_no_frame(self):
1365+
paths = [
1366+
'frame_no_frame/file02.jpg',
1367+
'frame_no_frame/file.jpg',
1368+
'frame_no_frame/name.jpg',
1369+
]
1370+
1371+
expects = [
1372+
'frame_no_frame/file2@@.jpg',
1373+
'frame_no_frame/file.jpg',
1374+
'frame_no_frame/name.jpg',
1375+
]
1376+
actual = {str(fs) for fs in FileSequence.yield_sequences_in_list(paths)}
1377+
for expect in expects:
1378+
self.assertIn(expect, actual)
1379+
13641380
def testIgnoreFrameSetStrings(self):
13651381
for char in "xy:,".split():
13661382
fs = FileSequence("/path/to/file{0}1-1x1#.exr".format(char))

0 commit comments

Comments
 (0)