diff --git a/pygit2/errors.py b/pygit2/errors.py index d95bfaa6..be13dfc4 100644 --- a/pygit2/errors.py +++ b/pygit2/errors.py @@ -42,7 +42,7 @@ def check_error(err, io=False): # Error message giterr = C.git_error_last() if giterr != ffi.NULL: - message = ffi.string(giterr.message).decode('utf8') + message = ffi.string(giterr.message).decode('utf8', errors='surrogateescape') else: message = f'err {err} (no message provided)' diff --git a/pygit2/utils.py b/pygit2/utils.py index 6a595e55..3720888f 100644 --- a/pygit2/utils.py +++ b/pygit2/utils.py @@ -34,7 +34,7 @@ def maybe_string(ptr): if not ptr: return None - return ffi.string(ptr).decode('utf8') + return ffi.string(ptr).decode('utf8', errors='surrogateescape') def to_bytes(s, encoding='utf-8', errors='strict'): diff --git a/test/test_nonunicode.py b/test/test_nonunicode.py new file mode 100644 index 00000000..06dfc0fc --- /dev/null +++ b/test/test_nonunicode.py @@ -0,0 +1,45 @@ +# Copyright 2010-2024 The pygit2 contributors +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License, version 2, +# as published by the Free Software Foundation. +# +# In addition to the permissions in the GNU General Public License, +# the authors give you unlimited permission to link the compiled +# version of this file into combinations with other programs, +# and to distribute those combinations without any restriction +# coming from the use of this file. (The General Public License +# restrictions do apply in other respects; for example, they cover +# modification of the file, and distribution when not linked into +# a combined executable.) +# +# This file is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +"""Tests for non unicode byte strings""" + +import pygit2 +import os +import shutil + + +bstring = b'\xc3master' + +def test_nonunicode_branchname(testrepo): + folderpath = 'temp_repo_nonutf' + if os.path.exists(folderpath): + shutil.rmtree(folderpath) + newrepo = pygit2.clone_repository( + path=folderpath, url='https://github.com/pygit2/test_branch_notutf.git' + ) + assert bstring in [ + (ref.split('/')[-1]).encode('utf8', 'surrogateescape') + for ref in newrepo.listall_references() + ] # Remote branch among references: 'refs/remotes/origin/\udcc3master'