mirror of
https://github.com/flatpak/flatpak.git
synced 2026-08-07 05:46:06 -04:00
extensions: Support merge-dirs=list..
This causes the listed directories to become symlink farms into all the subdirectory extensions.
This commit is contained in:
1 parent
4feb82e75b
commit
c88f1aa835
3 files changed
+31
-3
No files matched your search
@@ -2191,10 +2191,12 @@ flatpak_run_add_extension_args (GPtrArray *argv_array,
|
||||
g_autofree char *full_directory = g_build_filename (directory, ext->subdir_suffix, NULL);
|
||||
g_autofree char *ref = g_build_filename (full_directory, ".ref", NULL);
|
||||
g_autofree char *real_ref = g_build_filename (ext->files_path, ext->directory, ".ref", NULL);
|
||||
int i;
|
||||
|
||||
if (ext->needs_tmpfs)
|
||||
{
|
||||
g_autofree char *parent = g_path_get_dirname (directory);
|
||||
|
||||
if (g_hash_table_lookup (mounted_tmpfs, parent) == NULL)
|
||||
{
|
||||
add_args (argv_array,
|
||||
@@ -2226,6 +2228,27 @@ flatpak_run_add_extension_args (GPtrArray *argv_array,
|
||||
|
||||
*envp_p = g_environ_setenv (*envp_p, "LD_LIBRARY_PATH", new_ld_path , TRUE);
|
||||
}
|
||||
|
||||
for (i = 0; ext->merge_dirs != NULL && ext->merge_dirs[i] != NULL; i++)
|
||||
{
|
||||
g_autofree char *parent = g_path_get_dirname (directory);
|
||||
g_autofree char *merge_dir = g_build_filename (parent, ext->merge_dirs[i], NULL);
|
||||
g_autofree char *source_dir = g_build_filename (ext->files_path, ext->merge_dirs[i], NULL);
|
||||
g_auto(GLnxDirFdIterator) source_iter = { 0 };
|
||||
struct dirent *dent;
|
||||
|
||||
if (glnx_dirfd_iterator_init_at (AT_FDCWD, source_dir, TRUE, &source_iter, NULL))
|
||||
{
|
||||
while (glnx_dirfd_iterator_next_dent (&source_iter, &dent, NULL, NULL) && dent != NULL)
|
||||
{
|
||||
g_autofree char *symlink_path = g_build_filename (merge_dir, dent->d_name, NULL);
|
||||
g_autofree char *symlink = g_build_filename (directory, ext->merge_dirs[i], dent->d_name, NULL);
|
||||
add_args (argv_array,
|
||||
"--symlink", symlink, symlink_path,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_list_free_full (extensions, (GDestroyNotify) flatpak_extension_free);
|
||||
|
||||
@@ -3452,6 +3452,7 @@ flatpak_extension_free (FlatpakExtension *extension)
|
||||
g_free (extension->files_path);
|
||||
g_free (extension->add_ld_path);
|
||||
g_free (extension->subdir_suffix);
|
||||
g_strfreev (extension->merge_dirs);
|
||||
g_free (extension);
|
||||
}
|
||||
|
||||
@@ -3472,6 +3473,7 @@ flatpak_extension_new (const char *id,
|
||||
const char *directory,
|
||||
const char *add_ld_path,
|
||||
const char *subdir_suffix,
|
||||
char **merge_dirs,
|
||||
GFile *files,
|
||||
gboolean is_unmaintained)
|
||||
{
|
||||
@@ -3484,6 +3486,7 @@ flatpak_extension_new (const char *id,
|
||||
ext->files_path = g_file_get_path (files);
|
||||
ext->add_ld_path = g_strdup (add_ld_path);
|
||||
ext->subdir_suffix = g_strdup (subdir_suffix);
|
||||
ext->merge_dirs = g_strdupv (merge_dirs);
|
||||
ext->is_unmaintained = is_unmaintained;
|
||||
|
||||
if (is_unmaintained)
|
||||
@@ -3526,6 +3529,7 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
g_autofree char *directory = g_key_file_get_string (metakey, groups[i], "directory", NULL);
|
||||
g_autofree char *version = g_key_file_get_string (metakey, groups[i], "version", NULL);
|
||||
g_autofree char *add_ld_path = g_key_file_get_string (metakey, groups[i], "add-ld-path", NULL);
|
||||
g_auto(GStrv) merge_dirs = g_key_file_get_string_list (metakey, groups[i], "merge-dirs", NULL, NULL);
|
||||
g_autofree char *subdir_suffix = g_key_file_get_string (metakey, groups[i], "subdirectory-suffix", NULL);
|
||||
g_autofree char *ref = NULL;
|
||||
const char *branch;
|
||||
@@ -3552,7 +3556,7 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
/* Prefer a full extension (org.freedesktop.Locale) over subdirectory ones (org.freedesktop.Locale.sv) */
|
||||
if (files != NULL)
|
||||
{
|
||||
ext = flatpak_extension_new (extension, extension, ref, directory, add_ld_path, subdir_suffix, files, is_unmaintained);
|
||||
ext = flatpak_extension_new (extension, extension, ref, directory, add_ld_path, subdir_suffix, merge_dirs, files, is_unmaintained);
|
||||
res = g_list_prepend (res, ext);
|
||||
}
|
||||
else if (g_key_file_get_boolean (metakey, groups[i],
|
||||
@@ -3573,7 +3577,7 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
|
||||
if (subdir_files)
|
||||
{
|
||||
ext = flatpak_extension_new (extension, refs[j], dir_ref, extended_dir, add_ld_path, subdir_suffix, subdir_files, FALSE);
|
||||
ext = flatpak_extension_new (extension, refs[j], dir_ref, extended_dir, add_ld_path, subdir_suffix, merge_dirs, subdir_files, FALSE);
|
||||
ext->needs_tmpfs = TRUE;
|
||||
res = g_list_prepend (res, ext);
|
||||
}
|
||||
@@ -3589,7 +3593,7 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
|
||||
if (subdir_files)
|
||||
{
|
||||
ext = flatpak_extension_new (extension, unmaintained_refs[j], dir_ref, extended_dir, add_ld_path, subdir_suffix, subdir_files, TRUE);
|
||||
ext = flatpak_extension_new (extension, unmaintained_refs[j], dir_ref, extended_dir, add_ld_path, subdir_suffix, merge_dirs, subdir_files, TRUE);
|
||||
ext->needs_tmpfs = TRUE;
|
||||
res = g_list_prepend (res, ext);
|
||||
}
|
||||
|
||||
@@ -326,6 +326,7 @@ typedef struct
|
||||
char *files_path;
|
||||
char *subdir_suffix;
|
||||
char *add_ld_path;
|
||||
char **merge_dirs;
|
||||
int priority;
|
||||
gboolean needs_tmpfs;
|
||||
gboolean is_unmaintained;
|
||||
|
||||
Reference in new issue
Block a user