type annotation improvements
This commit is contained in:
		
							parent
							
								
									7a871e4e91
								
							
						
					
					
						commit
						9b329f3b8b
					
				
							
								
								
									
										116
									
								
								lethe/lethe.py
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								lethe/lethe.py
									
									
									
									
									
								
							@ -3,7 +3,7 @@
 | 
			
		||||
Git snapshotting tool
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from typing import Sequence, Union, Optional
 | 
			
		||||
from typing import Sequence
 | 
			
		||||
import subprocess
 | 
			
		||||
import tempfile
 | 
			
		||||
import datetime
 | 
			
		||||
@ -11,7 +11,7 @@ import argparse
 | 
			
		||||
from itertools import chain
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _run(command: Union[str, Sequence[str]], **kwargs) -> str:
 | 
			
		||||
def _run(command: str | Sequence[str], **kwargs) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Wrapper for `subprocess.run()`:
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@ def _run(command: Union[str, Sequence[str]], **kwargs) -> str:
 | 
			
		||||
    return result.stdout.decode().strip()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_latest_commit(short: bool = True, cwd: Optional[str] = None) -> str:
 | 
			
		||||
def get_latest_commit(short: bool = True, cwd: str | None = None) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Get the most recent commit's hash.
 | 
			
		||||
    This includes non-lethe commits.
 | 
			
		||||
@ -43,14 +43,14 @@ def get_latest_commit(short: bool = True, cwd: Optional[str] = None) -> str:
 | 
			
		||||
    return _run(f'git log --all -1 --format=%{fmt}', cwd=cwd)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def shorten_hash(sha: str, cwd: Optional[str] = None) -> str:
 | 
			
		||||
def shorten_hash(sha: str, cwd: str | None = None) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Get the short version of a hash
 | 
			
		||||
    """
 | 
			
		||||
    return _run(f'git rev-parse --short {sha}', cwd=cwd)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_root(cwd: Optional[str] = None) -> str:
 | 
			
		||||
def get_root(cwd: str | None = None) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Get the root directory of a git repository
 | 
			
		||||
    """
 | 
			
		||||
@ -60,7 +60,7 @@ def get_root(cwd: Optional[str] = None) -> str:
 | 
			
		||||
    return root
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_obj(ref: str, cwd: Optional[str] = None) -> str:
 | 
			
		||||
def get_obj(ref: str, cwd: str | None = None) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Transform a ref into its corresponding hash using git-rev-parse
 | 
			
		||||
    """
 | 
			
		||||
@ -68,25 +68,26 @@ def get_obj(ref: str, cwd: Optional[str] = None) -> str:
 | 
			
		||||
    return sha
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_commit(ref: str, cwd: Optional[str] = None) -> str:
 | 
			
		||||
def get_commit(ref: str, cwd: str | None = None) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Transform a ref to a commit into its corresponding hash using git-rev-parse
 | 
			
		||||
    """
 | 
			
		||||
    return get_obj(ref, cwd=cwd)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_tree(ref: str, cwd: Optional[str] = None) -> str:
 | 
			
		||||
def get_tree(ref: str, cwd: str | None = None) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Take a ref to a commit, and return the hash of the tree it points to
 | 
			
		||||
    """
 | 
			
		||||
    return get_obj(ref + ':', cwd=cwd)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def commit_tree(tree: str,
 | 
			
		||||
                parents: Sequence[str],
 | 
			
		||||
                message: Optional[str] = None,
 | 
			
		||||
                cwd: Optional[str] = None,
 | 
			
		||||
                ) -> str:
 | 
			
		||||
def commit_tree(
 | 
			
		||||
        tree: str,
 | 
			
		||||
        parents: Sequence[str],
 | 
			
		||||
        message: str | None = None,
 | 
			
		||||
        cwd: str | None = None,
 | 
			
		||||
        ) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Create a commit pointing to the given tree, with the specified parent commits and message.
 | 
			
		||||
    Return the hash of the created commit.
 | 
			
		||||
@ -99,13 +100,14 @@ def commit_tree(tree: str,
 | 
			
		||||
    return commit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def update_ref(target_ref: str,
 | 
			
		||||
               target_commit: str,
 | 
			
		||||
               old_commit: Optional[str] = None,
 | 
			
		||||
               *,
 | 
			
		||||
               message: str = 'new snapshot',
 | 
			
		||||
               cwd: Optional[str] = None,
 | 
			
		||||
               ) -> str:
 | 
			
		||||
def update_ref(
 | 
			
		||||
        target_ref: str,
 | 
			
		||||
        target_commit: str,
 | 
			
		||||
        old_commit: str | None = None,
 | 
			
		||||
        *,
 | 
			
		||||
        message: str = 'new snapshot',
 | 
			
		||||
        cwd: str | None = None,
 | 
			
		||||
        ) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Update `target_ref` to point to `target_commit`, optionally verifying that
 | 
			
		||||
        it points `old_commit` before the update.
 | 
			
		||||
@ -118,12 +120,13 @@ def update_ref(target_ref: str,
 | 
			
		||||
    return result_ref
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def push_ref(remote: str = 'origin',
 | 
			
		||||
             target_ref: str = 'refs/lethe/LATEST',
 | 
			
		||||
             remote_ref: Optional[str] = None,
 | 
			
		||||
             *,
 | 
			
		||||
             cwd: Optional[str] = None,
 | 
			
		||||
             ) -> str:
 | 
			
		||||
def push_ref(
 | 
			
		||||
        remote: str = 'origin',
 | 
			
		||||
        target_ref: str = 'refs/lethe/LATEST',
 | 
			
		||||
        remote_ref: str | None = None,
 | 
			
		||||
        *,
 | 
			
		||||
        cwd: str | None = None,
 | 
			
		||||
        ) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Push `target_ref` to `remote` as `remote_ref`.
 | 
			
		||||
    By default, `remote_ref` will be the same as `target_ref`.
 | 
			
		||||
@ -142,12 +145,13 @@ def push_ref(remote: str = 'origin',
 | 
			
		||||
    return _run(['git', 'push', '--force', remote, target_ref + ':' + remote_ref], cwd=cwd)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def fetch_ref(remote: str = 'origin',
 | 
			
		||||
              remote_ref: str = 'refs/lethe/LATEST',
 | 
			
		||||
              target_ref: Optional[str] = None,
 | 
			
		||||
              *,
 | 
			
		||||
              cwd: Optional[str] = None,
 | 
			
		||||
              ) -> str:
 | 
			
		||||
def fetch_ref(
 | 
			
		||||
        remote: str = 'origin',
 | 
			
		||||
        remote_ref: str = 'refs/lethe/LATEST',
 | 
			
		||||
        target_ref: str | None = None,
 | 
			
		||||
        *,
 | 
			
		||||
        cwd: str | None = None,
 | 
			
		||||
        ) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Fetch `remote_ref` from `remote` as `target_ref`.
 | 
			
		||||
    By default, `target_ref` will be the same as `remote_ref`.
 | 
			
		||||
@ -166,20 +170,22 @@ def fetch_ref(remote: str = 'origin',
 | 
			
		||||
    return _run(['git', 'fetch', '--force', remote, remote_ref + ':' + target_ref], cwd=cwd)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def deref_symref(ref: str,
 | 
			
		||||
                 *,
 | 
			
		||||
                 cwd: Optional[str] = None,
 | 
			
		||||
                 ) -> str:
 | 
			
		||||
def deref_symref(
 | 
			
		||||
        ref: str,
 | 
			
		||||
        *,
 | 
			
		||||
        cwd: str | None = None,
 | 
			
		||||
        ) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Dereference a symbolic ref
 | 
			
		||||
    """
 | 
			
		||||
    return _run(['git', 'symbolic-ref', '--quiet', ref], cwd=cwd)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def find_merge_base(commits: Sequence[str],
 | 
			
		||||
                    *,
 | 
			
		||||
                    cwd: Optional[str] = None,
 | 
			
		||||
                    ) -> str:
 | 
			
		||||
