gitbolt 0.0.0.dev19__tar.gz → 0.0.0.dev21__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/PKG-INFO +2 -2
  2. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/README.md +1 -1
  3. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/pyproject.toml +1 -1
  4. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/__init__.py +1 -0
  5. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/base.py +15 -4
  6. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/utils/models.py +3 -1
  7. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/utils/session.py +45 -17
  8. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt.egg-info/PKG-INFO +2 -2
  9. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/LICENSE +0 -0
  10. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/setup.cfg +0 -0
  11. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/__init__.py +0 -0
  12. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/_internal_init.py +0 -0
  13. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/add.py +0 -0
  14. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/base.py +0 -0
  15. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/constants.py +0 -0
  16. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/exceptions.py +0 -0
  17. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/ls_tree.py +0 -0
  18. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/models.py +0 -0
  19. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/py.typed +0 -0
  20. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/pytest_plugin.py +0 -0
  21. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/_internal_init.py +0 -0
  22. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/add.py +0 -0
  23. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/constants.py +0 -0
  24. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/exceptions.py +0 -0
  25. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/impl/__init__.py +0 -0
  26. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/impl/simple.py +0 -0
  27. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/ls_tree.py +0 -0
  28. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/runner/__init__.py +0 -0
  29. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/runner/base.py +0 -0
  30. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/runner/simple.py +0 -0
  31. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/utils/__init__.py +0 -0
  32. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/subprocess/utils/cmd.py +0 -0
  33. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt/utils.py +0 -0
  34. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt.egg-info/SOURCES.txt +0 -0
  35. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt.egg-info/dependency_links.txt +0 -0
  36. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt.egg-info/entry_points.txt +0 -0
  37. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt.egg-info/requires.txt +0 -0
  38. {gitbolt-0.0.0.dev19 → gitbolt-0.0.0.dev21}/src/gitbolt.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitbolt
3
- Version: 0.0.0.dev19
3
+ Version: 0.0.0.dev21
4
4
  Summary: Fast, flexible and type-safe Git commands in Python.
5
5
  Author-email: Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech>
6
6
  Maintainer-email: Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech>
@@ -386,7 +386,7 @@ with git.session(
386
386
  cat_file2=["cat-file", "--batch"],
387
387
  cat_file3=lambda: git.subcmd_unchecked.popen(["cat-file", "--batch"]), # pass your own git subcmd Popen(s)
388
388
  mktree=["mktree", "--batch", "-z"]
389
- ) as ses:
389
+ ) as ses: # reusable and reentrant session
390
390
  tree_data: list[bytes] = []
391
391
  for mode_, sha_, name_ in cat_file_tree_data(ses.commands.cat_file2, b"HEAD^{tree}"):
392
392
  print(mode_, sha_, name_)
@@ -350,7 +350,7 @@ with git.session(
350
350
  cat_file2=["cat-file", "--batch"],
351
351
  cat_file3=lambda: git.subcmd_unchecked.popen(["cat-file", "--batch"]), # pass your own git subcmd Popen(s)
352
352
  mktree=["mktree", "--batch", "-z"]
353
- ) as ses:
353
+ ) as ses: # reusable and reentrant session
354
354
  tree_data: list[bytes] = []
355
355
  for mode_, sha_, name_ in cat_file_tree_data(ses.commands.cat_file2, b"HEAD^{tree}"):
356
356
  print(mode_, sha_, name_)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gitbolt"
3
- version = "0.0.0.dev19"
3
+ version = "0.0.0.dev21"
4
4
  description = "Fast, flexible and type-safe Git commands in Python."
5
5
  requires-python = ">=3.12"
6
6
  readme = "README.md"
@@ -12,4 +12,5 @@ from gitbolt.subprocess.base import AddCommand as AddCommand
12
12
  from gitbolt.subprocess.base import LsTreeCommand as LsTreeCommand
13
13
  from gitbolt.subprocess.base import VersionCommand as VersionCommand
14
14
  from gitbolt.subprocess.base import UncheckedSubcmd as UncheckedSubcmd
15
+ from gitbolt.subprocess.base import GitSession as GitSession
15
16
  # endregion
@@ -392,18 +392,20 @@ class GitSession(HasGitUnderneath[GitCommand], AbstractContextManager):
392
392
  :param commands: commands in kwargs fashion.
