hgext/inhibit.py
author Durham Goode <durham@fb.com>
Wed, 12 Aug 2015 10:51:20 -0700
branchstable
changeset 1490 bc7eec65dfcf
parent 1486 e8ebb2441e60
child 1491 8f469f81129c
permissions -rw-r--r--
inhibit: fix inhibit working with non-inhibit repos Inhibit was breaking when two repos were in memory, but one was not an inhibit repo (like when doing a local pull between two repos). The fix is to add inhibitenabled checks to all the places where inhibit does global wrapping of commands (every code path from the extsetup wrappers).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
     1
"""reduce the changesets evolution feature scope for early and noob friendly ui
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     2
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
     3
the full scale changeset evolution have some massive bleeding edge and it is
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     4
very easy for people not very intimate with the concept to end up in intricate
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
     5
situation. in order to get some of the benefit sooner, this extension is
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
     6
disabling some of the less polished aspect of evolution. it should gradually
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
     7
get thinner and thinner as changeset evolution will get more polished. this
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
     8
extension is only recommended for large scale organisations. individual user
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
     9
should probably stick on using evolution in its current state, understand its
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    10
concept and provide feedback
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    11
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
    12
This extension provides the ability to "inhibit" obsolescence markers. obsolete 
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
    13
revision can be cheaply brought back to life that way. 
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
    14
However as the inhibitor are not fitting in an append only model, this is 
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
    15
incompatible with sharing mutable history.
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    16
"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    17
from mercurial import localrepo
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    18
from mercurial import obsolete
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    19
from mercurial import extensions
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    20
from mercurial import cmdutil
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
    21
from mercurial import error
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    22
from mercurial import scmutil
1233
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    23
from mercurial import commands
1297
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
    24
from mercurial import lock as lockmod
1234
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
    25
from mercurial import bookmarks
1490
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
    26
from mercurial import util
1241
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    27
from mercurial.i18n import _
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    28
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    29
cmdtable = {}
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    30
command = cmdutil.command(cmdtable)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    31
1490
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
    32
def _inhibitenabled(repo):
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
    33
    return util.safehasattr(repo, '_obsinhibit')
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
    34
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    35
def reposetup(ui, repo):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    36
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    37
    class obsinhibitedrepo(repo.__class__):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    38
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    39
        @localrepo.storecache('obsinhibit')
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    40
        def _obsinhibit(self):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    41
            # XXX we should make sure it is invalidated by transaction failure
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    42
            obsinhibit = set()
1465
777e5c369d99 compat: use svfs instead of sopener
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1366
diff changeset
    43
            raw = self.svfs.tryread('obsinhibit')
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    44
            for i in xrange(0, len(raw), 20):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    45
                obsinhibit.add(raw[i:i+20])
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    46
            return obsinhibit
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    47
1292
62229e7451f7 inhibit: wrap repo.commit to inhibit nodes
Durham Goode <durham@fb.com>
parents: 1247
diff changeset
    48
        def commit(self, *args, **kwargs):
62229e7451f7 inhibit: wrap repo.commit to inhibit nodes
Durham Goode <durham@fb.com>
parents: 1247
diff changeset
    49
            newnode = super(obsinhibitedrepo, self).commit(*args, **kwargs)
1346
9a1415f8b21b inhbit: don't crash on commit with no changes
Laurent Charignon <lcharignon@fb.com>
parents: 1339
diff changeset
    50
            if newnode is not None:
9a1415f8b21b inhbit: don't crash on commit with no changes
Laurent Charignon <lcharignon@fb.com>
parents: 1339
diff changeset
    51
                _inhibitmarkers(repo, [newnode])
1292
62229e7451f7 inhibit: wrap repo.commit to inhibit nodes
Durham Goode <durham@fb.com>
parents: 1247
diff changeset
    52
            return newnode
62229e7451f7 inhibit: wrap repo.commit to inhibit nodes
Durham Goode <durham@fb.com>
parents: 1247
diff changeset
    53
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    54
    repo.__class__ = obsinhibitedrepo
1233
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    55
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    56
def _update(orig, ui, repo, *args, **kwargs):
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    57
    """
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    58
    When moving to a commit we want to inhibit any obsolete commit affecting
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    59
    the changeset we are updating to. In other words we don't want any visible
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    60
    commit to be obsolete.
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    61
    """
1303
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    62
    wlock = None
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    63
    try:
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    64
        # Evolve is running a hook on lock release to display a warning message 
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    65
        # if the workind dir's parent is obsolete.
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    66
        # We take the lock here to make sure that we inhibit the parent before
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    67
        # that hook get a chance to run.
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    68
        wlock = repo.wlock()
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    69
        res = orig(ui, repo, *args, **kwargs)
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    70
        newhead = repo['.'].node()
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    71
        _inhibitmarkers(repo, [newhead])
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    72
        return res
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    73
    finally:
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
    74
        lockmod.release(wlock)
1233
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    75
1234
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
    76
def _bookmarkchanged(orig, bkmstoreinst, *args, **kwargs):
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
    77
    """ Add inhibition markers to every obsolete bookmarks """
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
    78
    repo = bkmstoreinst._repo
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
    79
    bkmstorenodes = [repo[v].node() for v in bkmstoreinst.values()]
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
    80
    _inhibitmarkers(repo, bkmstorenodes)
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
    81
    return orig(bkmstoreinst, *args, **kwargs)
1233
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
    82
1241
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    83
def _bookmark(orig, ui, repo, *bookmarks, **opts):
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    84
    """ Add a -D option to the bookmark command, map it to prune -B """
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    85
    haspruneopt = opts.get('prune', False)
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    86
    if not haspruneopt:
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    87
        return orig(ui, repo, *bookmarks, **opts)
1293
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    88
1241
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    89
    # Call prune -B
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    90
    evolve = extensions.find('evolve')
1293
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    91
    optsdict = {
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    92
        'new': [],
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    93
        'succ': [],
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    94
        'rev': [],
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    95
        'bookmark': bookmarks[0],
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    96
        'keep': None,
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    97
        'biject': False,
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
    98
    }
1241
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
    99
    evolve.cmdprune(ui, repo, **optsdict)
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
   100
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   101
# obsolescence inhibitor
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   102
########################
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   103
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   104
def _schedulewrite(tr, obsinhibit):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   105
    """Make sure on disk content will be updated on transaction commit"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   106
    def writer(fp):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   107
        """Serialize the inhibited list to disk.
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   108
        """
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   109
        raw = ''.join(obsinhibit)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   110
        fp.write(raw)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   111
    tr.addfilegenerator('obsinhibit', ('obsinhibit',), writer)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   112
    tr.hookargs['obs_inbihited'] = '1'
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   113
1225
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   114
def _filterpublic(repo, nodes):
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   115
    """filter out inhibitor on public changeset
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   116
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   117
    Public changesets are already immune to obsolescence"""
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   118
    getrev = repo.changelog.nodemap.get
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   119
    getphase = repo._phasecache.phase
