mercurial/repair.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 20 May 2017 15:06:10 +0200
changeset 32623 ed566a59f660
parent 32468 4c4d91908492
child 32628 5732e6d2b369
permissions -rw-r--r--
strip: also backup obsmarkers We are about to give 'strip' the ability to remove obsmarkers. Before we start removing data we must make sure it is preserved somewhere. So the backup bundle created by 'strip' now contains obsmarkers.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# repair.py - functions for repository repair for mercurial
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     3
# Copyright 2005, 2006 Chris Mason <mason@suse.com>
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
# Copyright 2007 Matt Mackall
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     5
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8073
diff changeset
     6
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9150
diff changeset
     7
# GNU General Public License version 2 or any later version.
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     8
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
     9
from __future__ import absolute_import
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    10
16440
692bf06bb1af repair: fix missing import
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 16388
diff changeset
    11
import errno
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29196
diff changeset
    12
import hashlib
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    13
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    14
from .i18n import _
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    15
from .node import short
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    16
from . import (
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    17
    bundle2,
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    18
    changegroup,
32468
4c4d91908492 strip: use the 'writenewbundle' function to get bundle on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32296
diff changeset
    19
    discovery,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26425
diff changeset
    20
    error,
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    21
    exchange,
28868
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
    22
    obsolete,
25970
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    23
    util,
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    24
)
d1419cfbd4f4 repair: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25874
diff changeset
    25
15386
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
    26
def _bundle(repo, bases, heads, node, suffix, compress=True):
5905
3afbd82a6c82 repair.py: don't use nested functions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5904
diff changeset
    27
    """create a bundle with the specified revisions as a backup"""
23898
b21c2e0ee8a3 repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents: 23895
diff changeset
    28
20977
a57dcd11be34 repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20975
diff changeset
    29
    backupdir = "strip-backup"
a57dcd11be34 repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20975
diff changeset
    30
    vfs = repo.vfs
a57dcd11be34 repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20975
diff changeset
    31
    if not vfs.isdir(backupdir):
a57dcd11be34 repair: make paths in "_bundle()" relative to ".hg"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20975
diff changeset
    32
        vfs.mkdir(backupdir)
23835
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
    33
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
    34
    # Include a hash of all the nodes in the filename for uniqueness
25340
28800ab40395 repair: use _hexlist() to build revset expression from binary nodes
Yuya Nishihara <yuya@tcha.org>
parents: 25300
diff changeset
    35
    allcommits = repo.set('%ln::%ln', bases, heads)
23835
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
    36
    allhashes = sorted(c.hex() for c in allcommits)
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29196
diff changeset
    37
    totalhash = hashlib.sha1(''.join(allhashes)).hexdigest()
23835
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
    38
    name = "%s/%s-%s-%s.hg" % (backupdir, short(node), totalhash[:8], suffix)
aa4a1672583e bundles: do not overwrite existing backup bundles (BC)
Durham Goode <durham@fb.com>
parents: 22818
diff changeset
    39
32468
4c4d91908492 strip: use the 'writenewbundle' function to get bundle on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32296
diff changeset
    40
    cgversion = changegroup.safeversion(repo)
26425
eb21b6679dc6 strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26423
diff changeset
    41
    comp = None
26423
c93f91c1db1c strip: use bundle2 + cg2 by default when repository use general delta
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26014
diff changeset
    42
    if cgversion != '01':
24686
e0e28e910fa3 bundle2: rename format, parts and config to final names
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24252
diff changeset
    43
        bundletype = "HG20"
26425
eb21b6679dc6 strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26423
diff changeset
    44
        if compress:
eb21b6679dc6 strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26423
diff changeset
    45
            comp = 'BZ'
23898
b21c2e0ee8a3 repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents: 23895
diff changeset
    46
    elif compress:
11791
00cde9bddbe4 repair: do not compress partial bundle if we do not keep it on disk
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11600
diff changeset
    47
        bundletype = "HG10BZ"
