Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 18 additions & 15 deletions django/core/files/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,30 +74,33 @@ def multiple_chunks(self, chunk_size=None):

def __iter__(self):
# Iterate over this file-like object by newlines
buffer_ = None
buffer_ = []
for chunk in self.chunks():
for line in chunk.splitlines(True):
if buffer_:
if endswith_cr(buffer_) and not equals_lf(line):
if endswith_cr(buffer_[-1]) and not equals_lf(line):
# Line split after a \r newline; yield buffer_.
yield buffer_
yield type(buffer_[0])().join(buffer_)
# Continue with line.
buffer_ = []
else:
# Line either split without a newline (line
# continues after buffer_) or with \r\n
# newline (line == b'\n').
line = buffer_ + line
# buffer_ handled, clear it.
buffer_ = None

# If this is the end of a \n or \r\n line, yield.
if endswith_lf(line):
yield line
else:
buffer_ = line

if buffer_ is not None:
yield buffer_
buffer_.append(line)

if not buffer_:
# If this is the end of a \n or \r\n line, yield.
if endswith_lf(line):
yield line
else:
buffer_.append(line)
elif endswith_lf(line):
yield type(buffer_[0])().join(buffer_)
buffer_ = []

if buffer_:
yield type(buffer_[0])().join(buffer_)

def __enter__(self):
return self
Expand Down