def find_merge_base(
 | 
			
		||||
        commits: Sequence[str],
 | 
			
		||||
        *,
 | 
			
		||||
        cwd: str | None = None,
 | 
			
		||||
        ) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Find the "best common ancestor" commit.
 | 
			
		||||
 | 
			
		||||
@ -200,7 +206,7 @@ def find_merge_base(commits: Sequence[str],
 | 
			
		||||
    return base
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def snap_tree(*, cwd: Optional[str] = None) -> str:
 | 
			
		||||
def snap_tree(*, cwd: str | None = None) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Create a new tree, consisting of all non-ignored files in the repository.
 | 
			
		||||
    Return the hash of the tree.
 | 
			
		||||
@ -214,12 +220,13 @@ def snap_tree(*, cwd: Optional[str] = None) -> str:
 | 
			
		||||
    return tree
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def snap_ref(parent_refs: Sequence[str],
 | 
			
		||||
             target_refs: Sequence[str],
 | 
			
		||||
             message: Optional[str] = None,
 | 
			
		||||
             *,
 | 
			
		||||
             cwd: Optional[str] = None,
 | 
			
		||||
             ) -> str:
 | 
			
		||||
def snap_ref(
 | 
			
		||||
        parent_refs: Sequence[str],
 | 
			
		||||
        target_refs: Sequence[str],
 | 
			
		||||
        message: str | None = None,
 | 
			
		||||
        *,
 | 
			
		||||
        cwd: str | None = None,
 | 
			
		||||
        ) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    `message` is used as the commit message.
 | 
			
		||||
    """
 | 
			
		||||
@ -227,7 +234,7 @@ def snap_ref(parent_refs: Sequence[str],
 | 
			
		||||
    parent_commits = [c for c in [get_commit(p, cwd=cwd) for p in parent_refs] if c]
 | 
			
		||||
    old_commits = [get_commit(t, cwd=cwd) for t in target_refs]
 | 
			
		||||
 | 
			
		||||
    commit = commit_tree(new_tree, set(parent_commits), message, cwd=cwd)
 | 
			
		||||
    commit = commit_tree(new_tree, list(set(parent_commits)), message, cwd=cwd)
 | 
			
		||||
 | 
			
		||||
    for target_ref, old_commit in zip(target_refs, old_commits):
 | 
			
		||||
        # update ref to point to commit, or create new ref
 | 
			
		||||
@ -237,12 +244,13 @@ def snap_ref(parent_refs: Sequence[str],
 | 
			
		||||
    return commit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def snap(parent_refs: Optional[Sequence[str]] = None,
 | 
			
		||||
         target_refs: Optional[Sequence[str]] = None,
 | 
			
		||||
         message: Optional[str] = None,
 | 
			
		||||
         *,
 | 
			
		||||
         cwd: Optional[str] = None,
 | 
			
		||||
         ) -> str:
 | 
			
		||||
def snap(
 | 
			
		||||
        parent_refs: Sequence[str] | None = None,
 | 
			
		||||
        target_refs: Sequence[str] | None = None,
 | 
			
		||||
        message: str | None = None,
 | 
			
		||||
        *,
 | 
			
		||||
        cwd: str | None = None,
 | 
			
		||||
        ) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    Create a new commit, containing all non-ignored files.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user