implementing edit conflict & collision detection
authorkeby <keby@erebor.(none)>
Thu, 20 May 2010 20:56:40 +0000 (22:56 +0200)
committerkeby <keby@erebor.(none)>
Thu, 20 May 2010 20:56:40 +0000 (22:56 +0200)
src/mw/clicommands.py
src/mw/metadir.py

index 7931ac69e9c5a3ae2504b18cd842c84c944bb9c0..e02ec798eb589507afe6fe2984ed7f0e8422c3a2 100644 (file)
@@ -149,10 +149,8 @@ class PullCommand(CommandBase):
                 self.metadir.pages_add_rv(int(pageid),
                                           response[pageid]['revisions'][0])
                 filename = mw.api.pagename_to_filename(pagename)
-                fd = file(os.path.join(self.metadir.root, filename + '.wiki'),
-                          'w')
-                fd.write(response[pageid]['revisions'][0]['*'].encode('utf-8'))
-
+                with file(os.path.join(self.metadir.root, filename + '.wiki'), 'w') as fd:
+                  fd.write(response[pageid]['revisions'][0]['*'].encode('utf-8'))
 
 class StatusCommand(CommandBase):
 
@@ -221,12 +219,18 @@ class CommitCommand(CommandBase):
                 # get edit token
                 data = {
                         'action': 'query',
-                        'prop': 'info',
+                        'prop': 'info|revisions',
                         'intoken': 'edit',
                         'titles': mw.api.filename_to_pagename(file[:-5]),
                 }
                 response = self.api.call(data)
                 pageid = response['query']['pages'].keys()[0]
+                revid = response['query']['pages'][pageid]['revisions'][0]['revid']
+                awaitedrevid = self.metadir.pages_get_rv_list( {'id': pageid } )[0]                
+                if revid != awaitedrevid :
+                     print "Ignoring %s - Edition conflict detected %s - %s " % ( file , awaitedrevid, revid)
+                     continue
+                raw_input()
                 edittoken = response['query']['pages'][pageid]['edittoken']
                 # FIXME use basetimestamp and starttimestamp
                 filename = os.path.join(self.metadir.root, file)
@@ -249,6 +253,13 @@ class CommitCommand(CommandBase):
                     data['bot'] = 'bot'
                 response = self.api.call(data)
                 if response['edit']['result'] == 'Success':
+                    if response['edit'].has_key('nochange') :
+                      print "Ignoring %s - No changes were detected - Removing ending lf" %  file 
+                      self.metadir.clean_page(file[:-5])
+                      continue
+                    if response['edit']['oldrevid'] != revid :
+                      print "Ignoring %s - Colision detected " % file
+                      continue
                     data = {
                             'action': 'query',
                             'revids': response['edit']['newrevid'],
index 9aae09146c7154aaf2647fa9b5d34218687263d8..3f8d96782551c01bb2f4cf66c34b6b72bebb67ea 100644 (file)
@@ -78,6 +78,18 @@ class Metadir(object):
         # create cache/pages/
         os.mkdir(os.path.join(self.location, 'cache', 'pages'), 0755)
 
+
+
+    def clean_page(self, pagename):
+        filename = mw.api.pagename_to_filename(pagename) + '.wiki'
+        cur_content = codecs.open(filename, 'r', 'utf-8').read()
+        if ( (len(cur_content) != 0) and (cur_content[-1] == '\n') ):
+           cur_content = cur_content[:-1]
+
+        fd = file(filename, 'w')
+        fd.write(cur_content.encode('utf-8'))   
+        fd.close()
+
     def pagedict_add(self, pagename, pageid, currentrv):
         fd = file(os.path.join(self.location, 'cache', 'pagedict'), 'r+')
         pagedict = json.loads(fd.read())

Benjamin Mako Hill || Want to submit a patch?