summaryrefslogtreecommitdiff
path: root/git
diff options
context:
space:
mode:
authorSebastian Thiel <sebastian.thiel@icloud.com>2021-04-14 13:54:23 +0800
committerSebastian Thiel <sebastian.thiel@icloud.com>2021-04-14 13:54:23 +0800
commit651a81ded00eb993977bcdc6d65f157c751edb02 (patch)
treefa3b412afe8e1f6c92adff32700df3af350aad34 /git
parent14fc8bd3e5a8249224b774ea9052c9a701fc8e0f (diff)
downloadgitpython-651a81ded00eb993977bcdc6d65f157c751edb02.tar.gz
refactor; add failing test to validate #1210
Diffstat (limited to 'git')
-rw-r--r--git/diff.py107
m---------git/ext/gitdb0
2 files changed, 54 insertions, 53 deletions
diff --git a/git/diff.py b/git/diff.py
index 129223cb..deedb635 100644
--- a/git/diff.py
+++ b/git/diff.py
@@ -490,6 +490,58 @@ class Diff(object):
return index
+ @staticmethod
+ def _handle_diff_line(lines_bytes: bytes, repo: 'Repo', index: TBD) -> None:
+ lines = lines_bytes.decode(defenc)
+
+ for line in lines.split(':')[1:]:
+ meta, _, path = line.partition('\x00')
+ path = path.rstrip('\x00')
+ a_blob_id, b_blob_id = None, None # Type: Optional[str]
+ old_mode, new_mode, a_blob_id, b_blob_id, _change_type = meta.split(None, 4)
+ # Change type can be R100
+ # R: status letter
+ # 100: score (in case of copy and rename)
+ change_type = _change_type[0]
+ score_str = ''.join(_change_type[1:])
+ score = int(score_str) if score_str.isdigit() else None
+ path = path.strip()
+ a_path = path.encode(defenc)
+ b_path = path.encode(defenc)
+ deleted_file = False
+ new_file = False
+ copied_file = False
+ rename_from = None
+ rename_to = None
+
+ # NOTE: We cannot conclude from the existence of a blob to change type
+ # as diffs with the working do not have blobs yet
+ if change_type == 'D':
+ b_blob_id = None # Optional[str]
+ deleted_file = True
+ elif change_type == 'A':
+ a_blob_id = None
+ new_file = True
+ elif change_type == 'C':
+ copied_file = True
+ a_path_str, b_path_str = path.split('\x00', 1)
+ a_path = a_path_str.encode(defenc)
+ b_path = b_path_str.encode(defenc)
+ elif change_type == 'R':
+ a_path_str, b_path_str = path.split('\x00', 1)
+ a_path = a_path_str.encode(defenc)
+ b_path = b_path_str.encode(defenc)
+ rename_from, rename_to = a_path, b_path
+ elif change_type == 'T':
+ # Nothing to do
+ pass
+ # END add/remove handling
+
+ diff = Diff(repo, a_path, b_path, a_blob_id, b_blob_id, old_mode, new_mode,
+ new_file, deleted_file, copied_file, rename_from, rename_to,
+ '', change_type, score)
+ index.append(diff)
+
@classmethod
def _index_from_raw_format(cls, repo: 'Repo', proc: TBD) -> DiffIndex:
"""Create a new DiffIndex from the given stream which must be in raw format.
@@ -498,58 +550,7 @@ class Diff(object):
# :100644 100644 687099101... 37c5e30c8... M .gitignore
index = DiffIndex()
-
- def handle_diff_line(lines_bytes: bytes) -> None:
- lines = lines_bytes.decode(defenc)
-
- for line in lines.split(':')[1:]:
- meta, _, path = line.partition('\x00')
- path = path.rstrip('\x00')
- a_blob_id, b_blob_id = None, None # Type: Optional[str]
- old_mode, new_mode, a_blob_id, b_blob_id, _change_type = meta.split(None, 4)
- # Change type can be R100
- # R: status letter
- # 100: score (in case of copy and rename)
- change_type = _change_type[0]
- score_str = ''.join(_change_type[1:])
- score = int(score_str) if score_str.isdigit() else None
- path = path.strip()
- a_path = path.encode(defenc)
- b_path = path.encode(defenc)
- deleted_file = False
- new_file = False
- copied_file = False
- rename_from = None
- rename_to = None
-
- # NOTE: We cannot conclude from the existence of a blob to change type
- # as diffs with the working do not have blobs yet
- if change_type == 'D':
- b_blob_id = None # Optional[str]
- deleted_file = True
- elif change_type == 'A':
- a_blob_id = None
- new_file = True
- elif change_type == 'C':
- copied_file = True
- a_path_str, b_path_str = path.split('\x00', 1)
- a_path = a_path_str.encode(defenc)
- b_path = b_path_str.encode(defenc)
- elif change_type == 'R':
- a_path_str, b_path_str = path.split('\x00', 1)
- a_path = a_path_str.encode(defenc)
- b_path = b_path_str.encode(defenc)
- rename_from, rename_to = a_path, b_path
- elif change_type == 'T':
- # Nothing to do
- pass
- # END add/remove handling
-
- diff = Diff(repo, a_path, b_path, a_blob_id, b_blob_id, old_mode, new_mode,
- new_file, deleted_file, copied_file, rename_from, rename_to,
- '', change_type, score)
- index.append(diff)
-
- handle_process_output(proc, handle_diff_line, None, finalize_process, decode_streams=False)
+ handle_process_output(proc, lambda bytes: cls._handle_diff_line(
+ bytes, repo, index), None, finalize_process, decode_streams=False)
return index
diff --git a/git/ext/gitdb b/git/ext/gitdb
-Subproject e45fd0792ee9a987a4df26e3139f5c3b107f009
+Subproject 03ab3a1d40c04d6a944299c21db61cf9ce30f6b