mercurial/shelve.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 07 Jan 2021 22:38:19 -0800
changeset 46283 8db5fa212ab0
parent 46282 0a69f9e640ec
child 46284 d7f763c8c58e
permissions -rw-r--r--
shelve: use listshelves() in cleanup function The point of this patch is to make it so all the callers of `shelvedfile.movetobackup()` look the same, so I can move it over to the new `Shelf` class next. Differential Revision: https://phab.mercurial-scm.org/D9710
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
"""
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    23
from __future__ import absolute_import
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    24
25113
0ca8410ea345 util: drop alias for collections.deque
Martin von Zweigbergk <martinvonz@google.com>
parents: 25104
diff changeset
    25
import collections
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    26
import errno
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
    27
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
    28
import stat
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28862
diff changeset
    29
42541
3de4f17f4824 shelve: move shelve extension to core
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42540
diff changeset
    30
from .i18n import _
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    31
from .node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    32
    bin,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    33
    hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    34
    nullid,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    35
    nullrev,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    36
)
42541
3de4f17f4824 shelve: move shelve extension to core
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42540
diff changeset
    37
from . import (
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
    38
    bookmarks,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    39
    bundle2,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    40
    changegroup,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    41
    cmdutil,
34097
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33440
diff changeset
    42
    discovery,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    43
    error,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    44
    exchange,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    45
    hg,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    46
    lock as lockmod,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    47
    mdiff,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    48
    merge,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44595
diff changeset
    49
    mergestate as mergestatemod,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    50
    patch,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    51
    phases,
35005
aad6b9fdfc75 py3: handle keyword arguments in hgext/shelve.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34496
diff changeset
    52
    pycompat,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    53
    repair,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    54
    scmutil,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    55
    templatefilters,
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    56
    util,
31244
636f55b9ba23 vfs: use 'vfs' module directly in 'hgext.shelve'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31096
diff changeset
    57
    vfs as vfsmod,
28378
96a7368a79b6 shelve: use absolute_import
timeless <timeless@mozdev.org>
parents: 28124
diff changeset
    58
)
42541
3de4f17f4824 shelve: move shelve extension to core
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42540
diff changeset
    59
from .utils import (
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
    60
    dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
    61
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
    62
)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    63
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    64
backupdir = b'shelve-backup'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    65
shelvedir = b'shelved'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    66
shelvefileextensions = [b'hg', b'patch', b'shelve']
30554
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30542
diff changeset
    67
# universal extension is present in all types of shelves
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    68
patchextension = b'patch'
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
    69
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
    70
# 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
    71
# 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
    72
shelveuser = b'shelve@localhost'
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
    73
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
    74
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    75
class shelvedfile(object):
19909
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
    76
    """Helper for the file storing a single shelve
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
    77
22581
c5ece02fb211 shelve: avoid writing file that is never read from
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22202
diff changeset
    78
    Handles common functions on shelve files (.hg/.patch) using
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    79
    the vfs layer"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
    80
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    81
    def __init__(self, repo, name, filetype=None):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    82
        self.name = name
31335
3acc7af5859c shelve: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31312
diff changeset
    83
        self.vfs = vfsmod.vfs(repo.vfs.join(shelvedir))
3acc7af5859c shelve: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31312
diff changeset
    84
        self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    85
        if filetype:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    86
            self.fname = name + b'.' + filetype
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    87
        else:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    88
            self.fname = name
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    89
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    90
    def exists(self):
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    91
        return self.vfs.exists(self.fname)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
    92
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
    93
    def backupfilename(self):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
    94
        def gennames(base):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
    95
            yield base
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    96
            base, ext = base.rsplit(b'.', 1)
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
    97
            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
    98
                yield b'%s-%d.%s' % (base, i, ext)
25712
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
    99
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   100
        name = self.backupvfs.join(self.fname)
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   101
        for n in gennames(name):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   102
            if not self.backupvfs.exists(n):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   103
                return n
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   104
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   105
    def movetobackup(self):
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   106
        if not self.backupvfs.isdir():
8a6264a2ee60 shelve: always backup shelves instead of deleting them
Colin Chan <colinchan@fb.com>
parents: 25660
diff changeset
   107
            self.backupvfs.makedir()
46282
0a69f9e640ec shelve: inline shelvedfile.filename() since there are no callers outside class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46281
diff changeset
   108
        util.rename(self.vfs.join(self.fname), self.backupfilename())
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   109
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   110
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   111
class Shelf(object):
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   112
    """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
   113
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   114
    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
   115
    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
   116
    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
   117
    """
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   118
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   119
    def __init__(self, repo, name):
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   120
        self.repo = repo
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   121
        self.name = name
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   122
        self.vfs = vfsmod.vfs(repo.vfs.join(shelvedir))
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   123
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   124
    def exists(self):
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   125
        return self.vfs.exists(self.name + b'.' + patchextension)
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   126
46280
7e300d297547 shelve: move method for getting stat (mtime) to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46279
diff changeset
   127
    def mtime(self):
7e300d297547 shelve: move method for getting stat (mtime) to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46279
diff changeset
   128
        return self.vfs.stat(self.name + b'.' + patchextension)[stat.ST_MTIME]
7e300d297547 shelve: move method for getting stat (mtime) to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46279
diff changeset
   129
46274
a344ec05b99c shelve: move method for writing .shelve to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46273
diff changeset
   130
    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
   131
        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
   132
46275
157305bf859f shelve: move method for reading .shelve file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46274
diff changeset
   133
    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
   134
        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
   135
            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
   136
        ).read()
157305bf859f shelve: move method for reading .shelve file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46274
diff changeset
   137
