changeset 484: | f054d7d288ef |
parent: | 0f0e5f9b5c55 |
child: | 35a579313b80 |
author: | Richard Westhaver <ellis@rwest.io> |
date: | Sat, 29 Jun 2024 20:09:23 -0400 |
permissions: | -rw-r--r-- |
description: | vc |
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
1 | (in-package :vc/git) |
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
2 | |
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
3 | (deferror git-error (vc-error) () (:auto t)) |
161 | 4 | |
388
dec30b6fd500
prelude/user packages init
Richard Westhaver <ellis@rwest.io>
parents:
379
diff
changeset
|
5 | (defvar *git-program* (cli:find-exe "git")) |
161 | 6 | |
325
9b573fc6bc40
vc updates, fixed missing in-package lines, skel errors
Richard Westhaver <ellis@rwest.io>
parents:
208
diff
changeset
|
7 | (defun run-git-command (cmd &optional args output (wait t)) |
9b573fc6bc40
vc updates, fixed missing in-package lines, skel errors
Richard Westhaver <ellis@rwest.io>
parents:
208
diff
changeset
|
8 | (unless (listp args) (setf args (list args))) |
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
9 | (setf args (mapcar #'vc/proto::namestring-or args)) ;; TODO 2024-05-10: slow |
325
9b573fc6bc40
vc updates, fixed missing in-package lines, skel errors
Richard Westhaver <ellis@rwest.io>
parents:
208
diff
changeset
|
10 | (sb-ext:run-program *git-program* (push cmd args) :output output :wait wait :input nil)) |
161 | 11 | |
12 | (defun git-url-p (url) |
|
13 | "Return nil if URL does not look like a URL to a git valid remote." |
|
14 | (let ((url-str (if (typep url 'pathname) |
|
15 | (namestring url) |
|
16 | url))) |
|
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
17 | (ppcre:scan '(:alternation |
161 | 18 | (:regex "\\.git$") |
19 | (:regex "^git://") |
|
20 | (:regex "^https://git\\.") |
|
21 | (:regex "^git@")) |
|
22 | url-str))) |
|
23 | ||
379 | 24 | (defun gitignore (&optional (path ".gitignore")) |
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
25 | (vc/proto::make-vc-ignore :path path :patterns (vc/proto::map-lines #'vc/proto::glob-path-match path))) |
379 | 26 | |
325
9b573fc6bc40
vc updates, fixed missing in-package lines, skel errors
Richard Westhaver <ellis@rwest.io>
parents:
208
diff
changeset
|
27 | (defclass git-repo (vc-repo) |
161 | 28 | ((index))) ;; working-directory |
29 | ||
325
9b573fc6bc40
vc updates, fixed missing in-package lines, skel errors
Richard Westhaver <ellis@rwest.io>
parents:
208
diff
changeset
|
30 | (defmethod vc-init ((self (eql :git))) |
9b573fc6bc40
vc updates, fixed missing in-package lines, skel errors
Richard Westhaver <ellis@rwest.io>
parents:
208
diff
changeset
|
31 | (make-instance 'git-repo :path (pathname *default-pathname-defaults*))) |
9b573fc6bc40
vc updates, fixed missing in-package lines, skel errors
Richard Westhaver <ellis@rwest.io>
parents:
208
diff
changeset
|
32 | |
161 | 33 | (defmethod vc-init ((self git-repo)) |
419
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
34 | (let ((path (vc-path self))) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
35 | (if (zerop (sb-ext:process-exit-code (run-git-command "init" path))) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
36 | (not (probe-file path)) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
37 | (git-error "git init failed:" path)))) |
161 | 38 | |
39 | (defmethod vc-run ((self git-repo) (cmd string) &rest args) |
|
419
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
40 | (uiop:with-current-directory ((vc-path self)) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
41 | (with-open-stream (s (sb-ext:process-output (apply #'run-git-command cmd args))) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
42 | (with-output-to-string (str) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
43 | (loop for l = (read-line s nil nil) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
44 | while l |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
45 | do (write-line l)))))) |
161 | 46 | |
47 | (defmethod vc-clone ((self git-repo) remote &key &allow-other-keys) |
|
48 | (with-slots (path) self |
|
49 | (sb-ext:process-exit-code (run-git-command "clone" remote path)))) |
|
50 | ||
484 | 51 | (defmethod vc-pull ((self git-repo) &optional (remote "main")) |
161 | 52 | (with-slots (path) self |
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
53 | (uiop:with-current-directory (path) |
161 | 54 | (sb-ext:process-exit-code (run-git-command "pull" remote))))) |
55 | ||
484 | 56 | (defmethod vc-push ((self git-repo) &optional (remote "main")) |
161 | 57 | (with-slots (path) self |
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
58 | (uiop:with-current-directory (path) |
161 | 59 | (sb-ext:process-exit-code (run-git-command "push" remote))))) |
60 | ||
61 | (defmethod vc-commit ((self git-repo) msg &key &allow-other-keys) |
|
62 | (with-slots (path) self |
|
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
63 | (uiop:with-current-directory (path) |
161 | 64 | (sb-ext:process-exit-code (run-git-command "commit" "-m" msg))))) |
65 | ||
66 | (defmethod vc-add ((self git-repo) &rest files) |
|
67 | (with-slots (path) self |
|
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
68 | (uiop:with-current-directory (path) |
161 | 69 | (sb-ext:process-exit-code (apply #'run-git-command "add" files))))) |
70 | ||
71 | (defmethod vc-remove ((self git-repo) &rest files) |
|
72 | (with-slots (path) self |
|
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
73 | (uiop:with-current-directory (path) |
161 | 74 | (sb-ext:process-exit-code (apply #'run-git-command "remove" files))))) |
75 | ||
76 | ;; TODO |
|
77 | (defmethod vc-addremove ((self git-repo) &rest files) |
|
78 | (with-slots (path) self |
|
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
79 | (uiop:with-current-directory (path) |
161 | 80 | (sb-ext:process-exit-code (apply #'run-git-command "addremove" files))))) |
81 | ||
82 | (defmethod vc-status ((self git-repo) &key &allow-other-keys) (vc-run self "status")) |
|
83 | ||
388
dec30b6fd500
prelude/user packages init
Richard Westhaver <ellis@rwest.io>
parents:
379
diff
changeset
|
84 | (defmethod vc-branch ((self git-repo)) (vc-run self "branch")) |
161 | 85 | |
208 | 86 | (defmethod vc-diff ((a git-repo) (b git-repo) &key &allow-other-keys) |
419
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
389
diff
changeset
|
87 | (vc-run a "diff" (vc-head a) (vc-head b))) |
161 | 88 | |
89 | (defmethod vc-id ((self git-repo)) |
|
90 | (with-slots (path) self |
|
389
95b861dff3d8
box,skel,vc,obj upgrades, moved XDB to demo/examples/db
Richard Westhaver <ellis@rwest.io>
parents:
388
diff
changeset
|
91 | (uiop:with-current-directory (path) |
161 | 92 | (with-open-stream (s (sb-ext:process-output (run-git-command "id"))) |
93 | (with-output-to-string (str) |
|
94 | (loop for c = (read-char s nil nil) |
|
95 | while c |
|
96 | do (write-char c str)) |
|
97 | str))))) |
|
98 | ||
99 | ;; TODO 2023-12-29: does git have a cmdserver? |
|
100 | ;; (declaim (inline make-git-client)) |
|
101 | ;; (defstruct git-client |
|
102 | ;; (pid 0 :type fixnum :read-only t) |
|
103 | ;; (pgid 0 :type fixnum) |
|
104 | ;; (cwd (sb-posix:getcwd) :type string)) |