plover/import-yum.c
author J. Ali Harlow <ali@juiblex.co.uk>
Tue Jun 29 10:09:34 2021 +0100 (2021-06-29)
changeset 108 b3d8e196dac8
parent 71 bd272d15bea4
child 109 2947214c450e
permissions -rw-r--r--
Added tag 0.6.1 for changeset 6ae203c8b28d
ali@0
     1
/*
ali@0
     2
 * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
ali@0
     3
 * Copyright (C) 2008  Red Hat, Inc
ali@61
     4
 * Copyright (C) 2009, 2011, 2014, 2016  J. Ali Harlow <ali@juiblex.co.uk>
ali@0
     5
 *
ali@0
     6
 * This program is free software; you can redistribute it and/or modify
ali@0
     7
 * it under the terms of the GNU General Public License as published by
ali@0
     8
 * the Free Software Foundation; either version 2 of the License, or
ali@0
     9
 * (at your option) any later version.
ali@0
    10
 *
ali@0
    11
 * This program is distributed in the hope that it will be useful,
ali@0
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@0
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@0
    14
 * GNU General Public License for more details.
ali@0
    15
 *
ali@0
    16
 * You should have received a copy of the GNU General Public License along
ali@0
    17
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@0
    18
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@0
    19
 */
ali@0
    20
ali@0
    21
#define _GNU_SOURCE
ali@0
    22
ali@0
    23
#include <string.h>
ali@0
    24
#include <stdio.h>
ali@0
    25
#include <stdint.h>
ali@0
    26
#include <sys/stat.h>
ali@0
    27
#include <unistd.h>
ali@0
    28
#include <fcntl.h>
ali@0
    29
#include <errno.h>
ali@0
    30
ali@24
    31
#include <glib.h>
ali@0
    32
#include <expat.h>
ali@0
    33
#include <zlib.h>
ali@0
    34
#include <razor.h>
ali@44
    35
#include "plover/plover.h"
ali@44
    36
#include "plover/uri-handler.h"
ali@61
    37
#include "plover/inputstream.h"
ali@0
    38
ali@0
    39
/* Import a yum filelist as a razor package set. */
ali@0
    40
ali@0
    41
enum {
ali@0
    42
	YUM_STATE_BEGIN,
ali@0
    43
	YUM_STATE_PACKAGE_NAME,
ali@0
    44
	YUM_STATE_PACKAGE_ARCH,
ali@0
    45
	YUM_STATE_SUMMARY,
ali@0
    46
	YUM_STATE_DESCRIPTION,
ali@0
    47
	YUM_STATE_URL,
ali@0
    48
	YUM_STATE_LICENSE,
ali@0
    49
	YUM_STATE_CHECKSUM,
ali@0
    50
	YUM_STATE_REQUIRES,
ali@0
    51
	YUM_STATE_PROVIDES,
ali@0
    52
	YUM_STATE_OBSOLETES,
ali@0
    53
	YUM_STATE_CONFLICTS,
ali@13
    54
	YUM_STATE_SKIPPING_PACKAGE,
ali@0
    55
	YUM_STATE_FILE
ali@0
    56
};
ali@0
    57
ali@0
    58
struct yum_context {
ali@0
    59
	XML_Parser primary_parser;
ali@0
    60
	XML_Parser filelists_parser;
ali@0
    61
	XML_Parser current_parser;
ali@0
    62
ali@0
    63
	struct razor_importer *importer;
ali@0
    64
	struct import_property_context *current_property_context;
ali@55
    65
	const char *base_uri;
ali@55
    66
	GTree *uris;
ali@0
    67
	char name[256], arch[64], summary[512], description[4096];
ali@0
    68
	char url[256], license[64], buffer[512], *p;
ali@55
    69
	char pkgid[128], evr[128];
ali@0
    70
	uint32_t property_type;
ali@0
    71
	int state;
ali@0
    72
ali@0
    73
	int total, current;
ali@0
    74
};
ali@0
    75
ali@0
    76
static uint32_t
ali@0
    77
