git.fiddlerwoaroof.com
Browse code

feat: initial support for delta objects

Ed Langley authored on 08/05/2020 07:16:58
Showing 2 changed files
... ...
@@ -25,8 +25,9 @@
25 25
                  (:file "repository" :depends-on ("package" "model"))
26 26
                  (:file "tree" :depends-on ("package" "model"))
27 27
                  (:file "commit" :depends-on ("package" "model"))
28
+                 (:file "delta" :depends-on ("package" "model"))
28 29
 
29
-               (:file "extract" :depends-on ("package" "commit" "tree"))
30
+                 (:file "extract" :depends-on ("package" "commit" "tree" "delta"))
30 31
                  (:file "branch" :depends-on ("package" "extract"))
31 32
                  (:file "git" :depends-on ("package" "util" "model" "branch"))
32 33
 
33 34
new file mode 100644
... ...
@@ -0,0 +1,80 @@
1
+(in-package :fwoar.cl-git)
2
+
3
+(defmacro defclass+ (name (&rest super) &body (direct-slots &rest options))
4
+  (let ((initargs (mapcan (lambda (slot)
5
+                            (serapeum:unsplice
6
+                             (make-symbol
7
+                              (symbol-name
8
+                               (getf (cdr slot)
9
+                                     :initarg)))))
10
+                          direct-slots)))
11
+    `(progn (defclass ,name ,super
12
+              ,direct-slots
13
+              ,@options)
14
+            (defun ,name (,@initargs)
15
+              (fw.lu:new ',name ,@initargs)))))
16
+
17
+(defclass delta ()
18
+  ((%repository :initarg :repository :reader repository)
19
+   (%base :initarg :base :reader base)
20
+   (%commands :initarg :commands :reader commands)))
21
+
22
+(defclass+ ofs-delta (delta)
23
+  ())
24
+
25
+(defclass+ ref-delta (delta)
26
+  ())
27
+
28
+(defun make-ofs-delta (base commands repository)
29
+  (fw.lu:new 'ofs-delta base commands repository))
30
+(defun make-ref-delta (base commands repository)
31
+  (fw.lu:new 'ofs-delta base commands repository))
32
+
33
+(defun partition-commands (data)
34
+  (let ((idx 0))
35
+    (labels ((advance ()
36
+               (prog1 (elt data idx)
37
+                 (incf idx)))
38
+             (get-command ()
39
+               (let* ((bv (bit-smasher:int->bits (elt data idx)))
40
+                      (discriminator (elt bv 0))
41
+                      (insts (subseq bv 1)))
42
+                 (incf idx)
43
+                 (if (= 1 discriminator)
44
+                     (list :copy
45
+                           insts
46
+                           (coerce (loop repeat (count 1 insts) collect (advance))
47
+                                   '(vector (unsigned-byte 8))))
48
+                     (list :add
49
+                           (coerce (loop repeat (1- (bit-smasher:bits->int (reverse insts)))
50
+                                         collect (advance))
51
+                                   '(vector (unsigned-byte 8))))))))
52
+      (loop while (< idx (length data))
53
+            collect (get-command)))))
54
+
55
+(defmethod -extract-object-of-type ((type (eql :ofs-delta)) s repository &key offset-from)
56
+  (format t "~&data: ~s~%" s)
57
+  (make-ofs-delta offset-from
58
+                  (partition-commands s)
59
+                  repository))
60
+(defmethod -extract-object-of-type ((type (eql :ref-delta)) s repository &key offset-from)
61
+  (make-ref-delta offset-from
62
+                  (partition-commands s)
63
+                  repository))
64
+
65
+
66
+#+(or) #+(or) #+(or)
67
+
68
+(defmethod component ((component (eql :tree)) (object git-commit))
69
+  (ensure-ref
70
+   (cadr
71
+    (fw.lu:v-assoc :tree (metadata object)
72
+                   :test 'string-equal))))
73
+(defmethod component ((component (eql :parents)) (object git-commit))
74
+  (coerce (remove-if-not (serapeum:op
75
+                           (string= "parent" _))
76
+                         (metadata object)
77
+                         :key #'car)
78
+          'list))
79
+(defmethod component ((component (eql :message)) (object git-commit))
80
+  (data object))