hgext3rd/evolve/legacy.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 16 May 2017 12:45:08 +0200
changeset 2378 c143d465c4b8
parent 2273 228111491788
child 2464 2b53a2a21bbb
permissions -rw-r--r--
obshashrange: test behavior in case of rollback The cache should be properly invalidated.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     1
# Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     2
#                Logilab SA        <contact@logilab.fr>
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     3
#
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     4
# This software may be used and distributed according to the terms of the
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     5
# GNU General Public License version 2 or any later version.
1665
559d04a5c856 Grammar: introduced
timeless@gmail.com
parents: 1664
diff changeset
     6
"""Deprecated extension that formerly introduced "Changeset Obsolescence".
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
     7
1669
11d72083883a Brand: Mercurial
timeless@gmail.com
parents: 1665
diff changeset
     8
This concept is now partially in Mercurial core (starting with Mercurial 2.3).
1664
1c9aef9497c4 Grammar: has
timeless@gmail.com
parents: 1657
diff changeset
     9
The remaining logic has been grouped with the evolve extension.
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    10
1657
103cb0d44cd8 Spelling: remains
timeless@gmail.com
parents: 1652
diff changeset
    11
Some code remains in this extensions to detect and convert prehistoric format
1550
e47dda53a5c2 check-code: make obsolete.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
    12
of obsolete marker than early user may have create. Keep it enabled if you
e47dda53a5c2 check-code: make obsolete.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
    13
were such user.
69
aee53d546849 [obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 58
diff changeset
    14
"""
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 226
diff changeset
    15
1757
86e71a0b3319 errors: add missing imports of mercurial.error
Martin von Zweigbergk <martinvonz@google.com>
parents: 1669
diff changeset
    16
from mercurial import error
433
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    17
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    18
try:
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    19
    from mercurial import obsolete
2025
d286222293c8 legacy: properly test for mercurial version in the legacy extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1810
diff changeset
    20
    obsolete._enabled
433
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    21
except ImportError:
1550
e47dda53a5c2 check-code: make obsolete.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
    22
    raise error.Abort('Obsolete extension requires Mercurial 2.3 (or later)')
433
aa1255c2ac8f obsolete: move version checks at the start of the file
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 432
diff changeset
    23
439
6cff54825233 obsolete: reorder import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 438
diff changeset
    24
import sys
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    25
import json
354
bd26eb9714fb obsolete: Detect conflicting changeset!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 351
diff changeset
    26
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    27
from mercurial import cmdutil
1550
e47dda53a5c2 check-code: make obsolete.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
    28
from mercurial.i18n import _
2122
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
    29
from mercurial import lock as lockmod
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    30
from mercurial.node import bin, nullid
1757
86e71a0b3319 errors: add missing imports of mercurial.error
Martin von Zweigbergk <martinvonz@google.com>
parents: 1669
diff changeset
    31
from mercurial import util
39
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 38
diff changeset
    32
44
b243c10a5fbe Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 43
diff changeset
    33
430
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
    34
#####################################################################
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
    35
### Older format management                                       ###
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
    36
#####################################################################
218
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
    37
430
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
    38
# Code related to detection and management of older legacy format never
07db1d511faf obsolete: move old format stuff at the end
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 429
diff changeset
    39
# handled by core
218
ace5608350b6 obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 217
diff changeset
    40
32
c27491be4431 obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    41
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    42
def reposetup(ui, repo):
459
3477326461e3 obsolete: more typos and cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 458
diff changeset
    43
    """Detect that a repo still contains some old obsolete format
273
87e4d1eec5e8 obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents: 254
diff changeset
    44
    """
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    45
    if not repo.local():
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    46
        return
1216
a307eea46f96 oldobsolete: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1061
diff changeset
    47
    evolveopts = ui.configlist('experimental', 'evolution')
a307eea46f96 oldobsolete: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1061
diff changeset
    48
    if not evolveopts:
a307eea46f96 oldobsolete: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1061
diff changeset
    49
        evolveopts = 'all'
a307eea46f96 oldobsolete: remove use of obsolete._enabled
Durham Goode <durham@fb.com>
parents: 1061
diff changeset
    50
        ui.setconfig('experimental', 'evolution', evolveopts)
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    51
    for arg in sys.argv:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    52
        if 'debugc' in arg:
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    53
            break
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    54
    else:
2051
74934195747b evolve: switch away from deprecated repo.opener
Martin von Zweigbergk <martinvonz@google.com>
parents: 2032
diff changeset
    55
        data = repo.vfs.tryread('obsolete-relations')
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    56
        if not data:
1465
777e5c369d99 compat: use svfs instead of sopener
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1216
diff changeset
    57
            data = repo.svfs.tryread('obsoletemarkers')
