Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=fwife.git;a=commitdiff;h=ddea23e0375cb2088d74da9728d151fcd11138a3

commit ddea23e0375cb2088d74da9728d151fcd11138a3
Author: Elentir <elen...@mailoo.org>
Date:   Fri Jul 10 15:33:10 2009 +0200

improve install plugin

* add some informations during packages downloading
* add some errors msgs
* support for corrupted file downloads

diff --git a/src/plugins/install.c b/src/plugins/install.c
index 7fbcf6a..8632177 100644
--- a/src/plugins/install.c
+++ b/src/plugins/install.c
@@ -23,7 +23,10 @@
#include "config.h"
#endif

+#include <glib.h>
+#include <glib/gstdio.h>
#include <stdio.h>
+#include <sys/time.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
@@ -35,11 +38,18 @@

static GtkWidget *progress;
static GtkWidget *labelpkg;
+static GtkWidget *dlinfo;
+static long long compressedsize = 0;

+float rate;
int offset;
int howmany;
int remains;
char reponame[PM_DLFNM_LEN+1];
+int xferred1;
+struct timeval t0, t;
+int oldsize = 0;
+int dlsize = 0;

plugin_t plugin =
{
@@ -71,32 +81,86 @@ GtkWidget *load_gtk_widget()
vbox = gtk_vbox_new (FALSE, 5);

labelpkg = gtk_label_new("");
-       progress = gtk_progress_bar_new();
+       progress = gtk_progress_bar_new();
+       dlinfo = gtk_label_new("");
gtk_box_pack_start (GTK_BOX (vbox), progress, TRUE, FALSE, 5);
+       gtk_box_pack_start (GTK_BOX (vbox), dlinfo, FALSE, FALSE, 5);
gtk_box_pack_start (GTK_BOX (vbox), labelpkg, FALSE, FALSE, 5);
return vbox;
}

+void progress_conv(unsigned char event, void *data1, void *data2, void *data3, 
int *response)
+{
+       switch(event) {
+               case PM_TRANS_CONV_CORRUPTED_PKG:
+                       *response = 1;
+                       break;
+               default:
+                       break;
+       }
+}
+
int progress_update(PM_NETBUF *ctl, int xferred, void *arg)
{
int size;
+       float showedsize, totalsize;
int per;
-       char *name = NULL, *ptr = NULL;
-
+       char *name = NULL, *ptr = NULL, *dlinfostr = NULL;
+       char rate_text[10];
+       struct timeval t1;
+       float  tdiff;
+
while (gtk_events_pending())
gtk_main_iteration ();

ctl = NULL;
size = *(int*)arg;
+       if(oldsize == 0)
+               oldsize = size;
+       if(oldsize != size) {
+               dlsize += oldsize;
+               oldsize = size;
+       }
+       showedsize = ((float)((dlsize + (xferred+offset))/1024))/1024;
+       totalsize = ((float)(compressedsize/1024))/1024;
per = ((float)(xferred+offset) / size) * 100;
+       gettimeofday (&t1, NULL);
+
+       if (xferred+offset == size)
+               t = t0;
+
+    tdiff = t1.tv_sec-t.tv_sec + (float)(t1.tv_usec-t.tv_usec) / 1000000;
+    if (xferred+offset == size)
+    {
+               rate = xferred / (tdiff * 1024);
+    }
+    else if (tdiff > 1)
+    {
+               rate = (xferred - xferred1) / (tdiff * 1024);
+        xferred1 = xferred;
+        gettimeofday (&t, NULL);
+    }
+    if (rate > 1000)
+    {
+               sprintf (rate_text, "%6.0fK/s", rate);
+    }
+    else
+    {
+               sprintf (rate_text, "%6.1fK/s", (rate>0)?rate:0);
+    }
+
name = strdup(reponame);
ptr = g_strdup_printf(_("Downloading %s... (%d/%d)"), drop_version(name), 
remains, howmany);
+       dlinfostr = g_strdup_printf("Download Infos : %.1fMo / %.1fMo At %s", 
showedsize, totalsize, rate_text);
gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress), ptr);
+       gtk_label_set_label(GTK_LABEL(dlinfo), dlinfostr);
+
if(per>=0 && per <=100)
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), (float)per/100);

