aboutsummaryrefslogtreecommitdiffstats
path: root/src/blogc-git-receiver
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2016-10-04 23:58:10 +0200
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2016-10-04 23:58:10 +0200
commit13be5bd50238daa2be6b42104ba20aeea427655b (patch)
tree3e66986cd1ebbd98f06f61ff45127745fd54bc01 /src/blogc-git-receiver
parent3fff4bb3172f77b292b0c913749e81bedd3545f3 (diff)
downloadblogc-13be5bd50238daa2be6b42104ba20aeea427655b.tar.gz
blogc-13be5bd50238daa2be6b42104ba20aeea427655b.tar.bz2
blogc-13be5bd50238daa2be6b42104ba20aeea427655b.zip
git-receiver: splitted and tested pre-receive input parser
Diffstat (limited to 'src/blogc-git-receiver')
-rw-r--r--src/blogc-git-receiver/pre-receive-parser.c77
-rw-r--r--src/blogc-git-receiver/pre-receive-parser.h14
-rw-r--r--src/blogc-git-receiver/pre-receive.c91
3 files changed, 101 insertions, 81 deletions
diff --git a/src/blogc-git-receiver/pre-receive-parser.c b/src/blogc-git-receiver/pre-receive-parser.c
new file mode 100644
index 0000000..a842a9d
--- /dev/null
+++ b/src/blogc-git-receiver/pre-receive-parser.c
@@ -0,0 +1,77 @@
+/*
+ * blogc: A blog compiler.
+ * Copyright (C) 2015-2016 Rafael G. Martins <rafael@rafaelmartins.eng.br>
+ *
+ * This program can be distributed under the terms of the BSD License.
+ * See the file LICENSE.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "../common/utils.h"
+#include "pre-receive-parser.h"
+
+typedef enum {
+ START_OLD = 1,
+ OLD,
+ START_NEW,
+ NEW,
+ START_REF,
+ REF
+} input_state_t;
+
+
+char*
+bgr_pre_receive_parse(const char *input)
+{
+ input_state_t state = START_OLD;
+ size_t start = 0;
+ size_t start_new = 0;
+ size_t input_len = strlen(input);
+
+ for (size_t current = 0; current < input_len; current++) {
+
+ char c = input[current];
+
+ switch (state) {
+ case START_OLD:
+ start = current;
+ state = OLD;
+ break;
+ case OLD:
+ if (c != ' ')
+ break;
+ // no need to store old
+ state = START_NEW;
+ break;
+ case START_NEW:
+ start = current;
+ state = NEW;
+ break;
+ case NEW:
+ if (c != ' ')
+ break;
+ state = START_REF;
+ start_new = start;
+ break;
+ case START_REF:
+ start = current;
+ state = REF;
+ break;
+ case REF:
+ if (c != '\n')
+ break;
+ state = START_OLD;
+ // we just care about a ref (refs/heads/master), everything
+ // else is disposable :)
+ if ((current - start == 17) &&
+ (0 == strncmp("refs/heads/master", input + start, 17)))
+ {
+ return bc_strndup(input + start_new, start - 1 - start_new);
+ }
+ break;
+ }
+ }
+
+ return NULL;
+}
diff --git a/src/blogc-git-receiver/pre-receive-parser.h b/src/blogc-git-receiver/pre-receive-parser.h
new file mode 100644
index 0000000..3a605da
--- /dev/null
+++ b/src/blogc-git-receiver/pre-receive-parser.h
@@ -0,0 +1,14 @@
+/*
+ * blogc: A blog compiler.
+ * Copyright (C) 2015-2016 Rafael G. Martins <rafael@rafaelmartins.eng.br>
+ *
+ * This program can be distributed under the terms of the BSD License.
+ * See the file LICENSE.
+ */
+
+#ifndef _PRE_RECEIVE_PARSER_H
+#define _PRE_RECEIVE_PARSER_H
+
+char* bgr_pre_receive_parse(const char *input);
+
+#endif /* _PRE_RECEIVE_PARSER_H */
diff --git a/src/blogc-git-receiver/pre-receive.c b/src/blogc-git-receiver/pre-receive.c
index 8c35537..ca239da 100644
--- a/src/blogc-git-receiver/pre-receive.c
+++ b/src/blogc-git-receiver/pre-receive.c
@@ -17,12 +17,10 @@
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
-
#include "../common/utils.h"
-
-#ifndef BUFFER_SIZE
-#define BUFFER_SIZE 4096
-#endif
+#include "../common/stdin.h"
+#include "pre-receive-parser.h"
+#include "pre-receive.h"
static unsigned int
@@ -91,93 +89,26 @@ rmdir_recursive(const char *dir)
}
-typedef enum {
- START_OLD = 1,
- OLD,
- START_NEW,
- NEW,
- START_REF,
- REF
-} input_state_t;
-
-
int
bgr_pre_receive_hook(int argc, char *argv[])
{
- int c;
- char buffer[BUFFER_SIZE];
-
- input_state_t state = START_OLD;
- size_t i = 0;
- size_t start = 0;
-
int rv = 0;
- char *new = NULL;
- char *master = NULL;
+ char buffer[4096];
- while (EOF != (c = getc(stdin))) {
-
- buffer[i] = (char) c;
-
- switch (state) {
- case START_OLD:
- start = i;
- state = OLD;
- break;
- case OLD:
- if (c != ' ')
- break;
- // no need to store old
- state = START_NEW;
- break;
- case START_NEW:
- start = i;
- state = NEW;
- break;
- case NEW:
- if (c != ' ')
- break;
- state = START_REF;
- new = strndup(buffer + start, i - start);
- break;
- case START_REF:
- start = i;
- state = REF;
- break;
- case REF:
- if (c != '\n')
- break;
- state = START_OLD;
- // we just care about a ref (refs/heads/master), everything
- // else is disposable :)
- if (!((i - start == 17) &&
- (0 == strncmp("refs/heads/master", buffer + start, 17))))
- {
- free(new);
- new = NULL;
- break;
- }
- master = new;
- break;
- }
-
- if (++i >= BUFFER_SIZE) {
- fprintf(stderr, "error: pre-receive hook payload is too big.\n");
- rv = 1;
- goto cleanup2;
- }
- }
+ char *input = bc_stdin_read();
+ char *master = bgr_pre_receive_parse(input);
+ free(input);
if (master == NULL) {
fprintf(stderr, "warning: no reference to master branch found. "
"nothing to deploy.\n");
- goto cleanup2;
+ return rv;
}
char *repo_dir = NULL;
char *output_dir = NULL;
- if (NULL == getcwd(buffer, BUFFER_SIZE)) {
+ if (NULL == getcwd(buffer, sizeof(buffer))) {
fprintf(stderr, "error: failed to get repository remote path: %s\n",
strerror(errno));
rv = 1;
@@ -247,7 +178,7 @@ bgr_pre_receive_hook(int argc, char *argv[])
}
char *htdocs_sym = NULL;
- ssize_t htdocs_sym_len = readlink("htdocs", buffer, BUFFER_SIZE);
+ ssize_t htdocs_sym_len = readlink("htdocs", buffer, sizeof(buffer));
if (0 < htdocs_sym_len) {
if (0 != unlink("htdocs")) {
fprintf(stderr, "error: failed to remove symlink (%s/htdocs): %s\n",
@@ -275,7 +206,5 @@ cleanup:
free(output_dir);
rmdir_recursive(dir);
free(repo_dir);
-cleanup2:
- free(new);
return rv;
}