2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009 J. Ali Harlow <ali@juiblex.co.uk>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include "plover/plover.h"
30 static char *rpm_filename(const char *name,const char *version,const char *arch)
33 v=strchr(version,':'); /* Skip epoch */
38 return plover_strconcat(name,"-",v,".",arch,".rpm",NULL);
41 struct razor_set *plover_relocate_packages(struct razor_set *set,
42 const char *base,struct razor_relocations *relocations)
44 struct razor_importer *importer;
45 struct razor_property_iterator *prop_iter;
46 struct razor_package_iterator *pkg_iter;
47 struct razor_file_iterator *file_iter;
48 struct razor_package *package;
49 struct razor_property *property;
50 struct razor_rpm *rpm;
51 const char *name,*version,*arch,*summary,*desc,*url,*license;
54 importer=razor_importer_create();
55 pkg_iter=razor_package_iterator_create(set);
56 while (razor_package_iterator_next(pkg_iter,&package,RAZOR_DETAIL_NAME,
57 &name,RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
58 RAZOR_DETAIL_SUMMARY,&summary,RAZOR_DETAIL_DESCRIPTION,&desc,
59 RAZOR_DETAIL_URL,&url,RAZOR_DETAIL_LICENSE,&license,RAZOR_DETAIL_LAST))
61 s=rpm_filename(name,version,arch);
62 file=plover_strconcat(base,"/rpms/",s,NULL);
64 rpm=razor_rpm_open(file);
67 fprintf(stderr,"failed to open rpm %s\n",file);
68 razor_package_iterator_destroy(pkg_iter);
69 razor_importer_destroy(importer);
74 razor_relocations_set_rpm(relocations,rpm);
76 razor_importer_begin_package(importer,name,version,arch);
77 razor_importer_add_details(importer,summary,desc,url,license);
78 prop_iter=razor_property_iterator_create(set,package);
79 while (razor_property_iterator_next(prop_iter,&property,&name,&flags,
81 razor_importer_add_property(importer,name,flags,version);
82 razor_property_iterator_destroy(prop_iter);
83 file_iter=razor_file_iterator_create(set,package,0);
84 while (razor_file_iterator_next(file_iter,&name))
86 name=razor_relocations_apply(relocations,name);
87 razor_importer_add_file(importer,name);
89 razor_file_iterator_destroy(file_iter);
90 razor_importer_finish_package(importer);
92 razor_package_iterator_destroy(pkg_iter);
93 return razor_importer_finish(importer);
96 int plover_run_transaction(struct razor_transaction *trans,const char *base,
97 const char *install_root,struct razor_set *system,struct razor_set *next,
98 struct razor_relocations *relocations)
100 struct razor_install_iterator *ii;
101 struct razor_package *package;
102 struct razor_set *set;
103 enum razor_install_action action;
104 struct razor_rpm *rpm;
105 const char *name,*version,*arch;
108 ii=razor_set_create_install_iterator(system,next);
109 printf("Running Transaction\n");
110 while (razor_install_iterator_next(ii,&set,&package,&action,&count))
112 if (action==RAZOR_INSTALL_ACTION_REMOVE)
114 razor_package_get_details(set,package,RAZOR_DETAIL_NAME,&name,
116 printf(" Removing : %s ",name);
117 if (razor_package_remove(set,package,install_root,0)<0)
119 "\nWarning: one or more errors occurred while removing %s",
125 razor_package_get_details(set,package,RAZOR_DETAIL_NAME,&name,
126 RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
128 printf(" Installing : %s ",name);
129 s=rpm_filename(name,version,arch);
130 file=plover_strconcat(base,"/rpms/",s,NULL);
132 rpm=razor_rpm_open(file);
135 fprintf(stderr,"failed to open rpm %s\n",file);
137 razor_install_iterator_destroy(ii);
141 razor_rpm_set_relocations(rpm,relocations);
142 razor_transaction_fixup_package(trans,package,rpm);
143 if (razor_rpm_install(rpm,install_root,1)<0)
145 fprintf(stderr,"failed to install rpm %s\n",file);
146 razor_rpm_close(rpm);
148 razor_install_iterator_destroy(ii);
151 razor_rpm_close(rpm);
156 razor_install_iterator_destroy(ii);
160 static int plover_mark_package_for_update(struct razor_transaction *trans,
161 struct razor_set *set,const char *pkg)
163 struct razor_package_iterator *pi;
164 struct razor_package *package;
167 pi=razor_package_iterator_create(set);
168 while (razor_package_iterator_next(pi,&package,RAZOR_DETAIL_NAME,&name,
171 if (!strcmp(name,pkg))
173 razor_transaction_update_package(trans,package);
178 razor_package_iterator_destroy(pi);
182 int plover_install(const char *base,const char *prefix,char **pkgs)
187 struct razor_root *root;
188 struct razor_set *system,*set,*upstream,*next;
189 struct razor_transaction *trans;
190 struct razor_relocations *relocations;
191 install_root=getenv("RAZOR_ROOT");
196 relocations=razor_relocations_create();
197 razor_relocations_add(relocations,"/usr",prefix);
200 * Calling razor_root_open() on a system that hasn't yet had
201 * razor_root_create() run generates a confusing error message
202 * on stderr. Avoid this by trying to open it R/O first which
203 * fails without generating any error.
205 set=razor_root_open_read_only(install_root);
207 razor_set_destroy(set);
209 razor_root_create(install_root);
210 root=razor_root_open(install_root);
213 system=razor_root_get_system_set(root);
216 razor_root_close(root);
219 s=plover_strconcat(base,"/repodata",NULL);
222 razor_root_close(root);
229 razor_root_close(root);
233 set=plover_razor_set_create_from_yum(base);
236 razor_root_close(root);
239 upstream=plover_relocate_packages(set,base,relocations);
240 razor_set_destroy(set);
241 trans=razor_transaction_create(system,upstream);
243 if (plover_mark_package_for_update(trans,upstream,pkgs[i]))
245 fprintf(stderr,"%s: Package not found\n",pkgs[i]);
246 razor_root_close(root);
249 razor_transaction_resolve(trans);
250 if (razor_transaction_describe(trans)>0)
252 razor_root_close(root);
255 next=razor_transaction_commit(trans);
256 plover_run_transaction(trans,base,install_root,system,next,relocations);
257 razor_root_update(root,next);
258 razor_transaction_destroy(trans);
259 razor_set_destroy(next);
260 razor_set_destroy(upstream);
262 razor_relocations_destroy(relocations);
263 return razor_root_commit(root);
266 static int plover_mark_packages_for_removal(struct razor_transaction *trans,
267 struct razor_set *set,const char *pkg)
269 struct razor_package_iterator *pi;
270 struct razor_package *package;
273 pi=razor_package_iterator_create(set);
274 while (razor_package_iterator_next(pi,&package,RAZOR_DETAIL_NAME,&name,
277 if (!pkg || !strcmp(name,pkg))
279 razor_transaction_remove_package(trans,package);
283 razor_package_iterator_destroy(pi);
287 int plover_remove(char **pkgs)
291 struct razor_root *root;
292 struct razor_set *system,*set,*upstream,*next;
293 struct razor_transaction *trans;
294 install_root=getenv("RAZOR_ROOT");
297 set=razor_root_open_read_only(install_root);
300 razor_set_destroy(set);
301 root=razor_root_open(install_root);
304 system=razor_root_get_system_set(root);
307 razor_root_close(root);
310 upstream=razor_set_create_without_root();
311 trans=razor_transaction_create(system,upstream);
315 if (plover_mark_packages_for_removal(trans,system,pkgs[i]))
317 fprintf(stderr,"%s: Package not found\n",pkgs[i]);
318 razor_transaction_destroy(trans);
319 razor_set_destroy(upstream);
320 razor_set_destroy(system);
321 razor_root_close(root);
326 plover_mark_packages_for_removal(trans,system,NULL);
327 razor_transaction_resolve(trans);
328 if (razor_transaction_describe(trans)>0)
330 razor_transaction_destroy(trans);
331 razor_set_destroy(upstream);
332 razor_set_destroy(system);
333 razor_root_close(root);
336 next=razor_transaction_commit(trans);
337 plover_run_transaction(trans,NULL,install_root,system,next,NULL);
338 razor_root_update(root,next);
339 razor_transaction_destroy(trans);
340 razor_set_destroy(next);
341 razor_set_destroy(upstream);
342 return razor_root_commit(root);