429
079b231b8ea4 obsolete: introduce an extension helper and use it
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 428
diff changeset
    58
        if data:
1550
e47dda53a5c2 check-code: make obsolete.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
    59
            raise error.Abort('old format of obsolete marker detected!\n'
e47dda53a5c2 check-code: make obsolete.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
    60
                              'run `hg debugconvertobsolete` once.')
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
    61
1647
23521789ded0 Spelling (en-us): -ize
timeless@gmail.com
parents: 1550
diff changeset
    62
def _obsdeserialize(flike):
1648
96331d6f9940 Spelling: accessing
timeless@gmail.com
parents: 1647
diff changeset
    63
    """read a file like object serialized with _obsserialize
74
c7dd26dec7fc [obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 73
diff changeset
    64
1649
0b8a1e58dcf7 Spelling: deserialize
timeless@gmail.com
parents: 1648
diff changeset
    65
    this deserialize into a {subject -> objects} mapping
454
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
    66
4e34a723115b obsolete: more comment
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 453
diff changeset
    67
    this was the very first format ever."""
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
    68
    rels = {}
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
    69
    for line in flike:
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
    70
        subhex, objhex = line.split()
80
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
    71
        subnode = bin(subhex)
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
    72
        if subnode == nullid:
5d029a358252 [obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 79
diff changeset
    73
            subnode = None
1550
e47dda53a5c2 check-code: make obsolete.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
    74
        rels.setdefault(subnode, set()).add(bin(objhex))
70
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
    75
    return rels
af4f7ef0a3c1 [obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 69
diff changeset
    76
441
d702f0d26c6a obsolete: remove debugsuccessors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 440
diff changeset
    77
cmdtable = {}
d702f0d26c6a obsolete: remove debugsuccessors
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 440
diff changeset
    78
command = cmdutil.command(cmdtable)
276
f26e9bc5f7fc obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents: 275
diff changeset
    79
@command('debugconvertobsolete', [], '')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
    80
def cmddebugconvertobsolete(ui, repo):
278
fa0b9b8a83c0 obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents: 277
diff changeset
    81
    """import markers from an .hg/obsolete-relations file"""
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
    82
    cnt = 0
337
ebfd1b96a013 obsolete: convert try to guess what invalid node id are
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 336
diff changeset
    83
    err = 0
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
    84
    l = repo.lock()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
    85
    some = False
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
    86
    try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    87
        unlink = []
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    88
        tr = repo.transaction('convert-obsolete')
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
    89
        try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    90
            repo._importoldobsolete = True
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    91
            store = repo.obsstore
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    92
            ### very first format
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
    93
            try:
2051
74934195747b evolve: switch away from deprecated repo.opener
Martin von Zweigbergk <martinvonz@google.com>
parents: 2032
diff changeset
    94
                f = repo.vfs('obsolete-relations')
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    95
                try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    96
                    some = True
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    97
                    for line in f:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    98
                        subhex, objhex = line.split()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
    99
                        suc = bin(subhex)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   100
                        prec = bin(objhex)
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2025
diff changeset
   101
                        sucs = (suc == nullid) and [] or [suc]
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   102
                        meta = {
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2025
diff changeset
   103
                            'date': '%i %i' % util.makedate(),
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   104
                            'user': ui.username(),
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   105
                            }
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   106
                        try:
1061
f3867e60d072 compat: always call metadata as a keyword argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 519
diff changeset
   107
                            store.create(tr, prec, sucs, 0, metadata=meta)
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   108
                            cnt += 1
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   109
                        except ValueError:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   110
                            repo.ui.write_err("invalid old marker line: %s"
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   111
                                              % (line))
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   112
                            err += 1
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   113
                finally:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   114
                    f.close()
2070
9105c3c54045 cleanup: stop using 'repo.join' methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2051
diff changeset
   115
                unlink.append(repo.vfs.join('obsolete-relations'))
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   116
            except IOError:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   117
                pass
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   118
            ### second (json) format
1465
777e5c369d99 compat: use svfs instead of sopener
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1216
diff changeset
   119
            data = repo.svfs.tryread('obsoletemarkers')
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   120
            if data:
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   121
                some = True
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   122
                for oldmark in json.loads(data):
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   123
                    del oldmark['id']  # dropped for now
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   124
                    del oldmark['reason']  # unused until then
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   125
                    oldobject = str(oldmark.pop('object'))
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   126
                    oldsubjects = [str(s) for s in oldmark.pop('subjects', [])]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   127
                    LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   128
                    if len(oldobject) != 40:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   129
                        try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   130
                            oldobject = repo[oldobject].node()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   131
                        except LOOKUP_ERRORS:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   132
                            pass
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   133
                    if any(len(s) != 40 for s in oldsubjects):
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   134
                        try:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   135
                            oldsubjects = [repo[s].node() for s in oldsubjects]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   136
                        except LOOKUP_ERRORS:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   137
                            pass
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   138
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   139
                    oldmark['date'] = '%i %i' % tuple(oldmark['date'])
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   140
                    meta = dict((k.encode('utf-8'), v.encode('utf-8'))
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2025
diff changeset
   141
                                for k, v in oldmark.iteritems())
341
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
   142
                    try:
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   143
                        succs = [bin(n) for n in oldsubjects]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   144
                        succs = [n for n in succs if n != nullid]
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   145
                        store.create(tr, bin(oldobject), succs,
1061
f3867e60d072 compat: always call metadata as a keyword argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 519
diff changeset
   146
                                     0, metadata=meta)
341
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
   147
                        cnt += 1
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
   148
                    except ValueError:
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2025
diff changeset
   149
                        msg = "invalid marker %s -> %s\n"
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2025
diff changeset
   150
                        msg %= (oldobject, oldsubjects)
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2025
diff changeset
   151
                        repo.ui.write_err(msg)
341
7653f80fd7a4 obsolete: harden convertion from first format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 340
diff changeset
   152
                        err += 1
2070
9105c3c54045 cleanup: stop using 'repo.join' methods
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2051
diff changeset
   153
                unlink.append(repo.svfs.join('obsoletemarkers'))
361
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   154
            tr.close()
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   155
            for path in unlink:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   156
                util.unlink(path)
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   157
        finally:
ac7969043677 obsolete: adapt to core: marker are written in transaction now
Pierre-Yves.David@ens-lyon.org
parents: 360
diff changeset
   158
            tr.release()
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   159
    finally:
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   160
        del repo._importoldobsolete
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   161
        l.release()
334
fb83210bce32 obsolete: move to official binary format
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 332
diff changeset
   162
    if not some:
1550
e47dda53a5c2 check-code: make obsolete.py comply with check-code
Laurent Charignon <lcharignon@fb.com>
parents: 1465
diff changeset
   163
        ui.warn(_('nothing to do\n'))
224
f60555898df4 new obsolete store
Pierre-Yves.David@ens-lyon.org
parents: 218
diff changeset
   164
    ui.status('%i obsolete marker converted\n' % cnt)
337
ebfd1b96a013 obsolete: convert try to guess what invalid node id are
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 336
diff changeset
   165
    if err:
ebfd1b96a013 obsolete: convert try to guess what invalid node id are
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 336
diff changeset
   166
        ui.write_err('%i conversion failed. check you graph!\n' % err)
2122
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   167
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   168
@command('debugrecordpruneparents', [], '')
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   169
def cmddebugrecordpruneparents(ui, repo):
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   170
    """add parent data to prune markers when possible
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   171
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   172
    This command searches the repo for prune markers without parent information.
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   173
    If the pruned node is locally known, it creates a new marker with parent
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   174
    data.
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   175
    """
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   176
    pgop = 'reading markers'
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   177
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   178
    # lock from the beginning to prevent race
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   179
    wlock = lock = tr = None
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   180
    try:
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   181
        wlock = repo.wlock()
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   182
        lock = repo.lock()
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   183
        tr = repo.transaction('recordpruneparents')
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   184
        unfi = repo.unfiltered()
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   185
        nm = unfi.changelog.nodemap
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   186
        store = repo.obsstore
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   187
        pgtotal = len(store._all)
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   188
        for idx, mark in enumerate(list(store._all)):
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   189
            if not mark[1]:
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   190
                rev = nm.get(mark[0])
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   191
                if rev is not None:
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   192
                    ctx = unfi[rev]
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   193
                    parents = tuple(p.node() for p in ctx.parents())
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   194
                    before = len(store._all)
2273
228111491788 legacy: fix debugrecordpruneparents to call obsstore.create() with keywords
Yuya Nishihara <yuya@tcha.org>
parents: 2122
diff changeset
   195
                    store.create(tr, prec=mark[0], succs=mark[1], flag=mark[2],
228111491788 legacy: fix debugrecordpruneparents to call obsstore.create() with keywords
Yuya Nishihara <yuya@tcha.org>
parents: 2122
diff changeset
   196
                                 metadata=dict(mark[3]), parents=parents)
2122
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   197
                    if len(store._all) - before:
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   198
                        ui.write(_('created new markers for %i\n') % rev)
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   199
            ui.progress(pgop, idx, total=pgtotal)
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   200
        tr.close()
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   201
        ui.progress(pgop, None)
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   202
    finally:
efc6633e78e1 legacy: move 'debugrecordpruneparents' in the extensions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2070
diff changeset
   203
        lockmod.release(tr, lock, wlock)