Hello community, here is the log from the commit of package syncthing-gtk for openSUSE:Factory checked in at 2015-07-02 22:50:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/syncthing-gtk (Old) and /work/SRC/openSUSE:Factory/.syncthing-gtk.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "syncthing-gtk" Changes: -------- --- /work/SRC/openSUSE:Factory/syncthing-gtk/syncthing-gtk.changes 2015-06-12 20:32:12.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.syncthing-gtk.new/syncthing-gtk.changes 2015-07-03 00:21:53.000000000 +0200 @@ -1,0 +2,13 @@ +Tue Jun 30 20:52:36 UTC 2015 - sor.alexei@meowr.ru + +- Update to 0.7.4: + * Add displaying "(watch)" next to directory's rescan interval if + filesystem watching is enabled. + * Add support for extenal and trashcan versioning. + * Add --nostdownloader argument to setup.py, for disabling + Syncthing updater on "compile" time. + * Fix compatibility with non-GNU nice command. + * Fix filesystem watcher not reporting files with space in path. +- Disable Syncthing updater. + +------------------------------------------------------------------- Old: ---- syncthing-gtk-0.7.3.tar.gz New: ---- syncthing-gtk-0.7.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ syncthing-gtk.spec ++++++ --- /var/tmp/diff_new_pack.Iv2C46/_old 2015-07-03 00:21:54.000000000 +0200 +++ /var/tmp/diff_new_pack.Iv2C46/_new 2015-07-03 00:21:54.000000000 +0200 @@ -19,7 +19,7 @@ %global __requires_exclude typelib\\(Caja\\)|typelib\\(Nautilus\\)|typelib\\(Nemo\\) %define _name syncthing_gtk Name: syncthing-gtk -Version: 0.7.3 +Version: 0.7.4 Release: 0 Summary: Syncthing Gtk-based graphical interface License: GPL-2.0+ @@ -69,7 +69,7 @@ sed -i 's/^\(Exec=\).*$/\1%{name}/' %{name}.desktop %build -python2 setup.py build +python2 setup.py build_py --nostdownloader %install python2 setup.py install --root=%{buildroot} ++++++ syncthing-gtk-0.7.3.tar.gz -> syncthing-gtk-0.7.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/app.glade new/syncthing-gtk-0.7.4/app.glade --- old/syncthing-gtk-0.7.3/app.glade 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/app.glade 2015-06-30 11:17:12.000000000 +0200 @@ -33,7 +33,7 @@ <property name="visible">True</property> <property if="!is_windows" name="icon-name">syncthing-gtk</property> <property if="!is_windows" name="icon-size">24</property> - <property if="is_windows" name="icon">icons/24x24/apps/syncthing-gtk.png</property> + <property if="is_windows" name="file">icons/24x24/apps/syncthing-gtk.png</property> </object> </child> </object> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/build_windows.py new/syncthing-gtk-0.7.4/build_windows.py --- old/syncthing-gtk-0.7.3/build_windows.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/build_windows.py 2015-06-30 11:17:12.000000000 +0200 @@ -79,6 +79,13 @@ targetName = "syncthing-gtk.exe", base = "Win32GUI", icon = "icons/st-logo-128.ico", + ), + Executable( + "scripts/syncthing-gtk-exe.py", + compress = True, + targetName = "syncthing-gtk-console.exe", + base = "console", + icon = "icons/st-logo-128.ico", ) ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/folder-edit.glade new/syncthing-gtk-0.7.4/folder-edit.glade --- old/syncthing-gtk-0.7.3/folder-edit.glade 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/folder-edit.glade 2015-06-30 11:17:12.000000000 +0200 @@ -15,12 +15,16 @@ <property name="page_increment">10</property> </object> <object class="GtkAdjustment" id="adjRescanInterval"> - <property name="lower">0</property> <property name="upper">999999</property> <property name="value">5</property> <property name="step_increment">1</property> <property name="page_increment">10</property> </object> + <object class="GtkAdjustment" id="adjvCleanoutDays"> + <property name="upper">9999</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> <object class="GtkListStore" id="lsVersioningCombo"> <columns> <!-- column-name key --> @@ -41,6 +45,14 @@ <col id="0">staggered</col> <col id="1" translatable="yes">Staggered</col> </row> + <row> + <col id="0">trashcan</col> + <col id="1" translatable="yes">Trashcan</col> + </row> + <row> + <col id="0">external</col> + <col id="1" translatable="yes">External</col> + </row> </data> </object> <object class="GtkDialog" id="editor"> @@ -428,7 +440,7 @@ <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="GtkBox" id="bxVersioningSimple"> + <object class="GtkBox" id="bxVersioning_simple"> <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="orientation">vertical</property> @@ -509,7 +521,7 @@ </packing> </child> <child> - <object class="GtkBox" id="bxVersioningStaggered"> + <object class="GtkBox" id="bxVersioning_staggered"> <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="orientation">vertical</property> @@ -625,6 +637,164 @@ <property name="position">1</property> </packing> </child> + <child> + <object class="GtkBox" id="bxVersioning_trashcan"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_bottom">10</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Files are moved to .stversions folder when replaced or deleted by Syncthing</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Clean out _after</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">vkeepVersions</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="vcleanoutDays"> + <property name="width_request">300</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="text" translatable="yes">5</property> + <property name="adjustment">adjvCleanoutDays</property> + <property name="climb_rate">1</property> + <property name="snap_to_ticks">True</property> + <property name="numeric">True</property> + <property name="value">5</property> + <signal name="output" handler="cb_format_value_days" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label21"> + <property name="width_request">200</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">The number of days to keep files in the trash can.</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="bxVersioning_external"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label22"> + <property name="width_request">200</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_bottom">10</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">An external command handles the versioning. It has to remove the file from the synced folder.</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Command</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">vkeepVersions</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="vcommand"> + <property name="width_request">300</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <signal name="changed" handler="cb_check_value" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label24"> + <property name="width_request">200</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">The first command line parameter is the folder path and the second parameter is the relative path in the folder.</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> </object> </child> </object> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/setup.py new/syncthing-gtk-0.7.4/setup.py --- old/syncthing-gtk-0.7.3/setup.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/setup.py 2015-06-30 11:17:12.000000000 +0200 @@ -1,6 +1,7 @@ #!/usr/bin/env python2 from distutils.core import setup +from distutils.command.build_py import build_py from subprocess import Popen, PIPE import glob, os ICON_SIZES = (16, 24, 32, 64, 128, 256) @@ -30,6 +31,32 @@ path = path[0:-1] return version +class BuildPyEx(build_py): + """ Little extension to install command; Allows --nostupdater argument """ + user_options = build_py.user_options + [ + # Note to self: use + # # ./setup.py build_py --nostdownloader install + # to enable this option + # + ('nostdownloader', None, 'prevents installing StDownloader module; disables autoupdate capability'), + ] + + def run(self): + build_py.run(self) + + def initialize_options(self): + build_py.initialize_options(self) + self.nostdownloader = False + + def find_package_modules(self, package, package_dir): + rv = build_py.find_package_modules(self, package, package_dir) + if self.nostdownloader: + for i in rv: + if i[1] == "stdownloader": + rv.remove(i) + break + return rv + if __name__ == "__main__" : data_files = [ ('share/syncthing-gtk', glob.glob("*.glade") ), @@ -60,4 +87,5 @@ packages = ['syncthing_gtk'], data_files = data_files, scripts = [ "scripts/syncthing-gtk" ], -) + cmdclass = { 'build_py': BuildPyEx }, + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing-gtk.nsis new/syncthing-gtk-0.7.4/syncthing-gtk.nsis --- old/syncthing-gtk-0.7.3/syncthing-gtk.nsis 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing-gtk.nsis 2015-06-30 11:17:12.000000000 +0200 @@ -43,6 +43,7 @@ SetOutPath $INSTDIR # Install good stuff File build\exe.win32-2.7\syncthing-gtk.exe + File build\exe.win32-2.7\syncthing-gtk-console.exe File build\exe.win32-2.7\library.zip File build\exe.win32-2.7\*.glade File build\exe.win32-2.7\__version__ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/__init__.py new/syncthing-gtk-0.7.4/syncthing_gtk/__init__.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/__init__.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/__init__.py 2015-06-30 11:17:12.000000000 +0200 @@ -19,7 +19,6 @@ from foldereditor import FolderEditorDialog from daemonsettings import DaemonSettingsDialog from statusicon import get_status_icon - from uisettingsdialog import UISettingsDialog from configuration import Configuration from iddialog import IDDialog from aboutdialog import AboutDialog @@ -27,7 +26,12 @@ from ribar import RIBar from identicon import IdentIcon from daemonoutputdialog import DaemonOutputDialog - from stdownloader import StDownloader + try: + # May fail if stdownloader is removed from distribution + from stdownloader import StDownloader + except ImportError: + StDownloader = None + from uisettingsdialog import UISettingsDialog from wizard import Wizard from finddaemondialog import FindDaemonDialog from app import App diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/app.py new/syncthing-gtk-0.7.4/syncthing_gtk/app.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/app.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/app.py 2015-06-30 11:17:12.000000000 +0200 @@ -143,11 +143,12 @@ if cl.get_options_dict().contains("quit"): self.cb_exit() return 0 - if cl.get_options_dict().contains("force-update"): - self.force_update_version = \ - cl.get_options_dict().lookup_value("force-update").get_string() - if not self.force_update_version.startswith("v"): - self.force_update_version = "v%s" % (self.force_update_version,) + if not StDownloader is None: + if cl.get_options_dict().contains("force-update"): + self.force_update_version = \ + cl.get_options_dict().lookup_value("force-update").get_string() + if not self.force_update_version.startswith("v"): + self.force_update_version = "v%s" % (self.force_update_version,) if cl.get_options_dict().contains("add-repo"): path = os.path.abspath(os.path.expanduser( cl.get_options_dict().lookup_value("add-repo").get_string())) @@ -229,9 +230,10 @@ GLib.OptionArg.STRING) aso("remove-repo", 0, "If there is repository assigned with specified path, opens 'remove repository' dialog", GLib.OptionArg.STRING) - aso("force-update", 0, - "Force updater to download specific daemon version", - GLib.OptionArg.STRING, GLib.OptionFlags.HIDDEN) + if not StDownloader is None: + aso("force-update", 0, + "Force updater to download specific daemon version", + GLib.OptionArg.STRING, GLib.OptionFlags.HIDDEN) def setup_actions(self): def add_simple_action(name, callback): @@ -425,6 +427,9 @@ # User response is handled in App.cb_infobar_response def check_for_upgrade(self, *a): + if StDownloader is None: + # Can't, someone stole my updater module :( + return self.cancel_timer("updatecheck") if not self.config["st_autoupdate"]: # Disabled, don't even bother @@ -626,7 +631,7 @@ else: self.display_run_daemon_dialog() self.set_status(False) - elif reason == Daemon.OLD_VERSION and self.config["st_autoupdate"] and self.process != None: + elif reason == Daemon.OLD_VERSION and self.config["st_autoupdate"] and not self.process and not StDownloader is None: # Daemon is too old, but autoupdater is enabled and I have control of deamon. # Try to update. from configuration import LONG_AGO @@ -1260,7 +1265,8 @@ box.set_value("path", display_path) box.set_value("master", _("Yes") if is_master else _("No")) box.set_value("ignore", _("Yes") if ignore_perms else _("No")) - box.set_value("rescan", "%s s" % (rescan_interval,)) + box.set_value("rescan", "%s s%s" % ( + rescan_interval, " " + _("(watch)" if id in self.config["use_inotify"] else "" ))) box.set_value("shared", ", ".join([ n.get_title() for n in shared ])) box.set_value("b_master", is_master) box.set_value("can_override", False) @@ -1650,6 +1656,7 @@ path = os.path.expanduser(box["path"]) if IS_WINDOWS: # Don't attempt anything, use Windows Explorer on Windows + path = path.replace("/", "\\") os.system('explorer "%s"' % (path,)) else: # Try to use any of following, known commands to @@ -1869,7 +1876,7 @@ if proc == self.process: # Whatever happens, if daemon dies while it shouldn't, # restart it - if self.config["st_autoupdate"] and os.path.exists(self.config["syncthing_binary"] + ".new"): + if not StDownloader is None and self.config["st_autoupdate"] and os.path.exists(self.config["syncthing_binary"] + ".new"): # New daemon version is downloaded and ready to use. # Switch to this version before restarting self.swap_updated_binary() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/daemon.py new/syncthing-gtk-0.7.4/syncthing_gtk/daemon.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/daemon.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/daemon.py 2015-06-30 11:17:12.000000000 +0200 @@ -16,7 +16,7 @@ from dateutil import tz from xml.dom import minidom from datetime import datetime -import json, os, sys, time, logging +import json, os, sys, time, logging, urllib log = logging.getLogger("Daemon") # Minimal version supported by Daemon class @@ -1219,18 +1219,18 @@ def rescan(self, folder_id, path=None): """ Asks daemon to rescan entire folder or specified path """ - # Errors here are ignored; Syncthing rescans stuff periodicaly, - # so it's not big problem if call fails. + def on_error(*a): + log.error(a) if path is None: - self._rest_post("db/scan?folder=%s" % (folder_id,), {}, lambda *a: a, lambda *a: a, folder_id) + self._rest_post("db/scan?folder=%s" % (folder_id,), {}, lambda *a: a, on_error, folder_id) else: - self._rest_post("db/scan?folder=%s&sub=%s" % (folder_id, path), {}, lambda *a: a, lambda *a: a, folder_id) + path_enc = urllib.quote(path.encode('utf-8'), ''.encode('utf-8')) + self._rest_post("db/scan?folder=%s&sub=%s" % (folder_id, path_enc), {}, lambda *a: a, on_error, folder_id) def override(self, folder_id): """ Asks daemon to override changes made in specified folder """ - # Errors here are non-fatal, not expected and thus ignored. def on_error(*a): - print a + log.error(a) self._rest_post("model/override?folder=%s" % (folder_id,), {}, lambda *a: a, on_error, folder_id) def request_events(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/daemonprocess.py new/syncthing-gtk-0.7.4/syncthing_gtk/daemonprocess.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/daemonprocess.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/daemonprocess.py 2015-06-30 11:17:12.000000000 +0200 @@ -72,7 +72,7 @@ self._proc = Gio.Subprocess.new(self.commandline, flags) else: # I just really do hope that there is no distro w/out nice command - self._proc = Gio.Subprocess.new([ "nice", "-%s" % self.priority ] + self.commandline, flags) + self._proc = Gio.Subprocess.new([ "nice", "-n", "%s" % self.priority ] + self.commandline, flags) self._proc.wait_check_async(None, self._cb_finished) self._stdout = self._proc.get_stdout_pipe() else: @@ -81,7 +81,7 @@ self._proc = Popen(self.commandline, stdout=PIPE) else: # still hoping - self._proc = Popen([ "nice", "-%s" % self.priority ], stdout=PIPE) + self._proc = Popen([ "nice", "-n", "%s" % self.priority ], stdout=PIPE) self._stdout = Gio.UnixInputStream.new(self._proc.stdout.fileno(), False) self._check = GLib.timeout_add_seconds(1, self._cb_check_alive) except Exception, e: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/editordialog.py new/syncthing-gtk-0.7.4/syncthing_gtk/editordialog.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/editordialog.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/editordialog.py 2015-06-30 11:17:12.000000000 +0200 @@ -317,8 +317,12 @@ value = self[x].get_text().strip() if len(value) == 0: # Empty value in field - self["btSave"].set_sensitive(False) - self.hide_error_message(x) + if self.checks[x](value): + # ... but empty value is OK + self.hide_error_message(x) + else: + self["btSave"].set_sensitive(False) + self.hide_error_message(x) elif not self.checks[x](value): # Invalid value in any field self["btSave"].set_sensitive(False) @@ -362,7 +366,7 @@ if isinstance(w, Gtk.SpinButton): self.set_value(strip_v(key), int(w.get_adjustment().get_value())) elif isinstance(w, Gtk.Entry): - self.set_value(strip_v(key), w.get_text()) + self.set_value(strip_v(key), w.get_text().decode("utf-8")) elif isinstance(w, Gtk.CheckButton): self.set_value(strip_v(key), w.get_active()) elif isinstance(w, Gtk.ComboBox): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/finddaemondialog.py new/syncthing-gtk-0.7.4/syncthing_gtk/finddaemondialog.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/finddaemondialog.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/finddaemondialog.py 2015-06-30 11:17:12.000000000 +0200 @@ -30,8 +30,9 @@ "%s bellow or click on <b>Download</b> " "button to download latest Syncthing package.") % (exe,) )) - if IS_XP: - # Downloading is not offered on XP - github will not talk to it + if IS_XP or StDownloader is None: + # Downloading is not offered on XP (github will not talk to it) + # or if StDownloader module is not packaged self["lblMessage"].set_markup("%s\n%s" % ( _("Syncthing daemon binary cannot be found."), _("If you have Syncthing installed, please, set path to " @@ -39,8 +40,6 @@ )) self.hide_download_button() - - ### Dialog emulation def set_transient_for(self, parent): self["editor"].set_transient_for(parent) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/foldereditor.py new/syncthing-gtk-0.7.4/syncthing_gtk/foldereditor.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/foldereditor.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/foldereditor.py 2015-06-30 11:17:12.000000000 +0200 @@ -21,8 +21,9 @@ RE_GEN_ID = re.compile("([a-zA-Z0-9\-\._]{1,64}).*") VALUES = [ "vid", "vpath", "vreadOnly", "vignorePerms", "vdevices", "vversioning", "vkeepVersions", "vrescanIntervalS", "vmaxAge", - "vversionsPath", "vinotify" + "vversionsPath", "vinotify", "vcleanoutDays", "vcommand" ] +VERSIONING_TYPES = set(['simple', 'staggered', 'trashcan', 'external']) class FolderEditorDialog(EditorDialog): MESSAGES = { @@ -77,6 +78,10 @@ return self.get_burried_value("versioning/params/keep", self.values, 0, int) elif key == "maxAge": return self.get_burried_value("versioning/params/maxAge", self.values, 0, int) / 86400 # seconds to days + elif key == "cleanoutDays": + return self.get_burried_value("versioning/params/cleanoutDays", self.values, 0, int) + elif key == "command": + return self.get_burried_value("versioning/params/command", self.values, "") elif key == "versionsPath": return self.get_burried_value("versioning/params/versionsPath", self.values, "") elif key == "versioning": @@ -96,10 +101,18 @@ # Create structure if needed self.create_dicts(self.values, ("versioning", "params", "keep")) self.values["versioning"]["params"]["keep"] = str(int(value)) + elif key == "cleanoutDays": + # Create structure if needed + self.create_dicts(self.values, ("versioning", "params", "cleanoutDays")) + self.values["versioning"]["params"]["cleanoutDays"] = str(int(value)) elif key == "maxAge": # Create structure if needed self.create_dicts(self.values, ("versioning", "params", "maxAge")) self.values["versioning"]["params"]["maxAge"] = str(int(value) * 86400) # days to seconds + elif key == "command": + # Create structure if needed + self.create_dicts(self.values, ("versioning", "params", "command")) + self.values["versioning"]["params"]["command"] = value elif key == "versionsPath": # Create structure if needed self.create_dicts(self.values, ("versioning", "params", "versionsPath")) @@ -123,8 +136,9 @@ self.values = { strip_v(x) : "" for x in VALUES } self.checks = { "vid" : self.check_folder_id, - "vpath" : self.check_path - } + "vpath" : self.check_path, + "vcommand" : self.check_command, + } if self.id != None: try: v = [ x for x in self.config["folders"] if x["id"] == self.id ][0] @@ -140,7 +154,9 @@ self.set_value("keepVersions", 10) else: self.values = [ x for x in self.config["folders"] if x["id"] == self.id ][0] - self.checks = {} + self.checks = { + "vcommand" : self.check_command, + } self["vpath"].set_sensitive(False) self["btBrowse"].set_sensitive(False) except KeyError, e: @@ -179,8 +195,8 @@ if self["rvversioning"].get_reveal_child(): self["rvversioning"].set_reveal_child(False) else: - self["bxVersioningSimple"].set_visible(self.get_value("versioning") == "simple") - self["bxVersioningStaggered"].set_visible(self.get_value("versioning") == "staggered") + for x in VERSIONING_TYPES: + self["bxVersioning_" + x].set_visible(self.get_value("versioning") == x) if not self["rvversioning"].get_reveal_child(): self["rvversioning"].set_reveal_child(True) @@ -222,7 +238,15 @@ )) box.set_color_hex(COLOR_NEW) + #@Overrides + def ui_value_changed(self, w, *a): + EditorDialog.ui_value_changed(self, w, *a) + self.cb_check_value(w, *a) + def check_folder_id(self, value): + if len(value.strip()) == 0: + # Empty value + return False if value in self.app.folders: # Duplicate folder id return False @@ -233,7 +257,11 @@ def check_path(self, value): # Any non-empty path is OK - return True + return len(value.strip()) > 0 + + def check_command(self, value): + # Any non-empty command is OK + return self.get_value("versioning") != "external" or len(value.strip()) > 0 def fill_folder_id(self, rid): """ Pre-fills folder Id for new-folder dialog """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/tools.py new/syncthing-gtk-0.7.4/syncthing_gtk/tools.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/tools.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/tools.py 2015-06-30 11:17:12.000000000 +0200 @@ -346,7 +346,7 @@ if IS_WINDOWS: return os.path.join(get_install_path(), "syncthing-gtk.exe") else: - executable = __main__.__file__ + executable = __main__.__file__.decode("utf-8") if not os.path.isabs(executable): executable = os.path.normpath(os.path.join(os.getcwd(), executable)) if executable.endswith(".py"): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/uisettingsdialog.py new/syncthing-gtk-0.7.4/syncthing_gtk/uisettingsdialog.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/uisettingsdialog.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/uisettingsdialog.py 2015-06-30 11:17:12.000000000 +0200 @@ -7,7 +7,7 @@ from __future__ import unicode_literals from gi.repository import Gtk, Gdk from syncthing_gtk import EditorDialog -from syncthing_gtk import Notifications, HAS_DESKTOP_NOTIFY +from syncthing_gtk import Notifications, StDownloader, HAS_DESKTOP_NOTIFY from syncthing_gtk.tools import * from syncthing_gtk.configuration import LONG_AGO import os, logging @@ -102,7 +102,9 @@ else: log.warning("Cannot find %s.py required to support %s", plugin, name) self["fmLblIntegrationStatus"].set_text("\n".join(status)) - + if StDownloader is None: + self["vst_autoupdate"].set_visible(False) + self["lblAutoupdate"].set_visible(False) self.cb_data_loaded(copy) self.cb_check_value() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/watcher.py new/syncthing-gtk-0.7.4/syncthing_gtk/watcher.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/watcher.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/watcher.py 2015-06-30 11:17:12.000000000 +0200 @@ -85,8 +85,7 @@ self.watch(None, event.pathname.decode("utf-8")) self._report_created(event.pathname) elif event.mask & pyinotify.IN_DELETE != 0: - # Deleted dir - Remove watch to deleted dir - self.remove(event.pathname) + # Deleted dir self._report_deleted(event.pathname) elif event.mask & pyinotify.IN_CREATE != 0: # New file - ignore event, 'IN_CLOSE_WRITE' is enought for my purpose diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/syncthing_gtk/wizard.py new/syncthing-gtk-0.7.4/syncthing_gtk/wizard.py --- old/syncthing-gtk-0.7.3/syncthing_gtk/wizard.py 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/syncthing_gtk/wizard.py 2015-06-30 11:17:12.000000000 +0200 @@ -228,11 +228,14 @@ def prepare(self): self.paths = [ "./" ] self.paths += [ os.path.expanduser("~/.local/bin"), self.parent.st_configdir ] - suffix, trash = StDownloader.determine_platform() - self.binaries = ["syncthing", "syncthing%s" % (suffix,)] - if suffix == "x64": - # Allow 32bit binary on 64bit - self.binaries += ["syncthing.x86"] + if StDownloader is None: + self.binaries = ["syncthing"] + else: + suffix, trash = StDownloader.determine_platform() + self.binaries = ["syncthing", "syncthing%s" % (suffix,)] + if suffix == "x64": + # Allow 32bit binary on 64bit + self.binaries += ["syncthing.x86"] if IS_WINDOWS: self.paths += [ "c:/Program Files/syncthing", "c:/Program Files (x86)/syncthing", @@ -258,8 +261,17 @@ # directly self.parent.insert_and_go(DownloadSTPage()) return False + elif StDownloader is None: + # On Linux with updater disabled, generate and + # display error page + title = _("Syncthing daemon not found.") + message = _("Please, use package manager to install the Syncthing package.") + page = self.parent.error(self, title, message, False) + page.show_all() + return False else: - # On Linux, generate and display error page + # On Linux with updater generate similar display error + # and offer download from syncthing_gtk.app import MIN_ST_VERSION target_folder_link = '<a href="file://%s">%s</a>' % ( os.path.expanduser(StDownloader.get_target_folder()), @@ -300,7 +312,7 @@ page.show_all() # Add Download page self.parent.insert(DownloadSTPage()) - return + return False for bin in self.binaries: bin_path = os.path.join(path, bin) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/syncthing-gtk-0.7.3/ui-settings.glade new/syncthing-gtk-0.7.4/ui-settings.glade --- old/syncthing-gtk-0.7.3/ui-settings.glade 2015-06-10 17:44:51.000000000 +0200 +++ new/syncthing-gtk-0.7.4/ui-settings.glade 2015-06-30 11:17:12.000000000 +0200 @@ -685,6 +685,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="no_show_all">True</property> <property name="margin_top">10</property> <property name="xalign">0</property> <property name="draw_indicator">True</property> @@ -708,9 +709,10 @@ </packing> </child> <child> - <object class="GtkLabel" id="label8"> + <object class="GtkLabel" id="lblAutoupdate"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="no_show_all">True</property> <property name="margin_left">10</property> <property name="xalign">0</property> <property name="label" translatable="yes">If enabled, Syncthing-GTK will automatically check for new daemon releases and replace binary with latest version.</property>