2 * |
2 * |
3 * Public domain. This program uses git commands command to get |
3 * Public domain. This program uses git commands command to get |
4 * various bits of repository status for a particular directory |
4 * various bits of repository status for a particular directory |
5 * and writes it into a header file so that it can be used for a |
5 * and writes it into a header file so that it can be used for a |
6 * project's versioning. |
6 * project's versioning. |
|
7 * |
|
8 * 2014-03-30: [crimsondusk] added GIT_BRANCH, doubled buffer sizes |
7 */ |
9 */ |
8 |
10 |
9 #define _CRT_SECURE_NO_DEPRECATE |
11 #define _CRT_SECURE_NO_DEPRECATE |
10 |
12 |
11 #include <stdio.h> |
13 #include <stdio.h> |
32 } |
34 } |
33 } |
35 } |
34 |
36 |
35 int main(int argc, char **argv) |
37 int main(int argc, char **argv) |
36 { |
38 { |
37 char vertag[64], lastlog[64], lasthash[64], *hash = NULL; |
39 char vertag[128], lastlog[128], lasthash[128], branch[128], *hash = NULL; |
38 FILE *stream = NULL; |
40 FILE *stream = NULL; |
39 int gotrev = 0, needupdate = 1; |
41 int gotrev = 0, needupdate = 1; |
40 |
42 |
41 vertag[0] = '\0'; |
43 vertag[0] = '\0'; |
42 lastlog[0] = '\0'; |
44 lastlog[0] = '\0'; |
|
45 branch[0] = '\0'; |
43 |
46 |
44 if (argc != 2) |
47 if (argc != 2) |
45 { |
48 { |
46 fprintf(stderr, "Usage: %s <path to gitinfo.h>\n", argv[0]); |
49 fprintf(stderr, "Usage: %s <path to gitinfo.h>\n", argv[0]); |
47 return 1; |
50 return 1; |
49 |
52 |
50 // Use git describe --tags to get a version string. If we are sitting directly |
53 // Use git describe --tags to get a version string. If we are sitting directly |
51 // on a tag, it returns that tag. Otherwise it returns <most recent tag>-<number of |
54 // on a tag, it returns that tag. Otherwise it returns <most recent tag>-<number of |
52 // commits since the tag>-<short hash>. |
55 // commits since the tag>-<short hash>. |
53 // Use git log to get the time of the latest commit in ISO 8601 format and its full hash. |
56 // Use git log to get the time of the latest commit in ISO 8601 format and its full hash. |
54 stream = popen("git describe --tags && git log -1 --format=%ai*%H", "r"); |
57 // [crimsondusk] Use git rev-parse --abbrev-ref HEAD to get the branch. |
|
58 stream = popen("git describe --tags && git log -1 --format=%ai*%H && git rev-parse --abbrev-ref HEAD", "r"); |
55 |
59 |
56 if (NULL != stream) |
60 if (NULL != stream) |
57 { |
61 { |
58 if (fgets(vertag, sizeof vertag, stream) == vertag && |
62 if (fgets(vertag, sizeof vertag, stream) == vertag && |
59 fgets(lastlog, sizeof lastlog, stream) == lastlog) |
63 fgets(lastlog, sizeof lastlog, stream) == lastlog && |
|
64 fgets(branch, sizeof branch, stream) == branch) |
60 { |
65 { |
61 stripnl(vertag); |
66 stripnl(vertag); |
62 stripnl(lastlog); |
67 stripnl(lastlog); |
|
68 stripnl(branch); |
63 gotrev = 1; |
69 gotrev = 1; |
64 } |
70 } |
65 |
71 |
66 pclose(stream); |
72 pclose(stream); |
67 } |
73 } |
120 "// This file was automatically generated by the\n" |
127 "// This file was automatically generated by the\n" |
121 "// updaterevision tool. Do not edit by hand.\n" |
128 "// updaterevision tool. Do not edit by hand.\n" |
122 "\n" |
129 "\n" |
123 "#define GIT_DESCRIPTION \"%s\"\n" |
130 "#define GIT_DESCRIPTION \"%s\"\n" |
124 "#define GIT_HASH \"%s\"\n" |
131 "#define GIT_HASH \"%s\"\n" |
125 "#define GIT_TIME \"%s\"\n", |
132 "#define GIT_TIME \"%s\"\n" |
126 hash, vertag, hash, lastlog); |
133 "#define GIT_BRANCH \"%s\"\n", |
|
134 hash, vertag, hash, lastlog, branch); |
127 fclose(stream); |
135 fclose(stream); |
128 fprintf(stderr, "%s updated to commit %s.\n", argv[1], vertag); |
136 fprintf(stderr, "%s updated to commit %s.\n", argv[1], vertag); |
129 } |
137 } |
130 else |
138 else |
131 { |
139 { |