marrakesh/mrk.c

372 lines
11 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <Eina.h>
#include <Ecore.h>
#include <Ecore_File.h>
#include "mrklib.h"
#define _mrk_err(args...) do { fprintf(stderr, ##args); exit(-1); } while (0)
static const char *server_host = "devs.enlightenment.org";
static int server_port = 10077;
static const char *build_tmpdir = "Marrakesh";
static const char *arch = NULL;
static const char *os = NULL;
static Eina_Bool move_to_cwd = EINA_FALSE;
static Eina_Bool install_bin = EINA_FALSE;
static void
_cb_connect(void *data, Mrk *server)
{
}
static void
_cb_disconnect(void *data, Mrk *server)
{
_mrk_err("Disconnect\n");
}
static void
_cb_upload_begin(void *data, Mrk *server)
{
printf("[");
fflush(stdout);
}
static void
_cb_upload_progress(void *data, Mrk *server, double pos)
{
printf("%1.02f_", pos);
fflush(stdout);
}
static void
_cb_upload_end(void *data, Mrk *server)
{
printf("]\n");
fflush(stdout);
}
static void
_cb_upload_success(void *data, Mrk *server, Eina_Bool success)
{
if (!success) _mrk_err("Upload Failed\n");
ecore_main_loop_quit();
}
static void
_cb_download_begin(void *data, Mrk *server)
{
printf("[");
fflush(stdout);
}
static void
_cb_download_progress(void *data, Mrk *server, double pos)
{
printf("%1.02f_", pos);
fflush(stdout);
}
static void
_cb_download_end(void *data, Mrk *server)
{
printf("]\n");
fflush(stdout);
}
static void
_cb_download_success(void *data, Mrk *server, const char *file)
{
if (!file) _mrk_err("Download Failed\n");
if (move_to_cwd)
{
const char *fname = ecore_file_file_get(file);
char tmp[PATH_MAX], wd[PATH_MAX];
if (fname)
{
if (ecore_file_exists(fname)) _mrk_err("File: '%s' exists in ./\n", fname);
if (getcwd(wd, sizeof(wd)))
{
snprintf(tmp, sizeof(tmp), "%s/%s", wd, fname);
ecore_file_mv(file, tmp);
}
}
}
else if (install_bin)
{
if (!mrk_package_bin_install(file)) _mrk_err("Failed to install\n");
if (!mrk_package_bin_clean()) _mrk_err("Failed to clean\n");
ecore_file_unlink(file);
}
ecore_main_loop_quit();
}
static void
_cb_answer_begin(void *data, Mrk *server)
{
}
static void
_cb_answer_progress(void *data, Mrk *server, const char *result)
{
printf("%s\n", result);
}
static void
_cb_answer_end(void *data, Mrk *server)
{
ecore_main_loop_quit();
}
int
main(int argc, char **argv)
{
if (argc < 2)
{
printf("mrk sub commands:\n"
// " new\n"
" build\n"
" bin\n"
" check\n"
" src\n"
" extract FILE\n"
" inst FILE\n"
" rm PKGNAME\n"
" rel [FILE]\n"
" clean\n"
" down PKGNAME\n"
" get PKGNAME\n"
" getsrc PKGNAME\n"
" list [CATEGORY]\n"
" search KEY1 [KEY2] [KEY3] [...]\n"
" server REPODIR BUILDSCRIPT\n"
" index DIR1 [DIR2] [DIR3] [...]\n"
"\n");
return -1;
}
eina_init();
ecore_init();
mrk_init();
os = mrk_os_get();
arch = mrk_arch_get();
if (getenv("MRKHOST")) server_host = getenv("MRKHOST");
if (getenv("MRKPORT")) server_port = atoi(getenv("MRKPORT"));
if (getenv("MRKARCH")) arch = getenv("MRKARCH");
if (getenv("MRKOS")) os = getenv("MRKOS");
if (getenv("MRKDIR")) build_tmpdir = getenv("MRKDIR");
if (!strcmp(argv[1], "build"))
{
Mrk_Build *bld = mrk_build_load("Marrakesh.mrk");
if (!bld) _mrk_err("Failed to load Marrakesh.mrk\n");
if (!mrk_build_do(bld, build_tmpdir))
{
mrk_build_free(bld);
_mrk_err("Failed to build Marrakesh.mrk\n");
}
mrk_build_free(bld);
}
else if (!strcmp(argv[1], "src"))
{
char tmp[4096];
Mrk_Build *bld = mrk_build_load("Marrakesh.mrk");
if (!bld) _mrk_err("Failed to load Marrakesh.mrk\n");
snprintf(tmp, sizeof(tmp), "%s-%s.mks", bld->name, bld->version);
if (!mrk_build_package_src(bld, "Marrakesh.mrk", tmp))
{
mrk_build_free(bld);
_mrk_err("Failed to package up source\n");
}
mrk_build_free(bld);
}
else if (!strcmp(argv[1], "bin"))
{
char tmp[4096];
Mrk_Build *bld = mrk_build_load("Marrakesh.mrk");
if (!bld) _mrk_err("Failed to load Marrakesh.mrk\n");
snprintf(tmp, sizeof(tmp), "%s-%s.mkb", bld->name, bld->version);
if (!ecore_file_exists(build_tmpdir)) _mrk_err("No build dir!\n");
if (!mrk_build_package_bin(bld, tmp, build_tmpdir, os, arch))
{
mrk_build_free(bld);
_mrk_err("Failed to package up binary\n");
}
mrk_build_free(bld);
}
else if (!strcmp(argv[1], "extract"))
{
if (argc < 2) _mrk_err("Must provide FILE.MKS\n");
if (!mrk_package_src_extract(argv[2], "./")) _mrk_err("Failed to extract\n");
}
else if (!strcmp(argv[1], "inst"))
{
if (argc < 2) _mrk_err("Must provide FILE.MKB\n");
if (!mrk_package_bin_install(argv[2])) _mrk_err("Failed to install\n");
if (!mrk_package_bin_clean()) _mrk_err("Failed to clean\n");
}
else if (!strcmp(argv[1], "clean"))
{
if (!mrk_package_bin_clean()) _mrk_err("Failed to clean\n");
}
else if (!strcmp(argv[1], "rm"))
{
if (argc < 2) _mrk_err("Must provide PACKAGENAME\n");
if (!mrk_package_bin_remove(argv[2])) _mrk_err("Failed to remove\n");
if (!mrk_package_bin_clean()) _mrk_err("Failed to clean\n");
}
else if (!strcmp(argv[1], "new"))
{
}
else if (!strcmp(argv[1], "check"))
{
Mrk_Build *bld;
char tmp[4096];
ecore_file_recursive_rm("Marrakesh-Check");
ecore_file_mkdir("Marrakesh-Check");
bld = mrk_build_load("Marrakesh.mrk");
if (!bld) _mrk_err("Failed to load Marrakesh.mrk\n");
if (!mrk_build_do(bld, build_tmpdir))
{
mrk_build_free(bld);
_mrk_err("Failed to build Marrakesh.mrk\n");
}
snprintf(tmp, sizeof(tmp), "%s-%s.mks", bld->name, bld->version);
if (!mrk_build_package_src(bld, "Marrakesh.mrk", tmp))
{
mrk_build_free(bld);
_mrk_err("Failed to package up source\n");
}
snprintf(tmp, sizeof(tmp), "%s-%s.mkb", bld->name, bld->version);
if (!mrk_build_package_bin(bld, tmp, build_tmpdir, os, arch))
{
mrk_build_free(bld);
_mrk_err("Failed to package up binary\n");
}
mrk_build_free(bld);
}
else if (!strcmp(argv[1], "index"))
{
int i;
for (i = 2; i < argc; i++) mrk_index(argv[i]);
}
else if (!strcmp(argv[1], "server"))
{
Mrk_Serve *serve;
if (argc < 3) _mrk_err("Must provide REPODIR BUILDSCRIPT as arguments\n");
serve = mrk_serve(NULL, server_port, argv[2], argv[3]);
ecore_main_loop_begin();
mrk_unserve(serve);
}
else
{
static Mrk *server;
server = mrk_connect(server_host, server_port);
if (server)
{
mrk_callback_connect_set(server,
_cb_connect, NULL,
_cb_disconnect, NULL);
mrk_callback_upload_set(server,
_cb_upload_begin, NULL,
_cb_upload_progress, NULL,
_cb_upload_end, NULL,
_cb_upload_success, NULL);
mrk_callback_download_set(server,
_cb_download_begin, NULL,
_cb_download_progress, NULL,
_cb_download_end, NULL,
_cb_download_success, NULL);
mrk_callback_answer_set(server,
_cb_answer_begin, NULL,
_cb_answer_progress, NULL,
_cb_answer_end, NULL);
if (!strcmp(argv[1], "down"))
{
if (argc < 2) _mrk_err("Must provide PKGNAME as argument\n");
move_to_cwd = EINA_TRUE;
mrk_download(server, argv[2]);
}
else if (!strcmp(argv[1], "get"))
{
install_bin = EINA_TRUE;
if (argc < 2) _mrk_err("Must provide PKGNAME as argument\n");
move_to_cwd = EINA_TRUE;
mrk_download(server, argv[2]);
}
else if (!strcmp(argv[1], "rel"))
{
// XXX: src THEN upload
char tmp[4096];
Mrk_Build *bld = mrk_build_load("Marrakesh.mrk");
if (!bld) _mrk_err("Failed to load Marrakesh.mrk\n");
snprintf(tmp, sizeof(tmp), "%s-%s.mks", bld->name, bld->version);
if (!mrk_build_package_src(bld, "Marrakesh.mrk", tmp))
{
mrk_build_free(bld);
_mrk_err("Failed to package up source\n");
}
mrk_build_free(bld);
mrk_upload(server, tmp);
}
else if (!strcmp(argv[1], "list"))
{
if (argc < 2) mrk_list(server, NULL);
else mrk_list(server, argv[2]);
}
else if (!strcmp(argv[1], "search"))
{
int i;
int len = 0;
char *ts;
if (argc < 2) _mrk_err("Must provide 1 or more keys as aruments\n");
for (i = 2; i < argc; i++)
{
len += strlen(argv[i]);
len++;
}
ts = malloc(len);
if (ts)
{
ts[0] = 0;
for (i = 2; i < argc; i++)
{
strcat(ts, argv[i]);
if (i < (argc - 1)) strcat(ts, " ");
}
mrk_search(server, ts);
free(ts);
}
}
else if (!strcmp(argv[1], "getsrc"))
{
if (argc < 2) _mrk_err("Must provide PKGNAME as argument\n");
move_to_cwd = EINA_TRUE;
mrk_download_source(server, argv[2]);
}
ecore_main_loop_begin();
mrk_disconnect(server);
}
else _mrk_err("Cannot connect\n");
}
mrk_shutdown();
ecore_shutdown();
eina_shutdown();
return 0;
}