hgext3rd/evolve/compat.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 25 Oct 2018 18:51:55 +0200
changeset 4219 a4d5dcc836ab
parent 3932 35b2d201eb71
child 4223 4a3d588e5311
permissions -rw-r--r--
branching; merge with stable
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2525
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     1
# Copyright 2017 Octobus <contact@octobus.net>
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     2
#
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     3
# This software may be used and distributed according to the terms of the
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     4
# GNU General Public License version 2 or any later version.
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     5
"""
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     6
Compatibility module
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     7
"""
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     8
3499
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
     9
import inspect
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
    10
2525
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    11
from mercurial import (
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    12
    context,
3882
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
    13
    copies,
3932
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
    14
    encoding,
3499
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
    15
    mdiff,
2751
4f560f117fff compat: use 'safehasattr' over 'hasattr'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2693
diff changeset
    16
    obsolete,
3693
105d2d2c6a2e compat: drop obsutile layer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3692
diff changeset
    17
    obsutil,
3767
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
    18
    repair,
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    19
    revset,
3767
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
    20
    scmutil,
2751
4f560f117fff compat: use 'safehasattr' over 'hasattr'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2693
diff changeset
    21
    util,
3692
f9988919d69e compat: drop vfsmod compat layer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3680
diff changeset
    22
    vfs as vfsmod,
2525
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    23
)
3524
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3514
diff changeset
    24
from mercurial.hgweb import hgweb_mod
2525
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    25
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    26
# hg < 4.6 compat (c8e2d6ed1f9e)
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    27
try:
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    28
    from mercurial import logcmdutil
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    29
    changesetdisplayer = logcmdutil.changesetdisplayer
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    30
    changesetprinter = logcmdutil.changesetprinter
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    31
    displaygraph = logcmdutil.displaygraph
3921
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3908
diff changeset
    32
    changesetdiffer = logcmdutil.changesetdiffer
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    33
except (AttributeError, ImportError):
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    34
    from mercurial import cmdutil
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    35
    changesetdisplayer = cmdutil.show_changeset
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    36
    changesetprinter = cmdutil.changeset_printer
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    37
    displaygraph = cmdutil.displaygraph
3921
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3908
diff changeset
    38
    changesetdiffer = None
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    39
2525
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    40
from . import (
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    41
    exthelper,
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    42
)
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    43
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    44
eh = exthelper.exthelper()
5adb8bdb935e compatibility: backport mercurial 176d1a0ce385
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    45
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3074
diff changeset
    46
def isobsnotesupported():
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3074
diff changeset
    47
    # hack to know obsnote is supported. The patches for obsnote support was
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3074
diff changeset
    48
    # pushed before the obsfateprinter patches, so this will serve as a good
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3074
diff changeset
    49
    # check
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3074
diff changeset
    50
    if not obsutil:
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3074
diff changeset
    51
        return False
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3074
diff changeset
    52
    return util.safehasattr(obsutil, 'obsfateprinter')
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3074
diff changeset
    53
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    54
# Evolution renaming compat
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    55
2854
66796d7b5415 warning: rename unstable warning message
Boris Feld <boris.feld@octobus.net>
parents: 2849
diff changeset
    56
TROUBLES = {}
66796d7b5415 warning: rename unstable warning message
Boris Feld <boris.feld@octobus.net>
parents: 2849
diff changeset
    57
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    58
if not util.safehasattr(context.basectx, 'orphan'):
2854
66796d7b5415 warning: rename unstable warning message
Boris Feld <boris.feld@octobus.net>
parents: 2849
diff changeset
    59
    TROUBLES['ORPHAN'] = 'unstable'
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    60
    context.basectx.orphan = context.basectx.unstable
2854
66796d7b5415 warning: rename unstable warning message
Boris Feld <boris.feld@octobus.net>
parents: 2849
diff changeset
    61
else:
66796d7b5415 warning: rename unstable warning message
Boris Feld <boris.feld@octobus.net>
parents: 2849
diff changeset
    62
    TROUBLES['ORPHAN'] = 'orphan'
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    63
2835
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
    64
if not util.safehasattr(context.basectx, 'contentdivergent'):
2856
f6517779a7c4 warning: rename warning message
Boris Feld <boris.feld@octobus.net>
parents: 2855
diff changeset
    65
    TROUBLES['CONTENTDIVERGENT'] = 'divergent'
2835
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
    66
    context.basectx.contentdivergent = context.basectx.divergent
2856
f6517779a7c4 warning: rename warning message
Boris Feld <boris.feld@octobus.net>
parents: 2855
diff changeset
    67
else:
2858
4b934144ed11 messages: use hyphenated '{phase,content}-divergent' in user messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 2856
diff changeset
    68
    TROUBLES['CONTENTDIVERGENT'] = 'content-divergent'
2835
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
    69
2836
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
    70
if not util.safehasattr(context.basectx, 'phasedivergent'):
2855
1db0137297f4 warning: rename bumped warning message
Boris Feld <boris.feld@octobus.net>
parents: 2854
diff changeset
    71
    TROUBLES['PHASEDIVERGENT'] = 'bumped'
