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 enum razor_install_action action;
103 struct razor_rpm *rpm;
104 const char *name,*version,*arch;
107 ii=razor_set_create_install_iterator(system,next);
108 printf("Running Transaction\n");
109 while (razor_install_iterator_next(ii,&package,&action,&count))
111 if (action==RAZOR_INSTALL_ACTION_REMOVE)
113 razor_package_get_details(system,package,RAZOR_DETAIL_NAME,&name,
115 printf(" Removing : %s ",name);
116 if (razor_package_remove(system,next,package,install_root,count)<0)
118 "\nWarning: one or more errors occurred while removing %s",
124 razor_package_get_details(next,package,RAZOR_DETAIL_NAME,&name,
125 RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
127 printf(" Installing : %s ",name);
128 s=rpm_filename(name,version,arch);
129 file=plover_strconcat(base,"/rpms/",s,NULL);
131 rpm=razor_rpm_open(file);
134 fprintf(stderr,"failed to open rpm %s\n",file);
136 razor_install_iterator_destroy(ii);
140 razor_rpm_set_relocations(rpm,relocations);
141 razor_transaction_fixup_package(trans,package,rpm);
142 if (razor_rpm_install(rpm,install_root,1)<0)
144 fprintf(stderr,"failed to install rpm %s\n",file);
145 razor_rpm_close(rpm);
147 razor_install_iterator_destroy(ii);
150 razor_rpm_close(rpm);
155 razor_install_iterator_destroy(ii);
159 static int plover_mark_package_for_update(struct razor_transaction *trans,
160 struct razor_set *set,const char *pkg)
162 struct razor_package_iterator *pi;
163 struct razor_package *package;
166 pi=razor_package_iterator_create(set);
167 while (razor_package_iterator_next(pi,&package,RAZOR_DETAIL_NAME,&name,
170 if (!strcmp(name,pkg))
172 razor_transaction_update_package(trans,package);
177 razor_package_iterator_destroy(pi);
181 int plover_install(const char *base,const char *prefix,char **pkgs)
186 struct razor_root *root;
187 struct razor_set *system,*set,*upstream,*next;
188 struct razor_transaction *trans;
189 struct razor_relocations *relocations;
190 install_root=getenv("RAZOR_ROOT");
195 relocations=razor_relocations_create();
196 razor_relocations_add(relocations,"/usr",prefix);
199 * Calling razor_root_open() on a system that hasn't yet had
200 * razor_root_create() run generates a confusing error message
201 * on stderr. Avoid this by trying to open it R/O first which
202 * fails without generating any error.
204 set=razor_root_open_read_only(install_root);
206 razor_set_destroy(set);
208 razor_root_create(install_root);
209 root=razor_root_open(install_root);
212 system=razor_root_get_system_set(root);
215 razor_root_close(root);
218 s=plover_strconcat(base,"/repodata",NULL);
221 razor_root_close(root);
228 razor_root_close(root);
232 set=plover_razor_set_create_from_yum(base);
235 razor_root_close(root);
238 upstream=plover_relocate_packages(set,base,relocations);
239 razor_set_destroy(set);
240 trans=razor_transaction_create(system,upstream);
242 if (plover_mark_package_for_update(trans,system,pkgs[i]) &&
243 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 int plover_update(const char *base,const char *prefix,char **pkgs)
269 char *install_root,*s;
270 struct razor_root *root;
271 struct razor_set *system,*set,*upstream,*next;
272 struct razor_transaction *trans;
273 struct razor_relocations *relocations;
274 install_root=getenv("RAZOR_ROOT");
279 relocations=razor_relocations_create();
280 razor_relocations_add(relocations,"/usr",prefix);
282 set=razor_root_open_read_only(install_root);
285 razor_set_destroy(set);
286 root=razor_root_open(install_root);
289 system=razor_root_get_system_set(root);
292 razor_root_close(root);
295 s=plover_strconcat(base,"/repodata",NULL);
298 razor_root_close(root);
305 razor_root_close(root);
309 set=plover_razor_set_create_from_yum(base);
312 razor_root_close(root);
315 upstream=plover_relocate_packages(set,base,relocations);
316 razor_set_destroy(set);
317 trans=razor_transaction_create(system,upstream);
321 if (plover_mark_package_for_update(trans,system,pkgs[i]))
323 fprintf(stderr,"%s: Package not found\n",pkgs[i]);
324 razor_transaction_destroy(trans);
325 razor_set_destroy(upstream);
326 razor_set_destroy(system);
327 razor_root_close(root);
332 razor_transaction_update_all(trans);
333 razor_transaction_resolve(trans);
334 if (razor_transaction_describe(trans)>0)
336 razor_transaction_destroy(trans);
337 razor_set_destroy(upstream);
338 razor_set_destroy(system);
339 razor_root_close(root);
342 next=razor_transaction_commit(trans);
343 plover_run_transaction(trans,base,install_root,system,next,relocations);
344 razor_root_update(root,next);
345 razor_transaction_destroy(trans);
346 razor_set_destroy(next);
347 razor_set_destroy(upstream);
348 return razor_root_commit(root);
351 static int plover_mark_packages_for_removal(struct razor_transaction *trans,
352 struct razor_set *set,const char *pkg)
354 struct razor_package_iterator *pi;
355 struct razor_package *package;
358 pi=razor_package_iterator_create(set);
359 while (razor_package_iterator_next(pi,&package,RAZOR_DETAIL_NAME,&name,
362 if (!pkg || !strcmp(name,pkg))
364 razor_transaction_remove_package(trans,package);
368 razor_package_iterator_destroy(pi);
372 int plover_remove(char **pkgs)
376 struct razor_root *root;
377 struct razor_set *system,*set,*upstream,*next;
378 struct razor_transaction *trans;
379 install_root=getenv("RAZOR_ROOT");
382 set=razor_root_open_read_only(install_root);
385 razor_set_destroy(set);
386 root=razor_root_open(install_root);
389 system=razor_root_get_system_set(root);
392 razor_root_close(root);
395 upstream=razor_set_create_without_root();
396 trans=razor_transaction_create(system,upstream);
400 if (plover_mark_packages_for_removal(trans,system,pkgs[i]))
402 fprintf(stderr,"%s: Package not found\n",pkgs[i]);
403 razor_transaction_destroy(trans);
404 razor_set_destroy(upstream);
405 razor_set_destroy(system);
406 razor_root_close(root);
411 plover_mark_packages_for_removal(trans,system,NULL);
412 razor_transaction_resolve(trans);
413 if (razor_transaction_describe(trans)>0)
415 razor_transaction_destroy(trans);
416 razor_set_destroy(upstream);
417 razor_set_destroy(system);
418 razor_root_close(root);
421 next=razor_transaction_commit(trans);
422 plover_run_transaction(trans,NULL,install_root,system,next,NULL);
423 razor_root_update(root,next);
424 razor_transaction_destroy(trans);
425 razor_set_destroy(next);
426 razor_set_destroy(upstream);
427 return razor_root_commit(root);