hgext/qsync.py
author Pierre-Yves David <pierre-yves.david@logilab.fr>
Tue, 22 May 2012 10:35:04 +0200
changeset 248 3538b06ae2d2
parent 228 5a17c0d41a00
child 249 bd0917068cc7
permissions -rw-r--r--
[doc] changes location of repo We now have a "stable" repo on bitbucket and a dev repo on logilab hg lab.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    61
    try:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    62
        parent = mqrepo[BRANCHNAME]
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    63
    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
    64
        parent = initqsubmit(mqrepo)
153
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    65
    store, data, touched = fillstore(repo, parent)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    66
    if not touched:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    67
        raise util.Abort('Nothing changed')
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    68
    files = ['qsubmitdata', 'series'] + touched
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    69
    # mark some as ready for review
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    70
    message = 'qsubmit commit\n\n'
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    71
    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
    72
    applied_list = []
153
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    73
    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
    74
        olddata = get_old_data(parent)
ff3158d0d7e8 qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents: 216
diff changeset
    75
        oldfiles = dict([(name, ctxhex) for ctxhex, name in olddata])
ff3158d0d7e8 qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents: 216
diff changeset
    76
153
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    77
        for patch_name in touched:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    78
            try:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    79
                store.getfile(patch_name)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    80
                review_list.append(patch_name)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    81
            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
    82
                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
    83
                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
    84
                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
    85
                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
    86
                    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
    87
                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
    88
                    # 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
    89
                    pass
ff3158d0d7e8 qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents: 216
diff changeset
    90
                else:
ff3158d0d7e8 qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents: 216
diff changeset
    91
                    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
    92
                    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
    93
                    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
    94
                    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
    95
                    # 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
    96
                    #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
    97
                    #    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
    98
                    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
    99
                    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
   100
                        # applied
ff3158d0d7e8 qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents: 216
diff changeset
   101
                        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
   102
                    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
   103
                        # 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
   104
                        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
   105
                    else:
ff3158d0d7e8 qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents: 216
diff changeset
   106
                        # draft
ff3158d0d7e8 qsync: support for synchronisation with applied patches from outer space and more
David Douard <david.douard@logilab.fr>
parents: 216
diff changeset
   107
                        assert False, "Should be exported"
153
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   108
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   109
    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
   110
        message += '\n'.join('* applied %s' % x for x in applied_list)
153
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   111
        message += '\n'.join('* %s ready for review' % x for x in review_list)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   112
    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
   113
                              message,
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   114
                              None,
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   115
                              None,
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   116
                              parent.branch(), files, store,
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   117
                              editor=None)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   118
    if review == 'edit':
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   119
        memctx._text = cmdutil.commitforceeditor(mqrepo, memctx, [])
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   120
    mqrepo.savecommitmessage(memctx.description())
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   121
    n = memctx.commit()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   122
    return 0
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   123
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   124
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   125
def makename(ctx):
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   126
    """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
   127
    descsummary = ctx.description().splitlines()[0]
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   128
    descsummary = re.sub(r'\s+', '_', descsummary)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   129
    descsummary = re.sub(r'\W+', '', descsummary)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   130
    if len(descsummary) > 45:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   131
        descsummary = descsummary[:42] + '.'
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   132
    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
   133
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   134
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   135
def get_old_data(mqctx):
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   136
    """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
   137
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   138
    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
   139
    try:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   140
        old_data = mqctx['qsubmitdata']
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   141
        return json.loads(old_data.data())
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   142
    except error.LookupError:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   143
        return []
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   144
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   145
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
   146
    """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
   147
    data = []
195
ccbadfae1d06 ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 153
diff changeset
   148
    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
   149
        name = makename(ctx)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   150
        data.append([ctx.hex(), makename(ctx)])
195
ccbadfae1d06 ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 153
diff changeset
   151
    merges = repo.revs('draft() and merge()')
ccbadfae1d06 ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 153
diff changeset
   152
    if merges:
ccbadfae1d06 ignore merge in qsync
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 153
diff changeset
   153
        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
   154
    return data
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   155
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   156
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   157
def patchmq(repo, store, olddata, newdata):
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   158
    """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
   159
    finaldata = []
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   160
    touched = set()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   161
    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
   162
    usednew = set()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   163
    usedold = set()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   164
    obsolete = extensions.find('obsolete')
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   165
    for oldhex, oldname in olddata:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   166
        if oldhex in usedold:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   167
            continue # no duplicate
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   168
        usedold.add(oldhex)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   169
        oldname = str(oldname)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   170
        oldnode = bin(oldhex)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   171
        newnodes = obsolete.newerversion(repo, oldnode)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   172
        if newnodes:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   173
            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
   174
            if len(newnodes) > 1:
201
94360b577857 qsync: display short node repr on error
David Douard <david.douard@logilab.fr>
parents: 195
diff changeset
   175
                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
   176
                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
   177
            if newnodes:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   178
                # else, changeset have been killed
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   179
                newnode = list(newnodes)[0][0]
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   180
                ctx = repo[newnode]
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   181
                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
   182
                    fp = StringIO()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   183
                    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
   184
                    data = fp.getvalue()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   185
                    store.setfile(oldname, data, (None, None))
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   186
                    finaldata.append([ctx.hex(), oldname])
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   187
                    usednew.add(ctx.hex())
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   188
                    touched.add(oldname)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   189
                    continue
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   190
        if oldhex in currentdrafts:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   191
            # 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
   192
            finaldata.append([oldhex, 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
            continue
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   195
        touched.add(oldname)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   196
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   197
    for newhex, newname in newdata:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   198
        if newhex in usednew:
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
        newnode = bin(newhex)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   201
        ctx = repo[newnode]
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   202
        fp = StringIO()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   203
        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
   204
        data = fp.getvalue()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   205
        store.setfile(newname, data, (None, None))
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   206
        finaldata.append([ctx.hex(), newname])
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   207
        touched.add(newname)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   208
    # sort by branchrev number
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   209
    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
   210
    # sort touched too (ease review list)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   211
    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
   212
    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
   213
    return finaldata, stouched
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   214
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   215
def sort_key(ctx):
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   216
    """ctx sort key: (branch, rev)"""
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   217
    return (ctx.branch(), ctx.rev())
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   218
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 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
   221
    """fill store with patch data"""
153
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   222
    olddata = get_old_data(basemqctx)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   223
    newdata = get_current_data(repo)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   224
    store = patch.filestore()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   225
    try:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   226
        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
   227
        # put all name in the series
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   228
        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
   229
        store.setfile('series', series, (False, False))
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   230
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   231
        # export data to ease futur work
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   232
        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
   233
                      (False, False))
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   234
    finally:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   235
        store.close()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   236
    return store, data, touched
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   237
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   238
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   239
def initqsubmit(mqrepo):
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   240
    """create initial qsubmit branch"""
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   241
    store = patch.filestore()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   242
    try:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   243
        files = set()
216
9400e234b3d7 qsync: add a warning file in qsync changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 201
diff changeset
   244
        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
   245
        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
   246
        memctx = patch.makememctx(mqrepo, (nullid, nullid),
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   247
                              'qsubmit init',
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   248
                              None,
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   249
                              None,
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   250
                              BRANCHNAME, ('.hgignore',), store,
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   251
                              editor=None)
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   252
        mqrepo.savecommitmessage(memctx.description())
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   253
        n = memctx.commit()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   254
    finally:
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   255
        store.close()
c088f503cc97 add qsync extension to mutable history
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   256
    return mqrepo[n]