yum_to_razor_relation (const char *flags)
ali@0
    78
{
ali@0
    79
	if (flags[0] == 'L') {
ali@0
    80
		if (flags[1] == 'T')
ali@0
    81
			return RAZOR_PROPERTY_LESS;
ali@0
    82
		else
ali@0
    83
			return RAZOR_PROPERTY_LESS | RAZOR_PROPERTY_EQUAL;
ali@0
    84
	} else if (flags[0] == 'G') {
ali@0
    85
		if (flags[1] == 'T')
ali@0
    86
			return RAZOR_PROPERTY_GREATER;
ali@0
    87
		else
ali@0
    88
			return RAZOR_PROPERTY_GREATER | RAZOR_PROPERTY_EQUAL;
ali@0
    89
	} else
ali@0
    90
		return RAZOR_PROPERTY_EQUAL;
ali@0
    91
}
ali@0
    92
ali@0
    93
static void
ali@0
    94
yum_primary_start_element(void *data, const char *name, const char **atts)
ali@0
    95
{
ali@0
    96
	struct yum_context *ctx = data;
ali@0
    97
	const char *n, *epoch, *version, *release;
ali@0
    98
	char buffer[128];
ali@55
    99
	char *s;
ali@55
   100
	gchar *nevra;
ali@0
   101
	uint32_t pre, relation, flags;
ali@0
   102
	int i;
ali@0
   103
ali@13
   104
	if (ctx->state == YUM_STATE_SKIPPING_PACKAGE)
ali@13
   105
		return;
ali@13
   106
ali@0
   107
	if (strcmp(name, "metadata") == 0) {
ali@0
   108
		for (i = 0; atts[i]; i += 2) {
ali@0
   109
			if (strcmp(atts[i], "packages") == 0)
ali@0
   110
				ctx->total = atoi(atts[i + 1]);
ali@0
   111
		}
ali@9
   112
	} else if (strcmp(name, "package") == 0) {
ali@9
   113
		*ctx->name=*ctx->arch=*ctx->summary=*ctx->description='\0';
ali@9
   114
		*ctx->url=*ctx->license='\0';
ali@0
   115
	} else if (strcmp(name, "name") == 0) {
ali@0
   116
		ctx->state = YUM_STATE_PACKAGE_NAME;
ali@0
   117
		ctx->p = ctx->name;
ali@0
   118
	} else if (strcmp(name, "arch") == 0) {
ali@0
   119
		ctx->state = YUM_STATE_PACKAGE_ARCH;
ali@0
   120
		ctx->p = ctx->arch;
ali@0
   121
	} else if (strcmp(name, "version") == 0) {
ali@0
   122
		epoch = NULL;
ali@0
   123
		version = NULL;
ali@0
   124
		release = NULL;
ali@0
   125
		for (i = 0; atts[i]; i += 2) {
ali@0
   126
			if (strcmp(atts[i], "epoch") == 0)
ali@0
   127
				epoch = atts[i + 1];
ali@0
   128
			else if (strcmp(atts[i], "ver") == 0)
ali@0
   129
				version = atts[i + 1];
ali@0
   130
			else if (strcmp(atts[i], "rel") == 0)
ali@0
   131
				release = atts[i + 1];
ali@0
   132
		}
ali@0
   133
		if (version == NULL || release == NULL) {
ali@0
   134
			fprintf(stderr, "invalid version tag, "
ali@0
   135
				"missing version or  release attribute\n");
ali@0
   136
			return;
ali@0
   137
		}
ali@0
   138
ali@55
   139
		razor_build_evr(ctx->evr, sizeof ctx->evr, epoch, version,
ali@55
   140
				release);
ali@13
   141
		if (!strcmp(ctx->arch, "noarch") ||
ali@13
   142
		    !strcmp(ctx->arch, razor_system_arch())) {
ali@13
   143
			razor_importer_begin_package(ctx->importer, ctx->name,
ali@55
   144
						     ctx->evr, ctx->arch);
ali@13
   145
		} else
ali@13
   146
			ctx->state = YUM_STATE_SKIPPING_PACKAGE;
ali@0
   147
	} else if (strcmp(name, "summary") == 0) {
ali@0
   148
		ctx->p = ctx->summary;
ali@0
   149
		ctx->state = YUM_STATE_SUMMARY;
ali@0
   150
	} else if (strcmp(name, "description") == 0) {
ali@0
   151
		ctx->p = ctx->description;
ali@0
   152
		ctx->state = YUM_STATE_DESCRIPTION;
ali@0
   153
	} else if (strcmp(name, "url") == 0) {
ali@0
   154
		ctx->p = ctx->url;
ali@0
   155
		ctx->state = YUM_STATE_URL;
ali@0
   156
	} else if (strcmp(name, "checksum") == 0) {
ali@0
   157
		ctx->p = ctx->pkgid;
ali@0
   158
		ctx->state = YUM_STATE_CHECKSUM;
ali@55
   159
	} else if (strcmp(name, "location") == 0) {
ali@55
   160
		if (ctx->state != YUM_STATE_SKIPPING_PACKAGE) {
ali@55
   161
		    for (i = 0; atts[i]; i += 2)
ali@55
   162
			if (strcmp(atts[i], "href") == 0) {
ali@55
   163
			    nevra=g_strconcat(ctx->name,"-",ctx->evr,".",
ali@55
   164
			      ctx->arch,NULL);
ali@55
   165
			    s=razor_path_relative_to_uri(ctx->base_uri,
ali@55
   166
			      atts[i + 1],NULL);
ali@55
   167
			    g_tree_insert(ctx->uris,nevra,g_strdup(s));
ali@55
   168
			    free(s);
ali@55
   169
			    break;
ali@55
   170
			}
ali@55
   171
		}
ali@0
   172
	} else if (strcmp(name, "rpm:license") == 0) {
ali@0
   173
		ctx->p = ctx->license;
ali@0
   174
		ctx->state = YUM_STATE_LICENSE;
ali@0
   175
	} else if (strcmp(name, "rpm:requires") == 0) {
ali@0
   176
		ctx->state = YUM_STATE_REQUIRES;
ali@0
   177
		ctx->property_type = RAZOR_PROPERTY_REQUIRES;
ali@0
   178
	} else if (strcmp(name, "rpm:provides") == 0) {
ali@0
   179
		ctx->state = YUM_STATE_PROVIDES;
ali@0
   180
		ctx->property_type = RAZOR_PROPERTY_PROVIDES;
ali@0
   181
	} else if (strcmp(name, "rpm:obsoletes") == 0) {
ali@0
   182
		ctx->state = YUM_STATE_OBSOLETES;
ali@0
   183
		ctx->property_type = RAZOR_PROPERTY_OBSOLETES;
ali@0
   184
	} else if (strcmp(name, "rpm:conflicts") == 0) {
ali@0
   185
		ctx->state = YUM_STATE_CONFLICTS;
ali@0
   186
		ctx->property_type = RAZOR_PROPERTY_CONFLICTS;
ali@0
   187
	} else if (strcmp(name, "rpm:entry") == 0 &&
ali@0
   188
		   ctx->state != YUM_STATE_BEGIN) {
ali@0
   189
		n = NULL;
ali@0
   190
		epoch = NULL;
ali@0
   191
		version = NULL;
ali@0
   192
		release = NULL;
ali@0
   193
		relation = RAZOR_PROPERTY_EQUAL;
ali@0
   194
		pre = 0;
ali@0
   195
		for (i = 0; atts[i]; i += 2) {
ali@0
   196
			if (strcmp(atts[i], "name") == 0)
ali@0
   197
				n = atts[i + 1];
ali@0
   198
			else if (strcmp(atts[i], "epoch") == 0)
ali@0
   199
				epoch = atts[i + 1];
ali@0
   200
			else if (strcmp(atts[i], "ver") == 0)
ali@0
   201
				version = atts[i + 1];
ali@0
   202
			else if (strcmp(atts[i], "rel") == 0)
ali@0
   203
				release = atts[i + 1];
ali@0
   204
			else if (strcmp(atts[i], "flags") == 0)
ali@0
   205
				relation = yum_to_razor_relation(atts[i + 1]);
ali@0
   206
			else if (strcmp(atts[i], "pre") == 0)
ali@19
   207
				pre = RAZOR_PROPERTY_PRE;
ali@0
   208
		}
ali@0
   209
ali@0
   210
		if (n == NULL) {
ali@0
   211
			fprintf(stderr, "invalid rpm:entry, "
ali@0
   212
				"missing name or version attributes\n");
ali@0
   213
			return;
ali@0
   214
		}
ali@0
   215
ali@0
   216
		razor_build_evr(buffer, sizeof buffer, epoch, version, release);
ali@0
   217
		flags = ctx->property_type | relation | pre;
ali@0
   218
		razor_importer_add_property(ctx->importer, n, flags, buffer);
ali@0
   219
	}
ali@0
   220
}
ali@0
   221
