diff options
author | Score_Under | 2015-08-27 02:59:12 +0100 |
---|---|---|
committer | Score_Under | 2015-08-27 02:59:12 +0100 |
commit | ba00f9b0a13510225b800676ad4e0bc9e6bda4ab (patch) | |
tree | 7d6d80ce29aa25a3f0d082d259b094d01c242df4 | |
parent | eb132914ab3ea3d1c9a851b3576bf7264933609b (diff) | |
download | aur-ba00f9b0a13510225b800676ad4e0bc9e6bda4ab.tar.gz |
Update for v171. Remove cython support as it now breaks horribly
-rw-r--r-- | .SRCINFO | 10 | ||||
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | PKGBUILD | 32 | ||||
-rw-r--r-- | cython-workarounds.patch | 1167 | ||||
-rw-r--r-- | paths-in-opt.patch | 14 | ||||
-rw-r--r-- | running-the-server.patch | 4 |
6 files changed, 19 insertions, 1210 deletions
@@ -1,6 +1,6 @@ pkgbase = hydrus pkgdesc = Danbooru-like image tagging and searching system for the desktop - pkgver = 170 + pkgver = 171 pkgrel = 1 url = http://hydrusnetwork.github.io/hydrus/ install = hydrus.install @@ -27,17 +27,15 @@ pkgbase = hydrus optdepends = ffmpeg: show duration and other information on video thumbnails optdepends = miniupnpc: automatic port forwarding options = !strip - source = hydrus::git+https://github.com/hydrusnetwork/hydrus.git#commit=cc3f59732186848c80799b010c1ef412a866a50a + source = hydrus::git+https://github.com/hydrusnetwork/hydrus.git#commit=a61df3303cf69a613fbfe43bf4ba78d172a1c676 source = paths-in-opt.patch source = running-the-server.patch - source = cython-workarounds.patch source = hydrus-client source = hydrus-server source = hydrus.desktop sha256sums = SKIP - sha256sums = 83a77de17be848f58b549d43ca6ef073a0209090c64a210743c9fbed672e1852 - sha256sums = b039650432e3031a4efcad2d2e999d51d5dec94fbe1c30b7f522015fead0e531 - sha256sums = b7174fb3509d89b1f15ccdcdc9c419be79161ff8bff0642bbf1d6effc8fb7730 + sha256sums = 9575e8a46d04ad8a2f6d53612bf4c4e2905fe1f2d80a10aaeff5ef4cfbb249ce + sha256sums = 1c2c154d044f56fb50a1f24b940f6127ef78640a723422af5e5853838deee03b sha256sums = b2bf66b1068969e9598742d5c128cb04fd609512b0cff0ad5e25ecb6cdd35678 sha256sums = ac7254e3cdb359ebae302655b72b9f74b85d9e817c326fa28173791b3fb4f114 sha256sums = 9ba3942ac1a37f6b39c98ae6592573402bf08d8376f64554d0696c0fed6fd0e2 diff --git a/.gitignore b/.gitignore index 8ddac8bcb984..ba7e5d46ea8f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ pkg src # Built packages -*.pkg.tar.xz +*-*.pkg.tar* @@ -4,16 +4,15 @@ build_pyc=false build_pyo=true -build_cython=false remove_py=false remove_help=false ##### -$build_cython || options=(!strip) # Don't strip libs because there aren't any; this wastes time +options=(!strip) # Don't strip libs because there aren't any; this wastes time DOC_DIRS=(opt/hydrus/help) pkgname=hydrus -pkgver=170 +pkgver=171 pkgrel=1 pkgdesc="Danbooru-like image tagging and searching system for the desktop" arch=(any) @@ -24,20 +23,17 @@ depends=(python2 wxpython opencv python2-beautifulsoup4 python2-yaml python2-twisted python2-pillow python2-potr python2-flvlib python2-socks python2-psutil python2-send2trash) makedepends=(git) -$build_cython && makedepends+=(cython2 parallel) optdepends=('ffmpeg: show duration and other information on video thumbnails' 'miniupnpc: automatic port forwarding') -source=("${pkgname}::git+https://github.com/hydrusnetwork/${pkgname}.git#commit=cc3f59732186848c80799b010c1ef412a866a50a" +source=("${pkgname}::git+https://github.com/hydrusnetwork/${pkgname}.git#commit=a61df3303cf69a613fbfe43bf4ba78d172a1c676" paths-in-opt.patch running-the-server.patch - cython-workarounds.patch hydrus-client hydrus-server hydrus.desktop) sha256sums=('SKIP' - '83a77de17be848f58b549d43ca6ef073a0209090c64a210743c9fbed672e1852' - 'b039650432e3031a4efcad2d2e999d51d5dec94fbe1c30b7f522015fead0e531' - 'b7174fb3509d89b1f15ccdcdc9c419be79161ff8bff0642bbf1d6effc8fb7730' + '9575e8a46d04ad8a2f6d53612bf4c4e2905fe1f2d80a10aaeff5ef4cfbb249ce' + '1c2c154d044f56fb50a1f24b940f6127ef78640a723422af5e5853838deee03b' 'b2bf66b1068969e9598742d5c128cb04fd609512b0cff0ad5e25ecb6cdd35678' 'ac7254e3cdb359ebae302655b72b9f74b85d9e817c326fa28173791b3fb4f114' '9ba3942ac1a37f6b39c98ae6592573402bf08d8376f64554d0696c0fed6fd0e2') @@ -48,9 +44,6 @@ prepare() { patch -Np1 -i ../paths-in-opt.patch patch -Np1 -i ../running-the-server.patch - # Cython patches if applicable - $build_cython && patch -Np1 -i ../cython-workarounds.patch - # Fix permissions chmod a-x include/*.py @@ -68,21 +61,6 @@ build() { # Compile .py files $build_pyc && python2 -m compileall . $build_pyo && python2 -OO -m compileall . - - if $build_cython; then - cd include - local -a files_to_compile - files_to_compile=() - for file in *.py; do - # ClientGUICommon.py and ClientController.py have problems when built under Cython - [ "$file" == ClientGUICommon.py -o "$file" == ClientController.py ] && continue - files_to_compile+=("${file%.py}") - done - - cython2 -2 --fast-fail -Werror "${files_to_compile[@]/%/.py}" - parallel --bar '${CCLD:-gcc} -Os -s -fpic -shared -o {}.so {}.c $(python2-config --libs --includes) $LDFLAGS' ::: "${files_to_compile[@]}" - rm -f -- "${files_to_compile/%/.c}" - fi } package() { diff --git a/cython-workarounds.patch b/cython-workarounds.patch deleted file mode 100644 index 5afa147b7e32..000000000000 --- a/cython-workarounds.patch +++ /dev/null @@ -1,1167 +0,0 @@ -diff --git a/include/ClientDB.py b/include/ClientDB.py -index bb9593f..a499ef0 100755 ---- a/include/ClientDB.py -+++ b/include/ClientDB.py -@@ -2597,7 +2597,7 @@ class DB( HydrusDB.HydrusDB ): - counts_iterable = self._c.execute( nonzero_counts_query ) - - -- query_hash_ids = { id for ( id, count ) in counts_iterable if False not in ( pred( count ) for pred in tag_predicates ) } -+ query_hash_ids = { id for ( id, count ) in counts_iterable if False not in (lambda count:( pred( count ) for pred in tag_predicates ))(count) } - - - # -diff --git a/include/ClientGUICanvas.py b/include/ClientGUICanvas.py -index 400b4ad..9e2a3cf 100755 ---- a/include/ClientGUICanvas.py -+++ b/include/ClientGUICanvas.py -@@ -47,7 +47,8 @@ ZOOMOUTS = [ 20.0, 10.0, 5.0, 3.0, 2.0, 1.5, 1.2, 1.1, 1.0, 0.9, 0.8, 0.7, 0.5, - - OPEN_EXTERNALLY_BUTTON_SIZE = ( 200, 45 ) - --def CalculateCanvasZoom( media, ( canvas_width, canvas_height ) ): -+def CalculateCanvasZoom( media, canvas_dims ): -+ ( canvas_width, canvas_height ) = canvas_dims - - ( media_width, media_height ) = media.GetResolution() - -diff --git a/include/ClientGUICommon.py b/include/ClientGUICommon.py -index b8294b6..77878eb 100755 ---- a/include/ClientGUICommon.py -+++ b/include/ClientGUICommon.py -@@ -1521,7 +1521,8 @@ class Frame( wx.Frame ): - self.SetIcon( wx.Icon( HC.STATIC_DIR + os.path.sep + 'hydrus.ico', wx.BITMAP_TYPE_ICO ) ) - - -- def SetInitialSize( self, ( width, height ) ): -+ def SetInitialSize( self, dims ): -+ ( width, height ) = dims - - wx.Frame.SetInitialSize( self, ( width, height ) ) - -@@ -5217,4 +5218,4 @@ class ShowKeys( Frame ): - - - -- -\ No newline at end of file -+ -diff --git a/include/ClientGUIDialogs.py b/include/ClientGUIDialogs.py -index 3c3841a..188a8fc 100755 ---- a/include/ClientGUIDialogs.py -+++ b/include/ClientGUIDialogs.py -@@ -242,7 +242,8 @@ class Dialog( wx.Dialog ): - - def EventDialogButton( self, event ): self.EndModal( event.GetId() ) - -- def SetInitialSize( self, ( width, height ) ): -+ def SetInitialSize( self, dims ): -+ ( width, height ) = dims - - wx.Dialog.SetInitialSize( self, ( width, height ) ) - -diff --git a/include/ClientGUIManagement.py b/include/ClientGUIManagement.py -index 6ecbdef..9fde07a 100755 ---- a/include/ClientGUIManagement.py -+++ b/include/ClientGUIManagement.py -@@ -66,26 +66,6 @@ def CreateManagementController( management_type, file_service_key = None ): - - return management_controller - --def CreateManagementControllerDumper( imageboard, media_results ): -- -- # this stuff doesn't work yet because media_results and imageboard are still yaml things -- -- management_controller = CreateManagementController( MANAGEMENT_TYPE_DUMPER ) -- -- management_controller.SetVariable( 'imageboard', imageboard ) -- management_controller.SetVariable( 'media_results', media_results ) -- -- self._current_hash = None -- -- self._dumping = False -- self._actually_dumping = False -- self._num_dumped = 0 -- self._next_dump_index = 0 -- self._next_dump_time = 0 -- -- self._file_post_name = 'upfile' -- -- return management_controller - - def CreateManagementControllerImportGallery( site_type, gallery_type ): - -@@ -706,734 +686,6 @@ class ManagementPanel( wx.lib.scrolledpanel.ScrolledPanel ): - - def TestAbleToClose( self ): pass - --class ManagementPanelDumper( ManagementPanel ): -- -- def __init__( self, parent, page, management_controller ): -- -- ManagementPanel.__init__( self, parent, page, management_controller ) -- -- ( self._4chan_token, pin, timeout ) = wx.GetApp().Read( '4chan_pass' ) -- -- self._have_4chan_pass = timeout > HydrusData.GetNow() -- -- self._timer = wx.Timer( self, ID_TIMER_DUMP ) -- self.Bind( wx.EVT_TIMER, self.TIMEREvent, id = ID_TIMER_DUMP ) -- -- ( self._post_url, self._flood_time, self._form_fields, self._restrictions ) = self._imageboard.GetBoardInfo() -- -- # progress -- -- self._import_queue_panel = ClientGUICommon.StaticBox( self, 'import queue' ) -- -- self._progress_info = wx.StaticText( self._import_queue_panel ) -- -- self._progress_gauge = ClientGUICommon.Gauge( self._import_queue_panel ) -- self._progress_gauge.SetRange( len( media_results ) ) -- -- self._start_button = wx.Button( self._import_queue_panel, label = 'start' ) -- self._start_button.Bind( wx.EVT_BUTTON, self.EventStartButton ) -- -- self._import_queue_panel.AddF( self._progress_info, CC.FLAGS_EXPAND_PERPENDICULAR ) -- self._import_queue_panel.AddF( self._progress_gauge, CC.FLAGS_EXPAND_PERPENDICULAR ) -- self._import_queue_panel.AddF( self._start_button, CC.FLAGS_EXPAND_PERPENDICULAR ) -- -- # thread options -- -- self._thread_panel = ClientGUICommon.StaticBox( self, 'thread options' ) -- -- self._thread_fields = {} -- -- gridbox = wx.FlexGridSizer( 0, 2 ) -- -- gridbox.AddGrowableCol( 1, 1 ) -- -- for ( name, field_type, default, editable ) in self._form_fields: -- -- if field_type in ( CC.FIELD_TEXT, CC.FIELD_THREAD_ID ): field = wx.TextCtrl( self._thread_panel, value = default ) -- elif field_type == CC.FIELD_PASSWORD: field = wx.TextCtrl( self._thread_panel, value = default, style = wx.TE_PASSWORD ) -- else: continue -- -- self._thread_fields[ name ] = ( field_type, field ) -- -- if editable: -- -- gridbox.AddF( wx.StaticText( self._thread_panel, label = name + ':' ), CC.FLAGS_MIXED ) -- gridbox.AddF( field, CC.FLAGS_EXPAND_BOTH_WAYS ) -- -- else: field.Hide() -- -- -- self._thread_panel.AddF( gridbox, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR ) -- -- # post options -- -- self._post_panel = ClientGUICommon.StaticBox( self, 'post options' ) -- -- self._post_fields = {} -- -- postbox = wx.BoxSizer( wx.VERTICAL ) -- -- self._post_info = wx.StaticText( self._post_panel, label = 'no file selected', style = wx.ALIGN_CENTER | wx.ST_NO_AUTORESIZE ) -- -- for ( name, field_type, default, editable ) in self._form_fields: -- -- if field_type == CC.FIELD_VERIFICATION_RECAPTCHA: -- -- if self._have_4chan_pass: continue -- -- field = CaptchaControl( self._post_panel, field_type, default ) -- field.Bind( CAPTCHA_FETCH_EVENT, self.EventCaptchaRefresh ) -- -- elif field_type == CC.FIELD_COMMENT: field = Comment( self._post_panel ) -- else: continue -- -- self._post_fields[ name ] = ( field_type, field, default ) -- -- postbox.AddF( field, CC.FLAGS_EXPAND_PERPENDICULAR ) -- -- -- gridbox = wx.FlexGridSizer( 0, 2 ) -- -- gridbox.AddGrowableCol( 1, 1 ) -- -- for ( name, field_type, default, editable ) in self._form_fields: -- -- if field_type == CC.FIELD_CHECKBOX: -- -- field = wx.CheckBox( self._post_panel ) -- -- field.SetValue( default == 'True' ) -- -- else: continue -- -- self._post_fields[ name ] = ( field_type, field, default ) -- -- gridbox.AddF( wx.StaticText( self._post_panel, label = name + ':' ), CC.FLAGS_MIXED ) -- gridbox.AddF( field, CC.FLAGS_EXPAND_BOTH_WAYS ) -- -- -- for ( name, field_type, default, editable ) in self._form_fields: -- -- if field_type == CC.FIELD_FILE: self._file_post_name = name -- -- -- self._post_panel.AddF( self._post_info, CC.FLAGS_EXPAND_PERPENDICULAR ) -- self._post_panel.AddF( postbox, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR ) -- self._post_panel.AddF( gridbox, CC.FLAGS_EXPAND_SIZER_PERPENDICULAR ) -- -- # misc -- -- self._import_tag_options = ClientGUICollapsible.CollapsibleOptionsTags( self, namespaces = [ 'creator', 'series', 'title', 'volume', 'chapter', 'page', 'character', 'person', 'all others' ] ) -- -- # arrange stuff -- -- vbox = wx.BoxSizer( wx.VERTICAL ) -- -- self._MakeSort( vbox ) -- -- vbox.AddF( self._import_queue_panel, CC.FLAGS_EXPAND_PERPENDICULAR ) -- vbox.AddF( self._thread_panel, CC.FLAGS_EXPAND_PERPENDICULAR ) -- vbox.AddF( self._post_panel, CC.FLAGS_EXPAND_PERPENDICULAR ) -- vbox.AddF( self._import_tag_options, CC.FLAGS_EXPAND_PERPENDICULAR ) -- -- self._MakeCurrentSelectionTagsBox( vbox ) -- -- self.SetSizer( vbox ) -- -- HydrusGlobals.pubsub.sub( self, 'FocusChanged', 'focus_changed' ) -- HydrusGlobals.pubsub.sub( self, 'SortedMediaPulse', 'sorted_media_pulse' ) -- -- self._sorted_media_hashes = [ media_result.GetHash() for media_result in media_results ] -- -- self._hashes_to_media = { media_result.GetHash() : ClientMedia.MediaSingleton( media_result ) for media_result in media_results } -- -- self._hashes_to_dump_info = {} -- -- for ( hash, media ) in self._hashes_to_media.items(): -- -- dump_status_enum = CC.DUMPER_NOT_DUMPED -- -- dump_status_string = 'not yet dumped' -- -- post_field_info = [] -- -- for ( name, ( field_type, field, default ) ) in self._post_fields.items(): -- -- if field_type == CC.FIELD_COMMENT: -- -- post_field_info.append( ( name, field_type, ( self._GetInitialComment( media ), '' ) ) ) -- -- elif field_type == CC.FIELD_CHECKBOX: post_field_info.append( ( name, field_type, default == 'True' ) ) -- elif field_type == CC.FIELD_VERIFICATION_RECAPTCHA: post_field_info.append( ( name, field_type, None ) ) -- -- -- self._hashes_to_dump_info[ hash ] = ( dump_status_enum, dump_status_string, post_field_info ) -- -- -- self.Bind( wx.EVT_MENU, self.EventMenu ) -- -- self._timer.Start( 1000, wx.TIMER_CONTINUOUS ) -- -- -- def _THREADDoDump( self, hash, post_field_info, headers, body ): -- -- try: -- -- response = wx.GetApp().DoHTTP( HC.POST, self._post_url, request_headers = headers, body = body ) -- -- ( status, phrase ) = ClientDownloading.Parse4chanPostScreen( response ) -- -- except Exception as e: -- -- ( status, phrase ) = ( 'big error', HydrusData.ToString( e ) ) -- -- -- wx.CallAfter( self.CALLBACKDoneDump, hash, post_field_info, status, phrase ) -- -- -- def _FreezeCurrentMediaPostInfo( self ): -- -- ( dump_status_enum, dump_status_string, post_field_info ) = self._hashes_to_dump_info[ self._current_hash ] -- -- post_field_info = [] -- -- for ( name, ( field_type, field, default ) ) in self._post_fields.items(): -- -- if field_type == CC.FIELD_COMMENT: post_field_info.append( ( name, field_type, field.GetValues() ) ) -- elif field_type == CC.FIELD_CHECKBOX: post_field_info.append( ( name, field_type, field.GetValue() ) ) -- elif field_type == CC.FIELD_VERIFICATION_RECAPTCHA: post_field_info.append( ( name, field_type, field.GetValues() ) ) -- -- -- self._hashes_to_dump_info[ self._current_hash ] = ( dump_status_enum, dump_status_string, post_field_info ) -- -- -- def _GetInitialComment( self, media ): -- -- hash = media.GetHash() -- -- try: index = self._sorted_media_hashes.index( hash ) -- except: return 'media removed' -- -- num_files = len( self._sorted_media_hashes ) -- -- if index == 0: -- -- total_size = sum( [ m.GetSize() for m in self._hashes_to_media.values() ] ) -- -- initial = 'Hydrus Network Client is starting a dump of ' + HydrusData.ToString( num_files ) + ' files, totalling ' + HydrusData.ConvertIntToBytes( total_size ) + ':' + os.linesep * 2 -- -- else: initial = '' -- -- initial += HydrusData.ConvertValueRangeToPrettyString( index + 1, num_files ) -- -- advanced_tag_options = self._import_tag_options.GetInfo() -- -- for ( service_key, namespaces ) in advanced_tag_options.items(): -- -- tags_manager = media.GetTagsManager() -- -- try: service = wx.GetApp().GetServicesManager().GetService( service_key ) -- except HydrusExceptions.NotFoundException: continue -- -- service_key = service.GetServiceKey() -- -- current = tags_manager.GetCurrent( service_key ) -- pending = tags_manager.GetPending( service_key ) -- -- tags = current.union( pending ) -- -- tags_to_include = [] -- -- for namespace in namespaces: -- -- if namespace == 'all others': tags_to_include.extend( [ tag for tag in tags if not True in ( tag.startswith( n ) for n in namespaces if n != 'all others' ) ] ) -- else: tags_to_include.extend( [ tag for tag in tags if tag.startswith( namespace + ':' ) ] ) -- -- -- initial += os.linesep * 2 + ', '.join( tags_to_include ) -- -- -- return initial -- -- -- def _ShowCurrentMedia( self ): -- -- if self._current_hash is None: -- -- self._post_info.SetLabel( 'no file selected' ) -- -- for ( name, ( field_type, field, default ) ) in self._post_fields.items(): -- -- if field_type == CC.FIELD_CHECKBOX: field.SetValue( False ) -- -- field.Disable() -- -- -- else: -- -- num_files = len( self._sorted_media_hashes ) -- -- ( dump_status_enum, dump_status_string, post_field_info ) = self._hashes_to_dump_info[ self._current_hash ] -- -- index = self._sorted_media_hashes.index( self._current_hash ) -- -- self._post_info.SetLabel( HydrusData.ConvertValueRangeToPrettyString( index + 1, num_files ) + ': ' + dump_status_string ) -- -- for ( name, field_type, value ) in post_field_info: -- -- ( field_type, field, default ) = self._post_fields[ name ] -- -- if field_type == CC.FIELD_COMMENT: -- -- ( initial, append ) = value -- -- field.EnableWithValues( initial, append ) -- -- elif field_type == CC.FIELD_CHECKBOX: -- -- field.SetValue( value ) -- field.Enable() -- -- elif field_type == CC.FIELD_VERIFICATION_RECAPTCHA: -- -- if value is None: field.Enable() -- else: -- -- ( challenge, bitmap, captcha_runs_out, entry, ready ) = value -- -- field.EnableWithValues( challenge, bitmap, captcha_runs_out, entry, ready ) -- -- -- -- -- if dump_status_enum in ( CC.DUMPER_DUMPED_OK, CC.DUMPER_UNRECOVERABLE_ERROR ): -- -- for ( name, ( field_type, field, default ) ) in self._post_fields.items(): -- -- if field_type == CC.FIELD_CHECKBOX: field.SetValue( False ) -- -- field.Disable() -- -- -- -- -- -- def _UpdatePendingInitialComments( self ): -- -- hashes_to_dump = self._sorted_media_hashes[ self._next_dump_index : ] -- -- for hash in hashes_to_dump: -- -- if hash == self._current_hash: self._FreezeCurrentMediaPostInfo() -- -- ( dump_status_enum, dump_status_string, post_field_info ) = self._hashes_to_dump_info[ hash ] -- -- new_post_field_info = [] -- -- for ( name, field_type, value ) in post_field_info: -- -- if field_type == CC.FIELD_COMMENT: -- -- ( initial, append ) = value -- -- media = self._hashes_to_media[ hash ] -- -- initial = self._GetInitialComment( media ) -- -- new_post_field_info.append( ( name, field_type, ( initial, append ) ) ) -- -- else: new_post_field_info.append( ( name, field_type, value ) ) -- -- -- self._hashes_to_dump_info[ hash ] = ( dump_status_enum, dump_status_string, new_post_field_info ) -- -- if hash == self._current_hash: self._ShowCurrentMedia() -- -- -- -- def CALLBACKDoneDump( self, hash, post_field_info, status, phrase ): -- -- self._actually_dumping = False -- -- if HC.options[ 'play_dumper_noises' ]: -- -- if status == 'success': HydrusAudioHandling.PlayNoise( 'success' ) -- else: HydrusAudioHandling.PlayNoise( 'error' ) -- -- -- if status == 'success': -- -- dump_status_enum = CC.DUMPER_DUMPED_OK -- dump_status_string = 'dumped ok' -- -- if hash == self._current_hash: HydrusGlobals.pubsub.pub( 'set_focus', self._page_key, None ) -- -- self._next_dump_time = HydrusData.GetNow() + self._flood_time -- -- self._num_dumped += 1 -- -- self._progress_gauge.SetValue( self._num_dumped ) -- -- self._next_dump_index += 1 -- -- elif status == 'captcha': -- -- dump_status_enum = CC.DUMPER_RECOVERABLE_ERROR -- dump_status_string = 'captcha was incorrect' -- -- self._next_dump_time = HydrusData.GetNow() + 10 -- -- new_post_field_info = [] -- -- for ( name, field_type, value ) in post_field_info: -- -- if field_type == CC.FIELD_VERIFICATION_RECAPTCHA: new_post_field_info.append( ( name, field_type, None ) ) -- else: new_post_field_info.append( ( name, field_type, value ) ) -- -- if hash == self._current_hash: -- -- ( field_type, field, default ) = self._post_fields[ name ] -- -- field.Enable() -- -- -- -- post_field_info = new_post_field_info -- -- elif status == 'too quick': -- -- dump_status_enum = CC.DUMPER_RECOVERABLE_ERROR -- dump_status_string = '' -- -- self._progress_info.SetLabel( 'Flood limit hit, retrying.' ) -- -- self._next_dump_time = HydrusData.GetNow() + self._flood_time -- -- elif status == 'big error': -- -- dump_status_enum = CC.DUMPER_UNRECOVERABLE_ERROR -- dump_status_string = '' -- -- HydrusData.ShowText( phrase ) -- -- self._progress_info.SetLabel( 'error: ' + phrase ) -- -- self._start_button.Disable() -- -- self._timer.Stop() -- -- elif 'Thread specified does not exist' in phrase: -- -- dump_status_enum = CC.DUMPER_UNRECOVERABLE_ERROR -- dump_status_string = '' -- -- self._progress_info.SetLabel( 'thread specified does not exist!' ) -- -- self._start_button.Disable() -- -- self._timer.Stop() -- -- else: -- -- dump_status_enum = CC.DUMPER_UNRECOVERABLE_ERROR -- dump_status_string = phrase -- -- if hash == self._current_hash: HydrusGlobals.pubsub.pub( 'set_focus', self._page_key, None ) -- -- self._next_dump_time = HydrusData.GetNow() + self._flood_time -- -- self._next_dump_index += 1 -- -- -- self._hashes_to_dump_info[ hash ] = ( dump_status_enum, dump_status_string, post_field_info ) -- -- HydrusGlobals.pubsub.pub( 'file_dumped', self._page_key, hash, dump_status_enum ) -- -- if self._next_dump_index == len( self._sorted_media_hashes ): -- -- self._progress_info.SetLabel( 'done - ' + HydrusData.ToString( self._num_dumped ) + ' dumped' ) -- -- self._start_button.Disable() -- -- self._timer.Stop() -- -- self._dumping = False -- -- -- -- def EventCaptchaRefresh( self, event ): -- -- try: -- -- index = self._sorted_media_hashes.index( self._current_hash ) -- -- if ( ( index + 1 ) - self._next_dump_index ) * ( self._flood_time + 10 ) > 5 * 60: event.Veto() -- -- except: event.Veto() -- -- -- def EventMenu( self, event ): -- -- action = ClientCaches.MENU_EVENT_ID_TO_ACTION_CACHE.GetAction( event.GetId() ) -- -- if action is not None: -- -- ( command, data ) = action -- -- if command == 'import_tag_options_changed': self._UpdatePendingInitialComments() -- else: event.Skip() -- -- -- -- def EventStartButton( self, event ): -- -- if self._start_button.GetLabel() in ( 'start', 'continue' ): -- -- for ( name, ( field_type, field ) ) in self._thread_fields.items(): -- -- if field_type == CC.FIELD_THREAD_ID: -- -- try: int( field.GetValue() ) -- except: -- -- # let's assume they put the url in -- -- value = field.GetValue() -- -- thread_id = value.split( '/' )[ -1 ] -- -- try: int( thread_id ) -- except: -- -- self._progress_info.SetLabel( 'set thread_id field first' ) -- -- return -- -- -- field.SetValue( thread_id ) -- -- -- -- -- for ( field_type, field ) in self._thread_fields.values(): field.Disable() -- -- self._dumping = True -- self._start_button.SetLabel( 'pause' ) -- -- if self._next_dump_time == 0: self._next_dump_time = HydrusData.GetNow() + 5 -- -- # disable thread fields here -- -- else: -- -- for ( field_type, field ) in self._thread_fields.values(): field.Enable() -- -- self._dumping = False -- -- if self._num_dumped == 0: self._start_button.SetLabel( 'start' ) -- else: self._start_button.SetLabel( 'continue' ) -- -- -- -- def FocusChanged( self, page_key, media ): -- -- if page_key == self._page_key: -- -- if media is None: hash = None -- else: hash = media.GetHash() -- -- if hash != self._current_hash: -- -- old_hash = self._current_hash -- -- if old_hash is not None: self._FreezeCurrentMediaPostInfo() -- -- self._current_hash = hash -- -- self._ShowCurrentMedia() -- -- -- -- -- def SortedMediaPulse( self, page_key, sorted_media ): -- -- if page_key == self._page_key: -- -- self._sorted_media_hashes = [ media.GetHash() for media in sorted_media ] -- -- self._hashes_to_media = { hash : self._hashes_to_media[ hash ] for hash in self._sorted_media_hashes } -- -- new_hashes_to_dump_info = {} -- -- for ( hash, ( dump_status_enum, dump_status_string, post_field_info ) ) in self._hashes_to_dump_info.items(): -- -- if hash not in self._sorted_media_hashes: continue -- -- new_post_field_info = [] -- -- for ( name, field_type, value ) in post_field_info: -- -- if field_type == CC.FIELD_COMMENT: -- -- ( initial, append ) = value -- -- media = self._hashes_to_media[ hash ] -- -- initial = self._GetInitialComment( media ) -- -- value = ( initial, append ) -- -- -- new_post_field_info.append( ( name, field_type, value ) ) -- -- -- new_hashes_to_dump_info[ hash ] = ( dump_status_enum, dump_status_string, new_post_field_info ) -- -- -- self._hashes_to_dump_info = new_hashes_to_dump_info -- -- self._ShowCurrentMedia() -- -- if self._current_hash is None and len( self._sorted_media_hashes ) > 0: -- -- hash_to_select = self._sorted_media_hashes[0] -- -- media_to_select = self._hashes_to_media[ hash_to_select ] -- -- HydrusGlobals.pubsub.pub( 'set_focus', self._page_key, media_to_select ) -- -- -- -- -- def TestAbleToClose( self ): -- -- if self._dumping: -- -- with ClientGUIDialogs.DialogYesNo( self, 'This page is still dumping. Are you sure you want to close it?' ) as dlg: -- -- if dlg.ShowModal() == wx.ID_NO: raise Exception() -- -- -- -- -- def TIMEREvent( self, event ): -- -- if self._controller.IsPaused(): return -- -- if self._actually_dumping: return -- -- if self._dumping: -- -- time_left = self._next_dump_time - HydrusData.GetNow() -- -- if time_left < 1: -- -- try: -- -- hash = self._sorted_media_hashes[ self._next_dump_index ] -- -- wait = False -- -- if hash == self._current_hash: self._FreezeCurrentMediaPostInfo() -- -- ( dump_status_enum, dump_status_string, post_field_info ) = self._hashes_to_dump_info[ hash ] -- -- for ( name, field_type, value ) in post_field_info: -- -- if field_type == CC.FIELD_VERIFICATION_RECAPTCHA: -- -- if value is None: -- -- wait = True -- -- break -- -- else: -- -- ( challenge, bitmap, captcha_runs_out, entry, ready ) = value -- -- if HydrusData.TimeHasPassed( captcha_runs_out ) or not ready: -- -- wait = True -- -- break -- -- -- -- -- -- if wait: self._progress_info.SetLabel( 'waiting for captcha' ) -- else: -- -- self._progress_info.SetLabel( 'dumping' ) # 100% cpu time here - may or may not be desirable -- -- post_fields = [] -- -- for ( name, ( field_type, field ) ) in self._thread_fields.items(): -- -- post_fields.append( ( name, field_type, field.GetValue() ) ) -- -- -- for ( name, field_type, value ) in post_field_info: -- -- if field_type == CC.FIELD_VERIFICATION_RECAPTCHA: -- -- ( challenge, bitmap, captcha_runs_out, entry, ready ) = value -- -- post_fields.append( ( 'recaptcha_challenge_field', field_type, challenge ) ) -- post_fields.append( ( 'recaptcha_response_field', field_type, entry ) ) -- -- elif field_type == CC.FIELD_COMMENT: -- -- ( initial, append ) = value -- -- comment = initial -- -- if len( append ) > 0: comment += os.linesep * 2 + append -- -- post_fields.append( ( name, field_type, comment ) ) -- -- else: post_fields.append( ( name, field_type, value ) ) -- -- -- media = self._hashes_to_media[ hash ] -- -- mime = media.GetMime() -- -- path = ClientFiles.GetFilePath( hash, mime ) -- -- with open( path, 'rb' ) as f: file = f.read() -- -- post_fields.append( ( self._file_post_name, CC.FIELD_FILE, ( hash, mime, file ) ) ) -- -- ( ct, body ) = GenerateDumpMultipartFormDataCTAndBody( post_fields ) -- -- headers = {} -- headers[ 'Content-Type' ] = ct -- if self._have_4chan_pass: headers[ 'Cookie' ] = 'pass_enabled=1; pass_id=' + self._4chan_token -- -- self._actually_dumping = True -- -- HydrusThreading.CallToThread( self._THREADDoDump, hash, post_field_info, headers, body ) -- -- -- except Exception as e: -- -- ( status, phrase ) = ( 'big error', HydrusData.ToString( e ) ) -- -- wx.CallAfter( self.CALLBACKDoneDump, hash, post_field_info, status, phrase ) -- -- -- else: self._progress_info.SetLabel( 'dumping next file in ' + HydrusData.ToString( time_left ) + ' seconds' ) -- -- else: -- -- if self._num_dumped == 0: self._progress_info.SetLabel( 'will dump to ' + self._imageboard.GetName() ) -- else: self._progress_info.SetLabel( 'paused after ' + HydrusData.ToString( self._num_dumped ) + ' files dumped' ) -- -- -- --management_panel_types_to_classes[ MANAGEMENT_TYPE_DUMPER ] = ManagementPanelDumper - - class ManagementPanelImport( ManagementPanel ): - -diff --git a/include/ClientMedia.py b/include/ClientMedia.py -index a40543b..3641eb4 100644 ---- a/include/ClientMedia.py -+++ b/include/ClientMedia.py -@@ -1333,7 +1333,7 @@ class TagsManagerSimple( object ): - combined_current = combined_statuses_to_tags[ HC.CURRENT ] - combined_pending = combined_statuses_to_tags[ HC.PENDING ] - -- slice = { tag for tag in combined_current.union( combined_pending ) if True in ( tag.startswith( namespace + ':' ) for namespace in namespaces ) } -+ slice = { tag for tag in combined_current.union( combined_pending ) if True in (lambda tag:( tag.startswith( namespace + ':' ) for namespace in namespaces ))(tag) } - - if collapse_siblings: - -@@ -1477,4 +1477,4 @@ class TagsManager( TagsManagerSimple ): - self._RecalcCombined() - - -- -\ No newline at end of file -+ -diff --git a/include/HydrusData.py b/include/HydrusData.py -index 1442ba2..0a831fb 100644 ---- a/include/HydrusData.py -+++ b/include/HydrusData.py -@@ -1078,15 +1078,15 @@ class ClientToServerContentUpdatePackage( HydrusYAMLBase ): - - if data_type in ( HC.CONTENT_DATA_TYPE_TAG_SIBLINGS, HC.CONTENT_DATA_TYPE_TAG_PARENTS ) and action in ( HC.CONTENT_UPDATE_PENDING, HC.CONTENT_UPDATE_PETITION ): - -- munge_row = lambda ( pair, reason ): pair -+ munge_row = lambda tup: tup[0] - - elif data_type == HC.CONTENT_DATA_TYPE_FILES and action == HC.CONTENT_UPDATE_PETITION: - -- munge_row = lambda ( hashes, reason ): hashes -+ munge_row = lambda tup: tup[0] - - elif data_type == HC.CONTENT_DATA_TYPE_MAPPINGS and action == HC.CONTENT_UPDATE_PETITION: - -- munge_row = lambda ( tag, hashes, reason ): ( tag, hashes ) -+ munge_row = lambda tup: tup[:-1] - - - else: new_action = action -diff --git a/include/HydrusImageHandling.py b/include/HydrusImageHandling.py -index bada4c1..b04d6a7 100755 ---- a/include/HydrusImageHandling.py -+++ b/include/HydrusImageHandling.py -@@ -48,7 +48,8 @@ def ConvertToPngIfBmp( path ): - - - --def EfficientlyResizeNumpyImage( numpy_image, ( target_x, target_y ) ): -+def EfficientlyResizeNumpyImage( numpy_image, target_dims ): -+ ( target_x, target_y ) = target_dims - - ( im_y, im_x, depth ) = numpy_image.shape - -@@ -61,7 +62,8 @@ def EfficientlyResizeNumpyImage( numpy_image, ( target_x, target_y ) ): - - return cv2.resize( result, ( target_x, target_y ), interpolation = cv2.INTER_LINEAR ) - --def EfficientlyResizePILImage( pil_image, ( target_x, target_y ) ): -+def EfficientlyResizePILImage( pil_image, target_dims ): -+ ( target_x, target_y ) = target_dims - - ( im_x, im_y ) = pil_image.size - -@@ -74,7 +76,8 @@ def EfficientlyResizePILImage( pil_image, ( target_x, target_y ) ): - - return pil_image.resize( ( target_x, target_y ), PILImage.ANTIALIAS ) - --def EfficientlyThumbnailNumpyImage( numpy_image, ( target_x, target_y ) ): -+def EfficientlyThumbnailNumpyImage( numpy_image, target_dims ): -+ ( target_x, target_y ) = target_dims - - ( im_y, im_x, depth ) = numpy_image.shape - -@@ -84,7 +87,8 @@ def EfficientlyThumbnailNumpyImage( numpy_image, ( target_x, target_y ) ): - - return cv2.resize( numpy_image, ( target_x, target_y ), interpolation = cv2.INTER_AREA ) - --def EfficientlyThumbnailPILImage( pil_image, ( target_x, target_y ) ): -+def EfficientlyThumbnailPILImage( pil_image, target_dims ): -+ ( target_x, target_y ) = target_dims - - ( im_x, im_y ) = pil_image.size - -@@ -307,7 +311,9 @@ def GetResolutionAndNumFrames( path ): - - return ( ( x, y ), num_frames ) - --def GetThumbnailResolution( ( im_x, im_y ), ( target_x, target_y ) ): -+def GetThumbnailResolution( im_dims, target_dims ): -+ ( im_x, im_y ) = im_dims -+ ( target_x, target_y ) = target_dims - - im_x = float( im_x ) - im_y = float( im_y ) -diff --git a/include/HydrusMessageHandling.py b/include/HydrusMessageHandling.py -index dbd6c95..cbc017f 100755 ---- a/include/HydrusMessageHandling.py -+++ b/include/HydrusMessageHandling.py -@@ -164,235 +164,3 @@ class Message( HydrusData.HydrusYAMLBase ): - return verifier.verify( hash_object, self._signature ) - - --# here begins the new stuff, I'm pretty sure -- --class Identity( object ): # should be a yamlable object -- -- def __init__( self ): -- -- # no name, right? we associate names and addresses with the identity, but the id only has keys -- -- # store key_type -> key -- # hence need a key_type enum -- -- pass -- -- --class IMManager( object ): -- -- def __init__( self ): -- -- self._accounts = {} -- self._contexts = {} -- self._persistent_connections = {} -- self._temporary_connections = {} -- -- # go fetch all accounts from the db -- -- # set up many pubsubs -- -- # start up some sort of daemon to keep our accounts logged in -- -- pass -- -- -- def _GetContext( self, identifier_local, name_local, identifier_remote, name_remote ): -- -- if ( identifier_remote, name_remote ) not in self._contexts[ identifier_local ]: -- -- account = self._accounts[ ( identifier_local, name_local ) ] -- -- context = HydrusEncryption.HydrusOTRContext( account, identifier_remote, name_remote ) -- -- self._contexts[ ( identifier_local, name_local, identifier_remote, name_remote ) ] = context -- -- -- context = self._contexts[ identifier_local ][ ( identifier_remote, name_remote ) ] -- -- return context -- -- -- def LoginPersistentConnections( self ): -- -- # this is on a daemon thread, so move to twisted -- -- for ( identifier, name ) in self._accounts.keys(): -- -- if ( identifier, name ) not in self._persistent_connections: -- -- # get host, port for that identity -- -- creator = ClientCreator( reactor, HydrusServerAMP.MessagingClientProtocol ) -- -- deferred = creator.connectTCP( host, port ) -- -- # deferred is called with the connection, or an error -- # callRemote to register with session key and whatnot -- -- self._persistent_connections[ ( identifier, name ) ] = connection -- -- -- -- -- def ReceiveMessage( self, identifier_from, name_from, identifier_to, name_to, message ): -- -- # currently on wx loop -- # move it to the twisted loop -- -- if ( identifier_from, name_from, identifier_to, name_to ) not in self._temporary_connections: -- -- self._temporary_connections[ ( identifier_from, name_from, identifier_to, name_to ) ] = self._persistent_connections[ ( identifier_to, name_to ) ] -- # this should have a better error, if the _to doesn't exist -- # we should really just disregard it, and any other weirdness -- -- -- context = self._GetContext( identifier_to, name_to, identifier_from, name_from ) -- -- response = context.receiveMessage( message ) -- -- if response is not None: -- -- ( decrypted_message, gumpf ) = response -- -- message_object = yaml.safe_load( decrypted_message ) -- -- # do the pubsub -- -- -- -- def RemovePersistentConnection( self, identifier, name ): -- -- # if it is still alive, loseConnection or whatever. -- # remove it -- # pubsub the login daemon -- -- pass -- -- -- def RemoveTemporaryConnection( self, identifier_from, name_from, identifier_to, name_to ): -- -- # if it is still alive, loseConnection or whatever. -- # remove it -- -- pass -- -- -- def SendMessage( self, identifier_from, name_from, identifier_to, name_to, message ): -- -- context = self._GetContext( identifier_from, name_from, identifier_to, name_to ) -- -- context.sendMessage( potr.context.FRAGMENT_SEND_ALL, message ) -- -- -- def SendEncryptedMessage( self, identifier_from, name_from, identifier_to, name_to, message ): -- -- # currently on wx loop -- # move it to the twisted loop -- -- connection = self._temporary_connections[ ( identifier_from, name_from, identifier_to, name_to ) ] -- -- connection.callRemote( HydrusServerAMP.IMMessageServer, identifier_to = identifier_to, name_to = name_to, message = message ) -- -- # if it breaks, we should pubsub that it broke -- -- -- def StartTalking( self, identifier_from, name_from, identifier_to, name_to ): -- -- # currently on wx loop -- # move it to the twisted loop -- -- # fetch host and port for that id -- -- creator = ClientCreator( reactor, HydrusServerAMP.MessagingClientProtocol ) -- -- deferred = creator.connectTCP( host, port ) -- -- # deferred is called with the connection, or an error -- # callRemote to register identifier_from and name_from as temp login -- # then add to temp_connections -- -- self._temporary_connections[ ( identifier_from, name_from, identifier_to, name_to ) ] = connection -- -- message = '' # this is just to get the OTR handshake going; it'll never be sent -- -- connection.callRemote( HydrusServerAMP.IMMessageServer, identifier_to = identifier_to, name_to = name_to, message = message ) -- -- # how do I detect when we are ready to do encrypted comms? -- # I can check periodically context.status, but that is a _little_ bleh -- # I can write a pubsub in the setStatus thing in context -- # check that article again, or the code, on the exact name -- -- # do a pubsub to say we are ready to do encrypted comms -- -- # if it fails, we should pubsub that it broke -- -- -- def StopTalking( self, identifier, name ): -- -- # close temp connection -- # -- -- pass -- -- --class IMMessage( HydrusData.HydrusYAMLBase ): -- -- yaml_tag = u'!IMMessage' -- --class IMMessageQuestion( IMMessage ): -- -- yaml_tag = u'!IMMessageQuestion' -- -- def __init__( self, job_key = None ): -- -- if job_key is None: job_key = HydrusData.GenerateKey() -- -- self._job_key = job_key -- -- -- def GenerateAnswer( self, answer ): -- -- return IMMessageQuestionAnswer( self._job_key, answer ) -- -- -- def GetJobKey( self ): return self._job_key -- --class IMMessageQuestionAnswer( IMMessageQuestion ): -- -- yaml_tag = u'!IMMessageQuestionAnswer' -- -- def __init__( self, job_key, answer ): -- -- IMMessageQuestion.__init__( self, job_key ) -- -- self._answer = answer -- -- -- def GetAnswer( self ): return self._answer -- --class IMMessageQuestionFiles( IMMessageQuestion ): -- -- yaml_tag = u'!IMMessageFiles' -- -- def __init__( self, media_results ): -- -- IMMessageQuestion.__init__( self ) -- -- self._text = text -- -- --IM_MESSAGE_TYPE_CONVO = 0 --IM_MESSAGE_TYPE_STATUS = 1 -- --class IMMessageText( IMMessage ): -- -- yaml_tag = u'!IMMessageText' -- -- def __init__( self, message_type, text ): -- -- self._type = message_type -- self._text = text -- -- -- def ToTuple( self ): return ( self._type, self._text ) -- -\ No newline at end of file diff --git a/paths-in-opt.patch b/paths-in-opt.patch index 469f15605728..31aa58ca949b 100644 --- a/paths-in-opt.patch +++ b/paths-in-opt.patch @@ -1,9 +1,9 @@ diff --git a/include/ClientGUI.py b/include/ClientGUI.py -index 26e1eb9..35f2be4 100755 +index df287e2..af0afba 100755 --- a/include/ClientGUI.py +++ b/include/ClientGUI.py @@ -136,7 +136,7 @@ class FrameGUI( ClientGUICommon.FrameThatResizes ): - aboutinfo.SetVersion( HydrusData.ToString( HC.SOFTWARE_VERSION ) ) + aboutinfo.SetVersion( HydrusData.ToString( HC.SOFTWARE_VERSION ) + ', using network version ' + HydrusData.ToString( HC.NETWORK_VERSION ) ) aboutinfo.SetDescription( CC.CLIENT_DESCRIPTION ) - with open( HC.BASE_DIR + os.path.sep + 'license.txt', 'rb' ) as f: license = f.read() @@ -11,7 +11,7 @@ index 26e1eb9..35f2be4 100755 aboutinfo.SetLicense( license ) -@@ -1975,7 +1975,7 @@ The password is cleartext here but obscured in the entry dialog. Enter a blank p +@@ -1987,7 +1987,7 @@ The password is cleartext here but obscured in the entry dialog. Enter a blank p elif command == '8chan_board': webbrowser.open( 'http://8ch.net/hydrus/index.html' ) elif command == 'file_integrity': self._CheckFileIntegrity() @@ -21,10 +21,10 @@ index 26e1eb9..35f2be4 100755 elif command == 'help_shortcuts': wx.MessageBox( CC.SHORTCUT_HELP ) elif command == 'import_files': self._ImportFiles() diff --git a/include/ClientGUIDialogs.py b/include/ClientGUIDialogs.py -index 3c03b10..3c3841a 100755 +index 57eb0a1..e178693 100755 --- a/include/ClientGUIDialogs.py +++ b/include/ClientGUIDialogs.py -@@ -620,7 +620,7 @@ class DialogFirstStart( Dialog ): +@@ -628,7 +628,7 @@ class DialogFirstStart( Dialog ): self._ok.SetForegroundColour( ( 0, 128, 0 ) ) message1 = 'Hi, this looks like the first time you have started the hydrus client. Don\'t forget to check out the' @@ -34,7 +34,7 @@ index 3c03b10..3c3841a 100755 message3 = 'When you close this dialog, the client will start its local http server. You will probably get a firewall warning.' message4 = 'You can block it if you like, or you can allow it. It doesn\'t phone home, or expose your files to your network; it just provides another way to locally export your files.' diff --git a/include/ClientLocalServerResources.py b/include/ClientLocalServerResources.py -index 90fb7ea..beb17d2 100644 +index 4d8c363..b5119b6 100644 --- a/include/ClientLocalServerResources.py +++ b/include/ClientLocalServerResources.py @@ -242,11 +242,11 @@ class HydrusResourceCommandBooruThumbnail( HydrusResourceCommandBooru ): @@ -62,7 +62,7 @@ index 90fb7ea..beb17d2 100644 \ No newline at end of file + diff --git a/include/HydrusConstants.py b/include/HydrusConstants.py -index 83942d3..927155e 100755 +index e3fea73..5c87f83 100755 --- a/include/HydrusConstants.py +++ b/include/HydrusConstants.py @@ -3,9 +3,9 @@ import sys diff --git a/running-the-server.patch b/running-the-server.patch index f77f0830798a..4b64185c8fed 100644 --- a/running-the-server.patch +++ b/running-the-server.patch @@ -1,8 +1,8 @@ diff --git a/include/ClientGUI.py b/include/ClientGUI.py -index 35f2be4..86c99e5 100755 +index af0afba..c885196 100755 --- a/include/ClientGUI.py +++ b/include/ClientGUI.py -@@ -241,18 +241,7 @@ class FrameGUI( ClientGUICommon.FrameThatResizes ): +@@ -244,18 +244,7 @@ class FrameGUI( ClientGUICommon.FrameThatResizes ): my_scriptname = sys.argv[0] |