Skip to content

Commit afba749

Browse files
gasinveinalexlarsson
authored andcommitted
Add inline data source
This adds a source type that writes given text to a file.
1 parent c46a480 commit afba749

File tree

5 files changed

+284
-0
lines changed

5 files changed

+284
-0
lines changed

doc/flatpak-manifest.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,30 @@
866866
</varlistentry>
867867
</variablelist>
868868
</refsect3>
869+
<refsect3>
870+
<title>Inline data sources</title>
871+
<para>
872+
This is a way to create a file with given contents.
873+
</para>
874+
<variablelist>
875+
<varlistentry>
876+
<term><option>type</option></term>
877+
<listitem><para>"inline"</para></listitem>
878+
</varlistentry>
879+
<varlistentry>
880+
<term><option>dest-filename</option> (string)</term>
881+
<listitem><para>Filename to use inside the source dir.</para></listitem>
882+
</varlistentry>
883+
<varlistentry>
884+
<term><option>contents</option> (string)</term>
885+
<listitem><para>Text data that will be put in the file.</para></listitem>
886+
</varlistentry>
887+
<varlistentry>
888+
<term><option>base64</option> (boolean)</term>
889+
<listitem><para>Whether content is base64-encoded.</para></listitem>
890+
</varlistentry>
891+
</variablelist>
892+
</refsect3>
869893
<refsect3>
870894
<title>Shell sources</title>
871895
<para>

src/Makefile.am.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ flatpak_builder_SOURCES = \
2828
src/builder-source-file.h \
2929
src/builder-source-script.c \
3030
src/builder-source-script.h \
31+
src/builder-source-inline.c \
32+
src/builder-source-inline.h \
3133
src/builder-source-shell.c \
3234
src/builder-source-shell.h \
3335
src/builder-source-extra-data.c \