00cde9bddbe4 repair: do not compress partial bundle if we do not keep it on disk
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11600
diff changeset
    48
    else:
00cde9bddbe4 repair: do not compress partial bundle if we do not keep it on disk
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11600
diff changeset
    49
        bundletype = "HG10UN"
32468
4c4d91908492 strip: use the 'writenewbundle' function to get bundle on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32296
diff changeset
    50
4c4d91908492 strip: use the 'writenewbundle' function to get bundle on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32296
diff changeset
    51
    outgoing = discovery.outgoing(repo, missingroots=bases, missingheads=heads)
32623
ed566a59f660 strip: also backup obsmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32468
diff changeset
    52
    contentopts = {'cg.version': cgversion, 'obsolescence': True}
32468
4c4d91908492 strip: use the 'writenewbundle' function to get bundle on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32296
diff changeset
    53
    return bundle2.writenewbundle(repo.ui, repo, 'strip', name, bundletype,
4c4d91908492 strip: use the 'writenewbundle' function to get bundle on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32296
diff changeset
    54
                                  outgoing, contentopts, vfs, compression=comp)
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    55
5910
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
    56
def _collectfiles(repo, striprev):
b9a830fa10f6 simplify revlog.strip interface and callers; add docstring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5909
diff changeset
    57
    """find out the filelogs affected by the strip"""
8462
e7e4e41b3bbc repair: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8363
diff changeset
    58
    files = set()
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    59
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
    60
    for x in xrange(striprev, len(repo)):
8479
3e16c0fc2241 repair: bulk update sets
Martin Geisler <mg@lazybytes.net>
parents: 8462
diff changeset
    61
        files.update(repo[x].files())
5902
98f8dec8f437 repair.py: split stripall into two functions; clean it up a bit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5901
diff changeset
    62
8462
e7e4e41b3bbc repair: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8363
diff changeset
    63
    return sorted(files)
5902
98f8dec8f437 repair.py: split stripall into two functions; clean it up a bit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5901
diff changeset
    64
13702
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
    65
def _collectbrokencsets(repo, files, striprev):
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
    66
    """return the changesets which will be broken by the truncation"""
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
    67
    s = set()
13702
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
    68
    def collectone(revlog):
20074
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 18766
diff changeset
    69
        _, brokenset = revlog.getstrippoint(striprev)
5fc2ae1c631b strip: add faster revlog strip computation
Durham Goode <durham@fb.com>
parents: 18766
diff changeset
    70
        s.update([revlog.linkrev(r) for r in brokenset])
5909
f45f7390c1c5 strip: calculate list of extra nodes to save and pass it to changegroupsubset
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5905
diff changeset
    71
30375
11b8b740d54a manifest: remove last uses of repo.manifest
Durham Goode <durham@fb.com>
parents: 30371
diff changeset
    72
    collectone(repo.manifestlog._revlog)
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
    73
    for fname in files:
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
    74
        collectone(repo.file(fname))
5909
f45f7390c1c5 strip: calculate list of extra nodes to save and pass it to changegroupsubset
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5905
diff changeset
    75
13705
73cfb7a5aa56 strip: simplify collectone
Matt Mackall <mpm@selenic.com>
parents: 13702
diff changeset
    76
    return s
5909
f45f7390c1c5 strip: calculate list of extra nodes to save and pass it to changegroupsubset
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5905
diff changeset
    77
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
    78
def strip(ui, repo, nodelist, backup=True, topic='backup'):
27553
56caab876bd8 repair: improves documentation of strip regarding locks
Laurent Charignon <lcharignon@fb.com>
parents: 27157
diff changeset
    79
    # This function operates within a transaction of its own, but does