46276
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   138
    def writebundle(self, bases, node):
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   139
        cgversion = changegroup.safeversion(self.repo)
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   140
        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
   141
            btype = b'HG10BZ'
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   142
            compression = None
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   143
        else:
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   144
            btype = b'HG20'
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   145
            compression = b'BZ'
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   146
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   147
        repo = self.repo.unfiltered()
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   148
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   149
        outgoing = discovery.outgoing(
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   150
            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
   151
        )
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   152
        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
   153
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   154
        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
   155
        bundle2.writebundle(
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   156
            self.repo.ui,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   157
            cg,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   158
            bundle_filename,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   159
            btype,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   160
            self.vfs,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   161
            compression=compression,
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   162
        )
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   163
46277
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   164
    def applybundle(self, tr):
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   165
        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
   166
        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
   167
        try:
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   168
            targetphase = phases.internal
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   169
            if not phases.supportinternal(self.repo):
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   170
                targetphase = phases.secret
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   171
            gen = exchange.readbundle(self.repo.ui, fp, filename, self.vfs)
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   172
            pretip = self.repo[b'tip']
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   173
            bundle2.applybundle(
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   174
                self.repo,
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   175
                gen,
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   176
                tr,
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   177
                source=b'unshelve',
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   178
                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
   179
                targetphase=targetphase,
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   180
            )
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   181
            shelvectx = self.repo[b'tip']
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   182
            if pretip == shelvectx:
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   183
                shelverev = tr.changes[b'revduplicates'][-1]
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   184
                shelvectx = self.repo[shelverev]
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   185
            return shelvectx
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   186
        finally:
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   187
            fp.close()
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   188
46278
58ca94869287 shelve: move function for opening .patch file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46277
diff changeset
   189
    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
   190
        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
   191
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   192
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   193
class shelvedstate(object):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   194
    """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
   195
df54786a3203 shelve: add minimal documentation to all functions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19908
diff changeset
   196
    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
   197
    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
   198
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   199
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   200
    _version = 2
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   201
    _filename = b'shelvedstate'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   202
    _keep = b'keep'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   203
    _nokeep = b'nokeep'
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   204
    # 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
   205
    _noactivebook = b':no-active-bookmark'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   206
    _interactive = b'interactive'
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   207
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   208
    @classmethod
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   209
    def _verifyandtransform(cls, d):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   210
        """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
   211
        try:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   212
            d[b'originalwctx'] = bin(d[b'originalwctx'])
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   213
            d[b'pendingctx'] = bin(d[b'pendingctx'])
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   214
            d[b'parents'] = [bin(h) for h in d[b'parents'].split(b' ')]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   215
            d[b'nodestoremove'] = [
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   216
                bin(h) for h in d[b'nodestoremove'].split(b' ')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   217
            ]
