hgext/qsync.py
author Pierre-Yves David <pierre-yves.david@logilab.fr>
Fri, 14 Sep 2012 15:36:29 +0200
branchstable
changeset 562 b1bdcb4506de
parent 519 9825c7da5b54
child 588 89c8550019d0
child 607 b80de587d72d
permissions -rw-r--r--
hg prune: prevent empty call
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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]