56caab876bd8 repair: improves documentation of strip regarding locks
Laurent Charignon <lcharignon@fb.com>
parents: 27157
diff changeset
    80
    # not take any lock on the repo.
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
    81
    # Simple way to maintain backwards compatibility for this
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
    82
    # argument.
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
    83
    if backup in ['none', 'strip']:
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
    84
        backup = False
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
    85
18004
747a2f43d5d9 clfilter: strip logic should be unfiltered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
    86
    repo = repo.unfiltered()
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18121
diff changeset
    87
    repo.destroying()
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 16867
diff changeset
    88
5901
16f4129c19ac repair.py: rename chlog to cl
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5900
diff changeset
    89
    cl = repo.changelog
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
    90
    # TODO handle undo of merge sets
16252
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
    91
    if isinstance(nodelist, str):
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
    92
        nodelist = [nodelist]
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
    93
    striplist = [cl.rev(node) for node in nodelist]
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
    94
    striprev = min(striplist)
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    95
30707
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
    96
    files = _collectfiles(repo, striprev)
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
    97
    saverevs = _collectbrokencsets(repo, files, striprev)
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
    98
6147
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
    99
    # Some revisions with rev > striprev may not be descendants of striprev.
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
   100
    # We have to find these revisions and put them in a bundle, so that
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
   101
    # we can restore them after the truncations.
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
   102
    # To create the bundle we use repo.changegroupsubset which requires
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
   103
    # the list of heads and bases of the set of interesting revisions.
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
   104
    # (head = revision in the set that has no descendant in the set;
53ae5af55db3 repair.py: rewrite a loop, making it cleaner and faster
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5910
diff changeset
   105
    #  base = revision in the set that has no ancestor in the set)
16252
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
   106
    tostrip = set(striplist)
30707
987dbe87aad6 repair: combine two loops over changelog revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 30706
diff changeset
   107
    saveheads = set(saverevs)
30706
2e4862646f02 repair: speed up stripping of many roots
Martin von Zweigbergk <martinvonz@google.com>
parents: 30375
diff changeset
   108
    for r in cl.revs(start=striprev + 1):
2e4862646f02 repair: speed up stripping of many roots
Martin von Zweigbergk <martinvonz@google.com>
parents: 30375
diff changeset
   109
        if any(p in tostrip for p in cl.parentrevs(r)):
2e4862646f02 repair: speed up stripping of many roots
Martin von Zweigbergk <martinvonz@google.com>
parents: 30375
diff changeset
   110
            tostrip.add(r)
13702
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
   111
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
   112
        if r not in tostrip:
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
   113
            saverevs.add(r)
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
   114
            saveheads.difference_update(cl.parentrevs(r))
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
   115
            saveheads.add(r)
ffd370aa050b strip: remove usage of extranodes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 13362
diff changeset
   116
    saveheads = [cl.node(r) for r in saveheads]
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   117
15386
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
   118
    # compute base nodes
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
   119
    if saverevs:
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16745
diff changeset
   120
        descendants = set(cl.descendants(saverevs))
15386
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
   121
        saverevs.difference_update(descendants)
6051d8e7e133 strip: backout 73307643a09f (issue3077)
Matt Mackall <mpm@selenic.com>
parents: 15068
diff changeset
   122
    savebases = [cl.node(r) for r in saverevs]
16252
cf17e76be4dd strip: enhance repair.strip to receive a list of nodes (issue3299)
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15901
diff changeset
   123
    stripbases = [cl.node(r) for r in tostrip]
18040
fe8caf28d580 strip: make query to get new bookmark target cheaper
Siddharth Agarwal <sid0@fb.com>
parents: 18004
diff changeset
   124
fe8caf28d580 strip: make query to get new bookmark target cheaper
Siddharth Agarwal <sid0@fb.com>
parents: 18004
diff changeset
   125
    # For a set s, max(parents(s) - s) is the same as max(heads(::s - s)), but
fe8caf28d580 strip: make query to get new bookmark target cheaper
Siddharth Agarwal <sid0@fb.com>
parents: 18004
diff changeset
   126
    # is much faster
