git.fiddlerwoaroof.com
Browse code

Continue developing data model

Ed Langley authored on 12/07/2019 09:52:31
Showing 3 changed files
... ...
@@ -115,20 +115,14 @@
115 115
           (file-position p object-offset-in-pack)
116 116
           (read-object-from-pack p (repository pack)))))))
117 117
 
118
-(defclass git-object ()
119
-  ((%repo :initarg :repo :reader object-repo)
120
-   (%hash :initarg :hash :reader object-hash)))
121
-(defclass loose-object (git-object)
122
-  ((%file :initarg :file :reader loose-object-file)))
123
-(defclass packed-object (git-object)
124
-  ((%pack :initarg :pack :reader packed-object-pack)
125
-   (%offset :initarg :offset :reader packed-object-offset)))
118
+(defun root-of (repo)
119
+  (typecase repo
120
+    (repository (root repo))
121
+    ((or pathname string) (namestring
122
+                           (truename repo)))))
126 123
 
127 124
 (defun object (repo id)
128
-  (let ((repo-root (typecase repo
129
-                     (repository (root repo))
130
-                     ((or pathname string) (namestring
131
-                                            (truename repo))))))
125
+  (let ((repo-root (root-of repo)))
132 126
     (or (alexandria:when-let ((object-file (loose-object repo id)))
133 127
           (make-instance 'loose-object :repo repo-root :hash id :file object-file))
134 128
         (multiple-value-bind (pack offset) (find-object-in-pack-files repo-root id)
... ...
@@ -27,23 +27,6 @@
27 27
   (data-lens.lenses:over *object-data-lens*
28 28
                          'babel:octets-to-string object))
29 29
 
30
-(defgeneric loose-object (repository id)
31
-  (:method ((repository string) id)
32
-    (when (probe-file (merge-pathnames ".git" repository))
33
-      (loose-object (repository repository) id)))
34
-  (:method ((repository pathname) id)
35
-    (when (probe-file (merge-pathnames ".git" repository))
36
-      (loose-object (repository repository) id)))
37
-  (:method ((repository repository) id)
38
-    (car
39
-     (uiop:directory*
40
-      (merge-pathnames (loose-object-path (serapeum:concat id "*"))
41
-                       (root repository))))))
42
-
43
-(defun loose-object-p (repository id)
44
-  "Is ID an ID of a loose object?"
45
-  (loose-object repository id))
46
-
47 30
 (defun fanout-table (s)
48 31
   (coerce (alexandria:assoc-value
49 32
            (fwoar.bin-parser:extract '((head 4)
... ...
@@ -64,3 +64,37 @@
64 64
           (uiop:directory*
65 65
            (merge-pathnames ".git/objects/pack/*.idx"
66 66
                             repo))))
67
+
68
+(defgeneric loose-object (repository id)
69
+  (:method ((repository string) id)
70
+    (when (probe-file (merge-pathnames ".git" repository))
71
+      (loose-object (repository repository) id)))
72
+  (:method ((repository pathname) id)
73
+    (when (probe-file (merge-pathnames ".git" repository))
74
+      (loose-object (repository repository) id)))
75
+  (:method ((repository repository) id)
76
+    (car
77
+     (uiop:directory*
78
+      (merge-pathnames (loose-object-path (serapeum:concat id "*"))
79
+                       (root repository))))))
80
+
81
+(defun loose-object-p (repository id)
82
+  "Is ID an ID of a loose object?"
83
+  (loose-object repository id))
84
+
85
+(defclass git-object ()
86
+  ((%repo :initarg :repo :reader object-repo)
87
+   (%hash :initarg :hash :reader object-hash)))
88
+(defclass loose-object (git-object)
89
+  ((%file :initarg :file :reader loose-object-file)))
90
+(defclass packed-object (git-object)
91
+  ((%pack :initarg :pack :reader packed-object-pack)
92
+   (%offset :initarg :offset :reader packed-object-offset)))
93
+
94
+(defmethod print-object ((obj git-object) s)
95
+  (print-unreadable-object (obj s :type t)
96
+    (format s "~a of ~a"
97
+            (subseq (object-hash obj) 0 7)
98
+            (serapeum:string-replace (namestring (user-homedir-pathname))
99
+                                     (root-of (object-repo obj))
100
+                                     "~/"))))