Handle binary files gracefully in base_coder.py

This commit is contained in:
PierrunoYT 2025-05-03 20:38:33 +02:00
parent 2582a845dc
commit fbdf3ce823

View file

@ -572,23 +572,34 @@ class Coder:
def get_abs_fnames_content(self): def get_abs_fnames_content(self):
for fname in list(self.abs_fnames): for fname in list(self.abs_fnames):
content = self.io.read_text(fname) try:
content = self.io.read_text(fname)
if content is None: if content is None:
relative_fname = self.get_rel_fname(fname)
self.io.tool_warning(f"Dropping {relative_fname} from the chat.")
self.abs_fnames.remove(fname)
else:
yield fname, content
except UnicodeDecodeError:
# Skip binary files that can't be decoded as text
relative_fname = self.get_rel_fname(fname) relative_fname = self.get_rel_fname(fname)
self.io.tool_warning(f"Dropping {relative_fname} from the chat.") self.io.tool_warning(f"Dropping binary file {relative_fname} from the chat.")
self.abs_fnames.remove(fname) self.abs_fnames.remove(fname)
else:
yield fname, content
def choose_fence(self): def choose_fence(self):
all_content = "" all_content = ""
for _fname, content in self.get_abs_fnames_content(): for _fname, content in self.get_abs_fnames_content():
all_content += content + "\n" all_content += content + "\n"
for _fname in self.abs_read_only_fnames: for _fname in self.abs_read_only_fnames:
content = self.io.read_text(_fname) try:
if content is not None: content = self.io.read_text(_fname)
all_content += content + "\n" if content is not None:
all_content += content + "\n"
except UnicodeDecodeError:
# Skip binary files that can't be decoded as text
relative_fname = self.get_rel_fname(_fname)
self.io.tool_warning(f"Skipping binary file {relative_fname} when choosing fence.")
lines = all_content.splitlines() lines = all_content.splitlines()
good = False good = False
@ -634,14 +645,19 @@ class Coder:
def get_read_only_files_content(self): def get_read_only_files_content(self):
prompt = "" prompt = ""
for fname in self.abs_read_only_fnames: for fname in self.abs_read_only_fnames:
content = self.io.read_text(fname) try:
if content is not None and not is_image_file(fname): content = self.io.read_text(fname)
if content is not None and not is_image_file(fname):
relative_fname = self.get_rel_fname(fname)
prompt += "\n"
prompt += relative_fname
prompt += f"\n{self.fence[0]}\n"
prompt += content
prompt += f"{self.fence[1]}\n"
except UnicodeDecodeError:
# Skip binary files that can't be decoded as text
relative_fname = self.get_rel_fname(fname) relative_fname = self.get_rel_fname(fname)
prompt += "\n" self.io.tool_warning(f"Skipping binary file {relative_fname} from read-only files.")
prompt += relative_fname
prompt += f"\n{self.fence[0]}\n"
prompt += content
prompt += f"{self.fence[1]}\n"
return prompt return prompt
def get_cur_message_text(self): def get_cur_message_text(self):