src/builder-source-inline.c

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
#include "config.h"
2+
3+
#include <string.h>
4+
#include <fcntl.h>
5+
#include <stdio.h>
6+
#include <stdlib.h>
7+
#include <sys/statfs.h>
8+
9+
#include "builder-flatpak-utils.h"
10+
#include "builder-utils.h"
11+
#include "builder-source-inline.h"
12+
13+
struct BuilderSourceInline
14+
{
15+
BuilderSource parent;
16+
17+
char *contents;
18+
gboolean base64;
19+
char *dest_filename;
20+
};
21+
22+
typedef struct
23+
{
24+
BuilderSourceClass parent_class;
25+
} BuilderSourceInlineClass;
26+
27+
G_DEFINE_TYPE (BuilderSourceInline, builder_source_inline, BUILDER_TYPE_SOURCE);
28+
29+
enum {
30+
PROP_0,
31+
PROP_CONTENTS,
32+
PROP_BASE64,
33+
PROP_DEST_FILENAME,
34+
LAST_PROP
35+
};
36+
37+
static void
38+
builder_source_inline_finalize (GObject *object)
39+
{
40+
BuilderSourceInline *self = (BuilderSourceInline *) object;
41+
42+
g_free (self->contents);
43+
g_free (self->dest_filename);
44+
45+
G_OBJECT_CLASS (builder_source_inline_parent_class)->finalize (object);
46+
}
47+
48+
static void
49+
builder_source_inline_get_property (GObject *object,
50+
guint prop_id,
51+
GValue *value,
52+
GParamSpec *pspec)
53+
{
54+
BuilderSourceInline *self = BUILDER_SOURCE_INLINE (object);
55+
56+
switch (prop_id)
57+
{
58+
case PROP_CONTENTS:
59+
g_value_set_string (value, self->contents);
60+
break;
61+
62+
case PROP_BASE64:
63+
g_value_set_boolean (value, self->base64);
64+
break;
65+
66+
case PROP_DEST_FILENAME:
67+
g_value_set_string (value, self->dest_filename);
68+
break;
69+
70+
default:
71+
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
72+
}
73+
}
74+
75+
static void
76+
builder_source_inline_set_property (GObject *object,
77+
guint prop_id,
78+
const GValue *value,
79+
GParamSpec *pspec)
80+
{
81+
BuilderSourceInline *self = BUILDER_SOURCE_INLINE (object);
82+
83+
switch (prop_id)
84+
{
85+
case PROP_CONTENTS:
86+
g_free (self->contents);
87+
self->contents = g_value_dup_string (value);
88+
break;
89+
90+
case PROP_BASE64:
91+
self->base64 = g_value_get_boolean (value);
92+
break;
93+
94+
case PROP_DEST_FILENAME:
95+
g_free (self->dest_filename);
96+
self->dest_filename = g_value_dup_string (value);
97+
break;
98+
99+
default:
100+
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
101+
}
102+
}
103+
104+
static gboolean
105+
builder_source_inline_validate (BuilderSource *source,
106+
GError **error)
107+
{
108+
BuilderSourceInline *self = BUILDER_SOURCE_INLINE (source);
109+
110+
if (self->dest_filename != NULL &&
111+
strchr (self->dest_filename, '/') != NULL)
112+
return flatpak_fail (error, "No slashes allowed in dest-filename, use dest property for directory");
113+
114+
return TRUE;
115+
}
116+
117+
static gboolean
118+
builder_source_inline_download (BuilderSource *source,
119+
gboolean update_vcs,
120+
BuilderContext *context,
121+
GError **error)
122+
{
123+
return TRUE;
124+
}
125+
126+
static gboolean
127+
builder_source_inline_extract (BuilderSource *source,
128+
GFile *dest,
129+
GFile *source_dir,
130+
BuilderOptions *build_options,
131+
BuilderContext *context,
132+
GError **error)
133+
{
134+
BuilderSourceInline *self = BUILDER_SOURCE_INLINE (source);
135+
136+
g_autoptr(GFile) dest_file = NULL;
137+
g_autoptr(GFileOutputStream) out = NULL;
138+
gsize size = 0;
139+
140+
if (self->dest_filename == NULL)
141+
{
142+
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, "Property \"dest-filename\" must be set");
143+
return FALSE;
144+
}
145+
146+
dest_file = g_file_get_child (dest, self->dest_filename);
147+
148+
out = g_file_replace (dest_file, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, error);
149+
150+
if (self->contents == NULL)
151+
return TRUE;
152+
153+
if (self->base64)
154+
{
155+
g_autofree guchar *contents = NULL;
156+
contents = g_base64_decode (self->contents, &size);
157+
if (!g_output_stream_write_all (G_OUTPUT_STREAM (out), contents, size, NULL, NULL, error))
158+
return FALSE;
159+
}
160+
else
161+
{
162+
size = strlen (self->contents);
163+
if (!g_output_stream_write_all (G_OUTPUT_STREAM (out), self->contents, size, NULL, NULL, error))
164+
return FALSE;
165+
}
166+
167+
return TRUE;
168+
}
169+
170+
static gboolean
171+
builder_source_inline_bundle (BuilderSource *source,
172+
BuilderContext *context,
173+
GError **error)
174+
{
175+
/* no need to bundle anything here as this part
176+
can be reconstructed from the manifest */
177+
return TRUE;
178+
}
179+
180+
static void
181+
builder_source_inline_checksum (BuilderSource *source,
182+
BuilderCache *cache,
183+
BuilderContext *context)
184+
{
185+
BuilderSourceInline *self = BUILDER_SOURCE_INLINE (source);
186+
187+
builder_cache_checksum_str (cache, self->contents);
188+
builder_cache_checksum_str (cache, self->dest_filename);
189+
}
190+
191+
static void
192+
builder_source_inline_class_init (BuilderSourceInlineClass *klass)
193+
{
194+
GObjectClass *object_class = G_OBJECT_CLASS (klass);
195+
BuilderSourceClass *source_class = BUILDER_SOURCE_CLASS (klass);
196+
197+
object_class->finalize = builder_source_inline_finalize;
198+
object_class->get_property = builder_source_inline_get_property;
199+
object_class->set_property = builder_source_inline_set_property;
200+
201+
source_class->download = builder_source_inline_download;
202+
source_class->extract = builder_source_inline_extract;
203+
source_class->bundle = builder_source_inline_bundle;
204+
source_class->checksum = builder_source_inline_checksum;
205+
source_class->validate = builder_source_inline_validate;
206+
207+
g_object_class_install_property (object_class,
208+
PROP_CONTENTS,
209+
g_param_spec_string ("contents",
210+
"",
211+
"",
212+
NULL,
213+
G_PARAM_READWRITE));
214+
g_object_class_install_property (object_class,
215+
PROP_BASE64,
216+
g_param_spec_boolean ("base64",
217+
"",
218+
"",
219+
FALSE,
220+
G_PARAM_READWRITE));
221+
g_object_class_install_property (object_class,
222+
PROP_DEST_FILENAME,
223+
g_param_spec_string ("dest-filename",
224+
"",
225+
"",
226+
NULL,
227+
G_PARAM_READWRITE));
228+
}
229+
230+
static void
231+
builder_source_inline_init (BuilderSourceInline *self)
232+
{
233+
}