fe8caf28d580 strip: make query to get new bookmark target cheaper
Siddharth Agarwal <sid0@fb.com>
parents: 18004
diff changeset
   127
    newbmtarget = repo.revs('max(parents(%ld) - (%ld))', tostrip, tostrip)
17264
ec7b9bec19c9 strip: move bookmarks to nearest ancestor rather than '.'
Augie Fackler <raf@durin42.com>
parents: 17013
diff changeset
   128
    if newbmtarget:
22818
d7b114493315 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22057
diff changeset
   129
        newbmtarget = repo[newbmtarget.first()].node()
17264
ec7b9bec19c9 strip: move bookmarks to nearest ancestor rather than '.'
Augie Fackler <raf@durin42.com>
parents: 17013
diff changeset
   130
    else:
ec7b9bec19c9 strip: move bookmarks to nearest ancestor rather than '.'
Augie Fackler <raf@durin42.com>
parents: 17013
diff changeset
   131
        newbmtarget = '.'
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   132
13362
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
   133
    bm = repo._bookmarks
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
   134
    updatebm = []
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
   135
    for m in bm:
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
   136
        rev = repo[bm[m]].rev()
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
   137
        if rev in tostrip:
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
   138
            updatebm.append(m)
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
   139
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   140
    # create a changegroup for all the branches we need to keep
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
   141
    backupfile = None
20979
ad5b61370514 repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20977
diff changeset
   142
    vfs = repo.vfs
24252
f962692853c0 repair: define explicit local variable, don't reuse a comprehension variable
Mike Edgar <adgar@google.com>
parents: 24170
diff changeset
   143
    node = nodelist[-1]
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
   144
    if backup:
16388
e03d8a40521f repair: allow giving strip backup a different name
Idan Kamara <idankk86@gmail.com>
parents: 16253
diff changeset
   145
        backupfile = _bundle(repo, stripbases, cl.heads(), node, topic)
20979
ad5b61370514 repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20977
diff changeset
   146
        repo.ui.status(_("saved backup bundle to %s\n") %
ad5b61370514 repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20977
diff changeset
   147
                       vfs.join(backupfile))
ad5b61370514 repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20977
diff changeset
   148
        repo.ui.log("backupbundle", "saved backup bundle to %s\n",
ad5b61370514 repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20977
diff changeset
   149
                    vfs.join(backupfile))
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   150
    tmpbundlefile = None
29951
e7acbe538baf strip: simplify some repeated conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 29708
diff changeset
   151
    if saveheads:
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   152
        # do not compress temporary bundle if we remove it from disk later
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   153
        tmpbundlefile = _bundle(repo, savebases, saveheads, node, 'temp',
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
   154
                            compress=False)
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   155
30375
11b8b740d54a manifest: remove last uses of repo.manifest
Durham Goode <durham@fb.com>
parents: 30371
diff changeset
   156
    mfst = repo.manifestlog._revlog
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7361
diff changeset
   157
25300
678d0bfdd31a repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24863
diff changeset
   158
    curtr = repo.currenttransaction()
678d0bfdd31a repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24863
diff changeset
   159
    if curtr is not None:
678d0bfdd31a repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24863
diff changeset
   160
        del curtr  # avoid carrying reference to transaction for nothing
31645
7095e783958d repair: use ProgrammingError
Jun Wu <quark@fb.com>
parents: 31626
diff changeset
   161
        raise error.ProgrammingError('cannot strip from inside a transaction')
25300
678d0bfdd31a repair: forbid strip from inside a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24863
diff changeset
   162
27873
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   163
    try:
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   164
        with repo.transaction("strip") as tr:
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   165
            offset = len(tr.entries)
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7361
diff changeset
   166
27873
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   167
            tr.startgroup()
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   168
            cl.strip(striprev, tr)
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   169
            mfst.strip(striprev, tr)