ali@0
   222
static void
ali@0
   223
yum_primary_end_element (void *data, const char *name)
ali@0
   224
{
ali@0
   225
	struct yum_context *ctx = data;
ali@0
   226
ali@0
   227
	switch (ctx->state) {
ali@0
   228
	case YUM_STATE_PACKAGE_NAME:
ali@0
   229
	case YUM_STATE_PACKAGE_ARCH:
ali@0
   230
	case YUM_STATE_SUMMARY:
ali@0
   231
	case YUM_STATE_DESCRIPTION:
ali@0
   232
	case YUM_STATE_URL:
ali@0
   233
	case YUM_STATE_LICENSE:
ali@0
   234
	case YUM_STATE_CHECKSUM:
ali@0
   235
	case YUM_STATE_FILE:
ali@0
   236
		ctx->state = YUM_STATE_BEGIN;
ali@0
   237
		break;
ali@0
   238
	}
ali@0
   239
ali@0
   240
	if (strcmp(name, "package") == 0) {
ali@13
   241
		if (ctx->state != YUM_STATE_SKIPPING_PACKAGE)
ali@13
   242
			razor_importer_add_details(ctx->importer, ctx->summary,
ali@13
   243
						   ctx->description, ctx->url,
ali@13
   244
						   ctx->license);
ali@0
   245
ali@0
   246
		XML_StopParser(ctx->current_parser, XML_TRUE);
ali@0
   247
		ctx->current_parser = ctx->filelists_parser;
ali@0
   248
	}
ali@0
   249
}
ali@0
   250
