From 4edcc6ba160cc1c1271d78f21688a0d6ac95c2d2 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 2 Feb 2015 22:07:02 +0000 Subject: [PATCH] A working skeleton processor built into EDI, no scripts needed --- data/extra/Makefile.am | 1 - data/extra/skeleton/eflproject/AUTHORS | 3 +- .../data/desktop/${edi_name}.desktop.in | 2 +- .../skeleton/eflproject/doc/${edi_name}.1.in | 4 +- .../eflproject/packaging/pkgbuild/PKGBUILD | 4 +- .../eflproject/packaging/slackware/slack-desc | 6 +- .../eflproject/src/bin/${edi_name}_main.c | 6 +- .../src/lib/{${EDI_NAME}.h => ${Edi_Name}.h} | 22 +- .../skeleton/eflproject/src/lib/${edi_name}.c | 4 +- .../skeleton/eflproject/src/lib/Makefile.am | 6 +- .../eflproject/src/tests/test_${edi_name}.c | 6 +- src/bin/edi_build_main.c | 7 +- src/bin/welcome/edi_welcome.c | 38 +++- src/lib/Edi.h | 1 + src/lib/edi_create.c | 206 ++++++++++++++++-- src/lib/edi_create.h | 7 +- 16 files changed, 259 insertions(+), 64 deletions(-) rename data/extra/skeleton/eflproject/src/lib/{${EDI_NAME}.h => ${Edi_Name}.h} (74%) diff --git a/data/extra/Makefile.am b/data/extra/Makefile.am index 0032b03..f7932b2 100644 --- a/data/extra/Makefile.am +++ b/data/extra/Makefile.am @@ -9,5 +9,4 @@ install-data-hook: uninstall-local: rm -rf $(skeletondir)/skeleton - EXTRA_DIST = $(skeleton_DATA) diff --git a/data/extra/skeleton/eflproject/AUTHORS b/data/extra/skeleton/eflproject/AUTHORS index c51bc99..60436d3 100644 --- a/data/extra/skeleton/eflproject/AUTHORS +++ b/data/extra/skeleton/eflproject/AUTHORS @@ -1,2 +1 @@ -${EDI_USER} <${EDI_EMAIL}> - +${Edi_User} <${Edi_Email}> diff --git a/data/extra/skeleton/eflproject/data/desktop/${edi_name}.desktop.in b/data/extra/skeleton/eflproject/data/desktop/${edi_name}.desktop.in index e005207..a87b6d7 100644 --- a/data/extra/skeleton/eflproject/data/desktop/${edi_name}.desktop.in +++ b/data/extra/skeleton/eflproject/data/desktop/${edi_name}.desktop.in @@ -5,7 +5,7 @@ Type=Application Name=@PACKAGE_NAME@ Name[fr]=@PACKAGE_NAME@ GenericName=Efl Application Skeletion -Comment=Efl Application ${EDI_NAME} +Comment=Efl Application ${Edi_Name} Icon=@PACKAGE_NAME@ TryExec=@PACKAGE_NAME@ Exec=@PACKAGE_NAME@ diff --git a/data/extra/skeleton/eflproject/doc/${edi_name}.1.in b/data/extra/skeleton/eflproject/doc/${edi_name}.1.in index d7cafa9..0e3e367 100644 --- a/data/extra/skeleton/eflproject/doc/${edi_name}.1.in +++ b/data/extra/skeleton/eflproject/doc/${edi_name}.1.in @@ -9,7 +9,7 @@ ${edi_name} \- a demo application .SH DESCRIPTION -${EDI_NAME} is a demo application to show how to integrate EFL and autotools into a +${Edi_Name} is a demo application to show how to integrate EFL and autotools into a cross platform build. You should be able to generate an executable easily for all target supported by EFL with this ${edi_name}. @@ -47,4 +47,4 @@ http://enlightenment.org .SH AUTHORS -${EDI_USER} <${EDI_EMAIL}> and various contributors. +${Edi_User} <${Edi_Email}> and various contributors. diff --git a/data/extra/skeleton/eflproject/packaging/pkgbuild/PKGBUILD b/data/extra/skeleton/eflproject/packaging/pkgbuild/PKGBUILD index ddcc9ab..4183aca 100644 --- a/data/extra/skeleton/eflproject/packaging/pkgbuild/PKGBUILD +++ b/data/extra/skeleton/eflproject/packaging/pkgbuild/PKGBUILD @@ -4,7 +4,7 @@ pkgver=1.8.99.8967.a1cfce6 pkgrel=1 pkgdesc="Enlightenment toolkit ${edi_name} - GIT development snapshot" arch=('i686' 'x86_64' 'arm') -url="http://${EDI_WWW}" +url="http://${Edi_Url}" license=('WTFPL') makedepends=('doxygen' 'imagemagick' 'git') depends=('elementary-git') @@ -49,7 +49,7 @@ package_${edi_name}-git() { } package_${edi_name}_doc-git() { - pkgdesc="Documentation for ${EDI_NAME}" + pkgdesc="Documentation for ${Edi_Name}" arch=('any') unset depends optdepends diff --git a/data/extra/skeleton/eflproject/packaging/slackware/slack-desc b/data/extra/skeleton/eflproject/packaging/slackware/slack-desc index f5aef32..96d1280 100644 --- a/data/extra/skeleton/eflproject/packaging/slackware/slack-desc +++ b/data/extra/skeleton/eflproject/packaging/slackware/slack-desc @@ -8,12 +8,12 @@ |-----handy-ruler------------------------------------------------------| ${edi_name}: ${edi_name} ${edi_name}: -${edi_name}: ${EDI_NAME} is an example of application written using the Enlightenment +${edi_name}: ${Edi_Name} is an example of application written using the Enlightenment ${edi_name}: Foundation Libraries. ${edi_name}: ${edi_name}: It requires elementary. ${edi_name}: -${edi_name}: ${edi_name} was written by ${EDI_USER} <${EDI_EMAIL}> -${edi_name}: website: +${edi_name}: ${edi_name} was written by ${Edi_User} <${Edi_Email}> +${edi_name}: website: ${edi_name}: ${edi_name}: diff --git a/data/extra/skeleton/eflproject/src/bin/${edi_name}_main.c b/data/extra/skeleton/eflproject/src/bin/${edi_name}_main.c index df3dfdb..d268cb6 100644 --- a/data/extra/skeleton/eflproject/src/bin/${edi_name}_main.c +++ b/data/extra/skeleton/eflproject/src/bin/${edi_name}_main.c @@ -11,11 +11,11 @@ #include "gettext.h" -#include "${EDI_NAME}.h" +#include "${Edi_Name}.h" #include "${edi_name}_private.h" -#define COPYRIGHT "Copyright © ${EDI_YEAR} ${EDI_USER} <${EDI_EMAIL}> and various contributors (see AUTHORS)." +#define COPYRIGHT "Copyright © ${Edi_Year} ${Edi_User} <${Edi_Email}> and various contributors (see AUTHORS)." static void _${edi_name}_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -29,7 +29,7 @@ ${edi_name}_win_setup(void) Evas_Object *win; Evas_Object *label; - win = elm_win_util_standard_add("main", "${EDI_NAME}"); + win = elm_win_util_standard_add("main", "${Edi_Name}"); if (!win) return NULL; elm_win_focus_highlight_enabled_set(win, EINA_TRUE); diff --git a/data/extra/skeleton/eflproject/src/lib/${EDI_NAME}.h b/data/extra/skeleton/eflproject/src/lib/${Edi_Name}.h similarity index 74% rename from data/extra/skeleton/eflproject/src/lib/${EDI_NAME}.h rename to data/extra/skeleton/eflproject/src/lib/${Edi_Name}.h index 6cb5277..0809238 100644 --- a/data/extra/skeleton/eflproject/src/lib/${EDI_NAME}.h +++ b/data/extra/skeleton/eflproject/src/lib/${Edi_Name}.h @@ -35,7 +35,7 @@ extern "C" { /** * @file - * @brief These routines are used for ${EDI_NAME} library interaction. + * @brief These routines are used for ${Edi_Name} library interaction. */ /** @@ -47,20 +47,20 @@ extern "C" { * Functions of obligatory usage, handling proper initialization * and shutdown routines. * - * Before the usage of any other function, ${EDI_NAME} should be properly - * initialized with @ref ${edi_name}_init() and the last call to ${EDI_NAME}'s + * Before the usage of any other function, ${Edi_Name} should be properly + * initialized with @ref ${edi_name}_init() and the last call to ${Edi_Name}'s * functions should be @ref ${edi_name}_shutdown(), so everything will * be correctly freed. * - * ${EDI_NAME} logs everything with Eina Log, using the "${edi_name}" log domain. + * ${Edi_Name} logs everything with Eina Log, using the "${edi_name}" log domain. * */ /** - * Initialize ${EDI_NAME}. + * Initialize ${Edi_Name}. * - * Initializes ${EDI_NAME}, its dependencies and modules. Should be the first - * function of ${EDI_NAME} to be called. + * Initializes ${Edi_Name}, its dependencies and modules. Should be the first + * function of ${Edi_Name} to be called. * * @return The init counter value. * @@ -71,12 +71,12 @@ extern "C" { EAPI int ${edi_name}_init(void); /** - * Shutdown ${EDI_NAME} + * Shutdown ${Edi_Name} * - * Shutdown ${EDI_NAME}. If init count reaches 0, all the internal structures will - * be freed. Any ${EDI_NAME} library call after this point will leads to an error. + * Shutdown ${Edi_Name}. If init count reaches 0, all the internal structures will + * be freed. Any ${Edi_Name} library call after this point will leads to an error. * - * @return ${EDI_NAME}'s init counter value. + * @return ${Edi_Name}'s init counter value. * * @see ${edi_name}_init(). * diff --git a/data/extra/skeleton/eflproject/src/lib/${edi_name}.c b/data/extra/skeleton/eflproject/src/lib/${edi_name}.c index 02c739d..f2bfeb3 100644 --- a/data/extra/skeleton/eflproject/src/lib/${edi_name}.c +++ b/data/extra/skeleton/eflproject/src/lib/${edi_name}.c @@ -2,7 +2,7 @@ # include "config.h" #endif -#include "${EDI_NAME}.h" +#include "${Edi_Name}.h" #include "${edi_name}_private.h" @@ -20,7 +20,7 @@ ${edi_name}_init(void) _${edi_name}_lib_log_dom = eina_log_domain_register("${edi_name}", EINA_COLOR_CYAN); if (_${edi_name}_lib_log_dom < 0) { - EINA_LOG_ERR("${EDI_NAME} can not create its log domain."); + EINA_LOG_ERR("${Edi_Name} can not create its log domain."); goto shutdown_eina; } diff --git a/data/extra/skeleton/eflproject/src/lib/Makefile.am b/data/extra/skeleton/eflproject/src/lib/Makefile.am index 39e772c..eea9995 100644 --- a/data/extra/skeleton/eflproject/src/lib/Makefile.am +++ b/data/extra/skeleton/eflproject/src/lib/Makefile.am @@ -6,13 +6,13 @@ AM_CPPFLAGS = \ -DPACKAGE_LIB_DIR=\"$(libdir)\" \ -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ @EFL_CFLAGS@ \ --DEFL_EFL_BUILD +-DEFL_${EDI_NAME}_BUILD lib_LTLIBRARIES = lib${edi_name}.la -includes_HEADERS = ${EDI_NAME}.h +includes_HEADERS = ${Edi_Name}.h includesdir = $(includedir)/${edi_name}-@VMAJ@ lib${edi_name}_la_SOURCES = ${edi_name}.c lib${edi_name}_la_LIBADD = @EFL_LIBS@ -lm -lib${edi_name}_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@ +lib${edi_name}_la_LDFLAGS = -no-undefined @EFL_LTLIBRARY_FLAGS@ diff --git a/data/extra/skeleton/eflproject/src/tests/test_${edi_name}.c b/data/extra/skeleton/eflproject/src/tests/test_${edi_name}.c index a5afe33..2927ea6 100644 --- a/data/extra/skeleton/eflproject/src/tests/test_${edi_name}.c +++ b/data/extra/skeleton/eflproject/src/tests/test_${edi_name}.c @@ -5,9 +5,9 @@ #include #include -#include "${EDI_NAME}.h" +#include "${Edi_Name}.h" -#define COPYRIGHT "Copyright © ${EDI_YEAR} ${EDI_USER} <${EDI_EMAIL}> and various contributors (see AUTHORS)." +#define COPYRIGHT "Copyright © ${Edi_Year} ${Edi_User} <${Edi_Email}> and various contributors (see AUTHORS)." static void ${edi_name}_test_basic(TCase *tc); @@ -96,7 +96,7 @@ main(int argc EINA_UNUSED, char **argv EINA_UNUSED) goto end; } - s = suite_create("${EDI_NAME}"); + s = suite_create("${Edi_Name}"); for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) { diff --git a/src/bin/edi_build_main.c b/src/bin/edi_build_main.c index 893275c..b7fc63f 100644 --- a/src/bin/edi_build_main.c +++ b/src/bin/edi_build_main.c @@ -40,7 +40,7 @@ _exe_del(void *d EINA_UNUSED, int t EINA_UNUSED, void *event_info EINA_UNUSED) static const Ecore_Getopt optdesc = { "edi_build", - "%prog [options] [build-type]", + "%prog [options] [build|clean|create|test]", PACKAGE_VERSION, COPYRIGHT, "BSD with advertisement clause", @@ -117,9 +117,12 @@ main(int argc EINA_UNUSED, char **argv EINA_UNUSED) edi_builder_test(); else if (!strncmp("build", build_type, 5)) edi_builder_build(); + else if (!strncmp("create", build_type, 6)) +fprintf(stderr, "cannot yet make projects on command line"); +// edi_create_efl_project(...); else { - fprintf(stderr, "Unrecognised build type - try build, test or clean.\n"); + fprintf(stderr, "Unrecognised build type - try build, clean, create or test.\n"); goto end; } ecore_main_loop_begin(); diff --git a/src/bin/welcome/edi_welcome.c b/src/bin/welcome/edi_welcome.c index 43be047..63c5e2e 100644 --- a/src/bin/welcome/edi_welcome.c +++ b/src/bin/welcome/edi_welcome.c @@ -2,6 +2,9 @@ # include "config.h" #endif +#include +#include + #include #include "edi_welcome.h" @@ -218,7 +221,30 @@ _edi_welcome_project_new_create_cb(void *data EINA_UNUSED, Evas_Object *obj EINA user = elm_object_text_get(_create_inputs[3]); email = elm_object_text_get(_create_inputs[4]); - edi_create_project(path, name, url, user, email, _edi_welcome_project_new_create_done_cb); + edi_create_efl_project(path, name, url, user, email, _edi_welcome_project_new_create_done_cb); +} + +static int +_edi_welcome_user_fullname_get(const char *username, char *fullname, size_t max) +{ + struct passwd *p; + size_t n; + + errno = 0; + p = getpwnam(username); + if (p == NULL && errno == 0) + return 0; + if (p == NULL) + return -1; + + n = strcspn(p->pw_gecos, ","); + if (max == 0 || n <= 0) + return 0; + if (n > max - 1) + n = max - 1; + memcpy(fullname, p->pw_gecos, n); + fullname[n] = '\0'; + return 1; } static void @@ -227,17 +253,23 @@ _edi_welcome_project_new_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even Evas_Object *content, *button, *naviframe = data; Elm_Object_Item *item; int row = 0; + char fullname[1024]; + char *username; content = elm_table_add(naviframe); elm_table_homogeneous_set(content, EINA_TRUE); evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(content); + username = getenv("USER"); _edi_welcome_project_new_directory_row_add("Parent Path", NULL, row++, content); _edi_welcome_project_new_input_row_add("Project Name", NULL, row++, content); _edi_welcome_project_new_input_row_add("Project URL", NULL, row++, content); - _edi_welcome_project_new_input_row_add("Username", getenv("USER"), row++, content); - _edi_welcome_project_new_input_row_add("Email", NULL, row++, content); + if (_edi_welcome_user_fullname_get(username, fullname, 1024) > 0) + _edi_welcome_project_new_input_row_add("Creator Name", fullname, row++, content); + else + _edi_welcome_project_new_input_row_add("Creator Name", username, row++, content); + _edi_welcome_project_new_input_row_add("Creator Email", NULL, row++, content); button = elm_button_add(content); elm_object_text_set(button, "Create"); diff --git a/src/lib/Edi.h b/src/lib/Edi.h index b1e5330..0b31cd2 100644 --- a/src/lib/Edi.h +++ b/src/lib/Edi.h @@ -3,6 +3,7 @@ #include #include +#include #ifdef EAPI # undef EAPI diff --git a/src/lib/edi_create.c b/src/lib/edi_create.c index 26dbfd6..d404b6c 100644 --- a/src/lib/edi_create.c +++ b/src/lib/edi_create.c @@ -6,6 +6,102 @@ #include "edi_private.h" +static Edi_Create *_edi_create_data; + +static const char * +_edi_create_filter_variable(const char *text, const char *variable, const char *value) +{ + char *pos, *ret; + int copylen; + + pos = strstr(text, variable); + if (!pos) + return strdup(text); + + copylen = pos - text; + ret = malloc(sizeof(char) * (strlen(text) + strlen(value) - strlen(variable) + 1)); + + snprintf(ret, copylen + 1, text); + snprintf(ret + copylen, strlen(value) + 1, value); + snprintf(ret + copylen + strlen(value), strlen(text) - copylen - strlen(variable) + 1, text + copylen + strlen(variable)); + + return ret; +} + +static const char * +_edi_create_filter_name(const char *text, const char *name) +{ + char *lowername; + const char *filtered, *ret; + + filtered = _edi_create_filter_variable(text, "${Edi_Name}", name); + + lowername = strdup(name); + eina_str_tolower(&lowername); + + ret = _edi_create_filter_variable(filtered, "${edi_name}", lowername); + free(lowername); + free((void *) filtered); + + return ret; +} + +static int +_edi_create_year_get() +{ + time_t timeval; + struct tm *tp; + + time (&timeval); + tp = gmtime(&timeval); + + return tp->tm_year + 1900; +} + +static void +_edi_create_filter_file(Edi_Create *create, const char *path) +{ + char *cmd, *lowername, *uppername; + const char *template; + int length; + +// TODO speed this up - pre-cache this filter! + template = "sed -i \"s|\\${edi_name}|%s|g;s|\\${Edi_Name}|%s|g;s|\\${EDI_NAME}|%s|g;s|\\${Edi_User}|%s|ig;s|\\${Edi_Email}|%s|g;s|\\${Edi_Url}|$%s|g;s|\\${Edi_Year}|%d|g\" %s"; + length = strlen(template) + (strlen(create->name) * 3) + strlen(create->user) + strlen(create->email) + strlen(create->url) + strlen(path) + 4 - 16 + 1; + + lowername = strdup(create->name); + eina_str_tolower(&lowername); + uppername = strdup(create->name); + eina_str_toupper(&uppername); + + cmd = malloc(sizeof(char) * length); + snprintf(cmd, length, template, lowername, create->name, uppername , create->user, create->email, create->url, _edi_create_year_get(), path); + + ecore_exe_run(cmd, NULL); + free(lowername); + free(uppername); + free(cmd); + + // This matches the filtered path copy created in the copy callback + free((void *) path); +} + +static void _edi_create_free_data() +{ + Edi_Create *create; + + create = _edi_create_data; + _edi_create_data = NULL; + + free(create->url); + free(create->user); + free(create->email); + free(create->name); + free(create->path); + + free(create); +} + static Eina_Bool _edi_create_project_done(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) { @@ -15,40 +111,104 @@ _edi_create_project_done(void *data, int type EINA_UNUSED, void *event EINA_UNUS ecore_event_handler_del(create->handler); create->callback(create->path, EINA_TRUE); - free(create->path); - free(data); + _edi_create_free_data(); return ECORE_CALLBACK_DONE; // or ECORE_CALLBACK_PASS_ON } -EAPI void -edi_create_project(const char *path, const char *name, const char *url, - const char *user, const char *email, Edi_Create_Cb func) +static void +_edi_create_move_done_cb(void *data, Eio_File *file EINA_UNUSED) +{ + _edi_create_filter_file(_edi_create_data, (const char *) data); +} + +static void +_edi_create_move_error_cb(void *data, Eio_File *handler EINA_UNUSED, int error) +{ + fprintf(stderr, "move error for %s: [%s]\n", (char *) data, strerror(error)); + + // This matches the filtered path copy created in the copy callback + free(data); +} + +static void +_edi_create_notify_cb(void *d, Eio_File *handler EINA_UNUSED, const Eio_Progress *info) + +{ + Edi_Create *data; + const char *filtered; + + data = (Edi_Create *) d; + + switch (info->op) + { + case EIO_FILE_COPY: + // this will get freed in the filter callback when it's done with + filtered = _edi_create_filter_name(info->dest, data->name); + + if (strcmp(info->dest, filtered)) + { + eio_file_move(info->dest, filtered, NULL, _edi_create_move_done_cb, _edi_create_move_error_cb, filtered); + } + else + { + _edi_create_filter_file(data, filtered); + } + + break; + default: + break; + } +} + +static void +_edi_create_done_cb(void *d, Eio_File *file EINA_UNUSED) { - char script[PATH_MAX], fullpath[PATH_MAX]; - char *cmd; - int cmdlen; Edi_Create *data; Ecore_Event_Handler *handler; - data = calloc(1, sizeof(Edi_Create)); - handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _edi_create_project_done, data); - snprintf(script, sizeof(script), "%s/skeleton/eflprj", elm_app_data_dir_get() -); - snprintf(fullpath, sizeof(fullpath), "%s/%s", path, name); + data = (Edi_Create *) d; - data->path = strdup(fullpath); - data->callback = func; + handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _edi_create_project_done, data); data->handler = handler; - cmdlen = strlen(script) + 19 + strlen(path) + strlen(name) + strlen(url) + strlen(user) + strlen(email); - cmd = malloc(sizeof(char) * cmdlen); - snprintf(cmd, cmdlen, "%s \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"", - script, fullpath, name, user, email, url); - - INF("Creating project \"%s\" at path %s for %s<%s>\n", name, fullpath, user, email); - ecore_exe_run(cmd, data); - free(cmd); + chdir(data->path); + ecore_exe_run("git init && git add .", data); +} + + +static void +_edi_create_error_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, int error) + +{ + fprintf(stderr, "copy error: [%s]\n", strerror(error)); + _edi_create_free_data(); +} + +EAPI void +edi_create_efl_project(const char *parentdir, const char *name, const char *url, + const char *user, const char *email, Edi_Create_Cb func) +{ + char source[PATH_MAX], dest[PATH_MAX]; + Edi_Create *data; + + snprintf(source, sizeof(source), "%s/skeleton/eflproject", elm_app_data_dir_get()); + snprintf(dest, sizeof(dest), "%s/%s", parentdir, name); + + INF("Creating project \"%s\" at path %s for %s<%s>\n", name, dest, user, email); + + data = calloc(1, sizeof(Edi_Create)); + data->path = strdup(dest); + data->name = strdup(name); + + data->url = strdup(url); + data->user = strdup(user); + data->email = strdup(email); + data->callback = func; + _edi_create_data = data; + + eio_dir_copy(source, dest, NULL, _edi_create_notify_cb, _edi_create_done_cb, + _edi_create_error_cb, data); } diff --git a/src/lib/edi_create.h b/src/lib/edi_create.h index 80c3eee..7800451 100644 --- a/src/lib/edi_create.h +++ b/src/lib/edi_create.h @@ -16,7 +16,8 @@ typedef void (*Edi_Create_Cb)(const char *path, Eina_Bool success); typedef struct _Edi_Create { - char *path; + char *path, *name; + char *url, *user, *email; Edi_Create_Cb callback; Ecore_Event_Handler *handler; @@ -38,8 +39,8 @@ typedef struct _Edi_Create * @ingroup Creation */ EAPI void -edi_create_project(const char *path, const char *name, const char *url, - const char *user, const char *email, Edi_Create_Cb func); +edi_create_efl_project(const char *parentdir, const char *name, const char *url, + const char *user, const char *email, Edi_Create_Cb func); /** * @}