Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

maybe_string dealing with non-unicode strings #1329

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
2 changes: 1 addition & 1 deletion pygit2/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)'

Expand Down
2 changes: 1 addition & 1 deletion pygit2/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'):
Expand Down
45 changes: 45 additions & 0 deletions test/test_nonunicode.py
Original file line number Diff line number Diff line change
@@ -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'
Loading