ali@0
   251
static void
ali@0
   252
yum_character_data (void *data, const XML_Char *s, int len)
ali@0
   253
{
ali@0
   254
	struct yum_context *ctx = data;
ali@0
   255
ali@0
   256
	switch (ctx->state) {
ali@0
   257
	case YUM_STATE_PACKAGE_NAME:
ali@0
   258
	case YUM_STATE_PACKAGE_ARCH:
ali@0
   259
	case YUM_STATE_SUMMARY:
ali@0
   260
	case YUM_STATE_DESCRIPTION:
ali@0
   261
	case YUM_STATE_URL:
ali@0
   262
	case YUM_STATE_LICENSE:
ali@0
   263
	case YUM_STATE_CHECKSUM:
ali@0
   264
	case YUM_STATE_FILE:
ali@0
   265
		memcpy(ctx->p, s, len);
ali@0
   266
		ctx->p += len;
ali@0
   267
		*ctx->p = '\0';
ali@0
   268
		break;
ali@0
   269
	}
ali@0
   270
}
ali@0
   271
ali@0
   272
static void
ali@0
   273
yum_filelists_start_element(void *data, const char *name, const char **atts)
ali@0
   274
{
ali@0
   275
	struct yum_context *ctx = data;
ali@0
   276
	const char *pkg, *pkgid;
ali@0
   277
	int i;
ali@0
   278
ali@13
   279
	if (strcmp(name, "package") == 0 &&
ali@13
   280
	    ctx->state != YUM_STATE_SKIPPING_PACKAGE) {
ali@0
   281
		pkg = NULL;
ali@0
   282
		pkgid = NULL;
ali@0
   283
		for (i = 0; atts[i]; i += 2) {
ali@0
   284
			if (strcmp(atts[i], "name") == 0)
ali@0
   285
				pkg = atts[i + 1];
ali@0
   286
			else if (strcmp(atts[i], "pkgid") == 0)
ali@0
   287
				pkgid = atts[i + 1];
ali@0
   288
		}
ali@0
   289
		if (strcmp(pkgid, ctx->pkgid) != 0)
ali@0
   290
			fprintf(stderr, "primary.xml and filelists.xml "
ali@0
   291
				"mismatch for %s: %s vs %s",
ali@0
   292
				pkg, pkgid, ctx->pkgid);
ali@0
   293
	} else if (strcmp(name, "file") == 0) {
ali@13
   294
		if (ctx->state != YUM_STATE_SKIPPING_PACKAGE)
ali@13
   295
			ctx->state = YUM_STATE_FILE;
ali@0
   296
		ctx->p = ctx->buffer;
ali@0
   297
	}
ali@0
   298
}
ali@0
   299
