This code is a script file to create a new project from this template, and
also to update a project with updated scripts. It is tangled into the
$DEV/bin directory and is called from the command line as org-template
<project> [<author>] [git] or as org-template -u | --update. Its create
mode takes one required, and up to two optional arguments. The required
argument is the name of the project. One optional argument is the name of the
author. The other optional argument is the term ‘git’, meaning to initialize a
‘git’ repository for the project. To update a project, call org-template
--update from the project root.
Here are the steps it takes:
template-update
function. Otherwise, it calls the template-create function.
README.md into the project.
.gitignore file in it, adding the Org file
and the README.md file and finally making an initial Git commit.
tree
command.
##+header: :tangle /usr/local/dev/bin/org-template
1 # org-template: create and update projects
2
3 USAGE='
4 '"$0..."'
5 org-template -h | --help
6 org-template <Project> [<Author>] [git]
7 org-template -u | --update
8 '
9
10 template-create () {
11 mkdir -v "$1"
12 printf "copy "
13 cp -v ${SYNC_ORG_TEMPLATE} "$1/$1.org"
14 printf "${CLEAR}\n"
15
16 sed -i '' -Ee '/^\#\+(title|TITLE):/ s/TITLE/'"$1"'/' \
17 -Ee '/^\#\+(date|DATE):\s*(.*)$/ s/$2/$(date '"+%F %R"')/' \
18 -Ee '/^\#\+(macro|MACRO):version Version/ s/[[:digit:].]+/0.0.0/' \
19 -Ee '/^\#\+(texinfo_printed_title|TEXINFO_PRINTED_TITLE):/ s/PRINTED TITLE/'"$1"'/' \
20 "$1/$1.org"
21
22 [[ $# -ge 2 ]] && \
23 sed -i '' -Ee '/^\#\+(author|AUTHOR):/ s/AUTHOR/'"$2"'/' "$1/$1.org"
24
25 printf "${CYAN}"
26 ${EDITOR} --eval \
27 "(with-current-buffer (find-file-noselect \"$1/$1.org\")
28 (save-excursion
29 (goto-char (point-min))
30 (re-search-forward \"#[+]name:project-readme$\")
31 (org-babel-tangle (quote (4)))
32 (search-forward \"** Create Script\")
33 (org-cut-subtree)
34 (save-buffer)
35 (re-search-forward \"^#[+]name:boot-template$\")
36 (org-babel-tangle (quote (4)))))"
37 printf "${CLEAR}\n"
38
39 if [[ (($# -eq 2) || ($# -eq 3)) && (($2 == 'git') || ($3 == 'git')) ]]
40 then
41 cd $1 && {
42 rm *~
43 printf "${YELLOWBOLD}"
44 git init
45 printf "${CLEAR}"
46
47 echo "\
48 .gitignore
49 Makefile
50 *~
51 .*~
52 *.texi
53 *.info
54 *.html
55 *-old
56 tools" > .gitignore
57
58 git add .
59 git commit -m "Initial commit of Project $1"
60 }
61 cd ..
62 fi
63 rm "$1"/*~
64
65 printf "${PURPLEBOLD}\n"
66 pwd
67 printf "${CLEAR}"
68 tree -aI .git $1
69
70 return 0
71 }
72
73 template-update() {
74 ${EDITOR} -u --eval \
75 "(progn
76 (with-current-buffer (find-file-noselect (getenv \"SYNC_ORG_TEMPLATE\"))
77 (save-excursion
78 (goto-char (point-min))
79 (org-link-search \"#build-tools\")
80 (org-copy-subtree 2)))
81 (with-current-buffer (car (find-file-noselect \"./*.org\" nil nil t))
82 (save-excursion
83 (goto-char (point-min))
84 (org-link-search \"#build-tools\")
85 (org-paste-subtree 1 nil t t)
86 (org-cut-subtree 2)
87 (save-buffer))))"
88
89 return 0;
90 }
91
92 main () {
93 case $1 in
94 create)
95
96 printf "${PURPLE}"
97 read -n 1 -p "Create new project: $2 (y/n) ?"
98 printf "${CLEAR}\n\n"
99 [[ $REPLY =~ [yY] ]] && template-create "$2" || exit 0
100 ;;
101
102 update)
103
104 template-update
105 ;;
106 esac
107 exit 0
108 }
109
110
111 if [[ $1 =~ ^-(h|-help)$ ]]; then
112 printf "HELP:\n$USAGE"
113 exit 0
114 fi
115
116 if [[ $1 =~ ^-(u|-update)$ ]]; then
117 printf "UPDATE:\n"
118 main update
119 fi
120
121 [[ ($# -ge 1) && ($# -le 3) ]] && { printf "CREATE:\n"; main create $1; } || {
122 printf "${RED}ARGUMENTS ERROR:${CLEAR}$USAGE\n"
123 exit 1
124 }
125