diff --git a/.gitignore b/.gitignore index 567609b..822dc10 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ build/ +tags + +main +.ycm_extra_conf.py diff --git a/build.sh b/build.sh index 6631a54..a284738 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,9 @@ set -xe -CFLAGS=$(pkg-config --cflags ncurses libcurl) -LIBS=$(pkg-config --libs ncurses libcurl) +CFLAGS="-g -Wall -Wextra $(pkg-config --cflags ncurses libcurl json-c)" +LIBS=$(pkg-config --libs ncurses libcurl json-c) gcc ${CFLAGS} -o main main.c giteaAPI.c ${LIBS} + +ctags -R diff --git a/giteaAPI.c b/giteaAPI.c index e3834d7..08a81fb 100644 --- a/giteaAPI.c +++ b/giteaAPI.c @@ -1,15 +1,57 @@ #include "giteaAPI.h" #include #include +#include +#include #include #include +#include +#include +#define UNUSED(n) (void)(n) + +struct RESPONSE response; + +void teaui_gitea_printResponse(){ + fwrite(response.data, sizeof(char), response.size, stdout); +} + +int teaui_gitea_parseResponse(char* dest, enum TEAUI_GITEA_JSONPARSER type){ + char* json = malloc(response.size+1); + memcpy(json, response.data, sizeof(char) * response.size); + json[response.size-1] = '\0'; + json_object *parent = json_tokener_parse(json); + json_object *child; + + switch (type) { + case TEAUI_GITEA_JSONPARSER_TOKEN: + if(json_object_object_get_ex(parent, "sha1", &child)){ + strcpy(dest, json_object_get_string(child)); + return 0; + } + strcpy(dest, json); + return 1; + break; + } + return 1; +} + +size_t _teaui_gitea_saveResponse(char* ptr, size_t size, size_t nmemb, void *userdata){ + UNUSED(userdata); + char* data = realloc(response.data, response.size + (nmemb*size)); + assert(data != NULL); + response.data = data; + memcpy(response.data + response.size, ptr, nmemb*size); + response.size += size *nmemb; + return nmemb*size; +} SESSION teaui_gitea_session(const char *instance){ curl_global_init(0); CURL *handle = curl_easy_init(); SESSION ret = {.handle=handle}; - memcpy(ret.instance, instance, strlen(instance)); + ret.instance = malloc(sizeof(char) * (strlen(instance)+1)); + strcpy(ret.instance, instance); return ret; } @@ -24,18 +66,25 @@ void teaui_gitea_auth_basic(SESSION s, const char *user, const char *pass){ } void teaui_gitea_auth_token(SESSION s, const char *token){ - char header[256] = "Authorization: "; + char header[256] = "Authorization: token "; strcat(header, token); curl_easy_setopt(s.handle , CURLOPT_HEADERDATA, header); } -const char* teaui_gitea_auth_generateToken(SESSION s, const char * username){ +void teaui_gitea_auth_generateToken(SESSION s, const char * username, const char *name){ char endpoint[1024]; strcpy(endpoint, s.instance); strcat(endpoint, "/api/v1/users/"); strcat(endpoint, username); strcat(endpoint, "/tokens"); + + char post_data[512] = "name="; + strcat(post_data, name); + curl_easy_setopt(s.handle, CURLOPT_URL, endpoint); + curl_easy_setopt(s.handle, CURLOPT_POSTFIELDS, post_data); + curl_easy_setopt(s.handle, CURLOPT_WRITEFUNCTION, _teaui_gitea_saveResponse); curl_easy_perform(s.handle); - return ""; + curl_easy_getinfo(s.handle, CURLINFO_RESPONSE_CODE, response.status); + return ; } diff --git a/giteaAPI.h b/giteaAPI.h index 2b6da65..1a15694 100644 --- a/giteaAPI.h +++ b/giteaAPI.h @@ -8,12 +8,25 @@ typedef struct { char* instance; } SESSION; +struct RESPONSE{ + char* data; + size_t size; + long status; +}; + +enum TEAUI_GITEA_JSONPARSER { + TEAUI_GITEA_JSONPARSER_TOKEN, +}; + +void teaui_gitea_printResponse(); +int teaui_gitea_parseResponse(char* dest, enum TEAUI_GITEA_JSONPARSER type); + SESSION teaui_gitea_session(const char *instance); void teaui_gitea_cleanup(SESSION s); void teaui_gitea_auth_basic(SESSION s, const char *user, const char *pass); void teaui_gitea_auth_token(SESSION s, const char *token); -const char* teaui_gitea_auth_generateToken(SESSION s, const char *username); +void teaui_gitea_auth_generateToken(SESSION s, const char *username, const char *name); #endif /* ifndef GITEA_API_H_ */ diff --git a/plans.md b/plans.md index eae4fdd..7570e2b 100644 --- a/plans.md +++ b/plans.md @@ -11,3 +11,29 @@ - libcurl - ncurses - a json library to find + +## endpoints + +### Notifications + +- /notifications [GET, PUT] + +### Organisations + +- /orgs [GET] + - /orgs/{org} [GET] + - /orgs/{org}/repos [GET, POST] +- /usr/orgs + +### Issues + +pretty much everything + +### repository + +- repos/{owner}/{repo} [GET, DELETE, PATCH] +- repos/{owner}/{repo}/branches [GET, POST] + - repos/{owner}/{repo}/branches/{branch} [GET, DELETE] +- repos/{owner}/{repo}/pulls [POST, GET] + - ... +