Compare commits
	
		
			2 Commits
		
	
	
		
			master
			...
			C_Refactor
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						93c0f6180d
	
				 | 
					
					
						|||
| e3508eee23 | 
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1 +1,5 @@
 | 
				
			|||||||
build/
 | 
					build/
 | 
				
			||||||
 | 
					tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main
 | 
				
			||||||
 | 
					.ycm_extra_conf.py
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +0,0 @@
 | 
				
			|||||||
cmake_minimum_required(VERSION 3.15)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set(CMAKE_CXX_STANDARD 11)
 | 
					 | 
				
			||||||
set(CMAKE_CXX_STANDARD_REQUIRED On)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS On)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
project(teaui)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
add_executable(teaui)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
add_subdirectory(src)
 | 
					 | 
				
			||||||
							
								
								
									
										10
									
								
								build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								build.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -xe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
							
								
								
									
										90
									
								
								giteaAPI.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								giteaAPI.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					#include "giteaAPI.h"
 | 
				
			||||||
 | 
					#include <curl/curl.h>
 | 
				
			||||||
 | 
					#include <curl/easy.h>
 | 
				
			||||||
 | 
					#include <json-c/debug.h>
 | 
				
			||||||
 | 
					#include <json-c/json_object.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <malloc.h>
 | 
				
			||||||
 | 
					#include <json-c/json.h>
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#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};
 | 
				
			||||||
 | 
						ret.instance = malloc(sizeof(char) * (strlen(instance)+1));
 | 
				
			||||||
 | 
						strcpy(ret.instance, instance);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void teaui_gitea_cleanup(SESSION s){
 | 
				
			||||||
 | 
						curl_global_cleanup();
 | 
				
			||||||
 | 
						curl_easy_cleanup(s.handle);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void teaui_gitea_auth_basic(SESSION s, const char *user, const char *pass){
 | 
				
			||||||
 | 
						curl_easy_setopt(s.handle, CURLOPT_USERNAME, user);
 | 
				
			||||||
 | 
						curl_easy_setopt(s.handle, CURLOPT_PASSWORD, pass);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void teaui_gitea_auth_token(SESSION s, const char *token){
 | 
				
			||||||
 | 
						char header[256] = "Authorization: token ";
 | 
				
			||||||
 | 
						strcat(header, token);
 | 
				
			||||||
 | 
						curl_easy_setopt(s.handle , CURLOPT_HEADERDATA, header);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
						curl_easy_getinfo(s.handle, CURLINFO_RESPONSE_CODE, response.status);
 | 
				
			||||||
 | 
						return ;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										32
									
								
								giteaAPI.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								giteaAPI.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					#ifndef GITEA_API_H_
 | 
				
			||||||
 | 
					#define GITEA_API_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <curl/curl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						CURL* handle;
 | 
				
			||||||
 | 
						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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void teaui_gitea_auth_generateToken(SESSION s, const char *username, const char *name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* ifndef GITEA_API_H_ */
 | 
				
			||||||
							
								
								
									
										40
									
								
								main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								main.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					#include <curses.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "giteaAPI.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <ncurses.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						SESSION s = teaui_gitea_session("https://git.herisson.ovh");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
						initscr();
 | 
				
			||||||
 | 
						start_color();
 | 
				
			||||||
 | 
						init_pair(1, COLOR_RED, COLOR_GREEN);
 | 
				
			||||||
 | 
						WINDOW* test = newwin(16, 9, 2, 2);
 | 
				
			||||||
 | 
						wattron(test, COLOR_PAIR(1));
 | 
				
			||||||
 | 
						box(test, 0, 0);
 | 
				
			||||||
 | 
						wattroff(test, COLOR_PAIR(1));
 | 
				
			||||||
 | 
						noecho();
 | 
				
			||||||
 | 
						timeout(0);
 | 
				
			||||||
 | 
						refresh();
 | 
				
			||||||
 | 
						bool should_quit = false;
 | 
				
			||||||
 | 
						while(!should_quit){
 | 
				
			||||||
 | 
							wrefresh(test);
 | 
				
			||||||
 | 
							int in = getch();
 | 
				
			||||||
 | 
							if(in != ERR){
 | 
				
			||||||
 | 
								switch (in) {
 | 
				
			||||||
 | 
									case 'a':
 | 
				
			||||||
 | 
										should_quit = true;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									case 'd':
 | 
				
			||||||
 | 
										wattron(test, COLOR_PAIR(1));
 | 
				
			||||||
 | 
										wprintw(test, "Hello, Dari!");
 | 
				
			||||||
 | 
										wattroff(test, COLOR_PAIR(1));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						endwin();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								plans.md
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								plans.md
									
									
									
									
									
								
							@ -11,3 +11,29 @@
 | 
				
			|||||||
- libcurl
 | 
					- libcurl
 | 
				
			||||||
- ncurses
 | 
					- ncurses
 | 
				
			||||||
- a json library to find
 | 
					- 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]
 | 
				
			||||||
 | 
					    - ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +0,0 @@
 | 
				
			|||||||
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
 | 
					 | 
				
			||||||
	main.cpp
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
@ -1,7 +0,0 @@
 | 
				
			|||||||
#include <ncurses.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	printf("Hello, World!");
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user