瀏覽代碼

上传文件至 'backup/preset/app'

junhuanchen 1 年之前
父節點
當前提交
8c5625a85e
共有 1 個文件被更改,包括 85 次插入0 次删除
  1. 85 0
      backup/preset/app/git.py

+ 85 - 0
backup/preset/app/git.py

@@ -0,0 +1,85 @@
+import os
+import sys
+from io import RawIOBase
+from dulwich import porcelain
+from dulwich.client import get_transport_and_path
+from dulwich.porcelain import get_remote_repo
+from dulwich.repo import Repo
+from dulwich.walk import Walker
+
+
+def ro():
+    os.system("/etc/init.d/S01mount_ro start")
+
+
+def rw():
+    os.system("/etc/init.d/S01mount_ro stop")
+
+
+class NoneStream(RawIOBase):
+    """Fallback if stdout or stderr are unavailable, does nothing."""
+
+    def read(self, size=-1):
+        return None
+
+    def readall(self):
+        return None
+
+    def readinto(self, b):
+        return None
+
+    def write(self, b):
+        return None
+
+
+def log(localRep):
+    repo = Repo(localRep)
+    walker = Walker(repo, sorted(repo.get_refs().values(), reverse=True))
+    for entry in walker:
+        commit = entry.commit
+        print(f"commit {commit.id.decode()}")
+        print(f"Author: {commit.author.decode()} <{commit.author.decode()}>")
+        print(f"Date: {commit.author_time}")
+        print()
+        print(f"    {commit.message.decode()}")
+        print()
+
+
+def showChanges(localRep, outStream=sys.stdout):
+    porcelain.show(localRep, outstream=outStream)
+
+
+def activeBranch(localRep):
+    return porcelain.active_branch(localRep)
+
+
+def checkout(localRep, branch, progStream=None):
+    r = Repo(localRep)
+    if progStream is None:
+        progStream = NoneStream()
+    try:
+        porcelain.checkout_branch(r, 'origin/' + branch, outstream=progStream)
+    except porcelain.CheckoutError as e:
+        print("CheckoutError:", e)
+        porcelain.reset(r, 'hard')
+        porcelain.checkout_branch(r, 'origin/' + branch, outstream=progStream)
+
+
+def pull(repo_path, progStream=None):
+    if progStream is None:
+        progStream = NoneStream()
+    porcelain.pull(repo_path, refspecs=porcelain.active_branch(repo_path), outstream=progStream)
+
+
+def isOnline(localRep):
+    r = Repo(localRep)
+    (remote_name, remote_location) = get_remote_repo(r, None)
+    client, path = get_transport_and_path(
+        remote_location, config=r.get_config_stack()
+    )
+    try:
+        client.fetch(path, r)
+        return True
+    except Exception:
+        return False
+