Mercurial > evolve
annotate hgext/qsync.py @ 520:a426301ab306 stable
Conditionnaly add the `hidden` revset symbol
Mercurial Core#default now have it (but 2.3 don't)
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Sun, 26 Aug 2012 12:04:16 +0200 |
parents | 9825c7da5b54 |
children | 89c8550019d0 b80de587d72d |
rev | line source |
---|---|
519
9825c7da5b54
ensure all file have a copyright notice
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
491
diff
changeset
|
1 # Copyright 2011 Logilab SA <contact@logilab.fr> |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
220
diff
changeset
|
2 """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
|
3 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
4 import re |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
5 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
|
6 import json |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
7 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
8 from mercurial.i18n import _ |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
9 from mercurial import commands |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
10 from mercurial import patch |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
11 from mercurial import util |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
12 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
|
13 from mercurial import cmdutil |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
14 from mercurial import hg |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
15 from mercurial import scmutil |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
16 from mercurial import error |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
17 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
|
18 from mercurial import phases |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
19 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
20 ### old compat code |
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 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
23 BRANCHNAME="qsubmit2" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
24 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
25 ### new command |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
26 ############################# |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
27 cmdtable = {} |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
28 command = cmdutil.command(cmdtable) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
29 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
30 @command('^qsync|sync', |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
31 [ |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
32 ('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
|
33 ], |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
34 '') |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
35 def cmdsync(ui, repo, **opts): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
36 '''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
|
37 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
38 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
|
39 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
40 * 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
|
41 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
42 * one patch per draft changeset |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
43 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
44 * 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
|
45 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
46 * qsubmitdata holding useful information |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
47 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
48 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
|
49 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
50 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
|
51 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
52 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
|
53 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
54 .. 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
|
55 interleaved changeset will appear interleaved. |
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 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
58 review = 'edit' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
59 if opts['review_all']: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
60 review = 'all' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
61 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
|
62 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
|
63 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
|
64 |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
65 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
66 parent = mqrepo[BRANCHNAME] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
67 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
|
68 parent = initqsubmit(mqrepo) |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
69 store, data, touched = fillstore(repo, parent) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
70 if not touched: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
71 raise util.Abort('Nothing changed') |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
72 files = ['qsubmitdata', 'series'] + touched |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
73 # mark some as ready for review |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
74 message = 'qsubmit commit\n\n' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
75 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
|
76 applied_list = [] |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
77 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
|
78 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
|
79 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
|
80 |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
81 for patch_name in touched: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
82 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
83 store.getfile(patch_name) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
84 review_list.append(patch_name) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
85 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
|
86 oldnode = oldfiles[patch_name] |
491
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
394
diff
changeset
|
87 evolve = extensions.find('evolve') |
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
394
diff
changeset
|
88 newnodes = evolve.newerversion(repo, oldnode) |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
89 if newnodes: |
394
f2168d0b5700
qsync: ignore unexistent nodes
David Douard <david.douard@logilab.fr>
parents:
289
diff
changeset
|
90 newnodes = [n for n in newnodes if n and n[0] in repo] # remove killing |
220
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
91 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
|
92 # 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
|
93 pass |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
94 else: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
95 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
|
96 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
|
97 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
|
98 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
|
99 # 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
|
100 #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
|
101 # 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
|
102 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
|
103 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
|
104 # applied |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
105 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
|
106 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
|
107 # 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 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
|
109 else: |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
110 # draft |
ff3158d0d7e8
qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents:
216
diff
changeset
|
111 assert False, "Should be exported" |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
112 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
113 if review: |
249
bd0917068cc7
qsync: fix mq commit message generation
David Douard <david.douard@logilab.fr>
parents:
228
diff
changeset
|
114 if applied_list: |
bd0917068cc7
qsync: fix mq commit message generation
David Douard <david.douard@logilab.fr>
parents:
228
diff
changeset
|
115 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
|
116 if review_list: |
bd0917068cc7
qsync: fix mq commit message generation
David Douard <david.douard@logilab.fr>
parents:
228
diff
changeset
|
117 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
|
118 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
|
119 message, |
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 None, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
122 parent.branch(), files, store, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
123 editor=None) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
124 if review == 'edit': |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
125 memctx._text = cmdutil.commitforceeditor(mqrepo, memctx, []) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
126 mqrepo.savecommitmessage(memctx.description()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
127 n = memctx.commit() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
128 return 0 |
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 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
131 def makename(ctx): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
132 """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
|
133 descsummary = ctx.description().splitlines()[0] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
134 descsummary = re.sub(r'\s+', '_', descsummary) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
135 descsummary = re.sub(r'\W+', '', descsummary) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
136 if len(descsummary) > 45: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
137 descsummary = descsummary[:42] + '.' |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
138 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
|
139 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
140 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
141 def get_old_data(mqctx): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
142 """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
|
143 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
144 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
|
145 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
146 old_data = mqctx['qsubmitdata'] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
147 return json.loads(old_data.data()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
148 except error.LookupError: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
149 return [] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
150 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
151 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
|
152 """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
|
153 data = [] |
195
ccbadfae1d06
ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
153
diff
changeset
|
154 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
|
155 name = makename(ctx) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
156 data.append([ctx.hex(), makename(ctx)]) |
195
ccbadfae1d06
ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
153
diff
changeset
|
157 merges = repo.revs('draft() and merge()') |
ccbadfae1d06
ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
153
diff
changeset
|
158 if merges: |
ccbadfae1d06
ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
153
diff
changeset
|
159 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
|
160 return data |
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 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
163 def patchmq(repo, store, olddata, newdata): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
164 """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
|
165 finaldata = [] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
166 touched = set() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
167 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
|
168 usednew = set() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
169 usedold = set() |
491
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
394
diff
changeset
|
170 evolve = extensions.find('evolve') |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
171 for oldhex, oldname in olddata: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
172 if oldhex in usedold: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
173 continue # no duplicate |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
174 usedold.add(oldhex) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
175 oldname = str(oldname) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
176 oldnode = bin(oldhex) |
491
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
394
diff
changeset
|
177 newnodes = evolve.newerversion(repo, oldnode) |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
178 if newnodes: |
394
f2168d0b5700
qsync: ignore unexistent nodes
David Douard <david.douard@logilab.fr>
parents:
289
diff
changeset
|
179 newnodes = [n for n in newnodes if n and n[0] in repo] # remove killing |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
180 if len(newnodes) > 1: |
201
94360b577857
qsync: display short node repr on error
David Douard <david.douard@logilab.fr>
parents:
195
diff
changeset
|
181 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
|
182 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
|
183 if newnodes: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
184 # else, changeset have been killed |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
185 newnode = list(newnodes)[0][0] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
186 ctx = repo[newnode] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
187 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
|
188 fp = StringIO() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
189 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
|
190 data = fp.getvalue() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
191 store.setfile(oldname, data, (None, None)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
192 finaldata.append([ctx.hex(), oldname]) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
193 usednew.add(ctx.hex()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
194 touched.add(oldname) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
195 continue |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
196 if oldhex in currentdrafts: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
197 # 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
|
198 finaldata.append([oldhex, oldname]) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
199 usednew.add(ctx.hex()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
200 continue |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
201 touched.add(oldname) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
202 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
203 for newhex, newname in newdata: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
204 if newhex in usednew: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
205 continue |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
206 newnode = bin(newhex) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
207 ctx = repo[newnode] |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
208 fp = StringIO() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
209 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
|
210 data = fp.getvalue() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
211 store.setfile(newname, data, (None, None)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
212 finaldata.append([ctx.hex(), newname]) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
213 touched.add(newname) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
214 # sort by branchrev number |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
215 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
|
216 # sort touched too (ease review list) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
217 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
|
218 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
|
219 return finaldata, stouched |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
220 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
221 def sort_key(ctx): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
222 """ctx sort key: (branch, rev)""" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
223 return (ctx.branch(), ctx.rev()) |
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 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
226 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
|
227 """fill store with patch data""" |
153
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
228 olddata = get_old_data(basemqctx) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
229 newdata = get_current_data(repo) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
230 store = patch.filestore() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
231 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
232 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
|
233 # put all name in the series |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
234 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
|
235 store.setfile('series', series, (False, False)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
236 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
237 # export data to ease futur work |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
238 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
|
239 (False, False)) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
240 finally: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
241 store.close() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
242 return store, data, touched |
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 |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
245 def initqsubmit(mqrepo): |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
246 """create initial qsubmit branch""" |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
247 store = patch.filestore() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
248 try: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
249 files = set() |
216
9400e234b3d7
qsync: add a warning file in qsync changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
201
diff
changeset
|
250 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
|
251 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
|
252 memctx = patch.makememctx(mqrepo, (nullid, nullid), |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
253 'qsubmit init', |
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 None, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
256 BRANCHNAME, ('.hgignore',), store, |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
257 editor=None) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
258 mqrepo.savecommitmessage(memctx.description()) |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
259 n = memctx.commit() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
260 finally: |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
261 store.close() |
c088f503cc97
add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
262 return mqrepo[n] |