32196
a2be2abe9476 strip: move tree strip logic to it's own function
Durham Goode <durham@fb.com>
parents: 31875
diff changeset
   170
            striptrees(repo, tr, striprev, files)
a2be2abe9476 strip: move tree strip logic to it's own function
Durham Goode <durham@fb.com>
parents: 31875
diff changeset
   171
27873
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   172
            for fn in files:
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   173
                repo.file(fn).strip(striprev, tr)
60ea60fea5f3 with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27871
diff changeset
   174
            tr.endgroup()
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7361
diff changeset
   175
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
   176
            for i in xrange(offset, len(tr.entries)):
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
   177
                file, troffset, ignore = tr.entries[i]
30001
e38d85be978f repair: open a file with checkambig=True to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29954
diff changeset
   178
                with repo.svfs(file, 'a', checkambig=True) as fp:
e38d85be978f repair: open a file with checkambig=True to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29954
diff changeset
   179
                    fp.truncate(troffset)
20885
f49d60fa40a5 fncache: clean up fncache during strips
Durham Goode <durham@fb.com>
parents: 20074
diff changeset
   180
                if troffset == 0:
f49d60fa40a5 fncache: clean up fncache during strips
Durham Goode <durham@fb.com>
parents: 20074
diff changeset
   181
                    repo.store.markremoved(file)
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
   182
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   183
        if tmpbundlefile:
11202
f974fe896921 strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents: 11200
diff changeset
   184
            ui.note(_("adding branch\n"))
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   185
            f = vfs.open(tmpbundlefile, "rb")
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   186
            gen = exchange.readbundle(ui, f, tmpbundlefile, vfs)
11202
f974fe896921 strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents: 11200
diff changeset
   187
            if not repo.ui.verbose:
f974fe896921 strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents: 11200
diff changeset
   188
                # silence internal shuffling chatter
f974fe896921 strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents: 11200
diff changeset
   189
                repo.ui.pushbuffer()
23898
b21c2e0ee8a3 repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents: 23895
diff changeset
   190
            if isinstance(gen, bundle2.unbundle20):
27875
add2ba16430e with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27873
diff changeset
   191
                with repo.transaction('strip') as tr:
add2ba16430e with: use context manager for transaction in strip
Bryan O'Sullivan <bryano@fb.com>
parents: 27873
diff changeset
   192
                    tr.hookargs = {'source': 'strip',
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   193
                                   'url': 'bundle:' + vfs.join(tmpbundlefile)}
26797
75d550b7d8f5 strip: pass source and url to bundle2 processing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26701
diff changeset
   194
                    bundle2.applybundle(repo, gen, tr, source='strip',
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   195
                                        url='bundle:' + vfs.join(tmpbundlefile))
23898
b21c2e0ee8a3 repair: add experimental option to write bundle2 files
Eric Sumner <ericsumner@fb.com>
parents: 23895
diff changeset
   196
            else:
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   197
                gen.apply(repo, 'strip', 'bundle:' + vfs.join(tmpbundlefile),
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   198
                          True)
11202
f974fe896921 strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents: 11200
diff changeset
   199
            if not repo.ui.verbose:
f974fe896921 strip: hide unbundle messages by default
Matt Mackall <mpm@selenic.com>
parents: 11200
diff changeset
   200
                repo.ui.popbuffer()
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
   201
            f.close()
29196
bf7b8157c483 strip: invalidate phase cache after stripping changeset (issue5235)
Laurent Charignon <lcharignon@fb.com>
parents: 28868
diff changeset
   202
        repo._phasecache.invalidate()
13362
ee01d9d84115 bookmarks: move strip support to repair
Matt Mackall <mpm@selenic.com>
parents: 12057
diff changeset
   203
27157
5f2e4eb08e41 repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26797
diff changeset
   204
        for m in updatebm:
5f2e4eb08e41 repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26797
diff changeset
   205
            bm[m] = repo[newbmtarget].node()
