Use gs_shutil_cp_a for collecting exports

This saves some code - the downside is that we can only run
build-finish once, since cp_a errors out on existing directories.
This commit is contained in:
Matthias Clasen
2015-01-16 10:01:15 -05:00
parent 1f8c1a8201
commit fadd68e4e2

View File

@@ -4,64 +4,29 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ftw.h>
#include "libgsystem.h"
#include "xdg-app-builtins.h"
#include "xdg-app-utils.h"
static gboolean
copy_subdir (GFile *files, GFile *export, const char *path, GCancellable *cancellable, GError **error)
static GFile *show_export_base;
static int
show_export (const char *fpath, const struct stat *sb, int typeflag)
{
gboolean ret = FALSE;
gs_unref_object GFile *source_dir = NULL;
gs_unref_object GFile *dest_dir = NULL;
gs_unref_object GFileEnumerator *source_enum = NULL;
gs_unref_object GFileInfo *child_info = NULL;
GError *temp_error = NULL;
source_dir = g_file_resolve_relative_path (files, path);
if (!g_file_query_exists (source_dir, cancellable))
if (typeflag == FTW_F)
{
ret = TRUE;
goto out;
}
gs_unref_object GFile *file;
gs_free char *relpath;
dest_dir = g_file_resolve_relative_path (export, path);
if (!gs_file_ensure_directory (dest_dir, TRUE, cancellable, error))
goto out;
source_enum = g_file_enumerate_children (source_dir, G_FILE_ATTRIBUTE_STANDARD_NAME,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable, error);
if (!source_enum)
goto out;
while ((child_info = g_file_enumerator_next_file (source_enum, cancellable, &temp_error)))
{
gs_unref_object GFile *source = NULL;
gs_unref_object GFile *destination = NULL;
gs_free char *relpath = NULL;
const char *name;
name = g_file_info_get_name (child_info);
source = g_file_get_child (source_dir, name);
destination = g_file_get_child (dest_dir, name);
if (!g_file_copy (source, destination, G_FILE_COPY_OVERWRITE, cancellable, NULL, NULL, error))
goto out;
relpath = g_file_get_relative_path (files, source);
file = g_file_new_for_path (fpath);
relpath = g_file_get_relative_path (show_export_base, file);
g_print ("Exporting %s\n", relpath);
}
ret = TRUE;
out:
if (temp_error != NULL)
g_propagate_error (error, temp_error);
return ret;
return 0;
}
static gboolean
@@ -70,36 +35,43 @@ collect_exports (GFile *base, GCancellable *cancellable, GError **error)
gboolean ret = FALSE;
gs_unref_object GFile *files = NULL;
gs_unref_object GFile *export = NULL;
const gchar *sizes[] = {
"16x16", "24x24", "32x32", "48x48", "64x64", "96x96",
"128x128", "256x256", "512x512", "scalable",
NULL
const char *paths[] = {
"share/applications", /* Copy desktop files */
"share/icons/hicolor", /* Icons */
"share/dbus-1/services", /* D-Bus service files */
NULL,
};
int i;
const char *path;
files = g_file_get_child (base, "files");
export = g_file_get_child (base, "export");
/* Copy desktop files */
if (!copy_subdir (files, export, "share/applications", cancellable, error))
goto out;
/* Copy icons */
for (i = 0; sizes[i]; i++)
for (i = 0; paths[i]; i++)
{
gs_free char *path;
path = g_strconcat ("share/icons/hicolor/", sizes[i], "/apps", NULL);
if (!copy_subdir (files, export, path, cancellable, error))
goto out;
gs_unref_object GFile *src = NULL;
src = g_file_resolve_relative_path (files, paths[i]);
if (g_file_query_exists (src, cancellable))
{
g_debug ("Exporting from %s", paths[i]);
gs_unref_object GFile *dest = NULL;
dest = g_file_resolve_relative_path (export, paths[i]);
g_debug ("Ensuring export/%s exists", paths[i]);
if (!gs_file_ensure_directory (dest, TRUE, cancellable, error))
goto out;
g_debug ("Copying from files/%s", paths[i]);
if (!gs_shutil_cp_a (src, dest, cancellable, error))
goto out;
}
}
/* Copy D-Bus service files */
if (!copy_subdir (files, export, "share/dbus-1/services", cancellable, error))
goto out;
path = g_file_get_path (export);
show_export_base = export;
ftw (path, show_export, 10);
ret = TRUE;
g_assert_no_error (*error);
out:
return ret;
}
@@ -196,6 +168,7 @@ xdg_app_builtin_build_finish (int argc, char **argv, GCancellable *cancellable,
GOptionContext *context;
gs_unref_object GFile *base = NULL;
gs_unref_object GFile *files_dir = NULL;
gs_unref_object GFile *export_dir = NULL;
gs_unref_object GFile *var_dir = NULL;
gs_unref_object GFile *var_tmp_dir = NULL;
gs_unref_object GFile *var_run_dir = NULL;
@@ -219,10 +192,8 @@ xdg_app_builtin_build_finish (int argc, char **argv, GCancellable *cancellable,
base = g_file_new_for_commandline_arg (directory);
if (!gs_file_ensure_directory (base, TRUE, cancellable, error))
goto out;
files_dir = g_file_get_child (base, "files");
export_dir = g_file_get_child (base, "export");
var_dir = g_file_get_child (base, "var");
var_tmp_dir = g_file_get_child (var_dir, "tmp");
var_run_dir = g_file_get_child (var_dir, "run");
@@ -235,12 +206,21 @@ xdg_app_builtin_build_finish (int argc, char **argv, GCancellable *cancellable,
goto out;
}
if (g_file_query_exists (export_dir, cancellable))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Build directory %s already finalized", directory);
goto out;
}
g_debug ("Collecting exports");
if (!collect_exports (base, cancellable, error))
goto out;
g_debug ("Updating metadata");
if (!update_metadata (base, cancellable, error))
goto out;
g_debug ("Cleaning up var");
if (!clean_up_var (base, cancellable, error))
goto out;