svn: r9999
This commit is contained in:
parent
288c8b5f74
commit
8335204a39
@ -1,444 +0,0 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2000-2006 Donald N. Allingham
|
||||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
# $Id$
|
||||
|
||||
"""Tools/Revision Control/Checkpoint the Database..."""
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import os
|
||||
import subprocess
|
||||
import locale
|
||||
import time
|
||||
from gettext import gettext as _
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# gnome/gtk
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import gtk
|
||||
import gtk.glade
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import GrampsDbUtils
|
||||
import Utils
|
||||
import GrampsDisplay
|
||||
import ManagedWindow
|
||||
|
||||
from QuestionDialog import OkDialog, ErrorDialog
|
||||
from PluginUtils import Tool, register_tool
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Constants
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
if os.sys.platform == "win32":
|
||||
_rcs_found = os.system("rcs -V >nul 2>nul") == 0
|
||||
else:
|
||||
_rcs_found = os.system("rcs -V >/dev/null 2>/dev/null") == 0
|
||||
|
||||
# Some message strings
|
||||
rcs_setup_failure_msg = [
|
||||
_("Checkpoint Archive Creation Failed"),
|
||||
_("No checkpointing archive was found. "
|
||||
"An attempt to create it has failed with the "
|
||||
"following message:\n\n%s")
|
||||
]
|
||||
|
||||
rcs_setup_success_msg = [
|
||||
_("Checkpoint Archive Created"),
|
||||
_("No checkpointing archive was found, "
|
||||
"so it was created to enable archiving.\n\n"
|
||||
"The archive file name is %s\n"
|
||||
"Deleting this file will lose the archive "
|
||||
"and make impossible to extract archived data "
|
||||
"from it.")
|
||||
]
|
||||
|
||||
archive_failure_msg = [
|
||||
_("Checkpoint Failed"),
|
||||
_("An attempt to archive the data failed "
|
||||
"with the following message:\n\n%s")
|
||||
]
|
||||
|
||||
archive_success_msg = [
|
||||
_("Checkpoint Succeeded "),
|
||||
_("The data was successfully archived.")
|
||||
]
|
||||
|
||||
retrieve_failure_msg = [
|
||||
_("Checkpoint Failed"),
|
||||
_("An attempt to retrieve the data failed "
|
||||
"with the following message:\n\n%s")
|
||||
]
|
||||
|
||||
retrieve_success_msg = [
|
||||
_("Checkpoint Succeeded "),
|
||||
_("The data was successfully retrieved.")
|
||||
]
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Checkpoint class
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
|
||||
def __init__(self, dbstate, uistate, options_class, name, callback=None):
|
||||
|
||||
Tool.Tool.__init__(self, dbstate, options_class, name)
|
||||
self.dbstate = dbstate
|
||||
|
||||
if uistate:
|
||||
ManagedWindow.ManagedWindow.__init__(self, uistate, [],
|
||||
Checkpoint)
|
||||
self.callback = self.callback_real
|
||||
self.init_gui()
|
||||
else:
|
||||
self.callback = lambda a: None
|
||||
self.run_tool(cli=True)
|
||||
|
||||
def init_gui(self):
|
||||
# Draw dialog and make it handle everything
|
||||
|
||||
base = os.path.dirname(__file__)
|
||||
glade_file = "%s/%s" % (base, "checkpoint.glade")
|
||||
self.glade = gtk.glade.XML(glade_file, "top", "gramps")
|
||||
|
||||
self.cust_arch_cb = self.glade.get_widget("cust_arch")
|
||||
self.cust_ret_cb = self.glade.get_widget("cust_ret")
|
||||
self.rcs_rb = self.glade.get_widget("rcs")
|
||||
self.cust_rb = self.glade.get_widget("custom")
|
||||
|
||||
# Fill in the stored values
|
||||
self.cust_arch_cb.set_text(
|
||||
self.options.handler.options_dict['cacmd'])
|
||||
self.cust_ret_cb.set_text(
|
||||
self.options.handler.options_dict['crcmd'])
|
||||
|
||||
# Display controls according to the state
|
||||
if self.options.handler.options_dict['rcs']:
|
||||
self.rcs_rb.set_active(_rcs_found)
|
||||
self.cust_rb.set_active(not _rcs_found)
|
||||
else:
|
||||
self.cust_rb.set_active(True)
|
||||
self.cust_arch_cb.set_sensitive(self.cust_rb.get_active())
|
||||
self.cust_ret_cb.set_sensitive(self.cust_rb.get_active())
|
||||
|
||||
self.rcs_rb.connect('toggled', self.rcs_toggled)
|
||||
|
||||
# Disable RCS if the rcs binary is not available
|
||||
# and show the normally hidden warning
|
||||
warning_label = self.glade.get_widget('warning_label')
|
||||
|
||||
self.title = _("Checkpoint Data")
|
||||
window = self.glade.get_widget('top')
|
||||
self.set_window(window, self.glade.get_widget('title'), self.title)
|
||||
|
||||
self.glade.signal_autoconnect({
|
||||
"on_close_clicked" : self.close,
|
||||
"on_arch_clicked" : self.on_archive_clicked,
|
||||
"on_ret_clicked" : self.on_retrieve_clicked,
|
||||
"on_help_clicked" : self.on_help_clicked,
|
||||
})
|
||||
|
||||
self.show()
|
||||
|
||||
if not _rcs_found:
|
||||
self.rcs_rb.set_sensitive(False)
|
||||
self.cust_rb.set_sensitive(True)
|
||||
warning_label.show()
|
||||
else:
|
||||
warning_label.hide()
|
||||
|
||||
def build_menu_names(self, obj):
|
||||
return (_("Checkpoint tool"), None)
|
||||
|
||||
def rcs_toggled(self, obj):
|
||||
self.cust_arch_cb.set_sensitive(not obj.get_active())
|
||||
self.cust_ret_cb.set_sensitive(not obj.get_active())
|
||||
|
||||
def on_help_clicked(self, obj):
|
||||
"""Display the relevant portion of GRAMPS manual"""
|
||||
GrampsDisplay.help('index')
|
||||
|
||||
def on_archive_clicked(self, obj):
|
||||
self.options.handler.options_dict['cacmd'] = unicode(
|
||||
self.cust_arch_cb.get_text())
|
||||
self.options.handler.options_dict['rcs'] = int(
|
||||
self.rcs_rb.get_active())
|
||||
|
||||
self.run_tool(archive=True, cli=False)
|
||||
# Save options
|
||||
self.options.handler.save_options()
|
||||
|
||||
def on_retrieve_clicked(self, obj):
|
||||
self.options.handler.options_dict['crcmd'] = unicode(
|
||||
self.cust_ret_cb.get_text())
|
||||
self.options.handler.options_dict['rcs'] = int(
|
||||
self.rcs_rb.get_active())
|
||||
|
||||
self.run_tool(archive=False, cli=False)
|
||||
# Save options
|
||||
self.options.handler.save_options()
|
||||
|
||||
def run_tool(self, archive=True, cli=False):
|
||||
"""
|
||||
RCS will be a builtin command, since we can handle all
|
||||
configuration on our own. This isn't true for most versioning
|
||||
systems, which usually require external setup, and external
|
||||
communication.
|
||||
"""
|
||||
if not cli:
|
||||
self.uistate.status_text(_("Checkpointing database..."))
|
||||
self.uistate.window.window.set_cursor(
|
||||
gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||
|
||||
if self.options.handler.options_dict['rcs']:
|
||||
self.rcs(archive, cli)
|
||||
elif archive:
|
||||
self.custom(self.options.handler.options_dict['cacmd'], True, cli)
|
||||
else:
|
||||
self.custom(self.options.handler.options_dict['crcmd'], False, cli)
|
||||
|
||||
if not cli:
|
||||
self.uistate.window.window.set_cursor(None)
|
||||
self.window.window.set_cursor(None)
|
||||
self.uistate.pulse_progressbar(0)
|
||||
self.uistate.modify_statusbar(self.dbstate)
|
||||
|
||||
def timestamp(self):
|
||||
return unicode(time.strftime('%x %X', time.localtime(time.time())))
|
||||
|
||||
def custom(self, cmd, checkin, cli):
|
||||
"""
|
||||
Passed the generated XML file to the specified command.
|
||||
"""
|
||||
proc = subprocess.Popen(
|
||||
cmd,
|
||||
stderr = subprocess.PIPE,
|
||||
stdin = subprocess.PIPE )
|
||||
if checkin:
|
||||
xmlwrite = GrampsDbUtils.XmlWriter(self.db, self.callback,
|
||||
False, False)
|
||||
xmlwrite.write_handle(proc.stdin)
|
||||
else:
|
||||
pass
|
||||
proc.stdin.close()
|
||||
status = proc.wait()
|
||||
message = "\n".join(proc.stderr.readlines())
|
||||
proc.stderr.close()
|
||||
del proc
|
||||
|
||||
if checkin:
|
||||
if status:
|
||||
msg1 = archive_failure_msg[0]
|
||||
msg2 = archive_failure_msg[1] % message
|
||||
dialog = ErrorDialog
|
||||
else:
|
||||
msg1 = archive_success_msg[0]
|
||||
msg2 = archive_success_msg[1]
|
||||
dialog = OkDialog
|
||||
else:
|
||||
if status:
|
||||
msg1 = retrieve_failure_msg[0]
|
||||
msg2 = retrieve_failure_msg[1] % message
|
||||
dialog = ErrorDialog
|
||||
else:
|
||||
msg1 = retrieve_success_msg[0]
|
||||
msg2 = retrieve_success_msg[1]
|
||||
dialog = OkDialog
|
||||
|
||||
if cli:
|
||||
print msg1
|
||||
print msg2
|
||||
else:
|
||||
dialog(msg1, msg2)
|
||||
|
||||
def rcs(self, checkin, cli):
|
||||
"""
|
||||
Check the generated XML file into RCS. Initialize the RCS file if
|
||||
it does not already exist.
|
||||
"""
|
||||
(archive_base, ext) = os.path.splitext(self.db.get_save_path())
|
||||
|
||||
archive_base = os.path.join(archive_base, "archive")
|
||||
comment = self.timestamp()
|
||||
|
||||
archive = archive_base + ", v"
|
||||
|
||||
# If the archive file does not exist, we either set it up
|
||||
# or die trying
|
||||
if not os.path.exists(archive):
|
||||
cmd = [ 'rcs', '-i', '-U', '-q', '-t-"GRAMPS database"', archive ]
|
||||
proc = subprocess.Popen(cmd, stderr = subprocess.PIPE )
|
||||
status = proc.wait()
|
||||
message = "\n".join(proc.stderr.readlines())
|
||||
proc.stderr.close()
|
||||
del proc
|
||||
|
||||
if status:
|
||||
msg1 = rcs_setup_failure_msg[0]
|
||||
msg2 = rcs_setup_failure_msg[1] % message
|
||||
dialog = ErrorDialog
|
||||
else:
|
||||
msg1 = rcs_setup_success_msg[0]
|
||||
msg2 = rcs_setup_success_msg[1] % archive
|
||||
dialog = OkDialog
|
||||
|
||||
if cli:
|
||||
print msg1
|
||||
print msg2
|
||||
else:
|
||||
dialog(msg1, msg2)
|
||||
|
||||
if status:
|
||||
return
|
||||
|
||||
if checkin:
|
||||
# At this point, we have an existing archive file
|
||||
xmlwrite = GrampsDbUtils.XmlWriter(self.db, self.callback,
|
||||
False, False)
|
||||
xmlwrite.write(archive_base)
|
||||
|
||||
cmd = ["ci", archive_base]
|
||||
|
||||
proc = subprocess.Popen(
|
||||
cmd,
|
||||
stdin = subprocess.PIPE,
|
||||
stderr = subprocess.PIPE )
|
||||
proc.stdin.write(comment)
|
||||
proc.stdin.close()
|
||||
message = "\n".join(proc.stderr.readlines())
|
||||
proc.stderr.close()
|
||||
status = proc.wait()
|
||||
del proc
|
||||
|
||||
if status:
|
||||
msg1 = archive_failure_msg[0]
|
||||
msg2 = archive_failure_msg[1] % message
|
||||
dialog = ErrorDialog
|
||||
else:
|
||||
msg1 = archive_success_msg[0]
|
||||
msg2 = archive_success_msg[1]
|
||||
dialog = OkDialog
|
||||
|
||||
if cli:
|
||||
print msg1
|
||||
print msg2
|
||||
else:
|
||||
dialog(msg1, msg2)
|
||||
else:
|
||||
proc = subprocess.Popen(
|
||||
("co", "-p", archive_base), stdout=subprocess.PIPE,
|
||||
stderr = subprocess.PIPE )
|
||||
status = proc.wait()
|
||||
message = "\n".join(proc.stderr.readlines())
|
||||
proc.stderr.close()
|
||||
del proc
|
||||
|
||||
if status:
|
||||
msg1 = retrieve_failure_msg[0]
|
||||
msg2 = retrieve_failure_msg[1] % message
|
||||
dialog = ErrorDialog
|
||||
else:
|
||||
msg1 = retrieve_success_msg[0]
|
||||
msg2 = retrieve_success_msg[1]
|
||||
dialog = OkDialog
|
||||
|
||||
if cli:
|
||||
print msg1
|
||||
print msg2
|
||||
else:
|
||||
dialog(msg1, msg2)
|
||||
|
||||
def callback_real(self, value):
|
||||
"""
|
||||
Call back function for the WriteXML function that updates the
|
||||
status progress bar.
|
||||
"""
|
||||
self.uistate.pulse_progressbar(value)
|
||||
while(gtk.events_pending()):
|
||||
gtk.main_iteration()
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
#
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
class CheckpointOptions(Tool.ToolOptions):
|
||||
"""
|
||||
Defines options and provides handling interface.
|
||||
"""
|
||||
|
||||
def __init__(self, name, person_id=None):
|
||||
Tool.ToolOptions.__init__(self, name, person_id)
|
||||
|
||||
# Options specific for this report
|
||||
self.options_dict = {
|
||||
'rcs' : 1,
|
||||
'archive' : 1,
|
||||
'cacmd' : '',
|
||||
'crcmd' : '',
|
||||
}
|
||||
self.options_help = {
|
||||
'rcs' : ("=0/1",
|
||||
"Whether to use RCS (ignores custom commands).",
|
||||
["Do not use RCS", "Use RCS"],
|
||||
True),
|
||||
'archive' : ("=0/1",
|
||||
"Whether to archive or retrieve.",
|
||||
["Retrieve", "Archive"],
|
||||
True),
|
||||
'cacmd' : ("=str", "Custom command line for archiving",
|
||||
"Custom command string"),
|
||||
'crcmd' : ("=str", "Custom command line for retrieval",
|
||||
"Custom command string"),
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
#
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
register_tool(
|
||||
name = 'chkpoint',
|
||||
category = Tool.TOOL_REVCTL,
|
||||
tool_class = Checkpoint,
|
||||
options_class = CheckpointOptions,
|
||||
modes = Tool.MODE_GUI | Tool.MODE_CLI,
|
||||
translated_name = _("Checkpoint the Database..."),
|
||||
status = _("Stable"),
|
||||
author_name = "Alex Roitman",
|
||||
author_email = "shura@gramps-project.org",
|
||||
description = _("Store a snapshot of the current database into "
|
||||
"a revision control system")
|
||||
)
|
@ -1,506 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
|
||||
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
|
||||
|
||||
<glade-interface>
|
||||
|
||||
<widget class="GtkDialog" id="top">
|
||||
<property name="visible">True</property>
|
||||
<property name="title" translatable="yes"></property>
|
||||
<property name="type">GTK_WINDOW_TOPLEVEL</property>
|
||||
<property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
|
||||
<property name="modal">False</property>
|
||||
<property name="resizable">True</property>
|
||||
<property name="destroy_with_parent">False</property>
|
||||
<property name="decorated">True</property>
|
||||
<property name="skip_taskbar_hint">False</property>
|
||||
<property name="skip_pager_hint">False</property>
|
||||
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
|
||||
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
|
||||
<property name="focus_on_map">True</property>
|
||||
<property name="urgency_hint">False</property>
|
||||
<property name="has_separator">True</property>
|
||||
<signal name="delete_event" handler="on_delete_event" last_modification_time="Tue, 27 Sep 2005 00:48:43 GMT"/>
|
||||
|
||||
<child internal-child="vbox">
|
||||
<widget class="GtkVBox" id="dialog-vbox4">
|
||||
<property name="visible">True</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="spacing">0</property>
|
||||
|
||||
<child internal-child="action_area">
|
||||
<widget class="GtkHButtonBox" id="dialog-action_area4">
|
||||
<property name="visible">True</property>
|
||||
<property name="layout_style">GTK_BUTTONBOX_END</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkButton" id="helpbutton1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="label">gtk-help</property>
|
||||
<property name="use_stock">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<property name="response_id">-11</property>
|
||||
<signal name="clicked" handler="on_help_clicked" last_modification_time="Mon, 26 Sep 2005 21:29:28 GMT"/>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkButton" id="button7">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="label">gtk-close</property>
|
||||
<property name="use_stock">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<property name="response_id">-7</property>
|
||||
<signal name="clicked" handler="on_close_clicked" last_modification_time="Mon, 26 Sep 2005 21:29:17 GMT"/>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkButton" id="ret_but">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<property name="response_id">0</property>
|
||||
<signal name="clicked" handler="on_ret_clicked" last_modification_time="Tue, 27 Sep 2005 00:08:07 GMT"/>
|
||||
|
||||
<child>
|
||||
<widget class="GtkAlignment" id="alignment3">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xscale">0</property>
|
||||
<property name="yscale">0</property>
|
||||
<property name="top_padding">0</property>
|
||||
<property name="bottom_padding">0</property>
|
||||
<property name="left_padding">0</property>
|
||||
<property name="right_padding">0</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox3">
|
||||
<property name="visible">True</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="spacing">2</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkImage" id="image3">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-revert-to-saved</property>
|
||||
<property name="icon_size">4</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label16">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">R_etrieve</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkButton" id="arch_but">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<property name="response_id">0</property>
|
||||
<signal name="clicked" handler="on_arch_clicked" last_modification_time="Tue, 27 Sep 2005 00:08:00 GMT"/>
|
||||
|
||||
<child>
|
||||
<widget class="GtkAlignment" id="alignment2">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xscale">0</property>
|
||||
<property name="yscale">0</property>
|
||||
<property name="top_padding">0</property>
|
||||
<property name="bottom_padding">0</property>
|
||||
<property name="left_padding">0</property>
|
||||
<property name="right_padding">0</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="spacing">2</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkImage" id="image2">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-save</property>
|
||||
<property name="icon_size">4</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label8">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">_Archive</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">GTK_PACK_END</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkVBox" id="vbox2">
|
||||
<property name="border_width">10</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="spacing">0</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="title">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes"></property>
|
||||
<property name="use_underline">False</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_CENTER</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">10</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label13">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">This tool allows archiving and retrieval of your data using the revision control system of your choice.</property>
|
||||
<property name="use_underline">False</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">True</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">12</property>
|
||||
<property name="ypad">12</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkTable" id="table3">
|
||||
<property name="border_width">12</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="n_rows">6</property>
|
||||
<property name="n_columns">4</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="row_spacing">6</property>
|
||||
<property name="column_spacing">12</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="main_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes"><b>Revision control system</b></property>
|
||||
<property name="use_underline">False</property>
|
||||
<property name="use_markup">True</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="right_attach">4</property>
|
||||
<property name="top_attach">0</property>
|
||||
<property name="bottom_attach">1</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkRadioButton" id="rcs">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="label" translatable="yes">_RCS</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<property name="active">False</property>
|
||||
<property name="inconsistent">False</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">4</property>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label15">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Retrieval:</property>
|
||||
<property name="use_underline">False</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
<property name="top_attach">5</property>
|
||||
<property name="bottom_attach">6</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkEntry" id="cust_ret">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="editable">True</property>
|
||||
<property name="visibility">True</property>
|
||||
<property name="max_length">0</property>
|
||||
<property name="text" translatable="yes"></property>
|
||||
<property name="has_frame">True</property>
|
||||
<property name="invisible_char">*</property>
|
||||
<property name="activates_default">False</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">3</property>
|
||||
<property name="right_attach">4</property>
|
||||
<property name="top_attach">5</property>
|
||||
<property name="bottom_attach">6</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkEntry" id="cust_arch">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="editable">True</property>
|
||||
<property name="visibility">True</property>
|
||||
<property name="max_length">0</property>
|
||||
<property name="text" translatable="yes"></property>
|
||||
<property name="has_frame">True</property>
|
||||
<property name="invisible_char">*</property>
|
||||
<property name="activates_default">False</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">3</property>
|
||||
<property name="right_attach">4</property>
|
||||
<property name="top_attach">4</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label14">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Archiving:</property>
|
||||
<property name="use_underline">False</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
<property name="top_attach">4</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkRadioButton" id="custom">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="label" translatable="yes">C_ustom commands</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<property name="active">False</property>
|
||||
<property name="inconsistent">False</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<property name="group">rcs</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">4</property>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="warning_label">
|
||||
<property name="label" translatable="yes"><b><i>Please install the rcs package
|
||||
to enable the default functionality.</i></b></property>
|
||||
<property name="use_underline">False</property>
|
||||
<property name="use_markup">True</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">4</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
|
||||
</glade-interface>
|
Loading…
Reference in New Issue
Block a user