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]

Reply via email to