| #define USE_THE_REPOSITORY_VARIABLE |
| |
| #include "git-compat-util.h" |
| #include "version.h" |
| #include "strbuf.h" |
| #include "gettext.h" |
| |
| #ifndef GIT_VERSION_H |
| # include "version-def.h" |
| #else |
| # include GIT_VERSION_H |
| #endif |
| |
| const char git_version_string[] = GIT_VERSION; |
| const char git_built_from_commit_string[] = GIT_BUILT_FROM_COMMIT; |
| |
| /* |
| * Trim and replace each character with ascii code below 32 or above |
| * 127 (included) using a dot '.' character. |
| */ |
| static void redact_non_printables(struct strbuf *buf) |
| { |
| strbuf_trim(buf); |
| for (size_t i = 0; i < buf->len; i++) { |
| if (!isprint(buf->buf[i]) || buf->buf[i] == ' ') |
| buf->buf[i] = '.'; |
| } |
| } |
| |
| const char *git_user_agent(void) |
| { |
| static const char *agent = NULL; |
| |
| if (!agent) { |
| agent = getenv("GIT_USER_AGENT"); |
| if (!agent) |
| agent = GIT_USER_AGENT; |
| } |
| |
| return agent; |
| } |
| |
| /* |
| Retrieve, sanitize and cache operating system info for subsequent |
| calls. Return a pointer to the sanitized operating system info |
| string. |
| */ |
| static const char *os_info(void) |
| { |
| static const char *os = NULL; |
| |
| if (!os) { |
| struct strbuf buf = STRBUF_INIT; |
| |
| get_uname_info(&buf, 0); |
| /* Sanitize the os information immediately */ |
| redact_non_printables(&buf); |
| os = strbuf_detach(&buf, NULL); |
| } |
| |
| return os; |
| } |
| |
| const char *git_user_agent_sanitized(void) |
| { |
| static const char *agent = NULL; |
| |
| if (!agent) { |
| struct strbuf buf = STRBUF_INIT; |
| |
| strbuf_addstr(&buf, git_user_agent()); |
| |
| if (!getenv("GIT_USER_AGENT")) { |
| strbuf_addch(&buf, '-'); |
| strbuf_addstr(&buf, os_info()); |
| } |
| redact_non_printables(&buf); |
| agent = strbuf_detach(&buf, NULL); |
| } |
| |
| return agent; |
| } |
| |
| int get_uname_info(struct strbuf *buf, unsigned int full) |
| { |
| struct utsname uname_info; |
| |
| if (uname(&uname_info)) { |
| strbuf_addf(buf, _("uname() failed with error '%s' (%d)\n"), |
| strerror(errno), |
| errno); |
| return -1; |
| } |
| if (full) |
| strbuf_addf(buf, "%s %s %s %s\n", |
| uname_info.sysname, |
| uname_info.release, |
| uname_info.version, |
| uname_info.machine); |
| else |
| strbuf_addf(buf, "%s\n", uname_info.sysname); |
| return 0; |
| } |