Compare commits
2 Commits
6841a97d18
...
9c53919802
| Author | SHA1 | Date | |
|---|---|---|---|
| 9c53919802 | |||
| 30ce8c84e4 |
17
how_to/Change_33.md
Normal file
17
how_to/Change_33.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
data: Dereference refs when reading and writing
|
||||||
|
|
||||||
|
Now we'll dereference symbolic refs not only when reading them but also when
|
||||||
|
writing them.
|
||||||
|
|
||||||
|
We'll implement a helper function called `_get_ref_internal` which will return
|
||||||
|
the path and the value of the last ref pointed by a symbolic ref. In simple words:
|
||||||
|
|
||||||
|
- When given a non-symbolic ref, `_get_ref_internal` will return the ref name
|
||||||
|
and value.
|
||||||
|
- When given a symbolic ref, `_get_ref_internal` will dereference the ref
|
||||||
|
recursively, and then return the name of the last (non-symbolic) ref that points
|
||||||
|
to an OID, plus its value.
|
||||||
|
|
||||||
|
Now `update_ref` will use `_get_ref_internal` to know which ref it needs to update.
|
||||||
|
|
||||||
|
Additionally, we'll use `_get_ref_internal` in `get_ref`.
|
||||||
13
ugit/data.py
13
ugit/data.py
@@ -18,6 +18,7 @@ RefValue = namedtuple("RefValue", ["symbolic", "value"])
|
|||||||
|
|
||||||
def update_ref(ref, value):
|
def update_ref(ref, value):
|
||||||
assert not value.symbolic
|
assert not value.symbolic
|
||||||
|
ref = _get_ref_internal(ref)[0]
|
||||||
ref_path = f"{GIT_DIR}/{ref}"
|
ref_path = f"{GIT_DIR}/{ref}"
|
||||||
Path.mkdir(ref_path, exist_ok=True)
|
Path.mkdir(ref_path, exist_ok=True)
|
||||||
with open(ref_path, "w") as f:
|
with open(ref_path, "w") as f:
|
||||||
@@ -25,16 +26,22 @@ def update_ref(ref, value):
|
|||||||
|
|
||||||
|
|
||||||
def get_ref(ref):
|
def get_ref(ref):
|
||||||
|
return _get_ref_internal(ref)[1]
|
||||||
|
|
||||||
|
|
||||||
|
def _get_ref_internal(ref):
|
||||||
ref_path = f"{GIT_DIR}/{ref}"
|
ref_path = f"{GIT_DIR}/{ref}"
|
||||||
value = None
|
value = None
|
||||||
if Path.is_file(ref_path):
|
if Path.is_file(ref_path):
|
||||||
with open(ref_path) as f:
|
with open(ref_path) as f:
|
||||||
value = f.read().strip()
|
value = f.read().strip()
|
||||||
|
|
||||||
if value and value.startswith("ref:"):
|
symbolic = bool(value) and value.startswith("ref")
|
||||||
return get_ref(value.split(":", 1)[1].strip())
|
if symbolic:
|
||||||
|
value = value.split(":", 1)[1].strip()
|
||||||
|
return _get_ref_internal(value)
|
||||||
|
|
||||||
return RefValue(symbolic=False, value=value)
|
return ref, RefValue(symbolic=False, value=value)
|
||||||
|
|
||||||
|
|
||||||
def iter_refs():
|
def iter_refs():
|
||||||
|
|||||||
Reference in New Issue
Block a user