static GSubprocess * gb_beautifier_process_create_for_clang_format (GbBeautifierWorkbenchAddin *self, ProcessState *state, GError *error) { g_autoptr(GSubprocessLauncher) launcher = NULL; GSubprocess *subprocess = NULL; GPtrArray *args; gchar *config_path; gchar *src_path; g_autofree gchar *tmp_workdir = NULL; g_autofree gchar *tmp_config_path = NULL; g_autofree gchar *tmp_src_path = NULL; g_assert (GB_IS_BEAUTIFIER_WORKBENCH_ADDIN (self)); g_assert (state != NULL); config_path = g_file_get_path (state->config_file); src_path = g_file_get_path (state->src_file); g_assert (!ide_str_empty0 (config_path)); g_assert (!ide_str_empty0 (src_path)); g_assert (!ide_str_empty0 (state->lang_id)); if (NULL == (tmp_workdir = g_dir_make_tmp ("gnome-builder-beautify-XXXXXX", &error))) return NULL; state->tmp_workdir_file = g_file_new_for_path (tmp_workdir); tmp_config_path = g_build_filename (tmp_workdir, ".clang-format", NULL); state->tmp_config_file = g_file_new_for_path (tmp_config_path); if (!g_file_copy (state->config_file, state->tmp_config_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)) return NULL; tmp_src_path = g_build_filename (tmp_workdir, "src_file", NULL); state->tmp_src_file = g_file_new_for_path (tmp_src_path); if (!g_file_copy (state->src_file, state->tmp_src_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)) return NULL; args = g_ptr_array_new (); g_ptr_array_add (args, "clang-format"); g_ptr_array_add (args, "-style=file"); g_ptr_array_add (args, tmp_src_path); g_ptr_array_add (args, NULL); launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE); g_subprocess_launcher_set_cwd (launcher, tmp_workdir); subprocess = g_subprocess_launcher_spawnv (launcher, (const gchar * const *)args->pdata, &error); g_ptr_array_free (args, TRUE); return subprocess; }
static gboolean archive_spawnv (GFile *dir, char **output, GError **error, const gchar * const *argv) { g_autoptr(GSubprocessLauncher) launcher = NULL; g_autoptr(GSubprocess) subp = NULL; GInputStream *in; g_autoptr(GOutputStream) out = NULL; g_autoptr(GMainLoop) loop = NULL; SpawnData data = {0}; g_autofree gchar *commandline = NULL; launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_NONE); if (output) g_subprocess_launcher_set_flags (launcher, G_SUBPROCESS_FLAGS_STDOUT_PIPE); if (dir) { g_autofree char *path = g_file_get_path (dir); g_subprocess_launcher_set_cwd (launcher, path); } commandline = g_strjoinv (" ", (gchar **) argv); g_debug ("Running '%s'", commandline); subp = g_subprocess_launcher_spawnv (launcher, argv, error); if (subp == NULL) return FALSE; loop = g_main_loop_new (NULL, FALSE); data.loop = loop; data.refs = 1; if (output) { data.refs++; in = g_subprocess_get_stdout_pipe (subp); out = g_memory_output_stream_new_resizable (); g_output_stream_splice_async (out, in, G_OUTPUT_STREAM_SPLICE_NONE, 0, NULL, spawn_output_spliced_cb, &data); } g_subprocess_wait_async (subp, NULL, spawn_exit_cb, &data); g_main_loop_run (loop); if (data.error) { g_propagate_error (error, data.error); g_clear_error (&data.splice_error); return FALSE; } if (out) { if (data.splice_error) { g_propagate_error (error, data.splice_error); return FALSE; } /* Null terminate */ g_output_stream_write (out, "\0", 1, NULL, NULL); g_output_stream_close (out, NULL, NULL); *output = g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (out)); } return TRUE; }