Git-Url:
http://git.frugalware.org/gitweb/gitweb.cgi?p=gfpm.git;a=commitdiff;h=54542a0a45cd4f6dbb78168d29ab32a05c204b06
commit 54542a0a45cd4f6dbb78168d29ab32a05c204b06
Author: Priyank <[EMAIL PROTECTED]>
Date: Mon Sep 10 00:43:39 2007 +0530
gfpm: New feature: gfpm can now optimize your pacman-g2 package database.
diff --git a/data/gfpm.glade b/data/gfpm.glade
index 3788094..da6f92b 100644
--- a/data/gfpm.glade
+++ b/data/gfpm.glade
@@ -64,6 +64,14 @@
</child>
</widget>
</child>
+ <child>
+ <widget class="GtkMenuItem" id="opt1">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">_Optimize
package database</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
</widget>
</child>
</widget>
@@ -1150,4 +1158,126 @@
</widget>
</child>
</widget>
+ <widget class="GtkDialog" id="optimize_db_dlg">
+ <property name="width_request">400</property>
+ <property name="height_request">150</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="border_width">5</property>
+ <property name="resizable">False</property>
+ <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+ <property name="default_width">400</property>
+ <property name="default_height">150</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox4">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkVBox" id="vbox10">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes"><span
size="larger"><b>Optimize package
database</b></span></property>
+ <property name="use_markup">True</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">7</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <child>
+ <widget class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes"><b>Status
: </b></property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="optimize_db_label">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">7</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkProgressBar" id="optimize_db_progress">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="text" translatable="yes"></property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">3</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area4">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="layout_style">GTK_BUTTONBOX_EDGE</property>
+ <child>
+ <widget class="GtkButton" id="optimize_db_start">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">Optimize</property>
+ <property name="response_id">0</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkButton" id="optimize_db_close">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">Close</property>
+ <property name="response_id">0</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
</glade-interface>
diff --git a/src/Makefile.am b/src/Makefile.am
index 456fd39..be22ffe 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -12,6 +12,7 @@ gfpm_SOURCES= \
gfpm-progress.c \
gfpm-interface.c \
gfpm-messages.c \
+ gfpm-optimizedb.c \
gfpm-about.c \
gfpm.c
diff --git a/src/gfpm-interface.c b/src/gfpm-interface.c
index bfdc9cf..d8d5094 100644
--- a/src/gfpm-interface.c
+++ b/src/gfpm-interface.c
@@ -38,6 +38,7 @@
#include "gfpm-messages.h"
#include "gfpm-packagelist.h"
#include "gfpm-progress.h"
+#include "gfpm-optimizedb.h"
#include "gfpm-util.h"
#include "gfpm-about.h"
#include "gfpm-db.h"
@@ -262,6 +263,7 @@ gfpm_interface_init (void)
gfpm_db_init ();
gfpm_messages_init ();
gfpm_progress_init ();
+ gfpm_optimize_db_dlg_init ();
gtk_widget_hide (gfpm_splash);
gchar *title = g_strdup_printf ("%s (%s)", PACKAGE_STRING, GFPM_RELEASE_NAME);
diff --git a/src/gfpm-optimizedb.c b/src/gfpm-optimizedb.c
new file mode 100644
index 0000000..31f9f35
--- /dev/null
+++ b/src/gfpm-optimizedb.c
@@ -0,0 +1,209 @@
+/*
+ * gfpm-optimizedb.c for gfpm
+ *
+ * Copyright (C) 2006-2007 by Priyank Gosalia <[EMAIL PROTECTED]>
+ * Based on pacman-optimize written by Judd Vinet
+ * Copyright (C) 2002-2006 Judd Vinet <[EMAIL PROTECTED]>
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "gfpm-optimizedb.h"
+#include "gfpm-messages.h"
+
+#include <fcntl.h>
+#include <glade/glade.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#define DBLOC "/var/lib/pacman"
+#define TMPLOC "/var/lib/pacman.new"
+#define OLDSUM "/tmp/dbsums.old"
+#define NEWSUM "/tmp/dbsums.new"
+#define LOCKFILE "/tmp/pacman-g2.lck"
+
+extern GladeXML *xml;
+
+static GtkWidget *gfpm_optimize_db_dlg;
+static GtkWidget *gfpm_optimize_db_progressbar;
+static GtkWidget *gfpm_optimize_db_startbtn;
+static GtkWidget *gfpm_optimize_db_closebtn;
+static GtkWidget *gfpm_optimize_db_label;
+static void gfpm_optimize_db_set_progress_status (const char *text);
+static void gfpm_optimize_db_optimize_btn_clicked (GtkWidget *widget, gpointer
data);
+static void gfpm_optimize_db_dlg_show (void);
+static void gfpm_optimize_db_dlg_hide (void);
+static void gfpm_optimize_db (void);
+
+void
+gfpm_optimize_db_dlg_init (void)
+{
+ gfpm_optimize_db_dlg = glade_xml_get_widget (xml, "optimize_db_dlg");
+ gfpm_optimize_db_progressbar = glade_xml_get_widget (xml,
"optimize_db_progress");
+ gfpm_optimize_db_startbtn = glade_xml_get_widget (xml,
"optimize_db_start");
+ gfpm_optimize_db_closebtn = glade_xml_get_widget (xml,
"optimize_db_close");
+ gfpm_optimize_db_label = glade_xml_get_widget (xml,
"optimize_db_label");
+
+ g_signal_connect (G_OBJECT(gfpm_optimize_db_startbtn),
+ "clicked",
+
G_CALLBACK(gfpm_optimize_db_optimize_btn_clicked),
+ NULL);
+ g_signal_connect (G_OBJECT(gfpm_optimize_db_closebtn),
+ "clicked",
+ G_CALLBACK(gfpm_optimize_db_dlg_hide),
+ NULL);
+ g_signal_connect (G_OBJECT(glade_xml_get_widget(xml,"opt1")),
+ "activate",
+ G_CALLBACK(gfpm_optimize_db_dlg_show),
+ NULL);
+
+ return;
+}
+
+static void
+gfpm_optimize_db_set_progress_status (const char *text)
+{
+ gtk_label_set_text (GTK_LABEL(gfpm_optimize_db_label), text);
+
+ return;
+}
+
+static void
+gfpm_optimize_db_optimize_btn_clicked (GtkWidget *widget, gpointer data)
+{
+ gfpm_optimize_db ();
+
+ return;
+}
+
+static void
+gfpm_optimize_db_dlg_show (void)
+{
+ gfpm_optimize_db_set_progress_status (_("Ready"));
+ gtk_progress_bar_set_fraction
(GTK_PROGRESS_BAR(gfpm_optimize_db_progressbar), 0.0);
+ gtk_widget_show (gfpm_optimize_db_dlg);
+
+ return;
+}
+
+static void
+gfpm_optimize_db_dlg_hide (void)
+{
+ gtk_widget_hide (gfpm_optimize_db_dlg);
+
+ return;
+}
+
+void
+gfpm_optimize_db (void)
+{
+ char *cmdline = NULL;
+ char temp[40];
+
+ /* disable the start button */
+ gtk_widget_set_sensitive (gfpm_optimize_db_startbtn, FALSE);
+ gtk_widget_set_sensitive (gfpm_optimize_db_closebtn, FALSE);
+
+ /* check if another package manager is already running */
+ if (g_file_test(LOCKFILE,G_FILE_TEST_EXISTS))
+ {
+ gfpm_error (_("Error"), _("Cannot optimize database. Another
instance of pacman-g2 or gfpm is already running."));
+ goto cleanup;
+ }
+
+ /* create a lock file */
+ if (g_creat(LOCKFILE,S_IRWXU)==-1)
+ {
+ gfpm_error (_("Error"), _("Error creating lockfile. Failed to
optimize package database"));
+ goto cleanup;
+ }
+
+ /* generate checksums for the old database */
+ gfpm_optimize_db_set_progress_status (_("generating checksums for the
old database"));
+ gtk_progress_bar_set_fraction
(GTK_PROGRESS_BAR(gfpm_optimize_db_progressbar), 0.1);
+ while (gtk_events_pending()) gtk_main_iteration ();
+ sleep (2);
+ cmdline = g_strdup_printf ("find %s -type f | sort | xargs md5sum >
%s", DBLOC, OLDSUM);
+ system (cmdline);
+ g_free (cmdline);
+
+ /* copy the old database to a new directory */
+ sprintf (temp, _("copying %s"), DBLOC);
+ gfpm_optimize_db_set_progress_status (temp);
+ gtk_progress_bar_set_fraction
(GTK_PROGRESS_BAR(gfpm_optimize_db_progressbar), 0.25);
+ while (gtk_events_pending()) gtk_main_iteration ();
+ sleep (2);
+ cmdline = g_strdup_printf ("cp -a %s %s", DBLOC, TMPLOC);
+ system (cmdline);
+ g_free (cmdline);
+
+ /* generate checksums for the new database */
+ gfpm_optimize_db_set_progress_status (_("generating checksums for the
new database"));
+ cmdline = g_strdup_printf ("mv %s %s.bak", DBLOC, DBLOC);
+ system (cmdline);
+ g_free (cmdline);
+ cmdline = g_strdup_printf ("mv %s %s", TMPLOC, DBLOC);
+ system (cmdline);
+ g_free (cmdline);
+ gtk_progress_bar_set_fraction
(GTK_PROGRESS_BAR(gfpm_optimize_db_progressbar), 0.4);
+ while (gtk_events_pending()) gtk_main_iteration ();
+ cmdline = g_strdup_printf ("find %s -type f | sort | xargs md5sum >
%s", DBLOC, NEWSUM);
+ system (cmdline);
+ g_free (cmdline);
+ gtk_progress_bar_set_fraction
(GTK_PROGRESS_BAR(gfpm_optimize_db_progressbar), 0.6);
+ while (gtk_events_pending()) gtk_main_iteration ();
+ sleep (2);
+
+ /* check integrity */
+ gfpm_optimize_db_set_progress_status (_("performing integrity check"));
+ cmdline = g_strdup_printf ("diff %s %s > /dev/null 2>&1", OLDSUM,
NEWSUM);
+ if (system(cmdline)!=0)
+ {
+ gfpm_error (_("Optimization failed"), _("Integrity check
failed"));
+ g_free (cmdline);
+ cmdline = g_strdup_printf ("rm -rf %s;mv %s.bak %s", DBLOC,
DBLOC, DBLOC);
+ system (cmdline);
+ g_free (cmdline);
+ }
+ g_free (cmdline);
+ gtk_progress_bar_set_fraction
(GTK_PROGRESS_BAR(gfpm_optimize_db_progressbar), 0.85);
+ while (gtk_events_pending()) gtk_main_iteration ();
+
+ /* remove old database */
+ gfpm_optimize_db_set_progress_status (_("removing old database"));
+ cmdline = g_strdup_printf ("rm -rf %s.bak", DBLOC);
+ system (cmdline);
+ gtk_progress_bar_set_fraction
(GTK_PROGRESS_BAR(gfpm_optimize_db_progressbar), 0.95);
+ while (gtk_events_pending()) gtk_main_iteration ();
+ sleep (2);
+
+ /* remove temp files */
+ gfpm_optimize_db_set_progress_status (_("removing temporary files"));
+ g_remove (OLDSUM);
+ g_remove (NEWSUM);
+ g_remove (LOCKFILE);
+ gtk_progress_bar_set_fraction
(GTK_PROGRESS_BAR(gfpm_optimize_db_progressbar), 1.0);
+ while (gtk_events_pending()) gtk_main_iteration ();
+ sleep (2);
+
+cleanup:
+ gfpm_optimize_db_set_progress_status (_("Database optimized."));
+ gtk_widget_set_sensitive (gfpm_optimize_db_startbtn, TRUE);
+ gtk_widget_set_sensitive (gfpm_optimize_db_closebtn, TRUE);
+ gfpm_message (_("Database optimized"), _("Your package database is now
optimized."));
+
+ return;
+}
+
diff --git a/src/gfpm-optimizedb.h b/src/gfpm-optimizedb.h
new file mode 100644
index 0000000..e99a8ce
--- /dev/null
+++ b/src/gfpm-optimizedb.h
@@ -0,0 +1,15 @@
+#ifndef __GFPM_OPTIMIZEDB_H__
+#define __GFPM_OPTIMIZEDB_H__
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <locale.h>
+#include <libintl.h>
+#include <gtk/gtk.h>
+#include "gfpm.h"
+
+void gfpm_optimize_db_dlg_init (void);
+
+#endif
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git