Compare commits

..

28 Commits

Author SHA1 Message Date
Andrew Resch
b0ceae8d28 Fix copying scripts 2010-10-31 10:50:51 -07:00
Andrew Resch
dc0bf3bc88 Update versions and changelog 2010-10-31 10:15:02 -07:00
Damien Churchill
3b9d7ff9c3 remove the convert conf script that won't actually work anymore 2010-10-31 14:35:12 +00:00
Damien Churchill
a165d5d746 fix a silly bug 2010-10-31 10:13:22 +00:00
Damien Churchill
cc02ebea6a Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2010-10-31 09:18:36 +00:00
Damien Churchill
41ffee5d8a change entry_points to a dictionary and split it up into console and gui scripts 2010-10-31 09:16:18 +00:00
Damien Churchill
14a89b3f8a don't depend on being executed from a specific directory 2010-10-29 10:09:15 +01:00
John Garland
6f0c2af58a Fix up Changelog (entry was in wrong section) 2010-10-25 09:59:06 +11:00
Damien Churchill
84cccabf19 update changelog 2010-10-24 23:44:40 +01:00
Damien Churchill
7fb483adde fix a bug in the MultiOptionsManager that didn't fire the right arguments in the initial event fire 2010-10-24 23:42:29 +01:00
Damien Churchill
28ce7a70a0 apply patch from #1377 2010-10-24 13:30:39 +01:00
Damien Churchill
14565977fa include a file that fixes the SpinnerField onBlur method (no idea why it is set to emptyFn) 2010-10-23 22:22:00 +01:00
Damien Churchill
e4420ef354 fix the path to the loading gif (not that its actually used) 2010-10-23 21:24:05 +01:00
John Garland
02ad0b93ab Fix hang on quit 2010-10-23 01:14:48 +11:00
Andrew Resch
6d2a001635 Fix #1373 use of cyrllic paths 2010-10-16 12:56:29 -07:00
Andrew Resch
2a3eb0578c Fix #1349 force a theme style with expander-size = 15 to show entries in the sidebar properly. 2010-10-15 19:31:36 -07:00
Andrew Resch
60fac28217 Keep a torrent paused after a forced recheck if it was paused to start. 2010-10-10 12:34:13 -07:00
Damien Churchill
59e01e7ecf add a check to ensure that the events loop doesn't continue indefinitely 2010-10-10 19:51:50 +01:00
John Garland
4c52ee4229 Update ChangeLog for previous commit 2010-10-07 22:46:49 +11:00
Damien Churchill
8428524793 wrap client.disconnect() call with a check to see if its classic mode 2010-10-07 00:14:55 +01:00
John Garland
21c8d02d9a Update ChangeLog for previous commit 2010-10-03 19:52:33 +11:00
John Garland
0c687c7684 Make sure config value strings are utf8 encoded (fixes #1369) 2010-10-03 19:24:29 +11:00
John Garland
78f9efefd9 Move decode_string/utf8_encoded to common 2010-10-03 19:24:27 +11:00
John Garland
6b228ce31f Fix sidebar not updating (#1365) 2010-10-03 00:01:29 +10:00
John Garland
40ce4ec731 Use better attribute / method names in blocklist 2010-09-26 11:39:47 +10:00
John Garland
c029c312e4 Fix attribute error in blocklist plugin 2010-09-26 11:37:29 +10:00
John Garland
16c38cd027 Set locale to the user's default settings in the gtkui 2010-09-20 02:44:18 +10:00
John Garland
e23a6b852a Organise latest changes into appropriate sections 2010-09-19 20:59:27 +10:00
24 changed files with 217 additions and 147 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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)

View File

@@ -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:

View File

@@ -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):

View File

@@ -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()

View File

@@ -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

View File

@@ -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]

View File

@@ -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)

View File

@@ -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"):

View File

@@ -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):

View File

@@ -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")

View File

@@ -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",

View File

@@ -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>

View File

@@ -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);
}
}
},

View File

@@ -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();
},

View 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
});

View File

@@ -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):
"""

View File

@@ -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"

View File

@@ -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
)

View File

@@ -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):

View File

@@ -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")

View File

@@ -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)