Port to razor 0.6.3.59
authorJ. Ali Harlow <ali@juiblex.co.uk>
Thu Jun 16 12:11:14 2016 +0100 (2016-06-16)
changeset 42419a02fa70db
parent 41 bd50a4b7ab68
child 43 6b3034a884dc
Port to razor 0.6.3.59
plover-gtk/transactionhelper.c
plover/fileio.c
plover/import-yum.c
plover/packageset.c
plover/razor.c
plover/repository.c
plover/transaction.c
tests/plover-gtk/test-transactionhelper.c
tests/plover/test-razor.c
tests/plover/test-transaction.c
     1.1 --- a/plover-gtk/transactionhelper.c	Tue Jun 14 12:39:53 2016 +0100
     1.2 +++ b/plover-gtk/transactionhelper.c	Thu Jun 16 12:11:14 2016 +0100
     1.3 @@ -95,6 +95,7 @@
     1.4  static void
     1.5    plover_transaction_helper_class_init(PloverTransactionHelperClass *klass)
     1.6  {
     1.7 +    plover__file_io_init();
     1.8      GObjectClass *gobject_class=G_OBJECT_CLASS(klass);
     1.9      gobject_class->finalize=
    1.10        (void (*)(GObject *))plover_transaction_helper_finalize;
     2.1 --- a/plover/fileio.c	Tue Jun 14 12:39:53 2016 +0100
     2.2 +++ b/plover/fileio.c	Thu Jun 16 12:11:14 2016 +0100
     2.3 @@ -17,6 +17,8 @@
     2.4   */
     2.5  
     2.6  #include <stdlib.h>
     2.7 +#include <string.h>
     2.8 +#include <errno.h>
     2.9  #include <razor.h>
    2.10  #include <glib.h>
    2.11  #include <gio/gio.h>
    2.12 @@ -25,6 +27,158 @@
    2.13  
    2.14  static GList *open_razor_files;
    2.15  
    2.16 +static gboolean has_valid_scheme(const char *uri)
    2.17 +{
    2.18 +    /*
    2.19 +     * RFC 2396 defines valid schemes as:
    2.20 +     * scheme = alpha *( alpha | digit | "+" | "-" | "." )
    2.21 +     */
    2.22 +    const char *s;
    2.23 +    if (!g_ascii_isalpha(*uri))
    2.24 +	return FALSE;
    2.25 +    for(s=uri+1;;s++)
    2.26 +	if (*s==':')
    2.27 +	    return TRUE;
    2.28 +	else if (!g_ascii_isalnum(*s) && *s!='+' && *s!='-' && *s!='.')
    2.29 +	    return FALSE;
    2.30 +}
    2.31 +
    2.32 +static GFile *file_for_uri(const char *uri)
    2.33 +{
    2.34 +    GFile *file;
    2.35 +    if (!has_valid_scheme(uri))
    2.36 +    {
    2.37 +	g_warning("%s: Not a valid URI",uri);
    2.38 +	file=g_file_new_for_path(uri);
    2.39 +    }
    2.40 +    else
    2.41 +    {
    2.42 +	if (strstr(uri+1,"file:/"))
    2.43 +	    g_warning("%s: Implausible URI",uri);
    2.44 +	file=g_file_new_for_uri(uri);
    2.45 +    }
    2.46 +    return file;
    2.47 +}
    2.48 +
    2.49 +int file_mkdir(const char *uri,mode_t mode,struct razor_error **error)
    2.50 +{
    2.51 +    GFile *file;
    2.52 +    GFileInfo *info;
    2.53 +    gchar *path;
    2.54 +    int retval;
    2.55 +    GError *err=NULL;
    2.56 +    g_message("file_mkdir(%s)",uri);
    2.57 +    file=file_for_uri(uri);
    2.58 +    path=g_file_get_path(file);
    2.59 +    if (path)
    2.60 +    {
    2.61 +	retval=razor_file_default_mkdir(path,mode,error);
    2.62 +	g_free(path);
    2.63 +    }
    2.64 +    else if (!g_file_make_directory(file,NULL,&err))
    2.65 +    {
    2.66 +	retval=-1;
    2.67 +	if (g_error_matches(err,G_IO_ERROR,G_IO_ERROR_EXISTS))
    2.68 +	{
    2.69 +	    info=g_file_query_info(file,G_FILE_ATTRIBUTE_STANDARD_TYPE,
    2.70 +	      G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,NULL,NULL);
    2.71 +	    if (info)
    2.72 +	    {
    2.73 +		g_clear_error(&err);
    2.74 +		if (g_file_info_get_file_type(info)==G_FILE_TYPE_DIRECTORY)
    2.75 +		    retval=0;
    2.76 +		else
    2.77 +		    razor_set_error(error,RAZOR_POSIX_ERROR,EEXIST,uri,
    2.78 +		      "Not a directory");
    2.79 +		g_object_unref(info);
    2.80 +	    }
    2.81 +	}
    2.82 +	if (err)
    2.83 +	    plover_propagate_g_error(error,err);
    2.84 +    }
    2.85 +    else
    2.86 +	retval=0;
    2.87 +    g_object_unref(file);
    2.88 +    return retval;
    2.89 +}
    2.90 +
    2.91 +int file_unlink(const char *uri,struct razor_error **error)
    2.92 +{
    2.93 +    GFile *file;
    2.94 +    gchar *path;
    2.95 +    int retval;
    2.96 +    GError *err=NULL;
    2.97 +    g_message("file_unlink(%s)",uri);
    2.98 +    file=file_for_uri(uri);
    2.99 +    path=g_file_get_path(file);
   2.100 +    if (path)
   2.101 +    {
   2.102 +	retval=razor_file_default_unlink(path,error);
   2.103 +	g_free(path);
   2.104 +    }
   2.105 +    else if (!g_file_delete(file,NULL,&err))
   2.106 +    {
   2.107 +	plover_propagate_g_error(error,err);
   2.108 +	retval=-1;
   2.109 +    }
   2.110 +    else
   2.111 +	retval=0;
   2.112 +    g_object_unref(file);
   2.113 +    return retval;
   2.114 +}
   2.115 +
   2.116 +int file_open(const char *uri,int flags,mode_t mode,struct razor_error **error)
   2.117 +{
   2.118 +    GFile *file;
   2.119 +    gchar *path;
   2.120 +    int retval;
   2.121 +    GError *err=NULL;
   2.122 +    g_message("file_open(%s)",uri);
   2.123 +    file=file_for_uri(uri);
   2.124 +    path=g_file_get_path(file);
   2.125 +    if (path)
   2.126 +    {
   2.127 +	retval=razor_file_default_open(path,flags,mode,error);
   2.128 +	g_free(path);
   2.129 +    }
   2.130 +    else
   2.131 +    {
   2.132 +	razor_set_error(error,RAZOR_GENERAL_ERROR,RAZOR_GENERAL_ERROR_FAILED,
   2.133 +	  uri,"File is not local");
   2.134 +	retval=-1;
   2.135 +    }
   2.136 +    g_object_unref(file);
   2.137 +    return retval;
   2.138 +}
   2.139 +
   2.140 +int file_move(const char *src_uri,const char *dst_uri,
   2.141 +  struct razor_error **error)
   2.142 +{
   2.143 +    GFile *src,*dst;
   2.144 +    gchar *src_path,*dst_path;
   2.145 +    int retval;
   2.146 +    GError *err=NULL;
   2.147 +    g_message("file_move(%s,%s)",src_uri,dst_uri);
   2.148 +    src=file_for_uri(src_uri);
   2.149 +    dst=file_for_uri(dst_uri);
   2.150 +    src_path=g_file_get_path(src);
   2.151 +    dst_path=g_file_get_path(dst);
   2.152 +    if (src_path && dst_path)
   2.153 +	retval=razor_file_default_move(src_path,dst_path,error);
   2.154 +    else if (!g_file_move(src,dst,G_FILE_COPY_OVERWRITE,NULL,NULL,NULL,&err))
   2.155 +    {
   2.156 +	plover_propagate_g_error(error,err);
   2.157 +	retval=-1;
   2.158 +    }
   2.159 +    else
   2.160 +	retval=0;
   2.161 +    g_free(src_path);
   2.162 +    g_free(dst_path);
   2.163 +    g_object_unref(src);
   2.164 +    g_object_unref(dst);
   2.165 +    return retval;
   2.166 +}
   2.167 +
   2.168  static void *file_get_contents(const char *uri,size_t *length,int private,
   2.169    struct razor_error **error)
   2.170  {
   2.171 @@ -35,7 +189,7 @@
   2.172      gsize len;
   2.173      GError *err=NULL;
   2.174      g_message("file_get_contents(%s)",uri);
   2.175 -    file=g_file_new_for_uri(uri);
   2.176 +    file=file_for_uri(uri);
   2.177      path=g_file_get_path(file);
   2.178      if (path)
   2.179      {
   2.180 @@ -80,15 +234,183 @@
   2.181      return retval;
   2.182  }
   2.183  
   2.184 +int file_is_directory(const char *uri,struct razor_error **error)
   2.185 +{
   2.186 +    GFile *file;
   2.187 +    GFileInfo *info;
   2.188 +    gchar *path;
   2.189 +    int retval;
   2.190 +    GError *err=NULL;
   2.191 +    g_message("file_is_directory(%s)",uri);
   2.192 +    file=file_for_uri(uri);
   2.193 +    path=g_file_get_path(file);
   2.194 +    if (path)
   2.195 +    {
   2.196 +	retval=razor_file_default_is_directory(path,error);
   2.197 +	g_free(path);
   2.198 +    }
   2.199 +    else
   2.200 +    {
   2.201 +	info=g_file_query_info(file,G_FILE_ATTRIBUTE_STANDARD_TYPE,
   2.202 +	  G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,NULL,&err);
   2.203 +	if (info)
   2.204 +	{
   2.205 +	    if (g_file_info_get_file_type(info)==G_FILE_TYPE_DIRECTORY)
   2.206 +		retval=1;
   2.207 +	    else
   2.208 +		retval=0;
   2.209 +	    g_object_unref(info);
   2.210 +	}
   2.211 +	else
   2.212 +	{
   2.213 +	    retval=-1;
   2.214 +	    plover_propagate_g_error(error,err);
   2.215 +	}
   2.216 +    }
   2.217 +    g_object_unref(file);
   2.218 +    return retval;
   2.219 +}
   2.220 +
   2.221 +char *file_mkdtemp_near(const char *uri,const char *template,
   2.222 +  struct razor_error **error)
   2.223 +{
   2.224 +    GFile *file;
   2.225 +    gchar *path,*tmpuri;
   2.226 +    char *tmppath,*retval;
   2.227 +    GError *err=NULL;
   2.228 +    g_message("file_mkdtemp_near(%s)",uri);
   2.229 +    file=file_for_uri(uri);
   2.230 +    path=g_file_get_path(file);
   2.231 +    g_object_unref(file);
   2.232 +    if (path)
   2.233 +    {
   2.234 +	tmppath=razor_file_default_mkdtemp_near(path,template,error);
   2.235 +	g_free(path);
   2.236 +	if (tmppath)
   2.237 +	{
   2.238 +	    file=g_file_new_for_path(tmppath);
   2.239 +	    tmpuri=g_file_get_uri(file);
   2.240 +	    g_object_unref(file);
   2.241 +	    retval=strdup(tmpuri);
   2.242 +	    g_free(tmpuri);
   2.243 +	}
   2.244 +	else
   2.245 +	    retval=NULL;
   2.246 +    }
   2.247 +    else
   2.248 +    {
   2.249 +	razor_set_error(error,RAZOR_GENERAL_ERROR,RAZOR_GENERAL_ERROR_FAILED,
   2.250 +	  uri,"File is not local");
   2.251 +	retval=NULL;
   2.252 +    }
   2.253 +    return retval;
   2.254 +}
   2.255 +
   2.256 +struct file_dir {
   2.257 +    void *razor_file_default;
   2.258 +    GFileEnumerator *enumerator;
   2.259 +};
   2.260 +
   2.261 +void *file_opendir(const char *uri,struct razor_error **error)
   2.262 +{
   2.263 +    GFile *file;
   2.264 +    gchar *path;
   2.265 +    struct file_dir *dir;
   2.266 +    GError *err=NULL;
   2.267 +    g_message("file_opendir(%s)",uri);
   2.268 +    dir=g_new0(struct file_dir,1);
   2.269 +    file=file_for_uri(uri);
   2.270 +    path=g_file_get_path(file);
   2.271 +    if (path)
   2.272 +    {
   2.273 +	dir->razor_file_default=razor_file_default_opendir(path,error);
   2.274 +	if (!dir->razor_file_default)
   2.275 +	{
   2.276 +	    g_free(dir);
   2.277 +	    dir=NULL;
   2.278 +	}
   2.279 +	g_free(path);
   2.280 +    }
   2.281 +    else
   2.282 +    {
   2.283 +	dir->enumerator=g_file_enumerate_children(file,
   2.284 +	  G_FILE_ATTRIBUTE_STANDARD_NAME,G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
   2.285 +	  NULL,&err);
   2.286 +	if (!dir->enumerator)
   2.287 +	{
   2.288 +	    g_free(dir);
   2.289 +	    dir=NULL;
   2.290 +	    plover_propagate_g_error(error,err);
   2.291 +	}
   2.292 +    }
   2.293 +    g_object_unref(file);
   2.294 +    return dir;
   2.295 +}
   2.296 +
   2.297 +char *file_readdir(void *dp,struct razor_error **error)
   2.298 +{
   2.299 +    struct file_dir *dir=dp;
   2.300 +    char *name;
   2.301 +    GError *err=NULL;
   2.302 +    GFileInfo *info;
   2.303 +    g_message("file_readdir(%p)",dp);
   2.304 +    if (dir->razor_file_default)
   2.305 +	name=razor_file_default_readdir(dir->razor_file_default,error);
   2.306 +    else
   2.307 +    {
   2.308 +	info=g_file_enumerator_next_file(dir->enumerator,NULL,&err);
   2.309 +	if (!info)
   2.310 +	{
   2.311 +	    name=NULL;
   2.312 +	    plover_propagate_g_error(error,err);
   2.313 +	}
   2.314 +	else
   2.315 +	{
   2.316 +	    name=strdup(g_file_info_get_name(info));
   2.317 +	    g_object_unref(info);
   2.318 +	}
   2.319 +    }
   2.320 +    return name;
   2.321 +}
   2.322 +
   2.323 +int file_closedir(void *dp,struct razor_error **error)
   2.324 +{
   2.325 +    struct file_dir *dir=dp;
   2.326 +    int retval;
   2.327 +    GError *err=NULL;
   2.328 +    g_message("file_closedir(%p)",dp);
   2.329 +    if (dir->razor_file_default)
   2.330 +	retval=razor_file_default_closedir(dir->razor_file_default,error);
   2.331 +    else
   2.332 +    {
   2.333 +	retval=g_file_enumerator_close(dir->enumerator,NULL,&err)?0:-1;
   2.334 +	if (retval)
   2.335 +	    plover_propagate_g_error(error,err);
   2.336 +	g_object_unref(dir->enumerator);
   2.337 +    }
   2.338 +    g_free(dir);
   2.339 +    return retval;
   2.340 +}
   2.341 +
   2.342  void plover__file_io_init(void)
   2.343  {
   2.344      static gsize init=0;
   2.345 -    struct razor_file_vtable file_vtable;
   2.346 +    struct razor_file_vtable file_vtable={0,};
   2.347      g_message("plover__file_io_init()");
   2.348      if (g_once_init_enter(&init))
   2.349      {
   2.350 +	file_vtable.structure_size=sizeof(file_vtable);
   2.351 +	file_vtable.mkdir=file_mkdir;
   2.352 +	file_vtable.unlink=file_unlink;
   2.353 +	file_vtable.open=file_open;
   2.354 +	file_vtable.move=file_move;
   2.355  	file_vtable.get_contents=file_get_contents;
   2.356  	file_vtable.free_contents=file_free_contents;
   2.357 +	file_vtable.is_directory=file_is_directory;
   2.358 +	file_vtable.mkdtemp_near=file_mkdtemp_near;
   2.359 +	file_vtable.opendir=file_opendir;
   2.360 +	file_vtable.readdir=file_readdir;
   2.361 +	file_vtable.closedir=file_closedir;
   2.362  	razor_file_set_vtable(&file_vtable);
   2.363  	g_once_init_leave(&init,1);
   2.364      }
     3.1 --- a/plover/import-yum.c	Tue Jun 14 12:39:53 2016 +0100
     3.2 +++ b/plover/import-yum.c	Thu Jun 16 12:11:14 2016 +0100
     3.3 @@ -319,6 +319,7 @@
     3.4      struct razor_set *set;
     3.5      int errnum;
     3.6      const char *errstr,*errobj;
     3.7 +    plover__file_io_init();
     3.8      ctx.importer=razor_importer_create();
     3.9      ctx.state=YUM_STATE_BEGIN;
    3.10      ctx.primary_parser=XML_ParserCreate(NULL);
     4.1 --- a/plover/packageset.c	Tue Jun 14 12:39:53 2016 +0100
     4.2 +++ b/plover/packageset.c	Thu Jun 16 12:11:14 2016 +0100
     4.3 @@ -85,6 +85,7 @@
     4.4  
     4.5  static void plover_package_set_class_init(PloverPackageSetClass *klass)
     4.6  {
     4.7 +    plover__file_io_init();
     4.8      GObjectClass *oclass=G_OBJECT_CLASS(klass);
     4.9      oclass->finalize=plover_package_set_finalize;
    4.10      oclass->dispose=plover_package_set_dispose;
    4.11 @@ -125,13 +126,19 @@
    4.12      struct razor_set *system=NULL;
    4.13      PloverPackageSetPrivate *priv;
    4.14      struct razor_error *error=NULL;
    4.15 +    GFile *file;
    4.16 +    gchar *uri;
    4.17      g_return_val_if_fail(PLOVER_IS_PACKAGE_SET(set),FALSE);
    4.18 +    file=g_file_new_for_path(*install_root?install_root:"/");
    4.19 +    uri=g_file_get_uri(file);
    4.20 +    g_object_unref(file);
    4.21 +    g_message("Using %s as URI",uri);
    4.22      if (exclusive)
    4.23      {
    4.24 -	root=razor_root_open(install_root,NULL);
    4.25 +	root=razor_root_open(uri,NULL);
    4.26  	if (!root)
    4.27  	{
    4.28 -	    if (razor_root_create(install_root,&error))
    4.29 +	    if (razor_root_create(uri,&error))
    4.30  	    {
    4.31  		if (razor_error_get_domain(error)==RAZOR_GENERAL_ERROR &&
    4.32  		  razor_error_get_code(error)==
    4.33 @@ -139,14 +146,15 @@
    4.34  		{
    4.35  		    razor_error_free(error);
    4.36  		    error=NULL;
    4.37 -		    root=razor_root_open(install_root,&error);
    4.38 +		    root=razor_root_open(uri,&error);
    4.39  		}                             
    4.40  	    }
    4.41  	    else
    4.42 -		root=razor_root_open(install_root,&error);
    4.43 +		root=razor_root_open(uri,&error);
    4.44  	    if (!root)                        
    4.45  	    {
    4.46  		plover_propagate_razor_error(err,error);
    4.47 +		g_free(uri);
    4.48  		return FALSE;
    4.49  	    }
    4.50  	}
    4.51 @@ -155,7 +163,8 @@
    4.52  	    razor_set_ref(system);
    4.53      }
    4.54      else
    4.55 -	system=razor_root_open_read_only(install_root,&error);
    4.56 +	system=razor_root_open_read_only(uri,&error);
    4.57 +    g_free(uri);
    4.58      if (error)
    4.59      {
    4.60  	g_set_error_literal(err,PLOVER_RAZOR_ERROR,RAZOR_GENERAL_ERROR_FAILED,
    4.61 @@ -362,10 +371,17 @@
    4.62      struct razor_importer *importer;
    4.63      struct razor_rpm *rpm;
    4.64      struct razor_error *tmp_error=NULL;
    4.65 +    GFile *file;
    4.66 +    gchar *uri;
    4.67 +    plover__file_io_init();
    4.68      importer=razor_importer_create();
    4.69      for(i=0;filenames[i];i++)
    4.70      {
    4.71 -	rpm=razor_rpm_open(filenames[i],&tmp_error);
    4.72 +	file=g_file_new_for_path(filenames[i]);
    4.73 +	uri=g_file_get_uri(file);
    4.74 +	g_object_unref(file);
    4.75 +	rpm=razor_rpm_open(uri,&tmp_error);
    4.76 +	g_free(uri);
    4.77  	if (!rpm)
    4.78  	{
    4.79  	    razor_importer_destroy(importer);
     5.1 --- a/plover/razor.c	Tue Jun 14 12:39:53 2016 +0100
     5.2 +++ b/plover/razor.c	Thu Jun 16 12:11:14 2016 +0100
     5.3 @@ -61,6 +61,13 @@
     5.4      int r,count;
     5.5      GError *tmp_error=NULL;
     5.6      PloverPackage *package;
     5.7 +    GFile *file;
     5.8 +    gchar *uri;
     5.9 +    plover__file_io_init();
    5.10 +    file=g_file_new_for_path(*install_root?install_root:"/");
    5.11 +    uri=g_file_get_uri(file);
    5.12 +    g_object_unref(file);
    5.13 +    g_message("Using %s as URI",uri);
    5.14      switch(stage)
    5.15      {
    5.16  	case RAZOR_STAGE_SCRIPTS_PRE:
    5.17 @@ -82,6 +89,7 @@
    5.18  	{
    5.19  	    razor_atomic_abort(atomic,PLOVER_GENERAL_ERROR,
    5.20  	      PLOVER_GENERAL_ERROR_CANCELLED,"Operation was cancelled");
    5.21 +	    g_free(uri);
    5.22  	    return -1;
    5.23  	}
    5.24  	if (action==RAZOR_INSTALL_ACTION_REMOVE)
    5.25 @@ -91,7 +99,7 @@
    5.26  	    if (stage==RAZOR_STAGE_FILES)
    5.27  		printf("  Removing : %s ",name);
    5.28  	    r=razor_package_remove(system,plover_package_set_get_razor(next),
    5.29 -	      atomic,pkg,install_root,count,stage);
    5.30 +	      atomic,pkg,uri,count,stage);
    5.31  	    if (stage==RAZOR_STAGE_FILES)
    5.32  		printf("\n");
    5.33  	}
    5.34 @@ -104,6 +112,7 @@
    5.35  		plover_propagate_g_error(&error,tmp_error);
    5.36  		razor_atomic_propagate_error(atomic,error,NULL);
    5.37  		razor_error_free(error);
    5.38 +		g_free(uri);
    5.39  		return -1;
    5.40  	    }
    5.41  	    if (stage==RAZOR_STAGE_FILES)
    5.42 @@ -111,7 +120,7 @@
    5.43  	    if (relocations)
    5.44  		razor_rpm_set_relocations(rpm,relocations);
    5.45  	    razor_transaction_fixup_package(trans,pkg,rpm);
    5.46 -	    r=razor_rpm_install(rpm,atomic,install_root,1,stage);
    5.47 +	    r=razor_rpm_install(rpm,atomic,uri,1,stage);
    5.48  	    razor_rpm_close(rpm);
    5.49  	    if (stage==RAZOR_STAGE_FILES)
    5.50  		printf("\n");
    5.51 @@ -121,7 +130,10 @@
    5.52  	else
    5.53  	    r=0;
    5.54  	if (razor_atomic_in_error_state(atomic))
    5.55 +	{
    5.56 +	    g_free(uri);
    5.57  	    return -1;
    5.58 +	}
    5.59  	else if (r)
    5.60  	{
    5.61  	    if (action==RAZOR_INSTALL_ACTION_REMOVE)
    5.62 @@ -151,6 +163,7 @@
    5.63  		fprintf(stderr,"error: %s, exit status %d\n",t,r);
    5.64  		razor_atomic_abort(atomic,PLOVER_SCRIPTLET_ERROR,r,t);
    5.65  		g_free(t);
    5.66 +		g_free(uri);
    5.67  		return -1;
    5.68  	    }
    5.69  	    else
    5.70 @@ -160,6 +173,7 @@
    5.71  		  name,version,arch,r);
    5.72  	}
    5.73      }
    5.74 +    g_free(uri);
    5.75      return 0;
    5.76  }
    5.77  
    5.78 @@ -238,8 +252,7 @@
    5.79  {
    5.80      int len,matches=1;
    5.81      const char *name;
    5.82 -    char *install_root;
    5.83 -    GFile *file;
    5.84 +    const char *install_root;
    5.85      struct razor_set *set;
    5.86      struct razor_package *package;
    5.87      struct razor_package_iterator *pi;
    5.88 @@ -248,12 +261,12 @@
    5.89      len=strlen(prefix);
    5.90      while(len && prefix[len-1]=='/')
    5.91  	len--;
    5.92 -    install_root=getenv("RAZOR_ROOT");
    5.93 +    install_root=g_getenv("RAZOR_ROOT");
    5.94      if (!install_root)
    5.95 -	install_root="";
    5.96 -    file=g_file_new_for_path(*install_root?install_root:"/");
    5.97 -    set=razor_root_open_read_only(g_file_get_uri(file),NULL);
    5.98 -    g_object_unref(file);
    5.99 +	install_root="file:///";
   5.100 +    set=razor_root_open_read_only(install_root,NULL);
   5.101 +    if (!set)
   5.102 +	g_message("Failed to open root");
   5.103      if (set)
   5.104      {
   5.105  	pi=razor_package_iterator_create(set);
     6.1 --- a/plover/repository.c	Tue Jun 14 12:39:53 2016 +0100
     6.2 +++ b/plover/repository.c	Thu Jun 16 12:11:14 2016 +0100
     6.3 @@ -28,7 +28,7 @@
     6.4  
     6.5  typedef struct _PloverRepositoryPrivate {
     6.6      PloverPackageSet *set;
     6.7 -    gchar **filenames;
     6.8 +    gchar **uris;
     6.9  } PloverRepositoryPrivate;
    6.10  
    6.11  #define PLOVER_REPOSITORY_GET_PRIVATE(obj)\
    6.12 @@ -39,7 +39,7 @@
    6.13  static void plover_repository_finalize(GObject *obj)
    6.14  {
    6.15      PloverRepositoryPrivate *priv=PLOVER_REPOSITORY_GET_PRIVATE(obj);
    6.16 -    g_strfreev(priv->filenames);
    6.17 +    g_strfreev(priv->uris);
    6.18      if (G_OBJECT_CLASS(plover_repository_parent_class)->finalize)
    6.19  	G_OBJECT_CLASS(plover_repository_parent_class)->finalize(obj);
    6.20  }
    6.21 @@ -54,6 +54,7 @@
    6.22  
    6.23  static void plover_repository_class_init(PloverRepositoryClass *klass)
    6.24  {
    6.25 +    plover__file_io_init();
    6.26      GObjectClass *oclass=G_OBJECT_CLASS(klass);
    6.27      oclass->finalize=plover_repository_finalize;
    6.28      oclass->dispose=plover_repository_dispose;
    6.29 @@ -67,15 +68,25 @@
    6.30  PloverRepository *plover_repository_new_from_files(const char **filenames,
    6.31    GError **error)
    6.32  {
    6.33 +    int i;
    6.34      PloverPackageSet *set;
    6.35      PloverRepository *repository;
    6.36      PloverRepositoryPrivate *priv;
    6.37 +    GFile *file;
    6.38 +    gchar *uri;
    6.39      set=plover_package_set_new_from_rpms(filenames,error);
    6.40      if (!set)
    6.41  	return NULL;
    6.42      repository=g_object_new(PLOVER_TYPE_REPOSITORY,NULL);
    6.43      priv=PLOVER_REPOSITORY_GET_PRIVATE(repository);
    6.44 -    priv->filenames=g_strdupv((gchar **)filenames);
    6.45 +    priv->uris=g_new(char *,g_strv_length((char **)filenames)+1);
    6.46 +    for(i=0;filenames[i];i++)
    6.47 +    {
    6.48 +	file=g_file_new_for_path(filenames[i]);
    6.49 +	priv->uris[i]=g_file_get_uri(file);
    6.50 +	g_object_unref(file);
    6.51 +    }
    6.52 +    priv->uris[i]=NULL;
    6.53      priv->set=set;
    6.54      return repository;
    6.55  }
    6.56 @@ -96,33 +107,40 @@
    6.57  {
    6.58      char *s;
    6.59      const char *name,*version,*arch;
    6.60 -    GPtrArray *filenames;
    6.61 +    GPtrArray *uris;
    6.62      struct razor_set *imported;
    6.63      struct razor_package *package;
    6.64      struct razor_package_iterator *pi;
    6.65      PloverPackageSet *set;
    6.66      PloverRepository *repository;
    6.67      PloverRepositoryPrivate *priv;
    6.68 +    GFile *file;
    6.69 +    gchar *uri;
    6.70      imported=plover_razor_set_create_from_yum(base,error);
    6.71      if (!imported)
    6.72  	return NULL;
    6.73 +    file=g_file_new_for_path(base);
    6.74 +    uri=g_file_get_uri(file);
    6.75 +    g_object_unref(file);
    6.76 +    g_message("Using %s as URI",uri);
    6.77      set=plover_package_set_new_from_razor(imported);
    6.78      razor_set_unref(imported);
    6.79      repository=g_object_new(PLOVER_TYPE_REPOSITORY,NULL);
    6.80      priv=PLOVER_REPOSITORY_GET_PRIVATE(repository);
    6.81 -    filenames=g_ptr_array_new();
    6.82 +    uris=g_ptr_array_new();
    6.83      pi=razor_package_iterator_create(plover_package_set_get_razor(set));
    6.84      while (razor_package_iterator_next(pi,&package,RAZOR_DETAIL_NAME,&name,
    6.85        RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,RAZOR_DETAIL_LAST))
    6.86      {
    6.87  	s=rpm_filename(name,version,arch);
    6.88 -	g_ptr_array_add(filenames,g_build_filename(base,"rpms",s,NULL));
    6.89 +	g_ptr_array_add(uris,g_build_filename(uri,"rpms",s,NULL));
    6.90  	free(s);
    6.91      }
    6.92      razor_package_iterator_destroy(pi);
    6.93 -    g_ptr_array_add(filenames,NULL);
    6.94 -    priv->filenames=(gchar **)g_ptr_array_free(filenames,FALSE);
    6.95 +    g_ptr_array_add(uris,NULL);
    6.96 +    priv->uris=(gchar **)g_ptr_array_free(uris,FALSE);
    6.97      priv->set=set;
    6.98 +    g_free(uri);
    6.99      return repository;
   6.100  }
   6.101  
   6.102 @@ -161,7 +179,7 @@
   6.103  	  plover_package_get_arch(package));
   6.104  	return NULL;
   6.105      }
   6.106 -    rpm=razor_rpm_open(priv->filenames[nth],&tmp_error);
   6.107 +    rpm=razor_rpm_open(priv->uris[nth],&tmp_error);
   6.108      if (!rpm)
   6.109  	plover_propagate_razor_error(error,tmp_error);
   6.110      return rpm;
     7.1 --- a/plover/transaction.c	Tue Jun 14 12:39:53 2016 +0100
     7.2 +++ b/plover/transaction.c	Thu Jun 16 12:11:14 2016 +0100
     7.3 @@ -428,22 +428,46 @@
     7.4    const char *install_root,GError **error)
     7.5  {
     7.6      PloverPackageSet *installed;
     7.7 +    const char *install_uri;
     7.8 +    gchar *install_path;
     7.9 +    GFile *file;
    7.10 +    gboolean retval;
    7.11      g_return_val_if_fail(PLOVER_IS_TRANSACTION(transaction),FALSE);
    7.12      if (!install_root)
    7.13 -	install_root=g_getenv("RAZOR_ROOT");
    7.14 -    if (!install_root)
    7.15 -	install_root="";
    7.16 -    if (transaction->installed && !g_strcmp0(install_root,
    7.17 +    {
    7.18 +	install_uri=g_getenv("RAZOR_ROOT");
    7.19 +	if (install_uri)
    7.20 +	{
    7.21 +	    file=g_file_new_for_uri(install_uri);
    7.22 +	    install_path=g_file_get_path(file);
    7.23 +	    g_object_unref(file);
    7.24 +	    if (!install_path)
    7.25 +	    {
    7.26 +		g_set_error(error,PLOVER_GENERAL_ERROR,
    7.27 +		  PLOVER_GENERAL_ERROR_FAILED,
    7.28 +		  "%s: Not a local URI",install_uri);
    7.29 +		return FALSE;
    7.30 +	    }
    7.31 +	}
    7.32 +	else
    7.33 +	    install_path=g_strdup("/");
    7.34 +    }
    7.35 +    else
    7.36 +	install_path=g_strdup(install_root);
    7.37 +    if (transaction->installed && !g_strcmp0(install_path,
    7.38        plover_package_set_get_install_root(transaction->installed)))
    7.39 +    {
    7.40 +	g_free(install_path);
    7.41  	return TRUE;
    7.42 +    }
    7.43      installed=plover_package_set_new();
    7.44 -    if (!plover_package_set_open(installed,install_root,TRUE,error))
    7.45 -    {
    7.46 +    retval=plover_package_set_open(installed,install_path,TRUE,error);
    7.47 +    if (retval)
    7.48 +	plover_transaction_set_installed(transaction,installed);
    7.49 +    else
    7.50  	g_object_unref(installed);
    7.51 -	return FALSE;
    7.52 -    }
    7.53 -    plover_transaction_set_installed(transaction,installed);
    7.54 -    return TRUE;
    7.55 +    g_free(install_path);
    7.56 +    return retval;
    7.57  }
    7.58  
    7.59  struct razor_set *plover_transaction_import_yum(PloverTransaction *transaction,
    7.60 @@ -709,7 +733,8 @@
    7.61  {
    7.62      int i,changed,is_leaf;
    7.63      uint32_t flags;
    7.64 -    const char *install_root;
    7.65 +    gchar *install_path;
    7.66 +    const char *install_uri;
    7.67      const char *name,*version,*maybe_unused_name;
    7.68      struct razor_set *system,*upstream;
    7.69      struct razor_transaction *trans;
    7.70 @@ -717,6 +742,7 @@
    7.71      PloverTransaction *transaction;
    7.72      struct plover_vector *package_names;
    7.73      GList *to_remove,*lnk,*lnk2,*what_requires,*what_provides;
    7.74 +    GFile *file;
    7.75      struct razor_package *package,*maybe_unused_package;
    7.76      struct razor_property *property;
    7.77      struct razor_package_query *query;
    7.78 @@ -724,15 +750,29 @@
    7.79      struct razor_property_iterator *removed_props;
    7.80      if (!pkgs)
    7.81  	return plover_transaction_new_remove(NULL,error);
    7.82 +    install_uri=g_getenv("RAZOR_ROOT");
    7.83 +    if (install_uri)
    7.84 +    {
    7.85 +	file=g_file_new_for_uri(install_uri);
    7.86 +	install_path=g_file_get_path(file);
    7.87 +	g_object_unref(file);
    7.88 +	if (!install_path)
    7.89 +	{
    7.90 +	    g_set_error(error,PLOVER_GENERAL_ERROR,PLOVER_GENERAL_ERROR_FAILED,
    7.91 +	      "%s: Not a local URI",install_uri);
    7.92 +	    return NULL;
    7.93 +	}
    7.94 +    }
    7.95 +    else
    7.96 +	install_path=g_strdup("/");
    7.97      installed=plover_package_set_new();
    7.98 -    install_root=g_getenv("RAZOR_ROOT");
    7.99 -    if (!install_root)
   7.100 -	install_root="";
   7.101 -    if (!plover_package_set_open(installed,install_root,TRUE,error))
   7.102 +    if (!plover_package_set_open(installed,install_path,TRUE,error))
   7.103      {
   7.104  	g_object_unref(installed);
   7.105 +	g_free(install_path);
   7.106  	return NULL;
   7.107      }
   7.108 +    g_free(install_path);
   7.109      system=plover_package_set_get_razor(installed);
   7.110      package_names=plover_vector_new();
   7.111      for(i=0;pkgs[i];i++)
     8.1 --- a/tests/plover-gtk/test-transactionhelper.c	Tue Jun 14 12:39:53 2016 +0100
     8.2 +++ b/tests/plover-gtk/test-transactionhelper.c	Thu Jun 16 12:11:14 2016 +0100
     8.3 @@ -91,14 +91,19 @@
     8.4  
     8.5  static void test_install_group(void)
     8.6  {
     8.7 -    gchar *root;
     8.8 +    gchar *root,*root_uri;
     8.9      GError *err=NULL;
    8.10 +    GFile *file;
    8.11      PloverPackageSet *installed;
    8.12      PloverTransactionHelper *helper;
    8.13      root=g_strdup("razor-test-dir-XXXXXX");
    8.14      g_assert(mkdtemp(root));
    8.15 -    g_setenv("RAZOR_ROOT",root,TRUE);
    8.16 +    file=g_file_new_for_path(root);
    8.17      g_free(root);
    8.18 +    root_uri=g_file_get_uri(file);
    8.19 +    g_object_unref(file);
    8.20 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    8.21 +    g_free(root_uri);
    8.22      helper=get_transaction_helper();
    8.23      installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
    8.24      if (!installed)
    8.25 @@ -115,15 +120,20 @@
    8.26  
    8.27  static void test_remove_group(void)
    8.28  {
    8.29 -    gchar *root;
    8.30 +    gchar *root,*root_uri;
    8.31      GError *err=NULL;
    8.32 +    GFile *file;
    8.33      PloverPackageSet *installed;
    8.34      PloverTransactionHelper *helper;
    8.35      struct plover_vector *packages;
    8.36      char *pkgs[]={"zip",NULL};
    8.37      root=g_strdup("razor-test-dir-XXXXXX");
    8.38      g_assert(mkdtemp(root));
    8.39 -    g_setenv("RAZOR_ROOT",root,TRUE);
    8.40 +    file=g_file_new_for_path(root);
    8.41 +    root_uri=g_file_get_uri(file);
    8.42 +    g_object_unref(file);
    8.43 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    8.44 +    g_free(root_uri);
    8.45      helper=get_transaction_helper();
    8.46      plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
    8.47      packages=plover_transaction_helper_group_get_default_packages(helper,
    8.48 @@ -148,14 +158,19 @@
    8.49  
    8.50  static void test_update(void)
    8.51  {
    8.52 -    gchar *root;
    8.53 +    gchar *root,*root_uri;
    8.54      GError *err=NULL;
    8.55 +    GFile *file;
    8.56      PloverPackageSet *installed;
    8.57      PloverTransactionHelper *helper;
    8.58      root=g_strdup("razor-test-dir-XXXXXX");
    8.59      g_assert(mkdtemp(root));
    8.60 -    g_setenv("RAZOR_ROOT",root,TRUE);
    8.61 +    file=g_file_new_for_path(root);
    8.62      g_free(root);
    8.63 +    root_uri=g_file_get_uri(file);
    8.64 +    g_object_unref(file);
    8.65 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    8.66 +    g_free(root_uri);
    8.67      helper=get_transaction_helper();
    8.68      installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
    8.69      if (!installed)
    8.70 @@ -239,15 +254,20 @@
    8.71  
    8.72  static void test_run_install(void)
    8.73  {
    8.74 -    gchar *root;
    8.75 +    gchar *root,*root_uri;
    8.76      GError *err=NULL;
    8.77 +    GFile *file;
    8.78      struct plover_vector *packages;
    8.79      PloverPackageSet *installed;
    8.80      PloverTransactionHelper *helper;
    8.81      struct run_install_baton baton={0,};
    8.82      root=g_strdup("razor-test-dir-XXXXXX");
    8.83      g_assert(mkdtemp(root));
    8.84 -    g_setenv("RAZOR_ROOT",root,TRUE);
    8.85 +    file=g_file_new_for_path(root);
    8.86 +    root_uri=g_file_get_uri(file);
    8.87 +    g_object_unref(file);
    8.88 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    8.89 +    g_free(root_uri);
    8.90      helper=get_transaction_helper();
    8.91      installed=plover_package_set_new();
    8.92      if (!plover_package_set_open(installed,root,TRUE,&err))
    8.93 @@ -339,15 +359,20 @@
    8.94  
    8.95  static void test_run_remove(void)
    8.96  {
    8.97 -    gchar *root;
    8.98 +    gchar *root,*root_uri;
    8.99      GError *err=NULL;
   8.100 +    GFile *file;
   8.101      struct plover_vector *packages;
   8.102      PloverPackageSet *installed;
   8.103      PloverTransactionHelper *helper;
   8.104      struct run_remove_baton baton={0,};
   8.105      root=g_strdup("razor-test-dir-XXXXXX");
   8.106      g_assert(mkdtemp(root));
   8.107 -    g_setenv("RAZOR_ROOT",root,TRUE);
   8.108 +    file=g_file_new_for_path(root);
   8.109 +    root_uri=g_file_get_uri(file);
   8.110 +    g_object_unref(file);
   8.111 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   8.112 +    g_free(root_uri);
   8.113      helper=get_transaction_helper();
   8.114      plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   8.115      packages=
   8.116 @@ -443,8 +468,9 @@
   8.117  
   8.118  static void test_run_update(void)
   8.119  {
   8.120 -    gchar *root;
   8.121 +    gchar *root,*root_uri;
   8.122      GError *err=NULL;
   8.123 +    GFile *file;
   8.124      struct razor_importer *importer;
   8.125      struct razor_set *downgraded;
   8.126      struct razor_atomic *atomic;
   8.127 @@ -454,7 +480,11 @@
   8.128      struct run_update_baton baton={0,};
   8.129      root=g_strdup("razor-test-dir-XXXXXX");
   8.130      g_assert(mkdtemp(root));
   8.131 -    g_setenv("RAZOR_ROOT",root,TRUE);
   8.132 +    file=g_file_new_for_path(root);
   8.133 +    root_uri=g_file_get_uri(file);
   8.134 +    g_object_unref(file);
   8.135 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   8.136 +    g_free(root_uri);
   8.137      helper=get_transaction_helper();
   8.138      plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   8.139      installed=plover_package_set_new();
   8.140 @@ -560,7 +590,8 @@
   8.141  static void test_check_vendor(void)
   8.142  {
   8.143      int fh;
   8.144 -    gchar *root,*s;
   8.145 +    gchar *root,*root_uri,*s;
   8.146 +    GFile *file;
   8.147      GError *err=NULL;
   8.148      struct razor_importer *importer;
   8.149      struct razor_set *downgraded;
   8.150 @@ -572,7 +603,10 @@
   8.151      g_setenv("PLOVER_VENDOR_PREFIX","/srv",TRUE);
   8.152      root=g_strdup("razor-test-dir-XXXXXX");
   8.153      g_assert(mkdtemp(root));
   8.154 -    g_setenv("RAZOR_ROOT",root,TRUE);
   8.155 +    file=g_file_new_for_path(root);
   8.156 +    root_uri=g_file_get_uri(file);
   8.157 +    g_object_unref(file);
   8.158 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   8.159      helper=get_transaction_helper();
   8.160      plover_transaction_helper_set_check_vendor(helper,TRUE);
   8.161      plover_transaction_helper_set_base(helper,"../yum-repo-test-dir");
   8.162 @@ -588,8 +622,8 @@
   8.163      razor_importer_finish_package(importer);
   8.164      downgraded=razor_importer_finish(importer);
   8.165      atomic=razor_atomic_open("Add downgraded packages");
   8.166 -    razor_atomic_make_dirs(atomic,root,"/test/bin/zappy");
   8.167 -    s=g_build_filename(root,"test/bin/zappy",NULL);
   8.168 +    razor_atomic_make_dirs(atomic,root_uri,"/test/bin/zappy");
   8.169 +    s=g_build_filename(root_uri,"test/bin/zappy",NULL);
   8.170      fh=razor_atomic_create_file(atomic,s,S_IRWXU|S_IRWXG|S_IRWXO);
   8.171      g_free(s);
   8.172      razor_atomic_close(atomic,fh);
   8.173 @@ -610,6 +644,7 @@
   8.174      g_object_unref(helper);
   8.175      g_unsetenv("RAZOR_ROOT");
   8.176      g_free(root);
   8.177 +    g_free(root_uri);
   8.178      g_unsetenv("PLOVER_VENDOR_PREFIX");
   8.179  }
   8.180  
   8.181 @@ -652,17 +687,22 @@
   8.182  
   8.183  static void test_set_error(void)
   8.184  {
   8.185 -    gchar *root;
   8.186 +    gchar *root,*root_uri;
   8.187      const char *errmsg;
   8.188      GError *err=NULL;
   8.189      const GError *err2=NULL;
   8.190 +    GFile *file;
   8.191      PloverPackageSet *installed;
   8.192      PloverTransactionHelper *helper;
   8.193      struct set_error_baton baton={0,};
   8.194      root=g_strdup("razor-test-dir-XXXXXX");
   8.195      g_assert(mkdtemp(root));
   8.196 -    g_setenv("RAZOR_ROOT",root,TRUE);
   8.197 +    file=g_file_new_for_path(root);
   8.198      g_free(root);
   8.199 +    root_uri=g_file_get_uri(file);
   8.200 +    g_object_unref(file);
   8.201 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   8.202 +    g_free(root_uri);
   8.203      helper=get_transaction_helper();
   8.204      installed=plover_package_set_new_from_installed("../razor-test-dir",&err);
   8.205      if (!installed)
     9.1 --- a/tests/plover/test-razor.c	Tue Jun 14 12:39:53 2016 +0100
     9.2 +++ b/tests/plover/test-razor.c	Thu Jun 16 12:11:14 2016 +0100
     9.3 @@ -27,11 +27,16 @@
     9.4  static void test_install(void)
     9.5  {
     9.6      char *pkgs[]={"zip",NULL};
     9.7 -    gchar *root;
     9.8 +    gchar *root,*root_uri;
     9.9      GError *err=NULL;
    9.10 +    GFile *file;
    9.11      root=g_strdup("razor-test-dir-XXXXXX");
    9.12      g_assert(mkdtemp(root));
    9.13 -    g_setenv("RAZOR_ROOT",root,TRUE);
    9.14 +    file=g_file_new_for_path(root);
    9.15 +    root_uri=g_file_get_uri(file);
    9.16 +    g_object_unref(file);
    9.17 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    9.18 +    g_free(root_uri);
    9.19      if (!plover_install("../yum-repo-test-dir","/test",pkgs,&err))
    9.20      {
    9.21  	g_assert(err && err->message);
    9.22 @@ -62,11 +67,16 @@
    9.23  
    9.24  static void test_update_noop(void)
    9.25  {
    9.26 -    gchar *root;
    9.27 +    gchar *root,*root_uri;
    9.28      GError *err=NULL;
    9.29 +    GFile *file;
    9.30      root=g_strdup("razor-test-dir-XXXXXX");
    9.31      g_assert(mkdtemp(root));
    9.32 -    g_setenv("RAZOR_ROOT",root,TRUE);
    9.33 +    file=g_file_new_for_path(root);
    9.34 +    root_uri=g_file_get_uri(file);
    9.35 +    g_object_unref(file);
    9.36 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    9.37 +    g_free(root_uri);
    9.38      if (!plover_update("../yum-repo-test-dir","/test",NULL,&err))
    9.39      {
    9.40  	g_assert(err && err->message);
    9.41 @@ -80,11 +90,16 @@
    9.42  static void test_update_nonexistant(void)
    9.43  {
    9.44      char *pkgs[]={"nonexistant",NULL};
    9.45 -    gchar *root;
    9.46 +    gchar *root,*root_uri;
    9.47      GError *err=NULL;
    9.48 +    GFile *file;
    9.49      root=g_strdup("razor-test-dir-XXXXXX");
    9.50      g_assert(mkdtemp(root));
    9.51 -    g_setenv("RAZOR_ROOT",root,TRUE);
    9.52 +    file=g_file_new_for_path(root);
    9.53 +    root_uri=g_file_get_uri(file);
    9.54 +    g_object_unref(file);
    9.55 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    9.56 +    g_free(root_uri);
    9.57      g_assert(!plover_update("../yum-repo-test-dir","/test",pkgs,&err));
    9.58      g_assert(g_error_matches(err,PLOVER_GENERAL_ERROR,
    9.59        PLOVER_GENERAL_ERROR_NO_SUCH_PACKAGE));
    9.60 @@ -96,11 +111,16 @@
    9.61  static void test_remove(void)
    9.62  {
    9.63      char *pkgs[]={"zip",NULL};
    9.64 -    gchar *root;
    9.65 +    gchar *root,*root_uri;
    9.66      GError *err=NULL;
    9.67 +    GFile *file;
    9.68      root=g_strdup("razor-test-dir-XXXXXX");
    9.69      g_assert(mkdtemp(root));
    9.70 -    g_setenv("RAZOR_ROOT",root,TRUE);
    9.71 +    file=g_file_new_for_path(root);
    9.72 +    root_uri=g_file_get_uri(file);
    9.73 +    g_object_unref(file);
    9.74 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    9.75 +    g_free(root_uri);
    9.76      if (!plover_install("../yum-repo-test-dir","/test",pkgs,&err))
    9.77  	g_error("test-remove: %s",err->message);
    9.78      if (!plover_remove(pkgs,&err))
    9.79 @@ -115,11 +135,16 @@
    9.80  
    9.81  static void test_remove_noop(void)
    9.82  {
    9.83 -    gchar *root;
    9.84 +    gchar *root,*root_uri;
    9.85      GError *err=NULL;
    9.86 +    GFile *file;
    9.87      root=g_strdup("razor-test-dir-XXXXXX");
    9.88      g_assert(mkdtemp(root));
    9.89 -    g_setenv("RAZOR_ROOT",root,TRUE);
    9.90 +    file=g_file_new_for_path(root);
    9.91 +    root_uri=g_file_get_uri(file);
    9.92 +    g_object_unref(file);
    9.93 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
    9.94 +    g_free(root_uri);
    9.95      if (!plover_remove(NULL,&err))
    9.96      {
    9.97  	g_assert(err && err->message);
    9.98 @@ -133,11 +158,16 @@
    9.99  static void test_remove_nonexistant(void)
   9.100  {
   9.101      char *pkgs[]={"nonexistant",NULL};
   9.102 -    gchar *root;
   9.103 +    gchar *root,*root_uri;
   9.104      GError *err=NULL;
   9.105 +    GFile *file;
   9.106      root=g_strdup("razor-test-dir-XXXXXX");
   9.107      g_assert(mkdtemp(root));
   9.108 -    g_setenv("RAZOR_ROOT",root,TRUE);
   9.109 +    file=g_file_new_for_path(root);
   9.110 +    root_uri=g_file_get_uri(file);
   9.111 +    g_object_unref(file);
   9.112 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   9.113 +    g_free(root_uri);
   9.114      g_assert(!plover_remove(pkgs,&err));
   9.115      g_assert(g_error_matches(err,PLOVER_GENERAL_ERROR,
   9.116        PLOVER_GENERAL_ERROR_NO_SUCH_PACKAGE));
   9.117 @@ -149,11 +179,16 @@
   9.118  static void test_remove_warning(void)
   9.119  {
   9.120      char *pkgs[]={"badpostun",NULL};
   9.121 -    gchar *root;
   9.122 +    gchar *root,*root_uri;
   9.123      GError *err=NULL;
   9.124 +    GFile *file;
   9.125      root=g_strdup("razor-test-dir-XXXXXX");
   9.126      g_assert(mkdtemp(root));
   9.127 -    g_setenv("RAZOR_ROOT",root,TRUE);
   9.128 +    file=g_file_new_for_path(root);
   9.129 +    root_uri=g_file_get_uri(file);
   9.130 +    g_object_unref(file);
   9.131 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   9.132 +    g_free(root_uri);
   9.133      if (!plover_install("../yum-repo-test-dir","/test",pkgs,&err))
   9.134  	g_error("test-remove-warning: %s",err->message);
   9.135      if (!plover_remove(pkgs,&err))
   9.136 @@ -168,7 +203,13 @@
   9.137  
   9.138  static void test_prefix(void)
   9.139  {
   9.140 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
   9.141 +    gchar *root_uri;
   9.142 +    GFile *file;
   9.143 +    file=g_file_new_for_path("../razor-test-dir");
   9.144 +    root_uri=g_file_get_uri(file);
   9.145 +    g_object_unref(file);
   9.146 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   9.147 +    g_free(root_uri);
   9.148      g_assert(plover_installed_files_match_prefix("/usr//"));
   9.149      g_assert(!plover_installed_files_match_prefix("/tmp"));
   9.150      g_unsetenv("RAZOR_ROOT");
   9.151 @@ -176,10 +217,15 @@
   9.152  
   9.153  static void test_prefix_none(void)
   9.154  {
   9.155 -    gchar *root;
   9.156 +    gchar *root,*root_uri;
   9.157 +    GFile *file;
   9.158      root=g_strdup("razor-test-dir-XXXXXX");
   9.159      g_assert(mkdtemp(root));
   9.160 -    g_setenv("RAZOR_ROOT",root,TRUE);
   9.161 +    file=g_file_new_for_path(root);
   9.162 +    root_uri=g_file_get_uri(file);
   9.163 +    g_object_unref(file);
   9.164 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   9.165 +    g_free(root_uri);
   9.166      g_assert(plover_installed_files_match_prefix("/any-prefix"));
   9.167      g_unsetenv("RAZOR_ROOT");
   9.168      g_free(root);
    10.1 --- a/tests/plover/test-transaction.c	Tue Jun 14 12:39:53 2016 +0100
    10.2 +++ b/tests/plover/test-transaction.c	Thu Jun 16 12:11:14 2016 +0100
    10.3 @@ -56,8 +56,14 @@
    10.4      struct razor_package *pkg;
    10.5      enum razor_install_action action;
    10.6      int count;
    10.7 +    gchar *root_uri;
    10.8      GError *err=NULL;
    10.9 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
   10.10 +    GFile *file;
   10.11 +    file=g_file_new_for_path("../razor-test-dir");
   10.12 +    root_uri=g_file_get_uri(file);
   10.13 +    g_object_unref(file);
   10.14 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   10.15 +    g_free(root_uri);
   10.16      transaction=plover_transaction_new_update("../yum-repo-test-dir","/test",
   10.17        NULL,&err);
   10.18      if (!transaction && err)
   10.19 @@ -85,8 +91,14 @@
   10.20  {
   10.21      PloverTransaction *transaction;
   10.22      char *pkgs[]={"nonexistant",NULL};
   10.23 +    gchar *root_uri;
   10.24      GError *err=NULL;
   10.25 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
   10.26 +    GFile *file;
   10.27 +    file=g_file_new_for_path("../razor-test-dir");
   10.28 +    root_uri=g_file_get_uri(file);
   10.29 +    g_object_unref(file);
   10.30 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   10.31 +    g_free(root_uri);
   10.32      transaction=plover_transaction_new_update("../yum-repo-test-dir","/test",
   10.33        pkgs,&err);
   10.34      g_assert(!transaction);
   10.35 @@ -105,8 +117,14 @@
   10.36      int count;
   10.37      char *name;
   10.38      char *pkgs[]={"zip",NULL};
   10.39 +    gchar *root_uri;
   10.40      GError *err=NULL;
   10.41 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
   10.42 +    GFile *file;
   10.43 +    file=g_file_new_for_path("../razor-test-dir");
   10.44 +    root_uri=g_file_get_uri(file);
   10.45 +    g_object_unref(file);
   10.46 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   10.47 +    g_free(root_uri);
   10.48      transaction=plover_transaction_new_install("../yum-repo-test-dir","/test",
   10.49        pkgs,&err);
   10.50      if (!transaction && err)
   10.51 @@ -138,8 +156,14 @@
   10.52  {
   10.53      PloverTransaction *transaction;
   10.54      char *pkgs[]={"nonexistant",NULL};
   10.55 +    gchar *root_uri;
   10.56      GError *err=NULL;
   10.57 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
   10.58 +    GFile *file;
   10.59 +    file=g_file_new_for_path("../razor-test-dir");
   10.60 +    root_uri=g_file_get_uri(file);
   10.61 +    g_object_unref(file);
   10.62 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   10.63 +    g_free(root_uri);
   10.64      transaction=plover_transaction_new_install("../yum-repo-test-dir","/test",
   10.65        pkgs,&err);
   10.66      g_assert(!transaction);
   10.67 @@ -158,8 +182,14 @@
   10.68      int count;
   10.69      char *name;
   10.70      char *pkgs[]={"uninstallable",NULL};
   10.71 +    gchar *root_uri;
   10.72      GError *err=NULL;
   10.73 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
   10.74 +    GFile *file;
   10.75 +    file=g_file_new_for_path("../razor-test-dir");
   10.76 +    root_uri=g_file_get_uri(file);
   10.77 +    g_object_unref(file);
   10.78 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
   10.79 +    g_free(root_uri);
   10.80      transaction=plover_transaction_new_install("../yum-repo-test-dir","/test",
   10.81        pkgs,&err);
   10.82      if (!transaction && err)
   10.83 @@ -185,6 +215,7 @@
   10.84      g_assert_cmpstr(name,==,"uninstallable");
   10.85      g_assert(!razor_install_iterator_next(iter,&pkg,&action,&count));
   10.86      g_assert(!plover_transaction_commit(transaction,NULL,&err));
   10.87 +    g_message("plover_transaction_commit: %s",err->message);
   10.88      g_assert_cmpint(err->domain,==,PLOVER_RAZOR_ERROR);
   10.89      g_assert_cmpint(err->code,==,RAZOR_GENERAL_ERROR_FAILED);
   10.90      g_clear_error(&err);
   10.91 @@ -197,8 +228,14 @@
   10.92      struct razor_install_iterator *iter;
   10.93      char *pkgs[]={"unsatisfiable",NULL};
   10.94      const char *s;
   10.95 +    gchar *root_uri;
   10.96      GError *err=NULL;
   10.97 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
   10.98 +    GFile *file;
   10.99 +    file=g_file_new_for_path("../razor-test-dir");
  10.100 +    root_uri=g_file_get_uri(file);
  10.101 +    g_object_unref(file);
  10.102 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
  10.103 +    g_free(root_uri);
  10.104      transaction=plover_transaction_new_install("../yum-repo-test-dir","/test",
  10.105        pkgs,&err);
  10.106      if (!transaction && err)
  10.107 @@ -226,8 +263,14 @@
  10.108      int count;
  10.109      char *name;
  10.110      char *pkgs[]={"zappy-tools",NULL};
  10.111 +    gchar *root_uri;
  10.112      GError *err=NULL;
  10.113 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
  10.114 +    GFile *file;
  10.115 +    file=g_file_new_for_path("../razor-test-dir");
  10.116 +    root_uri=g_file_get_uri(file);
  10.117 +    g_object_unref(file);
  10.118 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
  10.119 +    g_free(root_uri);
  10.120      transaction=plover_transaction_new_remove(pkgs,&err);
  10.121      if (!transaction && err)
  10.122  	g_error("zappy-tools: %s",err->message);
  10.123 @@ -254,8 +297,14 @@
  10.124  {
  10.125      PloverTransaction *transaction;
  10.126      char *pkgs[]={"nonexistant",NULL};
  10.127 +    gchar *root_uri;
  10.128      GError *err=NULL;
  10.129 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
  10.130 +    GFile *file;
  10.131 +    file=g_file_new_for_path("../razor-test-dir");
  10.132 +    root_uri=g_file_get_uri(file);
  10.133 +    g_object_unref(file);
  10.134 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
  10.135 +    g_free(root_uri);
  10.136      transaction=plover_transaction_new_remove(pkgs,&err);
  10.137      g_assert(!transaction);
  10.138      g_assert(g_error_matches(err,PLOVER_GENERAL_ERROR,
  10.139 @@ -301,8 +350,14 @@
  10.140      int count;
  10.141      char *name;
  10.142      char *pkgs[]={"zappy-tools",NULL};
  10.143 +    gchar *root_uri;
  10.144      GError *err=NULL;
  10.145 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
  10.146 +    GFile *file;
  10.147 +    file=g_file_new_for_path("../razor-test-dir");
  10.148 +    root_uri=g_file_get_uri(file);
  10.149 +    g_object_unref(file);
  10.150 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
  10.151 +    g_free(root_uri);
  10.152      transaction=plover_transaction_new_remove_with_leaves(pkgs,&err);
  10.153      if (!transaction && err)
  10.154  	g_error("zappy-tools: %s",err->message);
  10.155 @@ -335,8 +390,14 @@
  10.156  {
  10.157      PloverTransaction *transaction;
  10.158      char *pkgs[]={"nonexistant",NULL};
  10.159 +    gchar *root_uri;
  10.160      GError *err=NULL;
  10.161 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
  10.162 +    GFile *file;
  10.163 +    file=g_file_new_for_path("../razor-test-dir");
  10.164 +    root_uri=g_file_get_uri(file);
  10.165 +    g_object_unref(file);
  10.166 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
  10.167 +    g_free(root_uri);
  10.168      transaction=plover_transaction_new_remove_with_leaves(pkgs,&err);
  10.169      g_assert(!transaction);
  10.170      g_assert(g_error_matches(err,PLOVER_GENERAL_ERROR,
  10.171 @@ -354,9 +415,15 @@
  10.172      enum razor_install_action action;
  10.173      int count;
  10.174      char *name;
  10.175 +    gchar *root_uri;
  10.176      GError *err=NULL;
  10.177 +    GFile *file;
  10.178      GList *expected=NULL,*lnk;
  10.179 -    g_setenv("RAZOR_ROOT","../razor-test-dir",TRUE);
  10.180 +    file=g_file_new_for_path("../razor-test-dir");
  10.181 +    root_uri=g_file_get_uri(file);
  10.182 +    g_object_unref(file);
  10.183 +    g_setenv("RAZOR_ROOT",root_uri,TRUE);
  10.184 +    g_free(root_uri);
  10.185      transaction=plover_transaction_new_remove_with_leaves(NULL,&err);
  10.186      if (!transaction && err)
  10.187  	g_error("remove-all: %s",err->message);