Browse code
Continue developing data model
Ed Langley authored on 12/07/2019 09:52:31
Showing 3 changed files
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 |
+ "~/")))) |