git.fiddlerwoaroof.com
Browse code

(bump)

Ed Langley authored on 12/07/2019 01:12:51
Showing 5 changed files
... ...
@@ -70,30 +70,36 @@
70 70
                       (list* (format-tree-entry next)
71 71
                              accum)))))
72 72
 
73
-(defgeneric extract-object-of-type (type s repository)
73
+(defun extract-object-of-type (type s repository)
74
+  (with-simple-restart (continue "Skip object of type ~s" type)
75
+    (%extract-object-of-type type s repository)))
76
+
77
+(defgeneric %extract-object-of-type (type s repository)
74 78
   (:method ((type integer) s repository)
75 79
     (extract-object-of-type (object-type->sym type)
76 80
                             s
77 81
                             repository))
78 82
 
79
-  (:method ((type (eql :commit)) (s stream) repository)
80
-    (chipz:decompress nil (chipz:make-dstate 'chipz:zlib) s))
83
+  (:method ((type (eql :commit)) s repository)
84
+    s)
81 85
 
82
-  (:method ((type (eql :blob)) (s stream) repository)
83
-    (chipz:decompress nil (chipz:make-dstate 'chipz:zlib) s))
86
+  (:method ((type (eql :blob)) s repository)
87
+    s)
84 88
 
85
-  (:method ((type (eql :tag)) (s stream) repository)
86
-    (chipz:decompress nil (chipz:make-dstate 'chipz:zlib) s))
89
+  (:method ((type (eql :tag)) s repository)
90
+    s)
87 91
 
88
-  (:method ((type (eql :tree)) (s stream) repository)
89
-    (let* ((data (chipz:decompress nil (chipz:make-dstate 'chipz:zlib) s)))
90
-      (tree-entries data))))
92
+  (:method ((type (eql :tree)) s repository)
93
+    (tree-entries s)))
91 94
 
92 95
 (defun read-object-from-pack (s repository)
93 96
   (let* ((metadata (fwoar.bin-parser:extract-high s))
94
-         (type (get-object-type metadata))
97
+         (type (object-type->sym (get-object-type metadata)))
95 98
          (size (get-object-size metadata))
96
-         (object-data (extract-object-of-type type s repository)))
99
+         (decompressed (if (member type '(:ofs-delta :ref-delta))
100
+                           s
101
+                           (chipz:decompress nil (chipz:make-dstate 'chipz:zlib) s)))
102
+         (object-data (extract-object-of-type type decompressed repository)))
97 103
     (list (cons :type (object-type->sym type))
98 104
           (cons :decompressed-size size)
99 105
           (cons :object-data object-data)
... ...
@@ -114,8 +120,12 @@
114 120
                      :element-type '(unsigned-byte 8))
115 121
     (alexandria:when-let ((result (chipz:decompress nil (chipz:make-dstate 'chipz:zlib)
116 122
                                                     s)))
117
-      (elt (partition 0 result)
118
-           1))))
123
+      (destructuring-bind (type rest)
124
+          (partition (char-code #\space) result)
125
+        (extract-object-of-type (object-type->sym (babel:octets-to-string type))
126
+                                (elt (partition 0 rest)
127
+                                     1)
128
+                                repo)))))
119 129
 
120 130
 (defun extract-object (repo id)
121 131
   (if (object repo id)
... ...
@@ -17,6 +17,12 @@
17 17
   (data-lens.lenses:over *object-data-lens* 'babel:octets-to-string object))
18 18
 
19 19
 (defgeneric object (repository id)
20
+  (:method ((repository string) id)
21
+    (when (probe-file (merge-pathnames ".git" repository))
22
+      (object (repository repository) id)))
23
+  (:method ((repository pathname) id)
24
+    (when (probe-file (merge-pathnames ".git" repository))
25
+      (object (repository repository) id)))
20 26
   (:method ((repository repository) id)
21 27
     (car
22 28
      (uiop:directory*
... ...
@@ -17,7 +17,11 @@
17 17
 (defclass commit (git-object)
18 18
   ())
19 19
 
20
-(defun object-type->sym (object-type)
20
+(defgeneric object-type->sym (object-type)
21
+  (:method ((o-t symbol))
22
+    o-t))
23
+
24
+(defmethod object-type->sym ((object-type number))
21 25
   (ecase object-type
22 26
     (1 :commit)
23 27
     (2 :tree)
... ...
@@ -25,12 +29,20 @@
25 29
     (4 :tag)
26 30
     (6 :ofs-delta)
27 31
     (7 :ref-delta)))
32
+(defmethod object-type->sym ((object-type string))
33
+  (string-case:string-case ((string-downcase object-type))
34
+    ("commit" :commit)
35
+    ("tree" :tree)
36
+    ("blob" :blob)
37
+    ("tag" :tag)
38
+    ("ofs-delta" :ofs-delta)
39
+    ("ref-delta" :ref-delta)))
28 40
 
29 41
 (defgeneric repository (root)
30 42
   (:method ((root string))
31
-   (fw.lu:new 'repository root))
43
+    (fw.lu:new 'repository root))
32 44
   (:method ((root pathname))
33
-   (fw.lu:new 'repository root)))
45
+    (fw.lu:new 'repository root)))
34 46
 
35 47
 (defun get-local-branches (root)
36 48
   (append (get-local-unpacked-branches root)
... ...
@@ -14,18 +14,19 @@
14 14
 
15 15
 (defmacro git:git (&rest commands)
16 16
   `(uiop:nest ,@(reverse
17
-                 (mapcar (serapeum:op (case (car _1)
18
-                                        ((<<=) (list* 'mapcan
19
-                                                      (list 'quote
20
-                                                            (intern (symbol-name (cadadr _1))
21
-                                                                    :git))
22
-                                                      (cddr _1)))
23
-                                        ((map) (list* 'mapcar (cdr _1)))
24
-                                        ((unwrap) `(uiop:nest (car)
25
-                                                              (mapcar ,@(cdr _1))))
26
-                                        (t (cons (intern (symbol-name (car _1))
27
-                                                         :git)
28
-                                                 (cdr _1)))))
17
+                 (mapcar (serapeum:op (typecase _1
18
+                                        (string `(identity ,_1))
19
+                                        (list (case (car _1)
20
+                                                ((<<=) (list* 'mapcan
21
+                                                              (list 'quote
22
+                                                                    (cadadr _1))
23
+                                                              (cddr _1)))
24
+                                                ((map) (list* 'mapcar (cdr _1)))
25
+                                                ((unwrap) `(uiop:nest (car)
26
+                                                                      (mapcar ,@(cdr _1))))
27
+                                                (t (cons (intern (symbol-name (car _1))
28
+                                                                 :git)
29
+                                                         (cdr _1)))))))
29 30
                          commands))))
30 31
 
31 32
 (defun git:show (object)
... ...
@@ -4,10 +4,10 @@
4 4
   (+ (loop for v across vec
5 5
            for sum = (logand 127 v)
6 6
              then (+ (ash sum 7)
7
-                      (logand 127 v))
7
+                     (logand 127 v))
8 8
            finally (return sum))
9
-      (loop for x from 1 below 2
10
-            sum (expt 2 (* 7 x)))))
9
+     (loop for x from 1 below 2
10
+           sum (expt 2 (* 7 x)))))
11 11
 
12 12
 (defun extract-offset-to-base (s)
13 13
   (offset-distance