]> sourceware.org Git - newlib-cygwin.git/blob - winsup/cygwin/include/cygwin/version.h
* cygwin.din: Export new complex math functions from newlib.
[newlib-cygwin.git] / winsup / cygwin / include / cygwin / version.h
1 /* version.h -- Cygwin version numbers and accompanying documentation.
2
3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008, 2009, 2010 Red Hat, Inc.
5
6 This file is part of Cygwin.
7
8 This software is a copyrighted work licensed under the terms of the
9 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
10 details. */
11
12 /* Cygwin versioning is relatively complicated because of its status
13 as a shared library. Let's start with how versioning used to be done.
14
15 Historical versioning in Cygwin 16.0 to 19.5:
16
17 In the olden days of Cygwin, we had a dll major and minor version
18 and a registry version. The major number started at 16 because the
19 "b15" GNU-Win32 release of the compiler tools was out when this
20 scheme was started. We incremented the DLL name frequently (for
21 every official release) and towards the end of this period every
22 release used a different shared memory area to prevent DLLs from
23 interfering with each other (embedding a build timestamp into the
24 name of the shared memory area). This turned out to be a Bad Idea
25 (tm) because people needed to mingle separate releases and have
26 them work together more than we thought they would. This was
27 especially problematic when tty info needed to be retained when an
28 old Cygwin executable executed a newer one.
29
30 In the old scheme, we incremented the major number whenever a
31 change to the dll invalidated existing executables. This can
32 happen for a number of reasons, including when functions are
33 removed from the export list of the dll. The minor number was
34 incremented when a change was made that we wanted to record, but
35 that didn't invalidate existing executables. Both numbers were
36 recorded in the executable and in the dll.
37
38 In October 1998 (starting with Cygwin 19.6), we started a new method
39 of Cygwin versioning: */
40
41 /* The DLL major and minor numbers correspond to the "version of
42 the Cygwin shared library". This version is used to track important
43 changes to the DLL and is mainly informative in nature. */
44
45 #define CYGWIN_VERSION_DLL_MAJOR 1007
46 #define CYGWIN_VERSION_DLL_MINOR 8
47
48 /* Major numbers before CYGWIN_VERSION_DLL_EPOCH are
49 incompatible. */
50
51 #define CYGWIN_VERSION_DLL_EPOCH 19
52
53 /* CYGWIN_VERSION_DLL_COMBINED gives us a single number
54 representing the combined DLL major and minor numbers. */
55
56 /* WATCH OUT FOR OCTAL! Don't use, say, "00020" for 0.20 */
57
58 #define CYGWIN_VERSION_DLL_MAKE_COMBINED(maj, min) (((maj) * 1000) + min)
59 #define CYGWIN_VERSION_DLL_COMBINED \
60 CYGWIN_VERSION_DLL_MAKE_COMBINED (CYGWIN_VERSION_DLL_MAJOR, CYGWIN_VERSION_DLL_MINOR)
61
62 /* Every version of cygwin <= this uses an old, incorrect method
63 to determine signal masks. */
64
65 #define CYGWIN_VERSION_PER_PROCESS_API_VERSION_COMBINED(u) \
66 CYGWIN_VERSION_DLL_MAKE_COMBINED ((u)->api_major, (u)->api_minor)
67
68 #define CYGWIN_VERSION_USER_API_VERSION_COMBINED \
69 CYGWIN_VERSION_PER_PROCESS_API_VERSION_COMBINED (user_data)
70
71 /* API versions <= this had a termios structure whose members were
72 too small to accomodate modern settings. */
73 #define CYGWIN_VERSION_DLL_OLD_TERMIOS 5
74 #define CYGWIN_VERSION_DLL_IS_OLD_TERMIOS \
75 (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= CYGWIN_VERSION_DLL_OLD_TERMIOS)
76
77 #define CYGWIN_VERSION_DLL_MALLOC_ENV 28
78 /* Old APIs had getc/putc macros that conflict with new CR/LF
79 handling in the stdio buffers */
80 #define CYGWIN_VERSION_OLD_STDIO_CRLF_HANDLING \
81 (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 20)
82
83 #define CYGWIN_VERSION_CHECK_FOR_S_IEXEC \
84 (CYGWIN_VERSION_USER_API_VERSION_COMBINED >= 36)
85
86 #define CYGWIN_VERSION_CHECK_FOR_OLD_O_NONBLOCK \
87 (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 28)
88
89 #define CYGWIN_VERSION_CHECK_FOR_USING_BIG_TYPES \
90 (CYGWIN_VERSION_USER_API_VERSION_COMBINED >= 79)
91
92 #define CYGWIN_VERSION_CHECK_FOR_USING_ANCIENT_MSGHDR \
93 (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 138)
94
95 #define CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES \
96 (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 138)
97
98 #define CYGWIN_VERSION_CHECK_FOR_OLD_IFREQ \
99 (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 161)
100
101 #define CYGWIN_VERSION_CHECK_FOR_OLD_CTYPE \
102 (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 209)
103
104 #define CYGWIN_VERSION_USE_PSEUDO_RELOC_IN_DLL(u) \
105 (CYGWIN_VERSION_PER_PROCESS_API_VERSION_COMBINED (u) >= 227)
106
107 #define CYGWIN_VERSION_CYGWIN_CONV 181
108
109 /* API_MAJOR 0.0: Initial version. API_MINOR changes:
110 1: Export cygwin32_ calls as cygwin_ as well.
111 2: Export j1, jn, y1, yn.
112 3: Export dll_noncygwin_dllcrt0.
113 4: New socket ioctls, revamped ifconf support.
114 5: Thread support/exports.
115 6: Change in termios handling.
116 7: Export scandir and alphasort.
117 8: Export _ctype_, _sys_errlist, _sys_nerr.
118 9: Mount-related changes, new cygwin_umount export.
119 Raw device support (tape, floppies).
120 10: Fast math routine support added.
121 11: Export seekdir, telldir.
122 12: Export pthread_join, pthread_detach.
123 13: Export math funcs gamma and friends, also _j0, _j1, etc.
124 14: Export snprintf and vnsprintf.
125 15: Export glob
126 16: Export cygwin_stackdump
127 17: Export fast math stuff
128 18: Stop exporting _strace_wm
129 19: Export fchown, lchown, lacl
130 20: regsub, inet_network
131 21: incompatible change to stdio cr/lf and buffering
132 22: Export cygwin_logon_user, cygwin_set_impersonation_token.
133 geteuid, getegid return effective uid/gid.
134 getuid, getgid return real uid/gid.
135 seteuid, setegid set only effective uid/gid.
136 setuid, setgid set effective and real uid/gid.
137 23: Export new dll_crt0 interface and cygwin_user_data for use
138 with crt0 startup code.
139 24: Export poll and _poll.
140 25: Export getmode and _getmode.
141 26: CW_GET_CYGDRIVE_PREFIXES addition to external.cc
142 27: CW_GETPINFO_FULL addition to external.cc
143 28: Accidentally bumped by cgf
144 29: Export hstrerror
145 30: CW_GET_CYGDRIVE_INFO addition to external.cc
146 31: Export inet_aton
147 32: Export getrlimit/setrlimit
148 33: Export setlogmask
149 34: Separated out mount table
150 35: Export drand48, erand48, jrand48, lcong48, lrand48,
151 mrand48, nrand48, seed48, and srand48.
152 36: Added _cygwin_S_IEXEC, et al
153 37: [f]pathconv support _PC_POSIX_PERMISSIONS and _PC_POSIX_SECURITY
154 38: vscanf, vscanf_r, and random pthread functions
155 39: asctime_r, ctime_r, gmtime_r, localtime_r
156 40: fchdir
157 41: __signgam
158 42: sys_errlist, sys_nerr
159 43: sigsetjmp, siglongjmp fixed
160 44: Export dirfd
161 45: perprocess change, gamma_r, gammaf_r, lgamma_r, lgammaf_r
162 46: Remove cygwin_getshared
163 47: Report EOTWarningZoneSize in struct mtget.
164 48: Export "posix" regex functions
165 49: Export setutent, endutent, utmpname, getutent, getutid, getutline.
166 50: Export fnmatch.
167 51: Export recvmsg, sendmsg.
168 52: Export strptime
169 53: Export strlcat, strlcpy.
170 54: Export __fpclassifyd, __fpclassifyf, __signbitd, __signbitf.
171 55: Export fcloseall, fcloseall_r.
172 56: Make ntsec on by default.
173 57: Export setgroups.
174 58: Export memalign, valloc, malloc_trim, malloc_usable_size, mallopt,
175 malloc_stats
176 59: getsid
177 60: MSG_NOSIGNAL
178 61: Export getc_unlocked, getchar_unlocked, putc_unlocked,
179 putchar_unlocked
180 62: Erroneously bumped
181 63: Export pututline
182 64: Export fseeko, ftello
183 65: Export siginterrupt
184 66: Export nl_langinfo
185 67: Export pthread_getsequence_np
186 68: Export netdb stuff
187 69: Export strtof
188 70: Export asprintf, _asprintf_r, vasprintf, _vasprintf_r
189 71: Export strerror_r
190 72: Export nanosleep
191 73: Export setreuid32, setreuid, setregid32, setregid
192 74: Export _strtold a64l hcreate hcreate_r hdestroy hdestroy_r hsearch
193 hsearch_r isblank iswalnum iswalpha iswblank iswcntrl iswctype
194 iswdigit iswgraph iswlower iswprint iswpunct iswspace iswupper
195 iswxdigit l64a mbrlen mbrtowc mbsinit mbsrtowcs mempcpy
196 on_exit setbuffer setlinebuf strndup strnlen tdelete tdestroy
197 tfind towctrans towlower towupper tsearch twalk wcrtomb wcscat
198 wcschr wcscpy wcscspn wcslcat wcslcpy wcsncat wcsncmp wcsncpy
199 wcspbrk wcsrchr wcsrtombs wcsspn wcsstr wctob wctob wctrans
200 wctype wmemchr wmemcmp wmemcpy wmemmove wmemset
201 75: Export exp2 exp2f fdim fdimf fma fmaf fmax fmaxf fmin fminf lrint
202 lrintf lround lroundf nearbyint nearbyintf remquo remquof
203 round roundf scalbln scalblnf sincos sincosf tgamma tgammaf
204 truncf
205 76: mallinfo
206 77: thread-safe exit/at_exit
207 78: Use stat and fstat rather than _stat, and _fstat.
208 Export btowc and trunc.
209 79: Export acl32 aclcheck32 aclfrommode32 aclfrompbits32 aclfromtext32
210 aclsort32 acltomode32 acltopbits32 acltotext32 facl32
211 fgetpos64 fopen64 freopen64 fseeko64 fsetpos64 ftello64
212 _open64 _lseek64 _fstat64 _stat64 mknod32
213 80: Export pthread_rwlock stuff
214 81: CW_CHECK_NTSEC addition to external.cc
215 82: Export wcscoll wcswidth wcwidth
216 83: Export gethostid
217 84: Pty open allocates invisible console. 64 bit interface
218 85: Export new 32/64 functions from API 0.79 only with leading
219 underscore. No problems with backward compatibility since no
220 official release has been made so far. This change removes
221 exported symbols like fopen64, which might confuse configure.
222 86: Export ftok
223 87: Export vsyslog
224 88: Export _getreent
225 89: Export __mempcpy
226 90: Export _fopen64
227 91: Export argz_add argz_add_sep argz_append argz_count argz_create
228 argz_create_sep argz_delete argz_extract argz_insert
229 argz_next argz_replace argz_stringify envz_add envz_entry
230 envz_get envz_merge envz_remove envz_strip
231 92: Export getusershell, setusershell, endusershell
232 93: Export daemon, forkpty, openpty, iruserok, ruserok, login_tty,
233 openpty, forkpty, revoke, logwtmp, updwtmp
234 94: Export getopt, getopt_long, optarg, opterr, optind, optopt,
235 optreset, __check_rhosts_file, __rcmd_errstr.
236 95: Export shmat, shmctl, shmdt, shmget.
237 96: CW_GET_ERRNO_FROM_WINERROR addition to external.cc
238 97: Export sem_open, sem_close, sem_timedwait, sem_getvalue.
239 98: Export _tmpfile64.
240 99: CW_GET_POSIX_SECURITY_ATTRIBUTE addition to external.cc.
241 100: CW_GET_SHMLBA addition to external.cc.
242 101: Export err, errx, verr, verrx, warn, warnx, vwarn, vwarnx.
243 102: CW_GET_UID_FROM_SID and CW_GET_GID_FROM_SID addition to external.cc.
244 103: Export getprogname, setprogname.
245 104: Export msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop.
246 105: Export sigwait.
247 106: Export flock.
248 107: Export fcntl64.
249 108: Remove unused (hopefully) reent_data export.
250 109: Oh well. Someone uses reent_data.
251 110: Export clock_gettime, sigwaitinfo, timer_create, timer_delete,
252 timer_settime
253 111: Export sigqueue, sighold.
254 112: Redefine some mtget fields.
255 113: Again redefine some mtget fields. Use mt_fileno and mt_blkno as
256 on Linux.
257 114: Export rand_r, ttyname_r.
258 115: Export flockfile, ftrylockfile, funlockfile, getgrgid_r, getgrnam_r,
259 getlogin_r.
260 116: Export atoll.
261 117: Export utmpx functions, Return utmp * from pututent.
262 118: Export getpriority, setpriority.
263 119: Export fdatasync.
264 120: Export basename, dirname.
265 122: Export statvfs, fstatvfs.
266 123: Export utmpxname.
267 124: Add MAP_AUTOGROW flag to mmap.
268 125: LD_PRELOAD/CW_HOOK available.
269 126: Export lsearch, lfind, timer_gettime.
270 127: Export sigrelese.
271 128: Export pselect.
272 129: Export mkdtemp.
273 130: Export strtoimax, strtoumax, llabs, imaxabs, lldiv, imaxdiv.
274 131: Export inet_ntop, inet_pton.
275 132: Add GLOB_LIMIT flag to glob.
276 133: Export __getline, __getdelim.
277 134: Export getline, getdelim.
278 135: Export pread, pwrite
279 136: Add TIOCMBIS/TIOCMBIC ioctl codes.
280 137: fts_children, fts_close, fts_get_clientptr, fts_get_stream,
281 fts_open, fts_read, fts_set, fts_set_clientptr, ftw, nftw.
282 138: Export readdir_r.
283 139: Start using POSIX definition of struct msghdr and WinSock2
284 IPPROTO_IP values.
285 140: Export mlock, munlock.
286 141: Export futimes, lutimes.
287 142: Export memmem
288 143: Export clock_getres, clock_setres
289 144: Export timelocal, timegm.
290 145: Add MAP_NORESERVE flag to mmap.
291 146: Change SI_USER definition. FIXME: Need to develop compatibility
292 macro for this?
293 147: Eliminate problematic d_ino from dirent structure. unsetenv now
294 returns int, as per linux.
295 148: Add open(2) flags O_SYNC, O_RSYNC, O_DSYNC and O_DIRECT.
296 149: Add open(2) flag O_NOFOLLOW.
297 150: Export getsubopt.
298 151: Export __opendir_with_d_ino
299 152: Revert to having d_ino in dirent unconditionally.
300 153: Export updwtmpx, Implement CW_SETUP_WINENV.
301 154: Export sigset, sigignore.
302 155: Export __isinff, __isinfd, __isnanf, __isnand.
303 156: Export __srbuf_r, __swget_r.
304 157: Export gai_strerror, getaddrinfo, getnameinfo, freeaddrinfo,
305 in6addr_any, in6addr_loopback.
306 158: Export bindresvport, bindresvport_sa, iruserok_sa, rcmd_af,
307 rresvport_af.
308 159: Export posix_openpt.
309 160: Export posix_fadvise, posix_fallocate.
310 161: Export resolver functions.
311 162: New struct ifreq. Export if_nametoindex, if_indextoname,
312 if_nameindex, if_freenameindex.
313 163: Export posix_madvise, posix_memalign.
314 164: Export shm_open, shm_unlink.
315 165: Export mq_close, mq_getattr, mq_notify, mq_open, mq_receive,
316 mq_send, mq_setattr, mq_timedreceive, mq_timedsend, mq_unlink.
317 166: Export sem_unlink.
318 167: Add st_birthtim to struct stat.
319 168: Export asnprintf, dprintf, _Exit, vasnprintf, vdprintf.
320 169: Export confstr.
321 170: Export insque, remque.
322 171: Export exp10, exp10f, pow10, pow10f, strcasestr, funopen,
323 fopencookie.
324 172: Export getifaddrs, freeifaddrs.
325 173: Export __assert_func.
326 174: Export stpcpy, stpncpy.
327 175: Export fdopendir.
328 176: Export wcstol, wcstoll, wcstoul, wcstoull, wcsxfrm.
329 177: Export sys_sigabbrev
330 178: Export wcpcpy, wcpncpy.
331 179: Export _f_llrint, _f_llrintf, _f_llrintl, _f_lrint, _f_lrintf,
332 _f_lrintl, _f_rint, _f_rintf, _f_rintl, llrint, llrintf, llrintl,
333 rintl, lrintl, and redirect exports of lrint, lrintf, rint, rintf.
334 180: Export getxattr, lgetxattr, fgetxattr, listxattr, llistxattr,
335 flistxattr, setxattr, lsetxattr, fsetxattr, removexattr,
336 lremovexattr, fremovexattr.
337 181: Export cygwin_conv_path, cygwin_create_path, cygwin_conv_path_list.
338 182: Export lockf.
339 FIXME: Removed 12 year old and entirely wrong wprintf function at
340 this point. We need a working implementation soon.
341 183: Export open_memstream, fmemopen.
342 184: Export openat, faccessat, fchmodat, fchownat, fstatat, futimesat,
343 linkat, mkdirat, mkfifoat, mknodat, readlinkat, renameat, symlinkat,
344 unlinkat.
345 185: Export futimens, utimensat.
346 186: Remove ancient V8 regexp functions. Also eliminate old crt0 interface
347 which provided its own user_data structure.
348 187: Export cfmakeraw.
349 188: Export CW_SET_PRIV_KEY.
350 189: Implement dirent.d_type.
351 190: Export fgetwc, fgetws, fputwc, fputws, fwide, getwc, getwchar,
352 putwc, putwchar, ungetwc.
353 191: Export glob_pattern_p
354 192: CW_SETERRNO added
355 193: Export wcstok.
356 194: fcntl.h flags O_DIRECTORY, O_EXEC and O_SEARCH added.
357 195: Export wcstod, wcstof.
358 196: Export wcsnlen.
359 197: Export wcstoimax, wcstoumax.
360 198: Export reallocf.
361 199: Export open_wmemstream.
362 200: Export mbsnrtowcs, wcsnrtombs.
363 201: Export wprintf, fwprintf, swprintf, vwprintf, vfwprintf, vswprintf.
364 202: Export gethostbyname2.
365 203: Export wcsftime.
366 204: recv/send flag MSG_DONTWAIT added.
367 205: Export wscanf, fwscanf, swscanf, vwscanf, vfwscanf, vswscanf.
368 206: Export wcscasecmp, wcsncasecmp.
369 207: Export wcsdup.
370 208: Export log2, log2f.
371 209: Export wordexp, wordfree.
372 210: New ctype layout using variable ctype pointer. Export __ctype_ptr__.
373 211: Export fpurge, mkstemps.
374 212: Add and export libstdc++ malloc wrappers.
375 213: Export canonicalize_file_name, eaccess, euidaccess.
376 214: Export execvpe, fexecve.
377 215: CW_EXIT_PROCESS added.
378 216: CW_SET_EXTERNAL_TOKEN added.
379 217: CW_GET_INSTKEY added.
380 218: Export get_nprocs, get_nprocs_conf, get_phys_pages, get_avphys_pages.
381 219: Export dup3, pipe2, O_CLOEXEC, F_DUPFD_CLOEXEC.
382 220: Export accept4, SOCK_CLOEXEC, SOCK_NONBLOCK.
383 221: Export strfmon.
384 222: CW_INT_SETLOCALE added.
385 223: SIGPWR added.
386 224: Export xdr* functions.
387 225: Export __xdr* functions.
388 226: Export __locale_mb_cur_max.
389 227: Add pseudo_reloc_start, pseudo_reloc_end, image_base to per_process.
390 228: CW_STRERROR added.
391 229: Add mkostemp, mkostemps.
392 230: Add CLOCK_MONOTONIC.
393 231: Add fenv.h functions.
394 232: Export cacos, cacosf, cacosh, cacoshf, carg, cargf, casin, casinf,
395 casinh, casinhf, catan, catanf, catanh, catanhf, ccos, ccosf, ccosh,
396 ccoshf, cexp, cexpf, cimag, cimagf, clog, clogf, conj, conjf, cpow,
397 cpowf, cproj, cprojf, creal, crealf, csin, csinf, csinh, csinhf,
398 csqrt, csqrtf, ctan, ctanf, ctanh, ctanhf.
399 */
400
401 /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
402
403 #define CYGWIN_VERSION_API_MAJOR 0
404 #define CYGWIN_VERSION_API_MINOR 232
405
406 /* There is also a compatibity version number associated with the
407 shared memory regions. It is incremented when incompatible
408 changes are made to the shared memory region *or* to any named
409 shared mutexes, semaphores, etc. The arbitrary starting
410 version was 0 (cygwin release 98r2).
411 Bump to 4 since this hasn't been rigorously updated in a
412 while. */
413
414 #define CYGWIN_VERSION_SHARED_DATA 5
415
416 /* An identifier used in the names used to create shared objects.
417 The full names include the CYGWIN_VERSION_SHARED_DATA version
418 as well as this identifier. */
419
420 #define CYGWIN_VERSION_DLL_IDENTIFIER "cygwin1"
421
422 /* The Cygwin mount table interface in the Win32 registry also
423 has a version number associated with it in case that is
424 changed in a non-backwards compatible fashion. Increment this
425 version number whenever incompatible changes in mount table
426 registry usage are made.
427
428 1: Original number version.
429 2: New mount registry layout, system-wide mount accessibility.
430 3: The mount table is not in the registry anymore, but in /etc/fstab.
431 */
432
433 #define CYGWIN_VERSION_MOUNT_REGISTRY 3
434
435 /* Identifiers used in the Win32 registry. */
436
437 #define CYGWIN_INFO_CYGWIN_REGISTRY_NAME "Cygwin"
438 #define CYGWIN_INFO_PROGRAM_OPTIONS_NAME "Program Options"
439 #define CYGWIN_INFO_INSTALLATIONS_NAME "Installations"
440
441 /* The default cygdrive prefix. */
442
443 #define CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX "/cygdrive"
444
445 /* In addition to the above version number strings, the build
446 process adds some strings that may be useful in
447 debugging/identifying a particular Cygwin DLL:
448
449 The mkvers.sh script at the top level produces a .cc file
450 which initializes a cygwin_version structure based on the
451 above version information and creates a string table for
452 grepping via "fgrep '%%%' cygwinwhatever.dll" if you are
453 using GNU grep. Otherwise you may want to do a
454 "strings cygwinwhatever.dll | fgrep '%%%'" instead.
455
456 This will produce output such as:
457
458 %%% Cygwin dll_identifier: cygwin
459 %%% Cygwin api_major: 0
460 %%% Cygwin api_minor: 0
461 %%% Cygwin dll_major: 19
462 %%% Cygwin dll_minor: 6
463 %%% Cygwin shared_data: 1
464 %%% Cygwin registry: b15
465 %%% Cygwin build date: Wed Oct 14 16:26:51 EDT 1998
466 %%% Cygwin shared id: cygwinS1
467
468 This information can also be obtained through a call to
469 cygwin_internal (CW_GETVERSIONINFO).
470 */
471
472 #define CYGWIN_VERSION_MAGIC(a, b) ((unsigned) ((((unsigned short) a) << 16) | (unsigned short) b))
473 #define CYGWIN_VERSION_MAGIC_VERSION(a) ((unsigned) ((unsigned)a & 0xffff))
This page took 0.057141 seconds and 5 git commands to generate.