docs: def _read_next(cls, lines: List[str]) -> 'FilePatch':
          """
          Destructively extracts the next file patch from the line buffer.
          """
          # keep munching lines until we hit one starting with '---'
          while True:
              if not lines:
                  raise Exception("illegal file patch format: couldn't find line starting with '---'")
              line = lines[0]
              if line.startswith('---'):
                  break
              lines.pop(0)
  
          assert lines[0].startswith('---')
          assert lines[1].startswith('+++')
          old_fn = lines.pop(0)[4:].strip()
          new_fn = lines.pop(0)[4:].strip()
  
          hunks = []
          while lines:
              if not lines[0].startswith('@@'):
                  break
              hunks.append(Hunk._read_next(lines))
  
          return FilePatch(old_fn, new_fn, hunks)