From 3317db26fcdadc2fbf940eab626117852360979d Mon Sep 17 00:00:00 2001 From: J. Ali Harlow Date: Thu, 13 Aug 2009 19:01:16 +0100 Subject: [PATCH] Add an update command --- .gitignore | 2 + Makefile.am | 2 +- configure.ac | 4 ++- plover/plover.h | 2 + plover/razor.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ plover/util.c | 48 +++++++++++++++++++++++++++ setup/setup.c | 38 ++++----------------- update/Makefile.am | 22 ++++++++++++ update/icon16.png | Bin 0 -> 821 bytes update/icon22.png | Bin 0 -> 1237 bytes update/icon32.png | Bin 0 -> 2005 bytes update/resources.rc.in | 32 ++++++++++++++++++ update/update.c | 52 +++++++++++++++++++++++++++++ 13 files changed, 254 insertions(+), 33 deletions(-) create mode 100644 update/Makefile.am create mode 100644 update/icon16.png create mode 100644 update/icon22.png create mode 100644 update/icon32.png create mode 100644 update/resources.rc.in create mode 100644 update/update.c diff --git a/.gitignore b/.gitignore index 4eedacf..5f74325 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ stamp-h1 plover/plover.pc setup/resources.rc setup/setup +update/resources.rc +update/update diff --git a/Makefile.am b/Makefile.am index 8932f06..23ca042 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1 +1 @@ -SUBDIRS=plover setup +SUBDIRS=plover setup update diff --git a/configure.ac b/configure.ac index 9a640e2..5c102bf 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. -AC_INIT([plover],[0.1],[ali@juiblex.co.uk]) +AC_INIT([plover],[0.2],[ali@juiblex.co.uk]) AC_PREREQ(2.59) AC_CONFIG_AUX_DIR([config]) AC_CONFIG_SRCDIR([plover/plover.h]) @@ -11,6 +11,8 @@ plover/Makefile plover/plover.pc setup/Makefile setup/resources.rc +update/Makefile +update/resources.rc ]) AM_INIT_AUTOMAKE(no-define) case $VERSION in diff --git a/plover/plover.h b/plover/plover.h index 97d0eeb..291d8fc 100644 --- a/plover/plover.h +++ b/plover/plover.h @@ -34,6 +34,8 @@ struct comps }; char *plover_strconcat(const char *string,...); +char *plover_default_prefix_for_vendor(const char *vendor); +char *plover_get_program_directory(const char *argv0); struct razor_set *plover_razor_set_create_from_yum(const char *base); diff --git a/plover/razor.c b/plover/razor.c index 4fb4c41..42838ca 100644 --- a/plover/razor.c +++ b/plover/razor.c @@ -262,6 +262,91 @@ int plover_install(const char *base,const char *prefix,char **pkgs) return razor_root_commit(root); } +int plover_update(const char *base,const char *prefix,char **pkgs) +{ + int i; + char *install_root,*s; + struct razor_root *root; + struct razor_set *system,*set,*upstream,*next; + struct razor_transaction *trans; + struct razor_relocations *relocations; + install_root=getenv("RAZOR_ROOT"); + if (!install_root) + install_root=""; + if (prefix) + { + relocations=razor_relocations_create(); + razor_relocations_add(relocations,"/usr",prefix); + } + set=razor_root_open_read_only(install_root); + if (!set) + return 0; + razor_set_destroy(set); + root=razor_root_open(install_root); + if (!root) + return -1; + system=razor_root_get_system_set(root); + if (!system) + { + razor_root_close(root); + return -1; + } + s=plover_strconcat(base,"/repodata",NULL); + if (!s) + { + razor_root_close(root); + return -1; + } + if (chdir(s)<0) + { + perror(s); + free(s); + razor_root_close(root); + return -1; + } + free(s); + set=plover_razor_set_create_from_yum(base); + if (!set) + { + razor_root_close(root); + return -1; + } + upstream=plover_relocate_packages(set,base,relocations); + razor_set_destroy(set); + trans=razor_transaction_create(system,upstream); + if (pkgs) + for(i=0;pkgs[i];i++) + { + if (plover_mark_package_for_update(trans,system,pkgs[i])) + { + fprintf(stderr,"%s: Package not found\n",pkgs[i]); + razor_transaction_destroy(trans); + razor_set_destroy(upstream); + razor_set_destroy(system); + razor_root_close(root); + return -1; + } + } + else + razor_transaction_update_all(trans); + razor_transaction_resolve(trans); + if (razor_transaction_describe(trans)>0) + { + razor_transaction_destroy(trans); + razor_set_destroy(upstream); + razor_set_destroy(system); + razor_root_close(root); + return -1; + } + next=razor_transaction_commit(trans); + plover_run_transaction(trans,base,install_root,system,next,relocations); + razor_root_update(root,next); + razor_transaction_destroy(trans); + razor_set_destroy(next); + razor_set_destroy(upstream); + return razor_root_commit(root); +} + static int plover_mark_packages_for_removal(struct razor_transaction *trans, struct razor_set *set,const char *pkg) { diff --git a/plover/util.c b/plover/util.c index df4d3f9..989ad99 100644 --- a/plover/util.c +++ b/plover/util.c @@ -19,6 +19,11 @@ #include #include #include +#include +#ifdef WIN32 +#include +#include +#endif #include "config.h" #include "plover.h" @@ -51,3 +56,46 @@ char *plover_strconcat(const char *string,...) } return result; } + +char *plover_default_prefix_for_vendor(const char *vendor) +{ +#ifdef WIN32 + char path[PATH_MAX]; + SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES|CSIDL_FLAG_DONT_VERIFY,NULL,0, + path); + return plover_strconcat(path,"\\",vendor?vendor:"Plover",NULL); +#else + return NULL; +#endif +} + +/* + * Get the directory containing the program executable. + */ + +char *plover_get_program_directory(const char *argv0) +{ + char *s; +#ifdef WIN32 + char path[PATH_MAX],*t; + GetModuleFileName(NULL,path,sizeof(path)); + s=strrchr(path,'/'); + if (s) + { + t=strrchr(s,'\\'); + if (t) + s=t; + } + else + s=strrchr(path,'\\'); + if (s) + *s='\0'; + return strdup(path); +#else + s=argv0?strrchr(argv0,'/'):NULL; + if (s) + return strndup(argv0,s-argv0); + else + return strdup("."); +#endif +} diff --git a/setup/setup.c b/setup/setup.c index 9bfbda1..05b443c 100644 --- a/setup/setup.c +++ b/setup/setup.c @@ -86,34 +86,15 @@ static void *alloc_lua(void *user_data,void *ptr,size_t osize,size_t nsize) return realloc(ptr,nsize); } -void setup() +void setup(const char *argv0) { - char path[PATH_MAX],*s,*t,*prefix; + char *path,*s,*prefix; int changed; struct comps *comps; struct comps_group *group; struct comps_requirement *pkg; struct vector *packages=NULL; -#ifdef WIN32 - SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES|CSIDL_FLAG_DONT_VERIFY,NULL,0, - path); - prefix=strdup(path); - GetModuleFileName(NULL,path,sizeof(path)); - s=strrchr(path,'/'); - if (s) - { - t=strrchr(s,'\\'); - if (t) - s=t; - } - else - s=strrchr(path,'\\'); - if (s) - *s='\0'; -#else - strcpy(path,"/tmp"); - prefix=NULL; -#endif + path=plover_get_program_directory(argv0); s=plover_strconcat(path,"/repodata/comps.xml",NULL); comps=plover_comps_new_from_file(s); if (!comps) @@ -122,11 +103,7 @@ void setup() exit(1); } free(s); -#ifdef WIN32 - s=plover_strconcat(prefix,"\\",comps->vendor?comps->vendor:"Plover",NULL); - free(prefix); - prefix=s; -#endif + prefix=plover_default_prefix_for_vendor(comps->vendor); group=plover_comps_lookup_group(comps,"base"); if (!group) { @@ -151,6 +128,7 @@ void setup() } } } while(changed); + plover_comps_free(comps); if (!packages->len) { fprintf(stderr,"No packages to install\n"); @@ -158,10 +136,8 @@ void setup() } plover_install(path,prefix,packages->strings); vector_free(packages); - plover_comps_free(comps); -#ifdef WIN32 free(prefix); -#endif + free(path); } int main(int argc,char **argv) @@ -171,5 +147,5 @@ int main(int argc,char **argv) if (argc>1 && !strcmp(argv[1],"-u")) plover_remove(NULL); else - setup(); + setup(argv[0]); } diff --git a/update/Makefile.am b/update/Makefile.am new file mode 100644 index 0000000..c39f6de --- /dev/null +++ b/update/Makefile.am @@ -0,0 +1,22 @@ +AM_CFLAGS=-g $(SETUP_CFLAGS) +LDADD=../plover/libplover.la $(SETUP_LIBS) +INCLUDES=-I$(top_srcdir) + +bin_PROGRAMS=update + +update_SOURCES=update.c +update_LDFLAGS=-all-static +if HAVE_WINDRES +update_SOURCES+=resources.rc +endif + +.png.pnm: + pngtopnm $< | pnmquant 256 > $@ + +resources.$(OBJEXT): resources.rc update.ico + $(WINDRES) resources.rc $@ + +update.ico: icon16.pnm icon22.pnm icon32.pnm + ppmtowinicon -output=$@ $^ + +EXTRA_DIST=icon16.png icon22.png icon32.png diff --git a/update/icon16.png b/update/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca1590b23eaa46ea87ddfedf1433834424c2f74 GIT binary patch literal 821 zcmV-51Iqk~P)3dcc~(o? z#Sj*zlqfriR2D*5m_j0zgQH!9w1AjzW~bUj!D)$UzIf#Er?uhs@#Xv+e>VaEVq$ia zIA*tZOMh}^fkz6@C4M>o_1i}2bvG75+#EgjL2M~)-F1cCSpV^?|JUY4TLQSf_r3Ph z!aJqG{sZVl8av@)>lDszwG%F;DQ=rrzCRboLQP?qZ_1Nrc8t=gE00DZ#qZ{0w8#^9 z3f+x3*xBZRdpuMW!G8eRzI%;oC2x#oxj*ilE0HT#}1M~{wkIG@LH9J<{uzm?0J zTl$vlpCzo|`W-8nruhPJ+9(!_X{A(kVqzj~+cvdY4XrhqOontiO|#i#{_GqNTg#Y4 zBnKYk(n^WR*}4H>Dy62!#>P^%ZBwaK7#QfIw>OKFCZ6XZgy5l(CurM;80^n5IB?+3 zNrVuS`F!5+Jda%NeyY`Ld^%rZ^XgTCz^7iXlgs6});)-&G(uQ=7rg}tf}lrhjqAEt zmSpw9D&vP?dF5v;%c9+GW11%IK$099;riBhfb-=Xkifge_v zIXXH@r{fa@0j*XG<7SKRKAVk%L;^Ly$Xf#MBlXN;=wzg_itAC)iW_x>^jg5^) z7=|D3_mN_0Y3W9xP`I$Rw)S!&k+8DaERN$41Ob&wC0<`&_rfq7pP8B2+z(*viDI!h z>^RQ5hG9G(1VLI#Sr5bTE8xTF>FKTg%mDua(wQ7yN$@|=00000NkvXXu0mjfqMeBn literal 0 HcmV?d00001 diff --git a/update/icon22.png b/update/icon22.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7f82c16514a5466bdbabfcea70fbab6b363a04 GIT binary patch literal 1237 zcmV;`1S|y7{`D2%Q-veInSQ$@fDXc+jLtxM@Ct`REU*YffYgp zVHwfr1q9KeurKx@kf6TE%D`DfFJ!HVN?DSkMGJ{6&BkVP>fEO8+2->+dtT1D&*_8P znxceX`on!+7Z*4G>(BLa3r5lWthYc)`Ku5j2*WVqI$_zaWrD(!>zXcp1Rwx*J)d}7 zOZ&a5g{!>8luCq>NU5<)T!;h^A*Dhpjg$%@6;dgL)JQez3pnuc)-az*H5W4%UKGuZ z-n~+)J^$(VADim$tld zz2yZUJ$QkE^QZE;bM4v>{A%&RbBWF{467$s)HEw?J+)}rN)Z-@ua8yQbaotPaG?J+ zQy5v2I@i5gLv&gS)qJ71pvBu0m0wfyf|D zh>Q%{goKeHo-mkb?^1yE?_TT>W6E|l#-kBu4ntEPrhdWAR8?0~R#t}A8sGQnIdg_X z2M^%&eoid+*EOpW=wS9U+waiJ1m)22*Y$jkc)D93R&HZ(LO9LK>JLuqL#$z(ZY zWeGelhSrKO4C(9ZLkK~`!rMsMwM;6HF{#WY5ig^lYuGs}n&G zkV>VPGI=VGJhYY|2pAX`AeBm?wZ?HAPM$nT)O(P9?FRu739Z|QbN-`%nMfRZp7&O3 zYwPB!s;b1;SoywBI-Mbx%aP0F@qHhyHQ8*Ij*gCW*YK>W9Xm3EKsd1kV^9FCt*w4d zP0imYPMla%S68Pz&m)SW@gs!5vMjRMEQb#t_WSz!8nox+tZ{WHNMhbwx*y9`!prJ6~yPYH9&;S5rC$ab;k`h7Hq`$>c`Y zbssAhixs1#>C5GEpXT%Vx3_KEcIH}S{|o*B32ON&%A*i300000NkvXXu0mjfwg6F_ literal 0 HcmV?d00001 diff --git a/update/icon32.png b/update/icon32.png new file mode 100644 index 0000000000000000000000000000000000000000..361cd5113f8cf4518087c862e1ff18d1c9088fbf GIT binary patch literal 2005 zcmV;`2P*i9P)B^3n4~8O*X`YQb=lSWm77&+il$1eV^^t%^Z(!f^PJ~A@P9V3bl~MjGJCAx@W%nB+!Q7%Z-4N` z;;9u09Qa<_6OMA9S+k+L#m{zt1uFznNDu-cB%=022!yQl5w&>%O=}u`DF8{OFwVJ; z-YF$<^w>i$%)Znh@XH_IwbTBRpSt4iTfh2~^xy}FIMH{Ea(NyAYcGkSyYGG6b$uVDT#Auke!*NCbOp4F zpoAgDV zD2=SmIgUcA+PI?;QnJ)8jGQ*BT78-FJmCoEdR1j=HhRk8pQn!|=cg{rmkLvDci#J* zWgo9>7Km!CW=X9rS(W=&iPGHEnc>qz*R0O!G_XZgbuk_122Vz_vojOQOYd)A+xa{Q zVS>VCl4t_57Gn~uNia!*F$pG#k$xK&hW}0+CQsssttUVHV4t;SvjT|YWZlg4^hXkQ z$3f{A>#o`+Rt)P)0940JiP?Ymd4+ejQ1i7Tb1&EiV}EGN@6W)hTN#`UvEDenZH`ue`y81TfRMD&|) zXWPA$oZNHYldi>JjbVJ+FqD^EC@M;UAu$Hub!bajI@3iuvjJLEL9qs74K_)z)+{@U z##s7~y;&aWC}w(kFaWA~f!20c62$LN zQG^fz*L6vyQh1(+@B0Knz~RI1aIXIt&g3D4iI#6DKska{jPua1iinlbYa4)CYvMS@aU8-hB$Y~W&pltFZ~c1y_O4>}+}n#XQXNf7iJ4o@ zZ4rTlg3({1*Vo<#GriNTpIZj)PJPDJ72MAf-e~+3@p?H{Qh9=qRP3JRPQg znYK!~oc~V*JkNV!*REYHnM{UUE{E0{Yb{DCT-U|(JUq{Bkf{?X7K?;o$nHJ2^IC3< zZQcZ)2o?c3ZVTs!FF~NEr{`L&^(|dpUF7q5JkM(o$Yxu~WHJrVx)M@K^7%YL5TKMI zolbN84WDNG)EJ*i|6`F0l;6_qm4=TR$y!SJmG16tPfCeWik6lZ(&;qq?d@bT863x9 zVPS!}xp_b!1myF13WWl39FrsoK@hNI>sE5%x&}cZ9fWjnwAcL8vd*ocfY$o14I4H{ zAq2kfH+<{+9@bh;o&1Q>;GalQ7mB_3@nAi4X#L zkw6-#P`x~ox&lH)V+<`VDJs@SI!?7oiBx`_KzogZYF0p4YaQ2h(OLubg2L9+u{hEorBl^ViH0kU zu?+TEWP5TZfA7=!D&=+51YP83P&3d8nB zZr!q(N~J=jQYMa*dK?i&5v5X@bX(FOj1WjigB2EN1?HA2KoA6fnVOoqdF|S@i%xJH zM-&PLZrHJtxy@UM!jRjpTuY@=CJaMLrE)dcguocX{QNvp!m3Yft43KZ<|ju^+EU`2 zt8Lpj1$6>8pU=O3{P^+j@7S@!uPcxw2{SXZRapgOG8wG36pQl&LBPz+EY@1I*3^S{ zcz75!`yq$lcA$ex3?3=F$)U| zjcgZ&5!M=_D5g@WFgG{XIR8QjwAO@S$iTor<&8r__xJS`b4@~;8ekbH)>^oT01%bS z<%eH=_0?mKKKf{?8f>bOjI6Z;LC}bFtu@9NqA0>~9E1?`_xC4Bk{syk>wA;SG^e@q z-h1!O?cBLjjEs!j(%s$dxUSm(Z@$}`$LiT}WMsq+4Gj(T_Vzw7F)>m4ZwP20bL7a8 zGhJO>R}2mgZr`|Zqm#{Mmwi-CKoZw=iQ|}ofdMl*Iy%}ajWi^bv_ + +MAINICON ICON "update.ico" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @PLOVER_MAJOR_VERSION@,@PLOVER_MINOR_VERSION@,@PLOVER_MICRO_VERS +ION@,0 + PRODUCTVERSION @PLOVER_MAJOR_VERSION@,@PLOVER_MINOR_VERSION@,@PLOVER_MICRO_V +ERSION@,0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + { + BLOCK "StringFileInfo" + { + BLOCK "080904B0" + { + VALUE "CompanyName","The plover development team" + VALUE "FileDescription","Plover setup program" + VALUE "FileVersion","@PACKAGE_VERSION@" + VALUE "InternalName","update" + VALUE "LegalCopyright", + "Copyright (c) 2009 J. Ali Harlow et al" + VALUE "OriginalFilename","update.exe" + VALUE "ProductName","plover" + VALUE "ProductVersion","@PACKAGE_VERSION@" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation",0x809,0x4B0 + } + } diff --git a/update/update.c b/update/update.c new file mode 100644 index 0000000..13fc828 --- /dev/null +++ b/update/update.c @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2009 J. Ali Harlow + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include "config.h" +#include "plover/plover.h" +#include "whelk/whelk.h" + +LUALIB_API int luaopen_posix(lua_State *L); + +void update(const char *argv0) +{ + char *path,*s,*prefix; + struct comps *comps; + path=plover_get_program_directory(argv0); + s=plover_strconcat(path,"/repodata/comps.xml",NULL); + comps=plover_comps_new_from_file(s); + if (!comps) + { + perror(s); + exit(1); + } + free(s); + prefix=plover_default_prefix_for_vendor(comps->vendor); + plover_comps_free(comps); + plover_update(path,prefix,NULL); + free(prefix); + free(path); +} + +int main(int argc,char **argv) +{ + razor_set_lua_loader("posix",luaopen_posix); + razor_set_lua_loader("whelk",luaopen_whelk); + update(argv[0]); +} -- 1.7.1