-       FREE(ptr);
-       FREE(name);
+       free(ptr);
+       free(dlinfostr);
+       free(name);

while (gtk_events_pending())
gtk_main_iteration ();
@@ -122,19 +186,13 @@ void progress_install (unsigned char event, char 
*pkgname, int percent, int howm
break;
case PM_TRANS_PROGRESS_UPGRADE_START:
main_text = g_strdup (_("Upgrading packages..."));
-                       break;
-               case PM_TRANS_PROGRESS_REMOVE_START:
-                       main_text = g_strdup (_("Removing packages..."));
-                       break;
-               case PM_TRANS_PROGRESS_CONFLICTS_START:
-                       main_text = g_strdup (_("Checking packages for file 
conflicts..."));
-                       break;
+                       break;
default:
return;
}
gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress), main_text);
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), (float)percent/100);
-       FREE(main_text);
+       free(main_text);

while (gtk_events_pending())
gtk_main_iteration ();
@@ -146,53 +204,53 @@ void progress_event (unsigned char event, void *data1, 
void *data2)
{
char *substr = NULL, *ptr = NULL;

-       if (data1 == NULL)
-               return;
-
switch (event)
{
-               case PM_TRANS_EVT_CHECKDEPS_START:
-                       substr = g_strdup(_("Checking dependencies"));
-                       break;
-               case PM_TRANS_EVT_FILECONFLICTS_START:
-                       substr = g_strdup (_("Checking for file conflicts"));
-                       break;
-               case PM_TRANS_EVT_RESOLVEDEPS_START:
-                       substr = g_strdup (_("Resolving dependencies"));
-                       break;
-               case PM_TRANS_EVT_INTERCONFLICTS_START:
-                       substr = g_strdup (_("Looking for inter-conflicts"));
-                       break;
case PM_TRANS_EVT_ADD_START:
+                       if (data1 == NULL)
+                               break;
substr = g_strdup_printf (_("Installing %s-%s"),
(char*)pacman_pkg_getinfo(data1, PM_PKG_NAME),
(char*)pacman_pkg_getinfo(data1, PM_PKG_VERSION));
break;
case PM_TRANS_EVT_ADD_DONE:
+                       if (data1 == NULL)
+                               break;
substr = g_strdup_printf (_("Packet %s-%s installed"),
(char*)pacman_pkg_getinfo(data1, PM_PKG_NAME),
(char*)pacman_pkg_getinfo(data1, PM_PKG_VERSION));
break;
case PM_TRANS_EVT_RETRIEVE_START:
+                       if (data1 == NULL)
+                               break;
substr = g_strdup_printf (_("Retrieving packages from %s"), (char*)data1);
break;
case PM_TRANS_EVT_RETRIEVE_LOCAL:
+                       if (data1 == NULL)
+                               break;
ptr = g_strdup_printf(_("Retrieving packages from local... (%d/%d) : %s" 
),remains, howmany, drop_version((char*)data1));
gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress), ptr);
while (gtk_events_pending())
gtk_main_iteration ();
-                       sleep(1);
-                       FREE(ptr);
+                       free(ptr);
substr = NULL;
break;
+               case PM_TRANS_EVT_INTEGRITY_START:
+                       gtk_label_set_label(GTK_LABEL(dlinfo), "");
+                       substr = g_strdup (_("Checking package integrity..."));
+                       break;
+        case PM_TRANS_EVT_INTEGRITY_DONE:
+            substr = g_strdup (_("Done"));
+            break;
default:
return;
}
-       if(substr != NULL)
-               gtk_label_set_label(GTK_LABEL(labelpkg), substr);

-       FREE(substr);
-
+       if(substr != NULL) {
+               gtk_label_set_label(GTK_LABEL(labelpkg), substr);
+               free(substr);
+       }
+
while (gtk_events_pending())
gtk_main_iteration ();

@@ -201,16 +259,18 @@ void progress_event (unsigned char event, void *data1, 
void *data2)