ali@0
   300
static void
ali@0
   301
yum_filelists_end_element (void *data, const char *name)
ali@0
   302
{
ali@0
   303
	struct yum_context *ctx = data;
ali@0
   304
ali@0
   305
	if (strcmp(name, "package") == 0) {
ali@0
   306
		XML_StopParser(ctx->current_parser, XML_TRUE);
ali@0
   307
		ctx->current_parser = ctx->primary_parser;
ali@13
   308
		if (ctx->state != YUM_STATE_SKIPPING_PACKAGE)
ali@13
   309
			razor_importer_finish_package(ctx->importer);
ali@13
   310
		ctx->state = YUM_STATE_BEGIN;
ali@13
   311
	} else if (strcmp(name, "file") == 0) {
ali@13
   312
		if (ctx->state != YUM_STATE_SKIPPING_PACKAGE)
ali@13
   313
			razor_importer_add_file(ctx->importer, ctx->buffer);
ali@13
   314
	}
ali@13
   315
	if (ctx->state != YUM_STATE_SKIPPING_PACKAGE)
ali@13
   316
		ctx->state = YUM_STATE_BEGIN;
ali@13
   317
}
ali@0
   318
ali@13
   319
static int plover_system_arch_is_x86(void)
ali@13
   320
{
ali@13
   321
    const char *arch=razor_system_arch();
ali@13
   322
    if (!arch || arch[0]!='i' || arch[1]<'3' || arch[1]>'6')
ali@13
   323
	return 0;
ali@13
   324
    else
ali@13
   325
	return !strcmp(arch+2,"86");
ali@0
   326
}
ali@0
   327
ali@0
   328
#define XML_BUFFER_SIZE 4096
ali@0
   329
ali@55
   330
PloverRepository *plover_repository_new_from_yum_uri(const char *base_uri,
ali@24
   331
  GError **error)
