-
Notifications
You must be signed in to change notification settings - Fork 1
/
project-util.lisp
67 lines (59 loc) · 2.2 KB
/
project-util.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(in-package :easyweb)
(defvar *files-be-cloned* '(("_initialize" . "lisp")
("_model" . "lisp")
("_settings" . "lisp")
("_view" . "lisp")
("template-app" . "asd")))
(defvar *easyweb-template-application-dir* "/home/asdr/projects/easyweb/template-app")
(defun write-from-template (in out variables)
(let ((template-printer (html-template:create-template-printer in)))
(html-template:fill-and-print-template template-printer
variables
:stream out)))
(defun clone-file (if-path of-path &rest variables &key application_name)
(with-open-file (in if-path :direction :input)
(with-open-file (out of-path :direction :output
:if-exists :supersede)
(write-from-template in out variables))))
(defun remove-trailing-slash (string)
(if (= (position #\/ string :from-end t)
(1- (length string)))
(subseq string 0 (1- (length string)))
string))
(defun seperate-path (path)
(let* ((correct-path (remove-trailing-slash path))
(last-position (1+ (position #\/
correct-path
:from-end t))))
(values (subseq correct-path 0 last-position)
(subseq correct-path last-position))))
(defun make-project (project-path)
(let* ((project-path-n (remove-trailing-slash project-path))
(last-position (1+ (position #\/
project-path-n
:from-end t))))
(let ((project-name (subseq project-path-n
last-position)))
(multiple-value-bind (path exist)
(ensure-directories-exist (format nil
"~A~A"
project-path-n
#\/)) ;;in order to use
;;ensure-directories-exist
;;we need #\/ at the end of
;;a directory path
(when exist
(loop
for (name . type) in *files-be-cloned*
do (let ((if-path (make-pathname
:directory *easyweb-template-application-dir*
:name name
:type type))
(of-path (progn
(when (string= type "asd")
(setf name project-name))
(make-pathname
:directory path
:name name
:type type))))
(clone-file if-path of-path :application_name project-name))))))))