diff --git a/.gitignore b/.gitignore index f153ad6f7b..25c5511823 100644 --- a/.gitignore +++ b/.gitignore @@ -99,6 +99,7 @@ TAGS /build/Makefile /build/Makefile.in /build/modmake.rules +/build/print_git_revision /libs/curl/lib/ca-bundle.h /libs/esl/fs_cli diff --git a/Makefile.am b/Makefile.am index 42ff4151c6..fefc2f7fe0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -415,16 +415,14 @@ $(OUR_MODULES): $(switch_builddir)/modules.conf libfreeswitch.la $(switch_builddir)/quiet_libtool: $(switch_builddir)/libtool @cat libtool | sed -e 's|$$show "$$command"|if test -z "$$suppress_output" ; then $$show "Compiling $$srcfile ..." ; fi|' > $(switch_builddir)/quiet_libtool -src/include/switch_version.h: src/include/switch_version.h.in Makefile $(libfreeswitch_la_SOURCES) $(library_include_HEADERS) +build/print_git_revision: build/print_git_revision.c + $(CC) -o $@ $< + +src/include/switch_version.h: src/include/switch_version.h.in Makefile build/print_git_revision $(libfreeswitch_la_SOURCES) $(library_include_HEADERS) @cat $< > $@; \ if [ -d .git ]; then \ - xdate="$$(perl -e 'use POSIX; print strftime("%Y%m%dT%H%M%SZ",gmtime($$ARGV[0]))' "$$(git log -n1 --format='%ct' HEAD)")"; \ - xcommit="$$(git rev-list -n1 --abbrev=10 --abbrev-commit HEAD)"; \ - xver="+git~$$xdate~$$xcommit"; \ - if ! git diff-index --quiet HEAD; then \ - xver="$$xver+unclean~$$(date -u +%Y%m%dT%H%M%SZ)"; \ - fi; \ - perl -ple "if (/#define *SWITCH_VERSION_REVISION/) {s/\"(.*)\"/\"\1$$xver\"/}" \ + xver="$$(./build/print_git_revision)"; \ + sed -e "/#define *SWITCH_VERSION_REVISION/{s/\"\([^\"]*\)\"/\"\1$$xver\"/}" \ $< > $@; \ fi; diff --git a/build/print_git_revision.c b/build/print_git_revision.c new file mode 100644 index 0000000000..f29e45f16f --- /dev/null +++ b/build/print_git_revision.c @@ -0,0 +1,64 @@ +/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2 -*- + * Author: Travis Cross + */ + +#include +#include +#include +#include +#include +#include + +int sys(char *buf, int buflen, char *cmd) { + int i, p[2]; + pipe(p); + if (!(i=fork())) { + close(p[0]); + dup2(p[1],1); + close(p[1]); + execlp("sh","sh","-c",cmd,NULL); + } else { + int s, x, c=0; + close(p[1]); + waitpid(i,&s,0); + if (!(WIFEXITED(s))) return 255; + if (WEXITSTATUS(s)) return WEXITSTATUS(s); + while ((x=read(p[0],buf,buflen-1))>0) c+=x; + if (x<0) return 1; + buf[c] = 0; + } + return 0; +} + +int sys1(char *buf, int buflen, char *cmd) { + int r = sys(buf,buflen,cmd); + char *c; + if (r!=0) return r; + if ((c=strstr(buf,"\n"))) *c=0; + return 0; +} + +int main(int argc, char **argv) { + char buf[256], xdate[256], xfdate[256], xcommit[256], xver[256]; + time_t xdate_t; + struct tm *xdate_tm; + + sys1(xdate,sizeof(xdate),"git log -n1 --format='%ct' HEAD"); + xdate_t = (time_t) atoi(xdate); + if (!(xdate_tm = gmtime(&xdate_t))) return 1; + strftime(xfdate,sizeof(xfdate),"%Y%m%dT%H%M%SZ",xdate_tm); + sys1(xcommit,sizeof(xcommit),"git rev-list -n1 --abbrev=10 --abbrev-commit HEAD"); + snprintf(xver,sizeof(xver),"+git~%s~%s",xfdate,xcommit); + if ((sys(buf,sizeof(buf),"git diff-index --quiet HEAD"))) { + time_t now_t = time(NULL); + struct tm *now_tm = gmtime(&now_t); + char now[256]; + if (!now_tm) return 1; + strftime(now,sizeof(now),"%Y%m%dT%H%M%SZ",now_tm); + snprintf(buf,sizeof(buf),"%s+unclean~%s",xver,now); + strncpy(xver,buf,sizeof(xver)); + } + printf("%s\n",xver); + return 0; +} +