31626
0febf8e4e2ce repair: use context manager for lock management
Matt Harbison <matt_harbison@yahoo.com>
parents: 31324
diff changeset
   206
0febf8e4e2ce repair: use context manager for lock management
Matt Harbison <matt_harbison@yahoo.com>
parents: 31324
diff changeset
   207
        with repo.lock():
0febf8e4e2ce repair: use context manager for lock management
Matt Harbison <matt_harbison@yahoo.com>
parents: 31324
diff changeset
   208
            with repo.transaction('repair') as tr:
0febf8e4e2ce repair: use context manager for lock management
Matt Harbison <matt_harbison@yahoo.com>
parents: 31324
diff changeset
   209
                bm.recordchange(tr)
27157
5f2e4eb08e41 repair: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26797
diff changeset
   210
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
   211
        # remove undo files
20975
37cdf1fca1b2 localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20933
diff changeset
   212
        for undovfs, undofile in repo.undofiles():
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
   213
            try:
20975
37cdf1fca1b2 localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20933
diff changeset
   214
                undovfs.unlink(undofile)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25652
diff changeset
   215
            except OSError as e:
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
   216
                if e.errno != errno.ENOENT:
20975
37cdf1fca1b2 localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20933
diff changeset
   217
                    ui.warn(_('error removing %s: %s\n') %
37cdf1fca1b2 localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20933
diff changeset
   218
                            (undovfs.join(undofile), str(e)))
16237
b5c0c7d0f83f repair: remove undo files after strip
Idan Kamara <idankk86@gmail.com>
parents: 15901
diff changeset
   219
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16628
diff changeset
   220
    except: # re-raises
11197
4bb4895e1693 strip: be quiet about temporary internal bundle
Matt Mackall <mpm@selenic.com>
parents: 10881
diff changeset
   221
        if backupfile:
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   222
            ui.warn(_("strip failed, backup bundle stored in '%s'\n")
20979
ad5b61370514 repair: make "strip()" treat bundle files via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20977
diff changeset
   223
                    % vfs.join(backupfile))
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   224
        if tmpbundlefile:
29953
94ebf56db04e strip: clarify that user action is required to recover temp bundle
Martin von Zweigbergk <martinvonz@google.com>
parents: 29952
diff changeset
   225
            ui.warn(_("strip failed, unrecovered changes stored in '%s'\n")
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   226
                    % vfs.join(tmpbundlefile))
29953
94ebf56db04e strip: clarify that user action is required to recover temp bundle
Martin von Zweigbergk <martinvonz@google.com>
parents: 29952
diff changeset
   227
            ui.warn(_("(fix the problem, then recover the changesets with "
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   228
                      "\"hg unbundle '%s'\")\n") % vfs.join(tmpbundlefile))
8073
e8a28556a0a8 strip: make repair.strip transactional to avoid repository corruption
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7361
diff changeset
   229
        raise
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21064
diff changeset
   230
    else:
29954
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   231
        if tmpbundlefile:
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   232
            # Remove temporary bundle only if there were no exceptions
769aee32fae0 strip: don't use "full" and "partial" to describe bundles
Martin von Zweigbergk <martinvonz@google.com>
parents: 29953
diff changeset
   233
            vfs.unlink(tmpbundlefile)
4702
18e91c9def0c strip: move strip code to a new repair module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   234
18395
904b7109938e destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18311
diff changeset
   235
    repo.destroyed()
30274
c1345969f6c5 repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents: 30001
diff changeset
   236
    # return the backup file path (or None if 'backup' was False) so
c1345969f6c5 repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents: 30001
diff changeset
   237
    # extensions can use it
c1345969f6c5 repair: make strip() return backup file path
Martin von Zweigbergk <martinvonz@google.com>
parents: 30001
diff changeset
   238
    return backupfile
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   239
32196
a2be2abe9476 strip: move tree strip logic to it's own function
Durham Goode <durham@fb.com>
parents: 31875
diff changeset
   240
