Browse code
chore: EXTRACT-OBJECT automatically handles deltas
Edward Langley authored on 02/11/2023 20:12:14
Showing 2 changed files
Showing 2 changed files
... | ... |
@@ -39,6 +39,12 @@ |
39 | 39 |
:unless (zerop (aref bv ix)) |
40 | 40 |
:sum (expt 2 n)))) |
41 | 41 |
|
42 |
+(defun obj-to-type (obj) |
|
43 |
+ (etypecase obj |
|
44 |
+ (git-commit :commit) |
|
45 |
+ (git-tree :tree) |
|
46 |
+ (blob :blob))) |
|
47 |
+ |
|
42 | 48 |
(defun trace-bases (pack delta) |
43 | 49 |
(assert (typep delta 'delta)) |
44 | 50 |
(let* ((offset (second (base delta))) |
... | ... |
@@ -50,14 +56,25 @@ |
50 | 56 |
(obj (serapeum:assocdr :object-data o)) |
51 | 57 |
(raw (serapeum:assocdr :raw-data o))) |
52 | 58 |
(if (typep obj 'delta) |
53 |
- (let ((next (trace-bases pack obj))) |
|
54 |
- (length next) |
|
55 |
- (apply-commands next |
|
56 |
- (commands delta))) |
|
59 |
+ (multiple-value-bind (next base-type) (trace-bases pack obj) |
|
60 |
+ (values (apply-commands next |
|
61 |
+ (commands delta)) |
|
62 |
+ base-type)) |
|
57 | 63 |
(let ((base (apply-commands raw |
58 | 64 |
(commands delta)))) |
59 | 65 |
(length base) |
60 |
- base)))) |
|
66 |
+ (values base |
|
67 |
+ (obj-to-type obj)))))) |
|
68 |
+ |
|
69 |
+(defun resolve-delta (ref maybe-delta) |
|
70 |
+ (typecase maybe-delta |
|
71 |
+ (delta (multiple-value-bind (raw-data type) (trace-bases (packed-ref-pack ref) |
|
72 |
+ maybe-delta) |
|
73 |
+ (-extract-object-of-type type |
|
74 |
+ raw-data |
|
75 |
+ (ref-repo ref) |
|
76 |
+ :hash (ref-hash ref)))) |
|
77 |
+ (t maybe-delta))) |
|
61 | 78 |
|
62 | 79 |
(defun get-bases (pack delta) |
63 | 80 |
(if (typep delta 'delta) |
... | ... |
@@ -160,7 +160,8 @@ |
160 | 160 |
(loose-ref-file object) |
161 | 161 |
object)) |
162 | 162 |
(:method ((object packed-ref)) |
163 |
- (data-lens.lenses:view *object-data-lens* |
|
164 |
- (extract-object-from-pack (packed-ref-pack object) |
|
165 |
- (packed-ref-offset object) |
|
166 |
- object)))) |
|
163 |
+ (resolve-delta object |
|
164 |
+ (data-lens.lenses:view *object-data-lens* |
|
165 |
+ (extract-object-from-pack (packed-ref-pack object) |
|
166 |
+ (packed-ref-offset object) |
|
167 |
+ object))))) |