mercurial/shelve.py
author Raphaël Gomès <rgomes@octobus.net>
Tue, 27 Jun 2023 18:24:54 +0200
changeset 51192 65c9032e2e5a
parent 51100 ae6722dbb575
child 51813 54b1a3738530
permissions -rw-r--r--
rust-index: synchronize append method We now append to the Rust index just as we do to the C index. Future steps will bring the two indexes further together until we can rip the C index entirely when running Rust code.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     1
# shelve.py - save/restore working directory state
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     2
#
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     3
# Copyright 2013 Facebook, Inc.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     4
#
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     7
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     8
"""save and restore changes to the working directory
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
     9
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    10
The "hg shelve" command saves changes made to the working directory
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    11
and reverts those changes, resetting the working directory to a clean
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    12
state.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    13
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    14
Later on, the "hg unshelve" command restores the changes saved by "hg
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    15
shelve". Changes can be restored even after updating to a different
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    16
parent, in which case Mercurial's merge machinery will resolve any
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    17
conflicts if necessary.
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    18
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    19
You can have more than one shelved change outstanding at a time; each
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    20
shelved change has a distinct name. For details, see the help for "hg
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    21
shelve".
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    22
"""
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    23
25113
0ca8410ea345 util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents: 25104
diff changeset
    24
import collections
49426
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
    25
import io
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
    26
import itertools
36781
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36607
diff changeset
    27
import stat
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28862
diff changeset
    28
42541
3de4f17f4824 shelve: move shelve extension to core
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42540
diff changeset
    29
from .i18n import _
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    30
from .node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    31
    bin,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    32
    hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    33
    nullrev,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    34
)
42541
3de4f17f4824 shelve: move shelve extension to core
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42540
diff changeset
    35
from . import (
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
    36
    bookmarks,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    37
    bundle2,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    38
    changegroup,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    39
    cmdutil,
34097
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33440
diff changeset
    40
    discovery,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    41
    error,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    42
    exchange,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    43
    hg,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    44
    lock as lockmod,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    45
    mdiff,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    46
    merge,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44595
diff changeset
    47
    mergestate as mergestatemod,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    48
    patch,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    49
    phases,
35005
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
    50
    pycompat,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    51
    repair,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    52
    scmutil,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    53
    templatefilters,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    54
    util,
31244
636f55b9ba23 vfs: use 'vfs' module directly in 'hgext.shelve'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31096
diff changeset
    55
    vfs as vfsmod,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    56
)
42541
3de4f17f4824 shelve: move shelve extension to core
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42540
diff changeset
    57
from .utils import (
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
    58
    dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
    59
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
    60
)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    61
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    62
backupdir = b'shelve-backup'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    63
shelvedir = b'shelved'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    64
shelvefileextensions = [b'hg', b'patch', b'shelve']
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
    65
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
    66
# we never need the user, so we use a
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
    67
# generic user for all shelve operations
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    68
shelveuser = b'shelve@localhost'
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
    69
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
    70
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
    71
class ShelfDir:
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    72
    def __init__(self, repo, for_backups=False):
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    73
        if for_backups:
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    74
            self.vfs = vfsmod.vfs(repo.vfs.join(backupdir))
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    75
        else:
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    76
            self.vfs = vfsmod.vfs(repo.vfs.join(shelvedir))
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    77
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    78
    def get(self, name):
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    79
        return Shelf(self.vfs, name)
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
    80
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    81
    def listshelves(self):
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    82
        """return all shelves in repo as list of (time, name)"""
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    83
        try:
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    84
            names = self.vfs.listdir()
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
    85
        except FileNotFoundError:
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    86
            return []
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    87
        info = []
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    88
        seen = set()
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    89
        for filename in names:
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    90
            name = filename.rsplit(b'.', 1)[0]
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    91
            if name in seen:
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    92
                continue
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    93
            seen.add(name)
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    94
            shelf = self.get(name)
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    95
            if not shelf.exists():
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    96
                continue
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    97
            mtime = shelf.mtime()
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    98
            info.append((mtime, name))
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
    99
        return sorted(info, reverse=True)
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   100
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   101
49430
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   102
def _use_internal_phase(repo):
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   103
    return (
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   104
        phases.supportinternal(repo)
49457
53229e170496 phase-shelve: correct unicode string to honor 'shelve.store=internal'
Jason R. Coombs <jaraco@jaraco.com>
parents: 49430
diff changeset
   105
        and repo.ui.config(b'shelve', b'store') == b'internal'
49430
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   106
    )
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   107
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   108
49429
fa00c407d61c phase-shelve: Extract function for _target_phase
Jason R. Coombs <jaraco@jaraco.com>
parents: 49427
diff changeset
   109
def _target_phase(repo):
49430
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   110
    return phases.internal if _use_internal_phase(repo) else phases.secret
49429
fa00c407d61c phase-shelve: Extract function for _target_phase
Jason R. Coombs <jaraco@jaraco.com>
parents: 49427
diff changeset
   111
fa00c407d61c phase-shelve: Extract function for _target_phase
Jason R. Coombs <jaraco@jaraco.com>
parents: 49427
diff changeset
   112
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   113
class Shelf:
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   114
    """Represents a shelf, including possibly multiple files storing it.
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   115
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   116
    Old shelves will have a .patch and a .hg file. Newer shelves will
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   117
    also have a .shelve file. This class abstracts away some of the
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   118
    differences and lets you work with the shelf as a whole.
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   119
    """
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   120
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   121
    def __init__(self, vfs, name):
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   122
        self.vfs = vfs
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   123
        self.name = name
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   124
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   125
    def exists(self):
49427
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   126
        return self._exists(b'.shelve') or self._exists(b'.patch', b'.hg')
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   127
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   128
    def _exists(self, *exts):
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   129
        return all(self.vfs.exists(self.name + ext) for ext in exts)
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   130
46280
7e300d297547 shelve: move method for getting stat (mtime) to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46279
diff changeset
   131
    def mtime(self):
49427
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   132
        try:
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   133
            return self._stat(b'.shelve')[stat.ST_MTIME]
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   134
        except FileNotFoundError:
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   135
            return self._stat(b'.patch')[stat.ST_MTIME]
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   136
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   137
    def _stat(self, ext):
c4417029e6c2 phase-shelve: honor and prefer obs shelves for existence and modified time
Jason R. Coombs <jaraco@jaraco.com>
parents: 49426
diff changeset
   138
        return self.vfs.stat(self.name + ext)
46280
7e300d297547 shelve: move method for getting stat (mtime) to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46279
diff changeset
   139
46274
a344ec05b99c shelve: move method for writing .shelve to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46273
diff changeset
   140
    def writeinfo(self, info):
a344ec05b99c shelve: move method for writing .shelve to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46273
diff changeset
   141
        scmutil.simplekeyvaluefile(self.vfs, self.name + b'.shelve').write(info)
a344ec05b99c shelve: move method for writing .shelve to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46273
diff changeset
   142
46286
3b08f56c8a11 shelve: teach new shelf class to check if .shelve file exists
Martin von Zweigbergk <martinvonz@google.com>
parents: 46285
diff changeset
   143
    def hasinfo(self):
3b08f56c8a11 shelve: teach new shelf class to check if .shelve file exists
Martin von Zweigbergk <martinvonz@google.com>
parents: 46285
diff changeset
   144
        return self.vfs.exists(self.name + b'.shelve')
3b08f56c8a11 shelve: teach new shelf class to check if .shelve file exists
Martin von Zweigbergk <martinvonz@google.com>
parents: 46285
diff changeset
   145
46275
157305bf859f shelve: move method for reading .shelve file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46274
diff changeset
   146
    def readinfo(self):
157305bf859f shelve: move method for reading .shelve file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46274
diff changeset
   147
        return scmutil.simplekeyvaluefile(
157305bf859f shelve: move method for reading .shelve file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46274
diff changeset
   148
            self.vfs, self.name + b'.shelve'
157305bf859f shelve: move method for reading .shelve file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46274
diff changeset
   149
        ).read()
157305bf859f shelve: move method for reading .shelve file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46274
diff changeset
   150
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   151
    def writebundle(self, repo, bases, node):
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   152
        cgversion = changegroup.safeversion(repo)
46276
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   153
        if cgversion == b'01':
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   154
            btype = b'HG10BZ'
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   155
            compression = None
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   156
        else:
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   157
            btype = b'HG20'
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   158
            compression = b'BZ'
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   159
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   160
        repo = repo.unfiltered()