def striptrees(repo, tr, striprev, files):
a2be2abe9476 strip: move tree strip logic to it's own function
Durham Goode <durham@fb.com>
parents: 31875
diff changeset
   241
    if 'treemanifest' in repo.requirements: # safe but unnecessary
a2be2abe9476 strip: move tree strip logic to it's own function
Durham Goode <durham@fb.com>
parents: 31875
diff changeset
   242
                                            # otherwise
32296
7e07d5836063 hg: backout optimizing for treemanifests
Durham Goode <durham@fb.com>
parents: 32197
diff changeset
   243
        for unencoded, encoded, size in repo.store.datafiles():
7e07d5836063 hg: backout optimizing for treemanifests
Durham Goode <durham@fb.com>
parents: 32197
diff changeset
   244
            if (unencoded.startswith('meta/') and
7e07d5836063 hg: backout optimizing for treemanifests
Durham Goode <durham@fb.com>
parents: 32197
diff changeset
   245
                unencoded.endswith('00manifest.i')):
7e07d5836063 hg: backout optimizing for treemanifests
Durham Goode <durham@fb.com>
parents: 32197
diff changeset
   246
                dir = unencoded[5:-12]
7e07d5836063 hg: backout optimizing for treemanifests
Durham Goode <durham@fb.com>
parents: 32197
diff changeset
   247
                repo.manifestlog._revlog.dirlog(dir).strip(striprev, tr)
