git.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import os
  2. import sys
  3. from io import RawIOBase
  4. from dulwich import porcelain
  5. from dulwich.client import get_transport_and_path
  6. from dulwich.porcelain import get_remote_repo
  7. from dulwich.repo import Repo
  8. from dulwich.walk import Walker
  9. def ro():
  10. os.system("/etc/init.d/S01mount_ro start")
  11. def rw():
  12. os.system("/etc/init.d/S01mount_ro stop")
  13. class NoneStream(RawIOBase):
  14. """Fallback if stdout or stderr are unavailable, does nothing."""
  15. def read(self, size=-1):
  16. return None
  17. def readall(self):
  18. return None
  19. def readinto(self, b):
  20. return None
  21. def write(self, b):
  22. return None
  23. def log(localRep):
  24. repo = Repo(localRep)
  25. walker = Walker(repo, sorted(repo.get_refs().values(), reverse=True))
  26. for entry in walker:
  27. commit = entry.commit
  28. print(f"commit {commit.id.decode()}")
  29. print(f"Author: {commit.author.decode()} <{commit.author.decode()}>")
  30. print(f"Date: {commit.author_time}")
  31. print()
  32. print(f" {commit.message.decode()}")
  33. print()
  34. def showChanges(localRep, outStream=sys.stdout):
  35. porcelain.show(localRep, outstream=outStream)
  36. def activeBranch(localRep):
  37. return porcelain.active_branch(localRep)
  38. def checkout(localRep, branch, progStream=None):
  39. r = Repo(localRep)
  40. if progStream is None:
  41. progStream = NoneStream()
  42. try:
  43. porcelain.checkout_branch(r, 'origin/' + branch, outstream=progStream)
  44. except porcelain.CheckoutError as e:
  45. print("CheckoutError:", e)
  46. porcelain.reset(r, 'hard')
  47. porcelain.checkout_branch(r, 'origin/' + branch, outstream=progStream)
  48. def pull(repo_path, progStream=None):
  49. if progStream is None:
  50. progStream = NoneStream()
  51. porcelain.pull(repo_path, refspecs=porcelain.active_branch(repo_path), outstream=progStream)
  52. def isOnline(localRep):
  53. r = Repo(localRep)
  54. (remote_name, remote_location) = get_remote_repo(r, None)
  55. client, path = get_transport_and_path(
  56. remote_location, config=r.get_config_stack()
  57. )
  58. try:
  59. client.fetch(path, r)
  60. return True
  61. except Exception:
  62. return False