393
393
  """
394
394
  self._git = git
395
- self.unstarted_commands: dict[str, Callable[[], Popen[bytes]]] = commands
395
+ self.all_supplied_commands: dict[str, Callable[[], Popen[bytes]]] = commands.copy()
396
396
  self.started_commands: dict[str, Popen[bytes]] = dict()
397
397
  self._commands: SimpleNamespace | None = None
398
398
  self.__started = False
399
399
  self.__done = False
400
400
  self.__depth = 0
401
+ self.__times_reused = -1
401
402
 
402
403
  @override
403
404
  def __enter__(self) -> Self:
404
405
  if self.depth == 0:
406
+ self.__done = False
405
407
  processes_started_keys: list[str] = []
406
- for unstarted_command_key, unstarted_command in self.unstarted_commands.items():
408
+ for unstarted_command_key, unstarted_command in self.all_supplied_commands.items():
407
409
  try:
408
410
  self.started_commands[unstarted_command_key] = unstarted_command().__enter__()
409
411
  except Exception:
@@ -412,9 +414,8 @@ class GitSession(HasGitUnderneath[GitCommand], AbstractContextManager):
412
414
  raise
413
415
  processes_started_keys.append(unstarted_command_key)
414
416
  self._commands = SimpleNamespace(**self.started_commands)
415
- for pk in processes_started_keys:
416
- del self.unstarted_commands[pk]
417
417
  self.__started = True
418
+ self.__times_reused += 1
418
419
  self.__depth += 1
419
420
  return self
420
421
 
@@ -475,6 +476,16 @@ class GitSession(HasGitUnderneath[GitCommand], AbstractContextManager):
475
476
  """
476
477
  return self.__depth
477
478
 
479
+ def is_reused(self) -> bool:
480
+ """
481
+ :returns: The session is reused after being closed once.
482
+ """
483
+ return self.__times_reused > 0
484
+
485
+ @property
486
+ def times_reused(self) -> int:
487
+ return self.__times_reused
488
+
478
489
 
479
490
  class GitSubcmdCommand(GitSubCommand, HasGitUnderneath["GitCommand"], Protocol):
480
491
  """
@@ -34,7 +34,8 @@ class GitRawActor:
34
34
  >>> _ss_actor2 = GitRawActor.from_commit_bytes(b"Suhas Srivastava <sss@vaastav.tech> 1780211249 +0530")
35
35
  >>> assert _ss_actor2.name == b"Suhas Srivastava"
36
36
  >>> assert _ss_actor2.email == b"sss@vaastav.tech"
37
- >>> assert _ss_actor2.time.timestamp() == 1780211249.0
37
+
38
+ # failing timezone test >>> assert _ss_actor2.time.timestamp() == 1780211249.0
38
39
 
39
40
  :param commit_bytes: author/committer information in bytes form.
40
41
  :param email_start_pattern: email spearates name and timestamp. Thus is required as a separator.
@@ -49,6 +50,7 @@ class GitRawActor:
49
50
  email_end_index = email_pattern_end_index
50
51
  name = commit_bytes[:email_pattern_start_index]
51
52
  email = commit_bytes[email_start_index:email_end_index]
53
+ # TODO: handle timezone correctly
52
54
  time_bytes = commit_bytes[email_end_index+len(email_end_pattern):]
53
55
  time_main, time_zone = time_bytes.split() if b" " in time_bytes else (time_bytes, b"")
54
56
  date_time_for_iso_str = datetime.datetime.fromtimestamp(int(time_main))
@@ -204,14 +204,29 @@ def mktree_tree_make(mktree_popen: subprocess.Popen[bytes], mktree_null_delimite
204
204
  :returns: the created tree hash.
205
205
  """
206
206
  write_obj = mktree_null_delimited_content + b"\0\0"
207
- mktree_popen_stdin: IO[bytes] = cast(IO[bytes], mktree_popen.stdin) # stdin is assumed to be piped
208
- mktree_popen_stdout: IO[bytes] = cast(IO[bytes], mktree_popen.stdout) # stdout is assumed to be piped
209
- mktree_popen_stdin.write(write_obj)
210
- mktree_popen_stdin.flush()
211
- tree_hash = mktree_popen_stdout.readline()
207
+ tree_hash = single_shot_command(mktree_popen, write_obj, True)
212
208
  return tree_hash.strip()
213
209
 
214
210
 
