Skip to content

Commit

Permalink
Merge pull request #1853 from jcole-crowdstrike/fix-branch-name-regex…
Browse files Browse the repository at this point in the history
…-to-handle-nbsp

Update regex pattern to handle unicode whitespaces.
  • Loading branch information
Byron authored Mar 11, 2024
2 parents 12c139c + 8b8c76a commit d40e7d0
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 18 deletions.
8 changes: 4 additions & 4 deletions git/remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ class FetchInfo(IterableObj):
ERROR,
) = [1 << x for x in range(8)]

_re_fetch_result = re.compile(r"^\s*(.) (\[[\w\s\.$@]+\]|[\w\.$@]+)\s+(.+) -> ([^\s]+)( \(.*\)?$)?")
_re_fetch_result = re.compile(r"^ *(.) (\[[\w \.$@]+\]|[\w\.$@]+) +(.+) -> ([^ ]+)( \(.*\)?$)?")

_flag_map: Dict[flagKeyLiteral, int] = {
"!": ERROR,
Expand Down Expand Up @@ -895,7 +895,7 @@ def _get_fetch_info_from_stderr(
None,
progress_handler,
finalizer=None,
decode_streams=False,
decode_streams=True,
kill_after_timeout=kill_after_timeout,
)

Expand Down Expand Up @@ -1072,7 +1072,7 @@ def fetch(
Git.check_unsafe_options(options=list(kwargs.keys()), unsafe_options=self.unsafe_git_fetch_options)

proc = self.repo.git.fetch(
"--", self, *args, as_process=True, with_stdout=False, universal_newlines=True, v=verbose, **kwargs
"--", self, *args, as_process=True, with_stdout=False, universal_newlines=False, v=verbose, **kwargs
)
res = self._get_fetch_info_from_stderr(proc, progress, kill_after_timeout=kill_after_timeout)
if hasattr(self.repo.odb, "update_cache"):
Expand Down Expand Up @@ -1126,7 +1126,7 @@ def pull(
Git.check_unsafe_options(options=list(kwargs.keys()), unsafe_options=self.unsafe_git_pull_options)

proc = self.repo.git.pull(
"--", self, refspec, with_stdout=False, as_process=True, universal_newlines=True, v=True, **kwargs
"--", self, refspec, with_stdout=False, as_process=True, universal_newlines=False, v=True, **kwargs
)
res = self._get_fetch_info_from_stderr(proc, progress, kill_after_timeout=kill_after_timeout)
if hasattr(self.repo.odb, "update_cache"):
Expand Down
14 changes: 0 additions & 14 deletions git/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -611,20 +611,6 @@ def _parse_progress_line(self, line: AnyStr) -> None:
self.error_lines.append(self._cur_line)
return

# Find escape characters and cut them away - regex will not work with
# them as they are non-ASCII. As git might expect a tty, it will send them.
last_valid_index = None
for i, c in enumerate(reversed(line_str)):
if ord(c) < 32:
# its a slice index
last_valid_index = -i - 1
# END character was non-ASCII
# END for each character in line
if last_valid_index is not None:
line_str = line_str[:last_valid_index]
# END cut away invalid part
line_str = line_str.rstrip()

cur_count, max_count = None, None
match = self.re_op_relative.match(line_str)
if match is None:
Expand Down
16 changes: 16 additions & 0 deletions test/test_remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -1002,6 +1002,22 @@ def test_push_unsafe_options_allowed(self, rw_repo):
assert tmp_file.exists()
tmp_file.unlink()

@with_rw_and_rw_remote_repo("0.1.6")
def test_fetch_unsafe_branch_name(self, rw_repo, remote_repo):
# Create branch with a name containing a NBSP
bad_branch_name = f"branch_with_{chr(160)}_nbsp"
Head.create(remote_repo, bad_branch_name)

# Fetch and get branches
remote = rw_repo.remote("origin")
branches = remote.fetch()

# Test for truncated branch name in branches
assert f"origin/{bad_branch_name}" in [b.name for b in branches]

# Cleanup branch
Head.delete(remote_repo, bad_branch_name)


class TestTimeouts(TestBase):
@with_rw_repo("HEAD", bare=False)
Expand Down

0 comments on commit d40e7d0

Please sign in to comment.