git.fiddlerwoaroof.com
Browse code

chore: EXTRACT-OBJECT automatically handles deltas

Edward Langley authored on 02/11/2023 20:12:14
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)))))