annotate MoinMoin/action/SyncPages.py @ 1393:e6e054247a58

Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
author Alexander Schremmer <alex AT alexanderweb DOT de>
date Mon, 21 Aug 2006 16:09:12 +0200
parents bcabe48fc2f6
children e6bf86b4a735
rev   line source
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
1 # -*- coding: iso-8859-1 -*-
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
2 """
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
3 MoinMoin - SyncPages action
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
4
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
5 This action allows you to synchronise pages of two wikis.
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
6
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
7 @copyright: 2006 MoinMoin:AlexanderSchremmer
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
8 @license: GNU GPL, see COPYING for details.
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
9 """
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
10
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
11 import os
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
12 import re
976
a442ed63b165 Reordered class hierachy of remote wikis, enhanced RemoteWiki interface
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 971
diff changeset
13 import xmlrpclib
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
14
1041
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
15 # Compatiblity to Python 2.3
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
16 try:
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
17 set
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
18 except NameError:
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
19 from sets import Set as set
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
20
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
21
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
22 from MoinMoin import wikiutil, config, user
1096
33927b0256ce Changed marshalling format of the full IWID, load full IWID into the RemoteWiki object.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1095
diff changeset
23 from MoinMoin.packages import unpackLine, packLine
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
24 from MoinMoin.PageEditor import PageEditor, conflict_markers
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
25 from MoinMoin.Page import Page
1092
f80e88b33c9d Added processing of local- and remoteMatch options to the SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1053
diff changeset
26 from MoinMoin.wikidicts import Dict, Group
1385
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
27 from MoinMoin.wikisync import TagStore, UnsupportedWikiException, SyncPage, NotAllowedException
1303
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
28 from MoinMoin.wikisync import MoinLocalWiki, MoinRemoteWiki, UP, DOWN, BOTH, MIMETYPE_MOIN
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
29 from MoinMoin.util.bdiff import decompress, patch, compress, textdiff
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
30 from MoinMoin.util import diff3
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
31
1264
064778edb38c Started integration of direction DOWN support.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1263
diff changeset
32
1393
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
33 debug = False
1330
df88b475c1f0 Reworked debugging.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1329
diff changeset
34
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
35
1267
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
36 # map sync directions
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
37 directions_map = {"up": UP, "down": DOWN, "both": BOTH}
1041
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
38
1135
bf5f8afacf59 Added prefix handling to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1134
diff changeset
39
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
40 class ActionStatus(Exception): pass
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
41
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
42
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
43 class ActionClass(object):
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
44 INFO, WARN, ERROR = zip(range(3), ("", "<!>", "/!\\")) # used for logging
1158
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
45
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
46 def __init__(self, pagename, request):
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
47 self.request = request
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
48 self.pagename = pagename
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
49 self.page = PageEditor(request, pagename)
1158
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
50 self.status = []
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
51
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
52 def log_status(self, level, message="", substitutions=(), raw_suffix=""):
1159
0432e8a9ba2f Added docstrings.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1158
diff changeset
53 """ Appends the message with a given importance level to the internal log. """
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
54 self.status.append((level, message, substitutions, raw_suffix))
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
55
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
56 def generate_log_table(self):
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
57 """ Transforms self.status into a user readable table. """
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
58 table_line = u"|| %(smiley)s || %(message)s%(raw_suffix)s ||"
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
59 table = []
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
60
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
61 for line in self.status:
1393
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
62 if line[1]:
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
63 if line[2]:
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
64 macro_args = [line[1]] + list(line[2])
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
65 message = u"[[GetText2(|%s)]]" % (packLine(macro_args), )
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
66 else:
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
67 message = u"[[GetText(%s)]]" % (line[1], )
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
68 else:
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
69 message = u""
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
70 table.append(table_line % {"smiley": line[0][1],
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
71 "message": message,
e6e054247a58 Disabled debug mode, output GetText as well if GetText2 is not necessary, refactored my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1391
diff changeset
72 "raw_suffix": line[3]})
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
73
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
74 return "\n".join(table)
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
75
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
76 def parse_page(self):
1159
0432e8a9ba2f Added docstrings.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1158
diff changeset
77 """ Parses the parameter page and returns the read arguments. """
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
78 options = {
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
79 "remotePrefix": "",
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
80 "localPrefix": "",
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
81 "remoteWiki": "",
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
82 "pageMatch": None,
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
83 "pageList": None,
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
84 "groupList": None,
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
85 "direction": "foo", # is defaulted below
1386
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
86 "user": None, # this should be refactored into a password agent
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
87 "password": None, # or OpenID like solution (XXX)
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
88 }
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
89
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
90 options.update(Dict(self.request, self.pagename).get_dict())
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
91
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
92 # Convert page and group list strings to lists
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
93 if options["pageList"] is not None:
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
94 options["pageList"] = unpackLine(options["pageList"], ",")
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
95 if options["groupList"] is not None:
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
96 options["groupList"] = unpackLine(options["groupList"], ",")
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
97
1267
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
98 options["direction"] = directions_map.get(options["direction"].lower(), BOTH)
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
99
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
100 return options
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
101
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
102 def fix_params(self, params):
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
103 """ Does some fixup on the parameters. """
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
104
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
105 # merge the pageList case into the pageMatch case
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
106 if params["pageList"] is not None:
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
107 params["pageMatch"] = u'|'.join([r'^%s$' % re.escape(name)
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
108 for name in params["pageList"]])
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
109
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
110 if params["pageMatch"] is not None:
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
111 params["pageMatch"] = re.compile(params["pageMatch"], re.U)
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
112
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
113 # we do not support matching or listing pages if there is a group of pages
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
114 if params["groupList"]:
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
115 params["pageMatch"] = None
1266
ff08338e67fe Filter the pagelists by pageList on both sides (speedup). Marked a few operations as direct API accesses.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1264
diff changeset
116 params["pageList"] = None
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
117
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
118 return params
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
119
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
120 def render(self):
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
121 """ Render action
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
122
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
123 This action returns a status message.
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
124 """
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
125 _ = self.request.getText
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
126
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
127 params = self.fix_params(self.parse_page())
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
128
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
129 try:
1263
e313c2187271 Show an error message for the direction UP.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1262
diff changeset
130 if params["direction"] == UP:
e313c2187271 Show an error message for the direction UP.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1262
diff changeset
131 raise ActionStatus(_("The only supported directions are BOTH and DOWN."))
e313c2187271 Show an error message for the direction UP.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1262
diff changeset
132
976
a442ed63b165 Reordered class hierachy of remote wikis, enhanced RemoteWiki interface
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 971
diff changeset
133 if not self.request.cfg.interwikiname:
a442ed63b165 Reordered class hierachy of remote wikis, enhanced RemoteWiki interface
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 971
diff changeset
134 raise ActionStatus(_("Please set an interwikiname in your wikiconfig (see HelpOnConfiguration) to be able to use this action."))
a442ed63b165 Reordered class hierachy of remote wikis, enhanced RemoteWiki interface
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 971
diff changeset
135
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
136 if not params["remoteWiki"]:
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
137 raise ActionStatus(_("Incorrect parameters. Please supply at least the ''remoteWiki'' parameter."))
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
138
1266
ff08338e67fe Filter the pagelists by pageList on both sides (speedup). Marked a few operations as direct API accesses.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1264
diff changeset
139 local = MoinLocalWiki(self.request, params["localPrefix"], params["pageList"])
1095
e2cc6b5bed96 Added detection of anonymous wikis to the SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1092
diff changeset
140 try:
1386
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
141 remote = MoinRemoteWiki(self.request, params["remoteWiki"], params["remotePrefix"], params["pageList"], params["user"], params["password"], verbose=debug)
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
142 except (UnsupportedWikiException, NotAllowedException), (msg, ):
1097
e22024151c2c Fixed some bugs in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1096
diff changeset
143 raise ActionStatus(msg)
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
144
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
145 if not remote.valid:
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
146 raise ActionStatus(_("The ''remoteWiki'' is unknown."))
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
147 except ActionStatus, e:
1321
d0c171c168a8 Minor cleanup, added entry to my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1320
diff changeset
148 msg = u'<p class="error">%s</p>\n' % (e.args[0], )
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
149
1385
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
150 try:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
151 try:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
152 self.sync(params, local, remote)
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
153 except Exception, e:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
154 self.log_status(self.ERROR, _("A severe error occured:"), raw_suffix=repr(e))
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
155 raise
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
156 else:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
157 msg = u"%s" % (_("Syncronisation finished. Look below for the status messages."), )
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
158 finally:
1386
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
159 # XXX aquire readlock on self.page
1385
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
160 self.page.saveText(self.page.get_raw_body() + "\n\n" + self.generate_log_table(), 0)
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
161 # XXX release readlock on self.page
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
162
1343
144c3281e88f Now the deletion of remote pages is working.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1336
diff changeset
163 self.page.send_page(self.request, msg=msg)
1344
564cc2b53ea9 Reworded a docstring in SyncPages.sync, whitespace cleanup.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1343
diff changeset
164
1041
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
165 def sync(self, params, local, remote):
1271
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
166 """ This method does the syncronisation work.
1344
564cc2b53ea9 Reworded a docstring in SyncPages.sync, whitespace cleanup.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1343
diff changeset
167 Currently, it handles nearly all cases.
564cc2b53ea9 Reworded a docstring in SyncPages.sync, whitespace cleanup.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1343
diff changeset
168 The major missing part is rename handling.
564cc2b53ea9 Reworded a docstring in SyncPages.sync, whitespace cleanup.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1343
diff changeset
169 There are a few other cases left that have to be implemented:
1271
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
170 Wiki A | Wiki B | Remark
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
171 ----------+----------+------------------------------
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
172 exists | non- | Now the wiki knows that the page was renamed.
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
173 with tags | existant | There should be an RPC method that asks
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
174 | | for the new name (which could be recorded
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
175 | | on page rename). Then the page is
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
176 | | renamed in Wiki A as well and the sync
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
177 | | is done normally.
1272
e85ad6a95ae5 Documented new ideas in the docstring, changed tag format (store normalised name), transmit normalised name in mergeDiff.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1271
diff changeset
178 | | Every wiki retains a dict that maps
e85ad6a95ae5 Documented new ideas in the docstring, changed tag format (store normalised name), transmit normalised name in mergeDiff.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1271
diff changeset
179 | | (IWID, oldname) => newname and that is
e85ad6a95ae5 Documented new ideas in the docstring, changed tag format (store normalised name), transmit normalised name in mergeDiff.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1271
diff changeset
180 | | updated on every rename. oldname refers
e85ad6a95ae5 Documented new ideas in the docstring, changed tag format (store normalised name), transmit normalised name in mergeDiff.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1271
diff changeset
181 | | to the pagename known by the old wiki (can be
e85ad6a95ae5 Documented new ideas in the docstring, changed tag format (store normalised name), transmit normalised name in mergeDiff.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1271
diff changeset
182 | | gathered from tags).
1271
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
183 ----------+----------+-------------------------------
1272
e85ad6a95ae5 Documented new ideas in the docstring, changed tag format (store normalised name), transmit normalised name in mergeDiff.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1271
diff changeset
184 exists | any case | Try a rename search first, then
e85ad6a95ae5 Documented new ideas in the docstring, changed tag format (store normalised name), transmit normalised name in mergeDiff.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1271
diff changeset
185 | | do a sync without considering tags
1271
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
186 with tags | with non | to ensure data integrity.
1304
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
187 | matching | Hmm, how do we detect this
1336
bf59bd23289b Some cleanup, fixed packages test because the default test user is not allowed to delete pages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1335
diff changeset
188 | tags | case if the unmatching tags are only
bf59bd23289b Some cleanup, fixed packages test because the default test user is not allowed to delete pages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1335
diff changeset
189 | | on the remote side?
1271
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
190 ----------+----------+-------------------------------
bb2f70fc9734 Have been thinking about a solution for the remaining sync cases, put the thoughts into a docstring."
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1267
diff changeset
191 """
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
192 _ = lambda x: x # we will translate it later
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
193
1264
064778edb38c Started integration of direction DOWN support.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1263
diff changeset
194 direction = params["direction"]
1322
cd150467ee30 Minor cleanups.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1321
diff changeset
195 if direction == BOTH:
cd150467ee30 Minor cleanups.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1321
diff changeset
196 match_direction = direction
cd150467ee30 Minor cleanups.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1321
diff changeset
197 else:
cd150467ee30 Minor cleanups.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1321
diff changeset
198 match_direction = None
cd150467ee30 Minor cleanups.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1321
diff changeset
199
1303
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
200 local_full_iwid = packLine([local.get_iwid(), local.get_interwiki_name()])
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
201 remote_full_iwid = packLine([remote.get_iwid(), remote.get_interwiki_name()])
1136
4ba6da7e23a4 Started implementing the merging process. Not working yet.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1135
diff changeset
202
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
203 self.log_status(self.INFO, _("Syncronisation started -"), raw_suffix=" [[DateTime(%s)]]" % self.page._get_local_timestamp())
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
204
1136
4ba6da7e23a4 Started implementing the merging process. Not working yet.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1135
diff changeset
205 l_pages = local.get_pages()
1264
064778edb38c Started integration of direction DOWN support.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1263
diff changeset
206 r_pages = remote.get_pages(exclude_non_writable=direction != DOWN)
1092
f80e88b33c9d Added processing of local- and remoteMatch options to the SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1053
diff changeset
207
f80e88b33c9d Added processing of local- and remoteMatch options to the SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1053
diff changeset
208 if params["groupList"]:
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
209 pages_from_groupList = set(local.getGroupItems(params["groupList"]))
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
210 r_pages = SyncPage.filter(r_pages, pages_from_groupList.__contains__)
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
211 l_pages = SyncPage.filter(l_pages, pages_from_groupList.__contains__)
1041
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
212
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
213 m_pages = [elem.add_missing_pagename(local, remote) for elem in SyncPage.merge(l_pages, r_pages)]
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
214
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
215 self.log_status(self.INFO, _("Got a list of %s local and %s remote pages. This results in %s different pages over-all."),
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
216 (str(len(l_pages)), str(len(r_pages)), str(len(m_pages))))
1262
16bed977b054 Added support for underlay page ignore and prefix filtering in getAllPagesEx,
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1261
diff changeset
217
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
218 if params["pageMatch"]:
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
219 m_pages = SyncPage.filter(m_pages, params["pageMatch"].match)
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
220 self.log_status(self.INFO, _("After filtering: %s pages"), (str(len(m_pages)), ))
1119
397b97122ad9 General SyncPages refactoring:
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1099
diff changeset
221
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
222 def handle_page(sp):
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
223 # XXX add locking, acquire read-lock on sp
1330
df88b475c1f0 Reworked debugging.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1329
diff changeset
224 if debug:
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
225 self.log_status(ActionClass.INFO, raw_suffix="Processing %r" % sp)
1136
4ba6da7e23a4 Started implementing the merging process. Not working yet.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1135
diff changeset
226
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
227 local_pagename = sp.local_name
1266
ff08338e67fe Filter the pagelists by pageList on both sides (speedup). Marked a few operations as direct API accesses.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1264
diff changeset
228 current_page = PageEditor(self.request, local_pagename) # YYY direct access
1335
2cd1b40ea3e7 Added support for deletion of local pages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1332
diff changeset
229 comment = u"Local Merge - %r" % (remote.get_interwiki_name() or remote.get_iwid())
1136
4ba6da7e23a4 Started implementing the merging process. Not working yet.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1135
diff changeset
230
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
231 tags = TagStore(current_page)
1322
cd150467ee30 Minor cleanups.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1321
diff changeset
232
cd150467ee30 Minor cleanups.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1321
diff changeset
233 matching_tags = tags.fetch(iwid_full=remote.iwid_full, direction=match_direction)
1136
4ba6da7e23a4 Started implementing the merging process. Not working yet.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1135
diff changeset
234 matching_tags.sort()
1330
df88b475c1f0 Reworked debugging.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1329
diff changeset
235 if debug:
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
236 self.log_status(ActionClass.INFO, raw_suffix="Tags: %r [[BR]] All: %r" % (matching_tags, tags.tags))
1136
4ba6da7e23a4 Started implementing the merging process. Not working yet.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1135
diff changeset
237
1304
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
238 # some default values for non matching tags
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
239 normalised_name = None
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
240 remote_rev = None
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
241 local_rev = sp.local_rev # merge against the newest version
1304
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
242 old_contents = ""
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
243
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
244 if matching_tags:
1136
4ba6da7e23a4 Started implementing the merging process. Not working yet.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1135
diff changeset
245 newest_tag = matching_tags[-1]
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
246
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
247 local_change = newest_tag.current_rev != sp.local_rev
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
248 remote_change = newest_tag.remote_rev != sp.remote_rev
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
249
1304
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
250 # handle some cases where we cannot continue for this page
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
251 if not remote_change and (direction == DOWN or not local_change):
1324
2e29ef86be26 Reordered SyncPages, preparing for new modes.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1322
diff changeset
252 return # no changes done, next page
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
253 if sp.local_deleted and sp.remote_deleted:
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
254 return
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
255 if sp.remote_deleted and not local_change:
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
256 msg = local.delete_page(sp.local_name, comment)
1335
2cd1b40ea3e7 Added support for deletion of local pages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1332
diff changeset
257 if not msg:
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
258 self.log_status(ActionClass.INFO, _("Deleted page %s locally."), (sp.name, ))
1335
2cd1b40ea3e7 Added support for deletion of local pages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1332
diff changeset
259 else:
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
260 self.log_status(ActionClass.ERROR, _("Error while deleting page %s locally:"), (sp.name, ), msg)
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
261 return
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
262 if sp.local_deleted and not remote_change:
1335
2cd1b40ea3e7 Added support for deletion of local pages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1332
diff changeset
263 if direction == DOWN:
2cd1b40ea3e7 Added support for deletion of local pages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1332
diff changeset
264 return
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
265 msg = remote.delete_page(sp.remote_name, sp.remote_rev, local_full_iwid)
1343
144c3281e88f Now the deletion of remote pages is working.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1336
diff changeset
266 if not msg:
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
267 self.log_status(ActionClass.INFO, _("Deleted page %s remotely."), (sp.name, ))
1343
144c3281e88f Now the deletion of remote pages is working.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1336
diff changeset
268 else:
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
269 self.log_status(ActionClass.ERROR, _("Error while deleting page %s remotely:"), (sp.name, ), msg)
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
270 return
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
271 if sp.local_mime_type != MIMETYPE_MOIN and not (local_change ^ remote_change):
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
272 self.log_status(ActionClass.WARN, _("The item %s cannot be merged but was changed in both wikis. Please delete it in one of both wikis and try again."), (sp.name, ))
1324
2e29ef86be26 Reordered SyncPages, preparing for new modes.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1322
diff changeset
273 return
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
274 if sp.local_mime_type != sp.remote_mime_type:
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
275 self.log_status(ActionClass.WARN, _("The item %s has different mime types in both wikis and cannot be merged. Please delete it in one of both wikis or unify the mime type, and try again."), (sp.name, ))
1324
2e29ef86be26 Reordered SyncPages, preparing for new modes.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1322
diff changeset
276 return
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
277 if newest_tag.normalised_name != sp.name:
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
278 self.log_status(ActionClass.WARN, _("The item %s was renamed locally. This is not implemented yet. Therefore the full syncronisation history is lost for this page."), (sp.name, )) # XXX implement renames
1304
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
279 else:
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
280 normalised_name = newest_tag.normalised_name
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
281 local_rev = newest_tag.current_rev
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
282 remote_rev = newest_tag.remote_rev
f103cf7c371e Detect renamed pages. Changed the getDiff interface.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1303
diff changeset
283 old_contents = Page(self.request, local_pagename, rev=newest_tag.current_rev).get_raw_body_str() # YYY direct access
1136
4ba6da7e23a4 Started implementing the merging process. Not working yet.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1135
diff changeset
284
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
285 self.log_status(ActionClass.INFO, _("Synchronising page %s with remote page %s ..."), (local_pagename, sp.remote_name))
1158
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
286
1267
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
287 if direction == DOWN:
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
288 remote_rev = None # always fetch the full page, ignore remote conflict check
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
289 patch_base_contents = ""
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
290 else:
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
291 patch_base_contents = old_contents
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
292
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
293 if remote_rev != sp.remote_rev:
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
294 if sp.remote_deleted: # ignore remote changes
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
295 current_remote_rev = sp.remote_rev
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
296 is_remote_conflict = False
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
297 diff = None
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
298 self.log_status(ActionClass.WARN, _("The page %s was deleted remotely but changed locally."), (sp.name, ))
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
299 else:
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
300 diff_result = remote.get_diff(sp.remote_name, remote_rev, None, normalised_name)
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
301 if diff_result is None:
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
302 self.log_status(ActionClass.ERROR, _("The page %s could not be synced. The remote page was renamed. This is not supported yet. You may want to delete one of the pages to get it synced."), (sp.remote_name, ))
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
303 return
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
304 is_remote_conflict = diff_result["conflict"]
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
305 assert diff_result["diffversion"] == 1
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
306 diff = diff_result["diff"]
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
307 current_remote_rev = diff_result["current"]
1259
a76ce7b95190 SyncPages fixes, allow for the case where only the local page is changed.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1254
diff changeset
308 else:
a76ce7b95190 SyncPages fixes, allow for the case where only the local page is changed.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1254
diff changeset
309 current_remote_rev = remote_rev
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
310 if sp.local_mime_type == MIMETYPE_MOIN:
1303
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
311 is_remote_conflict = wikiutil.containsConflictMarker(old_contents.decode("utf-8"))
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
312 else:
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
313 is_remote_conflict = NotImplemented
1259
a76ce7b95190 SyncPages fixes, allow for the case where only the local page is changed.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1254
diff changeset
314 diff = None
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
315
1251
7b128ea29fc4 Further bug fixes in SyncPages and wikisync
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1164
diff changeset
316 # do not sync if the conflict is remote and local, or if it is local
7b128ea29fc4 Further bug fixes in SyncPages and wikisync
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1164
diff changeset
317 # and the page has never been syncronised
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
318 if (sp.local_mime_type == MIMETYPE_MOIN and wikiutil.containsConflictMarker(current_page.get_raw_body()) # YYY direct access
1251
7b128ea29fc4 Further bug fixes in SyncPages and wikisync
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1164
diff changeset
319 and (remote_rev is None or is_remote_conflict)):
1320
a36c70e5f0dd Reworked i18n and logging support, from now on, the log is attached to the job page.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1304
diff changeset
320 self.log_status(ActionClass.WARN, _("Skipped page %s because of a locally or remotely unresolved conflict."), (local_pagename, ))
1324
2e29ef86be26 Reordered SyncPages, preparing for new modes.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1322
diff changeset
321 return
1251
7b128ea29fc4 Further bug fixes in SyncPages and wikisync
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1164
diff changeset
322
1267
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
323 if remote_rev is None and direction == BOTH:
1386
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
324 self.log_status(ActionClass.INFO, _("This is the first synchronisation between the local and the remote wiki for the page %s."), (sp.name, ))
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
325
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
326 if sp.remote_deleted:
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
327 remote_contents = ""
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
328 elif diff is None:
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
329 remote_contents = old_contents
1259
a76ce7b95190 SyncPages fixes, allow for the case where only the local page is changed.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1254
diff changeset
330 else:
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
331 remote_contents = patch(patch_base_contents, decompress(diff))
1041
f9568edf1ff0 Introduced MoinLocalWiki class, added code that compares page lists for testing.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1030
diff changeset
332
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
333 if sp.local_mime_type == MIMETYPE_MOIN:
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
334 remote_contents_unicode = remote_contents.decode("utf-8")
1332
16a854a172c9 Implemented support for deleted pages, finished support for pages that are just in one wiki.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1330
diff changeset
335 # here, the actual 3-way merge happens
1391
bcabe48fc2f6 Fixed bug in diff3.py that silently truncated pages if there was content added on one side at the end.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1387
diff changeset
336 merged_text = diff3.text_merge(old_contents.decode("utf-8"), remote_contents_unicode, current_page.get_raw_body(), 1, *conflict_markers) # YYY direct access
1330
df88b475c1f0 Reworked debugging.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1329
diff changeset
337 if debug:
1391
bcabe48fc2f6 Fixed bug in diff3.py that silently truncated pages if there was content added on one side at the end.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1387
diff changeset
338 self.log_status(ActionClass.INFO, raw_suffix="Merging %r, %r and %r into %r" % (old_contents.decode("utf-8"), remote_contents_unicode, current_page.get_raw_body(), merged_text))
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
339 merged_text_raw = merged_text.encode("utf-8")
1303
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
340 else:
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
341 if diff is None:
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
342 merged_text_raw = remote_contents
1303
a0b8e78621d0 Preliminary support for items of different mime types.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1299
diff changeset
343 else:
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
344 merged_text_raw = current_page.get_raw_body_str() # YYY direct access
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
345
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
346 diff = textdiff(remote_contents, merged_text_raw)
1330
df88b475c1f0 Reworked debugging.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1329
diff changeset
347 if debug:
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
348 self.log_status(ActionClass.INFO, raw_suffix="Diff against %r" % remote_contents)
1260
5d555ec6b40a Fixed a bug that was hard to track down in SyncPages (some hours spent :-/).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1259
diff changeset
349
1158
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
350 # XXX upgrade to write lock
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
351 try:
1385
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
352 local_change_done = True
1387
fd3ceaad98d1 Fixed the new remote page scenario.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1386
diff changeset
353 current_page.saveText(merged_text, sp.local_rev or 0, comment=comment) # YYY direct access
1259
a76ce7b95190 SyncPages fixes, allow for the case where only the local page is changed.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1254
diff changeset
354 except PageEditor.Unchanged:
1385
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
355 local_change_done = False
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
356 except PageEditor.EditConflict:
1385
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
357 local_change_done = False
1141
0390d7857d87 Work on SyncPages, fixed prefix handling, wrote initial merge loop.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1136
diff changeset
358 assert False, "You stumbled on a problem with the current storage system - I cannot lock pages"
1261
ae9eb32b6899 Refactored code, cleaned up some parts of the code, moved some classes to wikisync
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1260
diff changeset
359
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
360 new_local_rev = current_page.get_real_rev() # YYY direct access
1261
ae9eb32b6899 Refactored code, cleaned up some parts of the code, moved some classes to wikisync
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1260
diff changeset
361
1385
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
362 def rollback_local_change(): # YYY direct local access
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
363 rev = new_local_rev - 1
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
364 revstr = '%08d' % rev
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
365 oldpg = Page(self.request, sp.local_name, rev=rev)
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
366 pg = PageEditor(self.request, sp.local_name)
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
367 savemsg = pg.saveText(oldpg.get_raw_body(), 0, comment=u"Wikisync rollback", extra=revstr, action="SAVE/REVERT")
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
368
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
369 try:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
370 if direction == BOTH:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
371 try:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
372 very_current_remote_rev = remote.merge_diff(sp.remote_name, compress(diff), new_local_rev, current_remote_rev, current_remote_rev, local_full_iwid, sp.name)
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
373 except NotAllowedException:
1386
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
374 self.log_status(ActionClass.ERROR, _("The page %s could not be merged because you are not allowed to modify the page in the remote wiki."), (sp.name, ))
1385
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
375 return
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
376 else:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
377 very_current_remote_rev = current_remote_rev
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
378
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
379 local_change_done = False # changes are committed remotely, all is fine
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
380 finally:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
381 if local_change_done:
8bf6e48c6236 Added rollback and exception logging to SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1352
diff changeset
382 rollback_local_change()
1267
eb9e5e21b0e5 Implemented the DOWN direction, refactored direction handling. The synctags of older syncs are invalid now, you have to delete them.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1266
diff changeset
383
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
384 tags.add(remote_wiki=remote_full_iwid, remote_rev=very_current_remote_rev, current_rev=new_local_rev, direction=direction, normalised_name=sp.name)
1158
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
385
1350
650a2dc16b19 Renamed some variables in SyncPages, added more YYY markers.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1349
diff changeset
386 if sp.local_mime_type != MIMETYPE_MOIN or not wikiutil.containsConflictMarker(merged_text):
1386
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
387 self.log_status(ActionClass.INFO, _("Page %s successfully merged."), (sp.name, ))
1158
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
388 else:
1386
0559fa036536 Added authentication support, fixed a few messages (added pagename).
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1385
diff changeset
389 self.log_status(ActionClass.WARN, _("Page %s merged with conflicts."), (sp.name, ))
1158
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
390
353c493dfb77 Added local conflict detection, logging support to SyncPages, updated my CHANGES file.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1141
diff changeset
391 # XXX release lock
1030
807f80c76d81 Work on SyncPages. Fixed a few bugs, added new method to RemoteWiki, build regexes from the RemotePageList.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 977
diff changeset
392
1349
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
393 for sp in m_pages:
4d2dd952a513 Refactoring: Renamed rp to sp in SyncPages.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1344
diff changeset
394 handle_page(sp)
1324
2e29ef86be26 Reordered SyncPages, preparing for new modes.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1322
diff changeset
395
2e29ef86be26 Reordered SyncPages, preparing for new modes.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1322
diff changeset
396
968
3108c8b2597e Add preliminary SyncPages action.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
diff changeset
397 def execute(pagename, request):
971
d24f2b1d606a Refactoring, fixed Fault codes, fixed return format of the getdiff method.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 970
diff changeset
398 ActionClass(pagename, request).render()
1344
564cc2b53ea9 Reworded a docstring in SyncPages.sync, whitespace cleanup.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1343
diff changeset
399