ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/edi.git/commit/?id=b3bf819da6338b374ff3c3383d6a171f5517288a

commit b3bf819da6338b374ff3c3383d6a171f5517288a
Author: Andy Williams <[email protected]>
Date:   Sat Feb 7 16:02:05 2015 +0000

    skeleton: Distribute the skeleton files as tarballs.
    
    This allows us to avoid garbage files remaining and gives better control 
over permissions too
---
 .gitignore                      |  1 +
 configure.ac                    |  1 +
 data/extra/Makefile.am          | 10 +-------
 data/extra/skeleton/Makefile.am |  9 +++++++
 src/lib/edi_create.c            | 57 +++++++++++++++++++++++++++++++++--------
 src/lib/edi_create.h            |  2 +-
 6 files changed, 60 insertions(+), 20 deletions(-)

diff --git a/.gitignore b/.gitignore
index 25477c4..c1916e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@
 /src/bin/edi
 /src/bin/edi_build
 /data/desktop/edi.desktop
+/data/extra/skeleton/*.tar.gz
 /doc/edi.1
 edi-*.tar.?z*
 po/*.gmo
diff --git a/configure.ac b/configure.ac
index 1c916c0..9e07729 100644
--- a/configure.ac
+++ b/configure.ac
@@ -108,6 +108,7 @@ data/desktop/edi.desktop
 data/themes/Makefile
 data/themes/default/Makefile
 data/extra/Makefile
+data/extra/skeleton/Makefile
 doc/Makefile
 packaging/Makefile
 packaging/pkgbuild/Makefile
diff --git a/data/extra/Makefile.am b/data/extra/Makefile.am
index c6a7bc9..bd1fba9 100644
--- a/data/extra/Makefile.am
+++ b/data/extra/Makefile.am
@@ -1,12 +1,4 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-skeletondir = $(datadir)/$(PACKAGE)/
-skeleton_DATA =
+SUBDIRS = skeleton
 
-install-data-hook:
-       cp -r $(srcdir)/skeleton $(skeletondir)
-
-uninstall-local:
-       rm -rf $(skeletondir)/skeleton
-
-EXTRA_DIST = skeleton $(skeleton_DATA)
diff --git a/data/extra/skeleton/Makefile.am b/data/extra/skeleton/Makefile.am
new file mode 100644
index 0000000..c367077
--- /dev/null
+++ b/data/extra/skeleton/Makefile.am
@@ -0,0 +1,9 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+skeletondir = $(datadir)/$(PACKAGE)/skeleton
+skeleton_DATA = eflproject.tar.gz
+
+eflproject.tar.gz:
+       tar zcvf eflproject.tar.gz -C $(srcdir) eflproject
+
+EXTRA_DIST = $(skeleton_DATA)
diff --git a/src/lib/edi_create.c b/src/lib/edi_create.c
index a961591..40ef9c5 100644
--- a/src/lib/edi_create.c
+++ b/src/lib/edi_create.c
@@ -95,11 +95,15 @@ _edi_create_free_data()
    create = _edi_create_data;
    _edi_create_data = NULL;
 
+   if (create->temp && ecore_file_exists(create->temp))
+     ecore_file_recursive_rm(create->temp);
+
    free(create->url);
    free(create->user);
    free(create->email);
    free(create->name);
    free(create->path);
+   free(create->temp);
 
    free(create);
 }
@@ -155,7 +159,7 @@ _edi_create_move_done_cb(void *data, Eio_File *file 
EINA_UNUSED)
 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));
+   ERR("move error for %s: [%s]\n", (char *) data, strerror(error));
 
    // This matches the filtered path copy created in the copy callback
    free(data);
@@ -197,22 +201,46 @@ _edi_create_error_cb(void *data, Eio_File *handler 
EINA_UNUSED, int error)
    Edi_Create *create;
 
    create = (Edi_Create *) data;
-   fprintf(stderr, "copy error: [%s]\n", strerror(error));
+   ERR("copy error: [%s]\n", strerror(error));
    create->callback(create->path, EINA_FALSE);
 
    _edi_create_free_data();
 }
 
+static Eina_Bool
+_edi_create_extract_done(void *data, int type EINA_UNUSED, void *event 
EINA_UNUSED)
+{
+   Edi_Create *create;
+   Ecore_Event_Handler *handler;
+   char tmpinner[PATH_MAX];
+
+   create = (Edi_Create *)data;
+   snprintf(tmpinner, sizeof(tmpinner), "%s/eflproject", create->temp);
+
+   ecore_event_handler_del(create->handler);
+
+   create->filters = 0;
+   handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, 
_edi_create_filter_file_done, data);
+   create->handler = handler;
+
+   eio_dir_copy(tmpinner, create->path, NULL, _edi_create_notify_cb, 
_edi_create_done_cb,
+                _edi_create_error_cb, data);
+
+   return ECORE_CALLBACK_DONE;
+}
+
 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;
-   char dest[PATH_MAX];
+   char *source, *cmd, *extract;
+   char tmp[PATH_MAX], dest[PATH_MAX];
    Edi_Create *data;
    Ecore_Event_Handler *handler;
 
-   source = PACKAGE_DATA_DIR "/skeleton/eflproject";
+   source = PACKAGE_DATA_DIR "/skeleton/eflproject.tar.gz";
+   extract = "tar zxf %s -C %s";
+   snprintf(tmp, sizeof(tmp), "/tmp/edi_%s", name);
    snprintf(dest, sizeof(dest), "%s/%s", parentdir, name);
 
    INF("Creating project \"%s\" at path %s for %s<%s>\n", name, dest, user, 
email);
@@ -228,12 +256,21 @@ edi_create_efl_project(const char *parentdir, const char 
*name, const char *url,
    data->callback = func;
    _edi_create_data = data;
 
-   data->filters = 0;
-   handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, 
_edi_create_filter_file_done, data);
+   if (!ecore_file_mkpath(tmp) || !ecore_file_mkpath(dest))
+     {
+        ERR("Failed to create path %s\n", dest);
+        _edi_create_free_data();
+        return;
+     }
+
+   cmd = malloc(sizeof(char) * (strlen(extract) + strlen(source) + strlen(tmp) 
+ 1));
+   sprintf(cmd, extract, source, tmp);
+
+   data->temp = strdup(tmp);
+   handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, 
_edi_create_extract_done, data);
    data->handler = handler;
 
-   eio_dir_copy(source, dest, NULL, _edi_create_notify_cb, _edi_create_done_cb,
-                _edi_create_error_cb, data);
+   ecore_exe_run(cmd, data);
+   free(cmd);
 }
 
-
diff --git a/src/lib/edi_create.h b/src/lib/edi_create.h
index 2ec2ef4..87ad058 100644
--- a/src/lib/edi_create.h
+++ b/src/lib/edi_create.h
@@ -16,7 +16,7 @@ typedef void (*Edi_Create_Cb)(const char *path, Eina_Bool 
success);
 
 typedef struct _Edi_Create
 {
-   char *path, *name;
+   char *path, *temp, *name;
    char *url, *user, *email;
 
    Edi_Create_Cb callback;

-- 


Reply via email to