Browse code
(bump)
Ed Langley authored on 12/07/2019 01:12:51
Showing 5 changed files
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 |