plover/repository.c
author J. Ali Harlow <ali@juiblex.co.uk>
Wed Jun 22 17:04:28 2016 +0100 (2016-06-22)
changeset 44 43ffed8669ce
parent 43 6b3034a884dc
child 50 a4f43ad0e0c8
permissions -rw-r--r--
Port to razor 0.6.3.60
ali@24
     1
/*
ali@24
     2
 * Copyright (C) 2014  J. Ali Harlow <ali@juiblex.co.uk>
ali@24
     3
 *
ali@24
     4
 * This program is free software; you can redistribute it and/or modify
ali@24
     5
 * it under the terms of the GNU General Public License as published by
ali@24
     6
 * the Free Software Foundation; either version 2 of the License, or
ali@24
     7
 * (at your option) any later version.
ali@24
     8
 *
ali@24
     9
 * This program is distributed in the hope that it will be useful,
ali@24
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@24
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@24
    12
 * GNU General Public License for more details.
ali@24
    13
 *
ali@24
    14
 * You should have received a copy of the GNU General Public License along
ali@24
    15
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@24
    16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@24
    17
 */
ali@24
    18
ali@24
    19
#include "config.h"
ali@24
    20
#include <stdlib.h>
ali@24
    21
#include <string.h>
ali@24
    22
#include <glib-object.h>
ali@24
    23
#include <razor.h>
ali@24
    24
#include <plover/plover.h>
ali@24
    25
#include <plover/repository.h>
ali@44
    26
#include "plover/uri-handler.h"
ali@24
    27
ali@24
    28
G_DEFINE_TYPE(PloverRepository,plover_repository,G_TYPE_OBJECT);
ali@24
    29
ali@24
    30
typedef struct _PloverRepositoryPrivate {
ali@24
    31
    PloverPackageSet *set;
ali@42
    32
    gchar **uris;
ali@24
    33
} PloverRepositoryPrivate;
ali@24
    34
ali@24
    35
#define PLOVER_REPOSITORY_GET_PRIVATE(obj)\
ali@24
    36
				G_TYPE_INSTANCE_GET_PRIVATE(obj,\
ali@24
    37
				  PLOVER_TYPE_REPOSITORY,\
ali@24
    38
				  PloverRepositoryPrivate)
ali@24
    39
ali@24
    40
static void plover_repository_finalize(GObject *obj)
ali@24
    41
{
ali@24
    42
    PloverRepositoryPrivate *priv=PLOVER_REPOSITORY_GET_PRIVATE(obj);
ali@42
    43
    g_strfreev(priv->uris);
ali@24
    44
    if (G_OBJECT_CLASS(plover_repository_parent_class)->finalize)
ali@24
    45
	G_OBJECT_CLASS(plover_repository_parent_class)->finalize(obj);
ali@24
    46
}
ali@24
    47
ali@24
    48
static void plover_repository_dispose(GObject *obj)
ali@24
    49
{
ali@24
    50
    PloverRepositoryPrivate *priv=PLOVER_REPOSITORY_GET_PRIVATE(obj);
ali@24
    51
    g_clear_object(&priv->set);
ali@24
    52
    if (G_OBJECT_CLASS(plover_repository_parent_class)->dispose)
ali@24
    53
	G_OBJECT_CLASS(plover_repository_parent_class)->dispose(obj);
ali@24
    54
}
ali@24
    55
ali@24
    56
static void plover_repository_class_init(PloverRepositoryClass *klass)
ali@24
    57
{
ali@44
    58
    plover__uri_handler_init();
ali@24
    59
    GObjectClass *oclass=G_OBJECT_CLASS(klass);
ali@24
    60
    oclass->finalize=plover_repository_finalize;
ali@24
    61
    oclass->dispose=plover_repository_dispose;
ali@24
    62
    g_type_class_add_private(klass,sizeof(PloverRepositoryPrivate));
ali@24
    63
}
ali@24
    64
ali@24
    65
static void plover_repository_init(PloverRepository *repository)
ali@24
    66
{
ali@24
    67
}
ali@24
    68
ali@24
    69
PloverRepository *plover_repository_new_from_files(const char **filenames,
ali@24
    70
  GError **error)
ali@24
    71
{
ali@42
    72
    int i;
ali@24
    73
    PloverPackageSet *set;
ali@24
    74
    PloverRepository *repository;
ali@24
    75
    PloverRepositoryPrivate *priv;
ali@42
    76
    GFile *file;
ali@42
    77
    gchar *uri;
ali@24
    78
    set=plover_package_set_new_from_rpms(filenames,error);
ali@24
    79
    if (!set)
ali@24
    80
	return NULL;
ali@24
    81
    repository=g_object_new(PLOVER_TYPE_REPOSITORY,NULL);
ali@24
    82
    priv=PLOVER_REPOSITORY_GET_PRIVATE(repository);
ali@42
    83
    priv->uris=g_new(char *,g_strv_length((char **)filenames)+1);
ali@42
    84
    for(i=0;filenames[i];i++)
ali@42
    85
    {
ali@42
    86
	file=g_file_new_for_path(filenames[i]);
ali@42
    87
	priv->uris[i]=g_file_get_uri(file);
ali@42
    88
	g_object_unref(file);
ali@42
    89
    }
ali@42
    90
    priv->uris[i]=NULL;
ali@24
    91
    priv->set=set;
ali@24
    92
    return repository;
ali@24
    93
}
ali@24
    94
ali@24
    95
