2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009, 2011 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 struct razor_atomic *atomic,const char *base,
43 struct razor_relocations *relocations)
45 struct razor_importer *importer;
46 struct razor_property_iterator *prop_iter;
47 struct razor_package_iterator *pkg_iter;
48 struct razor_file_iterator *file_iter;
49 struct razor_package *package;
50 struct razor_property *property;
51 struct razor_rpm *rpm;
52 struct razor_set *new;
53 const char *name,*version,*arch,*summary,*desc,*url,*license;
56 importer=razor_importer_create();
57 pkg_iter=razor_package_iterator_create(set);
58 while (razor_package_iterator_next(pkg_iter,&package,RAZOR_DETAIL_NAME,
59 &name,RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
60 RAZOR_DETAIL_SUMMARY,&summary,RAZOR_DETAIL_DESCRIPTION,&desc,
61 RAZOR_DETAIL_URL,&url,RAZOR_DETAIL_LICENSE,&license,RAZOR_DETAIL_LAST))
63 s=rpm_filename(name,version,arch);
64 file=plover_strconcat(base,"/rpms/",s,NULL);
66 rpm=razor_rpm_open(file,atomic);
70 razor_package_iterator_destroy(pkg_iter);
71 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 new=razor_importer_finish(importer);
95 razor_set_set_header_version(new,razor_set_get_header_version(set));
99 int plover_run_transaction(struct razor_transaction *trans,
100 struct razor_install_iterator *ii,const char *base,const char *install_root,
101 struct razor_set *system,struct razor_set *next,struct razor_atomic *atomic,
102 struct razor_relocations *relocations,enum razor_stage_type stage)
104 struct razor_package *package;
105 enum razor_install_action action;
106 struct razor_rpm *rpm;
107 const char *name,*version,*arch;
110 razor_install_iterator_rewind(ii);
113 case RAZOR_STAGE_SCRIPTS_PRE:
114 printf("Running pre-transaction scripts\n");
116 case RAZOR_STAGE_FILES:
117 printf("Running Transaction\n");
119 case RAZOR_STAGE_SCRIPTS_POST:
120 printf("Running post-transaction scripts\n");
123 /* Keep the compiler happy */
126 while (razor_install_iterator_next(ii,&package,&action,&count))
128 if (action==RAZOR_INSTALL_ACTION_REMOVE)
130 razor_package_get_details(system,package,RAZOR_DETAIL_NAME,&name,
132 if (stage==RAZOR_STAGE_FILES)
133 printf(" Removing : %s ",name);
134 razor_package_remove(system,next,atomic,package,install_root,
136 if (stage==RAZOR_STAGE_FILES)
141 razor_package_get_details(next,package,RAZOR_DETAIL_NAME,&name,
142 RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
144 s=rpm_filename(name,version,arch);
145 file=plover_strconcat(base,"/rpms/",s,NULL);
147 rpm=razor_rpm_open(file,atomic);
151 if (stage==RAZOR_STAGE_FILES)
152 printf(" Installing : %s ",name);
154 razor_rpm_set_relocations(rpm,relocations);
155 razor_transaction_fixup_package(trans,package,rpm);
156 razor_rpm_install(rpm,atomic,install_root,1,stage);
157 razor_rpm_close(rpm);
158 if (stage==RAZOR_STAGE_FILES)
161 if (razor_atomic_in_error_state(atomic))
168 * Note: plover_commit_transaction() takes ownership of root which should
169 * not be used after it returns.
171 int plover_commit_transaction(struct razor_transaction *trans,const char *base,
172 const char *install_root,struct razor_root *root,struct razor_atomic *atomic,
173 struct razor_relocations *relocations)
176 struct razor_set *next,*system;
177 struct razor_install_iterator *ii;
178 razor_transaction_resolve(trans);
179 if (razor_transaction_describe(trans)>0)
181 razor_root_close(root);
184 next=razor_transaction_commit(trans);
185 system=razor_root_get_system_set(root);
186 ii=razor_set_create_install_iterator(system,next);
187 plover_run_transaction(trans,ii,base,install_root,system,next,atomic,
188 relocations,RAZOR_STAGE_SCRIPTS_PRE);
189 plover_run_transaction(trans,ii,base,install_root,system,next,atomic,
190 relocations,RAZOR_STAGE_FILES);
191 razor_root_update(root,next);
192 razor_root_commit(root);
193 retval=razor_atomic_commit(atomic);
195 plover_run_transaction(trans,ii,base,install_root,system,next,atomic,
196 relocations,RAZOR_STAGE_SCRIPTS_POST);
197 razor_set_unref(next);
198 razor_install_iterator_destroy(ii);
202 static int plover_mark_package_for_update(struct razor_transaction *trans,
203 struct razor_set *set,const char *pkg)
205 struct razor_package_iterator *pi;
206 struct razor_package *package;
209 pi=razor_package_iterator_create(set);
210 while (razor_package_iterator_next(pi,&package,RAZOR_DETAIL_NAME,&name,
213 if (!strcmp(name,pkg))
215 razor_transaction_update_package(trans,package);
220 razor_package_iterator_destroy(pi);
224 int plover_install(const char *base,const char *prefix,char **pkgs)
229 struct razor_root *root;
230 struct razor_set *system,*set,*upstream;
231 struct razor_transaction *trans;
232 struct razor_relocations *relocations;
233 struct razor_atomic *atomic;
234 install_root=getenv("RAZOR_ROOT");
239 relocations=razor_relocations_create();
240 razor_relocations_add(relocations,"/usr",prefix);
244 atomic=razor_atomic_open("Install packages");
246 * Calling razor_root_open() on a system that hasn't yet had
247 * razor_root_create() run generates a confusing error message
248 * on stderr. Avoid this by trying to open it R/O first which
249 * fails without generating any error.
251 set=razor_root_open_read_only(install_root,atomic);
253 razor_set_unref(set);
255 razor_root_create(install_root);
256 root=razor_root_open(install_root,atomic);
259 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
260 razor_atomic_destroy(atomic);
262 razor_relocations_destroy(relocations);
265 system=razor_root_get_system_set(root);
268 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
269 razor_root_close(root);
270 razor_atomic_destroy(atomic);
272 razor_relocations_destroy(relocations);
275 s=plover_strconcat(base,"/repodata",NULL);
287 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
288 razor_root_close(root);
289 razor_atomic_destroy(atomic);
291 razor_relocations_destroy(relocations);
294 set=plover_razor_set_create_from_yum(base);
297 upstream=plover_relocate_packages(set,atomic,base,relocations);
298 razor_set_unref(set);
304 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
305 razor_root_close(root);
306 razor_atomic_destroy(atomic);
308 razor_relocations_destroy(relocations);
311 trans=razor_transaction_create(system,upstream);
312 razor_set_unref(upstream);
314 if (plover_mark_package_for_update(trans,system,pkgs[i]) &&
315 plover_mark_package_for_update(trans,upstream,pkgs[i]))
317 fprintf(stderr,"%s: Package not found\n",pkgs[i]);
323 retval=plover_commit_transaction(trans,base,install_root,root,atomic,
326 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
329 razor_root_close(root);
330 razor_transaction_destroy(trans);
331 razor_atomic_destroy(atomic);
333 razor_relocations_destroy(relocations);
337 int plover_update(const char *base,const char *prefix,char **pkgs)
340 char *install_root,*s;
341 struct razor_root *root;
342 struct razor_set *system,*set,*upstream;
343 struct razor_transaction *trans;
344 struct razor_relocations *relocations;
345 struct razor_atomic *atomic;
346 install_root=getenv("RAZOR_ROOT");
351 relocations=razor_relocations_create();
352 razor_relocations_add(relocations,"/usr",prefix);
356 atomic=razor_atomic_open("Update packages");
357 set=razor_root_open_read_only(install_root,atomic);
360 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
361 razor_atomic_destroy(atomic);
363 razor_relocations_destroy(relocations);
366 razor_set_unref(set);
367 root=razor_root_open(install_root,atomic);
370 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
371 razor_atomic_destroy(atomic);
373 razor_relocations_destroy(relocations);
376 system=razor_root_get_system_set(root);
379 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
380 razor_root_close(root);
381 razor_atomic_destroy(atomic);
383 razor_relocations_destroy(relocations);
386 s=plover_strconcat(base,"/repodata",NULL);
398 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
399 razor_root_close(root);
400 razor_atomic_destroy(atomic);
402 razor_relocations_destroy(relocations);
405 set=plover_razor_set_create_from_yum(base);
408 upstream=plover_relocate_packages(set,atomic,base,relocations);
409 razor_set_unref(set);
415 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
416 razor_root_close(root);
417 razor_atomic_destroy(atomic);
419 razor_relocations_destroy(relocations);
422 trans=razor_transaction_create(system,upstream);
423 razor_set_unref(upstream);
427 if (plover_mark_package_for_update(trans,system,pkgs[i]))
429 fprintf(stderr,"%s: Package not found\n",pkgs[i]);
435 razor_transaction_update_all(trans);
437 retval=plover_commit_transaction(trans,base,install_root,root,atomic,
440 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
443 razor_root_close(root);
444 razor_transaction_destroy(trans);
446 razor_relocations_destroy(relocations);
447 razor_atomic_destroy(atomic);
451 static int plover_mark_packages_for_removal(struct razor_transaction *trans,
452 struct razor_set *set,const char *pkg)
454 struct razor_package_iterator *pi;
455 struct razor_package *package;
458 pi=razor_package_iterator_create(set);
459 while (razor_package_iterator_next(pi,&package,RAZOR_DETAIL_NAME,&name,
462 if (!pkg || !strcmp(name,pkg))
464 razor_transaction_remove_package(trans,package);
468 razor_package_iterator_destroy(pi);
472 int plover_remove(char **pkgs)
476 struct razor_root *root;
477 struct razor_set *system,*set,*upstream;
478 struct razor_transaction *trans;
479 struct razor_atomic *atomic;
480 install_root=getenv("RAZOR_ROOT");
483 atomic=razor_atomic_open("Remove packages");
484 set=razor_root_open_read_only(install_root,atomic);
487 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
488 razor_atomic_destroy(atomic);
491 razor_set_unref(set);
492 root=razor_root_open(install_root,atomic);
495 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
496 razor_atomic_destroy(atomic);
499 system=razor_root_get_system_set(root);
502 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
503 razor_root_close(root);
504 razor_atomic_destroy(atomic);
507 upstream=razor_set_create_without_root();
508 trans=razor_transaction_create(system,upstream);
509 razor_set_unref(upstream);
513 if (plover_mark_packages_for_removal(trans,system,pkgs[i]))
515 fprintf(stderr,"%s: Package not found\n",pkgs[i]);
521 plover_mark_packages_for_removal(trans,system,NULL);
525 plover_commit_transaction(trans,NULL,install_root,root,atomic,NULL);
527 fprintf(stderr,"%s\n",razor_atomic_get_error_msg(atomic));
530 razor_root_close(root);
531 razor_transaction_destroy(trans);
532 razor_atomic_destroy(atomic);
537 * Note: If there are no installed files, then any prefix will match.
540 int plover_installed_files_match_prefix(const char *prefix)
545 struct razor_set *set;
546 struct razor_atomic *atomic;
547 struct razor_package *package;
548 struct razor_package_iterator *pi;
549 struct razor_file_iterator *fi;
551 while(len && prefix[len-1]=='/')
553 install_root=getenv("RAZOR_ROOT");
556 atomic=razor_atomic_open("Query packages");
557 set=razor_root_open_read_only(install_root,atomic);
560 pi=razor_package_iterator_create(set);
562 razor_package_iterator_next(pi,&package,RAZOR_DETAIL_LAST))
564 fi=razor_file_iterator_create(set,package,0);
565 while (matches && razor_file_iterator_next(fi,&name))
567 if (strncmp(name,prefix,len) ||
568 name[len]!='\0' && name[len]!='/')
571 razor_file_iterator_destroy(fi);
573 razor_package_iterator_destroy(pi);
574 razor_set_unref(set);
576 razor_atomic_destroy(atomic);