Mercurial > evolve
annotate hgext/qsync.py @ 289:9bb4217ddfce
[qsync] fix: 'newerversion' expect node id, not hexid
author | David Douard <david.douard@logilab.fr> |
---|---|
date | Mon, 11 Jun 2012 11:59:08 +0200 |
parents | a60d11973ff3 |
children | f2168d0b5700 |
rev | line source |
---|---|
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
220
diff
changeset
|
1 """synchronize patches queues and evolving changesets""" |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
2 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
3 import re |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
4 from cStringIO import StringIO |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
5 import json |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
6 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
7 from mercurial.i18n import _ |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
8 from mercurial import commands |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
9 from mercurial import patch |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
10 from mercurial import util |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
11 from mercurial.node import nullid, hex, short, bin |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
12 from mercurial import cmdutil |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
13 from mercurial import hg |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
14 from mercurial import scmutil |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
15 from mercurial import error |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
16 from mercurial import extensions |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
17 from mercurial import phases |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
18 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
19 ### old compat code |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
20 ############################# |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
21 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
22 BRANCHNAME="qsubmit2" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
23 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
24 ### new command |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
25 ############################# |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
26 cmdtable = {} |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
27 command = cmdutil.command(cmdtable) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
28 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
29 @command('^qsync|sync', |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
30 [ |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
31 ('a', 'review-all', False, _('mark all touched patches ready for review (no editor)')), |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
32 ], |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
33 '') |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
34 def cmdsync(ui, repo, **opts): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
35 '''Export draft changeset as mq patch in a mq patches repository commit. |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
36 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
37 This command get all changesets in draft phase and create an mq changeset: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
38 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
39 * on a "qsubmit2" branch (based on the last changeset) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
40 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
41 * one patch per draft changeset |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
42 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
43 * a series files listing all generated patch |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
44 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
45 * qsubmitdata holding useful information |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
46 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
47 It does use obsolete relation to update patches that already existing in the qsubmit2 branch. |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
48 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
49 Already existing patch which became public, draft or got killed are remove from the mq repo. |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
50 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
51 Patch name are generated using the summary line for changeset description. |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
52 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
53 .. warning:: Series files is ordered topologically. So two series with |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
54 interleaved changeset will appear interleaved. |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
55 ''' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
56 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
57 review = 'edit' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
58 if opts['review_all']: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
59 review = 'all' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
60 mqrepo = repo.mq.qrepo() |
251
a60d11973ff3
[qsync] abort properly of a patches repository does not exists
David Douard <david.douard@logilab.fr>
parents:
249
diff
changeset
|
61 if mqrepo is None: |
a60d11973ff3
[qsync] abort properly of a patches repository does not exists
David Douard <david.douard@logilab.fr>
parents:
249
diff
changeset
|
62 raise util.Abort('No patches repository') |
a60d11973ff3
[qsync] abort properly of a patches repository does not exists
David Douard <david.douard@logilab.fr>
parents:
249
diff
changeset
|
63 |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
64 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
65 parent = mqrepo[BRANCHNAME] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
66 except error.RepoLookupError: |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
67 parent = initqsubmit(mqrepo) |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
68 store, data, touched = fillstore(repo, parent) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
69 if not touched: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
70 raise util.Abort('Nothing changed') |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
71 files = ['qsubmitdata', 'series'] + touched |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
72 # mark some as ready for review |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
73 message = 'qsubmit commit\n\n' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
74 review_list = [] |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
75 applied_list = [] |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
76 if review: |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
77 olddata = get_old_data(parent) |
289
9bb4217ddfce
[qsync] fix: 'newerversion' expect node id, not hexid
David Douard <david.douard@logilab.fr>
parents:
251
diff
changeset
|
78 oldfiles = dict([(name, bin(ctxhex)) for ctxhex, name in olddata]) |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
79 |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
80 for patch_name in touched: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
81 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
82 store.getfile(patch_name) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
83 review_list.append(patch_name) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
84 except IOError: |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
85 oldnode = oldfiles[patch_name] |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
86 obsolete = extensions.find('obsolete') |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
87 newnodes = obsolete.newerversion(repo, oldnode) |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
88 if newnodes: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
89 newnodes = [n for n in newnodes if n] # remove killing |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
90 if not newnodes: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
91 # changeset has been killed (eg. reject) |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
92 pass |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
93 else: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
94 assert len(newnodes) == 1 # conflict!!! |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
95 newnode = newnodes[0] |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
96 assert len(newnode) == 1 # split unsupported for now |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
97 newnode = list(newnode)[0] |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
98 # XXX unmanaged case where a cs is obsoleted by an unavailable one |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
99 #if newnode.node() not in repo.changelog.nodemap: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
100 # raise util.Abort('%s is obsoleted by an unknown node %s'% (oldnode, newnode)) |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
101 ctx = repo[newnode] |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
102 if ctx.phase() == phases.public: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
103 # applied |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
104 applied_list.append(patch_name) |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
105 elif ctx.phase() == phases.secret: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
106 # already exported changeset is now secret |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
107 repo.ui.warn("An already exported changeset is now secret!!!") |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
108 else: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
109 # draft |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
110 assert False, "Should be exported" |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
111 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
112 if review: |
249
bd0917068cc7
qsync: fix mq commit message generation
David Douard <david.douard@logilab.fr>
parents:
228
diff
changeset
|
113 if applied_list: |
bd0917068cc7
qsync: fix mq commit message generation
David Douard <david.douard@logilab.fr>
parents:
228
diff
changeset
|
114 message += '\n'.join('* applied %s' % x for x in applied_list) + '\n' |
bd0917068cc7
qsync: fix mq commit message generation
David Douard <david.douard@logilab.fr>
parents:
228
diff
changeset
|
115 if review_list: |
bd0917068cc7
qsync: fix mq commit message generation
David Douard <david.douard@logilab.fr>
parents:
228
diff
changeset
|
116 message += '\n'.join('* %s ready for review' % x for x in review_list) + '\n' |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
117 memctx = patch.makememctx(mqrepo, (parent.node(), nullid), |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
118 message, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
119 None, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
120 None, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
121 parent.branch(), files, store, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
122 editor=None) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
123 if review == 'edit': |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
124 memctx._text = cmdutil.commitforceeditor(mqrepo, memctx, []) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
125 mqrepo.savecommitmessage(memctx.description()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
126 n = memctx.commit() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
127 return 0 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
128 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
129 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
130 def makename(ctx): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
131 """create a patch name form a changeset""" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
132 descsummary = ctx.description().splitlines()[0] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
133 descsummary = re.sub(r'\s+', '_', descsummary) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
134 descsummary = re.sub(r'\W+', '', descsummary) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
135 if len(descsummary) > 45: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
136 descsummary = descsummary[:42] + '.' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
137 return '%s-%s.diff' % (ctx.branch().upper(), descsummary) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
138 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
139 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
140 def get_old_data(mqctx): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
141 """read qsubmit data to fetch previous export data |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
142 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
143 get old data from the content of an mq commit""" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
144 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
145 old_data = mqctx['qsubmitdata'] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
146 return json.loads(old_data.data()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
147 except error.LookupError: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
148 return [] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
149 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
150 def get_current_data(repo): |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
151 """Return what would be exported if no previous data exists""" |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
152 data = [] |
195
ccbadfae1d06
ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
153
diff
changeset
|
153 for ctx in repo.set('draft() - (obsolete() + merge())'): |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
154 name = makename(ctx) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
155 data.append([ctx.hex(), makename(ctx)]) |
195
ccbadfae1d06
ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
153
diff
changeset
|
156 merges = repo.revs('draft() and merge()') |
ccbadfae1d06
ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
153
diff
changeset
|
157 if merges: |
ccbadfae1d06
ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
153
diff
changeset
|
158 repo.ui.warn('ignoring %i merge\n' % len(merges)) |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
159 return data |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
160 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
161 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
162 def patchmq(repo, store, olddata, newdata): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
163 """export the mq patches and return all useful data to be exported""" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
164 finaldata = [] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
165 touched = set() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
166 currentdrafts = set(d[0] for d in newdata) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
167 usednew = set() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
168 usedold = set() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
169 obsolete = extensions.find('obsolete') |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
170 for oldhex, oldname in olddata: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
171 if oldhex in usedold: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
172 continue # no duplicate |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
173 usedold.add(oldhex) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
174 oldname = str(oldname) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
175 oldnode = bin(oldhex) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
176 newnodes = obsolete.newerversion(repo, oldnode) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
177 if newnodes: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
178 newnodes = [n for n in newnodes if n] # remove killing |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
179 if len(newnodes) > 1: |
201
94360b577857
qsync: display short node repr on error
David Douard <david.douard@logilab.fr>
parents:
195
diff
changeset
|
180 newnodes = [short(nodes[0]) for nodes in newnodes] |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
181 raise util.Abort('%s have more than one newer version: %s'% (oldname, newnodes)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
182 if newnodes: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
183 # else, changeset have been killed |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
184 newnode = list(newnodes)[0][0] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
185 ctx = repo[newnode] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
186 if ctx.hex() != oldhex and ctx.phase(): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
187 fp = StringIO() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
188 cmdutil.export(repo, [ctx.rev()], fp=fp) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
189 data = fp.getvalue() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
190 store.setfile(oldname, data, (None, None)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
191 finaldata.append([ctx.hex(), oldname]) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
192 usednew.add(ctx.hex()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
193 touched.add(oldname) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
194 continue |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
195 if oldhex in currentdrafts: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
196 # else changeset is now public or secret |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
197 finaldata.append([oldhex, oldname]) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
198 usednew.add(ctx.hex()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
199 continue |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
200 touched.add(oldname) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
201 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
202 for newhex, newname in newdata: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
203 if newhex in usednew: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
204 continue |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
205 newnode = bin(newhex) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
206 ctx = repo[newnode] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
207 fp = StringIO() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
208 cmdutil.export(repo, [ctx.rev()], fp=fp) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
209 data = fp.getvalue() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
210 store.setfile(newname, data, (None, None)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
211 finaldata.append([ctx.hex(), newname]) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
212 touched.add(newname) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
213 # sort by branchrev number |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
214 finaldata.sort(key=lambda x: sort_key(repo[x[0]])) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
215 # sort touched too (ease review list) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
216 stouched = [f[1] for f in finaldata if f[1] in touched] |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
217 stouched += [x for x in touched if x not in stouched] |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
218 return finaldata, stouched |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
219 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
220 def sort_key(ctx): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
221 """ctx sort key: (branch, rev)""" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
222 return (ctx.branch(), ctx.rev()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
223 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
224 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
225 def fillstore(repo, basemqctx): |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
226 """fill store with patch data""" |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
227 olddata = get_old_data(basemqctx) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
228 newdata = get_current_data(repo) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
229 store = patch.filestore() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
230 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
231 data, touched = patchmq(repo, store, olddata, newdata) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
232 # put all name in the series |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
233 series ='\n'.join(d[1] for d in data) + '\n' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
234 store.setfile('series', series, (False, False)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
235 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
236 # export data to ease futur work |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
237 store.setfile('qsubmitdata', json.dumps(data, indent=True), |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
238 (False, False)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
239 finally: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
240 store.close() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
241 return store, data, touched |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
242 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
243 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
244 def initqsubmit(mqrepo): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
245 """create initial qsubmit branch""" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
246 store = patch.filestore() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
247 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
248 files = set() |
216
9400e234b3d7
qsync: add a warning file in qsync changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
201
diff
changeset
|
249 store.setfile('DO-NOT-EDIT-THIS-WORKING-COPY-BY-HAND', 'WE WARNED YOU!', (False, False)) |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
250 store.setfile('.hgignore', '^status$\n', (False, False)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
251 memctx = patch.makememctx(mqrepo, (nullid, nullid), |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
252 'qsubmit init', |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
253 None, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
254 None, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
255 BRANCHNAME, ('.hgignore',), store, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
256 editor=None) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
257 mqrepo.savecommitmessage(memctx.description()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
258 n = memctx.commit() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
259 finally: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
260 store.close() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
261 return mqrepo[n] |