static char *rpm_filename(const char *name,const char *version,const char *arch)
ali@24
    96
{
ali@24
    97
    const char *v;
ali@24
    98
    v=strchr(version,':');            /* Skip epoch */
ali@24
    99
    if (v)
ali@24
   100
	v++;
ali@24
   101
    else
ali@24
   102
	v=version;
ali@24
   103
    return g_strconcat(name,"-",v,".",arch,".rpm",NULL);
ali@24
   104
}
ali@24
   105
ali@43
   106
PloverRepository *plover_repository_new_from_yum_uri(const char *base_uri,
ali@24
   107
  GError **error)
ali@24
   108
{
ali@24
   109
    char *s;
ali@24
   110
    const char *name,*version,*arch;
ali@42
   111
    GPtrArray *uris;
ali@24
   112
    struct razor_set *imported;
ali@24
   113
    struct razor_package *package;
ali@24
   114
    struct razor_package_iterator *pi;
ali@24
   115
    PloverPackageSet *set;
ali@24
   116
    PloverRepository *repository;
ali@24
   117
    PloverRepositoryPrivate *priv;
ali@43
   118
    imported=plover_razor_set_create_from_yum_uri(base_uri,error);
ali@24
   119
    if (!imported)
ali@24
   120
	return NULL;
ali@24
   121
    set=plover_package_set_new_from_razor(imported);
ali@24
   122
    razor_set_unref(imported);
ali@24
   123
    repository=g_object_new(PLOVER_TYPE_REPOSITORY,NULL);
ali@24
   124
    priv=PLOVER_REPOSITORY_GET_PRIVATE(repository);
ali@42
   125
    uris=g_ptr_array_new();
ali@24
   126
    pi=razor_package_iterator_create(plover_package_set_get_razor(set));
ali@24
   127
    while (razor_package_iterator_next(pi,&package,RAZOR_DETAIL_NAME,&name,
ali@24
   128
      RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,RAZOR_DETAIL_LAST))
ali@24
   129
    {
ali@24
   130
	s=rpm_filename(name,version,arch);
ali@43
   131
	g_ptr_array_add(uris,g_build_filename(base_uri,"rpms",s,NULL));
ali@24
   132
	free(s);
ali@24
   133
    }
ali@24
   134
    razor_package_iterator_destroy(pi);
ali@42
   135
    g_ptr_array_add(uris,NULL);
ali@42
   136
    priv->uris=(gchar **)g_ptr_array_free(uris,FALSE);
ali@24
   137
    priv->set=set;
ali@43
   138
    return repository;
ali@43
   139
}
ali@43
   140
ali@43
   141
PloverRepository *plover_repository_new_from_yum(const char *base,
ali@43
   142
  GError **error)
ali@43
   143
{
ali@43
   144
    PloverRepository *repository;
ali@43
   145
    gchar *base_uri;
ali@43
   146
    GFile *file;
ali@43
   147
    file=g_file_new_for_path(base);
ali@43
   148
    base_uri=g_file_get_uri(file);
ali@43
   149
    g_object_unref(file);
ali@43
   150
    repository=plover_repository_new_from_yum_uri(base_uri,error);
ali@43
   151
    g_free(base_uri);
ali@24
   152
    return repository;
ali@24
   153
}
ali@24
   154
ali@24
   155
PloverPackageSet *
ali@24
   156
  plover_repository_get_package_set(PloverRepository *repository)
ali@24
   157
{
ali@24
   158
    PloverRepositoryPrivate *priv;
ali@24
   159
    g_return_val_if_fail(PLOVER_IS_REPOSITORY(repository),NULL);
ali@24
   160
    priv=PLOVER_REPOSITORY_GET_PRIVATE(repository);
ali@24
   161
    return priv->set;
ali@24
   162
}
ali@24
   163
ali@24
   164
struct razor_rpm *plover_repository_open_rpm(PloverRepository *repository,
ali@24
   165
  PloverPackage *package,GError **error)
ali@24
   166
{
ali@24
   167
    int nth;
ali@24
   168
    struct razor_rpm *rpm;
ali@24
   169
    struct razor_error *tmp_error=NULL;
ali@24
   170
    PloverRepositoryPrivate *priv;
ali@24
   171
    PloverPackage *internal;
ali@24
   172
    g_return_val_if_fail(PLOVER_IS_REPOSITORY(repository),NULL);
ali@24
   173
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   174
    priv=PLOVER_REPOSITORY_GET_PRIVATE(repository);
ali@24
   175
    nth=g_slist_index(plover_package_set_get_packages(priv->set),package);
ali@24
   176
    if (nth<0)
ali@24
   177
    {
ali@24
   178
	internal=plover_package_set_find_matching(priv->set,package);
ali@24
   179
	nth=g_slist_index(plover_package_set_get_packages(priv->set),internal);
ali@24
   180
    }
ali@24
   181
    if (nth<0)
ali@24
   182
    {
ali@24
   183
	g_set_error(error,PLOVER_GENERAL_ERROR,
ali@24
   184
	  PLOVER_GENERAL_ERROR_NO_SUCH_PACKAGE,
ali@24
   185
	  "%s-%s.%s: Package not in repository",
ali@24
   186
	  plover_package_get_name(package),plover_package_get_version(package),
ali@24
   187
	  plover_package_get_arch(package));
ali@24
   188
	return NULL;
ali@24
   189
    }
ali@42
   190
    rpm=razor_rpm_open(priv->uris[nth],&tmp_error);
ali@24
   191
    if (!rpm)
ali@24
   192
	plover_propagate_razor_error(error,tmp_error);
ali@24
   193
    return rpm;
ali@24
   194
}