32196
a2be2abe9476 strip: move tree strip logic to it's own function
Durham Goode <durham@fb.com>
parents: 31875
diff changeset
   248
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   249
def rebuildfncache(ui, repo):
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   250
    """Rebuilds the fncache file from repo history.
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   251
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   252
    Missing entries will be added. Extra entries will be removed.
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   253
    """
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   254
    repo = repo.unfiltered()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   255
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   256
    if 'fncache' not in repo.requirements:
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   257
        ui.warn(_('(not rebuilding fncache because repository does not '
25874
3e84f40232c7 repair: fix typo in warning message
Wagner Bruna <wbruna@yahoo.com>
parents: 25845
diff changeset
   258
                  'support fncache)\n'))
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   259
        return
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   260
27860
0da102e4f203 with: use context manager in rebuildfncache again
Bryan O'Sullivan <bryano@fb.com>
parents: 27553
diff changeset
   261
    with repo.lock():
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   262
        fnc = repo.store.fncache
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   263
        # Trigger load of fncache.
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   264
        if 'irrelevant' in fnc:
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   265
            pass
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   266
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   267
        oldentries = set(fnc.entries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   268
        newentries = set()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   269
        seenfiles = set()
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   270
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   271
        repolen = len(repo)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   272
        for rev in repo:
28466
c7d45c5a8cea repair: specify unit for ui.progress in rebuildfncache()
Anton Shestakov <av6@dwimlabs.net>
parents: 28465
diff changeset
   273
            ui.progress(_('rebuilding'), rev, total=repolen,
c7d45c5a8cea repair: specify unit for ui.progress in rebuildfncache()
Anton Shestakov <av6@dwimlabs.net>
parents: 28465
diff changeset
   274
                        unit=_('changesets'))
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   275
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   276
            ctx = repo[rev]
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   277
            for f in ctx.files():
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   278
                # This is to minimize I/O.
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   279
                if f in seenfiles:
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   280
                    continue
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   281
                seenfiles.add(f)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   282
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   283
                i = 'data/%s.i' % f
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   284
                d = 'data/%s.d' % f
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   285
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   286
                if repo.store._exists(i):
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   287
                    newentries.add(i)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   288
                if repo.store._exists(d):
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   289
                    newentries.add(d)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   290
28465
43eb31ea2dcb repair: use 'rebuilding' progress topic in rebuildfncache()
Anton Shestakov <av6@dwimlabs.net>
parents: 28031
diff changeset
   291
        ui.progress(_('rebuilding'), None)
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   292
28031
6f248ba85309 treemanifest: fix debugrebuildfncache
Martin von Zweigbergk <martinvonz@google.com>
parents: 28007
diff changeset
   293
        if 'treemanifest' in repo.requirements: # safe but unnecessary otherwise
28007
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   294
            for dir in util.dirs(seenfiles):
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   295
                i = 'meta/%s/00manifest.i' % dir
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   296
                d = 'meta/%s/00manifest.d' % dir
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   297
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   298
                if repo.store._exists(i):
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   299
                    newentries.add(i)
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   300
                if repo.store._exists(d):
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   301
                    newentries.add(d)
fb92927f9775 treemanifests: fix streaming clone
Martin von Zweigbergk <martinvonz@google.com>
parents: 27930
diff changeset
   302
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   303
        addcount = len(newentries - oldentries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   304
        removecount = len(oldentries - newentries)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   305
        for p in sorted(oldentries - newentries):
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   306
            ui.write(_('removing %s\n') % p)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   307
        for p in sorted(newentries - oldentries):
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   308
            ui.write(_('adding %s\n') % p)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   309
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   310
        if addcount or removecount:
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   311
            ui.write(_('%d items added, %d removed from fncache\n') %
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   312
                     (addcount, removecount))
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   313
            fnc.entries = newentries
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   314
            fnc._dirty = True
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   315
27871
f1c316fd91f9 with: use context manager in rebuildfncache
Bryan O'Sullivan <bryano@fb.com>
parents: 27860
diff changeset
   316
            with repo.transaction('fncache') as tr:
25652
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   317
                fnc.write(tr)
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   318
        else:
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   319
            ui.write(_('fncache already up to date\n'))
2882d6886919 repair: add functionality to rebuild fncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25404
diff changeset
   320
26624
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   321
def stripbmrevset(repo, mark):
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   322
    """
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   323
    The revset to strip when strip is called with -B mark
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   324
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   325
    Needs to live here so extensions can use it and wrap it even when strip is
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   326
    not enabled or not present on a box.
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   327
    """
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   328
    return repo.revs("ancestors(bookmark(%s)) - "
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   329
                     "ancestors(head() and not bookmark(%s)) - "
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   330
                     "ancestors(bookmark() and not bookmark(%s))",
bcace0fbb4c8 strip: factor out revset calculation for strip -B
Ryan McElroy <rmcelroy@fb.com>
parents: 26587
diff changeset
   331
                     mark, mark, mark)
28868
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   332
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   333
def deleteobsmarkers(obsstore, indices):
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   334
    """Delete some obsmarkers from obsstore and return how many were deleted
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   335
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   336
    'indices' is a list of ints which are the indices
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   337
    of the markers to be deleted.
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   338
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   339
    Every invocation of this function completely rewrites the obsstore file,
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   340
    skipping the markers we want to be removed. The new temporary file is
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   341
    created, remaining markers are written there and on .close() this file
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   342
    gets atomically renamed to obsstore, thus guaranteeing consistency."""
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   343
    if not indices:
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   344
        # we don't want to rewrite the obsstore with the same content
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   345
        return
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   346
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   347
    left = []
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   348
    current = obsstore._all
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   349
    n = 0
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   350
    for i, m in enumerate(current):
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   351
        if i in indices:
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   352
            n += 1
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   353
            continue
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   354
        left.append(m)
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   355
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   356
    newobsstorefile = obsstore.svfs('obsstore', 'w', atomictemp=True)
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   357
    for bytes in obsolete.encodemarkers(left, True, obsstore._version):
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   358
        newobsstorefile.write(bytes)
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   359
    newobsstorefile.close()
445a25bb70be obsstore: move delete function from obsstore class to repair module
Kostia Balytskyi <ikostia@fb.com>
parents: 28666
diff changeset
   360
    return n