]> git.pld-linux.org Git - packages/nginx.git/blame - nginx.spec
use another config dir to load modules in global scope and first
[packages/nginx.git] / nginx.spec
CommitLineData
f9e65082 1# TODO
ee4f2132 2# - /etc/sysconfig/nginx file
1c438d78 3# - missing perl build/install requires
ee4f2132 4#
362f5ab2 5# Conditional build for nginx:
d2732616
ER
6# Features
7%bcond_with debug # enable debug logging: http://nginx.org/en/docs/debugging_log.html
d54a9642 8%bcond_without threads # thread pool support
d2732616
ER
9# Modules
10%bcond_without addition # http addition module
11%bcond_without auth_request # auth_request module
12%bcond_without dav # WebDAV
13%bcond_without flv # http FLV module
278483d6 14%bcond_without gd # without http image filter module
82f38dc6 15%bcond_without geoip # without http geoip module and stream geoip module
d2732616
ER
16%bcond_without http2 # HTTP/2 module
17%bcond_without mail # don't build imap/mail proxy
18%bcond_without perl # don't build with perl module
19%bcond_without poll # poll module
20%bcond_without realip # real ip (behind proxy)
21%bcond_without select # select module
22%bcond_without ssl # ssl support and http ssl module
23%bcond_without stream # TCP/UDP proxy module
24%bcond_without stub_status # http stub status module
25%bcond_without sub # ngx_http_sub_module
278483d6 26%bcond_without xslt # without http xslt module
d2732616 27%bcond_with http_browser # http browser module (header "User-agent" parser)
ba5570e8 28%bcond_with modsecurity # modsecurity module
d2732616 29%bcond_with rtmp # rtmp support
fb649fe5 30
8cf64677
WF
31%ifarch x32
32%undefine with_rtsig
33%endif
34
27ce902f 35%define ssl_version 1.0.2
5d0d957d 36%define rtmp_version 1.1.7
aa6a1e55 37%define modsecurity_version 2.9.1
8e1389c7 38Summary: High perfomance HTTP and reverse proxy server
185313bb 39Summary(pl.UTF-8): Serwer HTTP i odwrotne proxy o wysokiej wydajności
3dfa1ca2
AM
40# nginx lines:
41# - stable: production quality with stable API
42# - mainline: production quality but API can change
f9e65082 43Name: nginx
69afa2ca 44Version: 1.11.5
97ac281a 45Release: 0.4
51ef519b 46License: BSD-like
cbf76340 47Group: Networking/Daemons/HTTP
06e274b9 48Source0: http://nginx.org/download/%{name}-%{version}.tar.gz
69afa2ca 49# Source0-md5: db43f2b19746f6f47401c3afc3924dc6
06e274b9 50Source1: http://nginx.net/favicon.ico
87404bf2 51# Source1-md5: 2aaf2115c752cbdbfb8a2f0b3c3189ab
06e274b9 52Source2: proxy.conf
226bcc40 53Source3: %{name}.logrotate
54Source4: %{name}.mime
7f97359c 55Source6: %{name}.monitrc
2cb3d9b2 56Source7: %{name}.init
5d9f0850 57Source14: %{name}.conf
7d80c773 58Source17: %{name}-mime.types.sh
8d0ed4b0 59Source18: %{name}.service
ba5570e8 60Source22: http://www.modsecurity.org/tarball/%{modsecurity_version}/modsecurity-%{modsecurity_version}.tar.gz
aa6a1e55 61# Source22-md5: 0fa92b852abc857a20b9e24f83f814cf
278483d6 62Source101: https://github.com/arut/nginx-rtmp-module/archive/v%{rtmp_version}/%{name}-rtmp-module-%{rtmp_version}.tar.gz
5d0d957d 63# Source101-md5: 8006de2560db3e55bb15d110220076ac
5ca9795d 64Patch0: %{name}-no-Werror.patch
7ce2935c 65Patch1: %{name}-modsecurity-xheaders.patch
51ef519b 66URL: http://nginx.net/
dfef7372 67BuildRequires: mailcap
f1fc9780 68BuildRequires: pcre-devel
d323480a 69BuildRequires: rpmbuild(macros) >= 1.644
f9e65082 70BuildRequires: zlib-devel
278483d6
ER
71%if %{with geoip}
72BuildRequires: GeoIP-devel
73%endif
74%if %{with gd}
75BuildRequires: gd-devel
76%endif
77%if %{with modsecurity}
78BuildRequires: lua-devel
79%endif
80%if %{with perl}
81BuildRequires: perl-CGI
82BuildRequires: perl-devel
83BuildRequires: python
84BuildRequires: rpm-perlprov
85%endif
86%if %{with ssl}
87BuildRequires: openssl-devel >= %{ssl_version}
88Requires: openssl >= %{ssl_version}
89%endif
90%if %{with xslt}
91BuildRequires: libxslt-devel
92%endif
1a973791
JK
93Provides: group(http)
94Provides: group(nginx)
95Provides: user(nginx)
4ac1d45f 96Provides: webserver
9b47506f
AM
97Provides: webserver(access)
98Provides: webserver(alias)
81d5057a
JK
99Provides: webserver(auth)
100Provides: webserver(expires)
101Provides: webserver(headers)
1e42c256 102Provides: webserver(indexfile)
81d5057a
JK
103Provides: webserver(log)
104Provides: webserver(mime)
105Provides: webserver(reqtimeout)
106Provides: webserver(rewrite)
107Provides: webserver(setenv)
1a973791 108Conflicts: logrotate < 3.8.0
85600569 109Requires(post,preun): /sbin/chkconfig
1a973791 110Requires(post,preun,postun): systemd-units >= 38
4ac1d45f
ER
111Requires(postun): /usr/sbin/groupdel
112Requires(postun): /usr/sbin/userdel
113Requires(pre): /bin/id
114Requires(pre): /usr/bin/getgid
115Requires(pre): /usr/sbin/groupadd
116Requires(pre): /usr/sbin/useradd
117Requires: rc-scripts >= 0.2.0
118Requires: systemd-units >= 38
119Suggests: vim-syntax-nginx
120BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
2ee780b1 121
4ac1d45f
ER
122%define _sysconfdir /etc/%{name}
123%define _nginxdir /home/services/%{name}
124
125%description
1a973791
JK
126nginx ("engine x") is a high-performance HTTP server and reverse
127proxy, as well as an IMAP/POP3 proxy server. nginx was written by Igor
128Sysoev for Rambler.ru, Russia's second-most visited website, where it
129has been running in production for over two and a half years. Igor has
130released the source code under a BSD-like license. Although still in
131beta, nginx is known for its stability, rich feature set, simple
132configuration, and low resource consumption.
133
4ac1d45f 134%description -l pl.UTF-8
1a973791 135nginx ("engine x") jest wysokowydajnym serwerem HTTP, odwrotnym proxy
5ca9795d
ER
136a także IMAP/POP3 proxy. nginx został napisany przez Igora Sysoeva na
137potrzeby serwisu Rambler.ru. Jest to drugi pod względem ilości
1a973791 138odwiedzin serwis w Rosji i działa od ponad dwóch i pół roku. Igor
5ca9795d
ER
139opublikował źródła na licencji BSD. Mimo, że projekt jest ciągle w
140fazie beta, już zasłynął dzięki stabilności, bogactwu dodatków,
1a973791
JK
141prostej konfiguracji oraz małej "zasobożerności".
142
278483d6
ER
143%package mod_http_geoip
144Summary: Nginx HTTP geoip module
145Group: Daemons
146Requires: %{name} = %{version}-%{release}
147Requires: GeoIP
148
149%description mod_http_geoip
150Nginx HTTP geoip module.
151
82f38dc6
ER
152%package mod_stream_geoip
153Summary: Nginx stream geoip module
154Group: Daemons
155Requires: %{name} = %{version}-%{release}
156Requires: GeoIP
157
158%description mod_stream_geoip
159Nginx stream geoip module.
160
278483d6
ER
161%package mod_http_image_filter
162Summary: Nginx HTTP image filter module
163Group: Daemons
164Requires: %{name} = %{version}-%{release}
165
166%description mod_http_image_filter
167Nginx HTTP image filter module.
168
f5d76ba0
ER
169%package mod_http_perl
170Summary: Nginx HTTP Perl module
cbf76340 171Group: Networking/Daemons/HTTP
4ac1d45f 172Requires: %{name} = %{version}-%{release}
2ee780b1 173
f5d76ba0
ER
174%description mod_http_perl
175Nginx HTTP Perl module.
2ee780b1 176
278483d6
ER
177%package mod_http_xslt_filter
178Summary: Nginx XSLT module
179Group: Daemons
180Requires: %{name} = %{version}-%{release}
181
182%description mod_http_xslt_filter
183Nginx XSLT module.
184
f5d76ba0
ER
185%package mod_mail
186Summary: Nginx mail module
cbf76340 187Group: Networking/Daemons/HTTP
4ac1d45f 188Requires: %{name} = %{version}-%{release}
2ee780b1 189
f5d76ba0
ER
190%description mod_mail
191Nginx mail module.
2ee780b1 192
278483d6
ER
193%package mod_stream
194Summary: Nginx stream modules
195Group: Daemons
196Requires: %{name} = %{version}-%{release}
197
198%description mod_stream
199Nginx stream modules.
200
dd7459ac 201%package -n monit-rc-nginx
57f21172 202Summary: nginx support for monit
203Summary(pl.UTF-8): Wsparcie nginx dla monit
60b8f836 204Group: Applications/System
4ac1d45f 205Requires: %{name} = %{version}-%{release}
1cf92547 206Requires: monit
dd7459ac 207
208%description -n monit-rc-nginx
57f21172 209monitrc file for monitoring nginx webserver.
dd7459ac 210
211%description -n monit-rc-nginx -l pl.UTF-8
57f21172 212Plik monitrc do monitorowania serwera WWW nginx.
dd7459ac 213
f9e65082 214%prep
ba5570e8 215%setup -q %{?with_rtmp:-a101} %{?with_modsecurity:-a22}
717159c4 216%patch0 -p0
7ce2935c 217%{?with_modsecurity:%patch1 -p0}
f9e65082 218
fb649fe5
ER
219%if %{with rtmp}
220mv nginx-rtmp-module-%{rtmp_version} nginx-rtmp-module
221%endif
222
a8eaad11 223# build mime.types.conf
7d80c773 224#sh %{SOURCE17} /etc/mime.types
a8eaad11 225
f9e65082
ER
226%build
227# NB: not autoconf generated configure
056acc18 228cp -f configure auto/
5d0d957d 229
056acc18 230./configure \
231 --prefix=%{_prefix} \
483adace 232 --modules-path=%{_libdir}/%{name}/modules \
efc6207e
ER
233 --sbin-path=%{_sbindir}/%{name} \
234 --conf-path=%{_sysconfdir}/%{name}.conf \
235 --error-log-path=%{_localstatedir}/log/%{name}/error.log \
236 --http-log-path=%{_localstatedir}/log/%{name}/access.log \
237 --pid-path=%{_localstatedir}/run/%{name}.pid \
238 --lock-path=%{_localstatedir}/lock/subsys/%{name} \
239 --http-client-body-temp-path=%{_localstatedir}/cache/%{name}/client_body_temp \
240 --http-fastcgi-temp-path=%{_localstatedir}/cache/%{name}/fastcgi_temp \
241 --http-proxy-temp-path=%{_localstatedir}/cache/%{name}/proxy_temp \
2fb62cf2
ER
242 --user=nginx \
243 --group=nginx \
021e3ce8
ER
244 %{?with_select:--with-select_module} \
245 %{?with_poll:--with-poll_module} \
246 %{?with_rtsig:--with-rtsig_module} \
278483d6 247 %{?with_perl:--with-http_perl_module=dynamic} \
278483d6
ER
248 %{?with_gd:--with-http_image_filter_module=dynamic} \
249 %{?with_xslt:--with-http_xslt_module=dynamic} \
82f38dc6
ER
250 %{?with_geoip:--with-http_geoip_module=dynamic} \
251 %{?with_geoip:--with-stream_geoip_module=dynamic} \
008e09c3
ER
252%if %{with mail}
253 --with-mail=dynamic \
254 --with-mail_ssl_module \
278483d6
ER
255%endif
256%if %{with stream}
257 --with-stream=dynamic \
258 --with-stream_ssl_module \
008e09c3 259%endif
2fb62cf2
ER
260 --with-cc="%{__cc}" \
261 --with-cc-opt="%{rpmcflags}" \
262 --with-ld-opt="%{rpmldflags}" \
0aa7dc69 263 %{?with_debug:--with-debug} \
056acc18 264 %{?with_addition:--with-http_addition_module} \
265 %{?with_dav:--with-http_dav_module} \
266 %{?with_flv:--with-http_flv_module} \
d6fc4b09 267 %{?with_sub:--with-http_sub_module} \
056acc18 268 %{?with_realip:--with-http_realip_module} \
d2732616 269 %{?with_stub_status:--with-http_stub_status_module} \
056acc18 270 %{?with_ssl:--with-http_ssl_module} \
271 %{!?with_http_browser:--without-http_browser_module} \
fb649fe5 272 %{?with_rtmp:--add-module=./nginx-rtmp-module} \
e9a11359 273 %{?with_auth_request:--with-http_auth_request_module} \
8cf64677 274 %{?with_threads:--with-threads} \
6f05a009 275 %{?with_http2:--with-http_v2_module} \
ba5570e8 276 %{?with_modsecurity:--add-module=modsecurity-%{modsecurity_version}/nginx/modsecurity} \
ca3f3f03 277 --with-http_secure_link_module \
2fb62cf2
ER
278 %{nil}
279
53215d5e 280%{__make}
056acc18 281
53215d5e
ER
282%if %{with modsecurity}
283cd modsecurity-%{modsecurity_version}
284./autogen.sh
285%configure \
286 --enable-standalone-module \
287 --disable-mlogc \
288 --enable-alp2 \
289 --with-lua=/usr
290%{__make}
291cd ..
292%endif
f9e65082
ER
293
294%install
295rm -rf $RPM_BUILD_ROOT
362f5ab2 296install -d $RPM_BUILD_ROOT/etc/rc.d/init.d \
297 $RPM_BUILD_ROOT%{_nginxdir}/{cgi-bin,html,errors} \
4e61eac8 298 $RPM_BUILD_ROOT%{_localstatedir}/log/{%{name},archive/%{name}} \
c63e9e18
ER
299 $RPM_BUILD_ROOT%{_localstatedir}/cache/%{name} \
300 $RPM_BUILD_ROOT%{_localstatedir}/lock/subsys/%{name} \
97ac281a 301 $RPM_BUILD_ROOT{%{_sbindir},%{_sysconfdir}/{conf,modules,vhosts,webapps}.d} \
d323480a 302 $RPM_BUILD_ROOT/etc/{logrotate.d,monit} \
599f35f0 303 $RPM_BUILD_ROOT{%{systemdunitdir},/etc/systemd/system}
f9e65082 304
483adace
ER
305%{__make} install \
306 INSTALLDIRS=vendor \
307 DESTDIR=$RPM_BUILD_ROOT
308
309%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/*.default
310
7f97359c
ER
311cp -p %{_sourcedir}/%{name}.conf $RPM_BUILD_ROOT%{_sysconfdir}
312cp -p %{_sourcedir}/%{name}.service $RPM_BUILD_ROOT%{systemdunitdir}
313cp -p %{_sourcedir}/%{name}.monitrc $RPM_BUILD_ROOT/etc/monit
c63e9e18
ER
314install -p %{SOURCE7} $RPM_BUILD_ROOT/etc/rc.d/init.d/%{name}
315
483adace
ER
316cp -p %{SOURCE3} $RPM_BUILD_ROOT/etc/logrotate.d/%{name}
317cp -p %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/proxy.conf
3c75ce8a 318cp -p %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/mime.types
483adace
ER
319rm -r $RPM_BUILD_ROOT%{_prefix}/html
320cp -p html/index.html $RPM_BUILD_ROOT%{_nginxdir}/html
321cp -p html/50x.html $RPM_BUILD_ROOT%{_nginxdir}/errors
5ca9795d 322cp -p %{SOURCE1} $RPM_BUILD_ROOT%{_nginxdir}/html/favicon.ico
85600569 323
a88a446d
ER
324load_module() {
325 local module=ngx_${1}_module.so conffile=mod_$1.conf
9453c586 326 printf 'load_module "%{_libdir}/%{name}/modules/%s";' "$module" \
97ac281a 327 > $RPM_BUILD_ROOT%{_sysconfdir}/modules.d/$conffile
a88a446d
ER
328}
329
85600569 330%if %{with perl}
483adace
ER
331%{__rm} $RPM_BUILD_ROOT%{perl_archlib}/perllocal.pod
332%{__rm} $RPM_BUILD_ROOT%{perl_vendorarch}/auto/nginx/.packlist
a88a446d
ER
333load_module http_perl
334%endif
335
336%if %{with geoip}
337load_module http_geoip
763de572 338load_module stream_geoip
a88a446d
ER
339%endif
340%if %{with gd}
341load_module http_image_filter
342%endif
343%if %{with xslt}
344load_module http_xslt_filter
345%endif
346%if %{with mail}
347load_module mail
348%endif
349%if %{with stream}
350load_module stream
483adace
ER
351%endif
352
f9e65082
ER
353%clean
354rm -rf $RPM_BUILD_ROOT
355
c63e9e18 356%pre
a37373c3 357%groupadd -r -g 213 %{name}
362f5ab2 358%groupadd -g 51 http
a37373c3 359%useradd -r -u 213 -d /usr/share/empty -s /bin/false -c "Nginx HTTP User" -g %{name} %{name}
362f5ab2 360%addusertogroup %{name} http
f1fc9780 361
c63e9e18 362%post
738166d2 363for a in access.log error.log; do
c63e9e18 364 if [ ! -f /var/log/%{name}/$a ]; then
98376457 365 umask 022
c63e9e18
ER
366 touch /var/log/%{name}/$a
367 chown nginx:nginx /var/log/%{name}/$a
368 chmod 644 /var/log/%{name}/$a
738166d2 369 fi
370done
c63e9e18
ER
371/sbin/chkconfig --add %{name}
372%systemd_post %{name}.service
373%service %{name} force-reload
738166d2 374
c63e9e18 375%preun
7d80c773 376if [ "$1" = "0" ];then
c63e9e18
ER
377 %service %{name} stop
378 /sbin/chkconfig --del %{name}
0663f9da 379fi
c63e9e18 380%systemd_preun %{name}.service
0663f9da 381
c63e9e18 382%postun
f1fc9780 383if [ "$1" = "0" ]; then
7d9b86c7
ER
384 %userremove %{name}
385 %groupremove %{name}
f1fc9780 386fi
d323480a
JK
387%systemd_reload
388
c63e9e18 389%files
f9e65082 390%defattr(644,root,root,755)
6f8318ed 391%doc CHANGES LICENSE README html/index.html conf/nginx.conf
f9e65082 392%doc %lang(ru) CHANGES.ru
28a25161 393%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/logrotate.d/%{name}
7f6266e4
ER
394%attr(754,root,root) /etc/rc.d/init.d/%{name}
395%dir %attr(750,root,nginx) %{_sysconfdir}
943e8c63 396%dir %{_sysconfdir}/conf.d
97ac281a 397%dir %{_sysconfdir}/modules.d
7f6266e4
ER
398%dir %{_sysconfdir}/vhosts.d
399%dir %{_sysconfdir}/webapps.d
f1fc9780 400%attr(640,root,root) %{_sysconfdir}/mime.types
57f21172 401%attr(640,root,root) %{_sysconfdir}/koi-utf
402%attr(640,root,root) %{_sysconfdir}/koi-win
403%attr(640,root,root) %{_sysconfdir}/win-utf
7f6266e4
ER
404%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/nginx.conf
405%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/proxy.conf
406%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/fastcgi_params
407%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/scgi_params
408%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/uwsgi_params
483adace 409%attr(755,root,root) %{_sbindir}/%{name}
278483d6
ER
410%dir %{_libdir}/%{name}
411%dir %{_libdir}/%{name}/modules
c63e9e18 412%{systemdunitdir}/%{name}.service
b0fa7cc6 413
7f6266e4
ER
414%attr(750,nginx,logs) %dir /var/log/archive/%{name}
415%attr(750,nginx,logs) /var/log/%{name}
416%attr(770,root,nginx) /var/cache/%{name}
417
418%dir %{_nginxdir}
419%dir %{_nginxdir}/cgi-bin
420%dir %{_nginxdir}/html
421%dir %{_nginxdir}/errors
422%config(noreplace,missingok) %verify(not md5 mtime size) %{_nginxdir}/html/*
423%config(noreplace,missingok) %verify(not md5 mtime size) %{_nginxdir}/errors/*
424
278483d6
ER
425%if %{with geoip}
426%files mod_http_geoip
85600569 427%defattr(644,root,root,755)
97ac281a 428%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/modules.d/mod_http_geoip.conf
278483d6 429%attr(755,root,root) %{_libdir}/%{name}/modules/ngx_http_geoip_module.so
82f38dc6
ER
430
431%files mod_stream_geoip
432%defattr(644,root,root,755)
97ac281a 433%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/modules.d/mod_stream_geoip.conf
82f38dc6 434%attr(755,root,root) %{_libdir}/%{name}/modules/ngx_stream_geoip_module.so
278483d6
ER
435%endif
436
437%if %{with gd}
438%files mod_http_image_filter
439%defattr(644,root,root,755)
97ac281a 440%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/modules.d/mod_http_image_filter.conf
278483d6 441%attr(755,root,root) %{_libdir}/%{name}/modules/ngx_http_image_filter_module.so
008e09c3 442%endif
85600569 443
85600569 444%if %{with perl}
f5d76ba0 445%files mod_http_perl
85600569 446%defattr(644,root,root,755)
97ac281a 447%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/modules.d/mod_http_perl.conf
008e09c3 448%attr(755,root,root) %{_libdir}/%{name}/modules/ngx_http_perl_module.so
85600569 449%dir %{perl_vendorarch}/auto/%{name}
450%attr(755,root,root) %{perl_vendorarch}/auto/%{name}/%{name}.so
98376457 451%{perl_vendorarch}/%{name}.pm
483adace 452%{_mandir}/man3/nginx.3pm*
483adace 453%endif
dd7459ac 454
278483d6
ER
455%if %{with xslt}
456%files mod_http_xslt_filter
457%defattr(644,root,root,755)
97ac281a 458%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/modules.d/mod_http_xslt_filter.conf
278483d6
ER
459%attr(755,root,root) %{_libdir}/%{name}/modules/ngx_http_xslt_filter_module.so
460%endif
461
462%if %{with mail}
463%files mod_mail
464%defattr(644,root,root,755)
97ac281a 465%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/modules.d/mod_mail.conf
278483d6
ER
466%attr(755,root,root) %{_libdir}/%{name}/modules/ngx_mail_module.so
467%endif
468
469%if %{with stream}
470%files mod_stream
471%defattr(644,root,root,755)
97ac281a 472%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/modules.d/mod_stream.conf
278483d6
ER
473%attr(755,root,root) %{_libdir}/%{name}/modules/ngx_stream_module.so
474%endif
475
dd7459ac 476%files -n monit-rc-nginx
477%defattr(644,root,root,755)
c63e9e18 478%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/monit/%{name}.monitrc
This page took 0.25015 seconds and 4 git commands to generate.