src/builder-source-inline.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef __BUILDER_SOURCE_INLINE_H__
2+
#define __BUILDER_SOURCE_INLINE_H__
3+
4+
#include "builder-source.h"
5+
6+
G_BEGIN_DECLS
7+
8+
typedef struct BuilderSourceInline BuilderSourceInline;
9+
10+
#define BUILDER_TYPE_SOURCE_INLINE (builder_source_inline_get_type ())
11+
#define BUILDER_SOURCE_INLINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BUILDER_TYPE_SOURCE_INLINE, BuilderSourceInline))
12+
#define BUILDER_IS_SOURCE_INLINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BUILDER_TYPE_SOURCE_INLINE))
13+
14+
GType builder_source_inline_get_type (void);
15+
16+
G_DEFINE_AUTOPTR_CLEANUP_FUNC (BuilderSourceInline, g_object_unref)
17+
18+
G_END_DECLS
19+
20+
#endif /* __BUILDER_SOURCE_INLINE_H__ */

src/builder-source.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "builder-source-file.h"
3939
#include "builder-source-dir.h"
4040
#include "builder-source-script.h"
41+
#include "builder-source-inline.h"
4142
#include "builder-source-shell.h"
4243
#include "builder-source-extra-data.h"
4344

@@ -262,6 +263,8 @@ builder_source_to_json (BuilderSource *self)
262263
type = "dir";
263264
else if (BUILDER_IS_SOURCE_SCRIPT (self))
264265
type = "script";
266+
else if (BUILDER_IS_SOURCE_INLINE (self))
267+
type = "inline";
265268
else if (BUILDER_IS_SOURCE_SHELL (self))
266269
type = "shell";
267270
else if (BUILDER_IS_SOURCE_EXTRA_DATA (self))
@@ -302,6 +305,8 @@ builder_source_from_json (JsonNode *node)
302305
source = (BuilderSource *) json_gobject_deserialize (BUILDER_TYPE_SOURCE_DIR, node);
303306
else if (strcmp (type, "script") == 0)
304307
source = (BuilderSource *) json_gobject_deserialize (BUILDER_TYPE_SOURCE_SCRIPT, node);
308+
else if (strcmp (type, "inline") == 0)
309+
source = (BuilderSource *) json_gobject_deserialize (BUILDER_TYPE_SOURCE_INLINE, node);
305310
else if (strcmp (type, "shell") == 0)
306311
source = (BuilderSource *) json_gobject_deserialize (BUILDER_TYPE_SOURCE_SHELL, node);
307312
else if (strcmp (type, "extra-data") == 0)

0 commit comments

Comments
 (0)