@@ -2,51 +2,74 @@ module fpm_cmd_new
2
2
3
3
use fpm_command_line, only : fpm_new_settings
4
4
use fpm_environment, only : run, OS_LINUX, OS_MACOS, OS_WINDOWS
5
- use fpm_filesystem, only : join_path, exists, basename, mkdir
5
+ use fpm_filesystem, only : join_path, exists, basename, mkdir, is_dir
6
6
use ,intrinsic :: iso_fortran_env, only : stderr= >error_unit
7
7
implicit none
8
8
private
9
9
public :: cmd_new
10
10
11
11
contains
12
12
13
- subroutine cmd_new (settings ) ! --with-executable F --with-test F '
13
+ subroutine cmd_new (settings )
14
14
type (fpm_new_settings), intent (in ) :: settings
15
15
character (len= :),allocatable :: bname ! baeename of NAME
16
16
character (len= :),allocatable :: message(:)
17
17
character (len= :),allocatable :: littlefile(:)
18
+ character (len= 8 ) :: date
19
+
20
+ call date_and_time (DATE= date)
21
+
22
+ if (exists(settings% name) .and. .not. settings% backfill )then
23
+ write (stderr,' (*(g0,1x))' )&
24
+ & ' ERROR: ' ,settings% name,' already exists.'
25
+ write (stderr,' (*(g0,1x))' )&
26
+ & ' perhaps you wanted to add --backfill ?'
27
+ return
28
+ elseif (is_dir(settings% name) .and. settings% backfill )then
29
+ write (* ,' (*(g0))' )' backfilling ' ,settings% name
30
+ elseif (exists(settings% name) )then
31
+ write (stderr,' (*(g0,1x))' )&
32
+ & ' ERROR: ' ,settings% name,' already exists and is not a directory.'
33
+ return
34
+ else
35
+ ! make new directory
36
+ call mkdir(settings% name)
37
+ endif
18
38
19
- call mkdir(settings% name) ! make new directory
20
- call run(' cd ' // settings% name) ! change to new directory as a test. System dependent potentially
21
- ! ! NOTE: need some system routines to handle filenames like "." like realpath() or getcwd().
39
+ ! change to new directory as a test. System dependent potentially
40
+ call run(' cd ' // settings% name)
41
+ ! *! NOTE: need some system routines to handle filenames like "."
42
+ ! *! like realpath() or getcwd().
22
43
bname= basename(settings% name)
23
44
24
- ! ! weird gfortran bug?? lines truncated to concatenated string length, not 80
25
- ! ! hit some weird gfortran bug when littlefile data was an argument to warnwrite(3f), ok when a variable
26
-
27
- call warnwrite(join_path(settings% name, ' .gitignore' ), [' build/*' ]) ! create NAME/.gitignore file
45
+ ! create NAME/.gitignore file
46
+ call warnwrite(join_path(settings% name, ' .gitignore' ), [' build/*' ])
28
47
29
48
littlefile= [character (len= 80 ) :: ' # ' // bname, ' My cool new project!' ]
30
49
31
- call warnwrite(join_path(settings% name, ' README.md' ), littlefile) ! create NAME/README.md
32
-
33
- message= [character (len= 80 ) :: & ! start building NAME/fpm.toml
34
- &' name = "' // bname// ' " ' , &
35
- &' version = "0.1.0" ' , &
36
- &' license = "license" ' , &
37
- &' author = "Jane Doe" ' , &
38
- &
' maintainer = "[email protected] " ' , &
39
- &' copyright = "2020 Jane Doe" ' , &
40
- &' ' , &
50
+ ! create NAME/README.md
51
+ call warnwrite(join_path(settings% name, ' README.md' ), littlefile)
52
+
53
+ ! start building NAME/fpm.toml
54
+ message= [character (len= 80 ) :: &
55
+ &' name = "' // bname// ' " ' , &
56
+ &' version = "0.1.0" ' , &
57
+ &' license = "license" ' , &
58
+ &' author = "Jane Doe" ' , &
59
+ &
' maintainer = "[email protected] " ' , &
60
+ &' copyright = "' // date(1 :4 )// ' Jane Doe" ' , &
61
+ &' ' , &
41
62
&' ' ]
42
63
43
64
if (settings% with_lib)then
44
65
call mkdir(join_path(settings% name,' src' ) )
45
- message= [character (len= 80 ) :: message, & ! create next section of fpm.toml
66
+ ! create next section of fpm.toml
67
+ message= [character (len= 80 ) :: message, &
46
68
&' [library] ' , &
47
69
&' source-dir="src" ' , &
48
70
&' ' ]
49
- littlefile= [character (len= 80 ) :: & ! create placeholder module src/bname.f90
71
+ ! create placeholder module src/bname.f90
72
+ littlefile= [character (len= 80 ) :: &
50
73
&' module ' // bname, &
51
74
&' implicit none' , &
52
75
&' private' , &
@@ -57,69 +80,87 @@ subroutine cmd_new(settings) ! --with-executable F --with-test F '
57
80
&' print *, "Hello, ' // bname// ' !"' , &
58
81
&' end subroutine say_hello' , &
59
82
&' end module ' // bname]
60
- ! a proposed alternative default
61
- call warnwrite(join_path(settings% name, ' src' , bname// ' .f90' ), littlefile) ! create NAME/src/NAME.f90
83
+ ! create NAME/src/NAME.f90
84
+ call warnwrite(join_path(settings% name, ' src' , bname// ' .f90' ),&
85
+ & littlefile)
62
86
endif
63
87
64
88
if (settings% with_test)then
65
- call mkdir(join_path(settings% name, ' test' )) ! create NAME/test or stop
66
- message= [character (len= 80 ) :: message, & ! create next section of fpm.toml
89
+
90
+ ! create NAME/test or stop
91
+ call mkdir(join_path(settings% name, ' test' ))
92
+ ! create next section of fpm.toml
93
+ message= [character (len= 80 ) :: message, &
67
94
&' [[test]] ' , &
68
95
&' name="runTests" ' , &
69
96
&' source-dir="test" ' , &
70
97
&' main="main.f90" ' , &
71
98
&' ' ]
72
99
73
- littlefile= [character (len= 80 ) :: &
100
+ littlefile= [character (len= 80 ) :: &
74
101
&' program main' , &
75
102
&' implicit none' , &
76
103
&' ' , &
77
104
&' print *, "Put some tests in here!"' , &
78
105
&' end program main' ]
79
- ! a proposed alternative default a little more substantive
80
- call warnwrite(join_path(settings% name, ' test/main.f90' ), littlefile) ! create NAME/test/main.f90
106
+ ! create NAME/test/main.f90
107
+ call warnwrite(join_path(settings% name, ' test/main.f90' ), littlefile)
81
108
endif
82
109
83
110
if (settings% with_executable)then
84
- call mkdir(join_path(settings% name, ' app' )) ! create NAME/app or stop
85
- message= [character (len= 80 ) :: message, & ! create next section of fpm.toml
111
+ ! create next section of fpm.toml
112
+ call mkdir(join_path(settings% name, ' app' ))
113
+ ! create NAME/app or stop
114
+ message= [character (len= 80 ) :: message, &
86
115
&' [[executable]] ' , &
87
116
&' name="' // bname// ' " ' , &
88
117
&' source-dir="app" ' , &
89
118
&' main="main.f90" ' , &
90
119
&' ' ]
91
120
92
- littlefile= [character (len= 80 ) :: &
93
- &' program main' , &
94
- &' use ' // bname// ' , only: say_hello' , &
95
- &' ' , &
96
- &' implicit none' , &
97
- &' ' , &
98
- &' call say_hello' , &
99
- &' end program main' ]
121
+ if (exists(bname// ' /src/' ))then
122
+ littlefile= [character (len= 80 ) :: &
123
+ &' program main' , &
124
+ &' use ' // bname// ' , only: say_hello' , &
125
+ &' implicit none' , &
126
+ &' ' , &
127
+ &' call say_hello()' , &
128
+ &' end program main' ]
129
+ else
130
+ littlefile= [character (len= 80 ) :: &
131
+ &' program main' , &
132
+ &' implicit none' , &
133
+ &' ' , &
134
+ &' print *, "hello from project ' // bname// ' "' , &
135
+ &' end program main' ]
136
+ endif
100
137
call warnwrite(join_path(settings% name, ' app/main.f90' ), littlefile)
101
138
endif
102
139
103
- call warnwrite(join_path(settings% name, ' fpm.toml' ), message) ! now that built it write NAME/fpm.toml
104
-
105
- call run(' cd ' // settings% name // ' &&git init' ) ! assumes these commands work on all systems and git(1) is installed
140
+ ! now that built it write NAME/fpm.toml
141
+ call warnwrite(join_path(settings% name, ' fpm.toml' ), message)
142
+ ! assumes git(1) is installed and in path
143
+ call run(' git init ' // settings% name)
106
144
contains
107
145
108
146
subroutine warnwrite (fname ,data )
109
147
character (len=* ),intent (in ) :: fname
110
148
character (len=* ),intent (in ) :: data (:)
111
149
112
150
if (.not. exists(fname))then
113
- call filewrite(fname,data )
151
+ call filewrite(fname,data )
114
152
else
115
- write (stderr,' (*(g0,1x))' )' fpm::new<WARNING>' ,fname,' already exists. Not overwriting'
153
+ write (stderr,' (*(g0,1x))' )' INFO: ' ,fname,&
154
+ & ' already exists. Not overwriting'
116
155
endif
117
156
118
157
end subroutine warnwrite
119
158
120
159
subroutine filewrite (filename ,filedata )
121
- use ,intrinsic :: iso_fortran_env, only : stdin= >input_unit, stdout= >output_unit, stderr= >error_unit
122
- ! write filedata to file filename
160
+ ! procedure to write filedata to file filename
161
+ use ,intrinsic :: iso_fortran_env, only : &
162
+ & stdin= >input_unit, stdout= >output_unit, stderr= >error_unit
163
+
123
164
character (len=* ),intent (in ) :: filename
124
165
character (len=* ),intent (in ) :: filedata(:)
125
166
integer :: lun, i, ios
@@ -130,29 +171,33 @@ subroutine filewrite(filename,filedata)
130
171
if (filename.ne. ' ' )then
131
172
open (file= filename, &
132
173
& newunit= lun, &
133
- & form= ' formatted' , & ! FORM = FORMATTED | UNFORMATTED
134
- & access= ' sequential' , & ! ACCESS = SEQUENTIAL | DIRECT | STREAM
135
- & action= ' write' , & ! ACTION = READ|WRITE | READWRITE
136
- & position= ' rewind' , & ! POSITION = ASIS | REWIND | APPEND
137
- & status= ' new' , & ! STATUS = NEW | REPLACE | OLD | SCRATCH | UNKNOWN
174
+ & form= ' formatted' , & ! FORM = FORMATTED | UNFORMATTED
175
+ & access= ' sequential' , & ! ACCESS = SEQUENTIAL| DIRECT | STREAM
176
+ & action= ' write' , & ! ACTION = READ|WRITE| READWRITE
177
+ & position= ' rewind' , & ! POSITION= ASIS | REWIND | APPEND
178
+ & status= ' new' , & ! STATUS = NEW| REPLACE| OLD| SCRATCH| UNKNOWN
138
179
& iostat= ios, &
139
180
& iomsg= message)
140
181
else
141
182
lun= stdout
142
183
ios= 0
143
184
endif
144
185
if (ios.ne. 0 )then
145
- write (stderr,' (*(a:,1x))' )' *filewrite* error:' ,filename,trim (message)
186
+ write (stderr,' (*(a:,1x))' )&
187
+ & ' *filewrite* error:' ,filename,trim (message)
146
188
error stop 1
147
189
endif
148
- do i= 1 ,size (filedata) ! write file
190
+ ! write file
191
+ do i= 1 ,size (filedata)
149
192
write (lun,' (a)' ,iostat= ios,iomsg= message)trim (filedata(i))
150
193
if (ios.ne. 0 )then
151
- write (stderr,' (*(a:,1x))' )' *filewrite* error:' ,filename,trim (message)
194
+ write (stderr,' (*(a:,1x))' )&
195
+ & ' *filewrite* error:' ,filename,trim (message)
152
196
error stop 4
153
197
endif
154
198
enddo
155
- close (unit= lun,iostat= ios,iomsg= message) ! close file
199
+ ! close file
200
+ close (unit= lun,iostat= ios,iomsg= message)
156
201
if (ios.ne. 0 )then
157
202
write (stderr,' (*(a:,1x))' )' *filewrite* error:' ,trim (message)
158
203
error stop 2
0 commit comments