diff --git a/applications/git.c b/applications/git.c new file mode 100644 index 0000000..15d8e13 --- /dev/null +++ b/applications/git.c @@ -0,0 +1,228 @@ +#include +#include +#include +#include + +#define BUILD_DIR ".\\build" +#define GITREV_FILE ".\\build\\gitrev.txt" +#define GITHASH_FILE ".\\build\\githash.txt" +#define GITSTATUS_FILE ".\\build\\gitstatus.txt" +#define REVISION_H_FILE "..\\applications\\revision.h" + +void createBuildDir() +{ + if (!CreateDirectory(BUILD_DIR, NULL)) + { + if (GetLastError() != ERROR_ALREADY_EXISTS) + { + printf("Failed to create build directory.\n"); + exit(EXIT_FAILURE); + } + } +} + +void deleteRevisionH() +{ + if (!DeleteFile(REVISION_H_FILE)) + { + printf("Failed to delete revision.h.\n"); + // exit(EXIT_FAILURE); + } +} + +int find_git_revision_number() +{ + FILE *fp = popen("git rev-list HEAD", "r"); + if (fp == NULL) + { + perror("popen failed"); + return EXIT_FAILURE; + } + int cnt = 0; + char buffer[1024]; + while (fgets(buffer, sizeof(buffer), fp) != NULL) + { + // printf("%s", buffer); + cnt++; + } + + pclose(fp); + return cnt; +} + +int get_latest_version_hash(char *buffer, int len) +{ + FILE *fp = popen("git rev-list HEAD", "r"); + if (fp == NULL) + { + perror("popen failed"); + return EXIT_FAILURE; + } + int cnt = 0; + while (fgets(buffer, len, fp) != NULL) + { + } + + pclose(fp); + return cnt; +} +/** + * + * + * + */ +int get_git_state() +{ + FILE *fp = popen("git status", "r"); + if (fp == NULL) + { + perror("popen failed"); + return EXIT_FAILURE; + } + char buffer[1024]; + while (fgets(buffer, sizeof(buffer), fp) != NULL) + { + + if (strstr(buffer, "modified:") != NULL) + { + return 'M'; + } + if (strstr(buffer, "new file") != NULL) + { + return 'N'; + } + if (strstr(buffer, "deleted:") != NULL) + { + return 'D'; + } + if (strstr(buffer, "renamed:") != NULL) + { + return 'R'; + } + } + + pclose(fp); + return '\0'; +} + +int write_notargeted_file(int version_number, char *version_hash, char sta) +{ + FILE *fp = fopen(REVISION_H_FILE, "w+"); + if (fp == NULL) + { + perror("fopen failed"); + return EXIT_FAILURE; + } + fprintf(fp, "#ifndef REVISION_H_\n"); + fprintf(fp, "#define REVISION_H_\n"); + fprintf(fp, "#define FIRMWARE_VER_REV %d\n", version_number); + fprintf(fp, "#define FIRMWARE_VER_REV_STR \"%d\"\n", version_number); + fprintf(fp, "#define FIRMWARE_VER_HASH_STR "); + fprintf(fp, "\""); + for (int i = 0; i < 8; i++) + { + fprintf(fp, "%c", version_hash[i]); + } + fprintf(fp, "\""); + fprintf(fp, "\n"); + fprintf(fp, "#define FIRMWARE_VER_MULTI \"%c\"\n", sta); + fprintf(fp, "#define FIRMWARE_BUILD_INFO \"r\"FIRMWARE_VER_REV_STR\" built on \"__DATE__\" \"__TIME__\n"); + fprintf(fp, "#endif // REVISION_H_\n"); + fclose(fp); + return 0; +} + +int print_git_submodule_info(FILE *fp_write) +{ + FILE *fp = popen("git submodule status --recursive", "r"); + if (fp == NULL) + { + perror("popen failed"); + return EXIT_FAILURE; + } + char buffer[1024]; + fprintf(fp_write, "\"\\\n"); + while (fgets(buffer, 1024, fp) != NULL) + { + char *pos = buffer; + while (*pos != '\0' && *pos != '\r' && *pos != '\n') + { + fprintf(fp_write, "%c", *pos); + pos++; + } + fprintf(fp_write, " \\r\\n\\\n"); + } + fprintf(fp_write, "\"\n"); + + pclose(fp); +} +int write_targeted_file(int version_number, char *version_hash, char sta) +{ + FILE *fp = fopen(REVISION_H_FILE, "w+"); + if (fp == NULL) + { + perror("fopen failed"); + return EXIT_FAILURE; + } + fprintf(fp, "#ifndef REVISION_H_\n"); + fprintf(fp, "#define REVISION_H_\n"); + fprintf(fp, "#if (defined DEBUG)\n"); + fprintf(fp, "#define FIRMWARE_TARGET_STR \"debug\"\n"); + fprintf(fp, "#elif (defined _DEBUG)\n"); + fprintf(fp, "#define FIRMWARE_TARGET_STR \"debug\"\n"); + fprintf(fp, "#elif (defined __DEBUG)\n"); + fprintf(fp, "#define FIRMWARE_TARGET_STR \"debug\"\n"); + fprintf(fp, "#elif (defined DISTRIBUTION)\n"); + fprintf(fp, "#define FIRMWARE_TARGET_STR \"distribution\"\n"); + fprintf(fp, "#elif (defined _DISTRIBUTION)\n"); + fprintf(fp, "#define FIRMWARE_TARGET_STR \"distribution\"\n"); + fprintf(fp, "#elif (defined __DISTRIBUTION)\n"); + fprintf(fp, "#define FIRMWARE_TARGET_STR \"distribution\"\n"); + fprintf(fp, "#else\n"); + fprintf(fp, "#define FIRMWARE_TARGET_STR \"release\"\n"); + fprintf(fp, "#endif\n"); + fprintf(fp, "#define FIRMWARE_VER_REV %d\n", version_number); + fprintf(fp, "#define FIRMWARE_VER_REV_STR \"%d\"\n", version_number); + fprintf(fp, "#define FIRMWARE_VER_HASH_STR "); + fprintf(fp, "\""); + for (int i = 0; i < 8; i++) + { + fprintf(fp, "%c", version_hash[i]); + } + fprintf(fp, "\""); + fprintf(fp, "\n"); + fprintf(fp, "#define FIRMWARE_VER_MULTI \"%c\"\n", sta); + if (sta == '\0') + { + fprintf(fp, "#define FIRMWARE_BUILD_INFO \"r\"FIRMWARE_VER_REV_STR\"-\"FIRMWARE_VER_HASH_STR\" \"FIRMWARE_TARGET_STR\" \"\" built on \"__DATE__\" \"__TIME__\n"); + } + else + { + fprintf(fp, "#define FIRMWARE_BUILD_INFO \"r\"FIRMWARE_VER_REV_STR\"-\"FIRMWARE_VER_HASH_STR\"-\"FIRMWARE_VER_MULTI\" \"FIRMWARE_TARGET_STR\" \"\" built on \"__DATE__\" \"__TIME__\n"); + } + fprintf(fp, "#define FIRMWARE_SUBMODULE_REV \\\n"); + print_git_submodule_info(fp); + fprintf(fp, "#endif\n"); + return 0; +} +int main(int argc, char **argv) +{ + createBuildDir(); + // deleteRevisionH(); + int version_number = find_git_revision_number(); + char version_hash[256]; + get_latest_version_hash(version_hash, sizeof(version_hash)); + printf("%s\n", version_hash); + char sta = get_git_state(); + printf("git state is : %c\n", sta); + if (argv[2][0] != 's') + { + write_notargeted_file(version_number, version_hash, sta); + } + else + { + write_targeted_file(version_number, version_hash, sta); + } + + return 0; +} \ No newline at end of file