46276
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   161
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   162
        outgoing = discovery.outgoing(
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   163
            repo, missingroots=bases, ancestorsof=[node]
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   164
        )
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   165
        cg = changegroup.makechangegroup(repo, outgoing, cgversion, b'shelve')
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   166
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   167
        bundle_filename = self.vfs.join(self.name + b'.hg')
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   168
        bundle2.writebundle(
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   169
            repo.ui,
46276
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   170
            cg,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   171
            bundle_filename,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   172
            btype,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   173
            self.vfs,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   174
            compression=compression,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   175
        )
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   176
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   177
    def applybundle(self, repo, tr):
46277
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   178
        filename = self.name + b'.hg'
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   179
        fp = self.vfs(filename)
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   180
        try:
49429
fa00c407d61c phase-shelve: Extract function for _target_phase
Jason R. Coombs <jaraco@jaraco.com>
parents: 49427
diff changeset
   181
            targetphase = _target_phase(repo)
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   182
            gen = exchange.readbundle(repo.ui, fp, filename, self.vfs)
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   183
            pretip = repo[b'tip']
46277
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   184
            bundle2.applybundle(
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   185
                repo,
46277
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   186
                gen,
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   187
                tr,
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   188
                source=b'unshelve',
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   189
                url=b'bundle:' + self.vfs.join(filename),
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   190
                targetphase=targetphase,
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   191
            )
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   192
            shelvectx = repo[b'tip']
46277
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   193
            if pretip == shelvectx:
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   194
                shelverev = tr.changes[b'revduplicates'][-1]
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   195
                shelvectx = repo[shelverev]
46277
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   196
            return shelvectx
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   197
        finally:
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   198
            fp.close()
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   199
46278
58ca94869287 shelve: move function for opening .patch file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46277
diff changeset
   200
    def open_patch(self, mode=b'rb'):
58ca94869287 shelve: move function for opening .patch file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46277
diff changeset
   201
        return self.vfs(self.name + b'.patch', mode)
58ca94869287 shelve: move function for opening .patch file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46277
diff changeset
   202
49426
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   203
    def patch_from_node(self, repo, node):
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   204
        repo = repo.unfiltered()
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   205
        match = _optimized_match(repo, node)
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   206
        fp = io.BytesIO()
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   207
        cmdutil.exportfile(
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   208
            repo,
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   209
            [node],
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   210
            fp,
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   211
            opts=mdiff.diffopts(git=True),
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   212
            match=match,
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   213
        )
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   214
        fp.seek(0)
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   215
        return fp
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   216
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   217
    def load_patch(self, repo):
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   218
        try:
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   219
            # prefer node-based shelf
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   220
            return self.patch_from_node(repo, self.readinfo()[b'node'])
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   221
        except (FileNotFoundError, error.RepoLookupError):
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   222
            return self.open_patch()
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   223
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   224
    def _backupfilename(self, backupvfs, filename):
46285
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   225
        def gennames(base):
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   226
            yield base
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   227
            base, ext = base.rsplit(b'.', 1)
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   228
            for i in itertools.count(1):
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   229
                yield b'%s-%d.%s' % (base, i, ext)
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   230
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   231
        for n in gennames(filename):
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   232
            if not backupvfs.exists(n):
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   233
                return backupvfs.join(n)
46285
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   234
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   235
    def movetobackup(self, backupvfs):
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   236
        if not backupvfs.isdir():
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   237
            backupvfs.makedir()
46285
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   238
        for suffix in shelvefileextensions:
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   239
            filename = self.name + b'.' + suffix
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   240
            if self.vfs.exists(filename):
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   241
                util.rename(
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   242
                    self.vfs.join(filename),
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   243
                    self._backupfilename(backupvfs, filename),
46285
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   244
                )
e79f8ae0901b shelve: move method for creating backup to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46284
diff changeset
   245
46295
f8c5e6ecd008 shelve: add a method for deleting shelf to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46294
diff changeset
   246
    def delete(self):
f8c5e6ecd008 shelve: add a method for deleting shelf to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46294
diff changeset
   247
        for ext in shelvefileextensions:
f8c5e6ecd008 shelve: add a method for deleting shelf to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46294
diff changeset
   248
            self.vfs.tryunlink(self.name + b'.' + ext)
f8c5e6ecd008 shelve: add a method for deleting shelf to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46294
diff changeset
   249
49586
636cd96806a7 shelve: add Shelf.changed_files for resolving changed files in a plugin
Jason R. Coombs <jaraco@jaraco.com>
parents: 49560
diff changeset
   250
    def changed_files(self, ui, repo):
636cd96806a7 shelve: add Shelf.changed_files for resolving changed files in a plugin
Jason R. Coombs <jaraco@jaraco.com>
parents: 49560
diff changeset
   251
        try:
636cd96806a7 shelve: add Shelf.changed_files for resolving changed files in a plugin
Jason R. Coombs <jaraco@jaraco.com>
parents: 49560
diff changeset
   252
            ctx = repo.unfiltered()[self.readinfo()[b'node']]
636cd96806a7 shelve: add Shelf.changed_files for resolving changed files in a plugin
Jason R. Coombs <jaraco@jaraco.com>
parents: 49560
diff changeset
   253
            return ctx.files()
636cd96806a7 shelve: add Shelf.changed_files for resolving changed files in a plugin
Jason R. Coombs <jaraco@jaraco.com>
parents: 49560
diff changeset
   254
        except (FileNotFoundError, error.RepoLookupError):
636cd96806a7 shelve: add Shelf.changed_files for resolving changed files in a plugin
Jason R. Coombs <jaraco@jaraco.com>
parents: 49560
diff changeset
   255
            filename = self.vfs.join(self.name + b'.patch')
636cd96806a7 shelve: add Shelf.changed_files for resolving changed files in a plugin
Jason R. Coombs <jaraco@jaraco.com>
parents: 49560
diff changeset
   256
            return patch.changedfiles(ui, repo, filename)
