git.fiddlerwoaroof.com
Browse code

Move dependencies of GIT:SHOW to extract.lisp

Ed Langley authored on 06/05/2019 06:47:29
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