Compare commits
No commits in common. "58955927861538a8b2af975b7c3026b84efbf602" and "7a871e4e91b0c1e5227942c041d4b08b4ebb0836" have entirely different histories.
5895592786
...
7a871e4e91
@ -2,24 +2,13 @@
|
|||||||
Git snapshotting tool
|
Git snapshotting tool
|
||||||
"""
|
"""
|
||||||
from .lethe import (
|
from .lethe import (
|
||||||
snap as snap,
|
snap, snap_ref, snap_tree, find_merge_base, deref_symref,
|
||||||
snap_ref as snap_ref,
|
update_ref, commit_tree, get_tree, get_commit, get_obj,
|
||||||
snap_tree as snap_tree,
|
shorten_hash, get_root, get_latest_commit,
|
||||||
find_merge_base as find_merge_base,
|
push_ref, fetch_ref,
|
||||||
deref_symref as deref_symref,
|
|
||||||
update_ref as update_ref,
|
|
||||||
commit_tree as commit_tree,
|
|
||||||
get_tree as get_tree,
|
|
||||||
get_commit as get_commit,
|
|
||||||
get_obj as get_obj,
|
|
||||||
shorten_hash as shorten_hash,
|
|
||||||
get_root as get_root,
|
|
||||||
get_latest_commit as get_latest_commit,
|
|
||||||
push_ref as push_ref,
|
|
||||||
fetch_ref as fetch_ref,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from .endpoints import main as main
|
from .endpoints import main
|
||||||
|
|
||||||
__author__ = 'Jan Petykeiwicz'
|
__author__ = 'Jan Petykeiwicz'
|
||||||
__version__ = '0.13'
|
__version__ = '0.13'
|
||||||
|
@ -3,14 +3,15 @@
|
|||||||
Git snapshotting tool
|
Git snapshotting tool
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from typing import Sequence
|
from typing import Sequence, Union, Optional
|
||||||
import subprocess
|
import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
import datetime
|
import datetime
|
||||||
|
import argparse
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
|
|
||||||
|
|
||||||
def _run(command: str | Sequence[str], **kwargs) -> str:
|
def _run(command: Union[str, Sequence[str]], **kwargs) -> str:
|
||||||
"""
|
"""
|
||||||
Wrapper for `subprocess.run()`:
|
Wrapper for `subprocess.run()`:
|
||||||
|
|
||||||
@ -33,7 +34,7 @@ def _run(command: str | Sequence[str], **kwargs) -> str:
|
|||||||
return result.stdout.decode().strip()
|
return result.stdout.decode().strip()
|
||||||
|
|
||||||
|
|
||||||
def get_latest_commit(short: bool = True, cwd: str | None = None) -> str:
|
def get_latest_commit(short: bool = True, cwd: Optional[str] = None) -> str:
|
||||||
"""
|
"""
|
||||||
Get the most recent commit's hash.
|
Get the most recent commit's hash.
|
||||||
This includes non-lethe commits.
|
This includes non-lethe commits.
|
||||||
@ -42,14 +43,14 @@ def get_latest_commit(short: bool = True, cwd: str | None = None) -> str:
|
|||||||
return _run(f'git log --all -1 --format=%{fmt}', cwd=cwd)
|
return _run(f'git log --all -1 --format=%{fmt}', cwd=cwd)
|
||||||
|
|
||||||
|
|
||||||
def shorten_hash(sha: str, cwd: str | None = None) -> str:
|
def shorten_hash(sha: str, cwd: Optional[str] = None) -> str:
|
||||||
"""
|
"""
|
||||||
Get the short version of a hash
|
Get the short version of a hash
|
||||||
"""
|
"""
|
||||||
return _run(f'git rev-parse --short {sha}', cwd=cwd)
|
return _run(f'git rev-parse --short {sha}', cwd=cwd)
|
||||||
|
|
||||||
|
|
||||||
def get_root(cwd: str | None = None) -> str:
|
def get_root(cwd: Optional[str] = None) -> str:
|
||||||
"""
|
"""
|
||||||
Get the root directory of a git repository
|
Get the root directory of a git repository
|
||||||
"""
|
"""
|
||||||
@ -59,7 +60,7 @@ def get_root(cwd: str | None = None) -> str:
|
|||||||
return root
|
return root
|
||||||
|
|
||||||
|
|
||||||
def get_obj(ref: str, cwd: str | None = None) -> str:
|
def get_obj(ref: str, cwd: Optional[str] = None) -> str:
|
||||||
"""
|
"""
|
||||||
Transform a ref into its corresponding hash using git-rev-parse
|
Transform a ref into its corresponding hash using git-rev-parse
|
||||||
"""
|
"""
|
||||||
@ -67,25 +68,24 @@ def get_obj(ref: str, cwd: str | None = None) -> str:
|
|||||||
return sha
|
return sha
|
||||||
|
|
||||||
|
|
||||||
def get_commit(ref: str, cwd: str | None = None) -> str:
|
def get_commit(ref: str, cwd: Optional[str] = None) -> str:
|
||||||
"""
|
"""
|
||||||
Transform a ref to a commit into its corresponding hash using git-rev-parse
|
Transform a ref to a commit into its corresponding hash using git-rev-parse
|
||||||
"""
|
"""
|
||||||
return get_obj(ref, cwd=cwd)
|
return get_obj(ref, cwd=cwd)
|
||||||
|
|
||||||
|
|
||||||
def get_tree(ref: str, cwd: str | None = None) -> str:
|
def get_tree(ref: str, cwd: Optional[str] = None) -> str:
|
||||||
"""
|
"""
|
||||||
Take a ref to a commit, and return the hash of the tree it points to
|
Take a ref to a commit, and return the hash of the tree it points to
|
||||||
"""
|
"""
|
||||||
return get_obj(ref + ':', cwd=cwd)
|
return get_obj(ref + ':', cwd=cwd)
|
||||||
|
|
||||||
|
|
||||||
def commit_tree(
|
def commit_tree(tree: str,
|
||||||
tree: str,
|
|
||||||
parents: Sequence[str],
|
parents: Sequence[str],
|
||||||
message: str | None = None,
|
message: Optional[str] = None,
|
||||||
cwd: str | None = None,
|
cwd: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Create a commit pointing to the given tree, with the specified parent commits and message.
|
Create a commit pointing to the given tree, with the specified parent commits and message.
|
||||||
@ -99,13 +99,12 @@ def commit_tree(
|
|||||||
return commit
|
return commit
|
||||||
|
|
||||||
|
|
||||||
def update_ref(
|
def update_ref(target_ref: str,
|
||||||
target_ref: str,
|
|
||||||
target_commit: str,
|
target_commit: str,
|
||||||
old_commit: str | None = None,
|
old_commit: Optional[str] = None,
|
||||||
*,
|
*,
|
||||||
message: str = 'new snapshot',
|
message: str = 'new snapshot',
|
||||||
cwd: str | None = None,
|
cwd: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Update `target_ref` to point to `target_commit`, optionally verifying that
|
Update `target_ref` to point to `target_commit`, optionally verifying that
|
||||||
@ -119,12 +118,11 @@ def update_ref(
|
|||||||
return result_ref
|
return result_ref
|
||||||
|
|
||||||
|
|
||||||
def push_ref(
|
def push_ref(remote: str = 'origin',
|
||||||
remote: str = 'origin',
|
|
||||||
target_ref: str = 'refs/lethe/LATEST',
|
target_ref: str = 'refs/lethe/LATEST',
|
||||||
remote_ref: str | None = None,
|
remote_ref: Optional[str] = None,
|
||||||
*,
|
*,
|
||||||
cwd: str | None = None,
|
cwd: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Push `target_ref` to `remote` as `remote_ref`.
|
Push `target_ref` to `remote` as `remote_ref`.
|
||||||
@ -144,12 +142,11 @@ def push_ref(
|
|||||||
return _run(['git', 'push', '--force', remote, target_ref + ':' + remote_ref], cwd=cwd)
|
return _run(['git', 'push', '--force', remote, target_ref + ':' + remote_ref], cwd=cwd)
|
||||||
|
|
||||||
|
|
||||||
def fetch_ref(
|
def fetch_ref(remote: str = 'origin',
|
||||||
remote: str = 'origin',
|
|
||||||
remote_ref: str = 'refs/lethe/LATEST',
|
remote_ref: str = 'refs/lethe/LATEST',
|
||||||
target_ref: str | None = None,
|
target_ref: Optional[str] = None,
|
||||||
*,
|
*,
|
||||||
cwd: str | None = None,
|
cwd: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Fetch `remote_ref` from `remote` as `target_ref`.
|
Fetch `remote_ref` from `remote` as `target_ref`.
|
||||||
@ -169,10 +166,9 @@ def fetch_ref(
|
|||||||
return _run(['git', 'fetch', '--force', remote, remote_ref + ':' + target_ref], cwd=cwd)
|
return _run(['git', 'fetch', '--force', remote, remote_ref + ':' + target_ref], cwd=cwd)
|
||||||
|
|
||||||
|
|
||||||
def deref_symref(
|
def deref_symref(ref: str,
|
||||||
ref: str,
|
|
||||||
*,
|
*,
|
||||||
cwd: str | None = None,
|
cwd: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Dereference a symbolic ref
|
Dereference a symbolic ref
|
||||||
@ -180,10 +176,9 @@ def deref_symref(
|
|||||||
return _run(['git', 'symbolic-ref', '--quiet', ref], cwd=cwd)
|
return _run(['git', 'symbolic-ref', '--quiet', ref], cwd=cwd)
|
||||||
|
|
||||||
|
|
||||||
def find_merge_base(
|
def find_merge_base(commits: Sequence[str],
|
||||||
commits: Sequence[str],
|
|
||||||
*,
|
*,
|
||||||
cwd: str | None = None,
|
cwd: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Find the "best common ancestor" commit.
|
Find the "best common ancestor" commit.
|
||||||
@ -205,7 +200,7 @@ def find_merge_base(
|
|||||||
return base
|
return base
|
||||||
|
|
||||||
|
|
||||||
def snap_tree(*, cwd: str | None = None) -> str:
|
def snap_tree(*, cwd: Optional[str] = None) -> str:
|
||||||
"""
|
"""
|
||||||
Create a new tree, consisting of all non-ignored files in the repository.
|
Create a new tree, consisting of all non-ignored files in the repository.
|
||||||
Return the hash of the tree.
|
Return the hash of the tree.
|
||||||
@ -219,12 +214,11 @@ def snap_tree(*, cwd: str | None = None) -> str:
|
|||||||
return tree
|
return tree
|
||||||
|
|
||||||
|
|
||||||
def snap_ref(
|
def snap_ref(parent_refs: Sequence[str],
|
||||||
parent_refs: Sequence[str],
|
|
||||||
target_refs: Sequence[str],
|
target_refs: Sequence[str],
|
||||||
message: str | None = None,
|
message: Optional[str] = None,
|
||||||
*,
|
*,
|
||||||
cwd: str | None = None,
|
cwd: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
`message` is used as the commit message.
|
`message` is used as the commit message.
|
||||||
@ -233,7 +227,7 @@ def snap_ref(
|
|||||||
parent_commits = [c for c in [get_commit(p, cwd=cwd) for p in parent_refs] if c]
|
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]
|
old_commits = [get_commit(t, cwd=cwd) for t in target_refs]
|
||||||
|
|
||||||
commit = commit_tree(new_tree, list(set(parent_commits)), message, cwd=cwd)
|
commit = commit_tree(new_tree, set(parent_commits), message, cwd=cwd)
|
||||||
|
|
||||||
for target_ref, old_commit in zip(target_refs, old_commits):
|
for target_ref, old_commit in zip(target_refs, old_commits):
|
||||||
# update ref to point to commit, or create new ref
|
# update ref to point to commit, or create new ref
|
||||||
@ -243,12 +237,11 @@ def snap_ref(
|
|||||||
return commit
|
return commit
|
||||||
|
|
||||||
|
|
||||||
def snap(
|
def snap(parent_refs: Optional[Sequence[str]] = None,
|
||||||
parent_refs: Sequence[str] | None = None,
|
target_refs: Optional[Sequence[str]] = None,
|
||||||
target_refs: Sequence[str] | None = None,
|
message: Optional[str] = None,
|
||||||
message: str | None = None,
|
|
||||||
*,
|
*,
|
||||||
cwd: str | None = None,
|
cwd: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Create a new commit, containing all non-ignored files.
|
Create a new commit, containing all non-ignored files.
|
||||||
@ -298,7 +291,7 @@ def snap(
|
|||||||
old_base_commit = get_commit(target_base, cwd=cwd)
|
old_base_commit = get_commit(target_base, cwd=cwd)
|
||||||
if old_base_commit:
|
if old_base_commit:
|
||||||
print(f'Migrating {target_base} to new naming scheme ({target_base}/LEGACY)...')
|
print(f'Migrating {target_base} to new naming scheme ({target_base}/LEGACY)...')
|
||||||
print('You may also want to delete refs/lethe/HEAD with `git update-ref -d refs/lethe/HEAD`')
|
print(f'You may also want to delete refs/lethe/HEAD with `git update-ref -d refs/lethe/HEAD`')
|
||||||
_run('git update-ref -d ' + target_base)
|
_run('git update-ref -d ' + target_base)
|
||||||
update_ref(target_base + '/LEGACY', old_base_commit,
|
update_ref(target_base + '/LEGACY', old_base_commit,
|
||||||
message='last commit using old refs/lethe/branchname approach')
|
message='last commit using old refs/lethe/branchname approach')
|
||||||
|
@ -46,37 +46,3 @@ path = "lethe/__init__.py"
|
|||||||
lethe = "lethe.endpoints:main"
|
lethe = "lethe.endpoints:main"
|
||||||
lethe-push = "lethe.endpoints:push"
|
lethe-push = "lethe.endpoints:push"
|
||||||
lethe-fetch = "lethe.endpoints:fetch"
|
lethe-fetch = "lethe.endpoints:fetch"
|
||||||
|
|
||||||
|
|
||||||
[tool.ruff]
|
|
||||||
exclude = [
|
|
||||||
".git",
|
|
||||||
"dist",
|
|
||||||
]
|
|
||||||
line-length = 145
|
|
||||||
indent-width = 4
|
|
||||||
lint.dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
|
||||||
lint.select = [
|
|
||||||
"NPY", "E", "F", "W", "B", "ANN", "UP", "SLOT", "SIM", "LOG",
|
|
||||||
"C4", "ISC", "PIE", "PT", "RET", "TCH", "PTH", "INT",
|
|
||||||
"ARG", "PL", "R", "TRY",
|
|
||||||
"G010", "G101", "G201", "G202",
|
|
||||||
"Q002", "Q003", "Q004",
|
|
||||||
]
|
|
||||||
lint.ignore = [
|
|
||||||
#"ANN001", # No annotation
|
|
||||||
"ANN002", # *args
|
|
||||||
"ANN003", # **kwargs
|
|
||||||
"ANN401", # Any
|
|
||||||
"ANN101", # self: Self
|
|
||||||
"SIM108", # single-line if / else assignment
|
|
||||||
"RET504", # x=y+z; return x
|
|
||||||
"PIE790", # unnecessary pass
|
|
||||||
"ISC003", # non-implicit string concatenation
|
|
||||||
"C408", # dict(x=y) instead of {'x': y}
|
|
||||||
"PLR09", # Too many xxx
|
|
||||||
"PLR2004", # magic number
|
|
||||||
"PLC0414", # import x as x
|
|
||||||
"TRY003", # Long exception message
|
|
||||||
]
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user