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">&lt;span 
size="larger"&gt;&lt;b&gt;Optimize package 
database&lt;/b&gt;&lt;/span&gt;</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">&lt;b&gt;Status 
: &lt;/b&gt;</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

Reply via email to