1338
77cbf9121e8a inhibit: handle inhibit marker on stripped revision
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1334
diff changeset
   120
    return (n for n in repo._obsinhibit
77cbf9121e8a inhibit: handle inhibit marker on stripped revision
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1334
diff changeset
   121
            if getrev(n) is not None and getphase(repo, getrev(n)))
1225
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   122
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   123
def _inhibitmarkers(repo, nodes):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   124
    """add marker inhibitor for all obsolete revision under <nodes>
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   125
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   126
    Content of <nodes> and all mutable ancestors are considered. Marker for
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   127
    obsolete revision only are created.
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   128
    """
1490
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   129
    if not _inhibitenabled(repo):
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   130
        return
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   131
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   132
    newinhibit = repo.set('::%ln and obsolete()', nodes)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   133
    if newinhibit:
1297
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
   134
        lock = tr = None
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   135
        try:
1297
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
   136
            lock = repo.lock()
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
   137
            tr = repo.transaction('obsinhibit')
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   138
            repo._obsinhibit.update(c.node() for c in newinhibit)
1225
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   139
            _schedulewrite(tr, _filterpublic(repo, repo._obsinhibit))
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   140
            repo.invalidatevolatilesets()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   141
            tr.close()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   142
        finally:
1297
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
   143
            lockmod.release(tr, lock)
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   144
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   145
def _deinhibitmarkers(repo, nodes):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   146
    """lift obsolescence inhibition on a set of nodes
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   147
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   148
    This will be triggered when inhibited nodes received new obsolescence
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   149
    markers. Otherwise the new obsolescence markers would also be inhibited.
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   150
    """
1490
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   151
    if not _inhibitenabled(repo):
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   152
        return
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   153
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   154
    deinhibited = repo._obsinhibit & set(nodes)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   155
    if deinhibited:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   156
        tr = repo.transaction('obsinhibit')
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   157
        try:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   158
            repo._obsinhibit -= deinhibited