ali@0
   332
{
ali@24
   333
    struct yum_context ctx;
ali@55
   334
    gchar *s,**rpm_uris;
ali@55
   335
    GPtrArray *uris;
ali@55
   336
    char *uri;
ali@55
   337
    const char *name,*version,*arch;
ali@24
   338
    void *buf;
ali@43
   339
    gssize len;
ali@61
   340
    GInputStream *stream;
ali@43
   341
    GInputStream *primary,*filelists;
ali@43
   342
    GZlibDecompressor *decompressor;
ali@24
   343
    XML_ParsingStatus status;
ali@55
   344
    struct razor_set *razor;
ali@55
   345
    struct razor_package_iterator *iter;
ali@55
   346
    struct razor_package *pkg;
ali@55
   347
    PloverPackageSet *set;
ali@55
   348
    PloverRepository *repository;
ali@71
   349
    g_return_val_if_fail(plover__uri_validate(base_uri),NULL);
ali@44
   350
    plover__uri_handler_init();
ali@24
   351
    ctx.importer=razor_importer_create();
ali@24
   352
    ctx.state=YUM_STATE_BEGIN;
ali@55
   353
    ctx.base_uri=base_uri;
ali@24
   354
    ctx.primary_parser=XML_ParserCreate(NULL);
ali@24
   355
    XML_SetUserData(ctx.primary_parser,&ctx);
ali@24
   356
    XML_SetElementHandler(ctx.primary_parser,yum_primary_start_element,
ali@24
   357
      yum_primary_end_element);
ali@24
   358
    XML_SetCharacterDataHandler(ctx.primary_parser,yum_character_data);
ali@24
   359
    ctx.filelists_parser=XML_ParserCreate(NULL);
ali@24
   360
    XML_SetUserData(ctx.filelists_parser,&ctx);
ali@24
   361
    XML_SetElementHandler(ctx.filelists_parser,yum_filelists_start_element,
ali@24
   362
      yum_filelists_end_element);
ali@24
   363
    XML_SetCharacterDataHandler(ctx.filelists_parser,yum_character_data);
ali@55
   364
    uri=razor_path_relative_to_uri(base_uri,"repodata/primary.xml.gz",NULL);
ali@61
   365
    stream=plover_razor_input_stream_new(uri,error);
ali@55
   366
    free(uri);
ali@55
   367
    if (!stream) {
ali@55
   368
	XML_ParserFree(ctx.primary_parser);
ali@55
   369
	XML_ParserFree(ctx.filelists_parser);
ali@24
   370
	return NULL;
ali@55
   371
    }
ali@43
   372
    decompressor=g_zlib_decompressor_new(G_ZLIB_COMPRESSOR_FORMAT_GZIP);
ali@43
   373
    primary=g_converter_input_stream_new(G_INPUT_STREAM(stream),
ali@43
   374
      G_CONVERTER(decompressor));
ali@43
   375
    g_object_unref(stream);
ali@43
   376
    g_object_unref(decompressor);
ali@55
   377
    uri=razor_path_relative_to_uri(base_uri,"repodata/filelists.xml.gz",NULL);
ali@61
   378
    stream=plover_razor_input_stream_new(uri,error);
ali@55
   379
    free(uri);
ali@55
   380
    if (!stream) {
ali@61
   381
	g_object_unref(primary);
ali@55
   382
	XML_ParserFree(ctx.primary_parser);
ali@55
   383
	XML_ParserFree(ctx.filelists_parser);
ali@24
   384
	return NULL;
ali@55
   385
    }
ali@43
   386
    decompressor=g_zlib_decompressor_new(G_ZLIB_COMPRESSOR_FORMAT_GZIP);
ali@43
   387
    filelists=g_converter_input_stream_new(G_INPUT_STREAM(stream),
ali@43
   388
      G_CONVERTER(decompressor));
ali@43
   389
    g_object_unref(stream);
ali@43
   390
    g_object_unref(decompressor);
ali@24
   391
    ctx.current_parser=ctx.primary_parser;
ali@55
   392
    ctx.uris=g_tree_new_full((GCompareDataFunc)strcmp,NULL,g_free,NULL);
ali@24
   393
    ctx.current=0;
ali@24
   394
    do
ali@24
   395
    {
ali@24
   396
	XML_GetParsingStatus(ctx.current_parser,&status);
ali@24
   397
	switch (status.parsing)
ali@24
   398
	{
ali@24
   399
	    case XML_SUSPENDED:
ali@24
   400
		XML_ResumeParser(ctx.current_parser);
ali@24
   401
		break;
ali@24
   402
	    case XML_PARSING:
ali@24
   403
	    case XML_INITIALIZED:
ali@24
   404
		buf=XML_GetBuffer(ctx.current_parser,XML_BUFFER_SIZE);
ali@24
   405
		if (ctx.current_parser==ctx.primary_parser)
ali@43
   406
		    len=g_input_stream_read(G_INPUT_STREAM(primary),buf,
ali@43
   407
		      XML_BUFFER_SIZE,NULL,error);
ali@24
   408
		else
ali@43
   409
		    len=g_input_stream_read(G_INPUT_STREAM(filelists),buf,
ali@43
   410
		      XML_BUFFER_SIZE,NULL,error);
ali@24
   411
		if (len<0)
ali@24
   412
		    return NULL;
ali@24
   413
		XML_ParseBuffer(ctx.current_parser,len,!len);
ali@24
   414
		break;
ali@24
   415
	    case XML_FINISHED:
ali@24
   416
		break;
ali@24
   417
	}
ali@24
   418
    } while (status.parsing!=XML_FINISHED);
ali@24
   419
    XML_ParserFree(ctx.primary_parser);
ali@24
   420
    XML_ParserFree(ctx.filelists_parser);
ali@43
   421
    g_object_unref(primary);
ali@43
   422
    g_object_unref(filelists);
ali@55
   423
    razor=razor_importer_finish(ctx.importer);
ali@24
   424
#if RAZOR_HEADER_VERSION_MIN<=1
ali@24
   425
    /*
ali@24
   426
     * Header version 1 is supported by plover v0.3 and is used on
ali@24
   427
     * 32-bit intel machines which allows the setup and update
ali@24
   428
     * applications from v0.3 to work. On other machines, we don't
ali@24
   429
     * want these old applications to work (since they would do
ali@24
   430
     * the wrong thing) and so we use the current header version
ali@24
   431
     * which they don't support.
ali@24
   432
     */
ali@24
   433
    if (plover_system_arch_is_x86())
ali@55
   434
	razor_set_set_header_version(razor,1);
ali@13
   435
#endif
ali@55
   436
    uris=g_ptr_array_new();
ali@55
   437
    iter=razor_package_iterator_create(razor);
ali@55
   438
    while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_NAME,&name,
ali@55
   439
      RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,RAZOR_DETAIL_LAST))