2836
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
    72
    context.basectx.phasedivergent = context.basectx.bumped
2855
1db0137297f4 warning: rename bumped warning message
Boris Feld <boris.feld@octobus.net>
parents: 2854
diff changeset
    73
else:
2858
4b934144ed11 messages: use hyphenated '{phase,content}-divergent' in user messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 2856
diff changeset
    74
    TROUBLES['PHASEDIVERGENT'] = 'phase-divergent'
2836
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
    75
2839
f9c8c754a528 context: troubled was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2836
diff changeset
    76
if not util.safehasattr(context.basectx, 'isunstable'):
f9c8c754a528 context: troubled was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2836
diff changeset
    77
    context.basectx.isunstable = context.basectx.troubled
f9c8c754a528 context: troubled was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2836
diff changeset
    78
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    79
if not util.safehasattr(revset, 'orphan'):
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    80
    @eh.revset('orphan')
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    81
    def oprhanrevset(*args, **kwargs):
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    82
        return revset.unstable(*args, **kwargs)
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    83
2835
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
    84
if not util.safehasattr(revset, 'contentdivergent'):
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
    85
    @eh.revset('contentdivergent')
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
    86
    def contentdivergentrevset(*args, **kwargs):
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
    87
        return revset.divergent(*args, **kwargs)
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
    88
2836
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
    89
if not util.safehasattr(revset, 'phasedivergent'):
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
    90
    @eh.revset('phasedivergent')
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
    91
    def phasedivergentrevset(*args, **kwargs):
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
    92
        return revset.bumped(*args, **kwargs)
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
    93
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    94
if not util.safehasattr(context.basectx, 'instabilities'):
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    95
    def instabilities(self):
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    96
        """return the list of instabilities affecting this changeset.
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    97
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    98
        Instabilities are returned as strings. possible values are:
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
    99
         - orphan,
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
   100
         - phase-divergent,
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
   101
         - content-divergent.
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
   102
         """
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
   103
        instabilities = []
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
   104
        if self.orphan():
2849
95470e817c00 compat: fix instabilities compat
Boris Feld <boris.feld@octobus.net>
parents: 2847
diff changeset
   105
            instabilities.append('orphan')
2836
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
   106
        if self.phasedivergent():
feaa52680682 log: bumped was renamed into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 2835
diff changeset
   107
            instabilities.append('phase-divergent')
2835
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
   108
        if self.contentdivergent():
20c2499ce8bc log: divergent was renamed into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 2834
diff changeset
   109
            instabilities.append('content-divergent')
2834
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
   110
        return instabilities
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
   111
38db1466c6fb log: unstable was renamed into orphan
Boris Feld <boris.feld@octobus.net>
parents: 2794
diff changeset
   112
    context.basectx.instabilities = instabilities
2840
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2839
diff changeset
   113
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2839
diff changeset
   114
# XXX: Better detection of property cache
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2839
diff changeset
   115
if 'predecessors' not in dir(obsolete.obsstore):
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2839
diff changeset
   116
    @property
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2839
diff changeset
   117
    def predecessors(self):
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2839
diff changeset
   118
        return self.precursors
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2839
diff changeset
   119
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2839
diff changeset
   120
    obsolete.obsstore.predecessors = predecessors
2845
9fc6a4615ae5 revset: unstable volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2841
diff changeset
   121
9fc6a4615ae5 revset: unstable volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2841
diff changeset
   122
if not util.safehasattr(obsolete, '_computeorphanset'):
9fc6a4615ae5 revset: unstable volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2841
diff changeset
   123
    obsolete._computeorphanset = obsolete.cachefor('orphan')(obsolete._computeunstableset)
2846
9c019996bce0 revset: divergent volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2845
diff changeset
   124
9c019996bce0 revset: divergent volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2845
diff changeset
   125
if not util.safehasattr(obsolete, '_computecontentdivergentset'):
9c019996bce0 revset: divergent volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2845
diff changeset
   126
    obsolete._computecontentdivergentset = obsolete.cachefor('contentdivergent')(obsolete._computedivergentset)
2847
a1805a65ce21 revset: bumped volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2846
diff changeset
   127
a1805a65ce21 revset: bumped volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2846
diff changeset
   128
if not util.safehasattr(obsolete, '_computephasedivergentset'):
a1805a65ce21 revset: bumped volatile set was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2846
diff changeset
   129
    obsolete._computephasedivergentset = obsolete.cachefor('phasedivergent')(obsolete._computebumpedset)
3064
7a1a4d1f0958 pager: add a function in compats to start pager
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2858
diff changeset
   130
3298
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   131
def memfilectx(repo, ctx, fctx, flags, copied, path):
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   132
    # XXX Would it be better at the module level?
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   133
    varnames = context.memfilectx.__init__.__code__.co_varnames
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   134
    ctxmandatory = varnames[2] == "changectx"
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   135
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   136
    if ctxmandatory:
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   137
        mctx = context.memfilectx(repo, ctx, fctx.path(), fctx.data(),
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   138
                                  islink='l' in flags,
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   139
                                  isexec='x' in flags,
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   140
                                  copied=copied.get(path))
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   141
    else:
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   142
        mctx = context.memfilectx(repo, fctx.path(), fctx.data(),
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   143
                                  islink='l' in flags,
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   144
                                  isexec='x' in flags,
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   145
                                  copied=copied.get(path))
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   146
    return mctx
