Hello community, here is the log from the commit of package kajongg for openSUSE:Factory checked in at 2013-08-16 13:44:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kajongg (Old) and /work/SRC/openSUSE:Factory/.kajongg.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kajongg" Changes: -------- --- /work/SRC/openSUSE:Factory/kajongg/kajongg.changes 2013-07-30 15:57:00.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.kajongg.new/kajongg.changes 2013-08-16 13:44:16.000000000 +0200 @@ -1,0 +2,7 @@ +Thu Aug 8 15:29:40 UTC 2013 - [email protected] + +- Update to 4.11.0 + * KDE 4.11 Final release + * See http://www.kde.org/announcements/4.11/ + +------------------------------------------------------------------- Old: ---- kajongg-4.10.97.tar.xz New: ---- kajongg-4.11.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kajongg.spec ++++++ --- /var/tmp/diff_new_pack.4vEudz/_old 2013-08-16 13:44:17.000000000 +0200 +++ /var/tmp/diff_new_pack.4vEudz/_new 2013-08-16 13:44:17.000000000 +0200 @@ -25,7 +25,7 @@ License: GPL-2.0+ Group: Amusements/Games/Board/Puzzle Url: http://www.kde.org -Version: 4.10.97 +Version: 4.11.0 Release: 0 Source0: kajongg-%{version}.tar.xz BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ kajongg-4.10.97.tar.xz -> kajongg-4.11.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kajongg-4.10.97/src/client.py new/kajongg-4.11.0/src/client.py --- old/kajongg-4.10.97/src/client.py 2013-07-10 01:21:29.000000000 +0200 +++ new/kajongg-4.11.0/src/client.py 2013-08-06 14:48:10.000000000 +0200 @@ -22,7 +22,7 @@ from twisted.spread import pb from twisted.internet.defer import Deferred, succeed, DeferredList from twisted.python.failure import Failure -from util import logDebug, logException, Duration +from util import logDebug, logException, logWarning, Duration from message import Message from common import InternalParameters, Debug from rule import Ruleset @@ -247,27 +247,29 @@ def readyForGameStart(self, tableid, gameid, wantedGame, playerNames, shouldSave=True): """the game server asks us if we are ready. A robot is always ready.""" + def disagree(about): + """do not bother to translate this, it should normally not happen""" + self.game.close() + msg = 'The data bases for game %s have different %s' % (self.game.seed, about) + logWarning(msg) + raise pb.Error(msg) if self.isHumanClient(): assert not self.table assert self.tables self.table = self.tableById(tableid) if not self.table: - raise Exception('client.readyForGameStart: tableid %d unknown' % tableid) + raise pb.Error('client.readyForGameStart: tableid %d unknown' % tableid) if self.table.suspended: self.game = RemoteGame.loadFromDB(gameid, client=self) self.game.assignPlayers(playerNames) if self.isHumanClient(): if self.game.handctr != self.table.endValues[0]: - self.game.close() - raise Exception( - 'The data bases for game %1 have different numbers for played hands: Server:%2, Client:%3', \ - self.game.seed, self.table.endValues[0], self.game.handctr) + disagree('numbers for played hands: Server:%s, Client:%s' % ( + self.table.endValues[0], self.game.handctr)) for player in self.game.players: if player.balance != self.table.endValues[1][player.wind]: - self.game.close() - raise Exception( - 'The data bases for game %1 have different balances for wind %2: Server:%3, Client:%4', \ - self.game.seed, player.wind, self.table.endValues[1][player.wind], player.balance) + disagree('balances for wind %s: Server:%s, Client:%s' % ( + player.wind, self.table.endValues[1][player.wind], player.balance)) else: self.game = RemoteGame(playerNames, self.table.ruleset, shouldSave=shouldSave, gameid=gameid, wantedGame=wantedGame, client=self, @@ -346,10 +348,20 @@ self.game.moves.append(move) if move.message == Message.Discard: # do not block here, we want to get the clientDialog - # before the tile reaches its end position + # before the animated tile reaches its end position animate() return answer + elif move.message == Message.AskForClaims: + # no need to start an animation. If we did the below standard clause, this is what + # could happen: + # 1. user says Chow + # 2. SelectChow dialog pops up + # 3. previous animation ends, making animate() callback with current answer + # 4. but this answer is Chow, without a selected Chow. This is wrongly sent to server + return answer else: + # return answer only after animation ends. Put answer into + # the Deferred returned by animate(). return animate().addCallback(self.convertMessage, answer) def claimed(self, move): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kajongg-4.10.97/src/deferredutil.py new/kajongg-4.11.0/src/deferredutil.py --- old/kajongg-4.10.97/src/deferredutil.py 2013-07-10 01:21:29.000000000 +0200 +++ new/kajongg-4.11.0/src/deferredutil.py 2013-08-06 14:48:10.000000000 +0200 @@ -192,8 +192,13 @@ msg = m18nE('The game server lost connection to player %1') self.table.abort(msg, request.player.name) else: - msg = m18nE('Unknown error for player %1: %2\n%3') - self.table.abort(msg, request.player.name, result.getErrorMessage(), result.getTraceback()) + msg = m18nE('Error for player %1: %2\n%3') + try: + traceBack = result.getTraceback() + except BaseException: + # may happen with twisted 12.3.0 + traceBack = 'twisted cannot give us a traceback' + self.table.abort(msg, request.player.name, result.getErrorMessage(), traceBack) @staticmethod def __enrichMessage(game, about, command, kwargs): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kajongg-4.10.97/src/humanclient.py new/kajongg-4.11.0/src/humanclient.py --- old/kajongg-4.10.97/src/humanclient.py 2013-07-24 13:12:49.000000000 +0200 +++ new/kajongg-4.11.0/src/humanclient.py 2013-08-06 14:48:10.000000000 +0200 @@ -272,11 +272,12 @@ class SelectChow(DialogIgnoringEscape): """asks which of the possible chows is wanted""" - def __init__(self, chows, propose): + def __init__(self, chows, propose, deferred): DialogIgnoringEscape.__init__(self) self.setWindowTitle('Kajongg') self.chows = chows self.selectedChow = None + self.deferred = deferred layout = QVBoxLayout(self) layout.addWidget(QLabel(m18n('Which chow do you want to expose?'))) self.buttons = [] @@ -295,6 +296,7 @@ if button.isChecked(): self.selectedChow = self.chows[self.buttons.index(button)] self.accept() + self.deferred.callback((Message.Chow.name, self.selectedChow)) def closeEvent(self, event): """allow close only if a chow has been selected""" @@ -305,11 +307,12 @@ class SelectKong(DialogIgnoringEscape): """asks which of the possible kongs is wanted""" - def __init__(self, kongs): + def __init__(self, kongs, deferred): DialogIgnoringEscape.__init__(self) self.setWindowTitle('Kajongg') self.kongs = kongs self.selectedKong = None + self.deferred = deferred layout = QVBoxLayout(self) layout.addWidget(QLabel(m18n('Which kong do you want to declare?'))) self.buttons = [] @@ -325,6 +328,7 @@ if button.isChecked(): self.selectedKong = self.kongs[self.buttons.index(button)] self.accept() + self.deferred.callback((Message.Kong.name, self.selectedKong)) def closeEvent(self, event): """allow close only if a chow has been selected""" @@ -867,28 +871,33 @@ return deferred def selectChow(self, chows): - """which possible chow do we want to expose?""" + """which possible chow do we want to expose? + Since we might return a Deferred to be sent to the server, + which contains Message.Chow plus selected Chow, we should + return the same tuple here""" if self.game.autoPlay: - return self.intelligence.selectChow(chows) + return Message.Chow.name, self.intelligence.selectChow(chows) if len(chows) == 1: - return chows[0] + return Message.Chow.name, chows[0] if Preferences.propose: propose = self.intelligence.selectChow(chows) else: propose = None - selDlg = SelectChow(chows, propose) + deferred = Deferred() + selDlg = SelectChow(chows, propose, deferred) assert selDlg.exec_() - return selDlg.selectedChow + return deferred def selectKong(self, kongs): """which possible kong do we want to declare?""" if self.game.autoPlay: - return self.intelligence.selectKong(kongs) + return Message.Kong.name, self.intelligence.selectKong(kongs) if len(kongs) == 1: - return kongs[0] - selDlg = SelectKong(kongs) + return Message.Kong.name, kongs[0] + deferred = Deferred() + selDlg = SelectKong(kongs, deferred) assert selDlg.exec_() - return selDlg.selectedKong + return deferred def answered(self, answer): """the user answered our question concerning move""" @@ -900,9 +909,9 @@ return answer.name, myself.handBoard.focusTile.element args = self.sayable[answer] if answer == Message.Chow: - args = self.selectChow(args) + return self.selectChow(args) if answer == Message.Kong: - args = self.selectKong(args) + return self.selectKong(args) assert args self.game.hidePopups() return answer.name, args @@ -936,7 +945,7 @@ writer = csv.writer(open(InternalParameters.csv,'a'), delimiter=';') row = [InternalParameters.AI, str(self.game.seed), ','.join(self.game.csvTags)] for player in sorted(self.game.players, key=lambda x: x.name): - row.append(player.name) + row.append(player.name.encode('utf-8')) row.append(player.balance) row.append(player.wonCount) row.append(1 if player == gameWinner else 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kajongg-4.10.97/src/server.py new/kajongg-4.11.0/src/server.py --- old/kajongg-4.10.97/src/server.py 2013-07-24 00:21:40.000000000 +0200 +++ new/kajongg-4.11.0/src/server.py 2013-08-06 14:48:10.000000000 +0200 @@ -925,8 +925,10 @@ def stopNowAfterLastDisconnect(self): """as the name says""" + # pylint: disable=W0212 + # because we access _stopped if InternalParameters.socket and not InternalParameters.continueServer \ - and not self.users and reactor.running: + and not self.users and reactor.running and not reactor._stopped: logInfo('local server terminates. Reason: last client disconnected') reactor.stop() -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