ali@55
   440
    {
ali@55
   441
	s=g_strconcat(name,"-",version,".",arch,NULL);
ali@55
   442
	g_ptr_array_add(uris,g_tree_lookup(ctx.uris,s));
ali@55
   443
	g_free(s);
ali@55
   444
    }
ali@55
   445
    razor_package_iterator_destroy(iter);
ali@55
   446
    g_ptr_array_add(uris,NULL);
ali@55
   447
    g_tree_unref(ctx.uris);
ali@55
   448
    rpm_uris=(gchar **)g_ptr_array_free(uris,FALSE);
ali@55
   449
    set=plover_package_set_new_from_razor(razor);
ali@55
   450
    razor_set_unref(razor);
ali@55
   451
    repository=plover_repository_new_from_package_set(set,
ali@55
   452
      (const char **)rpm_uris);
ali@55
   453
    g_object_unref(set);
ali@55
   454
    g_strfreev(rpm_uris);
ali@55
   455
    return repository;
ali@55
   456
}
ali@55
   457
ali@55
   458
struct razor_set *plover_razor_set_create_from_yum_uri(const char *base_uri,
ali@55
   459
  GError **error)
ali@55
   460
{
ali@55
   461
    PloverRepository *repository;
ali@55
   462
    PloverPackageSet *set;
ali@55
   463
    struct razor_set *razor;
ali@71
   464
    g_return_val_if_fail(plover__uri_validate(base_uri),NULL);
ali@55
   465
    repository=plover_repository_new_from_yum_uri(base_uri,error);
ali@55
   466
    if (!repository)
ali@55
   467
	return NULL;
ali@55
   468
    set=plover_repository_get_package_set(repository);
ali@55
   469
    razor=plover_package_set_get_razor(set);
ali@55
   470
    razor_set_ref(razor);
ali@55
   471
    g_object_unref(repository);
ali@55
   472
    return razor;
ali@0
   473
}
ali@43
   474
ali@43
   475
struct razor_set *plover_razor_set_create_from_yum(const char *base,
ali@43
   476
  GError **error)
ali@43
   477
{
ali@43
   478
    gchar *base_uri;
ali@43
   479
    GFile *file;
ali@43
   480
    struct razor_set *set;
ali@43
   481
    file=g_file_new_for_path(base);
ali@43
   482
    base_uri=g_file_get_uri(file);
ali@43
   483
    g_object_unref(file);
ali@43
   484
    set=plover_razor_set_create_from_yum_uri(base_uri,error);
ali@43
   485
    g_free(base_uri);
ali@43
   486
    return set;
ali@43
   487
}