211
+ def single_shot_command(long_running_popen: subprocess.Popen[bytes], write_obj: bytes, readline: bool) -> bytes:
212
+ """
213
+ Make a git tree using ``mktree`` Popen and tree data to get a git tree.
214
+
215
+ Natively supports null-terminated tree entries or ``git mktree --batch -z`` mode.
216
+
217
+ :param long_running_popen: long-running subprocess.Popen.
218
+ :param write_obj: object to write to the stdin of the long-running process.
219
+ :param readline: stop at readline or read the whole stdout.
220
+ :returns: the created tree hash.
221
+ """
222
+ _popen_stdin: IO[bytes] = cast(IO[bytes], long_running_popen.stdin) # stdin is assumed to be piped
223
+ _popen_stdout: IO[bytes] = cast(IO[bytes], long_running_popen.stdout) # stdout is assumed to be piped
224
+ _popen_stdin.write(write_obj)
225
+ _popen_stdin.flush()
226
+ _popen_out = _popen_stdout.readline() if readline else _popen_stdout.read()
227
+ return _popen_out
228
+
229
+
215
230
  def mktree_tree_data_make(mktree_popen: subprocess.Popen[bytes], mktree_entries: Iterable[bytes]) -> bytes:
216
231
  """
217
232
  Make a git tree using ``mktree`` Popen and tree data to get a git tree.
@@ -297,7 +312,7 @@ def parse_cat_file_commit_content(commit_cat_file_content) -> RawBytesValsOfComm
297
312
  >>> assert _parsed_simple_commit_content.author_val == b"Suhas Krishna Srivastava <suhasCanDoSo@gmail.com> 1780213058 +0530"
298
313
  >>> assert _parsed_simple_commit_content.committer_val == b"Suhas Krishna Srivastava <suhasCanDoSo@gmail.com> 1780213152 +0530"
299
314
  >>> assert _parsed_simple_commit_content.signature_val is None
300
- >>> assert _parsed_simple_commit_content.commit_message == b"session: add doctests to `Actor.from_commit_bytes()`"
315
+ >>> assert _parsed_simple_commit_content.commit_message == b"session: add doctests to `Actor.from_commit_bytes()`\\n"
301
316
 
302
317
  Multiple parents:
303
318
 
@@ -321,7 +336,7 @@ def parse_cat_file_commit_content(commit_cat_file_content) -> RawBytesValsOfComm
321
336
  >>> assert _parsed_multi_parent_commit.author_val == b"Suhas Krishna Srivastava <suhasCanDoSo@gmail.com> 1779643218 +0530"
322
337
  >>> assert _parsed_multi_parent_commit.committer_val == b"Suhas Krishna Srivastava <suhasCanDoSo@gmail.com> 1779643218 +0530"
323
338
  >>> assert _parsed_multi_parent_commit.signature_val is None
324
- >>> assert _parsed_multi_parent_commit.commit_message == b"Introduce `Popen`\\n\\nMerge branch 'feat/run-and-popen/main' into develop\\n\\n- Introduced `Popen` interface in runner.\\n- Introduced `Popen` interface in UncheckedSubcmd."
339
+ >>> assert _parsed_multi_parent_commit.commit_message == b"Introduce `Popen`\\n\\nMerge branch 'feat/run-and-popen/main' into develop\\n\\n- Introduced `Popen` interface in runner.\\n- Introduced `Popen` interface in UncheckedSubcmd.\\n"
325
340
 
326
341
  GPG Signed commit:
327
342
 
@@ -355,7 +370,7 @@ def parse_cat_file_commit_content(commit_cat_file_content) -> RawBytesValsOfComm
355
370
  >>> assert _parsed_gpg_sig_commit.author_val == b"Suhas Krishna Srivastava <suhasCanDoSo@gmail.com> 1779877779 +0530"
356
371
  >>> assert _parsed_gpg_sig_commit.committer_val == b"Suhas Krishna Srivastava <suhasCanDoSo@gmail.com> 1779877779 +0530"
357
372
  >>> assert _parsed_gpg_sig_commit.signature_val == b"-----BEGIN PGP SIGNATURE-----\\n\\niHUEABYKAB0WIQRBZelV8q2CQXy8Vg8vtl2qydHBMAUCahbHsAAKCRAvtl2qydHB\\nMNrAAP9ZYoOfzSHJsnNsocCxqdf0K5Dh0mWbo9hUAYtsKlv/HQEAi8J/jYBqY9lz\\ns6M7/A1YuKWMigDLTbMmjRg6uUgHOAM=\\n=5rmu\\n-----END PGP SIGNATURE-----"
358
- >>> assert _parsed_gpg_sig_commit.commit_message == b"Releasing `0.0.0.dev18`\\n\\n- `GitSession` improved.\\n- `GitSession` reexported in `gitbolt`.\\n- Popen no longer unbuffered.\\n- Sessions by default are in `bytes` mode and pipe their `stdin` and `stdout`.\\n\\n- `GitSession` now returns `Self` on `__enter__()`. Glad caught early.\\n- Utilities for git subprocess commands and Popen(s).\\n\\nSigned-off-by: Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech>"
373
+ >>> assert _parsed_gpg_sig_commit.commit_message == b"Releasing `0.0.0.dev18`\\n\\n- `GitSession` improved.\\n- `GitSession` reexported in `gitbolt`.\\n- Popen no longer unbuffered.\\n- Sessions by default are in `bytes` mode and pipe their `stdin` and `stdout`.\\n\\n- `GitSession` now returns `Self` on `__enter__()`. Glad caught early.\\n- Utilities for git subprocess commands and Popen(s).\\n\\nSigned-off-by: Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech>\\n"
359
374
 
360
375
  No message commit:
361
376
 
@@ -364,7 +379,6 @@ def parse_cat_file_commit_content(commit_cat_file_content) -> RawBytesValsOfComm
364
379
  ... author Suhas Krishna Srivastava <suhasCanDoSo@gmail.com> 1779877779 +0530
365
380
  ... committer Suhas Krishna Srivastava <suhasCanDoSo@gmail.com> 1779877779 +0530
366
381
  ...
367
- ...
368
382
  ... \"\"\"
369
383
  >>> _parsed_no_msg_commit = parse_cat_file_commit_content(_no_msg_commit)
370
384
  >>> assert _parsed_no_msg_commit.tree_val == b"e26c61179203eea2b5c6a14dfff31621b74654c7"
@@ -403,7 +417,7 @@ def parse_cat_file_commit_content(commit_cat_file_content) -> RawBytesValsOfComm
403
417
  >>> assert _parsed_no_parent_commit.commit_parents_vals == []
404
418
  >>> assert _parsed_no_parent_commit.author_val == b"Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech> 1747405354 +0530"
405
419
  >>> assert _parsed_no_parent_commit.committer_val == b"GitHub <noreply@github.com> 1747405354 +0530"
406
- >>> assert _parsed_no_parent_commit.commit_message == b"Initial commit"
420
+ >>> assert _parsed_no_parent_commit.commit_message == b"\\nInitial commit"
407
421
  >>> assert _parsed_no_parent_commit.signature_val == b"-----BEGIN PGP SIGNATURE-----\\n\\nwsFcBAABCAAQBQJoJ0oqCRC1aQ7uu5UhlAAABbQQAKnq3HAThX2whGmo4+u5Czg/\\nAybUlY396eoUd9JMoPF+E8+BVWe4ulVmbnWkPBW4iEUtqJzeNA9ULPNnMYMa1Dtu\\niu+IbMt3hh5FuLVtpA+92V9U+0RwpwYjX48dDeVfAWMz9QsI1z4SMUPZmyb7cV2J\\noAcStdGLPhZGa0RSRxFm+KuoZRCWSJ65a8HYpR0zI8sKvTZaFrS+ItxtvALkMBL7\\ndsbdbTNtyPrdqYFhA7BNe7cisd5Avob01CMkV3aPwLFKtFdtS7WPLwwR0fXhOLZV\\nDiYe7Tu+NrVcQJe1QLjkek4DnaN0ph4Xyi/K0CW4FJZ4vXIUI99Z9FP0QKiEX7bN\\nXWyBchwwqFiE17PcSkLOLX0VUCIYdF0w6pj4AzNpSn8PY0jEg0FLbnfj+ZDfBhxl\\ncUvh0obhnxdd4BafqzWSJPpzhCwx3NjkuNA1464BcerCTy7XkNxPtYyTDfLWD12x\\nPVRKAqhm/z2yHyP93maRYY9R/Qvx7n5XJBFh+5w66e3Gvb+RaQQ8HcyJKbz+I/PJ\\ntSRRAm1ROTnCLdWzjzimbOT4agKgwG53HqeaRLzqteu+lTr64LH5ZZZkAUd9v+C9\\ncJb41OV3hHdP0+evTn471JU7YQlCYiQK+Ps04TsUX1MwRgoNq1+znk27PK7B1XUF\\n21sfF75JL4q7VsU/dpCU\\n=0m4k\\n-----END PGP SIGNATURE-----"
408
422
 
409
423
  Note: strips commit message.
@@ -449,7 +463,6 @@ def parse_cat_file_commit_content(commit_cat_file_content) -> RawBytesValsOfComm
449
463
  ssh_sigval = sanitize_sig_bytes(ssh_sig_val) if ssh_sig_val else None
450
464
  curr_bytes_ptr += 1 # include \n as commit message starts after that.
451
465
  commit_message = commit_cat_file_content[curr_bytes_ptr:]
452
- commit_message = commit_message.strip()
453
466
  return RawBytesValsOfCommit(tree_val, commit_parents, author_val, committer_val, gpg_sigval or ssh_sigval,
454
467
  commit_message, )
455
468
 
@@ -531,13 +544,16 @@ if __name__ == "__main__":
531
544
  for tree_line in cat_file_tree_content(ses.commands.cat_file1, b"HEAD^{tree}"):
532
545
  print(tree_line.decode())
533
546
  tree_of_head.append(tree_line)
547
+ tree_of_head_1: list[bytes] = []
548
+ for tree_line in cat_file_tree_content(ses.commands.cat_file1, b"HEAD~1^{tree}"):
549
+ tree_of_head_1.append(tree_line)
534
550
  # make tree
535
551
  print("#"*40)
536
552
  _tree_hash = mktree_tree_make(ses.commands.mktree, b"\0".join(tree_of_head))
537
- print("tree hash: ", _tree_hash)
553
+ print("head tree hash: ", _tree_hash)
538
554
  print("#"*40)
539
- _tree_hash = mktree_tree_make(ses.commands.mktree, b"\0".join(tree_of_head))
540
- print("tree hash: ", _tree_hash)
555
+ _tree_hash_1 = mktree_tree_make(ses.commands.mktree, b"\0".join(tree_of_head_1))
556
+ print("head~1 tree hash: ", _tree_hash_1)
541
557
 
542
558
  end = time.perf_counter()
543
559
  print(f"Session Elapsed time: {end - start:0.4f} seconds")
@@ -554,9 +570,21 @@ if __name__ == "__main__":
554
570
  end = time.perf_counter()
555
571
  print(f"Subcmd Elapsed time: {end - start:0.4f} seconds")
556
572
 
557
- with git.session(
558
- cat_file=["cat-file", "--batch"]
559
- ) as ses:
573
+ session = git.session(
574
+ cat_file=["cat-file", "--batch"],
575
+ for_each_ref_contains=["for-each-ref", "--stdin"],
576
+ rev_list_contains=["rev-list", "--stdin"],
577
+ )
578
+ with session as ses:
579
+ print(cat_file_commit_data(ses.commands.cat_file, b"d7d8d6f79017c5d574e3c4ac519c855b7cec33e2"))
580
+ print(cat_file_commit_data(ses.commands.cat_file, b"HEAD"))
581
+ print(single_shot_command(ses.commands.rev_list_contains, b"develop\n\n", False))
582
+ # print(single_shot_command(ses.commands.rev_list_contains, b"develop\n\n", False))
583
+ print(cat_file_commit_data(ses.commands.cat_file, b"a744fefd4eaf1a0139ae3c85f713a1a963563cc3"))
584
+ print("$"*40)
585
+ with session as ses:
560
586
  print(cat_file_commit_data(ses.commands.cat_file, b"d7d8d6f79017c5d574e3c4ac519c855b7cec33e2"))
561
587
  print(cat_file_commit_data(ses.commands.cat_file, b"HEAD"))
588
+ print(cat_file_commit_data(ses.commands.cat_file, b"a744fefd4eaf1a0139ae3c85f713a1a963563cc3"))
589
+ print(single_shot_command(ses.commands.rev_list_contains, b"develop\n\n", False))
562
590
  # endregion
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitbolt
3
- Version: 0.0.0.dev19
3
+ Version: 0.0.0.dev21
4
4
  Summary: Fast, flexible and type-safe Git commands in Python.
5
5
  Author-email: Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech>
6
6
  Maintainer-email: Suhas Krishna Srivastava <suhas.srivastava@vaastav.tech>
@@ -386,7 +386,7 @@ with git.session(
386
386
  cat_file2=["cat-file", "--batch"],
387
387
  cat_file3=lambda: git.subcmd_unchecked.popen(["cat-file", "--batch"]), # pass your own git subcmd Popen(s)
388
388
  mktree=["mktree", "--batch", "-z"]
389
- ) as ses:
389
+ ) as ses: # reusable and reentrant session
390
390
  tree_data: list[bytes] = []
391
391
  for mode_, sha_, name_ in cat_file_tree_data(ses.commands.cat_file2, b"HEAD^{tree}"):
392
392
  print(mode_, sha_, name_)
File without changes
File without changes