[virt-tools-list] [PATCH 1/2] install script: generates the output in a file
Zeeshan Ali (Khattak)
zeeshanak at gnome.org
Wed Aug 15 10:08:06 UTC 2012
On Wed, Aug 15, 2012 at 5:21 AM, Fabiano Fidêncio <fabiano at fidencio.org> wrote:
> On Mon, Aug 13, 2012 at 2:54 PM, Zeeshan Ali (Khattak)
> <zeeshanak at gnome.org> wrote:
>> On Mon, Aug 13, 2012 at 10:37 AM, Fabiano Fidêncio <fabiano at fidencio.org> wrote:
>>> Some functions were added to provide support for, instead of return a
>>> string, the osinfo-install-script tool writes that string in a file,
>>> that will be into a dir, passed as argument.
>>
>> Not really a native English speaker and commit a lot of mistakes
>> myself but the para above isnt very comprehensible. Would this be a
>> correct equivalent?
>>
>> Add variant of osinfo_install_script_generate() that outputs the
>> script into a file in the given directory. Also add API to specify a
>> custom prefix for generated file.
>>
>>> These functions are:
>>> - osinfo_install_script_generate_output:
>>> returns a GFile * instance containing the install script, itself.
>>> This GFile * instance must be unref'd by the caller.
>>>
>>> - osinfo_install_script_generate_output_async:
>>> async version of the previous functions.
>>>
>>> - osinfo_install_script_generate_output_finish:
>>> used when the user uses async method.
>>>
>>> - osinfo_install_script_{set,get}_output_prefix:
>>> used to set/get a prefix that will be prepended in the output
>>> filename. The string set is g_strdup'd and g_free'd internally,
>>> avoiding that user cares about that.
>>
>> If you take the above description I provided than there is no need to
>> mention these details.
>>
>>> Moreover, the "filename" attribute was added in the "template" element
>>> in the install script data, and it will be used as the output filename
>>> for each script and will be more detailed below. Also, support to this
>>> field was provided in the XML schema and in the osinfo_loader as well.
>>>
>>> About the osinfo-install-script tool:
>>> If the prefix argument is NULL, the output files will be written as
>>> set in data/install-scripts/*.xml (in filename attribute from
>>> template element):
>>> - Linuxes: fedora.ks
>>> - Windows 2k3r2 and older: windows.sif
>>> - Windows 2k8 and newer: windows.xml
>>> Otherwise, the prefix will be prepended in the filename as:
>>> <prefix>-<filename>
>>>
>>> If the dirname argument is NULL, the output files will be written in
>>> the current directory.
>>>
>>> It will be used to create, easily, multiple scripts, as used in:
>>> http://bugzilla-attachments.gnome.org/attachment.cgi?id=214681
>>> ---
>>> data/install-scripts/fedora.xml | 2 +-
>>> data/install-scripts/windows-sif.xml | 2 +-
>>> data/install-scripts/windows-unattend.xml | 2 +-
>>> data/schemas/libosinfo.rng | 1 +
>>> osinfo/libosinfo.syms | 3 +
>>> osinfo/osinfo_install_script.c | 222 ++++++++++++++++++++++++++++--
>>> osinfo/osinfo_install_script.h | 24 ++++
>>> osinfo/osinfo_loader.c | 9 ++
>>> tools/osinfo-install-script.c | 42 +++---
>>> 9 files changed, 276 insertions(+), 31 deletions(-)
>>>
>>> diff --git a/data/install-scripts/fedora.xml b/data/install-scripts/fedora.xml
>>> index b4ad72d..338a570 100644
>>> --- a/data/install-scripts/fedora.xml
>>> +++ b/data/install-scripts/fedora.xml
>>> @@ -1,7 +1,7 @@
>>> <libosinfo version="0.0.1">
>>> <install-script id='http://fedoraproject.org/scripts/fedora/jeos'>
>>> <profile>jeos</profile>
>>> - <template>
>>> + <template filename="fedora.ks">
>>> <xsl:stylesheet
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> version="1.0">
>>> diff --git a/data/install-scripts/windows-sif.xml b/data/install-scripts/windows-sif.xml
>>> index 29a0eae..46b24ae 100644
>>> --- a/data/install-scripts/windows-sif.xml
>>> +++ b/data/install-scripts/windows-sif.xml
>>> @@ -1,7 +1,7 @@
>>> <libosinfo version="0.0.1">
>>> <install-script id='http://microsoft.com/windows/sif'>
>>> <profile>jeos</profile>
>>> - <template>
>>> + <template filename="windows.sif">
>>> <xsl:stylesheet
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> version="1.0">
>>> diff --git a/data/install-scripts/windows-unattend.xml b/data/install-scripts/windows-unattend.xml
>>> index 9828b34..20e3e23 100644
>>> --- a/data/install-scripts/windows-unattend.xml
>>> +++ b/data/install-scripts/windows-unattend.xml
>>> @@ -1,7 +1,7 @@
>>> <libosinfo version="0.0.1">
>>> <install-script id='http://microsoft.com/windows/unattend'>
>>> <profile>jeos</profile>
>>> - <template>
>>> + <template filename="windows.xml">
>>> <xsl:stylesheet
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> version="1.0">
>>> diff --git a/data/schemas/libosinfo.rng b/data/schemas/libosinfo.rng
>>> index a5f527d..7c8d7f7 100644
>>> --- a/data/schemas/libosinfo.rng
>>> +++ b/data/schemas/libosinfo.rng
>>> @@ -414,6 +414,7 @@
>>> <text/>
>>> </element>
>>> <element name='template'>
>>> + <attribute name="filename"/>
>>> <choice>
>>> <group>
>>> <attribute name="uri"/>
>>> diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
>>> index 2f90183..ddf736e 100644
>>> --- a/osinfo/libosinfo.syms
>>> +++ b/osinfo/libosinfo.syms
>>> @@ -264,6 +264,7 @@ LIBOSINFO_0.2.0 {
>>> osinfo_install_config_set_user_administrator;
>>> osinfo_install_config_set_user_autologin;
>>> osinfo_install_config_set_hostname;
>>> + osinfo_install_script_set_output_prefix;
>>> osinfo_install_script_get_type;
>>> osinfo_install_script_new;
>>> osinfo_install_script_new_data;
>>> @@ -271,6 +272,8 @@ LIBOSINFO_0.2.0 {
>>> osinfo_install_script_generate;
>>> osinfo_install_script_generate_async;
>>> osinfo_install_script_generate_finish;
>>> + osinfo_install_script_generate_output;
>>> + osinfo_install_script_generate_output_async;
>>> osinfo_install_script_get_profile;
>>> osinfo_install_script_get_uri;
>>> osinfo_install_scriptlist_new;
>>> diff --git a/osinfo/osinfo_install_script.c b/osinfo/osinfo_install_script.c
>>> index 1f437a1..2d0b440 100644
>>> --- a/osinfo/osinfo_install_script.c
>>> +++ b/osinfo/osinfo_install_script.c
>>> @@ -46,7 +46,7 @@ G_DEFINE_TYPE (OsinfoInstallScript, osinfo_install_script, OSINFO_TYPE_ENTITY);
>>>
>>> struct _OsinfoInstallScriptPrivate
>>> {
>>> - gboolean unused;
>>> + gchar *output_prefix;
>>> };
>>>
>>> enum {
>>> @@ -141,6 +141,9 @@ osinfo_os_get_property(GObject *object,
>>> static void
>>> osinfo_install_script_finalize (GObject *object)
>>> {
>>> + OsinfoInstallScript *script = OSINFO_INSTALL_SCRIPT (object);
>>> + g_free(script->priv->output_prefix);
>>> +
>>> /* Chain up to the parent class */
>>> G_OBJECT_CLASS (osinfo_install_script_parent_class)->finalize (object);
>>> }
>>> @@ -219,6 +222,7 @@ osinfo_install_script_init (OsinfoInstallScript *list)
>>> OsinfoInstallScriptPrivate *priv;
>>> list->priv = priv = OSINFO_INSTALL_SCRIPT_GET_PRIVATE(list);
>>>
>>> + list->priv->output_prefix = NULL;
>>
>> This is redundant. This struct is zeroed for you.
>
> It's not an error, it's just be careful in excess. :)
> Where am I zeroing the struct? Should I remove this? Is not preferable
> to avoid an error if the user doesn't zero the struct?
There is no error possiblities here. All structs allocated by glib for
you are also zeroed out for you.
>>> }
>>>
>>>
>>> @@ -291,7 +295,25 @@ const gchar *osinfo_install_script_get_product_key_format(OsinfoInstallScript *s
>>> OSINFO_INSTALL_SCRIPT_PROP_PRODUCT_KEY_FORMAT);
>>> }
>>>
>>> -struct OsinfoInstallScriptGenerate {
>>> +void osinfo_install_script_set_output_prefix(OsinfoInstallScript *script,
>>> + const gchar *prefix)
>>> +{
>>> + g_free(script->priv->output_prefix);
>>> + script->priv->output_prefix = g_strdup(prefix);
>>> +}
>>> +
>>> +const gchar *osinfo_install_script_get_output_prefix(OsinfoInstallScript *script)
>>> +{
>>> + return script->priv->output_prefix;
>>> +}
>>> +
>>> +static const gchar *osinfo_install_script_get_output_filename(OsinfoInstallScript *script)
>>> +{
>>> + return osinfo_entity_get_param_value(OSINFO_ENTITY(script),
>>> + OSINFO_INSTALL_SCRIPT_PROP_OUTPUT_FILENAME);
>>> +}
>>> +
>>> +struct OsinfoInstallScriptGenerateData {
>>> GSimpleAsyncResult *res;
>>> OsinfoOs *os;
>>> OsinfoInstallConfig *config;
>>> @@ -299,7 +321,7 @@ struct OsinfoInstallScriptGenerate {
>>> };
>>>
>>>
>>> -static void osinfo_install_script_generate_free(struct OsinfoInstallScriptGenerate *data)
>>> +static void osinfo_install_script_generate_free(struct OsinfoInstallScriptGenerateData *data)
>>
>> * This should be a separate change as it has nothing to do with this
>> patch's goal (and before this patch). Same goes for all other hunks
>> for this renaming..
>> * the free function needs to be renamed too:
>> osinfo_install_script_generate_data_free
>>
>>> {
>>> g_object_unref(data->os);
>>> g_object_unref(data->config);
>>> @@ -308,6 +330,24 @@ static void osinfo_install_script_generate_free(struct OsinfoInstallScriptGenera
>>> g_free(data);
>>> }
>>>
>>> +struct OsinfoInstallScriptGenerateOutputData {
>>> + GSimpleAsyncResult *res;
>>> + GCancellable *cancellable;
>>> + GError *error;
>>> + GFile *file;
>>> + GFileOutputStream *stream;
>>> + gchar *output;
>>> + gssize output_len;
>>> + gssize output_pos;
>>> +};
>>> +
>>> +static void osinfo_install_script_generate_output_free(struct OsinfoInstallScriptGenerateOutputData *data)
>>> +{
>>> + g_object_unref(data->stream);
>>> + g_object_unref(data->res);
>>> + g_free(data);
>>> +}
>>> +
>>>
>>> static xsltStylesheetPtr osinfo_install_script_load_template(const gchar *uri,
>>> const gchar *template,
>>> @@ -530,7 +570,7 @@ static void osinfo_install_script_template_loaded(GObject *src,
>>> GAsyncResult *res,
>>> gpointer user_data)
>>> {
>>> - struct OsinfoInstallScriptGenerate *data = user_data;
>>> + struct OsinfoInstallScriptGenerateData *data = user_data;
>>> GError *error = NULL;
>>> gchar *input = NULL;
>>> gchar *output = NULL;
>>> @@ -579,7 +619,7 @@ void osinfo_install_script_generate_async(OsinfoInstallScript *script,
>>> GAsyncReadyCallback callback,
>>> gpointer user_data)
>>> {
>>> - struct OsinfoInstallScriptGenerate *data = g_new0(struct OsinfoInstallScriptGenerate, 1);
>>> + struct OsinfoInstallScriptGenerateData *data = g_new0(struct OsinfoInstallScriptGenerateData, 1);
>>> const gchar *templateData = osinfo_install_script_get_template_data(script);
>>> const gchar *templateUri = osinfo_install_script_get_template_uri(script);
>>>
>>> @@ -621,9 +661,9 @@ void osinfo_install_script_generate_async(OsinfoInstallScript *script,
>>> }
>>> }
>>>
>>> -gchar *osinfo_install_script_generate_finish(OsinfoInstallScript *script,
>>> - GAsyncResult *res,
>>> - GError **error)
>>> +static gpointer osinfo_install_script_generate_finish_common(OsinfoInstallScript *script,
>>> + GAsyncResult *res,
>>> + GError **error)
>>> {
>>> GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(res);
>>>
>>> @@ -635,13 +675,61 @@ gchar *osinfo_install_script_generate_finish(OsinfoInstallScript *script,
>>> return g_simple_async_result_get_op_res_gpointer(simple);
>>> }
>>>
>>> +gchar *osinfo_install_script_generate_finish(OsinfoInstallScript *script,
>>> + GAsyncResult *res,
>>> + GError **error)
>>> +{
>>> + return osinfo_install_script_generate_finish_common(script,
>>> + res,
>>> + error);
>>> +}
>>> +
>>> +GFile *osinfo_install_script_generate_output_finish(OsinfoInstallScript *script,
>>> + GAsyncResult *res,
>>> + GError **error)
>>> +{
>>> + return osinfo_install_script_generate_finish_common(script,
>>> + res,
>>> + error);
>>> +}
>>>
>>> struct OsinfoInstallScriptGenerateSync {
>>> GMainLoop *loop;
>>> GError *error;
>>> gchar *output;
>>> + GFile *file;
>>> };
>>>
>>> +static void osinfo_install_script_generate_output_done(GObject *src,
>>> + GAsyncResult *res,
>>> + gpointer user_data)
>>> +{
>>> + struct OsinfoInstallScriptGenerateSync *data = user_data;
>>> +
>>> + data->file =
>>> + osinfo_install_script_generate_output_finish(OSINFO_INSTALL_SCRIPT(src),
>>> + res,
>>> + &data->error);
>>> + g_main_loop_quit(data->loop);
>>> +}
>>> +
>>> +static void osinfo_install_script_generate_output_close_file(GObject *src,
>>> + GAsyncResult *res,
>>> + gpointer user_data)
>>> +{
>>> + struct OsinfoInstallScriptGenerateOutputData *data = user_data;
>>> +
>>> + g_output_stream_close_finish(G_OUTPUT_STREAM(src),
>>> + res,
>>> + &data->error);
>>> +
>>> + g_simple_async_result_set_op_res_gpointer(data->res,
>>> + data->file, NULL);
>>> + g_simple_async_result_complete_in_idle(data->res);
>>> +
>>> + osinfo_install_script_generate_output_free(data);
>>> +}
>>> +
>>> static void osinfo_install_script_generate_done(GObject *src,
>>> GAsyncResult *res,
>>> gpointer user_data)
>>> @@ -655,7 +743,6 @@ static void osinfo_install_script_generate_done(GObject *src,
>>> g_main_loop_quit(data->loop);
>>> }
>>>
>>> -
>>> gchar *osinfo_install_script_generate(OsinfoInstallScript *script,
>>> OsinfoOs *os,
>>> OsinfoInstallConfig *config,
>>> @@ -665,7 +752,7 @@ gchar *osinfo_install_script_generate(OsinfoInstallScript *script,
>>> GMainLoop *loop = g_main_loop_new(g_main_context_get_thread_default(),
>>> TRUE);
>>> struct OsinfoInstallScriptGenerateSync data = {
>>> - loop, NULL, NULL
>>> + loop, NULL, NULL, NULL
>>
>> If all you need to do is to pass the main loop, you should pass that
>> as the data pointer and no need to have a separate struct.
>
> We are keeping the result (the GFile * or the gchar * that contains
> the script) in this struct as well.
> Should I remove?
Yeah I don't see any need as you get the result when you call the
finalize in this same function.
--
Regards,
Zeeshan Ali (Khattak)
FSF member#5124
More information about the virt-tools-list
mailing list