Browse code
Move dependencies of GIT:SHOW to extract.lisp
Ed Langley authored on 06/05/2019 06:47:29
Showing 2 changed files
Showing 2 changed files
1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,68 @@ |
1 |
+(in-package :fwoar.cl-git) |
|
2 |
+ |
|
3 |
+(defun edges-in-fanout (toc s sha) |
|
4 |
+ (let* ((fanout-offset (getf toc :fanout))) |
|
5 |
+ (file-position s (+ fanout-offset (* 4 (1- (elt sha 0))))) |
|
6 |
+ (destructuring-bind ((_ . cur) (__ . next)) |
|
7 |
+ (fwoar.bin-parser:extract '((cur 4 fwoar.bin-parser:be->int) |
|
8 |
+ (next 4 fwoar.bin-parser:be->int)) |
|
9 |
+ s) |
|
10 |
+ (declare (ignore _ __)) |
|
11 |
+ (values cur next)))) |
|
12 |
+ |
|
13 |
+(defun find-sha-between-terms (toc s start end sha) |
|
14 |
+ (unless (>= start end) |
|
15 |
+ (let* ((sha-offset (getf toc :shas)) |
|
16 |
+ (mid (floor (+ start end) |
|
17 |
+ 2))) |
|
18 |
+ (file-position s (+ sha-offset (* 20 mid))) |
|
19 |
+ (let ((sha-at-mid (read-bytes 20 'fwoar.bin-parser:byte-array-to-hex-string s))) |
|
20 |
+ (cond ((string< sha sha-at-mid) |
|
21 |
+ (find-sha-between-terms toc s start mid sha)) |
|
22 |
+ ((string> sha sha-at-mid) |
|
23 |
+ (find-sha-between-terms toc s (1+ mid) end sha)) |
|
24 |
+ (t mid)))))) |
|
25 |
+ |
|
26 |
+(defun find-pack-containing (pack-file id) |
|
27 |
+ (with-open-file (s (index-file pack-file) |
|
28 |
+ :element-type '(unsigned-byte 8)) |
|
29 |
+ (let ((binary-sha (ironclad:hex-string-to-byte-array id)) |
|
30 |
+ (toc (idx-toc s))) |
|
31 |
+ (multiple-value-bind (_ end) (edges-in-fanout toc s binary-sha) |
|
32 |
+ (declare (ignore _)) |
|
33 |
+ (let ((midpoint (find-sha-between-terms toc s 0 end id))) |
|
34 |
+ (and midpoint |
|
35 |
+ (values pack-file |
|
36 |
+ midpoint))))))) |
|
37 |
+ |
|
38 |
+(defun find-object-in-pack-files (repo id) |
|
39 |
+ (dolist (pack-file (pack-files repo)) |
|
40 |
+ (multiple-value-bind (pack mid) (find-pack-containing pack-file id) |
|
41 |
+ (when pack |
|
42 |
+ (return-from find-object-in-pack-files |
|
43 |
+ (values pack mid)))))) |
|
44 |
+ |
|
45 |
+(defun extract-object-from-pack (pack obj-number) |
|
46 |
+ (with-open-file (s (index-file pack) :element-type '(unsigned-byte 8)) |
|
47 |
+ (with-open-file (p (pack-file pack) :element-type '(unsigned-byte 8)) |
|
48 |
+ (let* ((toc (idx-toc s)) |
|
49 |
+ (offset-offset (getf toc :4-byte-offsets))) |
|
50 |
+ (file-position s (+ offset-offset (* 4 obj-number))) |
|
51 |
+ (let ((object-offset-in-pack (read-bytes 4 'fwoar.bin-parser:be->int s))) |
|
52 |
+ (file-position p object-offset-in-pack) |
|
53 |
+ (read-object-from-pack p)))))) |
|
54 |
+ |
|
55 |
+(defun extract-loose-object (repo id) |
|
56 |
+ (with-open-file (s (object repo id) |
|
57 |
+ :element-type '(unsigned-byte 8)) |
|
58 |
+ (alexandria:when-let ((result (chipz:decompress nil (chipz:make-dstate 'chipz:zlib) |
|
59 |
+ s))) |
|
60 |
+ (elt (partition 0 result) |
|
61 |
+ 1)))) |
|
62 |
+ |
|
63 |
+(defun extract-object (repo id) |
|
64 |
+ (if (object repo id) |
|
65 |
+ (extract-loose-object repo id) |
|
66 |
+ (data-lens.lenses:view *object-data-lens* |
|
67 |
+ (multiple-value-call 'extract-object-from-pack |
|
68 |
+ (find-object-in-pack-files (root repo) id))))) |
... | ... |
@@ -1,57 +1,5 @@ |
1 | 1 |
(in-package :fwoar.cl-git) |
2 | 2 |
|
3 |
-(defun find-object-in-pack-files (repo id) |
|
4 |
- (dolist (pack-file (pack-files repo)) |
|
5 |
- (multiple-value-bind (pack mid) (find-pack-containing pack-file id) |
|
6 |
- (when pack |
|
7 |
- (return-from find-object-in-pack-files |
|
8 |
- (values pack mid)))))) |
|
9 |
- |
|
10 |
-(defun edges-in-fanout (toc s sha) |
|
11 |
- (let* ((fanout-offset (getf toc :fanout))) |
|
12 |
- (file-position s (+ fanout-offset (* 4 (1- (elt sha 0))))) |
|
13 |
- (destructuring-bind ((_ . cur) (__ . next)) |
|
14 |
- (fwoar.bin-parser:extract '((cur 4 fwoar.bin-parser:be->int) |
|
15 |
- (next 4 fwoar.bin-parser:be->int)) |
|
16 |
- s) |
|
17 |
- (declare (ignore _ __)) |
|
18 |
- (values cur next)))) |
|
19 |
- |
|
20 |
-(defun find-sha-between-terms (toc s start end sha) |
|
21 |
- (unless (>= start end) |
|
22 |
- (let* ((sha-offset (getf toc :shas)) |
|
23 |
- (mid (floor (+ start end) |
|
24 |
- 2))) |
|
25 |
- (file-position s (+ sha-offset (* 20 mid))) |
|
26 |
- (let ((sha-at-mid (read-bytes 20 'fwoar.bin-parser:byte-array-to-hex-string s))) |
|
27 |
- (cond ((string< sha sha-at-mid) |
|
28 |
- (find-sha-between-terms toc s start mid sha)) |
|
29 |
- ((string> sha sha-at-mid) |
|
30 |
- (find-sha-between-terms toc s (1+ mid) end sha)) |
|
31 |
- (t mid)))))) |
|
32 |
- |
|
33 |
-(defun find-pack-containing (pack-file id) |
|
34 |
- (with-open-file (s (index-file pack-file) |
|
35 |
- :element-type '(unsigned-byte 8)) |
|
36 |
- (let ((binary-sha (ironclad:hex-string-to-byte-array id)) |
|
37 |
- (toc (idx-toc s))) |
|
38 |
- (multiple-value-bind (_ end) (edges-in-fanout toc s binary-sha) |
|
39 |
- (declare (ignore _)) |
|
40 |
- (let ((midpoint (find-sha-between-terms toc s 0 end id))) |
|
41 |
- (and midpoint |
|
42 |
- (values pack-file |
|
43 |
- midpoint))))))) |
|
44 |
- |
|
45 |
-(defun extract-object-from-pack (pack obj-number) |
|
46 |
- (with-open-file (s (index-file pack) :element-type '(unsigned-byte 8)) |
|
47 |
- (with-open-file (p (pack-file pack) :element-type '(unsigned-byte 8)) |
|
48 |
- (let* ((toc (idx-toc s)) |
|
49 |
- (offset-offset (getf toc :4-byte-offsets))) |
|
50 |
- (file-position s (+ offset-offset (* 4 obj-number))) |
|
51 |
- (let ((object-offset-in-pack (read-bytes 4 'fwoar.bin-parser:be->int s))) |
|
52 |
- (file-position p object-offset-in-pack) |
|
53 |
- (read-object-from-pack p)))))) |
|
54 |
- |
|
55 | 3 |
(defun seek-to-object-in-pack (idx-stream pack-stream obj-number) |
56 | 4 |
(let* ((toc (idx-toc idx-stream)) |
57 | 5 |
(offset-offset (getf toc :4-byte-offsets))) |
... | ... |
@@ -65,22 +13,6 @@ |
65 | 13 |
(seek-to-object-in-pack s p obj-number) |
66 | 14 |
(read-object-metadata-from-pack p)))) |
67 | 15 |
|
68 |
-(defun extract-loose-object (repo id) |
|
69 |
- (with-open-file (s (object repo id) |
|
70 |
- :element-type '(unsigned-byte 8)) |
|
71 |
- (alexandria:when-let ((result (chipz:decompress nil (chipz:make-dstate 'chipz:zlib) |
|
72 |
- s))) |
|
73 |
- (elt (partition 0 result) |
|
74 |
- 1)))) |
|
75 |
- |
|
76 |
-(defun extract-object (repo id) |
|
77 |
- (if (object repo id) |
|
78 |
- (extract-loose-object repo id) |
|
79 |
- (data-lens.lenses:view *object-data-lens* |
|
80 |
- (multiple-value-call 'extract-object-from-pack |
|
81 |
- (find-object-in-pack-files (root repo) id))))) |
|
82 |
- |
|
83 |
- |
|
84 | 16 |
(defun turn-read-object-to-string (object) |
85 | 17 |
(data-lens.lenses:over *object-data-lens* 'babel:octets-to-string object)) |
86 | 18 |
|