32284
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   218
        except (ValueError, TypeError, 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
   219
            raise error.CorruptedState(pycompat.bytestr(err))
32284
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   220
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   221
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   222
    def _getversion(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   223
        """Read version information from shelvestate file"""
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   224
        fp = repo.vfs(cls._filename)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   225
        try:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   226
            version = int(fp.readline().strip())
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   227
        except ValueError 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
   228
            raise error.CorruptedState(pycompat.bytestr(err))
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   229
        finally:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   230
            fp.close()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   231
        return version
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   232
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   233
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   234
    def _readold(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   235
        """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
   236
        # Order is important, because old shelvestate file uses it
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   237
        # 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
   238
        # 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
   239
        keys = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   240
            b'version',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   241
            b'name',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
            b'originalwctx',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   243
            b'pendingctx',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
            b'parents',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   245
            b'nodestoremove',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   246
            b'branchtorestore',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   247
            b'keep',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   248
            b'activebook',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   249
        ]
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   250
        # 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
   251
        # that we open this file twice
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   252
        fp = repo.vfs(cls._filename)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   253
        d = {}
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   254
        try:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   255
            for key in keys:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   256
                d[key] = fp.readline().strip()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   257
        finally:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   258
            fp.close()
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   259
        return d
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   260
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   261
    @classmethod
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   262
    def load(cls, repo):
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   263
        version = cls._getversion(repo)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   264
        if version < cls._version:
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   265
            d = cls._readold(repo)
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   266
        elif version == cls._version:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   267
            d = scmutil.simplekeyvaluefile(repo.vfs, cls._filename).read(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   268
                firstlinenonkeyval=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   269
            )
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   270
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   271
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   272
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   273
                    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
   274
                    b'with the version used in this repo'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   275
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   276
            )
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   277
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   278
        cls._verifyandtransform(d)
29536
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   279
        try:
b17a6e3cd2ac shelve: make unshelve be able to abort in any case
Kostia Balytskyi <ikostia@fb.com>
parents: 29270
diff changeset
   280
            obj = cls()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   281
            obj.name = d[b'name']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   282
            obj.wctx = repo[d[b'originalwctx']]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   283
            obj.pendingctx = repo[d[b'pendingctx']]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   284
            obj.parents = d[b'parents']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   285
            obj.nodestoremove = d[b'nodestoremove']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   286
            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
   287
            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
   288
            obj.activebookmark = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   289
            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
   290
                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
   291
            obj.interactive = d.get(b'interactive') == cls._interactive
32284
16d424b97125 shelve: refactor shelvestate loading
Kostia Balytskyi <ikostia@fb.com>
parents: 31888
diff changeset
   292
        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
   293
            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
   294
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   295
        return obj
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   296
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   297
    @classmethod
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   298
    def save(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   299
        cls,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   300
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   301
        name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   302
        originalwctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   303
        pendingctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   304
        nodestoremove,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   305
        branchtorestore,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   306
        keep=False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   307
        activebook=b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   308
        interactive=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   309
    ):
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   310
        info = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   311
            b"name": name,
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   312
            b"originalwctx": hex(originalwctx.node()),
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   313
            b"pendingctx": hex(pendingctx.node()),
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   314
            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
   315
            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
   316
            b"branchtorestore": branchtorestore,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   317
            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
   318
            b"activebook": activebook or cls._noactivebook,
32285
fe3105e6e051 shelve: make shelvestate use simplekeyvaluefile
Kostia Balytskyi <ikostia@fb.com>
parents: 32284
diff changeset
   319
        }
42662
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
   320
        if interactive:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   321
            info[b'interactive'] = cls._interactive
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   322
        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
   323
            info, firstline=(b"%d" % cls._version)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   324
        )
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   325
19908
07ee5c8867ca shelve: use the class constant in the clear method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19904
diff changeset
   326
    @classmethod
07ee5c8867ca shelve: use the class constant in the clear method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19904
diff changeset
   327
    def clear(cls, repo):
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31244
diff changeset
   328
        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
   329
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   330
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   331
def cleanupoldbackups(repo):
31335
3acc7af5859c shelve: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31312
diff changeset
   332
    vfs = vfsmod.vfs(repo.vfs.join(backupdir))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   333
    maxbackups = repo.ui.configint(b'shelve', b'maxbackups')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   334
    hgfiles = [f for f in vfs.listdir() if f.endswith(b'.' + patchextension)]
36781
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36607
diff changeset
   335
    hgfiles = sorted([(vfs.stat(f)[stat.ST_MTIME], f) for f in hgfiles])
40029
e2697acd9381 cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents: 39889
diff changeset
   336
    if maxbackups > 0 and maxbackups < len(hgfiles):
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
   337
        bordermtime = hgfiles[-maxbackups][0]
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
   338
    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
   339
        bordermtime = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   340
    for mtime, f in hgfiles[: len(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
   341
        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
   342
            # 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
   343
            continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   344
        base = f[: -(1 + len(patchextension))]
30378
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29841
diff changeset
   345
        for ext in shelvefileextensions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   346
            vfs.tryunlink(base + b'.' + ext)
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   347
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   348
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   349
def _backupactivebookmark(repo):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   350
    activebookmark = repo._activebookmark
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   351
    if activebookmark:
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   352
        bookmarks.deactivate(repo)
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   353
    return activebookmark
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   354
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   355
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   356
def _restoreactivebookmark(repo, mark):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   357
    if mark:
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   358
        bookmarks.activate(repo, mark)
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   359
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   360
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   361
def _aborttransaction(repo, tr):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45860
diff changeset
   362
    """Abort current transaction for shelve/unshelve, but keep dirstate"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   363
    dirstatebackupname = b'dirstate.shelve'
38869
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38783
diff changeset
   364
    repo.dirstate.savebackup(tr, dirstatebackupname)
29270
48b38b16a8f8 shelve: use backup functions instead of manually copying dirstate
Mateusz Kwapich <mitrandir@fb.com>
parents: 29205
diff changeset
   365
    tr.abort()
38869
ad24b581e4d9 narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents: 38783
diff changeset
   366
    repo.dirstate.restorebackup(None, dirstatebackupname)
26522
10f14bb22950 shelve: add utility to abort current transaction but keep dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26520
diff changeset
   367
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   368
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   369
def getshelvename(repo, parent, opts):
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   370
    """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
   371
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   372
    def gennames():
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   373
        yield label
32968
4107eb8a5648 shelve: allow unlimited shelved changes per name
Jun Wu <quark@fb.com>
parents: 32930
diff changeset
   374
        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
   375
            yield b'%s-%02d' % (label, i)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   376
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   377
    name = opts.get(b'name')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   378
    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
   379
    # 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
   380
    label = label.replace(b'/', b'_')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   381
    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
   382
    # 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
   383
    if label.startswith(b'.'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   384
        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
   385
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   386
    if name:
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   387
        if Shelf(repo, name).exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   388
            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
   389
            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
   390
64a75655b988 shelve: choose a legal shelve name when no name is passed (issue5112)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30554
diff changeset
   391
        # 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
   392
        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
   393
            raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   394
                _(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
   395
            )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   396
        if name.startswith(b'.'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   397
            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
   398
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   399
    else:
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   400
        for n in gennames():
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   401
            if not Shelf(repo, n).exists():
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   402
                name = n
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   403
                break
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   404
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   405
    return name
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   406
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   407
30380
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   408
def mutableancestors(ctx):
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   409
    """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
   410
30380
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   411
    Much faster than the revset ancestors(ctx) & draft()"""
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   412
    seen = {nullrev}
30380
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   413
    visit = collections.deque()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   414
    visit.append(ctx)
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   415
    while visit:
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   416
        ctx = visit.popleft()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   417
        yield ctx.node()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   418
        for parent in ctx.parents():
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   419
            rev = parent.rev()
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   420
            if rev not in seen:
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   421
                seen.add(rev)
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   422
                if parent.mutable():
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   423
                    visit.append(parent)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   424
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   425
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   426
def getcommitfunc(extra, interactive, editor=False):
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   427
    def commitfunc(ui, repo, message, match, opts):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   428
        hasmq = util.safehasattr(repo, b'mq')
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   429
        if hasmq:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   430
            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
   431
5d69e2412ec8 shelve: use the internal phase when possible
Boris Feld <boris.feld@octobus.net>
parents: 39387
diff changeset
   432
        targetphase = phases.internal
5d69e2412ec8 shelve: use the internal phase when possible
Boris Feld <boris.feld@octobus.net>
parents: 39387
diff changeset
   433
        if not phases.supportinternal(repo):
5d69e2412ec8 shelve: use the internal phase when possible
Boris Feld <boris.feld@octobus.net>
parents: 39387
diff changeset
   434
            targetphase = phases.secret
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   435
        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
   436
        try:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   437
            editor_ = False
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   438
            if editor:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   439
                editor_ = cmdutil.getcommiteditor(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   440
                    editform=b'shelve.shelve', **pycompat.strkwargs(opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   441
                )
31462
d1ce2124ec83 shelve: get rid of ui.backupconfig
Jun Wu <quark@fb.com>
parents: 31335
diff changeset
   442
            with repo.ui.configoverride(overrides):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   443
                return repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   444
                    message,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   445
                    shelveuser,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   446
                    opts.get(b'date'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   447
                    match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   448
                    editor=editor_,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   449
                    extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   450
                )
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   451
        finally:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   452
            if hasmq:
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   453
                repo.mq.checkapplied = saved
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   454
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   455
    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
   456
        opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   457
        match = scmutil.match(repo[b'.'], pats, {})
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   458
        message = opts[b'message']
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   459
        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
   460
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   461
    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
   462
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   463
30382
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   464
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
   465
    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
   466
    if stat.deleted:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   467
        ui.status(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
   468
            _(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
   469
            % len(stat.deleted)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   470
        )
30382
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   471
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   472
        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
   473
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   474
42012
9b78bbb76111 shelve: refactor _shelvecreatedcommit's match object into calling site
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42011
diff changeset
   475
def _shelvecreatedcommit(repo, node, name, match):
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   476
    info = {b'node': hex(node)}
46274
a344ec05b99c shelve: move method for writing .shelve to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46273
diff changeset
   477
    Shelf(repo, name).writeinfo(info)
30383
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30382
diff changeset
   478
    bases = list(mutableancestors(repo[node]))
46276
eb7b2929ae49 shelve: move method for writing bundle to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46275
diff changeset
   479
    Shelf(repo, name).writebundle(bases, node)
46278
58ca94869287 shelve: move function for opening .patch file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46277
diff changeset
   480
    with Shelf(repo, name).open_patch(b'wb') as fp:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   481
        cmdutil.exportfile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   482
            repo, [node], fp, opts=mdiff.diffopts(git=True), match=match
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   483
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   484
30383
455f7856db20 shelve: move actual created commit shelving to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30382
diff changeset
   485
30384
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30383
diff changeset
   486
def _includeunknownfiles(repo, pats, opts, extra):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   487
    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
   488
    if s.unknown:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   489
        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
   490
        repo[None].add(s.unknown)
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30383
diff changeset
   491
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   492
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   493
def _finishshelve(repo, tr):
39744
52dfa1eb0ad4 shelve: no longer strip internal commit when using internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39601
diff changeset
   494
    if phases.supportinternal(repo):
52dfa1eb0ad4 shelve: no longer strip internal commit when using internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39601
diff changeset
   495
        tr.close()
52dfa1eb0ad4 shelve: no longer strip internal commit when using internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39601
diff changeset
   496
    else:
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   497
        _aborttransaction(repo, tr)
30385
b573d7ca31c4 shelve: move shelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30384
diff changeset
   498
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   499
39342
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   500
def createcmd(ui, repo, pats, opts):
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   501
    """subcommand that creates a new shelve"""
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   502
    with repo.wlock():
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   503
        cmdutil.checkunfinished(repo)
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   504
        return _docreatecmd(ui, repo, pats, opts)
d52fa7ddd1ac shelve: move createcmd next to _docreatecmd
Boris Feld <boris.feld@octobus.net>
parents: 38869
diff changeset
   505
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   506
30380
84e8cbdbdee4 shelve: move mutableancestors to not be a closure
Kostia Balytskyi <ikostia@fb.com>
parents: 30379
diff changeset
   507
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
   508
    wctx = repo[None]
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   509
    parents = wctx.parents()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   510
    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
   511
    origbranch = wctx.branch()
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   512
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   513
    if parent.node() != nullid:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   514
        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
   515
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   516
        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
   517
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   518
    if not opts.get(b'message'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   519
        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
   520
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   521
    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
   522
    try:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   523
        lock = repo.lock()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   524
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19943
diff changeset
   525
        # 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
   526
        # 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
   527
        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
   528
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   529
        interactive = opts.get(b'interactive', False)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   530
        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
   531
            b'addremove', False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   532
        )
27908
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   533
30379
684068d24658 shelve: move shelve name generation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30378
diff changeset
   534
        name = getshelvename(repo, parent, opts)
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   535
        activebookmark = _backupactivebookmark(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   536
        extra = {b'internal': b'shelve'}
27908
d73a5ab18015 shelve: permit shelves to contain unknown files
Simon Farnsworth <simonfar@fb.com>
parents: 27888
diff changeset
   537
        if includeunknown:
30384
21a75b63c10e shelve: move unknown files handling to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30383
diff changeset
   538
            _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
   539
28572
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   540
        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
   541
            # 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
   542
            # at bundled commit
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   543
            repo.dirstate.setbranch(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
   544
30381
caba61934721 shelve: move commitfunc creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30380
diff changeset
   545
        commitfunc = getcommitfunc(extra, interactive, editor=True)
24478
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   546
        if not interactive:
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   547
            node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
95cbc77c0cad shelve: add interactive mode
Laurent Charignon <lcharignon@fb.com>
parents: 24477
diff changeset
   548
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   549
            node = cmdutil.dorecord(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   550
                ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   551
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   552
                commitfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   553
                None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   554
                False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   555
                cmdutil.recordfilter,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   556
                *pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   557
                **pycompat.strkwargs(opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   558
            )
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   559
        if not node:
30382
dedf0915ca5b shelve: move 'nothing changed' messaging to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30381
diff changeset
   560
            _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
   561
            return 1
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   562
42012
9b78bbb76111 shelve: refactor _shelvecreatedcommit's match object into calling site
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42011
diff changeset
   563
        # Create a matcher so that prefetch doesn't attempt to fetch
42013
50d5e64ec561 shelve: do not update when keeping changes, just move the dirstate
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42012
diff changeset
   564
        # the entire repository pointlessly, and as an optimisation
50d5e64ec561 shelve: do not update when keeping changes, just move the dirstate
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42012
diff changeset
   565
        # for movedirstate, if needed.
42012
9b78bbb76111 shelve: refactor _shelvecreatedcommit's match object into calling site
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42011
diff changeset
   566
        match = scmutil.matchfiles(repo, repo[node].files())
9b78bbb76111 shelve: refactor _shelvecreatedcommit's match object into calling site
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42011
diff changeset
   567
        _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
   568
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   569
        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
   570
        if opts[b'keep']:
42013
50d5e64ec561 shelve: do not update when keeping changes, just move the dirstate
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42012
diff changeset
   571
            with repo.dirstate.parentchange():
50d5e64ec561 shelve: do not update when keeping changes, just move the dirstate
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42012
diff changeset
   572
                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
   573
        else:
50d5e64ec561 shelve: do not update when keeping changes, just move the dirstate
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 42012
diff changeset
   574
            hg.update(repo, parent.node())
45860
073bb7563931 shelve: clear merge state after partial shelve
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   575
            ms = mergestatemod.mergestate.read(repo)
073bb7563931 shelve: clear merge state after partial shelve
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   576
            if not ms.unresolvedcount():
073bb7563931 shelve: clear merge state after partial shelve
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   577
                ms.reset()
073bb7563931 shelve: clear merge state after partial shelve
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   578
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   579
        if origbranch != repo[b'.'].branch() and not _isbareshelve(pats, opts):
28571
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   580
            repo.dirstate.setbranch(origbranch)
26523
1d23bf6cd90a shelve: restore shelved dirstate explicitly after aborting transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26522
diff changeset
   581
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   582
        _finishshelve(repo, tr)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   583
    finally:
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   584
        _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
   585
        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
   586
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   587
28571
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   588
def _isbareshelve(pats, opts):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   589
    return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   590
        not pats
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   591
        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
   592
        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
   593
        and not opts.get(b'exclude', False)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   594
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   595
28571
3f0e25e89e28 shelve: preserve newly created branch on non-bare shelve in wctx (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28401
diff changeset
   596
28572
43c204ddf333 shelve: make non bare shelve not saving branch information in bundle
liscju <piotr.listkiewicz@gmail.com>
parents: 28571
diff changeset
   597
def _iswctxonnewbranch(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   598
    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
   599
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   600
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   601
def cleanupcmd(ui, repo):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   602
    """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
   603
27835
c448d7e00bf9 with: use context manager for wlock in shelve cleanupcmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27834
diff changeset
   604
    with repo.wlock():
46283
8db5fa212ab0 shelve: use listshelves() in cleanup function
Martin von Zweigbergk <martinvonz@google.com>
parents: 46282
diff changeset
   605
        for _mtime, name in listshelves(repo):
8db5fa212ab0 shelve: use listshelves() in cleanup function
Martin von Zweigbergk <martinvonz@google.com>
parents: 46282
diff changeset
   606
            for suffix in shelvefileextensions:
8db5fa212ab0 shelve: use listshelves() in cleanup function
Martin von Zweigbergk <martinvonz@google.com>
parents: 46282
diff changeset
   607
                shfile = shelvedfile(repo, name, suffix)
8db5fa212ab0 shelve: use listshelves() in cleanup function
Martin von Zweigbergk <martinvonz@google.com>
parents: 46282
diff changeset
   608
                if shfile.exists():
8db5fa212ab0 shelve: use listshelves() in cleanup function
Martin von Zweigbergk <martinvonz@google.com>
parents: 46282
diff changeset
   609
                    shfile.movetobackup()
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   610
            cleanupoldbackups(repo)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   611
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   612
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   613
def deletecmd(ui, repo, pats):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   614
    """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
   615
    if not pats:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
   616
        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
   617
    with repo.wlock():
43719
cb23d9e3e21f shelve: fix a missing variable in the exception handler for delete
Matt Harbison <matt_harbison@yahoo.com>
parents: 43117
diff changeset
   618
        for name in pats:
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   619
            if not Shelf(repo, name).exists():
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
   620
                raise error.InputError(
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
   621
                    _(b"shelved change '%s' not found") % name
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
   622
                )
46270
161313f9c467 shelve: rewrite check for unknown shelf to delete
Martin von Zweigbergk <martinvonz@google.com>
parents: 46269
diff changeset
   623
            for suffix in shelvefileextensions:
161313f9c467 shelve: rewrite check for unknown shelf to delete
Martin von Zweigbergk <martinvonz@google.com>
parents: 46269
diff changeset
   624
                shfile = shelvedfile(repo, name, suffix)
161313f9c467 shelve: rewrite check for unknown shelf to delete
Martin von Zweigbergk <martinvonz@google.com>
parents: 46269
diff changeset
   625
                if shfile.exists():
161313f9c467 shelve: rewrite check for unknown shelf to delete
Martin von Zweigbergk <martinvonz@google.com>
parents: 46269
diff changeset
   626
                    shfile.movetobackup()
27836
1c2408c28aff with: use context manager for wlock in shelve deletecmd
Bryan O'Sullivan <bryano@fb.com>
parents: 27835
diff changeset
   627
            cleanupoldbackups(repo)
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   628
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   629
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   630
def listshelves(repo):
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   631
    """return all shelves in repo as list of (time, name)"""
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   632
    try:
28862
39130afcce60 shelve: refactor directory name into constant
Oleg Afanasyev <olegaf@fb.com>
parents: 28666
diff changeset
   633
        names = repo.vfs.readdir(shelvedir)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25260
diff changeset
   634
    except OSError as err:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   635
        if err.errno != errno.ENOENT:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   636
            raise
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   637
        return []
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   638
    info = []
22199
b3e51675f98e cleanup: avoid _ for local unused tmp variables - that is reserved for i18n
Mads Kiilerich <madski@unity3d.com>
parents: 22184
diff changeset
   639
    for (name, _type) in names:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   640
        pfx, sfx = name.rsplit(b'.', 1)
30554
1775975dd439 shelve: move patch extension to a string constant
Kostia Balytskyi <ikostia@fb.com>
parents: 30542
diff changeset
   641
        if not pfx or sfx != patchextension:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   642
            continue
46280
7e300d297547 shelve: move method for getting stat (mtime) to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46279
diff changeset
   643
        mtime = Shelf(repo, pfx).mtime()
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   644
        info.append((mtime, pfx))
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   645
    return sorted(info, reverse=True)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   646
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   647
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   648
def listcmd(ui, repo, pats, opts):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   649
    """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
   650
    pats = set(pats)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   651
    width = 80
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   652
    if not ui.plain():
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   653
        width = ui.termwidth()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   654
    namelabel = b'shelve.newest'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   655
    ui.pager(b'shelve')
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   656
    for mtime, name in listshelves(repo):
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   657
        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
   658
            continue
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   659
        ui.write(name, label=namelabel)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   660
        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
   661
        if ui.quiet:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   662
            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
   663
            continue
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   664
        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
   665
        used = 16
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36496
diff changeset
   666
        date = dateutil.makedate(mtime)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   667
        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
   668
        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
   669
        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
   670
        used += 12
46281
a34607b6d320 shelve: make listshelves() return shelf names instead of filenames
Martin von Zweigbergk <martinvonz@google.com>
parents: 46280
diff changeset
   671
        with Shelf(repo, name).open_patch() as fp:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   672
            while True:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   673
                line = fp.readline()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   674
                if not line:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   675
                    break
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   676
                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
   677
                    desc = line.rstrip()
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   678
                    if ui.formatted():
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
   679
                        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
   680
                    ui.write(desc)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   681
                    break
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   682
            ui.write(b'\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   683
            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
   684
                continue
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   685
            difflines = fp.readlines()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   686
            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
   687
                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
   688
                    ui.write(chunk, label=label)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   689
            if opts[b'stat']:
30407
e1677cc29da6 patch: remove unused git parameter from patch.diffstat()
Henning Schild <henning@hennsch.de>
parents: 30385
diff changeset
   690
                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
   691
                    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
   692
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   693
38715
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   694
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
   695
    """subcommand that displays shelves"""
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
   696
    if len(pats) == 0:
38715
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   697
        shelves = listshelves(repo)
905b66681004 shelve: pick the most recent shelve if none specified for --patch/--stat
Danny Hooper <hooper@google.com>
parents: 38714
diff changeset
   698
        if not shelves:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   699
            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
   700
        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
   701
        pats = [name]
25104
d6453f6fbdba shelve: allow --patch and --stat without --list for a single shelf
Tony Tung <tonytung@fb.com>
parents: 25103
diff changeset
   702
30823
806a830e6612 shelve: allow multiple shelves with --patch and --stat
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
   703
    for shelfname in pats:
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
   704
        if not Shelf(repo, shelfname).exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   705
            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
   706
d6453f6fbdba shelve: allow --patch and --stat without --list for a single shelf
Tony Tung <tonytung@fb.com>
parents: 25103
diff changeset
   707
    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
   708
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   709
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   710
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
   711
    """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
   712
    if state.parents != repo.dirstate.parents():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   713
        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
   714
            _(b'working directory parents do not match unshelve state')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   715
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   716
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   717
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   718
def _loadshelvedstate(ui, repo, opts):
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   719
    try:
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   720
        state = shelvedstate.load(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   721
        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
   722
            opts[b'keep'] = state.keep
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   723
    except IOError as err:
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   724
        if err.errno != errno.ENOENT:
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   725
            raise
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   726
        cmdutil.wrongtooltocontinue(repo, _(b'unshelve'))
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   727
    except error.CorruptedState as err:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   728
        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
   729
        if opts.get(b'continue'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   730
            msg = _(b'corrupted shelved state file')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   731
            hint = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   732
                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
   733
                b'operation'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   734
            )
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   735
            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
   736
        elif opts.get(b'abort'):
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   737
            shelvedstate.clear(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   738
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   739
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   740
                    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
   741
                    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
   742
                    b'please update to some commit\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   743
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   744
            )
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   745
    return state
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   746
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   747
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   748
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
   749
    """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
   750
    with repo.lock():
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   751
        try:
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   752
            checkparents(repo, state)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   753
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44212
diff changeset
   754
            merge.clean_update(state.pendingctx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   755
            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
   756
                bookmarks.activate(repo, state.activebookmark)
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   757
            mergefiles(ui, repo, state.wctx, state.pendingctx)
39744
52dfa1eb0ad4 shelve: no longer strip internal commit when using internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39601
diff changeset
   758
            if not phases.supportinternal(repo):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   759
                repair.strip(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   760
                    ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   761
                )
27841
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   762
        finally:
83995fdde225 with: use context manager in unshelveabort
Bryan O'Sullivan <bryano@fb.com>
parents: 27838
diff changeset
   763
            shelvedstate.clear(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   764
            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
   765
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   766
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   767
def hgabortunshelve(ui, repo):
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   768
    """logic to  abort unshelve using 'hg abort"""
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   769
    with repo.wlock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   770
        state = _loadshelvedstate(ui, repo, {b'abort': True})
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   771
        return unshelveabort(ui, repo, state)
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
   772
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   773
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   774
def mergefiles(ui, repo, wctx, shelvectx):
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   775
    """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
   776
    dirstate."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   777
    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
   778
        hg.update(repo, wctx.node())
22184
fb8065de47b0 unshelve: silence internal revert
Matt Mackall <mpm@selenic.com>
parents: 22057
diff changeset
   779
        ui.pushbuffer(True)
45375
8c466bcb0879 revert: remove dangerous `parents` argument from `cmdutil.revert()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45151
diff changeset
   780
        cmdutil.revert(ui, repo, shelvectx)
22184
fb8065de47b0 unshelve: silence internal revert
Matt Mackall <mpm@selenic.com>
parents: 22057
diff changeset
   781
        ui.popbuffer()
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   782
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   783
28573
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   784
def restorebranch(ui, repo, branchtorestore):
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   785
    if branchtorestore and branchtorestore != repo.dirstate.branch():
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   786
        repo.dirstate.setbranch(branchtorestore)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   787
        ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   788
            _(b'marked working directory as branch %s\n') % branchtorestore
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   789
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   790
28573
6a42564081cb shelve: adds restoring newly created branch (issue5048) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 28572
diff changeset
   791
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   792
def unshelvecleanup(ui, repo, name, opts):
19911
1c58e368fbfd shelve: some docstring cleanups
Augie Fackler <raf@durin42.com>
parents: 19909
diff changeset
   793
    """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
   794
    if not opts.get(b'keep'):
30378
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29841
diff changeset
   795
        for filetype in shelvefileextensions:
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29841
diff changeset
   796
            shfile = shelvedfile(repo, name, filetype)
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29841
diff changeset
   797
            if shfile.exists():
c5126aab9c37 shelve: move possible shelve file extensions to a single place
Kostia Balytskyi <ikostia@fb.com>
parents: 29841
diff changeset
   798
                shfile.movetobackup()
25713
2ca116614cfc shelve: only keep the latest N shelve backups
Colin Chan <colinchan@fb.com>
parents: 25712
diff changeset
   799
        cleanupoldbackups(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   800
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   801
42662
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
   802
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
   803
    """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
   804
    # 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
   805
    # 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
   806
    interactive = state.interactive
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
   807
    basename = state.name
27838
60b850b7e4ef with: use context manager for lock in continue
Bryan O'Sullivan <bryano@fb.com>
parents: 27837
diff changeset
   808
    with repo.lock():
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
   809
        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
   810
        ms = mergestatemod.mergestate.read(repo)
33313
ea03b3223611 shelve: don't reimplement mergestate.unresolved()
Martin von Zweigbergk <martinvonz@google.com>
parents: 33043
diff changeset
   811
        if list(ms.unresolved()):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
   812
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   813
                _(b"unresolved conflicts, can't continue"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   814
                hint=_(b"see 'hg resolve', then 'hg unshelve --continue'"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   815
            )
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   816
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   817
        shelvectx = repo[state.parents[1]]
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   818
        pendingctx = state.pendingctx
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   819
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
   820
        with repo.dirstate.parentchange():
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   821
            repo.setparents(state.pendingctx.node(), nullid)
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
   822
            repo.dirstate.write(repo.currenttransaction())
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
   823
39519
5d69e2412ec8 shelve: use the internal phase when possible
Boris Feld <boris.feld@octobus.net>
parents: 39387
diff changeset
   824
        targetphase = phases.internal
5d69e2412ec8 shelve: use the internal phase when possible
Boris Feld <boris.feld@octobus.net>
parents: 39387
diff changeset
   825
        if not phases.supportinternal(repo):
5d69e2412ec8 shelve: use the internal phase when possible
Boris Feld <boris.feld@octobus.net>
parents: 39387
diff changeset
   826
            targetphase = phases.secret
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   827
        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
   828
        with repo.ui.configoverride(overrides, b'unshelve'):
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   829
            with repo.dirstate.parentchange():
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   830
                repo.setparents(state.parents[0], nullid)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   831
                newnode, ispartialunshelve = _createunshelvectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   832
                    ui, repo, shelvectx, basename, interactive, opts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   833
                )
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   834
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   835
        if newnode is None:
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   836
            shelvectx = state.pendingctx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   837
            msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   838
                b'note: unshelved changes already existed '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   839
                b'in the working copy\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   840
            )
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   841
            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
   842
        else:
38463
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   843
            # only strip the shelvectx if we produced one
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   844
            state.nodestoremove.append(newnode)
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   845
            shelvectx = repo[newnode]
f4776f8b98e0 shelve: directly handle `--continue`
Boris Feld <boris.feld@octobus.net>
parents: 38462
diff changeset
   846
45577
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45375
diff changeset
   847
        merge.update(pendingctx)
20149
578b888c820e unshelve: don't commit unknown files during unshelve (issue4113)
Durham Goode <durham@fb.com>
parents: 20103
diff changeset
   848
        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
   849
        restorebranch(ui, repo, state.branchtorestore)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
   850
42702
4814d993fe21 unshelve: handle stripping changesets on interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42668
diff changeset
   851
        if not phases.supportinternal(repo):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   852
            repair.strip(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   853
                ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   854
            )
42703
073cfff9aaef unshelve: delete shelvedstate after a successful unshelve --continue
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42702
diff changeset
   855
        shelvedstate.clear(repo)
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   856
        if not ispartialunshelve:
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   857
            unshelvecleanup(ui, repo, state.name, opts)
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
   858
        _restoreactivebookmark(repo, state.activebookmark)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   859
        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
   860
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   861
42614
117437f3f541 continue: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42599
diff changeset
   862
def hgcontinueunshelve(ui, repo):
117437f3f541 continue: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42599
diff changeset
   863
    """logic to resume unshelve using 'hg continue'"""
117437f3f541 continue: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42599
diff changeset
   864
    with repo.wlock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   865
        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
   866
        return unshelvecontinue(ui, repo, state, {b'keep': state.keep})
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   867
42614
117437f3f541 continue: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42599
diff changeset
   868
30453
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   869
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
   870
    """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
   871
    # 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
   872
    # 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
   873
    s = repo.status()
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   874
    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
   875
    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
   876
        return tmpwctx, addedbefore
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   877
    ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   878
        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   879
            b"temporarily committing pending changes "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   880
            b"(restore with 'hg unshelve --abort')\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   881
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   882
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   883
    extra = {b'internal': b'shelve'}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   884
    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
   885
    tempopts = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   886
    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
   887
    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
   888
    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
   889
        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
   890
    tmpwctx = repo[node]
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   891
    return tmpwctx, addedbefore
2e736f01a710 shelve: move temporary commit creation to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30407
diff changeset
   892
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   893
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
   894
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
   895
    """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
   896
    repo = repo.unfiltered()
39387
da84cca65036 shelve: fix crash on unshelve without .shelve metadata file
Yuya Nishihara <yuya@tcha.org>
parents: 39376
diff changeset
   897
    node = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   898
    if shelvedfile(repo, basename, b'shelve').exists():
46275
157305bf859f shelve: move method for reading .shelve file to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46274
diff changeset
   899
        node = Shelf(repo, basename).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
   900
    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
   901
        with ui.configoverride({(b'ui', b'quiet'): True}):
46277
ed2f2150d57c shelve: move method for reading .hg to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46276
diff changeset
   902
            shelvectx = Shelf(repo, basename).applybundle(tr)
39375
38373da1af02 shelve: write metadata file on the fly if they are missing
Boris Feld <boris.feld@octobus.net>
parents: 39374
diff changeset
   903
        # 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
   904
        # 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
   905
        if node is None:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   906
            info = {b'node': hex(shelvectx.node())}
46274
a344ec05b99c shelve: move method for writing .shelve to new shelf class
Martin von Zweigbergk <martinvonz@google.com>
parents: 46273
diff changeset
   907
            Shelf(repo, basename).writeinfo(info)
39374
c67c94c0e7ae shelve: look for shelved node in the repository before unbundling
Boris Feld <boris.feld@octobus.net>
parents: 39373
diff changeset
   908
    else:
c67c94c0e7ae shelve: look for shelved node in the repository before unbundling
Boris Feld <boris.feld@octobus.net>
parents: 39373
diff changeset
   909
        shelvectx = repo[node]
c67c94c0e7ae shelve: look for shelved node in the repository before unbundling
Boris Feld <boris.feld@octobus.net>
parents: 39373
diff changeset
   910
30454
672026aece64 shelve: move commit restoration logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30453
diff changeset
   911
    return repo, shelvectx
672026aece64 shelve: move commit restoration logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30453
diff changeset
   912
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   913
42656
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   914
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
   915
    """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
   916
    was partially unshelved.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   917
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   918
    If interactive is:
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   919
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   920
      * 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
   921
      * 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
   922
              Update the shelve with remaining changes.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   923
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   924
    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
   925
    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
   926
    interactively or non-interactively.
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   927
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   928
    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
   929
    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
   930
    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
   931
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   932
    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
   933
    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
   934
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   935
    opts[b'message'] = shelvectx.description()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   936
    opts[b'interactive-unshelve'] = True
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   937
    pats = []
42656
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   938
    if not interactive:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   939
        newnode = repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   940
            text=shelvectx.description(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   941
            extra=shelvectx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   942
            user=shelvectx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   943
            date=shelvectx.date(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   944
        )
42656
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   945
        return newnode, False
c9114885c14b unshelve: unify logic around creating an unshelve changeset
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42616
diff changeset
   946
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   947
    commitfunc = getcommitfunc(shelvectx.extra(), interactive=True, editor=True)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   948
    newnode = cmdutil.dorecord(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   949
        ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   950
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   951
        commitfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   952
        None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   953
        False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   954
        cmdutil.recordfilter,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   955
        *pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   956
        **pycompat.strkwargs(opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   957
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   958
    snode = repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   959
        text=shelvectx.description(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   960
        extra=shelvectx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   961
        user=shelvectx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   962
    )
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   963
    if snode:
42658
d5cdce3d9164 unshelve: create a matcher only if required on creating unshelve ctx
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42657
diff changeset
   964
        m = scmutil.matchfiles(repo, repo[snode].files())
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   965
        _shelvecreatedcommit(repo, snode, basename, m)
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   966
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   967
    return newnode, bool(snode)
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   968
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   969
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   970
def _rebaserestoredcommit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   971
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   972
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   973
    opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   974
    tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   975
    oldtiprev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   976
    basename,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   977
    pctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   978
    tmpwctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   979
    shelvectx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   980
    branchtorestore,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   981
    activebookmark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   982
):
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
   983
    """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
   984
    # 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
   985
    # 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
   986
    interactive = opts.get(b'interactive')
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   987
    if tmpwctx.node() == shelvectx.p1().node() and not interactive:
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   988
        # 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
   989
        # unshelve certain changes only.
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
   990
        return shelvectx, False
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
   991
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
   992
    overrides = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   993
        (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
   994
        (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
   995
    }
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   996
    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
   997
        ui.status(_(b'rebasing shelved changes\n'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   998
        stats = merge.graft(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
   999
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1000
            shelvectx,
44332
69b091cdc506 shelve: fix ordering of merge labels
Kyle Lippincott <spectral@google.com>
parents: 43981
diff changeset
  1001
            labels=[b'working-copy', b'shelve'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1002
            keepconflictparent=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1003
        )
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1004
        if stats.unresolvedcount:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1005
            tr.close()
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1006
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1007
            nodestoremove = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1008
                repo.changelog.node(rev)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1009
                for rev in pycompat.xrange(oldtiprev, len(repo))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1010
            ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1011
            shelvedstate.save(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1012
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1013
                basename,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1014
                pctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1015
                tmpwctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1016
                nodestoremove,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1017
                branchtorestore,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1018
                opts.get(b'keep'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1019
                activebookmark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1020
                interactive,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1021
            )
45151
e429e7c801b2 error: normalize "unresolved conflicts" error messages with a custom class
Daniel Ploch <dploch@google.com>
parents: 45144
diff changeset
  1022
            raise error.ConflictResolutionRequired(b'unshelve')
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1023
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1024
        with repo.dirstate.parentchange():
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
  1025
            repo.setparents(tmpwctx.node(), nullid)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1026
            newnode, ispartialunshelve = _createunshelvectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1027
                ui, repo, shelvectx, basename, interactive, opts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1028
            )
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1029
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1030
        if newnode is None:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1031
            shelvectx = tmpwctx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1032
            msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1033
                b'note: unshelved changes already existed '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1034
                b'in the working copy\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1035
            )
38618
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1036
            ui.status(msg)
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1037
        else:
c829749e7639 shelve: directly handle the initial parent alignment
Boris Feld <boris.feld@octobus.net>
parents: 38508
diff changeset
  1038
            shelvectx = repo[newnode]
45577
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45375
diff changeset
  1039
            merge.update(tmpwctx)
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1040
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1041
    return shelvectx, ispartialunshelve
30455
10684a298973 shelve: move rebasing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30454
diff changeset
  1042
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1043
30456
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1044
def _forgetunknownfiles(repo, shelvectx, addedbefore):
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1045
    # 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
  1046
    # 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
  1047
    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
  1048
    if not shelveunknown:
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1049
        return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1050
    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
  1051
    addedafter = frozenset(repo.status().added)
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1052
    toforget = (addedafter & shelveunknown) - addedbefore
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1053
    repo[None].forget(toforget)
b924375cce3a shelve: move file-forgetting logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30455
diff changeset
  1054
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1055
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
  1056
def _finishunshelve(repo, oldtiprev, tr, activebookmark):
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
  1057
    _restoreactivebookmark(repo, activebookmark)
30457
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30456
diff changeset
  1058
    # The transaction aborting will strip all the commits for us,
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30456
diff changeset
  1059
    # but it doesn't update the inmemory structures, so addchangegroup
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30456
diff changeset
  1060
    # hooks still fire and try to operate on the missing commits.
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30456
diff changeset
  1061
    # Clean up manually to prevent this.
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30456
diff changeset
  1062
    repo.unfiltered().changelog.strip(oldtiprev, tr)
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
  1063
    _aborttransaction(repo, tr)
30457
893be22cdb38 shelve: move unshelve-finishing logic to a separate function
Kostia Balytskyi <ikostia@fb.com>
parents: 30456
diff changeset
  1064
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1065
30846
dfc6663f97ca shelve: make unshelve not crash when there are missing files (issue4176)
Kostia Balytskyi <ikostia@fb.com>
parents: 30823
diff changeset
  1066
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
  1067
    """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
  1068
    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
  1069
    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
  1070
    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
  1071
    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
  1072
    if intersection:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1073
        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
  1074
        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
  1075
        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
  1076
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1077
44595
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1078
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
  1079
    opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1080
    abortf = opts.get(b'abort')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1081
    continuef = opts.get(b'continue')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1082
    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
  1083
    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
  1084
        cmdutil.checkunfinished(repo)
31021
4189d790e8a4 shelve: add -n/--name option to unshelve (issue5475)
liscju <piotr.listkiewicz@gmail.com>
parents: 30846
diff changeset
  1085
    shelved = list(shelved)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1086
    if opts.get(b"name"):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1087
        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
  1088
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1089
    if interactive and opts.get(b'keep'):
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1090
        raise error.InputError(
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1091
            _(b'--keep on --interactive is not yet supported')
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1092
        )
42662
ee86ad6f50fe unshelve: store information about interactive mode in shelvedstate
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42658
diff changeset
  1093
    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
  1094
        if abortf and continuef:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1095
            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
  1096
        if shelved:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1097
            raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1098
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1099
                    b'cannot combine abort/continue with '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1100
                    b'naming a shelved change'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1101
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1102
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1103
        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
  1104
            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
  1105
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
  1106
        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
  1107
        if abortf:
42599
3fb0493812c0 abort: added support for unshelve
Taapas Agrawal <taapas2897@gmail.com>
parents: 42598
diff changeset
  1108
            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
  1109
        elif continuef and interactive:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1110
            raise error.InputError(
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1111
                _(b'cannot use both continue and interactive')
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1112
            )
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1113
        elif continuef:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1114
            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
  1115
    elif len(shelved) > 1:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1116
        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
  1117
    elif not shelved:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1118
        shelved = listshelves(repo)
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1119
        if not shelved:
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1120
            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
  1121
        basename = shelved[0][1]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1122
        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
  1123
    else:
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1124
        basename = shelved[0]
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1125
46273
efc71bb71682 shelve: introduce class representing a shelf
Martin von Zweigbergk <martinvonz@google.com>
parents: 46272
diff changeset
  1126
    if not Shelf(repo, basename).exists():
46272
a68d3386138c shelve: raise more specific errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46271
diff changeset
  1127
        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
  1128
44595
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1129
    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
  1130
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1131
47c1226463a1 shelve: split up dounshelve() in unshelvecmd() and _dounshelve()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44438
diff changeset
  1132
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
  1133
    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
  1134
    lock = tr = None
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1135
    try:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1136
        lock = repo.lock()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1137
        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
  1138
        oldtiprev = len(repo)
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1139
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1140
        pctx = repo[b'.']
20958
df33c9014430 shelve: repo['.'] is not a wctx but a pctx
Mads Kiilerich <madski@unity3d.com>
parents: 20942
diff changeset
  1141
        tmpwctx = pctx
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1142
        # 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
  1143
        # ...-> pctx -> tmpwctx -> shelvectx
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1144
        # 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
  1145
        # 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
  1146
        # to the original pctx.
19961
1d7a36ff2615 shelve: use rebase instead of merge (issue4068)
Durham Goode <durham@fb.com>
parents: 19951
diff changeset
  1147
31664
1cbeefa59343 shelve: add logic to preserve active bookmarks
Kostia Balytskyi <ikostia@fb.com>
parents: 31555
diff changeset
  1148
        activebookmark = _backupactivebookmark(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1149
        tmpwctx, addedbefore = _commitworkingcopychanges(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1150
            ui, repo, opts, tmpwctx
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1151
        )
41007
a06dc62f1c82 shelve: pass transaction around to clarify where it's used
Martin von Zweigbergk <martinvonz@google.com>
parents: 40854
diff changeset
  1152
        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
  1153
        _checkunshelveuntrackedproblems(ui, repo, shelvectx)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1154
        branchtorestore = b''
37967
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1155
        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
  1156
            branchtorestore = shelvectx.branch()
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1157
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1158
        shelvectx, ispartialunshelve = _rebaserestoredcommit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1159
            ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1160
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1161
            opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1162
            tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1163
            oldtiprev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1164
            basename,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1165
            pctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1166
            tmpwctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1167
            shelvectx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1168
            branchtorestore,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1169
            activebookmark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42761
diff changeset
  1170
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1171
        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
  1172
        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
  1173
            mergefiles(ui, repo, pctx, shelvectx)
7932be8b0559 shelve: reduce scope of merge tool config override
Martin von Zweigbergk <martinvonz@google.com>
parents: 37603
diff changeset
  1174
        restorebranch(ui, repo, branchtorestore)
42704
6957f7b93e03 unshelve: clear shelvedstate and _finishunshelve() on partial unshelve
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42703
diff changeset
  1175
        shelvedstate.clear(repo)
6957f7b93e03 unshelve: clear shelvedstate and _finishunshelve() on partial unshelve
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42703
diff changeset
  1176
        _finishunshelve(repo, oldtiprev, tr, activebookmark)
42733
d684449eef67 unshelve: forget unknown files after a partial unshelve
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42704
diff changeset
  1177
        _forgetunknownfiles(repo, shelvectx, addedbefore)
42616
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1178
        if not ispartialunshelve:
5162753c4c14 unshelve: add interactive mode
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42614
diff changeset
  1179
            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
  1180
    finally:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1181
        if tr:
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents:
diff changeset
  1182
            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
  1183
        lockmod.release(lock)