3408
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   147
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   148
def getcachevfs(repo):
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   149
    cachevfs = getattr(repo, 'cachevfs', None)
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   150
    if cachevfs is None:
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   151
        cachevfs = vfsmod.vfs(repo.vfs.join('cache'))
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   152
        cachevfs.createmode = repo.store.createmode
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3298
diff changeset
   153
    return cachevfs
3499
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   154
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   155
def strdiff(a, b, fn1, fn2):
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   156
    """ A version of mdiff.unidiff for comparing two strings
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   157
    """
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   158
    args = [a, '', b, '', fn1, fn2]
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   159
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   160
    # hg < 4.6 compat 8b6dd3922f70
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   161
    argspec = inspect.getargspec(mdiff.unidiff)
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   162
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   163
    if 'binary' in argspec.args:
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   164
        args.append(False)
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   165
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3483
diff changeset
   166
    return mdiff.unidiff(*args)
3514
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   167
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   168
# date related
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   169
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   170
try:
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   171
    import mercurial.utils.dateutil
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   172
    makedate = mercurial.utils.dateutil.makedate
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   173
    parsedate = mercurial.utils.dateutil.parsedate
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   174
except ImportError as e:
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   175
    import mercurial.util
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   176
    makedate = mercurial.util.makedate
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3499
diff changeset
   177
    parsedate = mercurial.util.parsedate
3524
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3514
diff changeset
   178
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3514
diff changeset
   179
def wireprotocommand(exthelper, name, args='', permission='pull'):
3680
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   180
    try:
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   181
        # Since b4d85bc1
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   182
        from mercurial.wireprotov1server import wireprotocommand
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   183
        return wireprotocommand(name, args, permission=permission)
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   184
    except (ImportError, AttributeError):
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   185
        from mercurial import wireproto
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   186
3524
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3514
diff changeset
   187
    if 3 <= len(wireproto.wireprotocommand.func_defaults):
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3514
diff changeset
   188
        return wireproto.wireprotocommand(name, args, permission=permission)
6d4095e6bdd3 obsdiscovery: add compatibility layer to register wireproto command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3514
diff changeset
   189
3680
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   190
    # <= hg-4.5 permission must be registered in dictionnary
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   191
    def decorator(func):
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   192
        @eh.extsetup
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   193
        def install(ui):
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   194
            hgweb_mod.perms[name] = permission
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   195
            wireproto.commands[name] = (func, args)
e2a91d4d207d evolve: handle wireproto module deletion for registering new commands
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3668
diff changeset
   196
    return decorator
3616
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   197
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   198
# mercurial <= 4.5 do not have the updateresult object
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   199
try:
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   200
    from mercurial.merge import updateresult
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   201
except (ImportError, AttributeError):
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   202
    updateresult = None
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   203
3767
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
   204
# 46c2b19a1263f18a5829a21b7a5053019b0c5a31 in hg moved repair.stripbmrevset to
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
   205
# scmutil.bookmarkrevs
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
   206
# This change is a part of 4.7 cycle, so drop this when we drop support for 4.6
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
   207
try:
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
   208
    bmrevset = repair.stripbmrevset
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
   209
except AttributeError:
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
   210
    bmrevset = scmutil.bookmarkrevs
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3701
diff changeset
   211
3616
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   212
def hasconflict(upres):
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   213
    if updateresult is None:
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   214
        return bool(upres[-1])
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3575
diff changeset
   215
    return bool(upres.unresolvedcount)
3882
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   216
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   217
# code imported from Mercurial core at ae17555ef93f + patch
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   218
def fixedcopytracing(repo, c1, c2, base):
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   219
    """A complete copy-patse of copies._fullcopytrace with a one line fix to
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   220
    handle when the base is not parent of both c1 and c2. This should be
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   221
    converted in a compat function once https://phab.mercurial-scm.org/D3896
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   222
    gets in and once we drop support for 4.7, this should be removed."""
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   223
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   224
    from mercurial import pathutil
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   225
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   226
    # In certain scenarios (e.g. graft, update or rebase), base can be
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   227
    # overridden We still need to know a real common ancestor in this case We
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   228
    # can't just compute _c1.ancestor(_c2) and compare it to ca, because there
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   229
    # can be multiple common ancestors, e.g. in case of bidmerge.  Because our
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   230
    # caller may not know if the revision passed in lieu of the CA is a genuine
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   231
    # common ancestor or not without explicitly checking it, it's better to
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   232
    # determine that here.
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   233
    #
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   234
    # base.isancestorof(wc) is False, work around that
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   235
    _c1 = c1.p1() if c1.rev() is None else c1
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   236
    _c2 = c2.p1() if c2.rev() is None else c2
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   237
    # an endpoint is "dirty" if it isn't a descendant of the merge base
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   238
    # if we have a dirty endpoint, we need to trigger graft logic, and also
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   239
    # keep track of which endpoint is dirty
