SF.net SVN: geany-plugins: [75] trunk/backupcopy
eht16 at users.sourceforge.net
eht16 at xxxxx
Thu Jun 19 21:46:17 UTC 2008
Revision: 75
http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=75&view=rev
Author: eht16
Date: 2008-06-19 14:46:15 -0700 (Thu, 19 Jun 2008)
Log Message:
-----------
Change doc pointer usage.
Add option to include parts of the source path in the path of the backup file.
Modified Paths:
--------------
trunk/backupcopy/ChangeLog
trunk/backupcopy/src/backupcopy.c
Modified: trunk/backupcopy/ChangeLog
===================================================================
--- trunk/backupcopy/ChangeLog 2008-06-19 21:34:52 UTC (rev 74)
+++ trunk/backupcopy/ChangeLog 2008-06-19 21:46:15 UTC (rev 75)
@@ -1,3 +1,11 @@
+2008-06-19 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+
+ * src/backupcopy.c:
+ Change doc pointer usage.
+ Add option to include parts of the source path in the path of the
+ backup file.
+
+
2008-06-03 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/backupcopy.c:
Modified: trunk/backupcopy/src/backupcopy.c
===================================================================
--- trunk/backupcopy/src/backupcopy.c 2008-06-19 21:34:52 UTC (rev 74)
+++ trunk/backupcopy/src/backupcopy.c 2008-06-19 21:46:15 UTC (rev 75)
@@ -26,6 +26,7 @@
#include <unistd.h>
#include <errno.h>
#include <time.h>
+#include <string.h>
#ifdef HAVE_LOCALE_H
# include <locale.h>
@@ -46,7 +47,7 @@
GeanyFunctions *geany_functions;
-PLUGIN_VERSION_CHECK(67)
+PLUGIN_VERSION_CHECK(71)
PLUGIN_SET_INFO(_("Backup Copy"), _("Creates a backup of the current file when saving"),
"0.2", "Enrico Tröger")
@@ -55,6 +56,7 @@
static gchar *config_file;
static gchar *backup_dir; /* path to an existing directory in locale encoding */
static gchar *time_fmt;
+static gint dir_levels;
/* Ensures utf8_dir exists and is writable and
@@ -83,32 +85,108 @@
}
-static void on_document_save(GObject *obj, gint idx, gpointer user_data)
+static gchar *skip_root(gchar *filename)
{
+ /* first skip the root (e.g. c:\ on windows) */
+ const gchar *dir = g_path_skip_root(filename);
+
+ /* if this has failed, use the filename again */
+ if (dir == NULL)
+ dir = filename;
+ /* check again for leading / or \ */
+ while (*dir == G_DIR_SEPARATOR)
+ dir++;
+
+ return (gchar *) dir;
+}
+
+
+static gchar *create_dir_parts(const gchar *filename)
+{
+ gint cnt_dir_parts = 0;
+ gchar *cp;
+ gchar *dirname;
+ gchar last_char = 0;
+ gint error;
+ gchar *result;
+ gchar *target_dir;
+
+ if (dir_levels == 0)
+ return g_strdup("");
+
+ dirname = g_path_get_dirname(filename);
+
+ cp = dirname;
+ /* walk to the end of the string */
+ while (*cp != '\0')
+ cp++;
+
+ /* walk backwards to find directory parts */
+ while (cp > dirname)
+ {
+ if (*cp == G_DIR_SEPARATOR && last_char != G_DIR_SEPARATOR)
+ cnt_dir_parts++;
+
+ if (cnt_dir_parts == dir_levels)
+ break;
+
+ last_char = *cp;
+ cp--;
+ }
+
+ result = skip_root(cp); /* skip leading slash/backslash and c:\ */
+ target_dir = g_build_filename(backup_dir, result, NULL);
+
+ error = p_utils->mkdir(target_dir, TRUE);
+ if (error != 0)
+ {
+ p_ui->set_statusbar(FALSE, _("Backup Copy: Directory could not be created (%s)."),
+ g_strerror(error));
+
+ result = g_strdup(""); /* return an empty string in case of an error */
+ }
+ else
+ result = g_strdup(result);
+
+ g_free(dirname);
+ g_free(target_dir);
+
+ return result;
+}
+
+
+static void on_document_save(GObject *obj, GeanyDocument *doc, gpointer user_data)
+{
FILE *src, *dst;
gchar *locale_filename_src;
gchar *locale_filename_dst;
- gchar *tmp;
- gchar line[512];
+ gchar *basename_src;
+ gchar *dir_parts_src;
+ gchar stamp[512];
time_t t = time(NULL);
struct tm *now = localtime(&t);
- locale_filename_src = p_utils->get_locale_from_utf8(documents[idx]->file_name);
+ locale_filename_src = p_utils->get_locale_from_utf8(doc->file_name);
if ((src = g_fopen(locale_filename_src, "r")) == NULL)
{
/* it's unlikely that this happens */
- p_ui->set_statusbar(FALSE, _("Backup Copy: File could not be saved (%s)."),
+ p_ui->set_statusbar(FALSE, _("Backup Copy: File could not be read (%s)."),
g_strerror(errno));
g_free(locale_filename_src);
return;
}
- strftime(line, sizeof(line), time_fmt, now);
- tmp = g_path_get_basename(locale_filename_src);
+ strftime(stamp, sizeof(stamp), time_fmt, now);
+ basename_src = g_path_get_basename(locale_filename_src);
+ dir_parts_src = create_dir_parts(locale_filename_src);
locale_filename_dst = g_strconcat(
- backup_dir, G_DIR_SEPARATOR_S, tmp, ".", line, NULL);
- g_free(tmp);
+ backup_dir, G_DIR_SEPARATOR_S,
+ dir_parts_src, G_DIR_SEPARATOR_S,
+ basename_src, ".", stamp, NULL);
+ g_free(basename_src);
+ g_free(dir_parts_src);
+
if ((dst = g_fopen(locale_filename_dst, "wb")) == NULL)
{
p_ui->set_statusbar(FALSE, _("Backup Copy: File could not be saved (%s)."),
@@ -119,9 +197,9 @@
return;
}
- while (fgets(line, sizeof(line), src) != NULL)
+ while (fgets(stamp, sizeof(stamp), src) != NULL)
{
- fputs(line, dst);
+ fputs(stamp, dst);
}
fclose(src);
@@ -173,8 +251,10 @@
backup_dir = NULL;
time_fmt = NULL;
+ dir_levels = 0;
g_key_file_load_from_file(config, config_file, G_KEY_FILE_NONE, NULL);
+ dir_levels = p_utils->get_setting_integer(config, "backupcopy", "dir_levels", 0);
time_fmt = p_utils->get_setting_string(config, "backupcopy", "time_fmt", "%Y-%m-%d-%H-%M-%S");
tmp = p_utils->get_setting_string(config, "backupcopy", "backup_dir", g_get_tmp_dir());
set_backup_dir(tmp);
@@ -235,10 +315,13 @@
text_dir = gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(dialog), "entry_dir")));
text_time = gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(dialog), "entry_time")));
+ dir_levels = gtk_spin_button_get_value_as_int(
+ GTK_SPIN_BUTTON(g_object_get_data(G_OBJECT(dialog), "spin_dir_levels")));
if (NZV(text_dir) && set_backup_dir(text_dir))
{
g_key_file_load_from_file(config, config_file, G_KEY_FILE_NONE, NULL);
+ g_key_file_set_integer(config, "backupcopy", "dir_levels", dir_levels);
g_key_file_set_string(config, "backupcopy", "backup_dir", text_dir);
g_key_file_set_string(config, "backupcopy", "time_fmt", text_time);
setptr(time_fmt, g_strdup(text_time));
@@ -271,7 +354,7 @@
GtkWidget *plugin_configure(GtkDialog *dialog)
{
- GtkWidget *label, *vbox, *hbox, *entry_dir, *entry_time, *button, *image;
+ GtkWidget *label, *vbox, *hbox, *entry_dir, *entry_time, *button, *image, *spin_dir_levels;
vbox = gtk_vbox_new(FALSE, 6);
@@ -297,15 +380,28 @@
label = gtk_label_new(_("Date/Time format for backup files (\"man strftime\" for details):"));
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 7);
entry_time = gtk_entry_new();
if (NZV(time_fmt))
gtk_entry_set_text(GTK_ENTRY(entry_time), time_fmt);
gtk_box_pack_start(GTK_BOX(vbox), entry_time, FALSE, FALSE, 0);
+ hbox = gtk_hbox_new(FALSE, 6);
+
+ label = gtk_label_new(_("Directory levels to include in the backup destination:"));
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+
+ spin_dir_levels = gtk_spin_button_new_with_range(0, 20, 1);
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_dir_levels), dir_levels);
+ gtk_box_pack_start(GTK_BOX(hbox), spin_dir_levels, FALSE, FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 7);
+
g_object_set_data(G_OBJECT(dialog), "entry_dir", entry_dir);
g_object_set_data(G_OBJECT(dialog), "entry_time", entry_time);
+ g_object_set_data(G_OBJECT(dialog), "spin_dir_levels", spin_dir_levels);
g_signal_connect(dialog, "response", G_CALLBACK(on_configure_response), NULL);
gtk_widget_show_all(vbox);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Plugins-Commits
mailing list