]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Don't use perl for portability
authorTravis Cross <tc@traviscross.com>
Thu, 14 Jun 2012 22:40:01 +0000 (22:40 +0000)
committerTravis Cross <tc@traviscross.com>
Thu, 14 Jun 2012 22:47:21 +0000 (22:47 +0000)
This amends commit f8be71ac6df5dc17a9bb67662c59b01da7a46884.

This still should resolve FS-4303.

What's going on here is that we need a portable way to access
strftime.  date(1posix) doesn't provide enough.  And without perl, I
can't think of a better way to get to it than just using C.  So the
logic for generating the extended revision has been moved into a small
self-contained and hopefully portable C program.

.gitignore
Makefile.am
build/print_git_revision.c [new file with mode: 0644]

index f153ad6f7b1bb8115648f51767785b39923e814e..25c55118237df5fb6935379bf745a1e7f33d653e 100644 (file)
@@ -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
index 42ff4151c6c206294f5f40792113a7ada2f77ad3..fefc2f7fe089572ac75aff823f365444b524dc62 100644 (file)
@@ -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 (file)
index 0000000..f29e45f
--- /dev/null
@@ -0,0 +1,64 @@
+/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2 -*-
+ * Author: Travis Cross <tc@traviscross.com>
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <time.h>
+
+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;
+}
+