3908
2af10d0a59e0 compat: use older API for older version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3882
diff changeset
   240
    if util.safehasattr(base, 'isancestorof'):
2af10d0a59e0 compat: use older API for older version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3882
diff changeset
   241
        dirtyc1 = not base.isancestorof(_c1)
2af10d0a59e0 compat: use older API for older version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3882
diff changeset
   242
        dirtyc2 = not base.isancestorof(_c2)
2af10d0a59e0 compat: use older API for older version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3882
diff changeset
   243
    else: # hg <= 4.6
2af10d0a59e0 compat: use older API for older version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3882
diff changeset
   244
        dirtyc1 = not base.descendant(_c1)
2af10d0a59e0 compat: use older API for older version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3882
diff changeset
   245
        dirtyc2 = not base.descendant(_c2)
3882
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   246
    graft = dirtyc1 or dirtyc2
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   247
    tca = base
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   248
    if graft:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   249
        tca = _c1.ancestor(_c2)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   250
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   251
    limit = copies._findlimit(repo, c1.rev(), c2.rev())
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   252
    if limit is None:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   253
        # no common ancestor, no copies
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   254
        return {}, {}, {}, {}, {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   255
    repo.ui.debug("  searching for copies back to rev %d\n" % limit)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   256
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   257
    m1 = c1.manifest()
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   258
    m2 = c2.manifest()
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   259
    mb = base.manifest()
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   260
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   261
    # gather data from _checkcopies:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   262
    # - diverge = record all diverges in this dict
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   263
    # - copy = record all non-divergent copies in this dict
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   264
    # - fullcopy = record all copies in this dict
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   265
    # - incomplete = record non-divergent partial copies here
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   266
    # - incompletediverge = record divergent partial copies here
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   267
    diverge = {} # divergence data is shared
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   268
    incompletediverge = {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   269
    data1 = {'copy': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   270
             'fullcopy': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   271
             'incomplete': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   272
             'diverge': diverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   273
             'incompletediverge': incompletediverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   274
            }
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   275
    data2 = {'copy': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   276
             'fullcopy': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   277
             'incomplete': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   278
             'diverge': diverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   279
             'incompletediverge': incompletediverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   280
            }
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   281
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   282
    # find interesting file sets from manifests
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   283
    addedinm1 = m1.filesnotin(mb)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   284
    addedinm2 = m2.filesnotin(mb)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   285
    bothnew = sorted(addedinm1 & addedinm2)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   286
    if tca == base:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   287
        # unmatched file from base
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   288
        u1r, u2r = copies._computenonoverlap(repo, c1, c2, addedinm1, addedinm2)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   289
        u1u, u2u = u1r, u2r
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   290
    else:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   291
        # unmatched file from base (DAG rotation in the graft case)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   292
        u1r, u2r = copies._computenonoverlap(repo, c1, c2, addedinm1, addedinm2,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   293
                                             baselabel='base')
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   294
        # unmatched file from topological common ancestors (no DAG rotation)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   295
        # need to recompute this for directory move handling when grafting
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   296
        mta = tca.manifest()
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   297
        u1u, u2u = copies._computenonoverlap(repo, c1, c2, m1.filesnotin(mta),
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   298
                                             m2.filesnotin(mta),
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   299
                                             baselabel='topological common ancestor')
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   300
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   301
    for f in u1u:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   302
        copies._checkcopies(c1, c2, f, base, tca, dirtyc1, limit, data1)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   303
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   304
    for f in u2u:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   305
        copies._checkcopies(c2, c1, f, base, tca, dirtyc2, limit, data2)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   306
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   307
    copy = dict(data1['copy'])
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   308
    copy.update(data2['copy'])
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   309
    fullcopy = dict(data1['fullcopy'])
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   310
    fullcopy.update(data2['fullcopy'])
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   311
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   312
    if dirtyc1:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   313
        copies._combinecopies(data2['incomplete'], data1['incomplete'], copy, diverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   314
                              incompletediverge)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   315
    else:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   316
        copies._combinecopies(data1['incomplete'], data2['incomplete'], copy, diverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   317
                              incompletediverge)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   318
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   319
    renamedelete = {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   320
    renamedeleteset = set()
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   321
    divergeset = set()
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   322
    for of, fl in list(diverge.items()):
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   323
        if len(fl) == 1 or of in c1 or of in c2:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   324
            del diverge[of] # not actually divergent, or not a rename
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   325
            if of not in c1 and of not in c2:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   326
                # renamed on one side, deleted on the other side, but filter
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   327
                # out files that have been renamed and then deleted
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   328
                renamedelete[of] = [f for f in fl if f in c1 or f in c2]
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   329
                renamedeleteset.update(fl) # reverse map for below
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   330
        else:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   331
            divergeset.update(fl) # reverse map for below
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   332
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   333
    if bothnew:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   334
        repo.ui.debug("  unmatched files new in both:\n   %s\n"
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   335
                      % "\n   ".join(bothnew))
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   336
    bothdiverge = {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   337
    bothincompletediverge = {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   338
    remainder = {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   339
    both1 = {'copy': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   340
             'fullcopy': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   341
             'incomplete': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   342
             'diverge': bothdiverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   343
             'incompletediverge': bothincompletediverge
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   344
            }
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   345
    both2 = {'copy': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   346
             'fullcopy': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   347
             'incomplete': {},
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   348
             'diverge': bothdiverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   349
             'incompletediverge': bothincompletediverge
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   350
            }
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   351
    for f in bothnew:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   352
        copies._checkcopies(c1, c2, f, base, tca, dirtyc1, limit, both1)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   353
        copies._checkcopies(c2, c1, f, base, tca, dirtyc2, limit, both2)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   354
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   355
    if dirtyc1 and dirtyc2:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   356
        pass
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   357
    elif dirtyc1:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   358
        # incomplete copies may only be found on the "dirty" side for bothnew
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   359
        assert not both2['incomplete']
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   360
        remainder = copies._combinecopies({}, both1['incomplete'], copy, bothdiverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   361
                                          bothincompletediverge)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   362
    elif dirtyc2:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   363
        assert not both1['incomplete']
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   364
        remainder = copies._combinecopies({}, both2['incomplete'], copy, bothdiverge,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   365
                                          bothincompletediverge)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   366
    else:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   367
        # incomplete copies and divergences can't happen outside grafts
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   368
        assert not both1['incomplete']
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   369
        assert not both2['incomplete']
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   370
        assert not bothincompletediverge
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   371
    for f in remainder:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   372
        assert f not in bothdiverge
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   373
        ic = remainder[f]
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   374
        if ic[0] in (m1 if dirtyc1 else m2):
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   375
            # backed-out rename on one side, but watch out for deleted files
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   376
            bothdiverge[f] = ic
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   377
    for of, fl in bothdiverge.items():
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   378
        if len(fl) == 2 and fl[0] == fl[1]:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   379
            copy[fl[0]] = of # not actually divergent, just matching renames
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   380
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   381
    if fullcopy and repo.ui.debugflag:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   382
        repo.ui.debug("  all copies found (* = to merge, ! = divergent, "
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   383
                      "% = renamed and deleted):\n")
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   384
        for f in sorted(fullcopy):
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   385
            note = ""
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   386
            if f in copy:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   387
                note += "*"
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   388
            if f in divergeset:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   389
                note += "!"
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   390
            if f in renamedeleteset:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   391
                note += "%"
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   392
            repo.ui.debug("   src: '%s' -> dst: '%s' %s\n" % (fullcopy[f], f,
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   393
                                                              note))
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   394
    del divergeset
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   395
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   396
    if not fullcopy:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   397
        return copy, {}, diverge, renamedelete, {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   398
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   399
    repo.ui.debug("  checking for directory renames\n")
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   400
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   401
    # generate a directory move map
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   402
    d1, d2 = c1.dirs(), c2.dirs()
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   403
    # Hack for adding '', which is not otherwise added, to d1 and d2
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   404
    d1.addpath('/')
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   405
    d2.addpath('/')
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   406
    invalid = set()
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   407
    dirmove = {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   408
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   409
    # examine each file copy for a potential directory move, which is
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   410
    # when all the files in a directory are moved to a new directory
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   411
    for dst, src in fullcopy.iteritems():
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   412
        dsrc, ddst = pathutil.dirname(src), pathutil.dirname(dst)
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   413
        if dsrc in invalid:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   414
            # already seen to be uninteresting
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   415
            continue
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   416
        elif dsrc in d1 and ddst in d1:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   417
            # directory wasn't entirely moved locally
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   418
            invalid.add(dsrc + "/")
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   419
        elif dsrc in d2 and ddst in d2:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   420
            # directory wasn't entirely moved remotely
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   421
            invalid.add(dsrc + "/")
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   422
        elif dsrc + "/" in dirmove and dirmove[dsrc + "/"] != ddst + "/":
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   423
            # files from the same directory moved to two different places
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   424
            invalid.add(dsrc + "/")
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   425
        else:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   426
            # looks good so far
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   427
            dirmove[dsrc + "/"] = ddst + "/"
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   428
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   429
    for i in invalid:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   430
        if i in dirmove:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   431
            del dirmove[i]
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   432
    del d1, d2, invalid
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   433
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   434
    if not dirmove:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   435
        return copy, {}, diverge, renamedelete, {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   436
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   437
    for d in dirmove:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   438
        repo.ui.debug("   discovered dir src: '%s' -> dst: '%s'\n" %
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   439
                      (d, dirmove[d]))
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   440
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   441
    movewithdir = {}
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   442
    # check unaccounted nonoverlapping files against directory moves
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   443
    for f in u1r + u2r:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   444
        if f not in fullcopy:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   445
            for d in dirmove:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   446
                if f.startswith(d):
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   447
                    # new file added in a directory that was moved, move it
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   448
                    df = dirmove[d] + f[len(d):]
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   449
                    if df not in copy:
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   450
                        movewithdir[f] = df
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   451
                        repo.ui.debug(("   pending file src: '%s' -> "
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   452
                                       "dst: '%s'\n") % (f, df))
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   453
                    break
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   454
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   455
    return copy, movewithdir, diverge, renamedelete, dirmove
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   456
3931
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   457
# code imported from Mercurial core at 4.3 + patch
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   458
def fixoldmergecopies(repo, c1, c2, base):
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   459
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   460
    from mercurial import pathutil
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   461
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   462
    # avoid silly behavior for update from empty dir
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   463
    if not c1 or not c2 or c1 == c2:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   464
        return {}, {}, {}, {}, {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   465
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   466
    # avoid silly behavior for parent -> working dir
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   467
    if c2.node() is None and c1.node() == repo.dirstate.p1():
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   468
        return repo.dirstate.copies(), {}, {}, {}, {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   469
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   470
    # Copy trace disabling is explicitly below the node == p1 logic above
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   471
    # because the logic above is required for a simple copy to be kept across a
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   472
    # rebase.
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   473
    if repo.ui.configbool('experimental', 'disablecopytrace'):
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   474
        return {}, {}, {}, {}, {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   475
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   476
    # In certain scenarios (e.g. graft, update or rebase), base can be
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   477
    # overridden We still need to know a real common ancestor in this case We
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   478
    # can't just compute _c1.ancestor(_c2) and compare it to ca, because there
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   479
    # can be multiple common ancestors, e.g. in case of bidmerge.  Because our
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   480
    # caller may not know if the revision passed in lieu of the CA is a genuine
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   481
    # common ancestor or not without explicitly checking it, it's better to
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   482
    # determine that here.
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   483
    #
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   484
    # base.descendant(wc) and base.descendant(base) are False, work around that
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   485
    _c1 = c1.p1() if c1.rev() is None else c1
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   486
    _c2 = c2.p1() if c2.rev() is None else c2
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   487
    # an endpoint is "dirty" if it isn't a descendant of the merge base
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   488
    # if we have a dirty endpoint, we need to trigger graft logic, and also
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   489
    # keep track of which endpoint is dirty
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   490
    dirtyc1 = not (base == _c1 or base.descendant(_c1))
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   491
    dirtyc2 = not (base == _c2 or base.descendant(_c2))
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   492
    graft = dirtyc1 or dirtyc2
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   493
    tca = base
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   494
    if graft:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   495
        tca = _c1.ancestor(_c2)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   496
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   497
    limit = copies._findlimit(repo, c1.rev(), c2.rev())
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   498
    if limit is None:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   499
        # no common ancestor, no copies
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   500
        return {}, {}, {}, {}, {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   501
    repo.ui.debug("  searching for copies back to rev %d\n" % limit)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   502
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   503
    m1 = c1.manifest()
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   504
    m2 = c2.manifest()
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   505
    mb = base.manifest()
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   506
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   507
    # gather data from _checkcopies:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   508
    # - diverge = record all diverges in this dict
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   509
    # - copy = record all non-divergent copies in this dict
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   510
    # - fullcopy = record all copies in this dict
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   511
    # - incomplete = record non-divergent partial copies here
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   512
    # - incompletediverge = record divergent partial copies here
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   513
    diverge = {} # divergence data is shared
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   514
    incompletediverge = {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   515
    data1 = {'copy': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   516
             'fullcopy': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   517
             'incomplete': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   518
             'diverge': diverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   519
             'incompletediverge': incompletediverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   520
            }
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   521
    data2 = {'copy': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   522
             'fullcopy': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   523
             'incomplete': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   524
             'diverge': diverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   525
             'incompletediverge': incompletediverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   526
            }
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   527
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   528
    # find interesting file sets from manifests
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   529
    addedinm1 = m1.filesnotin(mb)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   530
    addedinm2 = m2.filesnotin(mb)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   531
    bothnew = sorted(addedinm1 & addedinm2)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   532
    if tca == base:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   533
        # unmatched file from base
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   534
        u1r, u2r = copies._computenonoverlap(repo, c1, c2, addedinm1, addedinm2)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   535
        u1u, u2u = u1r, u2r
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   536
    else:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   537
        # unmatched file from base (DAG rotation in the graft case)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   538
        u1r, u2r = copies._computenonoverlap(repo, c1, c2, addedinm1, addedinm2,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   539
                                             baselabel='base')
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   540
        # unmatched file from topological common ancestors (no DAG rotation)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   541
        # need to recompute this for directory move handling when grafting
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   542
        mta = tca.manifest()
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   543
        u1u, u2u = copies._computenonoverlap(repo, c1, c2, m1.filesnotin(mta),
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   544
                                             m2.filesnotin(mta),
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   545
                                             baselabel='topological common ancestor')
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   546
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   547
    for f in u1u:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   548
        copies._checkcopies(c1, c2, f, base, tca, dirtyc1, limit, data1)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   549
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   550
    for f in u2u:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   551
        copies._checkcopies(c2, c1, f, base, tca, dirtyc2, limit, data2)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   552
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   553
    copy = dict(data1['copy'])
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   554
    copy.update(data2['copy'])
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   555
    fullcopy = dict(data1['fullcopy'])
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   556
    fullcopy.update(data2['fullcopy'])
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   557
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   558
    if dirtyc1:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   559
        copies._combinecopies(data2['incomplete'], data1['incomplete'], copy, diverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   560
                              incompletediverge)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   561
    else:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   562
        copies._combinecopies(data1['incomplete'], data2['incomplete'], copy, diverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   563
                              incompletediverge)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   564
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   565
    renamedelete = {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   566
    renamedeleteset = set()
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   567
    divergeset = set()
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   568
    for of, fl in diverge.items():
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   569
        if len(fl) == 1 or of in c1 or of in c2:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   570
            del diverge[of] # not actually divergent, or not a rename
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   571
            if of not in c1 and of not in c2:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   572
                # renamed on one side, deleted on the other side, but filter
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   573
                # out files that have been renamed and then deleted
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   574
                renamedelete[of] = [f for f in fl if f in c1 or f in c2]
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   575
                renamedeleteset.update(fl) # reverse map for below
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   576
        else:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   577
            divergeset.update(fl) # reverse map for below
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   578
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   579
    if bothnew:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   580
        repo.ui.debug("  unmatched files new in both:\n   %s\n"
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   581
                      % "\n   ".join(bothnew))
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   582
    bothdiverge = {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   583
    bothincompletediverge = {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   584
    remainder = {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   585
    both1 = {'copy': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   586
             'fullcopy': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   587
             'incomplete': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   588
             'diverge': bothdiverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   589
             'incompletediverge': bothincompletediverge
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   590
            }
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   591
    both2 = {'copy': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   592
             'fullcopy': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   593
             'incomplete': {},
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   594
             'diverge': bothdiverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   595
             'incompletediverge': bothincompletediverge
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   596
            }
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   597
    for f in bothnew:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   598
        copies._checkcopies(c1, c2, f, base, tca, dirtyc1, limit, both1)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   599
        copies._checkcopies(c2, c1, f, base, tca, dirtyc2, limit, both2)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   600
    if dirtyc1 and dirtyc2:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   601
        pass
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   602
    elif dirtyc1:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   603
        # incomplete copies may only be found on the "dirty" side for bothnew
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   604
        assert not both2['incomplete']
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   605
        remainder = copies._combinecopies({}, both1['incomplete'], copy, bothdiverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   606
                                          bothincompletediverge)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   607
    elif dirtyc2:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   608
        assert not both1['incomplete']
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   609
        remainder = copies._combinecopies({}, both2['incomplete'], copy, bothdiverge,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   610
                                          bothincompletediverge)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   611
    else:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   612
        # incomplete copies and divergences can't happen outside grafts
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   613
        assert not both1['incomplete']
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   614
        assert not both2['incomplete']
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   615
        assert not bothincompletediverge
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   616
    for f in remainder:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   617
        assert f not in bothdiverge
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   618
        ic = remainder[f]
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   619
        if ic[0] in (m1 if dirtyc1 else m2):
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   620
            # backed-out rename on one side, but watch out for deleted files
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   621
            bothdiverge[f] = ic
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   622
    for of, fl in bothdiverge.items():
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   623
        if len(fl) == 2 and fl[0] == fl[1]:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   624
            copy[fl[0]] = of # not actually divergent, just matching renames
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   625
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   626
    if fullcopy and repo.ui.debugflag:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   627
        repo.ui.debug("  all copies found (* = to merge, ! = divergent, "
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   628
                      "% = renamed and deleted):\n")
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   629
        for f in sorted(fullcopy):
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   630
            note = ""
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   631
            if f in copy:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   632
                note += "*"
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   633
            if f in divergeset:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   634
                note += "!"
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   635
            if f in renamedeleteset:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   636
                note += "%"
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   637
            repo.ui.debug("   src: '%s' -> dst: '%s' %s\n" % (fullcopy[f], f,
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   638
                                                              note))
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   639
    del divergeset
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   640
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   641
    if not fullcopy:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   642
        return copy, {}, diverge, renamedelete, {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   643
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   644
    repo.ui.debug("  checking for directory renames\n")
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   645
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   646
    # generate a directory move map
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   647
    d1, d2 = c1.dirs(), c2.dirs()
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   648
    # Hack for adding '', which is not otherwise added, to d1 and d2
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   649
    d1.addpath('/')
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   650
    d2.addpath('/')
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   651
    invalid = set()
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   652
    dirmove = {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   653
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   654
    # examine each file copy for a potential directory move, which is
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   655
    # when all the files in a directory are moved to a new directory
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   656
    for dst, src in fullcopy.iteritems():
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   657
        dsrc, ddst = pathutil.dirname(src), pathutil.dirname(dst)
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   658
        if dsrc in invalid:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   659
            # already seen to be uninteresting
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   660
            continue
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   661
        elif dsrc in d1 and ddst in d1:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   662
            # directory wasn't entirely moved locally
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   663
            invalid.add(dsrc + "/")
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   664
        elif dsrc in d2 and ddst in d2:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   665
            # directory wasn't entirely moved remotely
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   666
            invalid.add(dsrc + "/")
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   667
        elif dsrc + "/" in dirmove and dirmove[dsrc + "/"] != ddst + "/":
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   668
            # files from the same directory moved to two different places
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   669
            invalid.add(dsrc + "/")
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   670
        else:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   671
            # looks good so far
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   672
            dirmove[dsrc + "/"] = ddst + "/"
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   673
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   674
    for i in invalid:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   675
        if i in dirmove:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   676
            del dirmove[i]
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   677
    del d1, d2, invalid
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   678
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   679
    if not dirmove:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   680
        return copy, {}, diverge, renamedelete, {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   681
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   682
    for d in dirmove:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   683
        repo.ui.debug("   discovered dir src: '%s' -> dst: '%s'\n" %
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   684
                      (d, dirmove[d]))
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   685
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   686
    movewithdir = {}
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   687
    # check unaccounted nonoverlapping files against directory moves
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   688
    for f in u1r + u2r:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   689
        if f not in fullcopy:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   690
            for d in dirmove:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   691
                if f.startswith(d):
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   692
                    # new file added in a directory that was moved, move it
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   693
                    df = dirmove[d] + f[len(d):]
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   694
                    if df not in copy:
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   695
                        movewithdir[f] = df
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   696
                        repo.ui.debug(("   pending file src: '%s' -> "
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   697
                                       "dst: '%s'\n") % (f, df))
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   698
                    break
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   699
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   700
    return copy, movewithdir, diverge, renamedelete, dirmove
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   701
3882
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   702
if util.safehasattr(copies, '_fullcopytracing'):
55b8c7e7e352 compat: temporarily move copies fix to compat.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3767
diff changeset
   703
    copies._fullcopytracing = fixedcopytracing
3931
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   704
elif util.safehasattr(copies, 'mergecopies'):
3932
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   705
    # compat fix for hg <= 4.3
3931
b627e165ad20 compat: add a fixed version of mergecopies for hg<=4.3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3921
diff changeset
   706
    copies.mergecopies = fixoldmergecopies
3932
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   707
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   708
if not util.safehasattr(obsutil, "_succs"):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   709
    class _succs(list):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   710
        """small class to represent a successors with some metadata about it"""
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   711
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   712
        def __init__(self, *args, **kwargs):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   713
            super(_succs, self).__init__(*args, **kwargs)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   714
            self.markers = set()
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   715
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   716
        def copy(self):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   717
            new = _succs(self)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   718
            new.markers = self.markers.copy()
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   719
            return new
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   720
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   721
        @util.propertycache
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   722
        def _set(self):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   723
            # immutable
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   724
            return set(self)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   725
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   726
        def canmerge(self, other):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   727
            return self._set.issubset(other._set)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   728
else:
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   729
    from mercurial.obsutil import _succs
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   730
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   731
def wrap_succs(succs):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   732
    """ Wrap old data format of successorsets (tuple) only if if's not yet a
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   733
    _succs instance
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   734
    """
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   735
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   736
    if not util.safehasattr(succs, "markers"):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   737
        return _succs(succs)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   738
    else:
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   739
        return succs
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   740
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   741
if not util.safehasattr(obsutil, "markersdates"):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   742
    MARKERS_DATE_COMPAT = True
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   743
else:
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   744
    MARKERS_DATE_COMPAT = False
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   745
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   746
def markersdates(markers):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   747
    """returns the list of dates for a list of markers
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   748
    """
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   749
    if MARKERS_DATE_COMPAT is False:
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   750
        return obsutil.markersdates(markers)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   751
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   752
    return [m[4] for m in markers]
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   753
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   754
if not util.safehasattr(obsutil, "markersusers"):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   755
    MARKERS_USERS_COMPAT = True
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   756
else:
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   757
    MARKERS_USERS_COMPAT = False
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   758
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   759
def markersusers(markers):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   760
    """ Returns a sorted list of markers users without duplicates
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   761
    """
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   762
    if MARKERS_USERS_COMPAT is False:
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   763
        return obsutil.markersusers(markers)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   764
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   765
    markersmeta = [dict(m[3]) for m in markers]
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   766
    users = set(encoding.tolocal(meta['user']) for meta in markersmeta
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   767
                if meta.get('user'))
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   768
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   769
    return sorted(users)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   770
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   771
if not util.safehasattr(obsutil, "markersoperations"):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   772
    MARKERS_OPERATIONS_COMPAT = True
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   773
else:
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   774
    MARKERS_OPERATIONS_COMPAT = False
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   775
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   776
def markersoperations(markers):
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   777
    """ Returns a sorted list of markers operations without duplicates
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   778
    """
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   779
    if MARKERS_OPERATIONS_COMPAT is False:
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   780
        return obsutil.markersoperations(markers)
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   781
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   782
    markersmeta = [dict(m[3]) for m in markers]
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   783
    operations = set(meta.get('operation') for meta in markersmeta
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   784
                     if meta.get('operation'))
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   785
35b2d201eb71 compat: fix obslog compatiblity with 4.3
Boris Feld <boris.feld@octobus.net>
parents: 3931
diff changeset
   786
    return sorted(operations)