changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/vc/git.lisp

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
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
11
 
ellis <ellis@rwest.io>
parents:
diff changeset
12
 (defun git-url-p (url)
ellis <ellis@rwest.io>
parents:
diff changeset
13
   "Return nil if URL does not look like a URL to a git valid remote."
ellis <ellis@rwest.io>
parents:
diff changeset
14
   (let ((url-str (if (typep url 'pathname)
ellis <ellis@rwest.io>
parents:
diff changeset
15
                      (namestring url)
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
18
             (:regex "\\.git$")
ellis <ellis@rwest.io>
parents:
diff changeset
19
             (:regex "^git://")
ellis <ellis@rwest.io>
parents:
diff changeset
20
             (:regex "^https://git\\.")
ellis <ellis@rwest.io>
parents:
diff changeset
21
             (:regex "^git@"))
ellis <ellis@rwest.io>
parents:
diff changeset
22
           url-str)))
ellis <ellis@rwest.io>
parents:
diff changeset
23
 
379
45889d307d7f vc ignore stuff
Richard Westhaver <ellis@rwest.io>
parents: 325
diff changeset
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
45889d307d7f vc ignore stuff
Richard Westhaver <ellis@rwest.io>
parents: 325
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
28
   ((index))) ;; working-directory
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
38
 
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
46
 
ellis <ellis@rwest.io>
parents:
diff changeset
47
 (defmethod vc-clone ((self git-repo) remote &key &allow-other-keys)
ellis <ellis@rwest.io>
parents:
diff changeset
48
   (with-slots (path) self
ellis <ellis@rwest.io>
parents:
diff changeset
49
     (sb-ext:process-exit-code (run-git-command "clone" remote path))))
ellis <ellis@rwest.io>
parents:
diff changeset
50
 
484
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
51
 (defmethod vc-pull ((self git-repo) &optional (remote "main"))
161
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
54
       (sb-ext:process-exit-code (run-git-command "pull" remote)))))
ellis <ellis@rwest.io>
parents:
diff changeset
55
 
484
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
56
 (defmethod vc-push ((self git-repo) &optional (remote "main"))
161
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
59
       (sb-ext:process-exit-code (run-git-command "push" remote)))))
ellis <ellis@rwest.io>
parents:
diff changeset
60
 
ellis <ellis@rwest.io>
parents:
diff changeset
61
 (defmethod vc-commit ((self git-repo) msg &key &allow-other-keys)
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
64
       (sb-ext:process-exit-code (run-git-command "commit" "-m" msg)))))
ellis <ellis@rwest.io>
parents:
diff changeset
65
 
ellis <ellis@rwest.io>
parents:
diff changeset
66
 (defmethod vc-add ((self git-repo) &rest files)
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
69
       (sb-ext:process-exit-code (apply #'run-git-command "add" files)))))
ellis <ellis@rwest.io>
parents:
diff changeset
70
 
ellis <ellis@rwest.io>
parents:
diff changeset
71
 (defmethod vc-remove ((self git-repo) &rest files)
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
74
       (sb-ext:process-exit-code (apply #'run-git-command "remove" files)))))
ellis <ellis@rwest.io>
parents:
diff changeset
75
 
ellis <ellis@rwest.io>
parents:
diff changeset
76
 ;; TODO
ellis <ellis@rwest.io>
parents:
diff changeset
77
 (defmethod vc-addremove ((self git-repo) &rest files)
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
80
       (sb-ext:process-exit-code (apply #'run-git-command "addremove" files)))))
ellis <ellis@rwest.io>
parents:
diff changeset
81
 
ellis <ellis@rwest.io>
parents:
diff changeset
82
 (defmethod vc-status ((self git-repo) &key &allow-other-keys) (vc-run self "status"))
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
85
 
208
Richard Westhaver <ellis@rwest.io>
parents: 161
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
88
 
ellis <ellis@rwest.io>
parents:
diff changeset
89
 (defmethod vc-id ((self git-repo))
ellis <ellis@rwest.io>
parents:
diff changeset
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
ellis <ellis@rwest.io>
parents:
diff changeset
92
       (with-open-stream (s (sb-ext:process-output (run-git-command "id")))
ellis <ellis@rwest.io>
parents:
diff changeset
93
         (with-output-to-string (str)
ellis <ellis@rwest.io>
parents:
diff changeset
94
           (loop for c = (read-char s nil nil)
ellis <ellis@rwest.io>
parents:
diff changeset
95
                 while c
ellis <ellis@rwest.io>
parents:
diff changeset
96
                 do (write-char c str))
ellis <ellis@rwest.io>
parents:
diff changeset
97
           str)))))
ellis <ellis@rwest.io>
parents:
diff changeset
98
 
ellis <ellis@rwest.io>
parents:
diff changeset
99
 ;; TODO 2023-12-29: does git have a cmdserver?
ellis <ellis@rwest.io>
parents:
diff changeset
100
 ;; (declaim (inline make-git-client))
ellis <ellis@rwest.io>
parents:
diff changeset
101
 ;; (defstruct git-client
ellis <ellis@rwest.io>
parents:
diff changeset
102
 ;;   (pid 0 :type fixnum :read-only t)
ellis <ellis@rwest.io>
parents:
diff changeset
103
 ;;   (pgid 0 :type fixnum)
ellis <ellis@rwest.io>
parents:
diff changeset
104
 ;;   (cwd (sb-posix:getcwd) :type string))