int installpkgs(GList *pkgs)
{
-       int i = 0;
+       int i = 0, questret, flags = 0;
PM_LIST *pdata = NULL, *pkgsl;
-       char *ptr;
+       char *ptr, *file;

if(pacman_initialize(TARGETDIR) == -1) {
-               printf("failed to initialize pacman library (%s)\n", 
pacman_strerror(pm_errno));
+               LOG("Failed to initialize pacman library (%s)\n", 
pacman_strerror(pm_errno));
+               return -1;
}

if (pacman_parse_config("/etc/pacman-g2.conf", NULL, "") == -1) {
-                       printf("Failed to parse pacman-g2 configuration file 
(%s)", pacman_strerror(pm_errno));
+                       LOG("Failed to parse pacman-g2 configuration file 
(%s)", pacman_strerror(pm_errno));
+                       pacman_release();
return(-1);
}

@@ -219,48 +279,91 @@ int installpkgs(GList *pkgs)
pacman_set_option(PM_OPT_LOGCB, (long)cb_log);
pacman_set_option (PM_OPT_DLCB, (long)progress_update);
pacman_set_option (PM_OPT_DLOFFSET, (long)&offset);
+       pacman_set_option (PM_OPT_DLRATE, (long)&rate);
pacman_set_option (PM_OPT_DLFNM, (long)reponame);
pacman_set_option (PM_OPT_DLHOWMANY, (long)&howmany);
pacman_set_option (PM_OPT_DLREMAIN, (long)&remains);
+       pacman_set_option (PM_OPT_DLT0, (long)&t0);
+       pacman_set_option (PM_OPT_DLT0, (long)&t);
+       pacman_set_option (PM_OPT_DLXFERED1, (long)&xferred1);

PM_DB *db_local = pacman_db_register("local");
if(db_local == NULL) {
-               printf("could not register 'local' database (%s)\n", 
pacman_strerror(pm_errno));
+               LOG("Could not register 'local' database (%s)\n", 
pacman_strerror(pm_errno));
+               pacman_release();
+               return -1;
}

-       if(pacman_trans_init(PM_TRANS_TYPE_SYNC, 
PM_TRANS_FLAG_FORCE|PM_TRANS_FLAG_NODEPS, progress_event, NULL, 
progress_install) == -1)
-               printf("Failed to initialize transaction %s\n", pacman_strerror 
(pm_errno));
+retry: if(pacman_trans_init(PM_TRANS_TYPE_SYNC, 
PM_TRANS_FLAG_FORCE|PM_TRANS_FLAG_NODEPS, progress_event, progress_conv, 
progress_install) == -1) {
+               if (pm_errno == PM_ERR_HANDLE_LOCK) {
+                       file = g_strdup_printf("%s/tmp/pacman-g2.lck", 
TARGETDIR);
+                       g_remove (file);
+                       free(file);
+                       goto retry;
+               }
+
+               LOG("Failed to initialize transaction %s\n", pacman_strerror 
(pm_errno));
+               pacman_release();
+               return -1;
+       }

for (i = 0; i<g_list_length(pkgs); i++)
{
ptr = strdup((char*)g_list_nth_data(pkgs, i));
if(pacman_trans_addtarget(strdup(drop_version(ptr))) == -1)
-                       printf("Error adding packet %s\n", pacman_strerror 
(pm_errno));
-               FREE(ptr);
+                       LOG("Error adding packet %s", pacman_strerror 
(pm_errno));
+               free(ptr);
}

//* prepare transaction *//
if(pacman_trans_prepare(&pdata) == -1)
{
-               printf("Failed to prepare transaction (%s)\n", pacman_strerror 
(pm_errno));
+               LOG("Failed to prepare transaction (%s)", pacman_strerror 
(pm_errno));
pacman_list_free(pdata);
+               pacman_trans_release();
+               pacman_release();
return -1;
-       }
+       }

pkgsl = pacman_trans_getinfo (PM_TRANS_PACKAGES);
if (pkgsl == NULL)
{
-               printf("Error getting transaction info %s\n", pacman_strerror 
(pm_errno));
+               LOG("Error getting transaction info %s\n", pacman_strerror 
(pm_errno));
+               pacman_trans_release();
+               pacman_release();
return -1;
-       }
+       }

/* commit transaction */
if (pacman_trans_commit(&pdata) == -1)
{
-               printf("Failed to commit transaction (%s)\n", pacman_strerror 
(pm_errno));
+               switch(pm_errno) {
+                       case PM_ERR_DISK_FULL:
+                               fwife_error(_("Disk full, cannot install more 
packages"));
+                               break;
+                       case PM_ERR_PKG_CORRUPTED:
+                               questret = fwife_question(_("Some packages 
seems corrupted, do you want to download them again?"));
+                               if(questret == GTK_RESPONSE_YES) {
+                                       pacman_list_free(pdata);
+                                       pacman_trans_release();
+                                       goto retry;
+                               }
+                               break;
+                       case PM_ERR_RETRIEVE:
+                               fwife_error(_("Failed to retrieve packages"));
+                               break;
+                       default:
+                               break;
+               }
+
+               LOG("Failed to commit transaction (%s)\n", pacman_strerror 
(pm_errno));
+               pacman_list_free(pdata);
+               pacman_trans_release();
+               pacman_release();
+               return -1;
}

-       /* release the transaction */
+       /* release the transaction */
pacman_trans_release();
pacman_release();

@@ -272,11 +375,15 @@ int prerun(GList **config)
// fix gtk graphical bug : forward button is clicked in
set_page_completed();
set_page_incompleted();
+       long long *compsize = (long long*)data_get(*config,"compsizepkg");
+       if(compsize != NULL)
+               compressedsize = *compsize;

-       copyfile("/proc/mounts", "/etc/mtab");
-
-       installpkgs((GList*)data_get(*config, "packages"));
-
+       if(installpkgs((GList*)data_get(*config, "packages")) == -1) {
+               fwife_error(_("An error occurs during packages installation 
(see /var/log/fwife.log for more details)"));
+               return -1;
+       }
+       gtk_label_set_label(GTK_LABEL(labelpkg), _("Packages installation 
completed"));
set_page_completed();
return(0);
}
@@ -287,13 +394,13 @@ int run(GList **config)
//mount system point to targetdir
ptr = g_strdup_printf("mount /dev -o bind %s/dev", TARGETDIR);
fw_system(ptr);
-       FREE(ptr);
+       free(ptr);
ptr = g_strdup_printf("mount /proc -o bind %s/proc", TARGETDIR);
fw_system(ptr);
-       FREE(ptr);
+       free(ptr);
ptr = g_strdup_printf("mount /sys -o bind %s/sys", TARGETDIR);
fw_system(ptr);
-       FREE(ptr);
+       free(ptr);

return 0;
}
diff --git a/src/plugins/select.c b/src/plugins/select.c
index 18ad3db..08cf5f0 100644
--- a/src/plugins/select.c
+++ b/src/plugins/select.c
@@ -1243,7 +1243,9 @@ int run(GList **config)
char *ptr;
GList *allpkgs = NULL;
long long pkgsize=0, freespace;
-
+       long long *compressedsize = malloc(sizeof(long long));
+       *compressedsize = 0;
+
if(cats == NULL)
return -1;

@@ -1301,12 +1303,13 @@ int run(GList **config)
(char*)pacman_pkg_getinfo(pkg, PM_PKG_VERSION));
pkgsize += (long)pacman_pkg_getinfo(pkg, PM_PKG_USIZE);
// remember that packages are on the disk too
-               pkgsize += (long)pacman_pkg_getinfo(pkg, PM_PKG_SIZE);
+               *compressedsize += (long)pacman_pkg_getinfo(pkg, PM_PKG_SIZE);
allpkgs = g_list_append(allpkgs, ptr);
}
pacman_trans_release();
-
-       if(pkgsize > freespace) {
+       data_put(config, "compsizepkg", compressedsize);
+
+       if((pkgsize + (*compressedsize)) > freespace) {
LOG("freespace : %lld, packages space : %lld", freespace, pkgsize);
fwife_error(_("No enought diskspace available to install all packages"));
g_list_foreach(allpkgs, free, NULL);
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to