]> git.pld-linux.org Git - packages/eventum.git/blame_incremental - eventum.spec
Up to 3.8.16
[packages/eventum.git] / eventum.spec
... / ...
CommitLineData
1#
2# Conditional build:
3%bcond_with order # with experimental order patch
4
5%define rel 1
6#define subver 37
7#define githash 2276dac77
8%define php_min_version 7.1.3
9Summary: Eventum Issue / Bug tracking system
10Summary(pl.UTF-8): Eventum - system śledzenia spraw/błędów
11Name: eventum
12Version: 3.8.16
13Release: %{?subver:1.%{subver}.%{?githash:g%{githash}.}}%{rel}
14License: GPL v2+
15Group: Applications/WWW
16Source0: https://github.com/eventum/eventum/releases/download/v%{version}/%{name}-%{version}.tar.xz
17# Source0-md5: 0dfb3b0fea62002a04459ff9bb292c29
18#Source0: https://github.com/eventum/eventum/releases/download/snapshot/%{name}-%{version}-%{subver}-g%{githash}.tar.xz
19Source1: %{name}-apache.conf
20Source2: %{name}-mail-queue.cron
21Source3: %{name}-mail-download.cron
22Source4: %{name}-reminder.cron
23Source5: %{name}-monitor.cron
24Source10: sphinx.crontab
25Source13: %{name}-router-postfix.sh
26Source14: %{name}.logrotate
27Source15: %{name}-lighttpd.conf
28Source16: http://www.isocra.com/images/updown2.gif
29# Source16-md5: deb6eeb2552ba757d3a949ed10c4107d
30Source17: %{name}.tmpfiles
31Patch2: %{name}-order.patch
32#Patch3: group-users.patch
33#Patch4: https://github.com/glensc/eventum/compare/cf_escape.patch
34# packaging patches that probably never go upstream
35Patch100: %{name}-paths.patch
36Patch107: %{name}-gettext.patch
37Patch108: autoload.patch
38# some tests
39Patch200: %{name}-fixed-nav.patch
40URL: https://github.com/eventum/eventum
41BuildRequires: gettext-tools
42BuildRequires: rpmbuild(macros) >= 1.654
43BuildRequires: sed >= 4.0
44BuildRequires: tar >= 1:1.22
45BuildRequires: xz
46Requires(post): sudo
47Requires(postun): /usr/sbin/groupdel
48Requires(postun): /usr/sbin/userdel
49Requires(pre): /bin/id
50Requires(pre): /usr/bin/getgid
51Requires(pre): /usr/sbin/groupadd
52Requires(pre): /usr/sbin/useradd
53Requires: fonts-TTF-RedHat-liberation
54Requires: php(core) >= %{php_min_version}
55Requires: php(ds)
56Requires: php(filter)
57Requires: php(iconv)
58Requires: php(imap)
59Requires: php(json)
60Requires: php(mbstring)
61Requires: php(pcre)
62Requires: php(pdo_mysql)
63Requires: php(session)
64Requires: php-Smarty >= 3.1
65Requires: php-Smarty-plugin-gettext
66Requires: php-monolog >= 1.17.2
67Requires: php-psr-Log >= 1.0.0-2
68Requires: phplot >= 5.8.0
69Requires: webapps
70Requires: webserver(access)
71Requires: webserver(alias)
72Requires: webserver(indexfile)
73Requires: webserver(php) >= 4.2.0
74Suggests: localedb
75Suggests: php(mcrypt)
76Suggests: php(openssl)
77Suggests: webserver(setenv)
78Provides: group(eventum)
79Provides: user(eventum)
80Obsoletes: eventum-base < 3.0.3-1.305
81Obsoletes: eventum-route-drafts < 3.0.8-1.1
82Obsoletes: eventum-route-emails < 3.0.8-1.1
83Obsoletes: eventum-route-notes < 3.0.8-1.1
84Conflicts: logrotate < 3.8.0
85BuildArch: noarch
86BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
87
88%define _noautoreq_pear .*
89%define _libdir %{_prefix}/lib/%{name}
90%define _appdir %{_datadir}/%{name}
91%define _smartydir %{php_data_dir}/Smarty
92%define _webapps /etc/webapps
93%define _webapp %{name}
94%define _webappdir %{_webapps}/%{_webapp}
95%define _sysconfdir /etc/%{name}
96
97%description
98Eventum is a user-friendly and flexible issue tracking system that can
99be used by a support department to track incoming technical support
100requests, or by a software development team to quickly organize tasks
101and bugs.
102
103%description -l pl.UTF-8
104Eventum to przyjazny dla użytkownika system śledzenia spraw, który
105może być używany przez dział obsługi do śledzenia przychodzących żądań
106obsługi technicznej albo przez zespół tworzący oprogramowanie do
107szybkiej organizacji zadań i błędów.
108
109%package setup
110Summary: Eventum setup package
111Summary(pl.UTF-8): Pakiet do wstępnej konfiguracji Eventum
112Group: Applications/WWW
113Requires: %{name} = %{version}-%{release}
114
115%description setup
116Install this package to configure initial Eventum installation. You
117should uninstall this package when you're done, as it considered
118insecure to keep the setup files in place.
119
120%description setup -l pl.UTF-8
121Ten pakiet należy zainstalować w celu wstępnej konfiguracji Eventum po
122pierwszej instalacji. Potem należy go odinstalować, jako że
123pozostawienie plików instalacyjnych mogłoby być niebezpieczne.
124
125%package doc
126Summary: Eventum documentation and Wiki
127Group: Documentation
128
129%description doc
130Eventum documentation and Wiki.
131
132%package mail-queue
133Summary: Eventum mail queue process
134Summary(pl.UTF-8): Przetwarzanie kolejki poczty Eventum
135Group: Applications/WWW
136Requires: %{name} = %{version}-%{release}
137Requires: crondaemon
138
139%description mail-queue
140Beginning with the first release of Eventum, emails are not directly
141sent out from the various scripts, but rather added to a mail queue
142table that is processed by a cron job. If an email cannot be sent, it
143will be marked as such in the mail queue log, and the cron job script
144will re-try to send it again the next time it runs.
145
146This package contains the cron job.
147
148%description mail-queue -l pl.UTF-8
149Od pierwszego wydania Eventum poczta nie jest wysyłana bezpośrednio z
150różnych skryptów, lecz dodawana do kolejki przetwarzanej z crona.
151Jeśli poczta nie może być wysłana, będzie odpowiednio oznaczona w logu
152kolejki poczty, a skrypt z crona będzie próbował wysłać ją ponownie
153następnym razem.
154
155Ten pakiet zawiera zadanie dla crona.
156
157%package mail-download
158Summary: Eventum email download
159Summary(pl.UTF-8): Ściąganie poczty Eventum
160Group: Applications/WWW
161Requires: %{name} = %{version}-%{release}
162Requires: crondaemon
163
164%description mail-download
165In order for Eventum's email integration feature to work, you need to
166setup a cron job to run the script every so often.
167
168This package contains the cron job.
169
170%description mail-download -l pl.UTF-8
171Aby integracja poczty elektronicznej w Eventum działała, trzeba
172ustawić zadanie crona, aby uruchamiał odpowiedni skrypt wystarczająco
173często.
174
175Ten pakiet zawiera zadanie dla crona.
176
177%package reminder
178Summary: Eventum Reminder System
179Summary(pl.UTF-8): System przypominania dla Eventum
180Group: Applications/WWW
181Requires: %{name} = %{version}-%{release}
182Requires: crondaemon
183
184%description reminder
185The reminder system was designed with the objective as serving as a
186safe net for issues that need attention. Depending on what
187configuration you create, you may have several reminders (or alerts)
188be sent out whenever an issue needs attention, for whatever parameter
189you may deem necessary.
190
191This package contains the cron job.
192
193%description reminder -l pl.UTF-8
194System przypominania został zaprojektowany tak, aby służył jako
195bezpieczna sieć dla spraw wymagających uwagi. W zależności od
196konfiguracji można ustawić różne przypominajki (lub alarmy) wysyłane
197przy każdej sprawie wymagającej uwagi lub przy parametrze, który można
198uważać za potrzebny.
199
200Ten pakiet zawiera zadanie dla crona.
201
202%package monitor
203Summary: Eventum Heartbeat Monitor
204Summary(pl.UTF-8): Monitor życia dla Eventum
205Group: Applications/WWW
206Requires: %{name} = %{version}-%{release}
207Requires: crondaemon
208Requires: php(posix)
209
210%description monitor
211The heartbeat monitor is a feature designed for the administrator that
212wants to be alerted whenever a common problem in Eventum is detected,
213like the database server not being available anymore, or maybe when
214the recommended permissions for certain configuration files are
215changed.
216
217Please note that before running the heartbeat monitor, you may need to
218customize some of the checks to be appropriate for your own system,
219particularly the permission and file checks on
220Monitor::checkConfiguration().
221
222This package contains the cron job.
223
224%description monitor -l pl.UTF-8
225Monitor życia to funkcjonalność zaprojektowana dla administratora
226chcącego być alarmowanym przy każdym wykryciu popularnego problemu z
227Eventum, jak nie działanie serwera bazy danych albo zmiana uprawnień
228do plików konfiguracyjnych.
229
230Należy zauważyć, że przed uruchomieniem tego monitora może być
231konieczne dostosowanie niektórych testów do systemu, w szczególności
232testów uprawnień i plików w Monitor::checkConfiguration().
233
234Ten pakiet zawiera zadanie dla crona.
235
236%package router-postfix
237Summary: Eventum Mail Routing - Postfix
238Summary(pl.UTF-8): Przekazywanie poczty Eventum - Postfix
239Group: Applications/Mail
240Requires: %{name} = %{version}-%{release}
241Requires: postfix
242Provides: eventum(router)
243Obsoletes: eventum(router)
244
245%description router-postfix
246This package provides way of routing notes and emails back to Eventum
247via Postfix.
248
249The Postfix configuration instructions you can find from
250<https://github.com/eventum/eventum/blob/v%{version}/docs/wiki/System-Admin/Setting-up-email-routing-with-postfix.md>
251
252%description router-postfix -l pl.UTF-8
253Ten pakiet udostępnia metodę przekazywania notatek i listów do Eventum
254przez Postfiksa.
255
256Opis konfiguracji Postfiksa można znaleźć pod adresem
257<https://github.com/eventum/eventum/blob/v%{version}/docs/wiki/System-Admin/Setting-up-email-routing-with-postfix.md>
258
259%package sphinx
260Summary: Eventum Sphinx Search
261Group: Applications/WWW
262Requires: %{name} = %{version}-%{release}
263Requires: crondaemon
264Requires: sphinx
265
266%description sphinx
267Sphinx search integration for Eventum.
268
269This package contains the cron job.
270
271%prep
272%setup -q -n %{name}-%{version}%{?githash:-%{subver}-g%{githash}}
273
274mv docs/examples .
275
276# bug fixes / features
277%{?with_order:%patch2 -p1}
278#%patch3 -p0
279#%patch4 -p1
280%{?with_order:cp -p %{SOURCE16} htdocs/images}
281#%patch200 -p1
282
283# produce default sphinx config
284# must be run before paths.patch
285%if 0
286cat <<'EOF' > config/config.php
287<?php
288define('APP_SQL_DBTYPE', 'mysql');
289define('APP_SQL_DBHOST', 'localhost:/var/lib/mysql/mysql.sock');
290define('APP_SQL_DBPORT', 3306);
291define('APP_SQL_DBNAME', 'eventum');
292define('APP_SQL_DBUSER', 'mysql');
293define('APP_SQL_DBPASS', '');
294define('APP_TABLE_PREFIX', 'eventum_');
295EOF
296php config/sphinx.conf.php > config/sphinx.conf
297rm config/config.php
298%endif
299
300# packaging
301%patch100 -p1
302%patch107 -p1
303%patch108 -p1
304
305rm htdocs/.htaccess.dist
306rm config/config.dist.php
307
308# cleanup libs taken from system, everything else gets bundled
309rm -r vendor/fonts/liberation
310rm -r vendor/monolog/monolog
311rm -r vendor/phplot/phplot
312rm -r vendor/psr/log
313rm -r vendor/smarty-gettext/smarty-gettext
314rm -r vendor/smarty/smarty
315rm -r vendor/sphinx/php-sphinxapi
316
317%{__sed} -i '1s|^#!.*php\b|#!/usr/bin/php|' config/sphinx.conf.php bin/*.php
318
319# remove backups from patching as we use globs to package files to buildroot
320find '(' -name '*~' -o -name '*.orig' ')' | xargs -r rm -v
321
322%build
323%{__make} -C localization
324
325%install
326rm -rf $RPM_BUILD_ROOT
327install -d \
328 $RPM_BUILD_ROOT{%{_webappdir}/{custom_field,templates,workflow},%{_sysconfdir},%{_bindir},%{_sbindir},%{_libdir}} \
329 $RPM_BUILD_ROOT/etc/{rc.d/init.d,cron.d,logrotate.d,sysconfig} \
330 $RPM_BUILD_ROOT/var/{run,lib}/%{name} \
331 $RPM_BUILD_ROOT/var/log/{archive/,}%{name} \
332 $RPM_BUILD_ROOT/var/lib/%{name}/{routed_{emails,drafts,notes},storage} \
333 $RPM_BUILD_ROOT/var/cache/%{name}/doctrine/proxies \
334 $RPM_BUILD_ROOT%{systemdtmpfilesdir}
335
336%{__make} install-eventum install-localization \
337 sysconfdir=%{_webappdir} \
338 localedir=%{_localedir} \
339 DESTDIR=$RPM_BUILD_ROOT
340
341ln -s %{_webappdir} $RPM_BUILD_ROOT%{_appdir}/config
342
343cp -a vendor $RPM_BUILD_ROOT%{_appdir}
344
345# unsupported locale
346%{__rm} -r $RPM_BUILD_ROOT%{_localedir}/ht
347
348install -d $RPM_BUILD_ROOT%{_examplesdir}/%{name}-%{version}
349cp -a examples/* $RPM_BUILD_ROOT%{_examplesdir}/%{name}-%{version}
350
351%{?with_order:cp -a htdocs/ajax $RPM_BUILD_ROOT%{_appdir}/htdocs}
352
353touch $RPM_BUILD_ROOT%{_webappdir}/htpasswd
354cp -p %{SOURCE1} $RPM_BUILD_ROOT%{_webappdir}/apache.conf
355cp -p %{SOURCE1} $RPM_BUILD_ROOT%{_webappdir}/httpd.conf
356cp -p %{SOURCE15} $RPM_BUILD_ROOT%{_webappdir}/lighttpd.conf
357
358install -d $RPM_BUILD_ROOT/etc/sphinx
359#cp -p config/sphinx.conf $RPM_BUILD_ROOT/etc/sphinx/%{name}.conf
360cp -p config/sphinx.conf.php $RPM_BUILD_ROOT%{_webappdir}
361
362cp -p %{SOURCE2} $RPM_BUILD_ROOT/etc/cron.d/%{name}-mail-queue
363cp -p %{SOURCE3} $RPM_BUILD_ROOT/etc/cron.d/%{name}-mail-download
364cp -p %{SOURCE4} $RPM_BUILD_ROOT/etc/cron.d/%{name}-reminder
365cp -p %{SOURCE5} $RPM_BUILD_ROOT/etc/cron.d/%{name}-monitor
366cp -p %{SOURCE10} $RPM_BUILD_ROOT/etc/cron.d/%{name}-sphinx
367
368cp -p %{SOURCE14} $RPM_BUILD_ROOT/etc/logrotate.d/%{name}
369
370# postfix router
371install -p %{SOURCE13} $RPM_BUILD_ROOT%{_libdir}/router-postfix
372
373cp -p %{SOURCE17} $RPM_BUILD_ROOT%{systemdtmpfilesdir}/%{name}.conf
374
375%find_lang %{name}
376
377%clean
378rm -rf $RPM_BUILD_ROOT
379
380%pre
381%groupadd -g 146 %{name}
382%useradd -u 146 -d /var/lib/%{name} -g %{name} -c "Eventum User" %{name}
383%addusertogroup http %{name}
384
385%post
386# create empty ghost files
387# these permissions ensure the logs are write only
388for a in \
389 errors.log login_attempts.log \
390 eventum.log \
391 auth.log cli.log \
392; do
393 test -f /var/log/%{name}/$a && continue
394 install -m 0620 -o root -g http /dev/null /var/log/%{name}/$a
395done
396
397# run database update if configured
398test -s %{_webappdir}/config.php && \
399sudo -H -u http -- %{_appdir}/bin/upgrade.php || :
400
401# nuke Smarty templates cache after upgrade
402rm -f /var/cache/eventum/*.php
403
404# Restart webserver on upgrade to get .mo translations reloaded.
405# actually php engines "php-fcgi" and "php-fpm" needed only, apache is restarted anyway via webapp trigger.
406%php_webserver_restart
407
408%preun
409if [ "$1" = "0" ]; then
410 # nuke cache
411 rm -f /var/cache/eventum/*.php 2>/dev/null || :
412fi
413
414%postun
415if [ "$1" = "0" ]; then
416 %userremove %{name}
417 %groupremove %{name}
418fi
419
420%post setup
421chmod 660 %{_webappdir}/{config,private_key,secret_key}.php
422chown root:http %{_webappdir}/{config,private_key,secret_key}.php
423
424%postun setup
425if [ "$1" = "0" ] && [ -f %{_webappdir}/config.php ]; then
426 chmod 640 %{_webappdir}/{config,private_key,secret_key}.php
427 chown root:http %{_webappdir}/{config,private_key,secret_key}.php
428fi
429
430%triggerin -- apache1 < 1.3.37-3, apache1-base
431%webapp_register apache %{_webapp}
432
433%triggerun -- apache1 < 1.3.37-3, apache1-base
434%webapp_unregister apache %{_webapp}
435
436%triggerin -- apache < 2.2.0, apache-base
437%webapp_register httpd %{_webapp}
438
439%triggerun -- apache < 2.2.0, apache-base
440%webapp_unregister httpd %{_webapp}
441
442%triggerin -- lighttpd
443%webapp_register lighttpd %{_webapp}
444
445%triggerun -- lighttpd
446%webapp_unregister lighttpd %{_webapp}
447
448%files -f %{name}.lang
449%defattr(644,root,root,755)
450%attr(771,root,http) %dir %{_webappdir}
451%attr(751,root,http) %dir %{_webappdir}/crm
452%attr(751,root,http) %dir %{_webappdir}/custom_field
453%attr(751,root,http) %dir %{_webappdir}/partner
454%attr(751,root,http) %dir %{_webappdir}/templates
455%attr(640,root,http) %config(noreplace) %verify(not md5 mtime size) %{_webappdir}/config.php
456%attr(640,root,http) %config(noreplace) %verify(not md5 mtime size) %{_webappdir}/htpasswd
457%attr(640,root,http) %config(noreplace) %verify(not md5 mtime size) %{_webappdir}/private_key.php
458%attr(640,root,http) %config(noreplace) %verify(not md5 mtime size) %{_webappdir}/secret_key.php
459%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_webappdir}/apache.conf
460%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_webappdir}/httpd.conf
461%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_webappdir}/lighttpd.conf
462%attr(660,root,http) %config(noreplace) %verify(not md5 mtime size) %{_webappdir}/setup.php
463
464%dir %attr(731,root,http) /var/log/%{name}
465%attr(620,root,http) %ghost /var/log/%{name}/*
466%dir %attr(750,root,root) /var/log/archive/%{name}
467%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/logrotate.d/%{name}
468
469%dir %{_appdir}
470%{_appdir}/config
471
472%dir %{_appdir}/bin
473%attr(755,root,root) %{_appdir}/bin/console.php
474%attr(755,root,root) %{_appdir}/bin/export-issues.php
475%attr(755,root,root) %{_appdir}/bin/extension.php
476%attr(755,root,root) %{_appdir}/bin/ldapsync.php
477%attr(755,root,root) %{_appdir}/bin/migrate_storage_adapter.php
478%attr(755,root,root) %{_appdir}/bin/process_all_emails.php
479%attr(755,root,root) %{_appdir}/bin/upgrade.php
480
481%{_appdir}/autoload.php
482%{_appdir}/globals.php
483%{_appdir}/init.php
484%{_appdir}/phinx.php
485%dir %{_appdir}/htdocs
486%{_appdir}/htdocs/*.php
487%{_appdir}/htdocs/*.ico
488%{_appdir}/htdocs/mix-manifest.json
489%{_appdir}/htdocs/ajax
490%{_appdir}/htdocs/css
491%{_appdir}/htdocs/customer
492%{_appdir}/htdocs/fonts
493%{_appdir}/htdocs/images
494%{_appdir}/htdocs/js
495%{_appdir}/htdocs/manage
496%{_appdir}/htdocs/reports
497%{_appdir}/htdocs/rpc
498%{_appdir}/templates
499
500%dir %{_appdir}/db
501%dir %{_appdir}/db/migrations
502%{_appdir}/db/migrations/*.php
503%dir %{_appdir}/db/seeds
504%{_appdir}/db/seeds/*.php
505
506%{_appdir}/res
507%{_appdir}/src
508%{_appdir}/vendor
509%dir %{_appdir}/lib
510%{_appdir}/lib/eventum
511%exclude %{_appdir}/src/Console/Command/MailDownloadCommand.php
512%exclude %{_appdir}/src/Console/Command/MailQueueProcessCommand.php
513%exclude %{_appdir}/src/Console/Command/MailQueueTruncateCommand.php
514%exclude %{_appdir}/src/Console/Command/MonitorCommand.php
515%exclude %{_appdir}/src/Console/Command/ReminderCheckCommand.php
516
517%dir %{_libdir}
518
519%{systemdtmpfilesdir}/%{name}.conf
520
521%dir /var/lib/%{name}
522%dir %attr(730,root,http) /var/run/%{name}
523%dir %attr(730,root,http) /var/cache/%{name}
524%dir %attr(730,root,http) /var/cache/%{name}/doctrine
525%dir %attr(730,root,http) /var/cache/%{name}/doctrine/proxies
526
527# saved mail copies
528%attr(770,root,http) %dir /var/lib/%{name}/routed_emails
529%attr(770,root,http) %dir /var/lib/%{name}/routed_drafts
530%attr(770,root,http) %dir /var/lib/%{name}/routed_notes
531# attachment storage
532%attr(770,root,http) %dir /var/lib/%{name}/storage
533
534%files setup
535%defattr(644,root,root,755)
536%{_appdir}/htdocs/setup
537
538%files doc
539%defattr(644,root,root,755)
540%doc docs/*
541%{_examplesdir}/%{name}-%{version}
542
543%files mail-queue
544%defattr(644,root,root,755)
545%{_appdir}/src/Console/Command/MailQueueProcessCommand.php
546%{_appdir}/src/Console/Command/MailQueueTruncateCommand.php
547%attr(755,root,root) %{_appdir}/bin/process_mail_queue.php
548%attr(755,root,root) %{_appdir}/bin/truncate_mail_queue.php
549%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/cron.d/%{name}-mail-queue
550
551%files mail-download
552%defattr(644,root,root,755)
553%{_appdir}/src/Console/Command/MailDownloadCommand.php
554%attr(755,root,root) %{_appdir}/bin/download_emails.php
555%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/cron.d/%{name}-mail-download
556
557%files reminder
558%defattr(644,root,root,755)
559%{_appdir}/src/Console/Command/ReminderCheckCommand.php
560%attr(755,root,root) %{_appdir}/bin/check_reminders.php
561%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/cron.d/%{name}-reminder
562
563%files monitor
564%defattr(644,root,root,755)
565%{_appdir}/src/Console/Command/MonitorCommand.php
566%attr(755,root,root) %{_appdir}/bin/monitor.php
567%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/cron.d/%{name}-monitor
568
569%files router-postfix
570%defattr(644,root,root,755)
571%attr(755,root,root) %{_libdir}/router-postfix
572
573%files sphinx
574%defattr(644,root,root,755)
575%{_webappdir}/sphinx.conf.php
576#%attr(750,root,http) %config(noreplace) %verify(not md5 mtime size) /etc/sphinx/%{name}.conf
577%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/cron.d/%{name}-sphinx
This page took 0.037208 seconds and 4 git commands to generate.