636cd96806a7 shelve: add Shelf.changed_files for resolving changed files in a plugin
Jason R. Coombs <jaraco@jaraco.com>
parents: 49560
diff changeset
   257
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   258
49425
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   259
def _optimized_match(repo, node):
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   260
    """
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   261
    Create a matcher so that prefetch doesn't attempt to fetch
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   262
    the entire repository pointlessly, and as an optimisation
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   263
    for movedirstate, if needed.
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   264
    """
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   265
    return scmutil.matchfiles(repo, repo[node].files())
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   266
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   267
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   268
class shelvedstate:
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   269
    """Handle persistence during unshelving operations.
19909
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
   270
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
   271
    Handles saving and restoring a shelved state. Ensures that different
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   272
    versions of a shelved state are possible and handles them appropriately.
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   273
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   274
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   275
    _version = 2
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   276
    _filename = b'shelvedstate'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   277
    _keep = b'keep'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   278
    _nokeep = b'nokeep'
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   279
    # colon is essential to differentiate from a real bookmark name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   280
    _noactivebook = b':no-active-bookmark'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   281
    _interactive = b'interactive'
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   282
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   283
    @classmethod
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   284
    def _verifyandtransform(cls, d):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   285
        """Some basic shelvestate syntactic verification and transformation"""
19904
5b327880a660 shelve: drop pickle usage
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19887
diff changeset
   286
        try:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   287
            d[b'originalwctx'] = bin(d[b'originalwctx'])
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   288
            d[b'pendingctx'] = bin(d[b'pendingctx'])
49560
5f778b3a94ca shelve: handle empty parents and nodestoremove in shelvedstate (issue6748)
Jason R. Coombs <jaraco@jaraco.com>
parents: 49527
diff changeset
   289
            d[b'parents'] = [bin(h) for h in d[b'parents'].split(b' ') if h]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   290
            d[b'nodestoremove'] = [
49560
5f778b3a94ca shelve: handle empty parents and nodestoremove in shelvedstate (issue6748)
Jason R. Coombs <jaraco@jaraco.com>
parents: 49527
diff changeset
   291
                bin(h) for h in d[b'nodestoremove'].split(b' ') if h
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   292
            ]
49248
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
   293
        except (ValueError, KeyError) as err:
46640
e571fec5b606 shelve: fix conversion of exceptions to strings flagged by pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46361
diff changeset
   294
            raise error.CorruptedState(stringutil.forcebytestr(err))
32284
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   295
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   296
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   297
    def _getversion(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   298
        """Read version information from shelvestate file"""
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   299
        fp = repo.vfs(cls._filename)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   300
        try:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   301
            version = int(fp.readline().strip())
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   302
        except ValueError as err:
46640
e571fec5b606 shelve: fix conversion of exceptions to strings flagged by pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46361
diff changeset
   303
            raise error.CorruptedState(stringutil.forcebytestr(err))
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   304
        finally:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   305
            fp.close()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   306
        return version
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   307
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   308
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   309
    def _readold(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   310
        """Read the old position-based version of a shelvestate file"""
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   311
        # Order is important, because old shelvestate file uses it
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   312
        # to detemine values of fields (i.g. name is on the second line,
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   313
        # originalwctx is on the third and so forth). Please do not change.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   314
        keys = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   315
            b'version',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   316
            b'name',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   317
            b'originalwctx',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   318
            b'pendingctx',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
            b'parents',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   320
            b'nodestoremove',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   321
            b'branchtorestore',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   322
            b'keep',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   323
            b'activebook',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   324
        ]
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   325
        # this is executed only seldomly, so it is not a big deal
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   326
        # that we open this file twice
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   327
        fp = repo.vfs(cls._filename)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   328
        d = {}
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   329
        try:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   330
            for key in keys:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   331
                d[key] = fp.readline().strip()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   332
        finally:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   333
            fp.close()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   334
        return d
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   335
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   336
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   337
    def load(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   338
        version = cls._getversion(repo)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   339
        if version < cls._version:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   340
            d = cls._readold(repo)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   341
        elif version == cls._version:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   342
            d = scmutil.simplekeyvaluefile(repo.vfs, cls._filename).read(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   343
                firstlinenonkeyval=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   344
            )
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   345
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   346
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   347
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   348
                    b'this version of shelve is incompatible '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   349
                    b'with the version used in this repo'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   350
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   351
            )
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   352
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   353
        cls._verifyandtransform(d)
29536
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   354
        try:
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   355
            obj = cls()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   356
            obj.name = d[b'name']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   357
            obj.wctx = repo[d[b'originalwctx']]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   358
            obj.pendingctx = repo[d[b'pendingctx']]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   359
            obj.parents = d[b'parents']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   360
            obj.nodestoremove = d[b'nodestoremove']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   361
            obj.branchtorestore = d.get(b'branchtorestore', b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   362
            obj.keep = d.get(b'keep') == cls._keep
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   363
            obj.activebookmark = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   364
            if d.get(b'activebook', b'') != cls._noactivebook:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   365
                obj.activebookmark = d.get(b'activebook', b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   366
            obj.interactive = d.get(b'interactive') == cls._interactive
32284
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   367
        except (error.RepoLookupError, KeyError) as err:
36496
7af7443877da py3: replace str() with it's bytes equivalent in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36185
diff changeset
   368
            raise error.CorruptedState(pycompat.bytestr(err))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   369
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   370
        return obj
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   371
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   372
    @classmethod
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   373
    def save(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   374
        cls,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   375
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   376
        name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   377
        originalwctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   378
        pendingctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   379
        nodestoremove,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   380
        branchtorestore,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   381
        keep=False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   382
        activebook=b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   383
        interactive=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   384
    ):
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   385
        info = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   386
            b"name": name,
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   387
            b"originalwctx": hex(originalwctx.node()),
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   388
            b"pendingctx": hex(pendingctx.node()),
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   389
            b"parents": b' '.join([hex(p) for p in repo.dirstate.parents()]),
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   390
            b"nodestoremove": b' '.join([hex(n) for n in nodestoremove]),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   391
            b"branchtorestore": branchtorestore,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   392
            b"keep": cls._keep if keep else cls._nokeep,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   393
            b"activebook": activebook or cls._noactivebook,
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   394
        }
42662
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
   395
        if interactive:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   396
            info[b'interactive'] = cls._interactive
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   397
        scmutil.simplekeyvaluefile(repo.vfs, cls._filename).write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   398
            info, firstline=(b"%d" % cls._version)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   399
        )
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   400
19908
07ee5c8867ca shelve: use the class constant in the clear method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19904
diff changeset
   401
    @classmethod
07ee5c8867ca shelve: use the class constant in the clear method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19904
diff changeset
   402
    def clear(cls, repo):
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31244
diff changeset
   403
        repo.vfs.unlinkpath(cls._filename, ignoremissing=True)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   404
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   405
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   406
def cleanupoldbackups(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   407
    maxbackups = repo.ui.configint(b'shelve', b'maxbackups')
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   408
    backup_dir = ShelfDir(repo, for_backups=True)
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   409
    hgfiles = backup_dir.listshelves()
40029
e2697acd9381 cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents: 39889
diff changeset
   410
    if maxbackups > 0 and maxbackups < len(hgfiles):
46293
9cdef4c41c94 shelve: use listshelves() in cleanupoldbackups()
Martin von Zweigbergk <martinvonz@google.com>
parents: 46292
diff changeset
   411
        bordermtime = hgfiles[maxbackups - 1][0]
25774
4f8c20fe66f0 shelve: keep old backups if timestamp can't decide exact order of them
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25713
diff changeset
   412
    else:
4f8c20fe66f0 shelve: keep old backups if timestamp can't decide exact order of them
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25713
diff changeset
   413
        bordermtime = None
46293
9cdef4c41c94 shelve: use listshelves() in cleanupoldbackups()
Martin von Zweigbergk <martinvonz@google.com>
parents: 46292
diff changeset
   414
    for mtime, name in hgfiles[maxbackups:]:
25774
4f8c20fe66f0 shelve: keep old backups if timestamp can't decide exact order of them
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25713
diff changeset
   415
        if mtime == bordermtime:
4f8c20fe66f0 shelve: keep old backups if timestamp can't decide exact order of them
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25713
diff changeset
   416
            # keep it, because timestamp can't decide exact order of backups
4f8c20fe66f0 shelve: keep old backups if timestamp can't decide exact order of them
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25713
diff changeset
   417
            continue
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   418
        backup_dir.get(name).delete()
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   419
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   420
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   421
def _backupactivebookmark(repo):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   422
    activebookmark = repo._activebookmark
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   423
    if activebookmark:
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   424
        bookmarks.deactivate(repo)
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   425
    return activebookmark
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   426
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   427
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   428
def _restoreactivebookmark(repo, mark):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   429
    if mark:
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   430
        bookmarks.activate(repo, mark)
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   431
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   432
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   433
def _aborttransaction(repo, tr):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45860
diff changeset
   434
    """Abort current transaction for shelve/unshelve, but keep dirstate"""
50079
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   435
    # disable the transaction invalidation of the dirstate, to preserve the
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   436
    # current change in memory.
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   437
    ds = repo.dirstate
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   438
    # The assert below check that nobody else did such wrapping.
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   439
    #
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   440
    # These is not such other wrapping currently, but if someone try to
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   441
    # implement one in the future, this will explicitly break here instead of
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   442
    # misbehaving in subtle ways.
50195
11e6eee4b063 transaction: use the standard transaction mechanism to backup branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50079
diff changeset
   443
    current_branch = ds.branch()
50079
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   444
    assert 'invalidate' not in vars(ds)
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   445
    try:
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   446
        # note : we could simply disable the transaction abort callback, but
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   447
        # other code also tries to rollback and invalidate this.
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   448
        ds.invalidate = lambda: None
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   449
        tr.abort()
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   450
    finally:
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   451
        del ds.invalidate
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   452
    # manually write the change in memory since we can no longer rely on the
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   453
    # transaction to do so.
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   454
    assert repo.currenttransaction() is None
acd2a0267660 dirstate: simplify the shelve hack to not go through the disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50054
diff changeset
   455
    repo.dirstate.write(None)
50264
921f4834b7b5 branch: pass current transaction when writing branch in shelve
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50195
diff changeset
   456
    ds.setbranch(current_branch, None)
26522
10f14bb22950 shelve: add utility to abort current transaction but keep dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26520
diff changeset
   457
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   458
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   459
def getshelvename(repo, parent, opts):
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   460
    """Decide on the name this shelve is going to have"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   461
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   462
    def gennames():
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   463
        yield label
32968
4107eb8a5648 shelve: allow unlimited shelved changes per name
Jun Wu <quark@fb.com>
parents: 32930
diff changeset
   464
        for i in itertools.count(1):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   465
            yield b'%s-%02d' % (label, i)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   466
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   467
    name = opts.get(b'name')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   468
    label = repo._activebookmark or parent.branch() or b'default'
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   469
    # slashes aren't allowed in filenames, therefore we rename it
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   470
    label = label.replace(b'/', b'_')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   471
    label = label.replace(b'\\', b'_')
