Compare commits
28 Commits
deluge-1.3
...
deluge-1.3
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b0ceae8d28 | ||
![]() |
dc0bf3bc88 | ||
![]() |
3b9d7ff9c3 | ||
![]() |
a165d5d746 | ||
![]() |
cc02ebea6a | ||
![]() |
41ffee5d8a | ||
![]() |
14a89b3f8a | ||
![]() |
6f0c2af58a | ||
![]() |
84cccabf19 | ||
![]() |
7fb483adde | ||
![]() |
28ce7a70a0 | ||
![]() |
14565977fa | ||
![]() |
e4420ef354 | ||
![]() |
02ad0b93ab | ||
![]() |
6d2a001635 | ||
![]() |
2a3eb0578c | ||
![]() |
60fac28217 | ||
![]() |
59e01e7ecf | ||
![]() |
4c52ee4229 | ||
![]() |
8428524793 | ||
![]() |
21c8d02d9a | ||
![]() |
0c687c7684 | ||
![]() |
78f9efefd9 | ||
![]() |
6b228ce31f | ||
![]() |
40ce4ec731 | ||
![]() |
c029c312e4 | ||
![]() |
16c38cd027 | ||
![]() |
e23a6b852a |
34
ChangeLog
34
ChangeLog
@@ -1,18 +1,37 @@
|
||||
=== Deluge 1.3.1 (31 October 2010) ===
|
||||
==== Core ====
|
||||
* #1369: Fix non-ascii config folders not working in windows
|
||||
|
||||
==== GtkUI ====
|
||||
* #1365: Fix sidebar not updating show/hide trackers
|
||||
* #1247: Fix hang on quit
|
||||
|
||||
==== WebUI ====
|
||||
* #1364: Fix preferences not saving when the web ui plugin is enabled in classic mode
|
||||
* #1377: Fix bug when enabling plugins
|
||||
* #1370: Fix issues with preferences
|
||||
* #1312: Fix deluge-web using 100% CPU
|
||||
|
||||
=== Deluge 1.3.0 (18 September 2010) ===
|
||||
==== Core ====
|
||||
* Fix issue where the save_timer is cancelled when it's not active
|
||||
* Fix unhandled exception when adding a torrent to the session
|
||||
* Moved xdg import so it is not called on Windows, where it is unused. fixes #1343
|
||||
* Fix key error after enabling a plugin that introduces a new status key
|
||||
* Add max active downloading and seeding options to scheduler.
|
||||
* Ignore global stop ratio related settings in logic, so per torrent ones are used.
|
||||
* Fix scheduler so that it keeps current state, even after global settings change.
|
||||
* Ensure preferencesmanager only changes intended libtorrent session settings.
|
||||
* Fix issue when adding torrents without a 'session'. This can happen when
|
||||
a plugin adds a torrent, like how the AutoAdd plugin works. The user that
|
||||
adds this torrent will be an empty string.
|
||||
* Fix issue when adding torrents without a 'session'. This can happen when a plugin adds a torrent, like how the AutoAdd plugin works. The user that adds this torrent will be an empty string.
|
||||
* Add TorrentFileCompleted event
|
||||
* AutoAdd plugin can now recover when one of the watchfolders has an unhandled exception.
|
||||
|
||||
==== GtkUI ====
|
||||
* Increase max piece size to 8 MiB in create torrent dialog (closes #1358)
|
||||
|
||||
==== Scheduler ====
|
||||
* Add max active downloading and seeding options to scheduler.
|
||||
* Fix scheduler so that it keeps current state, even after global settings change.
|
||||
|
||||
==== AutoAdd ====
|
||||
* AutoAdd plugin can now recover when one of the watchfolders has an unhandled exception.
|
||||
* Fix bug in AutoAdd plugin where watchdirs would not display in gtkui when first enabled.
|
||||
* Fix bugs with unicode torrents in AutoAdd plugin.
|
||||
|
||||
@@ -20,8 +39,7 @@
|
||||
==== Core ====
|
||||
* Fix tracker_icons failing on windows
|
||||
* Fix #1302 an uncaught exception in an state_changed event handler in SessionProxy was preventing the TorrentManager's stop method from properly saving all the resume data
|
||||
* Fix issue with SessionProxy not updating the torrent status correctly when
|
||||
get_torrent_status calls take place within the cache_expiry time
|
||||
* Fix issue with SessionProxy not updating the torrent status correctly when get_torrent_status calls take place within the cache_expiry time
|
||||
|
||||
==== ConsoleUI ====
|
||||
* #1307: Fix not being able to add torrents
|
||||
|
4
DEPENDS
4
DEPENDS
@@ -7,6 +7,7 @@
|
||||
* setuptools
|
||||
* gettext
|
||||
* pyxdg
|
||||
* chardet
|
||||
* geoip-database (optional)
|
||||
|
||||
* libtorrent >= 0.14, or build the included version
|
||||
@@ -16,9 +17,6 @@
|
||||
* openssl
|
||||
* zlib
|
||||
|
||||
=== UIs ===
|
||||
* chardet
|
||||
|
||||
=== Gtk ===
|
||||
* python-notify (libnotify python wrapper)
|
||||
* pygame
|
||||
|
@@ -41,6 +41,7 @@ import time
|
||||
import subprocess
|
||||
import platform
|
||||
import sys
|
||||
import chardet
|
||||
|
||||
try:
|
||||
import json
|
||||
@@ -474,7 +475,7 @@ def free_space(path):
|
||||
sectors, bytes, free, total = map(long, win32file.GetDiskFreeSpace(path))
|
||||
return (free * sectors * bytes)
|
||||
else:
|
||||
disk_data = os.statvfs(path)
|
||||
disk_data = os.statvfs(path.encode("utf8"))
|
||||
block_size = disk_data.f_bsize
|
||||
return disk_data.f_bavail * block_size
|
||||
|
||||
@@ -560,6 +561,41 @@ def xml_encode(string):
|
||||
string = string.replace(char, escape)
|
||||
return string
|
||||
|
||||
def decode_string(s, encoding="utf8"):
|
||||
"""
|
||||
Decodes a string and re-encodes it in utf8. If it cannot decode using
|
||||
`:param:encoding` then it will try to detect the string encoding and
|
||||
decode it.
|
||||
|
||||
:param s: string to decode
|
||||
:type s: string
|
||||
:keyword encoding: the encoding to use in the decoding
|
||||
:type encoding: string
|
||||
|
||||
"""
|
||||
|
||||
try:
|
||||
s = s.decode(encoding).encode("utf8", "ignore")
|
||||
except UnicodeDecodeError:
|
||||
s = s.decode(chardet.detect(s)["encoding"], "ignore").encode("utf8", "ignore")
|
||||
return s
|
||||
|
||||
def utf8_encoded(s):
|
||||
"""
|
||||
Returns a utf8 encoded string of s
|
||||
|
||||
:param s: (unicode) string to (re-)encode
|
||||
:type s: basestring
|
||||
:returns: a utf8 encoded string of s
|
||||
:rtype: str
|
||||
|
||||
"""
|
||||
if isinstance(s, str):
|
||||
s = decode_string(s, locale.getpreferredencoding())
|
||||
elif isinstance(s, unicode):
|
||||
s = s.encode("utf8", "ignore")
|
||||
return s
|
||||
|
||||
class VersionSplit(object):
|
||||
"""
|
||||
Used for comparing version numbers.
|
||||
|
@@ -146,7 +146,8 @@ class Config(object):
|
||||
self._save_timer = None
|
||||
|
||||
if defaults:
|
||||
self.__config = dict(defaults)
|
||||
for key, value in defaults.iteritems():
|
||||
self.set_item(key, value)
|
||||
|
||||
# Load the config from file in the config_dir
|
||||
if config_dir:
|
||||
@@ -187,6 +188,10 @@ what is currently in the config and it could not convert the value
|
||||
5
|
||||
|
||||
"""
|
||||
if isinstance(value, basestring):
|
||||
value = deluge.common.utf8_encoded(value)
|
||||
|
||||
|
||||
if not self.__config.has_key(key):
|
||||
self.__config[key] = value
|
||||
log.debug("Setting '%s' to %s of %s", key, value, type(value))
|
||||
@@ -200,6 +205,9 @@ what is currently in the config and it could not convert the value
|
||||
|
||||
if value is not None and oldtype != type(None) and oldtype != newtype:
|
||||
try:
|
||||
if oldtype == unicode:
|
||||
value = oldtype(value, "utf8")
|
||||
else:
|
||||
value = oldtype(value)
|
||||
except ValueError:
|
||||
log.warning("Type '%s' invalid for '%s'", newtype, key)
|
||||
@@ -250,6 +258,9 @@ what is currently in the config and it could not convert the value
|
||||
5
|
||||
|
||||
"""
|
||||
if isinstance(self.__config[key], str):
|
||||
return self.__config[key].decode("utf8")
|
||||
else:
|
||||
return self.__config[key]
|
||||
|
||||
def register_change_callback(self, callback):
|
||||
@@ -400,7 +411,7 @@ what is currently in the config and it could not convert the value
|
||||
# The config has not changed so lets just return
|
||||
if self._save_timer and self._save_timer.active():
|
||||
self._save_timer.cancel()
|
||||
return
|
||||
return True
|
||||
except IOError, e:
|
||||
log.warning("Unable to open config file: %s because: %s", filename, e)
|
||||
|
||||
|
@@ -196,9 +196,8 @@ class FilterManager(component.Component):
|
||||
value = status[field]
|
||||
items[field][value] = items[field].get(value, 0) + 1
|
||||
|
||||
items["tracker_host"]["All"] = len(torrent_ids)
|
||||
|
||||
if "tracker_host" in items:
|
||||
items["tracker_host"]["All"] = len(torrent_ids)
|
||||
items["tracker_host"]["Error"] = len(tracker_error_filter(torrent_ids, ("Error",)))
|
||||
|
||||
if "state" in tree_keys and not show_zero_hits:
|
||||
|
@@ -179,6 +179,11 @@ class Torrent(object):
|
||||
else:
|
||||
self.time_added = time.time()
|
||||
|
||||
# Keep track if we're forcing a recheck of the torrent so that we can
|
||||
# repause it after its done if necessary
|
||||
self.forcing_recheck = False
|
||||
self.forcing_recheck_paused = False
|
||||
|
||||
log.debug("Torrent object created.")
|
||||
|
||||
## Options methods ##
|
||||
@@ -859,12 +864,15 @@ class Torrent(object):
|
||||
|
||||
def force_recheck(self):
|
||||
"""Forces a recheck of the torrents pieces"""
|
||||
paused = self.handle.is_paused()
|
||||
try:
|
||||
self.handle.force_recheck()
|
||||
self.handle.resume()
|
||||
except Exception, e:
|
||||
log.debug("Unable to force recheck: %s", e)
|
||||
return False
|
||||
self.forcing_recheck = True
|
||||
self.forcing_recheck_paused = paused
|
||||
return True
|
||||
|
||||
def rename_files(self, filenames):
|
||||
|
@@ -47,16 +47,14 @@ from twisted.internet.task import LoopingCall
|
||||
|
||||
from deluge._libtorrent import lt
|
||||
|
||||
|
||||
from deluge.event import *
|
||||
from deluge.error import *
|
||||
import deluge.common
|
||||
import deluge.component as component
|
||||
from deluge.configmanager import ConfigManager, get_config_dir
|
||||
from deluge.core.torrent import Torrent
|
||||
from deluge.core.torrent import TorrentOptions
|
||||
import deluge.core.oldstateupgrader
|
||||
from deluge.ui.common import utf8_encoded
|
||||
from deluge.common import utf8_encoded
|
||||
|
||||
from deluge.log import LOG as log
|
||||
|
||||
@@ -852,6 +850,13 @@ class TorrentManager(component.Component):
|
||||
except:
|
||||
return
|
||||
|
||||
# Check to see if we're forcing a recheck and set it back to paused
|
||||
# if necessary
|
||||
if torrent.forcing_recheck:
|
||||
torrent.forcing_recheck = False
|
||||
if torrent.forcing_recheck_paused:
|
||||
torrent.handle.pause()
|
||||
|
||||
# Set the torrent state
|
||||
torrent.update_state()
|
||||
|
||||
|
@@ -82,6 +82,7 @@ class Core(CorePluginBase):
|
||||
self.is_importing = False
|
||||
self.has_imported = False
|
||||
self.up_to_date = False
|
||||
self.need_to_resume_session = False
|
||||
self.num_blocked = 0
|
||||
self.file_progress = 0.0
|
||||
|
||||
@@ -95,7 +96,7 @@ class Core(CorePluginBase):
|
||||
|
||||
update_now = False
|
||||
if self.config["load_on_start"]:
|
||||
self.pause_transfers()
|
||||
self.pause_session()
|
||||
if self.config["last_update"]:
|
||||
last_update = datetime.fromtimestamp(self.config["last_update"])
|
||||
check_period = timedelta(days=self.config["check_after_days"])
|
||||
@@ -104,7 +105,8 @@ class Core(CorePluginBase):
|
||||
else:
|
||||
d = self.import_list(deluge.configmanager.get_config_dir("blocklist.cache"))
|
||||
d.addCallbacks(self.on_import_complete, self.on_import_error)
|
||||
d.addBoth(self.resume_transfers)
|
||||
if self.need_to_resume_session:
|
||||
d.addBoth(self.resume_session)
|
||||
|
||||
# This function is called every 'check_after_days' days, to download
|
||||
# and import a new list if needed.
|
||||
@@ -150,7 +152,8 @@ class Core(CorePluginBase):
|
||||
else:
|
||||
d = self.import_list(self.config["url"])
|
||||
d.addCallbacks(self.on_import_complete, self.on_import_error)
|
||||
d.addBoth(self.resume_transfers)
|
||||
if self.need_to_resume_session:
|
||||
d.addBoth(self.resume_session)
|
||||
|
||||
return d
|
||||
|
||||
@@ -418,13 +421,14 @@ class Core(CorePluginBase):
|
||||
else:
|
||||
self.reader = create_reader(self.config["list_type"], self.config["list_compression"])
|
||||
|
||||
def pause_transfers(self):
|
||||
self.session_was_paused = self.core.session.is_paused()
|
||||
if not self.session_was_paused:
|
||||
def pause_session(self):
|
||||
if not self.core.session.is_paused():
|
||||
self.core.session.pause()
|
||||
self.need_to_resume_session = True
|
||||
else:
|
||||
self.need_to_resume_session = False
|
||||
|
||||
def resume_transfers(self, result):
|
||||
if not self.session_was_paused:
|
||||
self.session_was_paused = True
|
||||
def resume_session(self, result):
|
||||
self.core.session.resume()
|
||||
self.need_to_resume_session = False
|
||||
return result
|
||||
|
@@ -42,7 +42,6 @@ import os
|
||||
import sys
|
||||
import urlparse
|
||||
|
||||
import chardet
|
||||
import locale
|
||||
|
||||
try:
|
||||
@@ -50,45 +49,11 @@ try:
|
||||
except ImportError:
|
||||
from sha import sha
|
||||
|
||||
from deluge import bencode, common
|
||||
from deluge import bencode
|
||||
from deluge.common import decode_string, path_join
|
||||
from deluge.log import LOG as log
|
||||
import deluge.configmanager
|
||||
|
||||
def decode_string(s, encoding="utf8"):
|
||||
"""
|
||||
Decodes a string and re-encodes it in utf8. If it cannot decode using
|
||||
`:param:encoding` then it will try to detect the string encoding and
|
||||
decode it.
|
||||
|
||||
:param s: string to decode
|
||||
:type s: string
|
||||
:keyword encoding: the encoding to use in the decoding
|
||||
:type encoding: string
|
||||
|
||||
"""
|
||||
|
||||
try:
|
||||
s = s.decode(encoding).encode("utf8", "ignore")
|
||||
except UnicodeDecodeError:
|
||||
s = s.decode(chardet.detect(s)["encoding"], "ignore").encode("utf8", "ignore")
|
||||
return s
|
||||
|
||||
def utf8_encoded(s):
|
||||
"""
|
||||
Returns a utf8 encoded string of s
|
||||
|
||||
:param s: (unicode) string to (re-)encode
|
||||
:type s: basestring
|
||||
:returns: a utf8 encoded string of s
|
||||
:rtype: str
|
||||
|
||||
"""
|
||||
if isinstance(s, str):
|
||||
s = decode_string(s, locale.getpreferredencoding())
|
||||
elif isinstance(s, unicode):
|
||||
s = s.encode("utf8", "ignore")
|
||||
return s
|
||||
|
||||
class TorrentInfo(object):
|
||||
"""
|
||||
Collects information about a torrent file.
|
||||
@@ -336,7 +301,7 @@ class FileTree2(object):
|
||||
"""
|
||||
def walk(directory, parent_path):
|
||||
for path in directory["contents"].keys():
|
||||
full_path = common.path_join(parent_path, path)
|
||||
full_path = path_join(parent_path, path)
|
||||
if directory["contents"][path]["type"] == "dir":
|
||||
directory["contents"][path] = callback(full_path, directory["contents"][path]) or \
|
||||
directory["contents"][path]
|
||||
|
@@ -122,6 +122,9 @@ class FilterTreeView(component.Component):
|
||||
self.label_view.set_show_expanders(True)
|
||||
self.label_view.set_headers_visible(False)
|
||||
self.label_view.set_level_indentation(-35)
|
||||
# Force the theme to use an expander-size of 15 so that we don't cut out
|
||||
# entries due to our indentation hack.
|
||||
gtk.rc_parse_string('style "treeview-style" { GtkTreeView::expander-size = 15 } class "GtkTreeView" style "treeview-style"')
|
||||
|
||||
self.label_view.set_model(self.treestore)
|
||||
self.label_view.get_selection().connect("changed", self.on_selection_changed)
|
||||
|
@@ -47,6 +47,7 @@ import sys
|
||||
|
||||
# Initialize gettext
|
||||
try:
|
||||
locale.setlocale(locale.LC_ALL, '')
|
||||
if hasattr(locale, "bindtextdomain"):
|
||||
locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
|
||||
if hasattr(locale, "textdomain"):
|
||||
|
@@ -152,10 +152,15 @@ class MainWindow(component.Component):
|
||||
"""Returns a reference to the main window glade object."""
|
||||
return self.main_glade
|
||||
|
||||
def quit(self):
|
||||
if client.is_classicmode():
|
||||
gtk.main_quit()
|
||||
else:
|
||||
def quit(self, shutdown=False):
|
||||
"""
|
||||
Quits the GtkUI
|
||||
|
||||
:param shutdown: whether or not to shutdown the daemon as well
|
||||
:type shutdown: boolean
|
||||
"""
|
||||
if shutdown:
|
||||
client.daemon.shutdown()
|
||||
reactor.stop()
|
||||
|
||||
def load_window_state(self):
|
||||
|
@@ -253,10 +253,7 @@ class MenuBar(component.Component):
|
||||
|
||||
def on_menuitem_quitdaemon_activate(self, data=None):
|
||||
log.debug("on_menuitem_quitdaemon_activate")
|
||||
# Tell the core to shutdown
|
||||
def on_shutdown(result):
|
||||
self.window.quit()
|
||||
client.daemon.shutdown().addCallback(on_shutdown)
|
||||
self.window.quit(shutdown=True)
|
||||
|
||||
def on_menuitem_quit_activate(self, data=None):
|
||||
log.debug("on_menuitem_quit_activate")
|
||||
|
@@ -323,9 +323,6 @@ class SystemTray(component.Component):
|
||||
if self.config["lock_tray"] and not self.window.visible():
|
||||
self.unlock_tray()
|
||||
|
||||
if self.config["classic_mode"]:
|
||||
client.daemon.shutdown()
|
||||
|
||||
self.window.quit()
|
||||
|
||||
def on_menuitem_quitdaemon_activate(self, menuitem):
|
||||
@@ -333,8 +330,7 @@ class SystemTray(component.Component):
|
||||
if self.config["lock_tray"] and not self.window.visible():
|
||||
self.unlock_tray()
|
||||
|
||||
client.daemon.shutdown()
|
||||
self.window.quit()
|
||||
self.window.quit(shutdown=True)
|
||||
|
||||
def tray_setbwdown(self, widget, data=None):
|
||||
self.setbwlimit(widget, _("Set Maximum Download Speed"), "max_download_speed",
|
||||
|
@@ -31,7 +31,7 @@
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div style="background-image: url('${base}themes/default/tree/loading.gif');"></div>
|
||||
<div style="background-image: url('${base}themes/images/default/tree/loading.gif');"></div>
|
||||
|
||||
<!-- Preload icon classes -->
|
||||
<div class="ext-mb-error"></div>
|
||||
|
@@ -174,7 +174,7 @@ Deluge.MultiOptionsManager = Ext.extend(Deluge.OptionsManager, {
|
||||
this.stored[this.currentId][option] = value;
|
||||
|
||||
if (!this.isDirty(option)) {
|
||||
this.fireEvent('changed', this.currentId, option, value, oldValue);
|
||||
this.fireEvent('changed', option, value, oldValue);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@@ -232,9 +232,9 @@ Deluge.preferences.Plugins = Ext.extend(Ext.Panel, {
|
||||
},
|
||||
|
||||
onPluginEnabled: function(pluginName) {
|
||||
var index = this.grid.getStore().find('plugin', pluginName);
|
||||
var index = this.list.getStore().find('plugin', pluginName);
|
||||
if (index == -1) return;
|
||||
var plugin = this.grid.getStore().getAt(index);
|
||||
var plugin = this.list.getStore().getAt(index);
|
||||
plugin.set('enabled', true);
|
||||
plugin.commit();
|
||||
},
|
||||
|
35
deluge/ui/web/js/ext-extensions/form/SpinnerFieldFix.js
Normal file
35
deluge/ui/web/js/ext-extensions/form/SpinnerFieldFix.js
Normal file
@@ -0,0 +1,35 @@
|
||||
/*!
|
||||
* Ext.ux.form.SpinnerField.js
|
||||
*
|
||||
* Copyright (c) Damien Churchill 2010 <damoxc@gmail.com>
|
||||
*
|
||||
* 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 3, 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.,
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give
|
||||
* permission to link the code of portions of this program with the OpenSSL
|
||||
* library.
|
||||
* You must obey the GNU General Public License in all respects for all of
|
||||
* the code used other than OpenSSL. If you modify file(s) with this
|
||||
* exception, you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete
|
||||
* this exception statement from your version. If you delete this exception
|
||||
* statement from all source files in the program, then also delete it here.
|
||||
*/
|
||||
|
||||
Ext.override(Ext.ux.form.SpinnerField, {
|
||||
onBlur: Ext.form.Field.prototype.onBlur
|
||||
});
|
@@ -150,6 +150,7 @@ class JSON(resource.Resource, component.Component):
|
||||
return d
|
||||
|
||||
def disable(self):
|
||||
if not client.is_classicmode():
|
||||
client.disconnect()
|
||||
|
||||
def enable(self):
|
||||
@@ -381,16 +382,21 @@ class EventQueue(object):
|
||||
|
||||
# Create a deferred to and check again in 100ms
|
||||
d = Deferred()
|
||||
reactor.callLater(0.5, self._get_events, listener_id, d)
|
||||
reactor.callLater(0.1, self._get_events, listener_id, 0, d)
|
||||
return d
|
||||
|
||||
def _get_events(self, listener_id, d):
|
||||
def _get_events(self, listener_id, count, d):
|
||||
if listener_id in self.__queue:
|
||||
queue = self.__queue[listener_id]
|
||||
del self.__queue[listener_id]
|
||||
d.callback(queue)
|
||||
else:
|
||||
reactor.callLater(0.1, self._get_events, listener_id, d)
|
||||
# Prevent this loop going on indefinitely incase a client leaves
|
||||
# the page or disconnects uncleanly.
|
||||
if count >= 3000:
|
||||
d.callback(None)
|
||||
else:
|
||||
reactor.callLater(0.1, self._get_events, listener_id, count + 1, d)
|
||||
|
||||
def remove_listener(self, listener_id, event):
|
||||
"""
|
||||
|
@@ -1,33 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import sys
|
||||
import cPickle as pickle
|
||||
if sys.version_info > (2, 6):
|
||||
import json
|
||||
else:
|
||||
import simplejson as json
|
||||
|
||||
from deluge.common import get_default_config_dir
|
||||
|
||||
config_dir = get_default_config_dir()
|
||||
files = []
|
||||
for filename in os.listdir(config_dir):
|
||||
filename = os.path.join(config_dir, filename)
|
||||
if not os.path.isfile(filename):
|
||||
continue
|
||||
if filename.endswith(".log"):
|
||||
continue
|
||||
|
||||
basename = os.path.basename(filename)
|
||||
sys.stdout.write("Converting %s..." % (basename) + ' '*(20-len(basename)))
|
||||
try:
|
||||
config = json.load(open(filename, "r"))
|
||||
pickle.dump(config, open(filename, "wb"))
|
||||
print "\033[032mdone\033[0m"
|
||||
except:
|
||||
try:
|
||||
pickle.load(open(filename, "rb"))
|
||||
print "\033[032malready converted\033[0m"
|
||||
except:
|
||||
print "\033[031mfailed\033[1;m"
|
27
setup.py
27
setup.py
@@ -422,10 +422,26 @@ _data_files = [
|
||||
'docs/man/deluge-console.1'])
|
||||
]
|
||||
|
||||
entry_points = {
|
||||
"console_scripts": [
|
||||
"deluge-console = deluge.ui.console:start",
|
||||
"deluge-web = deluge.ui.web:start",
|
||||
"deluged = deluge.main:start_daemon"
|
||||
],
|
||||
"gui_scripts": [
|
||||
"deluge = deluge.main:start_ui",
|
||||
"deluge-gtk = deluge.ui.gtkui:start"
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
if windows_check():
|
||||
entry_points["console_scripts"].append("deluge-debug = deluge.main:start_ui")
|
||||
|
||||
# Main setup
|
||||
setup(
|
||||
name = "deluge",
|
||||
version = "1.3.0",
|
||||
version = "1.3.1",
|
||||
fullname = "Deluge Bittorrent Client",
|
||||
description = "Bittorrent Client",
|
||||
author = "Andrew Resch, Damien Churchill",
|
||||
@@ -469,12 +485,5 @@ setup(
|
||||
"ui/web/themes/images/*/*/*.png"
|
||||
]},
|
||||
packages = find_packages(exclude=["plugins", "docs", "tests"]),
|
||||
entry_points = """
|
||||
[console_scripts]
|
||||
deluge = deluge.main:start_ui
|
||||
deluge-console = deluge.ui.console:start
|
||||
deluge-gtk = deluge.ui.gtkui:start
|
||||
deluge-web = deluge.ui.web:start
|
||||
deluged = deluge.main:start_daemon
|
||||
""",
|
||||
entry_points = entry_points
|
||||
)
|
||||
|
@@ -1,3 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from twisted.trial import unittest
|
||||
from twisted.python.failure import Failure
|
||||
|
||||
@@ -6,7 +8,7 @@ import os
|
||||
|
||||
from deluge.config import Config
|
||||
|
||||
DEFAULTS = {"string": "foobar", "int": 1, "float": 0.435, "bool": True}
|
||||
DEFAULTS = {"string": "foobar", "int": 1, "float": 0.435, "bool": True, "unicode": u"foobar"}
|
||||
|
||||
class ConfigTestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
@@ -27,6 +29,9 @@ class ConfigTestCase(unittest.TestCase):
|
||||
config["foo"] = 2
|
||||
self.assertEquals(config.get_item("foo"), 2)
|
||||
|
||||
config["unicode"] = u"ВИДЕОФИЛЬМЫ"
|
||||
self.assertEquals(config["unicode"], u"ВИДЕОФИЛЬМЫ")
|
||||
|
||||
config._save_timer.cancel()
|
||||
|
||||
def test_load(self):
|
||||
|
@@ -1,13 +1,13 @@
|
||||
build_version = "1.3.0"
|
||||
build_version = "1.3.1"
|
||||
python_path = "C:\\Python26\\"
|
||||
|
||||
import os, glob
|
||||
import shutil
|
||||
shutil.copy(python_path + "Scripts\deluge-script.py", python_path + "Scripts\deluge.py")
|
||||
shutil.copy(python_path + "Scripts\deluge-script.py", python_path + "Scripts\deluge-debug.py")
|
||||
shutil.copy(python_path + "Scripts\deluge-script.pyw", python_path + "Scripts\deluge.py")
|
||||
shutil.copy(python_path + "Scripts\deluge-script.pyw", python_path + "Scripts\deluge-debug.py")
|
||||
shutil.copy(python_path + "Scripts\deluged-script.py", python_path + "Scripts\deluged.py")
|
||||
shutil.copy(python_path + "Scripts\deluge-web-script.py", python_path + "Scripts\deluge-web.py")
|
||||
shutil.copy(python_path + "Scripts\deluge-gtk-script.py", python_path + "Scripts\deluge-gtk.py")
|
||||
shutil.copy(python_path + "Scripts\deluge-gtk-script.pyw", python_path + "Scripts\deluge-gtk.py")
|
||||
shutil.copy(python_path + "Scripts\deluge-console-script.py", python_path + "Scripts\deluge-console.py")
|
||||
|
||||
includes=("libtorrent", "gzip", "zipfile", "re", "socket", "struct", "cairo", "pangocairo", "atk", "pango", "wsgiref.handlers", "twisted.internet.utils", "gio", "gtk.glade")
|
||||
@@ -28,12 +28,14 @@ f() # starts the freezing process
|
||||
|
||||
# add icons to the exe files
|
||||
import icon
|
||||
icon.CopyIcons(dst+"deluge.exe", "deluge.ico")
|
||||
icon.CopyIcons(dst+"deluge-debug.exe", "deluge.ico")
|
||||
icon.CopyIcons(dst+"deluged.exe", "deluge.ico")
|
||||
icon.CopyIcons(dst+"deluge-web.exe", "deluge.ico")
|
||||
icon.CopyIcons(dst+"deluge-gtk.exe", "deluge.ico")
|
||||
icon.CopyIcons(dst+"deluge-console.exe", "deluge.ico")
|
||||
|
||||
icon_path = os.path.join(os.path.dirname(__file__), "deluge.ico")
|
||||
icon.CopyIcons(dst+"deluge.exe", icon_path)
|
||||
icon.CopyIcons(dst+"deluge-debug.exe", icon_path)
|
||||
icon.CopyIcons(dst+"deluged.exe", icon_path)
|
||||
icon.CopyIcons(dst+"deluge-web.exe", icon_path)
|
||||
icon.CopyIcons(dst+"deluge-gtk.exe", icon_path)
|
||||
icon.CopyIcons(dst+"deluge-console.exe", icon_path)
|
||||
|
||||
# exclude files which are already included in GTK or Windows
|
||||
excludeFiles = ("MSIMG32.dll", "MSVCR90.dll", "MSVCP90.dll", "POWRPROF.dll", "freetype*.dll", "iconv.dll", "intl.dll", "libatk*.dll", "libcairo*.dll", "libexpat*.dll", "libfontconfig*.dll", "libfreetype*.dll", "libgio*.dll", "libpng*.dll", "libtiff*.dll", "zlib1.dll")
|
||||
|
@@ -37,7 +37,7 @@ SetCompressor lzma
|
||||
|
||||
# Deluge program information
|
||||
!define PROGRAM_NAME "Deluge"
|
||||
!define PROGRAM_VERSION "1.3.0"
|
||||
!define PROGRAM_VERSION "1.3.1"
|
||||
!define PROGRAM_WEB_SITE "http://deluge-torrent.org"
|
||||
|
||||
# Python files generated with bbfreeze (without DLLs from GTK+ runtime)
|
||||
|
Reference in New Issue
Block a user