1225
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
   159
            _schedulewrite(tr, _filterpublic(repo, repo._obsinhibit))
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   160
            repo.invalidatevolatilesets()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   161
            tr.close()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   162
        finally:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   163
            tr.release()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   164
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   165
def _createmarkers(orig, repo, relations, flag=0, date=None, metadata=None):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   166
    """wrap markers create to make sure we de-inhibit target nodes"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   167
    # wrapping transactio to unify the one in each function
1472
a8a4c8b8550d inhibit: add missing locking in wrapper for obsmarker creation
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
   168
    lock = tr = None
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   169
    try:
1472
a8a4c8b8550d inhibit: add missing locking in wrapper for obsmarker creation
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
   170
        lock = repo.lock()
a8a4c8b8550d inhibit: add missing locking in wrapper for obsmarker creation
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
   171
        tr = repo.transaction('add-obsolescence-marker')
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   172
        orig(repo, relations, flag, date, metadata)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   173
        precs = (r[0].node() for r in relations)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   174
        _deinhibitmarkers(repo, precs)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   175
        tr.close()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   176
    finally:
1472
a8a4c8b8550d inhibit: add missing locking in wrapper for obsmarker creation
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
   177
        lockmod.release(tr, lock)
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   178
1486
e8ebb2441e60 inhibit: do not search for visible obsolete changeset during stripping
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1472
diff changeset
   179
def transactioncallback(orig, repo, desc, *args, **kwargs):
1240
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
   180
    """ Wrap localrepo.transaction to inhibit new obsolete changes """
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
   181
    def inhibitposttransaction(transaction):
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
   182
        # At the end of the transaction we catch all the new visible and
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
   183
        # obsolete commit to inhibit them
1362
73e5b5280c1c inhibit: improve performance of transaction wrapping
Laurent Charignon <lcharignon@fb.com>
parents: 1346
diff changeset
   184
        visibleobsolete = repo.revs('obsolete() - hidden()')
1321
8fa74845eb1f inhibit: don't inhibit pinned commits during rebase
Durham Goode <durham@fb.com>
parents: 1303
diff changeset
   185
        ignoreset = set(getattr(repo, '_rebaseset', []))
8fa74845eb1f inhibit: don't inhibit pinned commits during rebase
Durham Goode <durham@fb.com>
parents: 1303
diff changeset
   186
        visibleobsolete = list(r for r in visibleobsolete if r not in ignoreset)
1240
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
   187
        if visibleobsolete:
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
   188
            _inhibitmarkers(repo, [repo[r].node() for r in visibleobsolete])
1486
e8ebb2441e60 inhibit: do not search for visible obsolete changeset during stripping
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1472
diff changeset
   189
    transaction = orig(repo, desc, *args, **kwargs)
1490
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   190
    if desc != 'strip' and _inhibitenabled(repo):
1486
e8ebb2441e60 inhibit: do not search for visible obsolete changeset during stripping
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1472
diff changeset
   191
        transaction.addpostclose('inhibitposttransaction', inhibitposttransaction)
1240
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
   192
    return transaction
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
   193
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   194
def extsetup(ui):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   195
    # lets wrap the computation of the obsolete set
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   196
    # We apply inhibition there
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   197
    obsfunc = obsolete.cachefuncs['obsolete']
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   198
    def _computeobsoleteset(repo):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   199
        """remove any inhibited nodes from the obsolete set
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   200
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   201
        This will trickle down to other part of mercurial (hidden, log, etc)"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   202
        obs = obsfunc(repo)
1490
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   203
        if _inhibitenabled(repo):
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   204
            getrev = repo.changelog.nodemap.get
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   205
            for n in repo._obsinhibit:
bc7eec65dfcf inhibit: fix inhibit working with non-inhibit repos
Durham Goode <durham@fb.com>
parents: 1486
diff changeset
   206
                obs.discard(getrev(n))
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   207
        return obs
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   208
    try:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   209
        extensions.find('directaccess')
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   210
    except KeyError:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   211
        errormsg = _('Cannot use inhibit without the direct access extension')
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   212
        raise error.Abort(errormsg)
1366
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
   213
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
   214
    # Wrapping this to inhibit obsolete revs resulting from a transaction
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
   215
    extensions.wrapfunction(localrepo.localrepository,
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
   216
                            'transaction', transactioncallback)
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
   217
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   218
    obsolete.cachefuncs['obsolete'] = _computeobsoleteset
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   219
    # wrap create marker to make it able to lift the inhibition
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   220
    extensions.wrapfunction(obsolete, 'createmarkers', _createmarkers)
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   221
    # drop divergence computation since it is incompatible with "light revive"
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   222
    obsolete.cachefuncs['divergent'] = lambda repo: set()
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   223
    # drop bumped computation since it is incompatible with "light revive"
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   224
    obsolete.cachefuncs['bumped'] = lambda repo: set()
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   225
    # wrap update to make sure that no obsolete commit is visible after an
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   226
    # update
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   227
    extensions.wrapcommand(commands.table, 'update', _update)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   228
    # There are two ways to save bookmark changes during a transation, we
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   229
    # wrap both to add inhibition markers.
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   230
    extensions.wrapfunction(bookmarks.bmstore, 'recordchange', _bookmarkchanged)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   231
    extensions.wrapfunction(bookmarks.bmstore, 'write', _bookmarkchanged)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   232
    # Add bookmark -D option
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   233
    entry = extensions.wrapcommand(commands.table, 'bookmark', _bookmark)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   234
    entry[1].append(('D','prune',None,
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
   235
                    _('delete the bookmark and prune the commits underneath')))
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   236
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   237
@command('debugobsinhibit', [], '')
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   238
def cmddebugobsinhibit(ui, repo, *revs):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   239
    """inhibit obsolescence markers effect on a set of revs"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   240
    nodes = (repo[r].node() for r in scmutil.revrange(repo, revs))
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   241
    _inhibitmarkers(repo, nodes)