30671
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30554
diff changeset
   472
    # filenames must not start with '.' as it should not be hidden
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   473
    if label.startswith(b'.'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   474
        label = label.replace(b'.', b'_', 1)
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   475
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   476
    if name:
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   477
        if ShelfDir(repo).get(name).exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   478
            e = _(b"a shelved change named '%s' already exists") % name
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   479
            raise error.Abort(e)
30671
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30554
diff changeset
   480
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30554
diff changeset
   481
        # ensure we are not creating a subdirectory or a hidden file
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   482
        if b'/' in name or b'\\' in name:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   483
            raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   484
                _(b'shelved change names can not contain slashes')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   485
            )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   486
        if name.startswith(b'.'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   487
            raise error.Abort(_(b"shelved change names can not start with '.'"))
30671
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30554
diff changeset
   488
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   489
    else:
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   490
        shelf_dir = ShelfDir(repo)
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   491
        for n in gennames():
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   492
            if not shelf_dir.get(n).exists():
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   493
                name = n
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   494
                break
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   495
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   496
    return name
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   497
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   498
30380
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   499
def mutableancestors(ctx):
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   500
    """return all mutable ancestors for ctx (included)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   501
30380
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   502
    Much faster than the revset ancestors(ctx) & draft()"""
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   503
    seen = {nullrev}
30380
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   504
    visit = collections.deque()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   505
    visit.append(ctx)
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   506
    while visit:
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   507
        ctx = visit.popleft()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   508
        yield ctx.node()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   509
        for parent in ctx.parents():
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   510
            rev = parent.rev()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   511
            if rev not in seen:
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   512
                seen.add(rev)
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   513
                if parent.mutable():
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   514
                    visit.append(parent)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   515
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   516
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   517
def getcommitfunc(extra, interactive, editor=False):
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   518
    def commitfunc(ui, repo, message, match, opts):
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50596
diff changeset
   519
        hasmq = hasattr(repo, 'mq')
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   520
        if hasmq:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   521
            saved, repo.mq.checkapplied = repo.mq.checkapplied, False
39519
5d69e2412ec8 shelve: use the internal phase when possible
Boris Feld <boris.feld@octobus.net>
parents: 39387
diff changeset
   522
49429
fa00c407d61c phase-shelve: Extract function for _target_phase
Jason R. Coombs <jaraco@jaraco.com>
parents: 49427
diff changeset
   523
        targetphase = _target_phase(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   524
        overrides = {(b'phases', b'new-commit'): targetphase}
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   525
        try:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   526
            editor_ = False
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   527
            if editor:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   528
                editor_ = cmdutil.getcommiteditor(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   529
                    editform=b'shelve.shelve', **pycompat.strkwargs(opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   530
                )
31462
d1ce2124ec83 shelve: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31335
diff changeset
   531
            with repo.ui.configoverride(overrides):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   532
                return repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   533
                    message,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   534
                    shelveuser,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   535
                    opts.get(b'date'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   536
                    match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   537
                    editor=editor_,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   538
                    extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   539
                )
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   540
        finally:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   541
            if hasmq:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   542
                repo.mq.checkapplied = saved
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   543
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   544
    def interactivecommitfunc(ui, repo, *pats, **opts):
35005
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
   545
        opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   546
        match = scmutil.match(repo[b'.'], pats, {})
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   547
        message = opts[b'message']
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   548
        return commitfunc(ui, repo, message, match, opts)
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   549
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   550
    return interactivecommitfunc if interactive else commitfunc
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   551
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   552
30382
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   553
def _nothingtoshelvemessaging(ui, repo, pats, opts):
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   554
    stat = repo.status(match=scmutil.match(repo[None], pats, opts))
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   555
    if stat.deleted:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   556
        ui.status(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
   557
            _(b"nothing changed (%d missing files, see 'hg status')\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   558
            % len(stat.deleted)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   559
        )
30382
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   560
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   561
        ui.status(_(b"nothing changed\n"))
30382
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   562
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   563
42012
9b78bbb76111 shelve: refactor _shelvecreatedcommit's match object into calling site
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42011
diff changeset
   564
def _shelvecreatedcommit(repo, node, name, match):
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   565
    info = {b'node': hex(node)}
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   566
    shelf = ShelfDir(repo).get(name)
46287
ae7a77a7ebc0 shelve: extract some repeated creation of shelf instances to variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 46286
diff changeset
   567
    shelf.writeinfo(info)
30383
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30382
diff changeset
   568
    bases = list(mutableancestors(repo[node]))
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   569
    shelf.writebundle(repo, bases, node)
46287
ae7a77a7ebc0 shelve: extract some repeated creation of shelf instances to variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 46286
diff changeset
   570
    with shelf.open_patch(b'wb') as fp:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   571
        cmdutil.exportfile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   572
            repo, [node], fp, opts=mdiff.diffopts(git=True), match=match
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   573
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   574
30383
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30382
diff changeset
   575
30384
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30383
diff changeset
   576
def _includeunknownfiles(repo, pats, opts, extra):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   577
    s = repo.status(match=scmutil.match(repo[None], pats, opts), unknown=True)
30384
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30383
diff changeset
   578
    if s.unknown:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   579
        extra[b'shelve_unknown'] = b'\0'.join(s.unknown)
30384
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30383
diff changeset
   580
        repo[None].add(s.unknown)
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30383
diff changeset
   581
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   582
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   583
def _finishshelve(repo, tr):
49430
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   584
    if _use_internal_phase(repo):
39744
52dfa1eb0ad4 shelve: no longer strip internal commit when using internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39601
diff changeset
   585
        tr.close()
52dfa1eb0ad4 shelve: no longer strip internal commit when using internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39601
diff changeset
   586
    else:
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   587
        _aborttransaction(repo, tr)
30385
b573d7ca31c4 shelve: move shelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30384
diff changeset
   588
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   589
39342
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   590
def createcmd(ui, repo, pats, opts):
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   591
    """subcommand that creates a new shelve"""
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   592
    with repo.wlock():
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   593
        cmdutil.checkunfinished(repo)
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   594
        return _docreatecmd(ui, repo, pats, opts)
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   595
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   596
30380
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   597
def _docreatecmd(ui, repo, pats, opts):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   598
    wctx = repo[None]
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   599
    parents = wctx.parents()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   600
    parent = parents[0]
28571
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   601
    origbranch = wctx.branch()
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   602
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46640
diff changeset
   603
    if parent.rev() != nullrev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   604
        desc = b"changes to: %s" % parent.description().split(b'\n', 1)[0]
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   605
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   606
        desc = b'(changes in empty repository)'
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   607
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   608
    if not opts.get(b'message'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   609
        opts[b'message'] = desc
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   610
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   611
    lock = tr = activebookmark = None
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   612
    try:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   613
        lock = repo.lock()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   614
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19943
diff changeset
   615
        # use an uncommitted transaction to generate the bundle to avoid
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   616
        # pull races. ensure we don't print the abort message to stderr.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   617
        tr = repo.transaction(b'shelve', report=lambda x: None)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   618
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   619
        interactive = opts.get(b'interactive', False)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   620
        includeunknown = opts.get(b'unknown', False) and not opts.get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   621
            b'addremove', False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   622
        )
27908
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   623
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   624
        name = getshelvename(repo, parent, opts)
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   625
        activebookmark = _backupactivebookmark(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   626
        extra = {b'internal': b'shelve'}
27908
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   627
        if includeunknown:
50054
e2b89b6d4cdd dirstate: use `dirstate.change_files` to scope the change in `shelve`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50053
diff changeset
   628
            with repo.dirstate.changing_files(repo):
e2b89b6d4cdd dirstate: use `dirstate.change_files` to scope the change in `shelve`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50053
diff changeset
   629
                _includeunknownfiles(repo, pats, opts, extra)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   630
28572
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   631
        if _iswctxonnewbranch(repo) and not _isbareshelve(pats, opts):
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   632
            # In non-bare shelve we don't store newly created branch
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   633
            # at bundled commit
50264
921f4834b7b5 branch: pass current transaction when writing branch in shelve
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50195
diff changeset
   634
            repo.dirstate.setbranch(
921f4834b7b5 branch: pass current transaction when writing branch in shelve
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50195
diff changeset
   635
                repo[b'.'].branch(), repo.currenttransaction()
921f4834b7b5 branch: pass current transaction when writing branch in shelve
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50195
diff changeset
   636
            )
28572
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   637
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   638
        commitfunc = getcommitfunc(extra, interactive, editor=True)
24478
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   639
        if not interactive:
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   640
            node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   641
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   642
            node = cmdutil.dorecord(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   643
                ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   644
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   645
                commitfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   646
                None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   647
                False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   648
                cmdutil.recordfilter,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   649
                *pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   650
                **pycompat.strkwargs(opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   651
            )
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   652
        if not node:
30382
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   653
            _nothingtoshelvemessaging(ui, repo, pats, opts)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   654
            return 1
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   655
49425
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
   656
        match = _optimized_match(repo, node)
42012
9b78bbb76111 shelve: refactor _shelvecreatedcommit's match object into calling site
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42011
diff changeset
   657
        _shelvecreatedcommit(repo, node, name, match)
19874
5836edcbdc2e shelve: copy bookmarks and restore them after a commit
David Soria Parra <dsp@experimentalworks.net>
parents: 19856
diff changeset
   658
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   659
        ui.status(_(b'shelved as %s\n') % name)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   660
        if opts[b'keep']:
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   661
            with repo.dirstate.changing_parents(repo):
42013
50d5e64ec561 shelve: do not update when keeping changes, just move the dirstate
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42012
diff changeset
   662
                scmutil.movedirstate(repo, parent, match)
50d5e64ec561 shelve: do not update when keeping changes, just move the dirstate
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42012
diff changeset
   663
        else:
50d5e64ec561 shelve: do not update when keeping changes, just move the dirstate
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42012
diff changeset
   664
            hg.update(repo, parent.node())
45860
073bb7563931 shelve: clear merge state after partial shelve
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   665
            ms = mergestatemod.mergestate.read(repo)
073bb7563931 shelve: clear merge state after partial shelve
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   666
            if not ms.unresolvedcount():
073bb7563931 shelve: clear merge state after partial shelve
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   667
                ms.reset()
073bb7563931 shelve: clear merge state after partial shelve
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   668
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   669
        if origbranch != repo[b'.'].branch() and not _isbareshelve(pats, opts):
50264
921f4834b7b5 branch: pass current transaction when writing branch in shelve
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50195
diff changeset
   670
            repo.dirstate.setbranch(origbranch, repo.currenttransaction())
26523
1d23bf6cd90a shelve: restore shelved dirstate explicitly after aborting transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26522
diff changeset
   671
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   672
        _finishshelve(repo, tr)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   673
    finally:
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   674
        _restoreactivebookmark(repo, activebookmark)
27197
6df3ec5bb813 shelve: widen wlock scope of shelve for consistency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27092
diff changeset
   675
        lockmod.release(tr, lock)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   676
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   677
28571
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   678
def _isbareshelve(pats, opts):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   679
    return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   680
        not pats
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   681
        and not opts.get(b'interactive', False)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   682
        and not opts.get(b'include', False)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   683
        and not opts.get(b'exclude', False)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   684
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   685
28571
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   686
28572
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   687
def _iswctxonnewbranch(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   688
    return repo[None].branch() != repo[b'.'].branch()
28572
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   689
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   690
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   691
def cleanupcmd(ui, repo):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   692
    """subcommand that deletes all shelves"""
19909
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
   693
27835
c448d7e00bf9 with: use context manager for wlock in shelve cleanupcmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27834
diff changeset
   694
    with repo.wlock():
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   695
        shelf_dir = ShelfDir(repo)
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   696
        backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   697
        for _mtime, name in shelf_dir.listshelves():
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   698
            shelf_dir.get(name).movetobackup(backupvfs)
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   699
            cleanupoldbackups(repo)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   700
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   701
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   702
def deletecmd(ui, repo, pats):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   703
    """subcommand that deletes a specific shelve"""
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   704
    if not pats:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
   705
        raise error.InputError(_(b'no shelved changes specified!'))
27836
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   706
    with repo.wlock():
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   707
        backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
43719
cb23d9e3e21f shelve: fix a missing variable in the exception handler for delete
Matt Harbison <matt_harbison@yahoo.com>
parents: 43117
diff changeset
   708
        for name in pats:
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   709
            shelf = ShelfDir(repo).get(name)
46287
ae7a77a7ebc0 shelve: extract some repeated creation of shelf instances to variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 46286
diff changeset
   710
            if not shelf.exists():
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
   711
                raise error.InputError(
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
   712
                    _(b"shelved change '%s' not found") % name
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
   713
                )
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   714
            shelf.movetobackup(backupvfs)
27836
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   715
            cleanupoldbackups(repo)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   716
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   717
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   718
def listcmd(ui, repo, pats, opts):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   719
    """subcommand that displays the list of shelves"""
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   720
    pats = set(pats)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   721
    width = 80
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   722
    if not ui.plain():
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   723
        width = ui.termwidth()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   724
    namelabel = b'shelve.newest'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   725
    ui.pager(b'shelve')
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   726
    shelf_dir = ShelfDir(repo)
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   727
    for mtime, name in shelf_dir.listshelves():
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   728
        if pats and name not in pats:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   729
            continue
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   730
        ui.write(name, label=namelabel)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   731
        namelabel = b'shelve.name'
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   732
        if ui.quiet:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   733
            ui.write(b'\n')
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   734
            continue
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   735
        ui.write(b' ' * (16 - len(name)))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   736
        used = 16
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36496
diff changeset
   737
        date = dateutil.makedate(mtime)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   738
        age = b'(%s)' % templatefilters.age(date, abbrev=True)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   739
        ui.write(age, label=b'shelve.age')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   740
        ui.write(b' ' * (12 - len(age)))
19855
a3b285882724 shelve: new output format for shelve listings
David Soria Parra <dsp@experimentalworks.net>
parents: 19854
diff changeset
   741
        used += 12
49426
24ffd13893cc phase-shelve: read patch details from a (possibly internal) node in the repo
Jason R. Coombs <jaraco@jaraco.com>
parents: 49425
diff changeset
   742
        with shelf_dir.get(name).load_patch(repo) as fp:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   743
            while True:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   744
                line = fp.readline()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   745
                if not line:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   746
                    break
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   747
                if not line.startswith(b'#'):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   748
                    desc = line.rstrip()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   749
                    if ui.formatted():
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
   750
                        desc = stringutil.ellipsis(desc, width - used)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   751
                    ui.write(desc)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   752
                    break
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   753
            ui.write(b'\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   754
            if not (opts[b'patch'] or opts[b'stat']):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   755
                continue
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   756
            difflines = fp.readlines()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   757
            if opts[b'patch']:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   758
                for chunk, label in patch.difflabel(iter, difflines):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   759
                    ui.write(chunk, label=label)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   760
            if opts[b'stat']:
30407
e1677cc29da6 patch: remove unused git parameter from patch.diffstat()
Henning Schild <henning@hennsch.de>
parents: 30385
diff changeset
   761
                for chunk, label in patch.diffstatui(difflines, width=width):
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   762
                    ui.write(chunk, label=label)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   763
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   764
38715
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   765
def patchcmds(ui, repo, pats, opts):
30823
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
   766
    """subcommand that displays shelves"""
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   767
    shelf_dir = ShelfDir(repo)
30823
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
   768
    if len(pats) == 0:
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
   769
        shelves = shelf_dir.listshelves()
38715
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   770
        if not shelves:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   771
            raise error.Abort(_(b"there are no shelves to show"))
38715
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   772
        mtime, name = shelves[0]
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   773
        pats = [name]
25104
d6453f6fbdba shelve: allow --patch and --stat without --list for a single shelf
Tony Tung <tonytung@fb.com>
parents: 25103
diff changeset
   774
30823
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
   775
    for shelfname in pats:
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   776
        if not shelf_dir.get(shelfname).exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   777
            raise error.Abort(_(b"cannot find shelf %s") % shelfname)
25104
d6453f6fbdba shelve: allow --patch and --stat without --list for a single shelf
Tony Tung <tonytung@fb.com>
parents: 25103
diff changeset
   778
d6453f6fbdba shelve: allow --patch and --stat without --list for a single shelf
Tony Tung <tonytung@fb.com>
parents: 25103
diff changeset
   779
    listcmd(ui, repo, pats, opts)
d6453f6fbdba shelve: allow --patch and --stat without --list for a single shelf
Tony Tung <tonytung@fb.com>
parents: 25103
diff changeset
   780
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   781
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   782
def checkparents(repo, state):
19909
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
   783
    """check parent while resuming an unshelve"""
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   784
    if state.parents != repo.dirstate.parents():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   785
        raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
   786
            _(b'working directory parents do not match unshelve state')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   787
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   788
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   789
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   790
def _loadshelvedstate(ui, repo, opts):
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   791
    try:
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   792
        state = shelvedstate.load(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   793
        if opts.get(b'keep') is None:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   794
            opts[b'keep'] = state.keep
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
   795
    except FileNotFoundError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   796
        cmdutil.wrongtooltocontinue(repo, _(b'unshelve'))
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   797
    except error.CorruptedState as err:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   798
        ui.debug(pycompat.bytestr(err) + b'\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   799
        if opts.get(b'continue'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   800
            msg = _(b'corrupted shelved state file')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   801
            hint = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   802
                b'please run hg unshelve --abort to abort unshelve '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   803
                b'operation'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   804
            )
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   805
            raise error.Abort(msg, hint=hint)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   806
        elif opts.get(b'abort'):
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   807
            shelvedstate.clear(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   808
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   809
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   810
                    b'could not read shelved state file, your '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   811
                    b'working copy may be in an unexpected state\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   812
                    b'please update to some commit\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   813
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   814
            )
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   815
    return state
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   816
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   817
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   818
def unshelveabort(ui, repo, state):
19909
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
   819
    """subcommand that abort an in-progress unshelve"""
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   820
    with repo.lock():
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   821
        try:
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   822
            checkparents(repo, state)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   823
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
   824
            merge.clean_update(state.pendingctx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   825
            if state.activebookmark and state.activebookmark in repo._bookmarks:
38462
61e4cf1be5b2 shelve: directly handle the abort process
Boris Feld <boris.feld@octobus.net>
parents: 37967
diff changeset
   826
                bookmarks.activate(repo, state.activebookmark)
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   827
            mergefiles(ui, repo, state.wctx, state.pendingctx)
49430
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   828
            if not _use_internal_phase(repo):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   829
                repair.strip(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   830
                    ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   831
                )
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   832
        finally:
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   833
            shelvedstate.clear(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   834
            ui.warn(_(b"unshelve of '%s' aborted\n") % state.name)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   835
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   836
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   837
def hgabortunshelve(ui, repo):
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   838
    """logic to  abort unshelve using 'hg abort"""
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   839
    with repo.wlock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   840
        state = _loadshelvedstate(ui, repo, {b'abort': True})
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   841
        return unshelveabort(ui, repo, state)
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   842
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   843
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   844
def mergefiles(ui, repo, wctx, shelvectx):
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   845
    """updates to wctx and merges the changes from shelvectx into the
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   846
    dirstate."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   847
    with ui.configoverride({(b'ui', b'quiet'): True}):
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   848
        hg.update(repo, wctx.node())
45375
8c466bcb0879 revert: remove dangerous `parents` argument from `cmdutil.revert()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45151
diff changeset
   849
        cmdutil.revert(ui, repo, shelvectx)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   850
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   851
28573
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   852
def restorebranch(ui, repo, branchtorestore):
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   853
    if branchtorestore and branchtorestore != repo.dirstate.branch():
50264
921f4834b7b5 branch: pass current transaction when writing branch in shelve
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50195
diff changeset
   854
        repo.dirstate.setbranch(branchtorestore, repo.currenttransaction())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   855
        ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   856
            _(b'marked working directory as branch %s\n') % branchtorestore
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   857
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   858
28573
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   859
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   860
def unshelvecleanup(ui, repo, name, opts):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   861
    """remove related files after an unshelve"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   862
    if not opts.get(b'keep'):
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   863
        backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   864
        ShelfDir(repo).get(name).movetobackup(backupvfs)
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   865
        cleanupoldbackups(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   866
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   867
42662
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
   868
def unshelvecontinue(ui, repo, state, opts):
19909
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
   869
    """subcommand to continue an in-progress unshelve"""
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   870
    # We're finishing off a merge. First parent is our original
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   871
    # parent, second is the temporary "fake" commit we're unshelving.
42662
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
   872
    interactive = state.interactive
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
   873
    basename = state.name
27838
60b850b7e4ef with: use context manager for lock in continue
Bryan O'Sullivan <bryano@fb.com>
parents: 27837
diff changeset
   874
    with repo.lock():
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   875
        checkparents(repo, state)
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44595
diff changeset
   876
        ms = mergestatemod.mergestate.read(repo)
46361
dfca84970da8 cleanup: use mergestate.unresolvedcount() instead of bool(list(unresolved()))
Augie Fackler <augie@google.com>
parents: 46297
diff changeset
   877
        if ms.unresolvedcount():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   878
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   879
                _(b"unresolved conflicts, can't continue"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   880
                hint=_(b"see 'hg resolve', then 'hg unshelve --continue'"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   881
            )
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   882
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   883
        shelvectx = repo[state.parents[1]]
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   884
        pendingctx = state.pendingctx
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   885
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   886
        with repo.dirstate.changing_parents(repo):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   887
            repo.setparents(state.pendingctx.node(), repo.nullid)
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
   888
            repo.dirstate.write(repo.currenttransaction())
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
   889
49429
fa00c407d61c phase-shelve: Extract function for _target_phase
Jason R. Coombs <jaraco@jaraco.com>
parents: 49427
diff changeset
   890
        targetphase = _target_phase(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   891
        overrides = {(b'phases', b'new-commit'): targetphase}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   892
        with repo.ui.configoverride(overrides, b'unshelve'):
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   893
            with repo.dirstate.changing_parents(repo):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   894
                repo.setparents(state.parents[0], repo.nullid)
50052
1b044a63a98a shelve: adjust what happens in some `changing_parents` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   895
            newnode, ispartialunshelve = _createunshelvectx(
1b044a63a98a shelve: adjust what happens in some `changing_parents` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   896
                ui, repo, shelvectx, basename, interactive, opts
1b044a63a98a shelve: adjust what happens in some `changing_parents` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   897
            )
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   898
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   899
        if newnode is None:
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   900
            shelvectx = state.pendingctx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   901
            msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   902
                b'note: unshelved changes already existed '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   903
                b'in the working copy\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   904
            )
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   905
            ui.status(msg)
22842
d43d116a118c shelve: don't delete "." when rebase is a no-op (issue4398)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21852
diff changeset
   906
        else:
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   907
            # only strip the shelvectx if we produced one
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   908
            state.nodestoremove.append(newnode)
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   909
            shelvectx = repo[newnode]
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   910
45577
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45375
diff changeset
   911
        merge.update(pendingctx)
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   912
        mergefiles(ui, repo, state.wctx, shelvectx)
28573
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   913
        restorebranch(ui, repo, state.branchtorestore)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   914
49430
2064bbf7a1d5 phase-shelve: Implement a 'shelve.store' experimental config
Jason R. Coombs <jaraco@jaraco.com>
parents: 49429
diff changeset
   915
        if not _use_internal_phase(repo):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   916
            repair.strip(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   917
                ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   918
            )
42703
073cfff9aaef unshelve: delete shelvedstate after a successful unshelve --continue
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42702
diff changeset
   919
        shelvedstate.clear(repo)
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   920
        if not ispartialunshelve:
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   921
            unshelvecleanup(ui, repo, state.name, opts)
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   922
        _restoreactivebookmark(repo, state.activebookmark)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   923
        ui.status(_(b"unshelve of '%s' complete\n") % state.name)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   924
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   925
42614
117437f3f541 continue: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42599
diff changeset
   926
def hgcontinueunshelve(ui, repo):
117437f3f541 continue: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42599
diff changeset
   927
    """logic to resume unshelve using 'hg continue'"""
117437f3f541 continue: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42599
diff changeset
   928
    with repo.wlock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   929
        state = _loadshelvedstate(ui, repo, {b'continue': True})
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   930
        return unshelvecontinue(ui, repo, state, {b'keep': state.keep})
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   931
42614
117437f3f541 continue: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42599
diff changeset
   932
30453
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   933
def _commitworkingcopychanges(ui, repo, opts, tmpwctx):
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   934
    """Temporarily commit working copy changes before moving unshelve commit"""
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   935
    # Store pending changes in a commit and remember added in case a shelve
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   936
    # contains unknown files that are part of the pending change
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   937
    s = repo.status()
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   938
    addedbefore = frozenset(s.added)
30846
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
   939
    if not (s.modified or s.added or s.removed):
30453
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   940
        return tmpwctx, addedbefore
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   941
    ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   942
        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   943
            b"temporarily committing pending changes "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   944
            b"(restore with 'hg unshelve --abort')\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   945
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   946
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   947
    extra = {b'internal': b'shelve'}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   948
    commitfunc = getcommitfunc(extra=extra, interactive=False, editor=False)
30453
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   949
    tempopts = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   950
    tempopts[b'message'] = b"pending changes temporary commit"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   951
    tempopts[b'date'] = opts.get(b'date')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   952
    with ui.configoverride({(b'ui', b'quiet'): True}):
31757
473f2fcc7629 shelve: move ui.quiet manipulations to configoverride
Kostia Balytskyi <ikostia@fb.com>
parents: 31664
diff changeset
   953
        node = cmdutil.commit(ui, repo, commitfunc, [], tempopts)
30453
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   954
    tmpwctx = repo[node]
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   955
    return tmpwctx, addedbefore
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   956
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   957
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   958
def _unshelverestorecommit(ui, repo, tr, basename):
30454
672026aece64 shelve: move commit restoration logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30453
diff changeset
   959
    """Recreate commit in the repository during the unshelve"""
39373
6a71324cb68b shelve: handle shelved node on unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 39372
diff changeset
   960
    repo = repo.unfiltered()
39387
da84cca65036 shelve: fix crash on unshelve without .shelve metadata file
Yuya Nishihara <yuya@tcha.org>
parents: 39376
diff changeset
   961
    node = None
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
   962
    shelf = ShelfDir(repo).get(basename)
46287
ae7a77a7ebc0 shelve: extract some repeated creation of shelf instances to variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 46286
diff changeset
   963
    if shelf.hasinfo():
ae7a77a7ebc0 shelve: extract some repeated creation of shelf instances to variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 46286
diff changeset
   964
        node = shelf.readinfo()[b'node']
39374
c67c94c0e7ae shelve: look for shelved node in the repository before unbundling
Boris Feld <boris.feld@octobus.net>
parents: 39373
diff changeset
   965
    if node is None or node not in repo:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   966
        with ui.configoverride({(b'ui', b'quiet'): True}):
46291
e2713c68b477 shelve: replace repo instance in Shelf class by vfs instance
Martin von Zweigbergk <martinvonz@google.com>
parents: 46290
diff changeset
   967
            shelvectx = shelf.applybundle(repo, tr)
39375
38373da1af02 shelve: write metadata file on the fly if they are missing
Boris Feld <boris.feld@octobus.net>
parents: 39374
diff changeset
   968
        # We might not strip the unbundled changeset, so we should keep track of
38373da1af02 shelve: write metadata file on the fly if they are missing
Boris Feld <boris.feld@octobus.net>
parents: 39374
diff changeset
   969
        # the unshelve node in case we need to reuse it (eg: unshelve --keep)
38373da1af02 shelve: write metadata file on the fly if they are missing
Boris Feld <boris.feld@octobus.net>
parents: 39374
diff changeset
   970
        if node is None:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   971
            info = {b'node': hex(shelvectx.node())}
46287
ae7a77a7ebc0 shelve: extract some repeated creation of shelf instances to variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 46286
diff changeset
   972
            shelf.writeinfo(info)
39374
c67c94c0e7ae shelve: look for shelved node in the repository before unbundling
Boris Feld <boris.feld@octobus.net>
parents: 39373
diff changeset
   973
    else:
c67c94c0e7ae shelve: look for shelved node in the repository before unbundling
Boris Feld <boris.feld@octobus.net>
parents: 39373
diff changeset
   974
        shelvectx = repo[node]
c67c94c0e7ae shelve: look for shelved node in the repository before unbundling
Boris Feld <boris.feld@octobus.net>
parents: 39373
diff changeset
   975
30454
672026aece64 shelve: move commit restoration logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30453
diff changeset
   976
    return repo, shelvectx
672026aece64 shelve: move commit restoration logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30453
diff changeset
   977
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   978
42656
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   979
def _createunshelvectx(ui, repo, shelvectx, basename, interactive, opts):
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   980
    """Handles the creation of unshelve commit and updates the shelve if it
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   981
    was partially unshelved.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   982
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   983
    If interactive is:
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   984
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   985
      * False: Commits all the changes in the working directory.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   986
      * True: Prompts the user to select changes to unshelve and commit them.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   987
              Update the shelve with remaining changes.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   988
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   989
    Returns the node of the new commit formed and a bool indicating whether
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   990
    the shelve was partially unshelved.Creates a commit ctx to unshelve
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   991
    interactively or non-interactively.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   992
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   993
    The user might want to unshelve certain changes only from the stored
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   994
    shelve in interactive. So, we would create two commits. One with requested
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   995
    changes to unshelve at that time and the latter is shelved for future.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   996
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   997
    Here, we return both the newnode which is created interactively and a
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   998
    bool to know whether the shelve is partly done or completely done.
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   999
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1000
    opts[b'message'] = shelvectx.description()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1001
    opts[b'interactive-unshelve'] = True
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1002
    pats = []
42656
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
  1003
    if not interactive:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1004
        newnode = repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1005
            text=shelvectx.description(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1006
            extra=shelvectx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1007
            user=shelvectx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1008
            date=shelvectx.date(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1009
        )
42656
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
  1010
        return newnode, False
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
  1011
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1012
    commitfunc = getcommitfunc(shelvectx.extra(), interactive=True, editor=True)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1013
    newnode = cmdutil.dorecord(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1014
        ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1015
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1016
        commitfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1017
        None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1018
        False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1019
        cmdutil.recordfilter,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1020
        *pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1021
        **pycompat.strkwargs(opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1022
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1023
    snode = repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1024
        text=shelvectx.description(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1025
        extra=shelvectx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1026
        user=shelvectx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1027
    )
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1028
    if snode:
49425
35c9f0bc2648 phase-shelve: Extract function for _optimized_match for re-use
Jason R. Coombs <jaraco@jaraco.com>
parents: 49306
diff changeset
  1029
        m = _optimized_match(repo, snode)
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1030
        _shelvecreatedcommit(repo, snode, basename, m)
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1031
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1032
    return newnode, bool(snode)
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1033
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1034
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1035
def _rebaserestoredcommit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1036
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1037
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1038
    opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1039
    tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1040
    oldtiprev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1041
    basename,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1042
    pctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1043
    tmpwctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1044
    shelvectx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1045
    branchtorestore,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1046
    activebookmark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1047
):
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1048
    """Rebase restored commit from its original location to a destination"""
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1049
    # If the shelve is not immediately on top of the commit
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1050
    # we'll be merging with, rebase it to be on top.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1051
    interactive = opts.get(b'interactive')
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1052
    if tmpwctx.node() == shelvectx.p1().node() and not interactive:
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1053
        # We won't skip on interactive mode because, the user might want to
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1054
        # unshelve certain changes only.
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1055
        return shelvectx, False
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1056
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1057
    overrides = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1058
        (b'ui', b'forcemerge'): opts.get(b'tool', b''),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1059
        (b'phases', b'new-commit'): phases.secret,
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1060
    }
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1061
    with repo.ui.configoverride(overrides, b'unshelve'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1062
        ui.status(_(b'rebasing shelved changes\n'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1063
        stats = merge.graft(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1064
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1065
            shelvectx,
48592
bcc4820242cf shelve: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 47436
diff changeset
  1066
            labels=[
bcc4820242cf shelve: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 47436
diff changeset
  1067
                b'working-copy',
bcc4820242cf shelve: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 47436
diff changeset
  1068
                b'shelved change',
bcc4820242cf shelve: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 47436
diff changeset
  1069
                b'parent of shelved change',
bcc4820242cf shelve: attempt to make merge labels more helpful
Martin von Zweigbergk <martinvonz@google.com>
parents: 47436
diff changeset
  1070
            ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1071
            keepconflictparent=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1072
        )
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1073
        if stats.unresolvedcount:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1074
            tr.close()
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1075
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1076
            nodestoremove = [
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 49248
diff changeset
  1077
                repo.changelog.node(rev) for rev in range(oldtiprev, len(repo))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1078
            ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1079
            shelvedstate.save(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1080
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1081
                basename,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1082
                pctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1083
                tmpwctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1084
                nodestoremove,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1085
                branchtorestore,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1086
                opts.get(b'keep'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1087
                activebookmark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1088
                interactive,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1089
            )
45151
e429e7c801b2 error: normalize "unresolved conflicts" error messages with a custom class
Daniel Ploch <dploch@google.com>
parents: 45144
diff changeset
  1090
            raise error.ConflictResolutionRequired(b'unshelve')
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1091
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
  1092
        with repo.dirstate.changing_parents(repo):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1093
            repo.setparents(tmpwctx.node(), repo.nullid)
50052
1b044a63a98a shelve: adjust what happens in some `changing_parents` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
  1094
        newnode, ispartialunshelve = _createunshelvectx(
1b044a63a98a shelve: adjust what happens in some `changing_parents` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
  1095
            ui, repo, shelvectx, basename, interactive, opts
1b044a63a98a shelve: adjust what happens in some `changing_parents` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
  1096
        )
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1097
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1098
        if newnode is None:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1099
            shelvectx = tmpwctx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1100
            msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1101
                b'note: unshelved changes already existed '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1102
                b'in the working copy\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1103
            )
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1104
            ui.status(msg)
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1105
        else:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1106
            shelvectx = repo[newnode]
45577
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45375
diff changeset
  1107
            merge.update(tmpwctx)
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1108
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1109
    return shelvectx, ispartialunshelve
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1110
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1111
30456
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1112
def _forgetunknownfiles(repo, shelvectx, addedbefore):
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1113
    # Forget any files that were unknown before the shelve, unknown before
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1114
    # unshelve started, but are now added.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1115
    shelveunknown = shelvectx.extra().get(b'shelve_unknown')
30456
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1116
    if not shelveunknown:
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1117
        return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1118
    shelveunknown = frozenset(shelveunknown.split(b'\0'))
30456
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1119
    addedafter = frozenset(repo.status().added)
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1120
    toforget = (addedafter & shelveunknown) - addedbefore
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1121
    repo[None].forget(toforget)
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1122
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1123
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
  1124
def _finishunshelve(repo, oldtiprev, tr, activebookmark):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
  1125
    _restoreactivebookmark(repo, activebookmark)
51100
ae6722dbb575 shelve: drop some weird manually stripping before transaction abort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  1126
    # We used to manually strip the commit to update inmemory structure and
ae6722dbb575 shelve: drop some weird manually stripping before transaction abort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  1127
    # prevent some issue around hooks. This no longer seems to be the case, so
ae6722dbb575 shelve: drop some weird manually stripping before transaction abort
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  1128
    # we simply abort the transaction.
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
  1129
    _aborttransaction(repo, tr)
30457
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30456
diff changeset
  1130
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1131
30846
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1132
def _checkunshelveuntrackedproblems(ui, repo, shelvectx):
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1133
    """Check potential problems which may result from working
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1134
    copy having untracked changes."""
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1135
    wcdeleted = set(repo.status().deleted)
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1136
    shelvetouched = set(shelvectx.files())
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1137
    intersection = wcdeleted.intersection(shelvetouched)
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1138
    if intersection:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1139
        m = _(b"shelved change touches missing files")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1140
        hint = _(b"run hg status to see which files are missing")
30846
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1141
        raise error.Abort(m, hint=hint)
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1142
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1143
44595
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1144
def unshelvecmd(ui, repo, *shelved, **opts):
35005
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
  1145
    opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1146
    abortf = opts.get(b'abort')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1147
    continuef = opts.get(b'continue')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1148
    interactive = opts.get(b'interactive')
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1149
    if not abortf and not continuef:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1150
        cmdutil.checkunfinished(repo)
31021
4189d790e8a4 shelve: add -n/--name option to unshelve (issue5475)
liscju <piotr.listkiewicz@gmail.com>
parents: 30846
diff changeset
  1151
    shelved = list(shelved)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1152
    if opts.get(b"name"):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1153
        shelved.append(opts[b"name"])
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1154
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1155
    if interactive and opts.get(b'keep'):
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1156
        raise error.InputError(
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1157
            _(b'--keep on --interactive is not yet supported')
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1158
        )
42662
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
  1159
    if abortf or continuef:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1160
        if abortf and continuef:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1161
            raise error.InputError(_(b'cannot use both abort and continue'))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1162
        if shelved:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1163
            raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1164
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1165
                    b'cannot combine abort/continue with '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1166
                    b'naming a shelved change'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1167
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1168
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1169
        if abortf and opts.get(b'tool', False):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1170
            ui.warn(_(b'tool option will be ignored\n'))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1171
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
  1172
        state = _loadshelvedstate(ui, repo, opts)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1173
        if abortf:
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
  1174
            return unshelveabort(ui, repo, state)
42668
52a383451739 unshelve: add abort on using continue and interactive together
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42662
diff changeset
  1175
        elif continuef and interactive:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1176
            raise error.InputError(
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1177
                _(b'cannot use both continue and interactive')
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1178
            )
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1179
        elif continuef:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1180
            return unshelvecontinue(ui, repo, state, opts)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1181
    elif len(shelved) > 1:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1182
        raise error.InputError(_(b'can only unshelve one change at a time'))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1183
    elif not shelved:
46297
82edad33fd81 shelve: move listshelves() to new ShelfDir class, so caller need not pass vfs
Martin von Zweigbergk <martinvonz@google.com>
parents: 46296
diff changeset
  1184
        shelved = ShelfDir(repo).listshelves()
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1185
        if not shelved:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1186
            raise error.StateError(_(b'no shelved changes to apply!'))
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
  1187
        basename = shelved[0][1]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1188
        ui.status(_(b"unshelving change '%s'\n") % basename)
42662
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
  1189
    else:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1190
        basename = shelved[0]
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1191
46296
eec8899407f4 shelve: also create class representing whole directory of shelves
Martin von Zweigbergk <martinvonz@google.com>
parents: 46295
diff changeset
  1192
    if not ShelfDir(repo).get(basename).exists():
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1193
        raise error.InputError(_(b"shelved change '%s' not found") % basename)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1194
44595
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1195
    return _dounshelve(ui, repo, basename, opts)
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1196
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1197
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1198
def _dounshelve(ui, repo, basename, opts):
39373
6a71324cb68b shelve: handle shelved node on unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 39372
diff changeset
  1199
    repo = repo.unfiltered()
27287
c9ceea3f2d8e shelve: widen wlock scope of unshelve for consistency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27198
diff changeset
  1200
    lock = tr = None
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1201
    try:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1202
        lock = repo.lock()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1203
        tr = repo.transaction(b'unshelve', report=lambda x: None)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1204
        oldtiprev = len(repo)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1205
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1206
        pctx = repo[b'.']
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1207
        # The goal is to have a commit structure like so:
20958
df33c9014430 shelve: repo['.'] is not a wctx but a pctx
Mads Kiilerich <madski@unity3d.com>
parents: 20942
diff changeset
  1208
        # ...-> pctx -> tmpwctx -> shelvectx
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1209
        # where tmpwctx is an optional commit with the user's pending changes
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1210
        # and shelvectx is the unshelved changes. Then we merge it all down
20958
df33c9014430 shelve: repo['.'] is not a wctx but a pctx
Mads Kiilerich <madski@unity3d.com>
parents: 20942
diff changeset
  1211
        # to the original pctx.
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1212
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
  1213
        activebookmark = _backupactivebookmark(repo)
49523
52dd7a43ad5c shelve: re-wrap now that the line fits
Jason R. Coombs <jaraco@jaraco.com>
parents: 49522
diff changeset
  1214
        tmpwctx, addedbefore = _commitworkingcopychanges(ui, repo, opts, pctx)
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
  1215
        repo, shelvectx = _unshelverestorecommit(ui, repo, tr, basename)
37967
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1216
        _checkunshelveuntrackedproblems(ui, repo, shelvectx)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1217
        branchtorestore = b''
37967
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1218
        if shelvectx.branch() != shelvectx.p1().branch():
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1219
            branchtorestore = shelvectx.branch()
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1220
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1221
        shelvectx, ispartialunshelve = _rebaserestoredcommit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1222
            ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1223
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1224
            opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1225
            tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1226
            oldtiprev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1227
            basename,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1228
            pctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1229
            tmpwctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1230
            shelvectx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1231
            branchtorestore,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1232
            activebookmark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1233
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1234
        overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1235
        with ui.configoverride(overrides, b'unshelve'):
37967
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1236
            mergefiles(ui, repo, pctx, shelvectx)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1237
        restorebranch(ui, repo, branchtorestore)
42704
6957f7b93e03 unshelve: clear shelvedstate and _finishunshelve() on partial unshelve
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42703
diff changeset
  1238
        shelvedstate.clear(repo)
6957f7b93e03 unshelve: clear shelvedstate and _finishunshelve() on partial unshelve
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42703
diff changeset
  1239
        _finishunshelve(repo, oldtiprev, tr, activebookmark)
50053
5327ae76b740 dirstate: use `dirstate.change_files` to scope the change in `unshelve`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50052
diff changeset
  1240
        with repo.dirstate.changing_files(repo):
5327ae76b740 dirstate: use `dirstate.change_files` to scope the change in `unshelve`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50052
diff changeset
  1241
            _forgetunknownfiles(repo, shelvectx, addedbefore)
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1242
        if not ispartialunshelve:
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1243
            unshelvecleanup(ui, repo, basename, opts)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1244
    finally:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1245
        if tr:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1246
            tr.release()
27287
c9ceea3f2d8e shelve: widen wlock scope of unshelve for consistency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27198
diff changeset
  1247
        lockmod.release(lock)